@mframework/layer-commerce 0.0.3
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/README.md +101 -0
- package/app/cart/useCart.ts +1 -0
- package/app/components/ChevronIcon/ChevronIcon.config.ts +17 -0
- package/app/components/DateSelect/DateSelect.config.ts +15 -0
- package/app/components/Field/Field.config.ts +14 -0
- package/app/components/FieldDate/FieldDate.config.ts +16 -0
- package/app/components/Form/Form.type.ts +8 -0
- package/app/components/Product/Product.config.ts +19 -0
- package/app/components/Product/Stock.config.ts +15 -0
- package/app/components/ProductCustomizableOption/ProductCustomizableOption.config.ts +5 -0
- package/app/components/ProductGallery/ProductGallery.config.ts +15 -0
- package/app/components/ProductReviews/ProductReviews.config.ts +8 -0
- package/app/composables/_types.ts +18 -0
- package/app/composables/adapters/abstract/cartAdapter.ts +0 -0
- package/app/composables/adapters/abstract/categoryAdapter.ts +0 -0
- package/app/composables/adapters/abstract/customerAdapter.ts +0 -0
- package/app/composables/adapters/abstract/inventoryAdapter.ts +0 -0
- package/app/composables/adapters/abstract/orderAdapter.ts +0 -0
- package/app/composables/adapters/abstract/productAdapter.ts +7 -0
- package/app/composables/cart/registry.ts +20 -0
- package/app/composables/cart/types.ts +18 -0
- package/app/composables/cart/useCart.ts +15 -0
- package/app/composables/config.ts +19 -0
- package/app/composables/defs/apiDefinitions.ts +55 -0
- package/app/composables/defs/extension.feature +40 -0
- package/app/composables/defs/extension.mocks.ts +39 -0
- package/app/composables/defs/extension.test.ts +280 -0
- package/app/composables/defs/extension.ts +236 -0
- package/app/composables/defs/index.ts +3 -0
- package/app/composables/defs/typeHelpers.ts +8 -0
- package/app/composables/defs/types.ts +136 -0
- package/app/composables/domain/product.ts +12 -0
- package/app/composables/featured-products.ts +20 -0
- package/app/composables/helpers/contextualizedNormalizers.feature +14 -0
- package/app/composables/helpers/contextualizedNormalizers.test.ts +85 -0
- package/app/composables/helpers/contextualizedNormalizers.ts +20 -0
- package/app/composables/helpers/index.ts +1 -0
- package/app/composables/index.ts +9 -0
- package/app/composables/methods/auth.ts +83 -0
- package/app/composables/methods/cart.ts +119 -0
- package/app/composables/methods/category.ts +27 -0
- package/app/composables/methods/checkout.ts +54 -0
- package/app/composables/methods/customer.ts +52 -0
- package/app/composables/methods/helpers.ts +5 -0
- package/app/composables/methods/index.ts +75 -0
- package/app/composables/methods/order.ts +39 -0
- package/app/composables/methods/product.ts +95 -0
- package/app/composables/methods/settings.ts +16 -0
- package/app/composables/models/cart.ts +95 -0
- package/app/composables/models/category.ts +13 -0
- package/app/composables/models/checkout.ts +17 -0
- package/app/composables/models/customer.ts +16 -0
- package/app/composables/models/facets.ts +25 -0
- package/app/composables/models/index.ts +94 -0
- package/app/composables/models/order.ts +43 -0
- package/app/composables/models/product.ts +73 -0
- package/app/composables/models/shared.ts +75 -0
- package/app/composables/orders.ts +69 -0
- package/app/composables/products/registry.ts +86 -0
- package/app/composables/products/types.ts +8 -0
- package/app/composables/products/useEvents.ts +26 -0
- package/app/composables/products/useGiftCards.ts +29 -0
- package/app/composables/products/useProducts.ts +12 -0
- package/app/composables/products/useSubscriptions.ts +29 -0
- package/app/composables/products.ts +30 -0
- package/app/composables/registry.ts +24 -0
- package/app/composables/useAuth.ts +43 -0
- package/app/composables/useBreakpoints/index.ts +1 -0
- package/app/composables/useBreakpoints/useBreakpoints.ts +28 -0
- package/app/composables/useCache.ts +38 -0
- package/app/composables/useCart/__tests__/useCart.spec.ts +11 -0
- package/app/composables/useCart/index.ts +1 -0
- package/app/composables/useCart/types.ts +17 -0
- package/app/composables/useCart/useCart.ts +46 -0
- package/app/composables/useCartShippingMethods/__tests__/useCartShippingMethods.spec.ts +11 -0
- package/app/composables/useCartShippingMethods/index.ts +1 -0
- package/app/composables/useCartShippingMethods/types.ts +17 -0
- package/app/composables/useCartShippingMethods/useCartShippingMethods.ts +47 -0
- package/app/composables/useCatalog.ts +26 -0
- package/app/composables/useContent.ts +26 -0
- package/app/composables/useCustomer/__tests__/useCustomer.spec.ts +25 -0
- package/app/composables/useCustomer/index.ts +2 -0
- package/app/composables/useCustomer/types.ts +17 -0
- package/app/composables/useCustomer/useCustomer.ts +40 -0
- package/app/composables/useCustomerAddress/__tests__/useCustomerAddress.spec.ts +11 -0
- package/app/composables/useCustomerAddress/index.ts +2 -0
- package/app/composables/useCustomerAddress/types.ts +17 -0
- package/app/composables/useCustomerAddress/useCustomerAddress.ts +55 -0
- package/app/composables/useCustomerOrder/__tests__/useCustomerOrder.spec.ts +11 -0
- package/app/composables/useCustomerOrder/adress.ts +10 -0
- package/app/composables/useCustomerOrder/index.ts +2 -0
- package/app/composables/useCustomerOrder/product.ts +37 -0
- package/app/composables/useCustomerOrder/types.ts +40 -0
- package/app/composables/useCustomerOrder/useCustomerOrder.ts +63 -0
- package/app/composables/useCustomerOrders/__tests__/useCustomerOrders.spec.ts +11 -0
- package/app/composables/useCustomerOrders/index.ts +2 -0
- package/app/composables/useCustomerOrders/types.ts +20 -0
- package/app/composables/useCustomerOrders/useCustomerOrders.ts +56 -0
- package/app/composables/useCustomerReturns/__tests__/useCustomerReturns.spec.ts +11 -0
- package/app/composables/useCustomerReturns/index.ts +2 -0
- package/app/composables/useCustomerReturns/types.ts +17 -0
- package/app/composables/useCustomerReturns/useCustomerReturns.ts +41 -0
- package/app/composables/useHandleError/index.ts +1 -0
- package/app/composables/useHandleError/types.ts +11 -0
- package/app/composables/useHandleError/useHandleError.ts +27 -0
- package/app/composables/useInventory.ts +29 -0
- package/app/composables/useLoading.ts +21 -0
- package/app/composables/useNotification.ts +21 -0
- package/app/composables/usePageTitle.ts +20 -0
- package/app/composables/useProduct/index.ts +2 -0
- package/app/composables/useProduct/types.ts +17 -0
- package/app/composables/useProduct/useProduct.ts +42 -0
- package/app/composables/useProductAttribute/__tests__/useProduct.mock.ts +31 -0
- package/app/composables/useProductAttribute/__tests__/useProductAttribute.spec.ts +14 -0
- package/app/composables/useProductAttribute/index.ts +1 -0
- package/app/composables/useProductAttribute/useProductAttribute.ts +37 -0
- package/app/composables/useProductRecommended/__tests__/useProductRecommended.spec.ts +12 -0
- package/app/composables/useProductRecommended/index.ts +1 -0
- package/app/composables/useProductRecommended/types.ts +17 -0
- package/app/composables/useProductRecommended/useProductRecommended.ts +43 -0
- package/app/composables/useProductReviews/__tests__/productReviews.mock.ts +20 -0
- package/app/composables/useProductReviews/__tests__/useProductReviews.spec.ts +22 -0
- package/app/composables/useProductReviews/index.ts +2 -0
- package/app/composables/useProductReviews/types.ts +17 -0
- package/app/composables/useProductReviews/useProductReviews.ts +46 -0
- package/app/composables/useProducts/__tests__/useProducts.spec.ts +11 -0
- package/app/composables/useProducts/types.ts +22 -0
- package/app/composables/useProducts/useProducts.ts +41 -0
- package/app/composables/useTax.ts +27 -0
- package/app/composables/validationRules/index.ts +1 -0
- package/app/composables/validationRules/password.feature +67 -0
- package/app/composables/validationRules/password.test.ts +89 -0
- package/app/composables/validationRules/password.ts +25 -0
- package/app/normalizers/Cart.query.ts +729 -0
- package/app/normalizers/Cart.type.ts +285 -0
- package/app/normalizers/Category.query.ts +146 -0
- package/app/normalizers/Category.type.ts +55 -0
- package/app/normalizers/CheckEmail.query.ts +28 -0
- package/app/normalizers/Checkout.query.ts +253 -0
- package/app/normalizers/Checkout.type.ts +77 -0
- package/app/normalizers/CmsBlock.query.ts +57 -0
- package/app/normalizers/CmsBlock.type.ts +25 -0
- package/app/normalizers/CmsPage.query.ts +59 -0
- package/app/normalizers/CmsPage.type.ts +26 -0
- package/app/normalizers/Config.query.ts +224 -0
- package/app/normalizers/Config.type.ts +196 -0
- package/app/normalizers/ContactForm.query.ts +49 -0
- package/app/normalizers/CreditMemo.type.ts +49 -0
- package/app/normalizers/GiftCard.type.ts +24 -0
- package/app/normalizers/Invoice.type.ts +58 -0
- package/app/normalizers/Menu.query.ts +54 -0
- package/app/normalizers/Menu.type.ts +22 -0
- package/app/normalizers/MyAccount.query.ts +268 -0
- package/app/normalizers/MyAccount.type.ts +129 -0
- package/app/normalizers/NewsletterSubscription.query.ts +38 -0
- package/app/normalizers/Order.query.ts +741 -0
- package/app/normalizers/Order.type.ts +268 -0
- package/app/normalizers/Payment.type.ts +28 -0
- package/app/normalizers/ProductAlerts.query.ts +23 -0
- package/app/normalizers/ProductCompare.query.ts +226 -0
- package/app/normalizers/ProductCompare.type.ts +90 -0
- package/app/normalizers/ProductList.query.ts +1620 -0
- package/app/normalizers/ProductList.type.ts +726 -0
- package/app/normalizers/Region.query.ts +58 -0
- package/app/normalizers/Region.type.ts +23 -0
- package/app/normalizers/Return.type.ts +50 -0
- package/app/normalizers/Review.query.ts +81 -0
- package/app/normalizers/Review.type.ts +42 -0
- package/app/normalizers/Slider.query.ts +72 -0
- package/app/normalizers/Slider.type.ts +26 -0
- package/app/normalizers/StoreInPickUp.query.ts +54 -0
- package/app/normalizers/StoreInPickUp.type.ts +59 -0
- package/app/normalizers/Subscription.type.ts +25 -0
- package/app/normalizers/Transaction.type.ts +20 -0
- package/app/normalizers/UrlRewrites.query.ts +55 -0
- package/app/normalizers/UrlRewrites.type.ts +25 -0
- package/app/normalizers/Wishlist.query.ts +202 -0
- package/app/normalizers/Wishlist.type.ts +42 -0
- package/app/pages/brand/[...slug].vue +76 -0
- package/app/pages/brands.vue +67 -0
- package/app/pages/cart.vue +142 -0
- package/app/pages/compare.vue +166 -0
- package/app/pages/departments/[...slug].vue +353 -0
- package/app/pages/departments/category/[...slug].vue +114 -0
- package/app/pages/incentive/[...id].vue +66 -0
- package/app/pages/invoice/[id].vue +309 -0
- package/app/pages/order/[id].vue +327 -0
- package/app/pages/product/[...id].vue +309 -0
- package/app/pages/product/showcases/index.vue +86 -0
- package/app/pages/shipment/[...id].vue +176 -0
- package/app/pages/shop/[...slug].vue +158 -0
- package/app/pages/shops.vue +76 -0
- package/app/pages/subscription/[...id].vue +147 -0
- package/app/pages/transaction/[...id].vue +74 -0
- package/app/routes/CategoryPage/CategoryPage.config.ts +28 -0
- package/app/routes/CategoryPage/CategoryPage.type.ts +8 -0
- package/app/routes/Checkout/Checkout.config.ts +3 -0
- package/app/routes/Checkout/Checkout.type.ts +14 -0
- package/app/routes/MyAccount/MyAccount.config.ts +1 -0
- package/app/routes/SearchPage/SearchPage.config.ts +1 -0
- package/app/routes/UrlRewrites/UrlRewrites.config.ts +5 -0
- package/app/stores/Cart/Cart.type.ts +26 -0
- package/app/stores/MyAccount/MyAccount.action.ts +7 -0
- package/app/stores/Notification/Notification.action.ts +40 -0
- package/app/stores/Notification/Notification.type.ts +16 -0
- package/app/stores/Popup/Popup.action.ts +30 -0
- package/app/stores/Product/Product.dispatcher.ts +53 -0
- package/app/stores/Product/Product.reducer.ts +12 -0
- package/app/stores/ProductList/ProductList.dispatcher.ts +35 -0
- package/app/stores/ProductList/ProductList.reducer.ts +13 -0
- package/app/stores/Store.type.ts +31 -0
- package/app/stores/Wishlist/Wishlist.type.ts +12 -0
- package/app/stores/cart.ts +218 -0
- package/app/stores/cartStore.ts +224 -0
- package/app/stores/checkout.ts +18 -0
- package/app/stores/compare.ts +65 -0
- package/app/stores/currency.js +29 -0
- package/app/stores/digital-products.js +11 -0
- package/app/stores/orders.ts +172 -0
- package/app/stores/product.ts +34 -0
- package/app/stores/productList.ts +35 -0
- package/app/stores/productListInfo.ts +0 -0
- package/app/stores/products.ts +118 -0
- package/app/stores/recentlyViewedProducts.ts +56 -0
- package/app/stores/review.ts +33 -0
- package/app/stores/storeInPickUp.ts +21 -0
- package/app/stores/user.ts +20 -0
- package/app/stores/wishlist.ts +46 -0
- package/app/types/Account.type.ts +141 -0
- package/app/types/Breadcrumbs.type.ts +23 -0
- package/app/types/CMS.type.ts +33 -0
- package/app/types/Category.type.ts +67 -0
- package/app/types/Checkout.type.ts +58 -0
- package/app/types/Common.type.ts +77 -0
- package/app/types/Config.type.ts +47 -0
- package/app/types/Device.type.ts +37 -0
- package/app/types/Direction.type.ts +23 -0
- package/app/types/Downloadable.type.ts +24 -0
- package/app/types/Error.type.ts +22 -0
- package/app/types/Field.type.ts +151 -0
- package/app/types/Global.type.ts +156 -0
- package/app/types/Graphql.type.ts +4497 -0
- package/app/types/Layout.type.ts +18 -0
- package/app/types/Menu.type.ts +39 -0
- package/app/types/MiniCart.type.ts +61 -0
- package/app/types/NotificationList.type.ts +34 -0
- package/app/types/Order.type.ts +174 -0
- package/app/types/Price.type.ts +72 -0
- package/app/types/ProductCompare.type.ts +24 -0
- package/app/types/ProductList.type.ts +351 -0
- package/app/types/Rating.type.ts +42 -0
- package/app/types/Router.type.ts +67 -0
- package/app/types/Slider.type.ts +25 -0
- package/app/types/StockStatus.type.ts +21 -0
- package/app/types/domain/index.ts +94 -0
- package/app/types/index.ts +33 -0
- package/app/types/shims.d.ts +52 -0
- package/app/types/tilework-opus.d.ts +48 -0
- package/app/utils/Address/Address.type.ts +28 -0
- package/app/utils/Address/index.ts +325 -0
- package/app/utils/Auth/IsSignedIn.ts +4 -0
- package/app/utils/Auth/Token.ts +9 -0
- package/app/utils/Base64/Base64.ts +16 -0
- package/app/utils/Base64/index.ts +12 -0
- package/app/utils/Browser/Browser.ts +29 -0
- package/app/utils/Browser/index.ts +12 -0
- package/app/utils/BrowserDatabase/BrowserDatabase.ts +70 -0
- package/app/utils/BrowserDatabase/index.ts +12 -0
- package/app/utils/CSS/CSS.ts +65 -0
- package/app/utils/CSS/index.ts +12 -0
- package/app/utils/Cache/Cache.ts +99 -0
- package/app/utils/Cart/Cart.ts +300 -0
- package/app/utils/Cart/Cart.type.ts +76 -0
- package/app/utils/Cart/Token.ts +59 -0
- package/app/utils/Cart/index.ts +13 -0
- package/app/utils/Category/Filters.ts +39 -0
- package/app/utils/Category/index.ts +12 -0
- package/app/utils/Common/index.ts +32 -0
- package/app/utils/Compare/Compare.ts +89 -0
- package/app/utils/Compare/index.ts +12 -0
- package/app/utils/Currency/Currency.ts +84 -0
- package/app/utils/Currency/index.ts +12 -0
- package/app/utils/DynamicReducer/DynamicReducer.type.ts +14 -0
- package/app/utils/DynamicReducer/Helper.ts +30 -0
- package/app/utils/DynamicReducer/index.tsx +35 -0
- package/app/utils/ElementTransition/ElementTransition.ts +100 -0
- package/app/utils/Form/Extract.ts +316 -0
- package/app/utils/Form/Form.ts +46 -0
- package/app/utils/Form/Form.type.ts +60 -0
- package/app/utils/Form/Transform.ts +33 -0
- package/app/utils/FormPortalCollector/index.ts +45 -0
- package/app/utils/History/History.type.ts +31 -0
- package/app/utils/History/index.ts +17 -0
- package/app/utils/Manipulations/Array.ts +18 -0
- package/app/utils/Manipulations/Date.ts +36 -0
- package/app/utils/Manipulations/index.ts +14 -0
- package/app/utils/Media/Media.ts +27 -0
- package/app/utils/Media/index.ts +13 -0
- package/app/utils/Menu/Menu.ts +116 -0
- package/app/utils/Menu/Menu.type.ts +37 -0
- package/app/utils/Menu/index.ts +12 -0
- package/app/utils/Mobile/index.ts +13 -0
- package/app/utils/Mobile/isMobile.ts +34 -0
- package/app/utils/Orders/Orders.ts +71 -0
- package/app/utils/Orders/Orders.type.ts +19 -0
- package/app/utils/Orders/index.ts +13 -0
- package/app/utils/Polyfill/index.ts +336 -0
- package/app/utils/Preload/CategoryPreload.ts +74 -0
- package/app/utils/Preload/ProductPreload.ts +28 -0
- package/app/utils/Preload/index.ts +75 -0
- package/app/utils/Price/Price.config.ts +189 -0
- package/app/utils/Price/Price.ts +63 -0
- package/app/utils/Price/index.ts +12 -0
- package/app/utils/Product/Extract.ts +652 -0
- package/app/utils/Product/Product.ts +575 -0
- package/app/utils/Product/Product.type.ts +260 -0
- package/app/utils/Product/Transform.ts +382 -0
- package/app/utils/Product/index.ts +12 -0
- package/app/utils/Promise/MakeCancelable.ts +44 -0
- package/app/utils/Promise/Promise.type.ts +15 -0
- package/app/utils/Promise/index.ts +13 -0
- package/app/utils/Query/Field.ts +71 -0
- package/app/utils/Query/Fragment.ts +22 -0
- package/app/utils/Query/PrepareDocument.ts +119 -0
- package/app/utils/Query/Query.type.ts +26 -0
- package/app/utils/Query/index.ts +15 -0
- package/app/utils/Request/Config.ts +21 -0
- package/app/utils/Request/DataContainer.ts +102 -0
- package/app/utils/Request/Debounce.ts +48 -0
- package/app/utils/Request/Error.ts +31 -0
- package/app/utils/Request/Hash.ts +88 -0
- package/app/utils/Request/LowPriorityLoad.ts +32 -0
- package/app/utils/Request/LowPriorityRender.ts +55 -0
- package/app/utils/Request/Mutation.ts +25 -0
- package/app/utils/Request/Query.ts +25 -0
- package/app/utils/Request/QueryDispatcher.ts +135 -0
- package/app/utils/Request/Request.ts +310 -0
- package/app/utils/Store/Store.type.ts +26 -0
- package/app/utils/Store/index.ts +71 -0
- package/app/utils/Url/Url.ts +297 -0
- package/app/utils/Url/index.ts +12 -0
- package/app/utils/Validator/Config.ts +96 -0
- package/app/utils/Validator/Validator.ts +268 -0
- package/app/utils/Validator/Validator.type.ts +47 -0
- package/app/utils/Validator/index.ts +12 -0
- package/app/utils/Wishlist/Wishlist.ts +65 -0
- package/app/utils/Wishlist/index.ts +12 -0
- package/app/utils/client.ts +280 -0
- package/app/utils/index.ts +53 -0
- package/app/utils/normalizer.ts +23 -0
- package/app/utils/normalizers/magento.ts +29 -0
- package/app/utils/normalizers/shopify.ts +29 -0
- package/nuxt.config.ts +11 -0
- package/package.json +43 -0
- package/tsconfig.json +45 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M Framework - Flexible backend agnostic framework.
|
|
3
|
+
*
|
|
4
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
5
|
+
* See LICENSE for license details.
|
|
6
|
+
*
|
|
7
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
8
|
+
* @package mframework/mframework
|
|
9
|
+
* @link https://github.com/meeovi/mframework
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { isSignedIn } from '../../utils/Auth/IsSignedIn';
|
|
13
|
+
import { TokensByWebsite } from '../Auth/Token';
|
|
14
|
+
|
|
15
|
+
// Fallback constants (original project expects these in Auth/Config)
|
|
16
|
+
const ONE_HOUR = 3600;
|
|
17
|
+
const ONE_HOUR_IN_SECONDS = 3600;
|
|
18
|
+
const TOKEN_REFRESH_DELAY = 3000;
|
|
19
|
+
import BrowserDatabase from '../../utils/BrowserDatabase';
|
|
20
|
+
import { debounce } from '../../utils/Request/Debounce';
|
|
21
|
+
import { getStoreState } from '../../utils/Store';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
* @type {string}
|
|
26
|
+
*/
|
|
27
|
+
export const COMPARE_UID = 'compare_uid';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
*
|
|
31
|
+
* @type {number}
|
|
32
|
+
*/
|
|
33
|
+
export const ONE_DAY = 86400;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
*
|
|
37
|
+
* @param {string} uid
|
|
38
|
+
* @returns {void}
|
|
39
|
+
* @namespace ../../utils/Compare/setUid
|
|
40
|
+
*/
|
|
41
|
+
export const setUid = (uid: string | null): void => {
|
|
42
|
+
const { website_code } = window;
|
|
43
|
+
const tokens: TokensByWebsite = BrowserDatabase.getItem(COMPARE_UID) || {};
|
|
44
|
+
const state = getStoreState();
|
|
45
|
+
const {
|
|
46
|
+
access_token_lifetime = ONE_HOUR,
|
|
47
|
+
} = state.ConfigReducer || {};
|
|
48
|
+
|
|
49
|
+
const uidExpirationTimeInStorage = isSignedIn()
|
|
50
|
+
? parseInt(String(access_token_lifetime), 10) * ONE_HOUR_IN_SECONDS
|
|
51
|
+
: ONE_DAY;
|
|
52
|
+
|
|
53
|
+
tokens[website_code] = uid as any;
|
|
54
|
+
|
|
55
|
+
BrowserDatabase.setItem(tokens, COMPARE_UID, uidExpirationTimeInStorage);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
* @returns {string|boolean} uid
|
|
61
|
+
* @namespace ../../utils/Compare/getUid
|
|
62
|
+
*/
|
|
63
|
+
export const getUid = (): string | null => {
|
|
64
|
+
const { website_code } = window;
|
|
65
|
+
|
|
66
|
+
const tokens: TokensByWebsite = BrowserDatabase.getItem(COMPARE_UID) || {};
|
|
67
|
+
const uid = tokens[website_code];
|
|
68
|
+
|
|
69
|
+
return (typeof uid === 'string') ? uid : null;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
*
|
|
74
|
+
* @namespace ../../utils/Compare/removeUid
|
|
75
|
+
*/
|
|
76
|
+
export const removeUid = (): void => {
|
|
77
|
+
const { website_code } = window;
|
|
78
|
+
const uids: Record<string, string | null | undefined> = BrowserDatabase.getItem(COMPARE_UID) || {};
|
|
79
|
+
|
|
80
|
+
uids[website_code] = undefined;
|
|
81
|
+
|
|
82
|
+
BrowserDatabase.setItem(uids, COMPARE_UID);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/** @namespace ../../utils/Compare/refreshUid */
|
|
86
|
+
export const refreshUid = debounce(
|
|
87
|
+
() => setUid(getUid()),
|
|
88
|
+
TOKEN_REFRESH_DELAY,
|
|
89
|
+
);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M Framework - Flexible backend agnostic framework.
|
|
3
|
+
*
|
|
4
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
5
|
+
* See LICENSE for license details.
|
|
6
|
+
*
|
|
7
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
8
|
+
* @package mframework/mframework
|
|
9
|
+
* @link https://github.com/meeovi/mframework
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export * from './Compare';
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M Framework - Flexible backend agnostic framework.
|
|
3
|
+
*
|
|
4
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
5
|
+
* See LICENSE for license details.
|
|
6
|
+
*
|
|
7
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
8
|
+
* @package mframework/mframework
|
|
9
|
+
* @link https://github.com/meeovi/mframework
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { Currencies, CurrencyData } from '../../normalizers/Config.type';
|
|
13
|
+
import BrowserDatabase from '../../utils/BrowserDatabase';
|
|
14
|
+
import { getStoreState } from '../../utils/Store';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
* @type {string}
|
|
19
|
+
*/
|
|
20
|
+
export const CUR_CURRENCY = 'current_currency';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @type {number}
|
|
25
|
+
*/
|
|
26
|
+
export const ONE_HOUR = 3600;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
* @param {Any} currency
|
|
31
|
+
* @returns {void}
|
|
32
|
+
* @namespace ../../utils/Currency/setCurrency
|
|
33
|
+
*/
|
|
34
|
+
export const setCurrency = (currency: string): void => {
|
|
35
|
+
BrowserDatabase.setItem(currency, CUR_CURRENCY, ONE_HOUR);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
* @returns {String} currency
|
|
41
|
+
* @namespace ../../utils/Currency/getCurrency
|
|
42
|
+
*/
|
|
43
|
+
export const getCurrency = (): string => {
|
|
44
|
+
const {
|
|
45
|
+
ConfigReducer: {
|
|
46
|
+
default_display_currency_code = window.storeCurrency,
|
|
47
|
+
} = {},
|
|
48
|
+
} = getStoreState();
|
|
49
|
+
|
|
50
|
+
const currency = BrowserDatabase.getItem(CUR_CURRENCY);
|
|
51
|
+
|
|
52
|
+
return (typeof currency === 'string') ? currency : default_display_currency_code;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
* @param {object} currencyData
|
|
58
|
+
* @param {object} currencyRates
|
|
59
|
+
* @returns {object} filtered currencyData object and currency (rates) object
|
|
60
|
+
* @namespace ../../utils/Currency/returnFilteredCurrencies
|
|
61
|
+
*/
|
|
62
|
+
export const returnFilteredCurrencies = (
|
|
63
|
+
currencyData: CurrencyData,
|
|
64
|
+
currencyRates: Currencies,
|
|
65
|
+
): { currencyData: CurrencyData; currencyRates?: Currencies; currency?: Currencies } => {
|
|
66
|
+
if (
|
|
67
|
+
currencyData?.available_currencies_data?.length < 1 || currencyRates?.exchange_rates?.length < 1) {
|
|
68
|
+
return ({ currencyData, currencyRates });
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const { available_currencies_data: availableCurrencies = [] } = currencyData;
|
|
72
|
+
const { base_currency_code: base, exchange_rates: rates = [] } = currencyRates;
|
|
73
|
+
|
|
74
|
+
return ({
|
|
75
|
+
currencyData: {
|
|
76
|
+
...currencyData,
|
|
77
|
+
available_currencies_data:
|
|
78
|
+
availableCurrencies.filter(({ value }) => (
|
|
79
|
+
value === base || Number(rates?.find(({ currency_to }) => currency_to === value)?.rate || 0) > 0
|
|
80
|
+
)),
|
|
81
|
+
},
|
|
82
|
+
currency: currencyRates,
|
|
83
|
+
});
|
|
84
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M Framework - Flexible backend agnostic framework.
|
|
3
|
+
*
|
|
4
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
5
|
+
* See LICENSE for license details.
|
|
6
|
+
*
|
|
7
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
8
|
+
* @package mframework/mframework
|
|
9
|
+
* @link https://github.com/meeovi/mframework
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export * from './Currency';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M Framework - Flexible backend agnostic framework.
|
|
3
|
+
*
|
|
4
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
5
|
+
* See LICENSE for license details.
|
|
6
|
+
*
|
|
7
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
8
|
+
* @package mframework/mframework-theme
|
|
9
|
+
* @link https://github.com/meeovi/mframework
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export type Props = Record<string, unknown>;
|
|
13
|
+
|
|
14
|
+
export type WithReducersResult = (props: Props) => JSX.Element;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M Framework - Flexible backend agnostic framework.
|
|
3
|
+
*
|
|
4
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
5
|
+
* See LICENSE for license details.
|
|
6
|
+
*
|
|
7
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
8
|
+
* @package mframework/mframework
|
|
9
|
+
* @link https://github.com/meeovi/mframework
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// Minimal reducer type alias for compatibility with legacy code.
|
|
13
|
+
type Reducer = (state: any, action?: any) => any;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param store
|
|
17
|
+
* @param reducers
|
|
18
|
+
*/
|
|
19
|
+
export default function injectToReducers(
|
|
20
|
+
store: any,
|
|
21
|
+
reducers: Record<string, Reducer>,
|
|
22
|
+
): void {
|
|
23
|
+
Object.keys(reducers).forEach((key) => {
|
|
24
|
+
if (store.asyncReducers && store.injectReducer && !Reflect.has(store.asyncReducers, key)) {
|
|
25
|
+
// eslint-disable-next-line no-param-reassign
|
|
26
|
+
store.asyncReducers[key] = reducers[key];
|
|
27
|
+
store.injectReducer(key, reducers[key]);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M Framework - Flexible backend agnostic framework.
|
|
3
|
+
*
|
|
4
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
5
|
+
* See LICENSE for license details.
|
|
6
|
+
*
|
|
7
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
8
|
+
* @package mframework/mframework
|
|
9
|
+
* @link https://github.com/meeovi/mframework
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { ElementType } from 'react';
|
|
13
|
+
// Minimal reducer type alias for compatibility with legacy code.
|
|
14
|
+
type Reducer = (state: any, action?: any) => any;
|
|
15
|
+
|
|
16
|
+
import injectReducers from '../../utils/DynamicReducer/Helper';
|
|
17
|
+
import { getStore } from '../../utils/Store';
|
|
18
|
+
|
|
19
|
+
import { Props, WithReducersResult } from './DynamicReducer.type';
|
|
20
|
+
|
|
21
|
+
/** @namespace ../../utils/DynamicReducer/Index/withReducers */
|
|
22
|
+
export const withReducers = (reducers: Record<string, Reducer>) => (
|
|
23
|
+
WrappedComponent: ElementType,
|
|
24
|
+
): WithReducersResult => {
|
|
25
|
+
const injectAndExecute = (props: Props) => {
|
|
26
|
+
injectReducers(getStore(), reducers);
|
|
27
|
+
|
|
28
|
+
// eslint-disable-next-line @mframework/mframework-guidelines/jsx-no-props-destruction
|
|
29
|
+
return <WrappedComponent { ...props } />;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
return injectAndExecute;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export default { withReducers };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/** @namespace ../../utils/ElementTransition/transitionElementFromTo */
|
|
2
|
+
/**
|
|
3
|
+
* M Framework - Flexible backend agnostic framework.
|
|
4
|
+
*
|
|
5
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
6
|
+
* See LICENSE for license details.
|
|
7
|
+
*
|
|
8
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
9
|
+
* @package mframework/mframework
|
|
10
|
+
* @link https://github.com/meeovi/mframework
|
|
11
|
+
*/
|
|
12
|
+
export const transitionElementFromTo = async ({
|
|
13
|
+
elFrom,
|
|
14
|
+
elToCallback,
|
|
15
|
+
isCopyCssProperties,
|
|
16
|
+
}: any) => {
|
|
17
|
+
if (!elFrom || !elToCallback) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const {
|
|
22
|
+
top: st, left: sl, width: sw, height: sh,
|
|
23
|
+
} = elFrom.getBoundingClientRect();
|
|
24
|
+
|
|
25
|
+
const transitionWrapper = document.createElement('div');
|
|
26
|
+
transitionWrapper.id = 'transition-wrapper';
|
|
27
|
+
transitionWrapper.classList.add('element-transition');
|
|
28
|
+
|
|
29
|
+
const clonedElement = elFrom.cloneNode(true);
|
|
30
|
+
|
|
31
|
+
if (isCopyCssProperties) {
|
|
32
|
+
const styles = window.getComputedStyle(elFrom);
|
|
33
|
+
|
|
34
|
+
['font', 'background', 'outline', 'border', 'color'].forEach((key) => {
|
|
35
|
+
clonedElement.style.setProperty(key, styles.getPropertyValue(key));
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
clonedElement.style.top = `${ st }px`;
|
|
40
|
+
clonedElement.style.left = `${ sl }px`;
|
|
41
|
+
clonedElement.style.width = `${ sw }px`;
|
|
42
|
+
clonedElement.style.height = `${ sh }px`;
|
|
43
|
+
|
|
44
|
+
transitionWrapper.appendChild(clonedElement);
|
|
45
|
+
document.body.appendChild(transitionWrapper);
|
|
46
|
+
|
|
47
|
+
// wait until condition is met
|
|
48
|
+
await new Promise((resolve, reject) => {
|
|
49
|
+
// eslint-disable-next-line fp/no-let
|
|
50
|
+
let maxTries = 100;
|
|
51
|
+
|
|
52
|
+
const interval = setInterval(() => {
|
|
53
|
+
if (maxTries <= 0) {
|
|
54
|
+
clearInterval(interval);
|
|
55
|
+
reject();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const condition = elToCallback();
|
|
59
|
+
|
|
60
|
+
if (condition) {
|
|
61
|
+
clearInterval(interval);
|
|
62
|
+
resolve(true);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
maxTries -= 1;
|
|
66
|
+
// eslint-disable-next-line no-magic-numbers
|
|
67
|
+
}, 100);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const imageTo = elToCallback();
|
|
71
|
+
|
|
72
|
+
const {
|
|
73
|
+
top: tt, left: tl, width: tw, height: th,
|
|
74
|
+
} = imageTo.getBoundingClientRect();
|
|
75
|
+
|
|
76
|
+
const newHeight = (th / tw) * sh;
|
|
77
|
+
const translateYCorrection = (newHeight - sh) / 2;
|
|
78
|
+
const newSt = st - translateYCorrection;
|
|
79
|
+
|
|
80
|
+
const translateX = tl - sl;
|
|
81
|
+
const translateY = tt - newSt;
|
|
82
|
+
const scale = tw / sw;
|
|
83
|
+
const scaleY = th / newHeight;
|
|
84
|
+
|
|
85
|
+
// Top is changed to get correct top location after transform
|
|
86
|
+
clonedElement.style.top = `${ newSt }px`;
|
|
87
|
+
// Height is changed to get correct aspect ratio before tranform
|
|
88
|
+
clonedElement.style.height = `${ newHeight }px`;
|
|
89
|
+
clonedElement.style.transform = `translate3d(${ translateX }px, ${ translateY }px, 0) scale(${ scale }, ${ scaleY })`;
|
|
90
|
+
|
|
91
|
+
setTimeout(() => {
|
|
92
|
+
transitionWrapper.classList.add('element-transition--active');
|
|
93
|
+
// eslint-disable-next-line no-magic-numbers
|
|
94
|
+
}, 150);
|
|
95
|
+
|
|
96
|
+
setTimeout(() => {
|
|
97
|
+
transitionWrapper.remove();
|
|
98
|
+
// eslint-disable-next-line no-magic-numbers
|
|
99
|
+
}, 300);
|
|
100
|
+
};
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M Framework - Flexible backend agnostic framework.
|
|
3
|
+
*
|
|
4
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
5
|
+
* See LICENSE for license details.
|
|
6
|
+
*
|
|
7
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
8
|
+
* @package mframework/mframework
|
|
9
|
+
* @link https://github.com/meeovi/mframework
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { DateFieldAttr, HourFormat } from 'Component/DateSelect/DateSelect.config';
|
|
13
|
+
import { FieldType } from 'Component/Field/Field.config';
|
|
14
|
+
import {
|
|
15
|
+
DATE_FIELDS_COUNT,
|
|
16
|
+
FieldDateType,
|
|
17
|
+
TimeFormat,
|
|
18
|
+
} from 'Component/FieldDate/FieldDate.config';
|
|
19
|
+
import { GetYearRangeAttributes } from '../../utils/Product/Product.type';
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
DateMap,
|
|
23
|
+
DateObject,
|
|
24
|
+
DatesData,
|
|
25
|
+
FieldData,
|
|
26
|
+
GetFieldsData,
|
|
27
|
+
YearRangeAttribute,
|
|
28
|
+
} from './Form.type';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Appends 0 to value if its less than passed attribute;
|
|
32
|
+
* @param value
|
|
33
|
+
* @param lessThan
|
|
34
|
+
* @returns {string|*}
|
|
35
|
+
* @namespace ../../utils/Form/Extract/zeroBasedValue
|
|
36
|
+
*/
|
|
37
|
+
// eslint-disable-next-line no-magic-numbers
|
|
38
|
+
export const zeroBasedValue = (value: number, lessThan = 10): string => (
|
|
39
|
+
(+value < lessThan) ? `0${value}` : String(value)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
/** @namespace ../../utils/Form/Extract/adjustHours */
|
|
43
|
+
export const adjustHours = (hours: number, timeFormat: string): number => {
|
|
44
|
+
if (timeFormat === TimeFormat.H12) {
|
|
45
|
+
if (hours > HourFormat.H12) {
|
|
46
|
+
return hours % HourFormat.H12;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (hours === 0) {
|
|
50
|
+
return HourFormat.H12;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return hours;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Converts date to magento supported format
|
|
59
|
+
* @returns {string|*}
|
|
60
|
+
* @namespace ../../utils/Form/Extract/getDateValue
|
|
61
|
+
*/
|
|
62
|
+
export const getDateValue = (dateValue: number | string | Date): number | string | Date => {
|
|
63
|
+
try {
|
|
64
|
+
const date = new Date(dateValue);
|
|
65
|
+
const day = zeroBasedValue(date.getDate());
|
|
66
|
+
const month = zeroBasedValue(date.getMonth() + 1);
|
|
67
|
+
const year = date.getFullYear();
|
|
68
|
+
const hours = zeroBasedValue(date.getHours());
|
|
69
|
+
const minutes = zeroBasedValue(date.getMinutes());
|
|
70
|
+
const seconds = zeroBasedValue(date.getSeconds());
|
|
71
|
+
|
|
72
|
+
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
73
|
+
} catch {
|
|
74
|
+
return dateValue;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/** @namespace ../../utils/Form/Extract/calcYearRangeAttributes */
|
|
79
|
+
export const calcYearRangeAttributes = (startYear: number, endYear: number): YearRangeAttribute => {
|
|
80
|
+
const currentYear = new Date().getFullYear();
|
|
81
|
+
|
|
82
|
+
// https://docs.magento.com/user-guide/stores/attribute-date-time-options.html
|
|
83
|
+
// blank year range defaults to current year
|
|
84
|
+
if (!startYear && !endYear) {
|
|
85
|
+
return { minYear: currentYear, maxYear: currentYear };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// if start or end date is empty it defaults to current year
|
|
89
|
+
// if it creates an invalid range, the only filled in year is used both as start and end of the range
|
|
90
|
+
// e.g. `2020,` => `2020,2021`, `,2022` => `2021,2022`, `,2020` => `2020,2020`, `2022,` => `2022,2022`
|
|
91
|
+
const minYear = startYear || (endYear && currentYear <= endYear ? currentYear : endYear);
|
|
92
|
+
const maxYear = endYear || (startYear && currentYear >= startYear ? currentYear : startYear);
|
|
93
|
+
|
|
94
|
+
return { minYear, maxYear };
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/** @namespace ../../utils/Form/Extract/getYearRangeAttributes */
|
|
98
|
+
export const getYearRangeAttributes = <IsYear extends boolean = false>(
|
|
99
|
+
yearRange: string | undefined, isYear: IsYear,
|
|
100
|
+
): GetYearRangeAttributes<IsYear> => {
|
|
101
|
+
const [startYear, endYear] = (yearRange || ',').split(',');
|
|
102
|
+
|
|
103
|
+
const { minYear, maxYear } = calcYearRangeAttributes(Number(startYear), Number(endYear));
|
|
104
|
+
|
|
105
|
+
if (isYear) {
|
|
106
|
+
return <GetYearRangeAttributes<IsYear>>{ minYear, maxYear };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return <GetYearRangeAttributes<IsYear>>{
|
|
110
|
+
minDate: new Date(`${minYear}-01-01T00:00:00.000`),
|
|
111
|
+
maxDate: new Date(`${maxYear}-12-31T23:59:59.999`),
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/** @namespace ../../utils/Form/Extract/isMagentoDateFormatValid */
|
|
116
|
+
export const isMagentoDateFormatValid = (dateFieldsOrder: string): boolean => new RegExp(Array(DATE_FIELDS_COUNT)
|
|
117
|
+
.fill('[dmy]').join(','))
|
|
118
|
+
.test(dateFieldsOrder);
|
|
119
|
+
|
|
120
|
+
/** @namespace ../../utils/Form/Extract/getTimeFormat */
|
|
121
|
+
export const getTimeFormat = (timeFormat: string): string => (timeFormat === TimeFormat.H12 ? 'h:mm aa' : 'HH:mm');
|
|
122
|
+
|
|
123
|
+
/** @namespace ../../utils/Form/Extract/getDateFormat */
|
|
124
|
+
export const getDateFormat = (dateFieldsOrder: string): string => {
|
|
125
|
+
if (!isMagentoDateFormatValid(dateFieldsOrder)) {
|
|
126
|
+
return 'dd/MM/yyyy';
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const dateMap: DateMap = {
|
|
130
|
+
d: 'dd',
|
|
131
|
+
m: 'MM',
|
|
132
|
+
y: 'yyyy',
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
return dateFieldsOrder
|
|
136
|
+
.split(',')
|
|
137
|
+
.map((field) => dateMap[<keyof DateMap>field])
|
|
138
|
+
.join('/');
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/** @namespace ../../utils/Form/Extract/getDateTimeFormat */
|
|
142
|
+
export const getDateTimeFormat = (type: string, dateFieldsOrder: string, timeFormat: string): string => {
|
|
143
|
+
const timePart = type === FieldDateType.TIME || type === FieldDateType.DATETIME
|
|
144
|
+
? getTimeFormat(timeFormat)
|
|
145
|
+
: '';
|
|
146
|
+
|
|
147
|
+
const datePart = type === FieldDateType.DATE || type === FieldDateType.DATETIME
|
|
148
|
+
? getDateFormat(dateFieldsOrder)
|
|
149
|
+
: '';
|
|
150
|
+
|
|
151
|
+
return `${datePart } ${ timePart}`.trim();
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/** @namespace ../../utils/Form/Extract/adjustAmpmHours */
|
|
155
|
+
export const adjustAmpmHours = (hours: number, ampm?: string): number => {
|
|
156
|
+
if (ampm === 'PM') {
|
|
157
|
+
return (hours % HourFormat.H12) + HourFormat.H12;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (ampm === 'AM') {
|
|
161
|
+
return hours % HourFormat.H12;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return hours;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/** @namespace ../../utils/Form/Extract/transformDateFieldsData */
|
|
168
|
+
export const transformDateFieldsData = (
|
|
169
|
+
datesData: Record<string, DatesData>,
|
|
170
|
+
): DateObject[] => Object.entries(datesData).reduce((
|
|
171
|
+
prev: DateObject[],
|
|
172
|
+
[name, data],
|
|
173
|
+
) => {
|
|
174
|
+
const {
|
|
175
|
+
type,
|
|
176
|
+
year,
|
|
177
|
+
month,
|
|
178
|
+
day,
|
|
179
|
+
hours,
|
|
180
|
+
minutes,
|
|
181
|
+
ampm,
|
|
182
|
+
} = data;
|
|
183
|
+
|
|
184
|
+
const hoursAdjusted = adjustAmpmHours(Number(hours), ampm);
|
|
185
|
+
|
|
186
|
+
if (type === FieldDateType.DATE && year && month && day) {
|
|
187
|
+
return [...prev, {
|
|
188
|
+
name,
|
|
189
|
+
type,
|
|
190
|
+
value: `${year}-${month}-${day} 00:00:00`,
|
|
191
|
+
}];
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (type === FieldDateType.DATETIME && year && month && day && hours && minutes) {
|
|
195
|
+
return [...prev, {
|
|
196
|
+
name,
|
|
197
|
+
type,
|
|
198
|
+
value: `${year}-${month}-${day} ${hoursAdjusted}:${minutes}:00`,
|
|
199
|
+
}];
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (type === FieldDateType.TIME && hours && minutes) {
|
|
203
|
+
return [...prev, {
|
|
204
|
+
name,
|
|
205
|
+
type,
|
|
206
|
+
value: `2000-01-01 ${hoursAdjusted}:${minutes}:00`,
|
|
207
|
+
}];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return prev;
|
|
211
|
+
}, []);
|
|
212
|
+
|
|
213
|
+
/** @namespace ../../utils/Form/Extract/groupDateFieldsData */
|
|
214
|
+
export const groupDateFieldsData = (
|
|
215
|
+
fields: NodeListOf<HTMLSelectElement | HTMLInputElement>,
|
|
216
|
+
): Record<string, DatesData> => Array.from(fields)
|
|
217
|
+
.reduce((prev: Record<string, DatesData>, field) => {
|
|
218
|
+
const dataType = field.getAttribute(DateFieldAttr.TYPE) || '';
|
|
219
|
+
|
|
220
|
+
if (!Object.values<string>(FieldDateType).includes(dataType)) {
|
|
221
|
+
return prev;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const { name, value } = field;
|
|
225
|
+
const fieldName = field.getAttribute(DateFieldAttr.NAME) || '';
|
|
226
|
+
const { [name]: prevData } = prev;
|
|
227
|
+
|
|
228
|
+
return {
|
|
229
|
+
...prev,
|
|
230
|
+
[name]: {
|
|
231
|
+
...prevData,
|
|
232
|
+
type: <FieldDateType>dataType,
|
|
233
|
+
[fieldName]: value,
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
}, {});
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Returns fields values from DOM/Form
|
|
240
|
+
* @param DOM
|
|
241
|
+
* @param excludeEmpty
|
|
242
|
+
* @param ignoreTypes
|
|
243
|
+
* @param asObject
|
|
244
|
+
* @returns {{}|*[]}
|
|
245
|
+
* @namespace ../../utils/Form/Extract/getFieldsData
|
|
246
|
+
*/
|
|
247
|
+
export const getFieldsData = <AsObject extends boolean = false>(
|
|
248
|
+
DOM: Document | HTMLElement | null,
|
|
249
|
+
excludeEmpty = false,
|
|
250
|
+
ignoreTypes: string[] = [],
|
|
251
|
+
asObject?: AsObject,
|
|
252
|
+
): GetFieldsData<AsObject> | null => {
|
|
253
|
+
if (!DOM) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const fields: NodeListOf<HTMLSelectElement | HTMLInputElement> = DOM.querySelectorAll('input, textarea, select');
|
|
258
|
+
const output: Array<DateObject | FieldData> = [];
|
|
259
|
+
|
|
260
|
+
const dateFieldsGrouped = groupDateFieldsData(fields);
|
|
261
|
+
|
|
262
|
+
output.push(...transformDateFieldsData(dateFieldsGrouped));
|
|
263
|
+
|
|
264
|
+
fields.forEach((field) => {
|
|
265
|
+
if (Object.values<string>(FieldDateType).includes(field.getAttribute(DateFieldAttr.TYPE) || '')) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const { tagName } = field;
|
|
270
|
+
const tag = tagName.toLowerCase();
|
|
271
|
+
const type = tag === FieldType.TEXTAREA || tag === FieldType.SELECT || tag === FieldType.BUTTON
|
|
272
|
+
? tag
|
|
273
|
+
: field.type;
|
|
274
|
+
|
|
275
|
+
if (ignoreTypes.some((ignoreType) => ignoreType === type)) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// eslint-disable-next-line no-nested-ternary
|
|
280
|
+
const value = field instanceof HTMLInputElement
|
|
281
|
+
&& (type === FieldType.CHECKBOX || type === FieldType.RADIO)
|
|
282
|
+
// eslint-disable-next-line no-nested-ternary
|
|
283
|
+
? (field.checked ? field.value === 'on' ? true : field.value : false)
|
|
284
|
+
: field instanceof HTMLInputElement && type === FieldType.FILE
|
|
285
|
+
? field.fileData
|
|
286
|
+
: field.value;
|
|
287
|
+
|
|
288
|
+
const dateValue = field.getAttribute('data-date');
|
|
289
|
+
const formattedValue = dateValue ? getDateValue(dateValue) : value;
|
|
290
|
+
|
|
291
|
+
if (!excludeEmpty || value) {
|
|
292
|
+
output.push({
|
|
293
|
+
name: field.name,
|
|
294
|
+
type,
|
|
295
|
+
value: formattedValue,
|
|
296
|
+
field: (field as HTMLInputElement),
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
if (asObject) {
|
|
302
|
+
const objectOutput: Record<string, DateObject | FieldData> = {};
|
|
303
|
+
|
|
304
|
+
output.forEach((field) => {
|
|
305
|
+
const { name } = field;
|
|
306
|
+
|
|
307
|
+
objectOutput[name] = field;
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
return <GetFieldsData<AsObject>>objectOutput;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return <GetFieldsData<AsObject>>output;
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
export default getFieldsData;
|