{"version":3,"file":"static/js/15.0a3053389d90b17d82a6.chunk.js","mappings":"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","sources":["webpack://msdyn365.commerce.online/./src/Utilities/brand-code-parser.tsx?7ce1","webpack://msdyn365.commerce.online/./src/Utilities/elicit-savings-calculation.tsx?c006","webpack://msdyn365.commerce.online/./src/Utilities/event-bus.tsx?4082","webpack://msdyn365.commerce.online/./src/Utilities/get-product-attributes.tsx?d9db","webpack://msdyn365.commerce.online/./src/Utilities/productType.tsx?6c43","webpack://msdyn365.commerce.online/./src/Utilities/refiners.ts?ec9f","webpack://msdyn365.commerce.online/./src/Utilities/smwe-order-summary-shipment-calculation.tsx?502e","webpack://msdyn365.commerce.online/./src/components/cartlineitem.component.tsx?a7da","webpack://msdyn365.commerce.online/./src/components/elicit-amountselector.component.tsx?44b2","webpack://msdyn365.commerce.online/./src/components/elicit-cartlineitem.component.tsx?7980","webpack://msdyn365.commerce.online/./src/components/master-prod-display-name.tsx?6719","webpack://msdyn365.commerce.online/./src/Utilities/product-lightbox.tsx?a6e5","webpack://msdyn365.commerce.online/./src/components/product.component.tsx?e2d5","webpack://msdyn365.commerce.online/./src/modules/elicit-cart/components/elicit-cart-pick-up-in-store.tsx?741a","webpack://msdyn365.commerce.online/./src/modules/elicit-cart/components/elicit-cart-line-items.tsx?3d3c","webpack://msdyn365.commerce.online/./src/modules/elicit-cart/components/elicit-subscription-header.tsx?d917","webpack://msdyn365.commerce.online/./src/Utilities/smwe-order-summary-lineitem.tsx?6f41","webpack://msdyn365.commerce.online/./src/modules/elicit-cart/components/elicit-promo-code.tsx?0fa8","webpack://msdyn365.commerce.online/./src/modules/elicit-cart/components/elicit-subscription-upsell.tsx?63a4","webpack://msdyn365.commerce.online/./src/modules/elicit-cart/elicit-cart.tsx?36c6","webpack://msdyn365.commerce.online/./src/modules/elicit-cart/elicit-cart.view.tsx?9dff","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/choice-summary.tsx?9f48","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/link.tsx?e724","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/product-search-result-items.tsx?9dea","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/title.tsx?57a0","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/separator.tsx?7076","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/modal.tsx?a3b9","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/error-message.tsx?8eb8","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/range-refine-item.tsx?c45b","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/refine-item.tsx?7962","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/refine-submenu.tsx?a45c","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/components/utilities.ts?d70e","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/elicit-subscriptions.tsx?b4f2","webpack://msdyn365.commerce.online/./src/modules/elicit-subscriptions/elicit-subscriptions.view.tsx?db2e","webpack://msdyn365.commerce.online/./src/modules/smwe-buybox/utilities/error-utilities.ts?e276","webpack://msdyn365.commerce.online/./src/modules/smwe-buybox/components/smwe-buybox-small-components.tsx?114c","webpack://msdyn365.commerce.online/./src/modules/smwe-buybox/components/smwe-buybox-find-in-store.tsx?e263","webpack://msdyn365.commerce.online/./src/modules/smwe-buybox/components/dropdown/dropdown.tsx?97ce","webpack://msdyn365.commerce.online/./src/modules/smwe-buybox/components/smwe-buybox-product-configure.tsx?d5ef","webpack://msdyn365.commerce.online/./src/modules/smwe-buybox/smwe-buybox.tsx?4181","webpack://msdyn365.commerce.online/./src/modules/smwe-buybox/smwe-buybox.view.tsx?917c","webpack://msdyn365.commerce.online/./src/modules/smwe-cart/components/smwe-cart-pick-up-in-store.tsx?7217","webpack://msdyn365.commerce.online/./src/modules/smwe-cart/components/smwe-cart-line-items.tsx?9ea5","webpack://msdyn365.commerce.online/./src/modules/smwe-cart/components/smwe-promo-code.tsx?a2ef","webpack://msdyn365.commerce.online/./src/modules/smwe-cart/smwe-cart.tsx?e7d3","webpack://msdyn365.commerce.online/./src/modules/smwe-cart/smwe-cart.view.tsx?98b3","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout-delivery-options/components/smwe-checkout-delivery-options.description.tsx?6320","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout-delivery-options/components/smwe-checkout-delivery-options.error-message.tsx?de1e","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout-delivery-options/components/smwe-checkout-delivery-options.error-title.tsx?8691","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout-delivery-options/components/smwe-checkout-delivery-options.radio-button.tsx?dbfb","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout-delivery-options/smwe-checkout-delivery-options.tsx?3b86","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout-delivery-options/smwe-checkout-delivery-options.view.tsx?b913","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/components/alert.tsx?96ff","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/components/get-invoice-payment-summary.tsx?9107","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/components/get-line-items.tsx?6996","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/components/get-order-summary.tsx?81e6","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/components/guided-card.tsx?1378","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/components/guided-form.tsx?fb1c","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/components/place-order-button.tsx?7f39","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/methods/empty-active-cart.ts?7db3","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/methods/smwe-checkout.ts?027c","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/smwe-checkout.tsx?819a","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/methods/place-order.ts?31b9","webpack://msdyn365.commerce.online/./src/modules/smwe-checkout/smwe-checkout.view.tsx?4a43","webpack://msdyn365.commerce.online/./src/modules/smwe-product-collection/smwe-product-collection.props.autogenerated.ts?3a34","webpack://msdyn365.commerce.online/./src/Utilities/single-slide-carousel.tsx?f3df","webpack://msdyn365.commerce.online/./src/modules/smwe-product-collection/smwe-product-collection.tsx?ffda","webpack://msdyn365.commerce.online/./src/modules/smwe-product-collection/smwe-product-collection.view.tsx?4dff","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/choice-summary.tsx?40ee","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/link.tsx?da5d","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/product-search-result-items.tsx?c495","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/title.tsx?ffe6","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/separator.tsx?f3e6","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/modal.tsx?ba49","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/error-message.tsx?58a6","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/range-refine-item.tsx?b788","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/refine-item.tsx?7290","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/refine-submenu.tsx?02ce","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/utilities.ts?e38f","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/refine-pulldown.tsx?f64d","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/components/smwe-pagination.tsx?95c0","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/smwe-search-result-container.tsx?a55c","webpack://msdyn365.commerce.online/./src/modules/smwe-search-result-container/smwe-search-result-container.view.tsx?08ec","webpack://msdyn365.commerce.online/./src/modules/subscriptions-minicart/components/bottle-count-display.component.tsx?5bfe","webpack://msdyn365.commerce.online/./src/modules/subscriptions-minicart/components/box-edit.component.tsx?ba00","webpack://msdyn365.commerce.online/./src/modules/subscriptions-minicart/components/cart-display.component.tsx?fdec","webpack://msdyn365.commerce.online/./src/modules/subscriptions-minicart/components/subscription-banner-display.component.tsx?af9c","webpack://msdyn365.commerce.online/./src/modules/subscriptions-minicart/subscriptions-minicart.tsx?2972","webpack://msdyn365.commerce.online/./src/modules/subscriptions-minicart/subscriptions-minicart.view.tsx?b650","webpack://msdyn365.commerce.online/./src/themes/blend/views/smwe-buybox.view.tsx?db05","webpack://msdyn365.commerce.online/./src/themes/blend/views/smwe-search-result-container.view.tsx?b960","webpack://msdyn365.commerce.online/./src/themes/conn-creek/views/smwe-checkout-delivery-options.view.tsx?1344","webpack://msdyn365.commerce.online/./src/themes/conn-creek/views/smwe-search-result-container.view.tsx?3a2e","webpack://msdyn365.commerce.online/./src/themes/elicit/views/smwe-buybox.view.tsx?13f0","webpack://msdyn365.commerce.online/./src/themes/elicit/views/smwe-checkout-delivery-options.view.tsx?efe1","webpack://msdyn365.commerce.online/./src/themes/elicit/views/smwe-checkout.view.tsx?2eee","webpack://msdyn365.commerce.online/./src/themes/elicit/views/smwe-search-result-container.view.tsx?35e0","webpack://msdyn365.commerce.online/./src/themes/emp/views/smwe-buybox.view.tsx?7d9f","webpack://msdyn365.commerce.online/./src/themes/emp/views/smwe-cart.view.tsx?f01f","webpack://msdyn365.commerce.online/./src/themes/emp/views/smwe-search-result-container.view.tsx?782c","webpack://msdyn365.commerce.online/./src/themes/fth/views/smwe-buybox.view.tsx?f7cc","webpack://msdyn365.commerce.online/./src/themes/fth/views/smwe-checkout.view.tsx?5f79","webpack://msdyn365.commerce.online/./src/themes/fth/views/smwe-search-result-container.view.tsx?039a","webpack://msdyn365.commerce.online/./src/themes/patzhall/views/smwe-buybox.view.tsx?6d0d","webpack://msdyn365.commerce.online/./src/themes/patzhall/views/smwe-search-result-container.view.tsx?16c5","webpack://msdyn365.commerce.online/./src/themes/stemichelle-new/views/smwe-buybox.view.tsx?2b1c","webpack://msdyn365.commerce.online/./src/validate-cart.ts?cd50","webpack://msdyn365.commerce.online/./src/Common/get-product.ts?0a21","webpack://msdyn365.commerce.online/./src/modules/cart/actions/get-pickup-options-for-cartlines.ts?acad","webpack://msdyn365.commerce.online/./src/modules/cart/components/cart-pick-up-in-store.tsx?dca8","webpack://msdyn365.commerce.online/./src/modules/cart/components/cart-line-items.tsx?f6b2","webpack://msdyn365.commerce.online/./src/modules/cart/components/cart-line-groups.tsx?f076","webpack://msdyn365.commerce.online/./src/modules/cart/utils/get-promotion-in-cart.ts?4195","webpack://msdyn365.commerce.online/./src/modules/cart/cart.tsx?d4e4","webpack://msdyn365.commerce.online/./src/modules/cart/components/cart-line-items-promotion.tsx?80d9","webpack://msdyn365.commerce.online/./src/modules/cart/cart.view.tsx?d8c2","webpack://msdyn365.commerce.online/../../src/checkout-utilities.data.ts?b2cc","webpack://msdyn365.commerce.online/../../../src/module-state-manager/module-state.ts?7579","webpack://msdyn365.commerce.online/../../../src/module-state-manager/with-module-state.tsx?61ca","webpack://msdyn365.commerce.online/./src/invoice-summary-lineitem.tsx?5f61","webpack://msdyn365.commerce.online/./src/order-summary-lineitem.tsx?8a98"],"sourcesContent":["import { ICoreContext } from '@msdyn365-commerce/core-internal';\r\ninterface IBrandCodeProps {\r\n description?: string;\r\n appContext: ICoreContext<{\r\n // any is just matching the types here.\r\n // tslint:disable-next-line: no-any\r\n [x: string]: any;\r\n }>;\r\n}\r\n\r\ntype BrandCodeTable = {\r\n brandName: string;\r\n brandCode: string;\r\n}[];\r\n\r\n/**\r\n * for converting a brand code to a brand name\r\n *\r\n */\r\nexport function brandCodeParser({ description, appContext }: IBrandCodeProps): string {\r\n\r\n // for mocking\r\n // const brandCodeTable: BrandCodeTable = [{ brandName: '14Hands', brandCode: 'FTH' }];\r\n\r\n const brandCodeTable = appContext.app.config.brandCodeTable as BrandCodeTable;\r\n\r\n // this is a safety check to ensure that brand code table does NOT crash in local or\r\n // if brand code table is somehow not connecting right to the global config. it will\r\n // essentially act as if there are no brand codes declared - keeping how everything\r\n // looks originally\r\n if (!brandCodeTable) { return ''; }\r\n\r\n // a brand code may and may only appear in the first three characters of a string\r\n // we are lowercasing in the off-chance that the authors type them differently between\r\n // the sources\r\n const currentBrandCode = description && description.slice(0, 3).toLowerCase();\r\n const brandFound = brandCodeTable.find(brand => brand.brandCode.toLowerCase() === currentBrandCode);\r\n if (brandFound) { return brandFound.brandName; }\r\n return '';\r\n}","import { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nexport function calculateSavingPercentAmount(lines?: CartLine[]): number {\r\n let total = 0;\r\n lines?.forEach(line => total += line.Quantity || 0);\r\n if (total > 11) { return 15; }\r\n if (total > 3) { return 10; }\r\n return 0;\r\n}","/* tslint:disable */\r\nimport { IReactComponent } from 'mobx-react/index';\r\nimport React, { Component, ComponentType } from 'react';\r\n\r\ntype subscriptionCallback = (...args: T[]) => void;\r\n\r\ntype subscription = { [uniqueId: string]: subscriptionCallback };\r\n\r\n/**\r\n * A loader that maintains a list of current namespaces. Meant to be later\r\n * singleton'd\r\n */\r\nclass EventBusLoader {\r\n\r\n // list of current buses that are in action\r\n private _buses: { [namespace: string]: BusLoader } = {};\r\n\r\n /**\r\n * get's an existing bus or creating a new bus of that namespace\r\n *\r\n * @param busNamespace the namespace of the bus to retrieve\r\n */\r\n public getBus(busNamespace: string): BusLoader {\r\n // fast return if the bus already exists\r\n if (this._buses[busNamespace]) {\r\n return this._buses[busNamespace];\r\n }\r\n\r\n // create a new bus and do the internal subscription for deleting the entire bus when bus\r\n // is empty\r\n this._buses[busNamespace] = new BusLoader();\r\n this._buses[busNamespace].subscribe('_readyForDeletion', this.deleteBus.bind(this));\r\n return this._buses[busNamespace];\r\n }\r\n\r\n /**\r\n * deletes and purges all events\r\n *\r\n * @param busNamespace the namespace of the bus to delete\r\n */\r\n public deleteBus(busNamespace: string): void {\r\n if (this._buses[busNamespace]) {\r\n this._buses[busNamespace].purge();\r\n }\r\n delete this._buses[busNamespace];\r\n }\r\n}\r\n\r\n/**\r\n * Contains a single namespace of events of the event bus\r\n */\r\nexport class BusLoader {\r\n\r\n // list of all subscriptions within this bus's namespace\r\n private _subscriptions: { [subName: string]: subscription } = {};\r\n\r\n /**\r\n * subscribe to a subscription within this namespace\r\n *\r\n * @param subName event subscription name\r\n * @param onPublish callback that triggers when subscription gets published\r\n */\r\n public subscribe(subName: string, onPublish: subscriptionCallback): { unsubscribe(): void, id: number } {\r\n\r\n // generates an ever-counting up id generator\r\n const nextId = IdGenerator();\r\n\r\n // create a new list if the bus loader contains no subscription\r\n if (!this._subscriptions[subName]) {\r\n this._subscriptions[subName] = {\r\n _readyForDeletion: () => { /* event to notify loader that this is going to be deleted */ }\r\n };\r\n }\r\n\r\n // add the subscription to the list\r\n this._subscriptions[subName][nextId] = onPublish as subscriptionCallback;\r\n\r\n // return an unsubscribe method for deleting this specific subscription\r\n return {\r\n id: nextId,\r\n unsubscribe: () => {\r\n this._purgeById(subName, nextId);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * remove a subscription from anywhere within the namespace\r\n *\r\n * @param id subscription id\r\n */\r\n public unsubscribe(id: number): boolean {\r\n for (const subName in this._subscriptions) {\r\n if (this._subscriptions[subName][id]) {\r\n this._purgeById(subName, id);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * publish data to all subscriptions\r\n *\r\n * @param subName subscription name to publish to\r\n * @param args data to pass into the subscribed functions\r\n */\r\n public publish(subName: string, ...args: any): void {\r\n // don't do anything if it doesnt exist and fail\r\n // gracefully\r\n if (!this._subscriptions[subName]) {\r\n return;\r\n }\r\n\r\n Object.keys(this._subscriptions[subName])\r\n .forEach(id => {\r\n this._subscriptions[subName] && this._subscriptions[subName][id] && this._subscriptions[subName][id](...args);\r\n });\r\n }\r\n\r\n /**\r\n * purge all data in the bus loader\r\n */\r\n public purge(): void {\r\n this._subscriptions = {};\r\n }\r\n\r\n /**\r\n * purges a single subscription id endpoint from a subscription\r\n * name\r\n *\r\n * @param subName subscription name\r\n * @param id subscription id\r\n */\r\n private _purgeById(subName: string, id: number) {\r\n delete this._subscriptions[subName][id];\r\n\r\n // not zero because there will always be the internal _readyForDeletion event\r\n if (Object.keys(this._subscriptions[subName]).length === 1) {\r\n this.publish('_readyForDeletion');\r\n delete this._subscriptions[subName];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * generates a singleton of ids\r\n */\r\nconst IdGenerator = (() => {\r\n let idValue = 0;\r\n\r\n return () => {\r\n idValue += 1;\r\n return idValue;\r\n };\r\n})();\r\n\r\n/**\r\n * generates a singleton of the bus loader\r\n */\r\nconst Loader = (() => {\r\n return new EventBusLoader();\r\n})();\r\n\r\nexport function LoadBus(eventNamespace: string): (newComponent: T) => void {\r\n return (CHILD_COMP: ComponentType) => {\r\n return class extends Component {\r\n constructor(props: any) {\r\n super(props);\r\n\r\n // add to the component the bus\r\n CHILD_COMP.prototype.bus = this.bus;\r\n }\r\n\r\n // the bus's definition\r\n public get bus() { return Loader.getBus(eventNamespace); }\r\n\r\n // we arent decorating anything related to the UI so just return the child with\r\n // all it's props\r\n public render(): JSX.Element {\r\n return ;\r\n }\r\n };\r\n };\r\n}","//==============================================================================\r\n//==============================================================================\r\nimport { get, groupBy, uniq } from 'lodash';\r\n\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { searchAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { CartLine, ProductProperty, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { IContext } from '@msdyn365-commerce/retail-proxy/dist/interfaces';\r\n\r\n//==============================================================================\r\n//==============================================================================\r\nexport interface IAttributeList {\r\n [attributeName: string]: string;\r\n}\r\n\r\nexport interface IAttributeBank {\r\n [productId: number]: IAttributeList;\r\n}\r\n\r\n//==============================================================================\r\n//==============================================================================\r\nlet attributeCache: IAttributeBank = {};\r\n\r\n//----------------------------------------------------------\r\n// Given a set of product IDs, return product attributes for\r\n// all of them.\r\n//\r\n// Returns an IAttributeBank, grouped by product ID then\r\n// attribute name.\r\n//----------------------------------------------------------\r\nasync function fetchProductAttributes(productIDs: number[], context: IActionContext): Promise {\r\n\r\n // Fetch product information from retail server\r\n const ctx: IContext = { callerContext: context };\r\n const productSearchCriteria: ProductSearchCriteria = {\r\n Ids: productIDs,\r\n Context: {\r\n ChannelId: context.requestContext.apiSettings.channelId,\r\n CatalogId: context.requestContext.apiSettings.catalogId\r\n },\r\n };\r\n\r\n const result = await searchAsync(ctx, productSearchCriteria);\r\n\r\n // Transform results into a useful format\r\n return result.reduce(\r\n (output, product) => {\r\n const translatedProperties: ProductProperty[] = get(product, 'ProductProperties[0].TranslatedProperties', []);\r\n\r\n // Convert from an array of records to a hash of values\r\n output[product.RecordId] = translatedProperties.reduce(\r\n (attributes, property) => {\r\n if (property.FriendlyName && property.ValueString) {\r\n attributes[property.FriendlyName] = property.ValueString;\r\n }\r\n\r\n return attributes;\r\n },\r\n {} as IAttributeList\r\n );\r\n\r\n return output;\r\n },\r\n {} as IAttributeBank\r\n );\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Given a set of product IDs, return product attributes for\r\n// all of them.\r\n//\r\n// Uses a local cache at the product ID level to prevent\r\n// duplicate requests.\r\n//\r\n// Returns an IAttributeBank, grouped by product ID then\r\n// attribute name.\r\n//----------------------------------------------------------\r\nexport async function getAttributesByProductID(productIDs: number[], context: IActionContext): Promise {\r\n\r\n // Split IDs into cached and uncached groups\r\n const groupedIDs = groupBy(productIDs, id => (attributeCache[id] ? 'cached' : 'uncached'));\r\n\r\n // Fetch products not already in the cache\r\n const uncachedAttributes = groupedIDs.uncached ? await fetchProductAttributes(groupedIDs.uncached, context) : {};\r\n\r\n // Merge new products into the cache\r\n attributeCache = {...attributeCache, ...uncachedAttributes};\r\n\r\n // Add cached entries to the result\r\n const result = uncachedAttributes; // This does nothing except change the name. Referring to the combined result as \"uncached\" is unclear.\r\n groupedIDs.cached && groupedIDs.cached.forEach(id => {\r\n result[id] = attributeCache[id];\r\n });\r\n\r\n return result;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Given an array of cart lines, return product attributes for\r\n// all products in the cart\r\n//----------------------------------------------------------\r\nexport function getAttributesForCart(cartLines: CartLine[], context: IActionContext): Promise {\r\n\r\n // Create a list of product IDs from the cart lines, removing any duplicates\r\n const productIDs = uniq(cartLines.map(line => line.ProductId!));\r\n\r\n // Fetch the attributes for the requested products\r\n return getAttributesByProductID(productIDs, context);\r\n}","import { ICoreContext } from '@msdyn365-commerce/core';\r\n\r\n/**\r\n * ProductType for checking product Type\r\n */\r\n// tslint:disable-next-line: no-unnecessary-class\r\nexport default class ProductType {\r\n public static EventDeliveryMode:string = '40.5';\r\n private isWine:boolean = false;\r\n private isEvent:boolean = false;\r\n private isGiftCard:boolean = false;\r\n\r\n // TODO: Temporary solution till we get better solution in checking product type in Cart\r\n public check(DeliveryMode: string | undefined | null, context?: ICoreContext):void {\r\n if (DeliveryMode && DeliveryMode === (context?.request.channel?.EmailDeliveryModeCode || '40')) {\r\n this.isGiftCard = true;\r\n } else if (DeliveryMode && DeliveryMode === ProductType.EventDeliveryMode) {\r\n this.isEvent = true;\r\n } else {\r\n this.isWine = true;\r\n }\r\n }\r\n\r\n public isWineProduct(): boolean {\r\n return this.isWine && !this.isEvent && !this.isGiftCard;\r\n }\r\n\r\n public isMixedProduct(): boolean {\r\n return Number(this.isWine) + Number(this.isEvent) + Number(this.isGiftCard) >= 2;\r\n }\r\n}\r\n","import { CategoryHierarchy, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\n\r\n// Refiner Remappers, stored in global config\r\nexport interface IRemapper {\r\n originalName: string;\r\n newName: string;\r\n}\r\n\r\n//-----------------------------------------------------\r\n// Remove category refiners that aren't in the current\r\n// position within the hierarchy.\r\n//-----------------------------------------------------\r\nexport function filterInvalidCategories(refiners: IProductRefinerHierarchy[], categoryHierarchy: CategoryHierarchy[], remappers: IRemapper[]): void {\r\n // If we don't have any refiners (yet), don't do anything\r\n if (!refiners || !refiners.length) {\r\n return undefined;\r\n }\r\n\r\n // Find the category refiner name\r\n const categoryRemapper = remappers && remappers.find(remapRecord => remapRecord.originalName.toLowerCase() === `category`);\r\n const categoryRefinerName = categoryRemapper ? categoryRemapper.newName : `Category`;\r\n\r\n // Find the category refiners\r\n const categoryRefiners = refiners.find(entry => (entry.KeyName === categoryRefinerName));\r\n\r\n // Filter out invalid entries\r\n if (categoryRefiners) {\r\n // Construct a list of valid categories (note: this only goes one level deep!)\r\n const categoryIDs = {};\r\n\r\n if (categoryHierarchy && categoryHierarchy[0]) {\r\n categoryHierarchy[0].Children?.forEach(entry => categoryIDs[entry.RecordId] = true);\r\n }\r\n\r\n // Remove refiners that aren't in the list of categories\r\n categoryRefiners.Values = categoryRefiners.Values.filter(entry => (entry.RefinerRecordId && categoryIDs[entry.RefinerRecordId]));\r\n }\r\n}\r\n","//==============================================================================\r\n// Tools to aid in calculating shipping costs\r\n//\r\n// Generally, shipping is automatically calculated during checkout and left\r\n// as unknown while shopping. Sites like Elicit have a fixed shipping cost\r\n// model which is known during shopping. These tools examine the cart and\r\n// apply the model to determine shipping cost.\r\n// Note that shipping cost during checkout won't match these costs without\r\n// careful ship method setup.\r\n//==============================================================================\r\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\r\nimport { CartUtilities } from './cart-utils';\r\nimport { filterCartLines } from './subscription-manager';\r\n\r\n//==============================================================================\r\n// INTERFACES AND ENUMS\r\n//==============================================================================\r\n\r\n// Incoming cart data used to perform the calculations\r\ninterface IOrderSummaryShipmentCalculation {\r\n cart: Cart;\r\n}\r\n\r\n// Calculated shipping cost information\r\ninterface IShipmentCalculationResult {\r\n price: number;\r\n summary: string;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Table of shipping charges\r\n//\r\n// legend:\r\n// G = greater than\r\n// GE = greater than / equal to\r\n// L = less than\r\n// LE = less than / equal to\r\n//----------------------------------------------------------\r\nconst CartOrderPriceGuide = {\r\n NONSUBSCRIPTION_LE_3: 10,\r\n NONSUBSCRIPTION_G_3: 20,\r\n\r\n SUBSCRIPTION_LE_3: 10,\r\n SUBSCRIPTION_GE_4_LE_5: 10,\r\n SUBSCRIPTION_GE_6_AND_LE_11: 5,\r\n SUBSCRIPTION_GE_12: 0.01,\r\n\r\n GIFT_CARDS_ONLY: 0,\r\n\r\n MIXED_ADD_PRICE: 5,\r\n};\r\n\r\n//==============================================================================\r\n// EXPORTED FUNCTIONS\r\n//==============================================================================\r\n\r\n//----------------------------------------------------------\r\n// Calculate shipping cost for Elicit-style shipping models\r\n//----------------------------------------------------------\r\nexport function orderSummaryShipmentCalculation({ cart }: IOrderSummaryShipmentCalculation): IShipmentCalculationResult {\r\n\r\n // Split the cart into subscription and non-subscription lines\r\n const filter = filterCartLines(cart);\r\n\r\n // Determine the presense and quantity of subscriptions and non-subscription items (ignoring gift cards)\r\n // This assumes gift card shipping is $0. If that value changes for any reason, this logic will need to be improved.\r\n const subscriptionCartLength = CartUtilities.countCartLineAmountNoGiftCards(filter.subscriptionLines);\r\n const nonSubscriptionCartLength = CartUtilities.countCartLineAmountNoGiftCards(filter.lines);\r\n\r\n if (!subscriptionCartLength && !nonSubscriptionCartLength) {\r\n // Gift Card(s) only\r\n return formatShipmentCalculation('GIFT_CARDS_ONLY');\r\n } else if (subscriptionCartLength && !nonSubscriptionCartLength) {\r\n // Subscription only\r\n return orderSubscriptionBased(subscriptionCartLength);\r\n } else if (!subscriptionCartLength && nonSubscriptionCartLength) {\r\n // Non-subscription only\r\n return orderNonSubscriptionBased(nonSubscriptionCartLength);\r\n } else {\r\n // Mixed cart (subscription + non-subscription)\r\n return orderMixedBased(subscriptionCartLength);\r\n }\r\n}\r\n\r\n//==============================================================================\r\n// INTERNAL FUNCTIONS\r\n//==============================================================================\r\n\r\n//----------------------------------------------------------\r\n// Handle costs for non-subscription items\r\n//----------------------------------------------------------\r\nfunction orderNonSubscriptionBased(cartLength: number): IShipmentCalculationResult {\r\n if (cartLength <= 3) {\r\n return formatShipmentCalculation('NONSUBSCRIPTION_LE_3');\r\n } else {\r\n return formatShipmentCalculation('NONSUBSCRIPTION_G_3');\r\n }\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Only subscription items are in the cart\r\n//----------------------------------------------------------\r\nfunction orderSubscriptionBased(cartLength: number): IShipmentCalculationResult {\r\n if (cartLength <= 3) {\r\n return formatShipmentCalculation('SUBSCRIPTION_LE_3');\r\n } else if (cartLength <= 5) {\r\n return formatShipmentCalculation('SUBSCRIPTION_GE_4_LE_5');\r\n } else if (cartLength <= 11) {\r\n return formatShipmentCalculation('SUBSCRIPTION_GE_6_AND_LE_11');\r\n } else {\r\n return formatShipmentCalculation('SUBSCRIPTION_GE_12');\r\n }\r\n}\r\n\r\n//----------------------------------------------------------\r\n//----------------------------------------------------------\r\nfunction orderMixedBased(cartLength: number): IShipmentCalculationResult {\r\n\r\n // Start with the subscription cost\r\n const shipmentCalculationResult = orderSubscriptionBased(cartLength);\r\n\r\n // Increase the cost by a fixed amount\r\n shipmentCalculationResult.price += CartOrderPriceGuide.MIXED_ADD_PRICE;\r\n\r\n // Update the summary\r\n shipmentCalculationResult.summary = `MIXED_${shipmentCalculationResult.summary}`;\r\n\r\n return shipmentCalculationResult;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Returns a properly formatted IShipmentCalculationResult\r\n//----------------------------------------------------------\r\nfunction formatShipmentCalculation(shipCostDefinition: keyof typeof CartOrderPriceGuide): IShipmentCalculationResult {\r\n\r\n // Gift cards have a price of 0, so be careful on this check\r\n if (CartOrderPriceGuide[shipCostDefinition] !== undefined) {\r\n return {\r\n price: CartOrderPriceGuide[shipCostDefinition],\r\n summary: shipCostDefinition\r\n };\r\n }\r\n\r\n throw new Error(`Undefined shipping cost definition: ${shipCostDefinition}`);\r\n}","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport {\r\n IActionContext,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n Image,\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n CartLine,\r\n SalesLine\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { brandCodeParser } from '../Utilities/brand-code-parser';\r\nimport ProductType from '../Utilities/productType';\r\nimport { MasterProdDisplay } from './master-prod-display-name';\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs\r\n */\r\nexport interface ICartlineResourceString {\r\n /** Display string for discount label */\r\n discountStringText: string;\r\n /** String for size key */\r\n sizeString: string;\r\n /** String for color key */\r\n colorString: string;\r\n /** String associated with the configuration product dimension */\r\n configString: string;\r\n /** String for style key */\r\n styleString: string;\r\n /** Display string for quantity label */\r\n quantityDisplayString: string;\r\n /** Display string for quantity label */\r\n inputQuantityAriaLabel: string;\r\n}\r\n\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n product: SimpleProduct;\r\n}\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem\r\n */\r\nexport interface ICartLineProps extends IComponentProps {\r\n /** The flag to change the quantity component from interactible to static */\r\n disableQuantityInteractivity?: boolean;\r\n /** The primary image url */\r\n primaryImageUrl?: string;\r\n /** The product url */\r\n productUrl?: string;\r\n /** GridSettings for the product image in cartLine */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartLine */\r\n imageSettings: IImageSettings;\r\n /** Boolean flag to indicate if the item is out of stock */\r\n isOutOfStock?: boolean;\r\n /** Flag to make quantity section editable */\r\n isQuantityEditable?: boolean;\r\n /** Max quantity for line item */\r\n maxQuantity?: number;\r\n /** Current quantity for line item */\r\n currentQuantity?: number;\r\n /** Resource string for the component */\r\n resources: ICartlineResourceString;\r\n /** SalesLine flag */\r\n isSalesLine?: boolean;\r\n // Remove button coming from smwe-cartline\r\n // remove:string;\r\n remove?: React.ReactNode;\r\n /** Display images for on cart lines */\r\n showImages?: boolean;\r\n /** Has zero availability error? */\r\n zeroAvailabilityError?: boolean;\r\n cartState?: ICartState;\r\n cartLineErrors?: { [index: string]: boolean };\r\n /** Replaces discount code name with percent */\r\n showDiscountPercent?: boolean;\r\n /** Quantity onChange callback */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): void;\r\n cartLineOnChange?(ctx: IActionContext, cartState: ICartState | undefined, cartLine: CartLine): void;\r\n}\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nconst SmweCartLine: React.FC = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources, primaryImageUrl, showImages, gridSettings, imageSettings, zeroAvailabilityError } = props;\r\n const intlFormatter = props.context.cultureFormatter;\r\n const { product, cartLine } = props.data;\r\n const { inputQuantityAriaLabel } = props.resources;\r\n const _updateQuantity = (event: React.ChangeEvent) => {\r\n if (props.quantityOnChange) {\r\n props.quantityOnChange(\r\n props.data.cartLine,\r\n parseInt(event.target.value, 10)\r\n );\r\n }\r\n };\r\n\r\n const _generateMenu = (quantity: number) => {\r\n const nodes = [];\r\n\r\n for (let i = 1; i <= quantity; i++) {\r\n // tslint:disable-next-line:react-a11y-role-has-required-aria-props\r\n nodes.push(\r\n \r\n {i}\r\n \r\n );\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n const _generateSelectMenu = (\r\n quantity: number,\r\n currentQuantity: number | undefined\r\n ): JSX.Element => {\r\n const shouldDisableQty = props.data.product && props.data.product.ItemId?.toLowerCase() === props.context.request.channel?.GiftCardItemId?.toLowerCase();\r\n return (\r\n \r\n \r\n {_generateMenu(quantity)}\r\n \r\n {props.remove}\r\n \r\n );\r\n };\r\n\r\n const _generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n const priceAdjustmentSavings = _getPriceAdjustmentSavings();\r\n const productType = new ProductType();\r\n productType.check(cartLine.DeliveryMode, props.context);\r\n\r\n const isWineProduct = productType.isWineProduct();\r\n if (isWineProduct && props.isOutOfStock && !zeroAvailabilityError) {\r\n return null;\r\n }\r\n\r\n if (props.isQuantityEditable) {\r\n nodes.push(\r\n _generateSelectMenu(props.maxQuantity || 10, props.currentQuantity)\r\n );\r\n } else {\r\n nodes.push(\r\n
\r\n \r\n \r\n {props.data.cartLine.Quantity} {props.remove}\r\n \r\n
\r\n );\r\n }\r\n nodes.push(\r\n \r\n
\r\n {props.data.cartLine.Price !== undefined\r\n ? intlFormatter.formatCurrency(props.data.cartLine.Price)\r\n : ''}\r\n {_getPriceAdjustmentPercent()}\r\n
\r\n
{_getPriceDiscount()}
\r\n \r\n );\r\n nodes.push(\r\n \r\n
\r\n \r\n
\r\n {isSalesLine\r\n ? props.data.cartLine.Price &&\r\n intlFormatter.formatCurrency(props.data.cartLine.Price)\r\n : props.data.cartLine.NetPrice === 0 ? intlFormatter.formatCurrency(0)\r\n : props.data.cartLine.NetPrice &&\r\n intlFormatter.formatCurrency(props.data.cartLine.NetPrice)}\r\n
\r\n {(props.data.cartLine.DiscountAmountWithoutTax &&\r\n props.data.cartLine.DiscountAmountWithoutTax > 0) ||\r\n (priceAdjustmentSavings &&\r\n priceAdjustmentSavings > 0)\r\n ? `Savings ${intlFormatter.formatCurrency(\r\n (props.data.cartLine.DiscountAmountWithoutTax || 0) + _getPriceAdjustmentSavings()\r\n )}`\r\n : null}\r\n
\r\n
\r\n \r\n );\r\n return nodes;\r\n };\r\n\r\n const _getCartLineImage = (): JSX.Element | null => {\r\n if (showImages && primaryImageUrl) {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceAdjustmentPercent = (): JSX.Element | null => {\r\n if (props.data.product.Price && props.data.cartLine.Price && (props.data.cartLine.Price < props.data.product.Price)) {\r\n return {` (${(100 - ((props.data.cartLine.Price / props.data.product.Price) * 100)).toFixed(0)}% Off)`};\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceDiscount = (): string | null => {\r\n if (\r\n props.data.cartLine.DiscountAmountWithoutTax !== undefined &&\r\n props.data.cartLine.DiscountAmountWithoutTax !== 0 &&\r\n props.data.cartLine.Quantity &&\r\n props.data.cartLine.DiscountLines\r\n ) {\r\n if (props.showDiscountPercent && props.data.cartLine.NetPrice) {\r\n return `${((props.data.cartLine.DiscountAmountWithoutTax / props.data.cartLine.NetPrice) * 100).toFixed(0)}% off`;\r\n }\r\n return `${_doubleDiscounts()} ${props.data.cartLine.DiscountLines[0].DiscountCode}`;\r\n\r\n }\r\n return null;\r\n };\r\n\r\n enum GiftCardFieldType {\r\n Extension, Attribute\r\n }\r\n\r\n interface IGiftCardFields {\r\n Key: string;\r\n Type: GiftCardFieldType;\r\n StringValue: string;\r\n Required: boolean;\r\n isValid?: boolean;\r\n }\r\n\r\n interface IGiftCardFormObj {\r\n FirstName: IGiftCardFields;\r\n LastName: IGiftCardFields;\r\n ElectronicDeliveryEmail: IGiftCardFields;\r\n ElectronicDeliveryEmailContent: IGiftCardFields;\r\n }\r\n\r\n const giftCardFormObj: IGiftCardFormObj = {\r\n FirstName: {\r\n Key: 'FirstName',\r\n Type: GiftCardFieldType.Extension,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n LastName: {\r\n Key: 'LastName',\r\n Type: GiftCardFieldType.Extension,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n ElectronicDeliveryEmail: {\r\n Key: 'ElectronicDeliveryEmail',\r\n Type: GiftCardFieldType.Attribute,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n ElectronicDeliveryEmailContent: {\r\n Key: 'ElectronicDeliveryEmailContent',\r\n Type: GiftCardFieldType.Attribute,\r\n StringValue: '',\r\n Required: false\r\n },\r\n };\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n const _renderGiftCardPrompt = (): JSX.Element | null => {\r\n\r\n if (!props.data.cartLine.IsGiftCardLine) {\r\n return null;\r\n }\r\n\r\n const [giftCardFormField, setGiftCardFormField] = useState(giftCardFormObj);\r\n const [formFieldsDebounce, setFormFieldsDebounce] = useState('');\r\n\r\n const setFormFieldState = () => {\r\n const unhydratedCartLineLoad = { ...props.data.cartLine };\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Type === GiftCardFieldType.Extension) {\r\n unhydratedCartLineLoad.ExtensionProperties = unhydratedCartLineLoad.ExtensionProperties || [];\r\n const property = unhydratedCartLineLoad.ExtensionProperties.find((extension) => {\r\n return extension.Key?.toLowerCase() === fieldState.Key?.toLowerCase();\r\n });\r\n if (property) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [field]: {\r\n ...prevState[field],\r\n StringValue: property.Value?.StringValue\r\n }\r\n }));\r\n }\r\n } else if (fieldState.Type === GiftCardFieldType.Attribute) {\r\n const property = unhydratedCartLineLoad[fieldState.Key];\r\n if (property) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [fieldState.Key]: {\r\n ...prevState[fieldState.Key],\r\n StringValue: unhydratedCartLineLoad[fieldState.Key]\r\n }\r\n }));\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFormFieldToCartLine = () => {\r\n const unhydratedCartLineLoad = { ...props.data.cartLine };\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Type === GiftCardFieldType.Extension) {\r\n unhydratedCartLineLoad.ExtensionProperties = unhydratedCartLineLoad.ExtensionProperties || [];\r\n unhydratedCartLineLoad.ExtensionProperties.push({\r\n Key: fieldState.Key,\r\n Value: {\r\n StringValue: fieldState.StringValue\r\n }\r\n });\r\n } else if (fieldState.Type === GiftCardFieldType.Attribute) {\r\n unhydratedCartLineLoad[fieldState.Key] = giftCardFormField[fieldState.Key].StringValue;\r\n }\r\n });\r\n // Removing 'ItemTaxGroupId' from the object because now in new SSK its READONLY Attribute, can't be updated.\r\n delete (unhydratedCartLineLoad.ItemTaxGroupId);\r\n props.cartLineOnChange && props.cartLineOnChange(props.context.actionContext, props.cartState, unhydratedCartLineLoad);\r\n };\r\n\r\n const giftCardValidation = () => {\r\n let giftCardFormIsValid = true;\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Required) {\r\n if (fieldState.StringValue.trim() === '') {\r\n giftCardFormIsValid = false;\r\n fieldState.isValid = false;\r\n } else {\r\n fieldState.isValid = true;\r\n }\r\n\r\n if (fieldState.Key === 'ElectronicDeliveryEmail') {\r\n const validEmailRegex =\r\n RegExp(/^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i);\r\n if (!validEmailRegex.test(fieldState.StringValue)) {\r\n giftCardFormIsValid = false;\r\n fieldState.isValid = false;\r\n } else {\r\n fieldState.isValid = true;\r\n }\r\n }\r\n }\r\n });\r\n if (props.cartLineErrors) {\r\n if (giftCardFormIsValid) {\r\n props.cartLineErrors[props.data.cartLine.LineId!] = false;\r\n } else {\r\n props.cartLineErrors[props.data.cartLine.LineId!] = true;\r\n }\r\n }\r\n };\r\n\r\n // Setting the data from the cartline to State on load\r\n useEffect(() => {\r\n setFormFieldState();\r\n }, []);\r\n\r\n //Checking giftCard form validation\r\n useEffect(() => {\r\n giftCardValidation();\r\n }, [giftCardFormField]);\r\n\r\n // Updating formfield to cardLine\r\n useEffect(() => {\r\n const delayDebounceFn = setTimeout(() => {\r\n updateFormFieldToCartLine();\r\n }, 600);\r\n\r\n return () => clearTimeout(delayDebounceFn);\r\n }, [formFieldsDebounce]);\r\n\r\n const handleChange = (name: string) => (event: React.ChangeEvent) => {\r\n const value = event?.target.value;\r\n if (name) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [name]: {\r\n ...prevState[name],\r\n StringValue: value,\r\n },\r\n }));\r\n setFormFieldsDebounce(value);\r\n }\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n

IMPORTANT: Gift Cards are sent to the recipient email address the same day orders are placed. You can use your own e-mail address to keep it a surprise.

\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n };\r\n\r\n const _getCartLineComment = (): JSX.Element | null => {\r\n const productType = new ProductType();\r\n productType.check(cartLine.DeliveryMode, props.context);\r\n if (productType.isWineProduct() && props.data.cartLine.Comment) {\r\n return (\r\n
\r\n {props.data.cartLine.Comment}\r\n
);\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceAdjustmentSavings = (): number => {\r\n if (props.data.product.Price && props.data.cartLine.Price && props.data.cartLine.NetPrice) {\r\n const priceUnadjusted = (props.data.cartLine.NetPrice / (props.data.cartLine.Price / props.data.product.Price));\r\n return (priceUnadjusted - props.data.cartLine.NetPrice);\r\n } else {\r\n return 0;\r\n }\r\n };\r\n\r\n const _doubleDiscounts = (): string => {\r\n if (_getPriceAdjustmentPercent()) {\r\n return '+ ';\r\n } else {\r\n return '';\r\n }\r\n };\r\n\r\n const brandCode = brandCodeParser({ description: product.Description, appContext: props.context });\r\n\r\n let jsxName = {product.Name};\r\n if (product.MasterProductId) {\r\n jsxName = ;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n {_getCartLineImage()}\r\n
\r\n {brandCode &&\r\n
\r\n {brandCode}\r\n
\r\n }\r\n
\r\n {jsxName}\r\n
\r\n
\r\n
\r\n
\r\n \r\n {_generateQuantityAndPrice()}\r\n \r\n {_getCartLineComment()}\r\n {_renderGiftCardPrompt()}\r\n
\r\n
\r\n );\r\n};\r\n\r\n// @ts-ignore\r\nexport default SmweCartLine;\r\n","import { ICartState } from '@msdyn365-commerce/global-state';\r\nimport debounce from 'lodash/debounce';\r\nimport { observable, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { CartUtilities } from '../Utilities/cart-utils';\r\nimport { BusLoader, LoadBus } from '../Utilities/event-bus';\r\nimport { filterCartLines } from '../Utilities/subscription-manager';\r\n\r\ninterface IEditSelectComponentProps {\r\n currentQuantity: number;\r\n cartLineId?: string;\r\n isSubLine?: boolean;\r\n cart?: ICartState;\r\n zeroAvailabilityError?: boolean;\r\n shouldDisableQty?: boolean;\r\n _updateQuantityRaw(quantity: number): void;\r\n}\r\n\r\n/**\r\n * edit component\r\n */\r\n@LoadBus('elicit-amount-selector')\r\n@observer\r\nexport class ElicitAmountSelector extends React.Component {\r\n\r\n private bus: BusLoader | undefined;\r\n @observable private _trackedTotal: number | undefined;\r\n\r\n public constructor(constProps: IEditSelectComponentProps) {\r\n super(constProps);\r\n this._setQuantity = debounce(this._setQuantity.bind(this), 500);\r\n this._upQuantity = this._upQuantity.bind(this);\r\n this._downQuantity = this._downQuantity.bind(this);\r\n this._onQuantityChange = this._onQuantityChange.bind(this);\r\n this._postValidateQuantity = this._postValidateQuantity.bind(this);\r\n\r\n if (this.props.isSubLine) {\r\n this._trackedTotal = filterCartLines(this.props.cart?.cart).subscriptionLines.length;\r\n reaction(\r\n () => [this.props.cart, this.props.cart?.cart, this.props.cart?.cart.CartLines],\r\n () => {\r\n const unrelatedLines = filterCartLines(this.props.cart?.cart).subscriptionLines.filter(line => line.LineId !== this.props.cartLineId);\r\n this._trackedTotal = CartUtilities.countCartLineAmount(unrelatedLines);\r\n }\r\n );\r\n\r\n this.bus?.subscribe('added-locally', () => {\r\n this._trackedTotal!++;\r\n });\r\n\r\n this.bus?.subscribe('removed-locally', () => {\r\n this._trackedTotal!--;\r\n });\r\n\r\n this.bus?.subscribe('delta-change-local', (delta: number) => {\r\n this._trackedTotal! -= delta;\r\n });\r\n }\r\n\r\n this.state = { quantityState: this.props.currentQuantity };\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n
\r\n \r\n { /* tslint:disable-next-line: react-a11y-role-has-required-aria-props react-this-binding-issue */}\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n private get _canAddMore(): boolean {\r\n if (!this.props.isSubLine) { return true; }\r\n return this.state.quantityState + this._trackedTotal! < 12;\r\n }\r\n\r\n private _upQuantity(): void {\r\n this.setState({ quantityState: this.state.quantityState + 1 });\r\n this.props.isSubLine && this.bus?.publish('added-locally');\r\n this._setQuantity();\r\n }\r\n\r\n private _downQuantity(): void {\r\n if (this.state.quantityState - 1 < 1) { return; }\r\n this.setState({ quantityState: this.state.quantityState - 1 });\r\n this.props.isSubLine && this.bus?.publish('removed-locally');\r\n this._setQuantity();\r\n }\r\n\r\n private _onQuantityChange({ target }: React.ChangeEvent): void {\r\n this.setState({ quantityState: parseInt(target.value, 10) });\r\n }\r\n\r\n private _postValidateQuantity({ target }: React.ChangeEvent): void {\r\n if (this.props.isSubLine) {\r\n if ((this._trackedTotal! + parseInt(target.value, 10)) <= 12) {\r\n this.setState({ quantityState: parseInt(target.value, 10) });\r\n this.bus?.publish('delta-change-local', this._trackedTotal! - parseInt(target.value, 10));\r\n } else {\r\n this.setState({ quantityState: 1 });\r\n }\r\n } else {\r\n if (parseInt(target.value, 10) > 0) {\r\n this.setState({ quantityState: parseInt(target.value, 10) });\r\n } else {\r\n this.setState({ quantityState: 1 });\r\n }\r\n }\r\n this._setQuantity();\r\n }\r\n\r\n private _setQuantity(): void {\r\n this.props._updateQuantityRaw(this.state.quantityState);\r\n }\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport {\r\n IActionContext,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n Image,\r\n RichTextComponent\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n AttributeValue,\r\n CartLine,\r\n SalesLine\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { brandCodeParser } from '../Utilities/brand-code-parser';\r\nimport { isLineSubscriptionLine } from '../Utilities/subscription-manager';\r\nimport { ElicitAmountSelector } from './elicit-amountselector.component';\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs\r\n */\r\nexport interface ICartlineResourceString {\r\n /** Display string for discount label */\r\n discountStringText: string;\r\n /** String for size key */\r\n sizeString: string;\r\n /** String for color key */\r\n colorString: string;\r\n /** String associated with the configuration product dimension */\r\n configString: string;\r\n /** String for style key */\r\n styleString: string;\r\n /** Display string for quantity label */\r\n quantityDisplayString: string;\r\n /** Display string for quantity label */\r\n inputQuantityAriaLabel: string;\r\n}\r\n\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n product: SimpleProduct;\r\n}\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem\r\n */\r\nexport interface ICartLineProps extends IComponentProps {\r\n percentSaving: number;\r\n templateSavingText: string;\r\n templatePercentSavingText: string;\r\n /** The flag to change the quantity component from interactible to static */\r\n disableQuantityInteractivity?: boolean;\r\n /** The primary image url */\r\n primaryImageUrl?: string;\r\n /** The product url */\r\n productUrl?: string;\r\n /** GridSettings for the product image in cartLine */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartLine */\r\n imageSettings: IImageSettings;\r\n /** Boolean flag to indicate if the item is out of stock */\r\n isOutOfStock?: boolean;\r\n /** Flag to make quantity section editable */\r\n isQuantityEditable?: boolean;\r\n /** Max quantity for line item */\r\n maxQuantity?: number;\r\n /** Current quantity for line item */\r\n currentQuantity?: number;\r\n /** Resource string for the component */\r\n resources: ICartlineResourceString;\r\n /** SalesLine flag */\r\n isSalesLine?: boolean;\r\n // Remove button coming from smwe-cartline\r\n // remove:string;\r\n remove?: React.ReactNode;\r\n /** Display images for on cart lines */\r\n showImages?: boolean;\r\n /** Has zero availability error? */\r\n zeroAvailabilityError?: boolean;\r\n cartState?: ICartState;\r\n cartLineErrors?: { [index: string]: boolean };\r\n /** Replaces discount code name with percent */\r\n showDiscountPercent?: boolean;\r\n /** Attributes for product */\r\n productAttributes?: AttributeValue[];\r\n /** Quantity onChange callback */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): void;\r\n cartLineOnChange?(ctx: IActionContext, cartState: ICartState | undefined, cartLine: CartLine): void;\r\n}\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nconst SmweCartLine: React.FC = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources, primaryImageUrl, showImages, gridSettings, imageSettings, zeroAvailabilityError } = props;\r\n const intlFormatter = props.context.cultureFormatter;\r\n const { product } = props.data;\r\n\r\n const _updateQuantityRaw = (num: number) => {\r\n if (props.quantityOnChange) {\r\n props.quantityOnChange(\r\n props.data.cartLine,\r\n num || 10\r\n );\r\n }\r\n };\r\n\r\n const _generateSelectMenu = (\r\n quantity: number,\r\n currentQuantity: number | undefined\r\n ): JSX.Element => {\r\n const shouldDisableQty = props.data.product && props.data.product.ItemId?.toLowerCase() === props.context.request.channel?.GiftCardItemId?.toLowerCase();\r\n return (\r\n \r\n \r\n {props.remove}\r\n \r\n );\r\n };\r\n const _isWineProduct = (productId: string | undefined) => {\r\n return productId && /^\\d+$/.test(productId);\r\n };\r\n\r\n const _generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n const priceAdjustmentSavings = _getPriceAdjustmentSavings();\r\n // TODO: Temporary solution till we get better solution in checking product type in Cart\r\n const isWineProduct = _isWineProduct(product.ItemId);\r\n if (isWineProduct && props.isOutOfStock && !zeroAvailabilityError) {\r\n return null;\r\n }\r\n\r\n if (props.isQuantityEditable) {\r\n nodes.push(\r\n _generateSelectMenu(props.maxQuantity || 10, props.currentQuantity)\r\n );\r\n } else {\r\n nodes.push(\r\n \r\n \r\n \r\n {props.data.cartLine.Quantity} {props.remove}\r\n \r\n \r\n );\r\n }\r\n nodes.push(\r\n \r\n
\r\n {props.data.cartLine.Price !== undefined\r\n ? intlFormatter.formatCurrency(props.data.cartLine.Price * (1 - ((props.data.cartLine.DiscountAmountWithoutTax || 0) / (props.data.cartLine.NetPrice || 0))))\r\n : ''}\r\n {_getPriceAdjustmentPercent()}\r\n
\r\n
\r\n {_getPriceDiscount()}\r\n
\r\n \r\n );\r\n let price = props.data.cartLine.NetPrice! / props.percentSaving;\r\n if (!isFinite(price)) {\r\n price = 0;\r\n }\r\n nodes.push(\r\n \r\n
\r\n {isSalesLine\r\n ? props.data.cartLine.Price && intlFormatter.formatCurrency(props.data.cartLine.Price)\r\n : props.data.cartLine.TotalAmount === 0\r\n ? intlFormatter.formatCurrency(0)\r\n : props.data.cartLine.TotalAmount && intlFormatter.formatCurrency(props.data.cartLine.TotalAmount)\r\n }\r\n
\r\n
\r\n {(props.data.cartLine.DiscountAmountWithoutTax && props.data.cartLine.DiscountAmountWithoutTax > 0)\r\n || (priceAdjustmentSavings && priceAdjustmentSavings > 0)\r\n ? `${intlFormatter.formatCurrency((props.data.cartLine.DiscountAmountWithoutTax || 0) + _getPriceAdjustmentSavings())} savings`\r\n : null\r\n }\r\n
\r\n \r\n );\r\n return nodes;\r\n };\r\n\r\n const _getCartLineImage = (): JSX.Element | null => {\r\n if (showImages && primaryImageUrl) {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceAdjustmentPercent = (): JSX.Element | null => {\r\n if (props.data.product.Price && props.data.cartLine.Price && (props.data.cartLine.Price < props.data.product.Price)) {\r\n return {` (${((props.data.cartLine.Price / props.data.product.Price) * 100).toFixed(0)}% Off)`};\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceDiscount = (): string | null => {\r\n if (\r\n props.data.cartLine.DiscountAmountWithoutTax !== undefined &&\r\n props.data.cartLine.DiscountAmountWithoutTax !== 0 &&\r\n props.data.cartLine.Quantity &&\r\n props.data.cartLine.DiscountLines\r\n ) {\r\n if (props.showDiscountPercent && props.data.cartLine.NetPrice) {\r\n return `${((props.data.cartLine.DiscountAmountWithoutTax / props.data.cartLine.NetPrice) * 100).toFixed(0)}% off`;\r\n }\r\n return `${_doubleDiscounts()} ${props.data.cartLine.DiscountLines[0].DiscountCode}`;\r\n\r\n }\r\n return null;\r\n };\r\n\r\n enum GiftCardFieldType {\r\n Extension, Attribute\r\n }\r\n\r\n interface IGiftCardFields {\r\n Key: string;\r\n Type: GiftCardFieldType;\r\n StringValue: string;\r\n Required: boolean;\r\n isValid?: boolean;\r\n }\r\n\r\n interface IGiftCardFormObj {\r\n FirstName: IGiftCardFields;\r\n LastName: IGiftCardFields;\r\n ElectronicDeliveryEmail: IGiftCardFields;\r\n ElectronicDeliveryEmailContent: IGiftCardFields;\r\n }\r\n\r\n const giftCardFormObj: IGiftCardFormObj = {\r\n FirstName: {\r\n Key: 'FirstName',\r\n Type: GiftCardFieldType.Extension,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n LastName: {\r\n Key: 'LastName',\r\n Type: GiftCardFieldType.Extension,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n ElectronicDeliveryEmail: {\r\n Key: 'ElectronicDeliveryEmail',\r\n Type: GiftCardFieldType.Attribute,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n ElectronicDeliveryEmailContent: {\r\n Key: 'ElectronicDeliveryEmailContent',\r\n Type: GiftCardFieldType.Attribute,\r\n StringValue: '',\r\n Required: false\r\n },\r\n };\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n const _renderGiftCardPrompt = (): JSX.Element | null => {\r\n\r\n if (!props.data.cartLine.IsGiftCardLine) {\r\n return null;\r\n }\r\n\r\n const [giftCardFormField, setGiftCardFormField] = useState(giftCardFormObj);\r\n const [formFieldsDebounce, setFormFieldsDebounce] = useState('');\r\n\r\n const setFormFieldState = () => {\r\n const unhydratedCartLineLoad = { ...props.data.cartLine };\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Type === GiftCardFieldType.Extension) {\r\n unhydratedCartLineLoad.ExtensionProperties = unhydratedCartLineLoad.ExtensionProperties || [];\r\n const property = unhydratedCartLineLoad.ExtensionProperties.find((extension) => {\r\n return extension.Key?.toLowerCase() === fieldState.Key?.toLowerCase();\r\n });\r\n if (property) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [field]: {\r\n ...prevState[field],\r\n StringValue: property.Value?.StringValue\r\n }\r\n }));\r\n }\r\n } else if (fieldState.Type === GiftCardFieldType.Attribute) {\r\n const property = unhydratedCartLineLoad[fieldState.Key];\r\n if (property) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [fieldState.Key]: {\r\n ...prevState[fieldState.Key],\r\n StringValue: unhydratedCartLineLoad[fieldState.Key]\r\n }\r\n }));\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFormFieldToCartLine = () => {\r\n const unhydratedCartLineLoad = { ...props.data.cartLine };\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Type === GiftCardFieldType.Extension) {\r\n unhydratedCartLineLoad.ExtensionProperties = unhydratedCartLineLoad.ExtensionProperties || [];\r\n unhydratedCartLineLoad.ExtensionProperties.push({\r\n Key: fieldState.Key,\r\n Value: {\r\n StringValue: fieldState.StringValue\r\n }\r\n });\r\n } else if (fieldState.Type === GiftCardFieldType.Attribute) {\r\n unhydratedCartLineLoad[fieldState.Key] = giftCardFormField[fieldState.Key].StringValue;\r\n }\r\n });\r\n // Removing 'ItemTaxGroupId' from the object because now in new SSK its READONLY Attribute, can't be updated.\r\n delete (unhydratedCartLineLoad.ItemTaxGroupId);\r\n props.cartLineOnChange && props.cartLineOnChange(props.context.actionContext, props.cartState, unhydratedCartLineLoad);\r\n };\r\n\r\n const giftCardValidation = () => {\r\n let giftCardFormIsValid = true;\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Required) {\r\n if (fieldState.StringValue.trim() === '') {\r\n giftCardFormIsValid = false;\r\n fieldState.isValid = false;\r\n } else {\r\n fieldState.isValid = true;\r\n }\r\n\r\n if (fieldState.Key === 'ElectronicDeliveryEmail') {\r\n const validEmailRegex =\r\n RegExp(/^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i);\r\n if (!validEmailRegex.test(fieldState.StringValue)) {\r\n giftCardFormIsValid = false;\r\n fieldState.isValid = false;\r\n } else {\r\n fieldState.isValid = true;\r\n }\r\n }\r\n }\r\n });\r\n if (props.cartLineErrors) {\r\n if (giftCardFormIsValid) {\r\n props.cartLineErrors[props.data.cartLine.LineId!] = false;\r\n } else {\r\n props.cartLineErrors[props.data.cartLine.LineId!] = true;\r\n }\r\n }\r\n };\r\n\r\n // Setting the data from the cartline to State on load\r\n useEffect(() => {\r\n setFormFieldState();\r\n }, []);\r\n\r\n //Checking giftCard form validation\r\n useEffect(() => {\r\n giftCardValidation();\r\n }, [giftCardFormField]);\r\n\r\n // Updating formfield to cardLine\r\n useEffect(() => {\r\n const delayDebounceFn = setTimeout(() => {\r\n updateFormFieldToCartLine();\r\n }, 600);\r\n\r\n return () => clearTimeout(delayDebounceFn);\r\n }, [formFieldsDebounce]);\r\n\r\n const handleChange = (name: string) => (event: React.ChangeEvent) => {\r\n const value = event?.target.value;\r\n if (name) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [name]: {\r\n ...prevState[name],\r\n StringValue: value,\r\n },\r\n }));\r\n setFormFieldsDebounce(value);\r\n }\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n

IMPORTANT: Gift Cards are sent to the recipient email address the same day orders are placed. You can use your own e-mail address to keep it a surprise.

\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n };\r\n\r\n const _getCartLineComment = (): JSX.Element | null => {\r\n if (_isWineProduct(props.data.product.ItemId) && props.data.cartLine.Comment) {\r\n return (\r\n
\r\n {props.data.cartLine.Comment}\r\n
);\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceAdjustmentSavings = (): number => {\r\n if (props.data.product.Price && props.data.cartLine.Price && props.data.cartLine.NetPrice) {\r\n const priceUnadjusted = (props.data.cartLine.NetPrice / (props.data.cartLine.Price / props.data.product.Price));\r\n return (priceUnadjusted - props.data.cartLine.NetPrice);\r\n } else {\r\n return 0;\r\n }\r\n };\r\n\r\n const _doubleDiscounts = (): string => {\r\n if (_getPriceAdjustmentPercent()) {\r\n return '+ ';\r\n } else {\r\n return '';\r\n }\r\n };\r\n\r\n const _getKitDescription = (): JSX.Element | null => {\r\n if (props.productAttributes) {\r\n const productType = props.productAttributes.find(attribute => attribute.Name === 'Product Type');\r\n if (productType?.TextValue === 'Assembly') {\r\n const description = props.productAttributes.find(\r\n attribute => attribute.Name === 'Includes'\r\n )?.TextValue;\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const brandCode = brandCodeParser({ description: product.Description, appContext: props.context });\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {_getCartLineImage()}\r\n
\r\n {brandCode &&\r\n
\r\n {brandCode}\r\n
\r\n }\r\n
\r\n {product.Name}\r\n
\r\n {_getKitDescription()}\r\n
\r\n
\r\n \r\n {_generateQuantityAndPrice()}\r\n \r\n {_getCartLineComment()}\r\n {_renderGiftCardPrompt()}\r\n \r\n );\r\n};\r\n\r\n// @ts-ignore\r\nexport default SmweCartLine;\r\n","import React from 'react';\r\nimport { ICartLineProps } from './cartlineitem.component';\r\nimport { ICartLineProps as ICheckoutCartLineProps } from './cartlineitem-variant.component';\r\nimport { getSelectedVariant, SelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\n\r\ninterface IMasterProdDisplay {\r\n masterProdId: number,\r\n variantName: string,\r\n props: ICartLineProps | ICheckoutCartLineProps\r\n}\r\nexport class MasterProdDisplay extends React.Component {\r\n constructor(props: IMasterProdDisplay) {\r\n super(props);\r\n this.state = {\r\n prodName: ''\r\n };\r\n }\r\n public componentDidMount() {\r\n const masterProductInput = new SelectedVariantInput(this.props.masterProdId, this.props.props.context.request.apiSettings.channelId);\r\n getSelectedVariant(masterProductInput, this.props.props.context.actionContext).then(masterProduct => {\r\n this.setState({ prodName: masterProduct?.Name || '' });\r\n }).catch(e => console.error(e));\r\n }\r\n\r\n public render(): JSX.Element {\r\n let name = {this.props.variantName};\r\n if (this.state.prodName !== '') {\r\n name = {this.state.prodName} - {this.props.variantName};\r\n }\r\n return name;\r\n }\r\n}\r\n\r\nexport async function getMasterProduct(masterId: number, ctx: IActionContext): Promise {\r\n const masterProductInput = new SelectedVariantInput(masterId, ctx.requestContext.apiSettings.channelId);\r\n return getSelectedVariant(masterProductInput, ctx);\r\n}","// TODO: Need to find replacement for GetActiveCartInput retail actions in 2.0\r\n// import { getActiveCart, GetActiveCartInput } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n// TODO: may serve as replacement, need to test functionality\r\nimport { BaseCartState, getCartState, GlobalStateInput, ICartState } from '@msdyn365-commerce/global-state';\r\n\r\nimport { Modal, ModalBody, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport Button from 'reactstrap/lib/Button';\r\n\r\nexport interface IProductLightboxProps {\r\n id: string;\r\n width: number;\r\n height: number;\r\n productLightboxHref: string;\r\n iframeSrc?: string;\r\n buttonText?: string;\r\n lightboxClassName?: string;\r\n iframeClassName?: string;\r\n context: ICoreContext;\r\n}\r\n\r\nexport interface IProductAttributeProps {\r\n TextValue: string;\r\n Name: string;\r\n}\r\n\r\ninterface IProductLightboxData {\r\n isOpen: boolean;\r\n}\r\n\r\n/**\r\n * Lightbox Component\r\n */\r\nexport default class ProductLightbox extends React.PureComponent {\r\n public innerRef: React.RefObject;\r\n constructor(props: IProductLightboxProps) {\r\n super(props);\r\n this.state = { isOpen: false };\r\n this.innerRef=React.createRef();\r\n this._handleKeyDown=this._handleKeyDown.bind(this);\r\n }\r\n\r\n public componentDidMount(): undefined {\r\n window.addEventListener && window.addEventListener('message', this.onMessage);\r\n return;\r\n }\r\n\r\n private _handleKeyDown = (e: React.KeyboardEvent):void => {\r\n\r\n //Fetch node list from which required elements could be grabbed as needed.\r\n const focusable = document.getElementById('modal_parent');\r\n const elements = focusable?.querySelectorAll('button, [href], input, select, textarea, li, [tabindex]:not([tabindex=\"-1\"]), a') as NodeListOf;\r\n const firstFocusable = elements[0];\r\n const lastFocusable = elements[elements.length - 1];\r\n\r\n if (e.ctrlKey || e.altKey) {\r\n return;\r\n }\r\n firstFocusable.focus();\r\n\r\n const keys = {\r\n 9: () => { //9 = TAB\r\n if (e.shiftKey && e.target === firstFocusable) {\r\n lastFocusable.focus();\r\n }\r\n\r\n if (e.target === lastFocusable) {\r\n firstFocusable.focus();\r\n }\r\n }\r\n };\r\n\r\n if (keys[e.keyCode]) {\r\n keys[e.keyCode]();\r\n }\r\n };\r\n\r\n public render(): JSX.Element {\r\n const { lightboxClassName, iframeClassName } = this.props;\r\n // @ts-ignore\r\n const iframeSrcObj = (new URL(this.props.iframeSrc));\r\n const iframeId = `iframe-${this.props.id}`;\r\n return (\r\n
\r\n {this._launchLightboxButton(this.props.buttonText)}\r\n {(this.state.isOpen) &&\r\n {this.innerRef.current?.focus();}}\r\n id='modal_parent'\r\n >\r\n {/* eslint-disable react/no-unknown-property */}\r\n
)=>{this._handleKeyDown(e);}}>\r\n \r\n \r\n
\r\n {/* tslint:disable-next-line: react-iframe-missing-sandbox */}\r\n \r\n
\r\n
\r\n
\r\n \r\n }\r\n\r\n
\r\n );\r\n }\r\n\r\n private onMessage = async (e: MessageEvent) => {\r\n if (!e.isTrusted || e.origin !== window.origin) {\r\n return;\r\n }\r\n // @ts-ignore\r\n const iframeSrcObj = (new URL(this.props.iframeSrc));\r\n\r\n // TODO: Need to find replacement for GetActiveCartInput retail actions in 2.0\r\n // if (e.data.url === iframeSrcObj.href) {\r\n // setTimeout(async () => {\r\n // const context = this.props.context;\r\n // const cartInput = new GetActiveCartInput(context.request.apiSettings, true);\r\n // const newCart = await getActiveCart(cartInput, context.actionContext);\r\n // context.actionContext.update(cartInput, newCart);\r\n // }, 10);\r\n // }\r\n\r\n // TODO: may work as replacement, need to test\r\n if (e.data.url === iframeSrcObj.href) {\r\n setTimeout(async () => {\r\n const context = this.props.context;\r\n const cartInput = new GlobalStateInput('CARTSTATE', BaseCartState, context.actionContext.requestContext.apiSettings);\r\n const newCart = await getCartState(context.actionContext);\r\n context.actionContext.update(cartInput, newCart);\r\n await newCart.refreshCart({});\r\n }, 10);\r\n }\r\n };\r\n\r\n private _launchLightboxButton(buttonText: string | undefined): JSX.Element | null {\r\n return ();\r\n }\r\n\r\n private _divTabIndexChange=()=>{\r\n const divElement=document.getElementsByTagName('div');\r\n for(var i=0; i {\r\n this.setState(prevState => ({\r\n isOpen: !prevState.isOpen\r\n }));\r\n const quickView: HTMLElement | null = document.getElementById(this.props.id);\r\n quickView!.focus();\r\n };\r\n private _openModal = () => {\r\n this.setState(prevState => ({\r\n isOpen: !prevState.isOpen\r\n }), ()=>{this._divTabIndexChange();});\r\n };\r\n}","import { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce, RichTextComponent } from '@msdyn365-commerce/core';\r\nimport { ICartState, ICheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, AttributeValue, ProductAvailableQuantity, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\nimport AcclaimRatingsDisplay from '../modules/acclaim-ratings/acclaim-ratings-display';\r\nimport { ISmweProductCollectionProps } from '../modules/smwe-product-collection/smwe-product-collection.props.autogenerated';\r\nimport { ISmweSearchResultContainerProps } from '../modules/smwe-search-result-container/smwe-search-result-container.props.autogenerated';\r\nimport { CartUtilities } from '../Utilities/cart-utils';\r\nimport { BusLoader, LoadBus } from '../Utilities/event-bus';\r\nimport ProductLightbox, { IProductLightboxProps } from '../Utilities/product-lightbox';\r\nimport { filterCartLines } from '../Utilities/subscription-manager';\r\n\r\nexport interface ISmweSearchResultContainerParentProps extends ISmweSearchResultContainerProps<{}> {\r\n categoryHierarchy: CategoryHierarchy | undefined;\r\n}\r\n\r\nexport interface ISmweProductCollectionParentProps extends ISmweProductCollectionProps<{}> {\r\n categoryHierarchy: undefined;\r\n}\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n checkoutState?: AsyncResult;\r\n cart?: AsyncResult;\r\n displayQuantitySlider?: boolean;\r\n disableQuantitySlider?: boolean;\r\n maxAdditionLimit?: number;\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n subscriptionBtnText?: string;\r\n parentProps: ISmweSearchResultContainerParentProps | ISmweProductCollectionParentProps;\r\n addToCart?: boolean;\r\n addToCartText?: string;\r\n giftCardText?: string;\r\n addToCartMessage?: string;\r\n showPrice?: boolean;\r\n availability?: ProductAvailableQuantity | undefined;\r\n clubPrice?: ProductPrice | undefined;\r\n showQuantityAsDropdown?: boolean;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent { }\r\n\r\nconst PriceComponentActions = {\r\n};\r\nlet qtyAddedToCart: number = 0;\r\n\r\n// tslint:disable-next-line:cyclomatic-complexity\r\nconst ProductCard: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n typeName,\r\n id,\r\n parentProps,\r\n checkoutState,\r\n subscriptionBtnText,\r\n displayQuantitySlider,\r\n showPrice\r\n}) => {\r\n const {\r\n showStarRating,\r\n launchLightboxButtonText,\r\n productLightboxHref,\r\n productLightboxWidth,\r\n productLightboxHeight,\r\n productLightboxClassName,\r\n productLightboxIframeClassName,\r\n cardBanner\r\n } = parentProps.config;\r\n const product = data.product;\r\n const recordId = product?.RecordId;\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n const productLightboxProps: IProductLightboxProps = {\r\n id: '',\r\n buttonText: launchLightboxButtonText,\r\n productLightboxHref: productLightboxHref,\r\n width: productLightboxWidth,\r\n height: productLightboxHeight,\r\n lightboxClassName: productLightboxClassName,\r\n iframeClassName: productLightboxIframeClassName,\r\n context: parentProps.context\r\n };\r\n\r\n if (productLightboxProps) {\r\n productLightboxProps.id = `product-placement-${recordId}`;\r\n const domainUrl = _getEndpoint(context && context.request.url.requestUrl.toString());\r\n if (productLightboxProps.productLightboxHref && productLightboxProps.productLightboxHref.indexOf('?') >= 0) {\r\n productLightboxProps.iframeSrc = `${domainUrl}${productLightboxProps.productLightboxHref}&productId=${recordId}`;\r\n } else {\r\n productLightboxProps.iframeSrc = `${domainUrl}${productLightboxProps.productLightboxHref}?productId=${recordId}`;\r\n }\r\n }\r\n\r\n let tastingNotes: AttributeValue | undefined;\r\n let appellation: AttributeValue | undefined;\r\n let banner: AttributeValue | undefined;\r\n let productType: AttributeValue | undefined;\r\n if (product.AttributeValues) {\r\n product.AttributeValues.forEach(attribute => {\r\n switch (attribute.Name) {\r\n case 'Tasting Notes':\r\n tastingNotes = attribute;\r\n break;\r\n case 'SLR Appellation':\r\n appellation = attribute;\r\n break;\r\n case 'Appellation':\r\n appellation = attribute;\r\n break;\r\n case cardBanner:\r\n banner = attribute;\r\n break;\r\n case 'Product Type':\r\n productType = attribute;\r\n break;\r\n default:\r\n }\r\n });\r\n }\r\n const ariaLabel = `${(appellation && appellation.TextValue) ? appellation.TextValue : ''} ${product.Name ? product.Name : ''} product page`;\r\n const imageProductClass = productType && productType.TextValue ? `product-type-${productType.TextValue.replace(/\\s+/g, '-').toLowerCase()}` : '';\r\n const productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, context && context.actionContext, parentProps.categoryHierarchy);\r\n const isGiftCard = product.ItemId?.toLowerCase() === 'giftcard';\r\n let imageUrl = product.PrimaryImageUrl;\r\n if (isGiftCard && parentProps.app.config.giftCardImage) {\r\n imageUrl = parentProps.app.config.giftCardImage;\r\n }\r\n return (\r\n <>\r\n \r\n
\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, imageUrl, product.Name)}\r\n
\r\n {banner && renderAttribute(banner, 'product-details-banner')}\r\n \r\n
\r\n {renderAttribute(appellation, 'product-attribute appellation')}\r\n

{product.Name}

\r\n
\r\n {renderAttribute(tastingNotes, 'product-attribute description')}\r\n {showPrice && !displayQuantitySlider && product.Price && renderPrice(product.Price)}\r\n {recordId && renderAcclaim(recordId)}\r\n {showStarRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n
\r\n
\r\n
\r\n {renderProductLightboxButton(productLightboxProps)}\r\n \r\n );\r\n};\r\n\r\nfunction renderRating(context: ICoreContext, typeName: string, id: string, avgRating?: number, totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numRatings = totalRatings && totalRatings.toString() || undefined;\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, altText?: string): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings\r\n };\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderAttribute(attribute: AttributeValue | undefined, className: string | ''): JSX.Element | null {\r\n return (\r\n
\r\n {attribute && }\r\n
\r\n );\r\n}\r\n\r\n// Render acclaim ratings if any\r\n// @FIXME/dg: Hardcoding the count and date/reviewer settings is bad!\r\nfunction renderAcclaim(recordId: number): JSX.Element | null {\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderPrice(price: number, className?: string, clubPrice?: number): JSX.Element | null {\r\n return (\r\n
\r\n Regular Price ${price.toFixed(2).replace(/\\.00$/,'')} Club Price ${clubPrice?.toFixed(2).replace(/\\.00$/,'')}\r\n \r\n {clubPrice && }\r\n
\r\n );\r\n}\r\n\r\nfunction _getEndpoint(url: string | undefined): string | null {\r\n if (url) {\r\n const urlParts = url.split('/');\r\n return url.indexOf('//') > -1 ? `${urlParts[0]}//${urlParts[2]}` : urlParts[0];\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction renderProductLightboxButton(productLightboxProps: IProductLightboxProps | undefined): JSX.Element | null {\r\n if (!productLightboxProps) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n// @ts-ignore\r\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\ninterface IProductComponentWrapperData {\r\n quantity: number;\r\n disable: boolean;\r\n cartMessage: string;\r\n}\r\n\r\n/**\r\n * class definition containing product component for\r\n * add to cart state\r\n */\r\n@LoadBus('product-component-wrapper')\r\nclass ProductComponentWrapper extends React.Component {\r\n\r\n private bus: BusLoader | undefined;\r\n private addToCartSubId: number;\r\n private finishAddToCartSubId: number;\r\n\r\n constructor(props: IProductComponentProps) {\r\n super(props);\r\n this.state = {\r\n quantity: 1,\r\n disable: false,\r\n cartMessage: ''\r\n };\r\n this._decreaseCartQuantity = this._decreaseCartQuantity.bind(this);\r\n this._increaseCartQuantity = this._increaseCartQuantity.bind(this);\r\n this._onQuantityChange = this._onQuantityChange.bind(this);\r\n this._onClickAddToCart = this._onClickAddToCart.bind(this);\r\n this._onClickAddToSubscription = this._onClickAddToSubscription.bind(this);\r\n\r\n this.addToCartSubId = this.bus?.subscribe('adding-to-cart', () => { this.setState({ disable: true }); }).id!;\r\n this.finishAddToCartSubId = this.bus?.subscribe('finished-adding-to-cart', () => { this.setState({ disable: false }); }).id!;\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n this.bus?.unsubscribe(this.addToCartSubId);\r\n this.bus?.unsubscribe(this.finishAddToCartSubId);\r\n }\r\n\r\n // tslint:disable-next-line:cyclomatic-complexity\r\n public render(): JSX.Element | null {\r\n if (this.props.data.product && this.props.data.product.RecordId && this.props.displayQuantitySlider) {\r\n const attributes: AttributeValue[] | undefined = this.props.data.product.AttributeValues;\r\n const productType: AttributeValue | undefined = attributes?.find(attribute => attribute.Name === 'Product Type');\r\n const bottleSize: AttributeValue | undefined = attributes?.find(attribute => attribute.Name === 'Wine Bottle Size');\r\n const imageProductClass = productType?.TextValue ? `product-type-${productType.TextValue.replace(/\\s+/g, '-').toLowerCase()}` : '';\r\n const { subscriptionBtnText } = this.props;\r\n const outOfStock = this.props.availability?.AvailableQuantity === undefined || this.props.availability?.AvailableQuantity > this.props.context.app.config.outOfStockThreshold ? false : true;\r\n const availability = this.props.availability?.AvailableQuantity && this.props.availability.AvailableQuantity - this.props.context.app.config.outOfStockThreshold;\r\n const productUrl = getProductPageUrlSync(this.props.data.product.Name || '', this.props.data.product.RecordId, this.props.context && this.props.context.actionContext, this.props.parentProps.categoryHierarchy);\r\n const showQuantityAsDropdown:boolean = this.props.showQuantityAsDropdown || false;\r\n const maxQuantity: number | undefined = availability || 10;\r\n const quantityControl = this._generateQuantityControl(this.props.data.product.RecordId, maxQuantity, this.state.quantity, showQuantityAsDropdown);\r\n\r\n if (this.props.giftCardText && bottleSize && bottleSize.TextValue === 'Gift Card') {\r\n return (\r\n \r\n \r\n
\r\n \r\n {this.props.giftCardText}\r\n \r\n
\r\n
\r\n );\r\n }\r\n return (\r\n \r\n \r\n
\r\n {this.props.data.product.Price && renderPrice(this.props.data.product.Price, 'product-component-wrapper-price', this.props.clubPrice?.CustomerContextualPrice)}\r\n \r\n {this.props.addToCart && this.props.addToCartText && (\r\n
\r\n \r\n {outOfStock ? 'Out of stock' : this.props.addToCartText}\r\n \r\n \r\n
\r\n )\r\n }\r\n {\r\n this.props.checkoutState && subscriptionBtnText && (\r\n
\r\n \r\n {outOfStock ? 'Out of stock' : subscriptionBtnText}\r\n \r\n \r\n
\r\n )\r\n }\r\n
\r\n
\r\n );\r\n } else {\r\n return ;\r\n }\r\n }\r\n\r\n private _generateMenu = (quantity: number | undefined) => {\r\n const nodes = [];\r\n\r\n if (quantity !== undefined) {\r\n for (let i = 1; i <= quantity; i++) {\r\n // tslint:disable-next-line:react-a11y-role-has-required-aria-props\r\n nodes.push();\r\n }\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n private _generateQuantityControl = (productId: number | undefined, maxQuantity: number | undefined, currentQuantity: number, showAsDropdown:boolean = false): JSX.Element => {\r\n if (showAsDropdown && productId !== undefined) {\r\n return ();\r\n } else {\r\n return (\r\n /* tslint:disable-next-line: react-a11y-role-has-required-aria-props react-this-binding-issue */\r\n \r\n );\r\n }\r\n };\r\n\r\n private async _onClickAddToCart(): Promise {\r\n const { data: { product }, context } = this.props;\r\n const cartQty = (this.props.cart?.result?.cart.TotalItems || 0) + this.state.quantity;\r\n qtyAddedToCart = this.state.quantity;\r\n\r\n this.bus?.publish('adding-to-cart');\r\n await onAddToCartAction(context, product!.RecordId, this.state.quantity);\r\n this.bus?.publish('finished-adding-to-cart');\r\n\r\n // Mixed Cart Bandaid - Remove when no longer needed\r\n // Checking if cart contains a gift card. Because gift cards are not added in the PLP, no need to check for the\r\n // other way around. If that changes, mixed cart check needs to be rewritten.\r\n\r\n /* Start Mixed Cart Bandaid */\r\n const mixedCart = !!this.props.cart?.result?.cart?.CartLines?.find(\r\n item => item.IsGiftCardLine ||\r\n item.DeliveryMode === \"40.5\" // 40.5 responds to events i believe, so use it here\r\n );\r\n /* End Mixed Cart Bandaid */\r\n if (cartQty === this.props.cart?.result?.cart.TotalItems) {\r\n this.setState({ cartMessage: 'success' });\r\n setTimeout(() => { this.setState({ cartMessage: '', quantity: 1 }); }, 2000);\r\n /* Start Mixed Cart Bandaid */\r\n } else if (mixedCart) {\r\n this.setState({ cartMessage: 'mixedcart' });\r\n /* End Mixed Cart Bandaid */\r\n } else {\r\n this.setState({ cartMessage: 'error' });\r\n }\r\n }\r\n\r\n private async _onClickAddToSubscription(): Promise {\r\n const { data: { product }, context } = this.props;\r\n const cartQty = (this.props.cart?.result?.cart.TotalItems || 0) + this.state.quantity;\r\n qtyAddedToCart = this.state.quantity;\r\n\r\n this.bus?.publish('adding-to-cart');\r\n await onSubscribeAction(context, product!.RecordId, this.state.quantity, this.props.cart);\r\n this.bus?.publish('finished-adding-to-cart');\r\n\r\n // Mixed Cart Bandaid - Remove when no longer needed\r\n // Checking if cart contains a gift card. Because gift cards are not added in the PLP, no need to check for the\r\n // other way around. If that changes, mixed cart check needs to be rewritten.\r\n\r\n /* Start Mixed Cart Bandaid */\r\n const mixedCart = !!this.props.cart?.result?.cart?.CartLines?.find(\r\n item => item.IsGiftCardLine ||\r\n item.DeliveryMode === \"40.5\" // 40.5 responds to events i believe, so use it here\r\n );\r\n /* End Mixed Cart Bandaid */\r\n\r\n if (cartQty === this.props.cart?.result?.cart.TotalItems) {\r\n this.setState({ cartMessage: 'success' });\r\n setTimeout(() => { this.setState({ cartMessage: '', quantity: 1 }); }, 2000);\r\n /* Start Mixed Cart Bandaid */\r\n } else if (mixedCart) {\r\n this.setState({ cartMessage: 'mixedCart' });\r\n /* End Mixed Cart Bandaid */\r\n } else {\r\n this.setState({ cartMessage: 'error' });\r\n }\r\n }\r\n\r\n private _increaseCartQuantity(): void {\r\n this.setState({ quantity: this.state.quantity + 1 });\r\n }\r\n\r\n private _decreaseCartQuantity(): void {\r\n this.setState({ quantity: this.state.quantity > 1 ? this.state.quantity - 1 : this.state.quantity });\r\n }\r\n\r\n private _onQuantityChange({ target }: React.ChangeEvent | React.ChangeEvent): void {\r\n if (parseInt(target.value, 10) < 1) {\r\n this.setState({ quantity: 1 });\r\n } else {\r\n this.setState({ quantity: parseInt(target.value, 10) });\r\n }\r\n }\r\n\r\n private get _isAdditionInvalid(): boolean {\r\n const cartQuantity = CartUtilities.countCartLineAmount(filterCartLines(this.props.cart?.result?.cart).subscriptionLines);\r\n return (this.state.quantity + cartQuantity) > (this.props.maxAdditionLimit || 12);\r\n }\r\n}\r\n\r\nasync function onAddToCartAction(context: ICoreContext, recordId: number, amount: number | undefined): Promise {\r\n\r\n return CartUtilities.elicitAddItemIdToCart({ recordId, amount, context });\r\n}\r\n\r\nasync function onSubscribeAction(context: ICoreContext, recordId: number, amount?: number, cart?: AsyncResult): Promise {\r\n // fetch attribute list and simple product\r\n\r\n return CartUtilities.elicitAddSubscriptionItemIdToCart({ context, recordId, amount }, cart!);\r\n}\r\n\r\nexport default ProductComponentWrapper;","import { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\n\r\nexport interface IElicitPickUpInStoreViewProps {\r\n callbacks: {\r\n toggleBopis(isBopisSelected: boolean): void;\r\n };\r\n defaultComponent?: React.ReactNode;\r\n orgUnitName?: string;\r\n isBopisSelected: boolean;\r\n ContainerProps: INodeProps;\r\n}\r\n\r\nexport interface IElicitPickUpInStoreProps {\r\n cartline: CartLine;\r\n product: SimpleProduct;\r\n shipitText: string;\r\n pickUpInStoreText: string;\r\n changeStoreText: string;\r\n cartState: ICartState | undefined;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n orgUnitLocations?: OrgUnitLocation[] | undefined;\r\n deliveryOptions?: ProductDeliveryOptions;\r\n pickupDeliveryModeCode?: string;\r\n}\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nexport const PickUpInStore = (props: IElicitPickUpInStoreProps): IElicitPickUpInStoreViewProps | undefined => {\r\n const _onLocationChangedCallback = (orgUnitLocation: OrgUnitLocation, cartState: ICartState | undefined, cartline: CartLine) => {\r\n if(!cartState) {\r\n return Promise.resolve();\r\n }\r\n return cartState.updateCartLinePickupLocation({cartLineId: cartline.LineId!, location: orgUnitLocation})\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // do something\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n };\r\n\r\n const _toggleBOPIS = (isBopisSelected: boolean) => {\r\n const { storeSelectorStateManager, product, cartline, cartState } = props;\r\n\r\n if(isBopisSelected) {\r\n if(!storeSelectorStateManager) {\r\n return;\r\n }\r\n storeSelectorStateManager.openDialog({\r\n product,\r\n alreadySelectedLocation: {\r\n InventoryLocationId: cartline.FulfillmentStoreId\r\n },\r\n onLocationSelected: (orgUnitLocation) => {\r\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline);\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n } else {\r\n if(!cartState) {\r\n return;\r\n }\r\n cartline.DeliveryMode = '';\r\n cartline.FulfillmentStoreId = '';\r\n cartline.ShippingAddress = {};\r\n cartState.clearCartLinePickupLocation({cartLineId: cartline.LineId!})\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // do something\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n }\r\n };\r\n\r\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if(!orgUnitLocations || !fulfillmentStoreId || !(orgUnitLocations.length > 0)) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.InventoryLocationId === fulfillmentStoreId;\r\n });\r\n\r\n if(foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n } else {\r\n return fulfillmentStoreId;\r\n }\r\n };\r\n\r\n const _renderShippingMethod = (\r\n cartLine: CartLine,\r\n shipItText: string,\r\n pickupInStoretext: string,\r\n changeStoreText:string,\r\n orgUnitLocations: OrgUnitLocation[] | undefined):JSX.Element => {\r\n\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\r\n const bopisSelected = cartLine.FulfillmentStoreId ? true : false;\r\n\r\n return (\r\n // tslint:disable:react-this-binding-issue react-a11y-role-has-required-aria-props jsx-no-lambda\r\n <>\r\n \r\n \r\n {\r\n cartLine.FulfillmentStoreId ? (\r\n
\r\n {orgUnitName}\r\n \r\n
\r\n ) : null\r\n }\r\n \r\n );\r\n };\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (!props.deliveryOptions ||\r\n !props.deliveryOptions.DeliveryOptions ||\r\n !props.pickupDeliveryModeCode ||\r\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n callbacks: {\r\n toggleBopis: _toggleBOPIS\r\n },\r\n defaultComponent: _renderShippingMethod(props.cartline, props.shipitText, props.pickUpInStoreText, props.changeStoreText, props.orgUnitLocations),\r\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\r\n isBopisSelected: props.cartline.FulfillmentStoreId ? true : false,\r\n ContainerProps: {\r\n className: 'msc-cart-line__bopis-container'\r\n }\r\n };\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, format } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n AddToWishlistComponent,\r\n ICartlineResourceString,\r\n IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport {\r\n IActionContext,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageSettings,\r\n ITelemetry\r\n} from '@msdyn365-commerce/core';\r\nimport { BaseCartState, getCartState,GlobalStateInput, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n AttributeValue,\r\n CartLine,\r\n CommerceList,\r\n OrgUnitLocation,\r\n ProductAvailableQuantity,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport SmweCartLine from '../../../components/elicit-cartlineitem.component';\r\nimport ProductType from '../../../Utilities/productType';\r\nimport {\r\n IElicitPickUpInStoreViewProps,\r\n PickUpInStore\r\n} from './elicit-cart-pick-up-in-store';\r\n\r\nexport interface IElicitCartLineItemsProps {\r\n percentSaving: number;\r\n templateSavingText?: string;\r\n templatePercentSavingText?: string;\r\n cartlines: CartLine[];\r\n mixedCart: {[index:string]: boolean};\r\n mixedCartLines: CartLine[];\r\n cartLineErrors: {[index:string]: boolean};\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: ProductAvailableQuantity[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n /** GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n outOfStockThreshold: number;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n showImages: boolean | undefined;\r\n invalidProductError: string;\r\n outOfStockError: string;\r\n zeroAvailabilityError: string;\r\n showDiscountPercent?: boolean;\r\n productAttributesList?: { [key: number]: AttributeValue[] };\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(\r\n result: IWishlistActionSuccessResult,\r\n cartlineId: CartLine\r\n ): void;\r\n updateCartLinesQuantitySuccessHandler(\r\n cartline: CartLine,\r\n quantity: number\r\n ): void;\r\n}\r\n\r\nexport interface IElicitCartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IElicitPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n}\r\n\r\nconst _getProduct = (\r\n productId: number | undefined,\r\n products: SimpleProduct[]\r\n): SimpleProduct | undefined => {\r\n if (productId !== undefined && products) {\r\n return products.find(product => {\r\n return productId === product.RecordId;\r\n });\r\n }\r\n return undefined;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n outOfStockThreshold: number,\r\n maxCartlineQuantity: number,\r\n isStockCheckEnabled: boolean,\r\n cartLines: CartLine[],\r\n currentQuantity: number,\r\n productId: number | undefined,\r\n productAvailability?: ProductAvailableQuantity\r\n) => {\r\n if (isStockCheckEnabled) {\r\n if (\r\n !productAvailability ||\r\n !productAvailability.AvailableQuantity ||\r\n productAvailability.AvailableQuantity <= 0\r\n ) {\r\n return 0;\r\n }\r\n let productInCartQty = 0;\r\n const productInCart = cartLines.filter(cartline => {\r\n return cartline.ProductId === productId;\r\n });\r\n if (productInCart && productInCart.length) {\r\n productInCart.forEach(line => {\r\n productInCartQty = productInCartQty + line.Quantity!;\r\n });\r\n productInCartQty = productInCartQty - currentQuantity;\r\n if (productInCartQty >= (productAvailability.AvailableQuantity)) {\r\n return currentQuantity;\r\n }\r\n }\r\n return productAvailability.AvailableQuantity - productInCartQty;\r\n }\r\n\r\n return maxCartlineQuantity;\r\n};\r\n\r\nconst _updateCartLine = (ctx: IActionContext, cartState: ICartState, cartLine: CartLine): void => {\r\n if (ctx && cartState) {\r\n updateCartLinesAsync({ callerContext: ctx }, cartState.cart.Id, [cartLine])\r\n .then(cart => {\r\n const cartInput = new GlobalStateInput(\r\n 'CARTSTATE',\r\n BaseCartState,\r\n ctx.requestContext.apiSettings);\r\n getCartState(ctx)\r\n .then(newCart => {\r\n ctx.update(cartInput, newCart);\r\n // tslint:disable-next-line: no-floating-promises\r\n void newCart.refreshCart({});\r\n })\r\n .catch((e) => ctx.telemetry.exception(e));\r\n })\r\n .catch((e) => ctx.telemetry.exception(e));\r\n }\r\n};\r\n\r\n// tslint:disable:max-func-body-length\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: IElicitCartLineItemsProps,\r\n index: number,\r\n zeroAvailabilityError: boolean,\r\n cartState: ICartState | undefined,\r\n foundProductAvailability?: ProductAvailableQuantity,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions,\r\n): IElicitCartlinesViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n moveToWishlistSuccessHandler,\r\n addToWishlistButtonText,\r\n removeFromWishlistButtonText,\r\n wishlists,\r\n defaultWishlistName,\r\n cartLineErrors,\r\n showDiscountPercent\r\n } = props;\r\n\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.outOfStockThreshold,\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n props.mixedCartLines,\r\n cartline.Quantity || 0,\r\n product.RecordId,\r\n foundProductAvailability\r\n );\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist =\r\n wishlists && wishlists.length > 0 && wishlists[0].Name\r\n ? wishlists[0].Name\r\n : defaultWishlistName;\r\n\r\n const onRemoveClickHandler = (event: React.MouseEvent) => {\r\n removeItemClickHandler(cartline);\r\n };\r\n\r\n return {\r\n cartline: (\r\n \r\n }\r\n showImages={props.showImages}\r\n zeroAvailabilityError={zeroAvailabilityError}\r\n cartLineOnChange={_updateCartLine}\r\n cartState={cartState}\r\n cartLineErrors={cartLineErrors}\r\n showDiscountPercent={showDiscountPercent}\r\n productAttributes={props.productAttributesList && props.productAttributesList[product.RecordId]}\r\n />\r\n ),\r\n pickUpInStore: PickUpInStore({\r\n cartState: props.cartState,\r\n cartline: cartline,\r\n product: product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: foundProductDeliveryOptions,\r\n pickupDeliveryModeCode: props.pickupDeliveryModeCode\r\n }),\r\n remove: (\r\n \r\n {removeButtonText}\r\n \r\n ),\r\n addToWishlist: isAuthenticated ? (\r\n \r\n ) : (\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nexport const _assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: IElicitCartLineItemsProps,\r\n cartState: ICartState | undefined\r\n): IElicitCartlinesViewProps[] | null => {\r\n const reactNodes: IElicitCartlinesViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n return null;\r\n }\r\n\r\n const productTypeInit = new ProductType();\r\n\r\n cartlines.map(cartLine => {\r\n productTypeInit.check(cartLine?.DeliveryMode, props.context);\r\n });\r\n props.mixedCart.isMixedCart = productTypeInit.isMixedProduct();\r\n\r\n cartlines.map((cartline, index) => {\r\n const product = _getProduct(cartline.ProductId, products);\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find(\r\n productAvailability => {\r\n return productAvailability.ProductId! === cartline.ProductId;\r\n }\r\n );\r\n }\r\n let foundProductDeliveryOption;\r\n if (\r\n props.productDeliveryOptions &&\r\n props.productDeliveryOptions.length > 0\r\n ) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find(\r\n deliveryOption => {\r\n return (\r\n deliveryOption && deliveryOption.ProductId === cartline.ProductId\r\n );\r\n }\r\n );\r\n }\r\n\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.outOfStockThreshold,\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n props.mixedCartLines,\r\n cartline.Quantity || 0,\r\n product?.RecordId,\r\n foundProductAvailability\r\n );\r\n\r\n let zeroAvailabilityError: boolean = false;\r\n const productType = new ProductType();\r\n productType.check(cartline?.DeliveryMode, props.context);\r\n if (productType.isWineProduct() && (cartline.Quantity) && foundProductAvailability && foundProductAvailability.AvailableQuantity && foundProductAvailability.AvailableQuantity <= props.outOfStockThreshold) {\r\n cartline.Comment = props.zeroAvailabilityError;\r\n props.cartLineErrors[cartline.LineId!] = true;\r\n zeroAvailabilityError = true;\r\n } else if (productType.isWineProduct() && (cartline.Quantity && maxQuantity < cartline.Quantity)) {\r\n cartline.Comment = format(props.outOfStockError, maxQuantity);\r\n props.cartLineErrors[cartline.LineId!] = true;\r\n } else if (cartline.ItemId?.toLowerCase() !== props.context.request.channel?.GiftCardItemId?.toLowerCase()) {\r\n cartline.Comment = '';\r\n props.cartLineErrors[cartline.LineId!] = false;\r\n }\r\n\r\n if (product) {\r\n reactNodes.push(\r\n _assembleNode(\r\n cartline,\r\n product,\r\n props,\r\n index,\r\n zeroAvailabilityError,\r\n cartState,\r\n foundProductAvailability,\r\n foundProductDeliveryOption\r\n )\r\n );\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component\r\n */\r\n\r\nexport const ElicitCartLineItems = (props: IElicitCartLineItemsProps) => {\r\n const { products, cartlines, cartState } = props;\r\n return _assembleCartlines(cartlines, products, props, cartState);\r\n};\r\n","import { format } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n ICoreContext\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport debounce from 'lodash/debounce';\r\nimport { observable, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { SubscriptionCommerceValues } from '../../../common/subscription-commerce.values';\r\nimport { CartUtilities } from '../../../Utilities/cart-utils';\r\nimport { calculateSavingPercentAmount } from '../../../Utilities/elicit-savings-calculation';\r\nimport { filterCartLines, getSubscriptionValues, updateSubscription } from '../../../Utilities/subscription-manager';\r\nimport { IEditSubscriptionLinkData, IFrequencyTableData } from '../elicit-cart.props.autogenerated';\r\n\r\nexport interface IElicitSubscriptionHeaderProps {\r\n // elicitCartProps: IElicitCartProps;\r\n className: string;\r\n cart: AsyncResult;\r\n frequencyTable: IFrequencyTableData[];\r\n editSubscriptionLink?: IEditSubscriptionLinkData;\r\n resources: {\r\n deliveryText: string;\r\n savingText: string;\r\n savingLabel: string;\r\n wineBottleSummaryCount: string;\r\n boxNamePlaceholder: string;\r\n };\r\n context: ICoreContext;\r\n useFetchFromCart?: boolean;\r\n}\r\n\r\n/**\r\n * Subscription header renders the part of the UI that allows the user to change their subscription\r\n */\r\n@observer\r\nexport class ElicitSubscriptionHeader extends React.Component {\r\n /**\r\n * stores the user's selected frequency, gets defaulted in constructor\r\n */\r\n @observable private _selectedFrequency: IFrequencyTableData | undefined;\r\n\r\n @observable private _name: string = SubscriptionCommerceValues.SUBSCRIPTION_DEFAULT_NAME;\r\n\r\n constructor(props: IElicitSubscriptionHeaderProps) {\r\n super(props);\r\n\r\n this._onFrequencyChange = this._onFrequencyChange.bind(this);\r\n this._onNameChange = this._onNameChange.bind(this);\r\n this._onNameBlur = this._onNameBlur.bind(this);\r\n\r\n // debounce function now has typings and requires an intermediate function to use properly.\r\n // implement later. new typings declare DebouncedFunc<() => Promise> not () => Promise\r\n this._publishNameChange = debounce(this._publishNameChange.bind(this), 500) as unknown as () => Promise;\r\n\r\n reaction(\r\n () => [this.props.cart.result?.cart],\r\n () => {\r\n const values = getSubscriptionValues(this.props.cart.result?.cart);\r\n this._name = values.name || '';\r\n this._selectedFrequency = this.props.frequencyTable.find(freq => freq.freqId === values.frequency) || this._selectedFrequency;\r\n }\r\n );\r\n }\r\n\r\n public render(): JSX.Element {\r\n if (!this.props.cart.result) { return
; }\r\n const {\r\n className,\r\n resources: {\r\n wineBottleSummaryCount,\r\n deliveryText,\r\n savingText,\r\n savingLabel,\r\n boxNamePlaceholder\r\n },\r\n cart: { result: cartState },\r\n context\r\n } = this.props;\r\n const subState = getSubscriptionValues(cartState.cart);\r\n const subLines = filterCartLines(cartState.cart).subscriptionLines;\r\n const formatter = context.cultureFormatter.formatCurrency;\r\n const total = CartUtilities.countCartLineNetPrice(subLines);\r\n const discountedTotal = CartUtilities.countCartLineDiscountedPrice(subLines);\r\n const totalBottles = CartUtilities.countCartLineAmount(subLines);\r\n\r\n //only show savings if subscription box qualifies for subsequent orders\r\n const futureSavings = calculateSavingPercentAmount(subLines);\r\n let savings = total - discountedTotal;\r\n if (!isFinite(savings)) {\r\n savings = 0;\r\n }\r\n const savingFormatted = formatter(savings);\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n \r\n
{format(wineBottleSummaryCount, totalBottles)}
\r\n
\r\n
\r\n
\r\n
{deliveryText}
\r\n {this._frequencyTable(subState.frequency)}\r\n
\r\n
\r\n
{savingLabel}
\r\n
\r\n
{formatter(futureSavings ? discountedTotal : total)}
\r\n {savings && futureSavings ?
{format(savingText, savingFormatted)}
: ''}\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _frequencyTable(initialId?: string): JSX.Element {\r\n const { frequencyTable } = this.props;\r\n\r\n let firstId: string | undefined;\r\n if (!initialId && this._selectedFrequency) {\r\n firstId = frequencyTable?.find(freq => !!freq)?.freqId;\r\n }\r\n return (\r\n \r\n );\r\n }\r\n\r\n private async _pushUpdateToCart(updates: { key: string; value: string }[]): Promise {\r\n const cartChanges: CommerceProperty[] = updates.map(change => {\r\n return {\r\n Key: change.key,\r\n Value: {\r\n StringValue: change.value\r\n }\r\n };\r\n });\r\n\r\n await updateSubscription(this.props.cart, cartChanges, this.props.context);\r\n }\r\n\r\n private async _publishNameChange(): Promise {\r\n await this._pushUpdateToCart([\r\n {\r\n key: SubscriptionCommerceValues.SUBSCRIPTION_NAME,\r\n value: this._name\r\n }\r\n ]);\r\n }\r\n\r\n private async _onNameChange(event: React.ChangeEvent): Promise {\r\n this._name = event.target.value;\r\n }\r\n\r\n private async _onNameBlur(event: React.ChangeEvent): Promise {\r\n return this._publishNameChange();\r\n }\r\n\r\n private async _onFrequencyChange(event: React.ChangeEvent): Promise {\r\n this._selectedFrequency = this.props.frequencyTable?.find(frequncy => frequncy.freqId === event.target.value);\r\n return this._submitSubscriptionToCart();\r\n }\r\n\r\n private async _submitSubscriptionToCart(): Promise {\r\n\r\n const { context, cart: cartState } = this.props;\r\n const cartChanges: CommerceProperty[] = [];\r\n\r\n cartChanges.push({\r\n Key: SubscriptionCommerceValues.SUBSCRIPTION_FREQUENCY,\r\n Value: {\r\n StringValue: this._selectedFrequency!.freqId\r\n }\r\n });\r\n\r\n await updateSubscription(cartState, cartChanges, context);\r\n return;\r\n }\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, ITelemetry, RichTextComponent } from '@msdyn365-commerce/core';\r\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { Cart, ChannelConfiguration, GiftCard } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { orderSummaryShipmentCalculation } from './smwe-order-summary-shipment-calculation';\r\n\r\nexport interface IOrderSummaryProps {\r\n subTotalLabel: string;\r\n shippingLabel: string;\r\n taxLabel: string;\r\n orderTotalLabel: string;\r\n loyaltyLabel?: string;\r\n shipmentWarningText?: string;\r\n giftcardLabel?: string;\r\n totalDiscountsLabel: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n cart: Cart;\r\n channelConfiguration: ChannelConfiguration;\r\n id: string;\r\n typeName: string;\r\n freeText?: string;\r\n toBeCalculatedText?: string;\r\n checkoutState?: ICheckoutState;\r\n}\r\n\r\nexport interface IOrderSummaryLines {\r\n subtotal: React.ReactNode;\r\n shipping?: React.ReactNode;\r\n tax: React.ReactNode;\r\n orderTotal: React.ReactNode;\r\n totalDiscounts?: React.ReactNode;\r\n giftCard?: React.ReactNode;\r\n loyalty?: React.ReactNode;\r\n}\r\n\r\ninterface IOrderSummaryLineProps {\r\n label: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n price?: number;\r\n freeText?: string;\r\n toBeCalculatedText?: string;\r\n id: string;\r\n typeName: string;\r\n cssLabel: string;\r\n}\r\n\r\ninterface IShippingOrderLine {\r\n cart: Cart;\r\n channelConfiguration: ChannelConfiguration;\r\n canShip?: boolean;\r\n hasDeliveryMethod?: boolean;\r\n hasShippingMethod?: boolean;\r\n freightFee?: number;\r\n}\r\n\r\nconst OrderSummaryLine: React.FC = ({\r\n price,\r\n label,\r\n context,\r\n id,\r\n typeName,\r\n toBeCalculatedText,\r\n freeText,\r\n cssLabel\r\n}) => {\r\n return (\r\n

\r\n {label}\r\n {price || price === 0 ? (\r\n \r\n ) : (\r\n {toBeCalculatedText}\r\n )}\r\n

\r\n );\r\n};\r\n\r\nconst _buildOrderSummarySection = (\r\n props: IOrderSummaryProps,\r\n price: number | undefined,\r\n label: string,\r\n cssLabel: string\r\n): React.ReactNode => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\r\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\r\n};\r\n\r\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\r\n\r\n const giftCardCounter = (count: number, giftCard: GiftCard) => {\r\n return count + (giftCard.Balance || 0);\r\n };\r\n const giftCardTotalValue = (checkoutState.giftCards || []).reduce(giftCardCounter, 0);\r\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\r\n return Math.min(giftCardTotalValue, amount);\r\n};\r\n\r\nconst getDeliveryConfiguration = (cart: Cart, channelConfiguration: ChannelConfiguration): IShippingOrderLine => {\r\n\r\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\r\n const cartLines = cart.CartLines || [];\r\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\r\n\r\n const freightFee = cartLines.reduce(\r\n (count, cartLine) => {\r\n return count + (cartLine.ChargeLines || []).reduce(\r\n (chargeTotal, chargeLine) => {\r\n return chargeTotal + ((chargeLine.IsShipping && chargeLine.CalculatedAmount)\r\n ? chargeLine.CalculatedAmount\r\n : 0);\r\n },\r\n 0\r\n );\r\n },\r\n 0\r\n );\r\n\r\n const canShip = deliveryModes.some(deliveryMode => deliveryMode !== pickupDeliveryModeCode);\r\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode);\r\n const hasShippingMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== pickupDeliveryModeCode);\r\n return {\r\n canShip,\r\n hasDeliveryMethod,\r\n hasShippingMethod,\r\n freightFee\r\n } as IShippingOrderLine;\r\n};\r\n\r\nexport const OrderSummary = (props: IOrderSummaryProps) => {\r\n const { NetPrice, TaxAmount, DiscountAmountWithoutTax = 0, TotalAmount } = props.cart;\r\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(props.cart, props.channelConfiguration);\r\n let shippingPrice = 0;\r\n if (canShip) {\r\n shippingPrice = orderSummaryShipmentCalculation({\r\n cart: props.cart\r\n }).price;\r\n }\r\n const reactNodes: IOrderSummaryLines = {\r\n subtotal: _buildOrderSummarySection(props, NetPrice, props.subTotalLabel, 'net-price'),\r\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount : undefined, props.taxLabel, 'tax-amount'),\r\n orderTotal: _buildOrderSummarySection(props, TotalAmount! + shippingPrice, props.orderTotalLabel, 'total')\r\n };\r\n\r\n reactNodes.shipping = (\r\n \r\n {_buildOrderSummarySection(props, hasShippingMethod ? freightFee : shippingPrice, props.shippingLabel, 'shipping')}\r\n {props.shipmentWarningText && }\r\n \r\n );\r\n if (props.checkoutState) {\r\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\r\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\r\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\r\n\r\n if (loyaltyAmount > 0) {\r\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, props.loyaltyLabel || 'Loyalty amount', 'loyalty');\r\n }\r\n\r\n if (giftCardAmount > 0) {\r\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, props.giftcardLabel || 'Gift card amount', 'gift-card');\r\n }\r\n\r\n reactNodes.orderTotal = _buildOrderSummarySection({ ...props, freeText: undefined }, totalAmountAfterGiftCard, props.orderTotalLabel, 'total');\r\n }\r\n\r\n if (DiscountAmountWithoutTax > 0) {\r\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmountWithoutTax, props.totalDiscountsLabel, 'total-discounts');\r\n }\r\n\r\n return reactNodes;\r\n};","import * as React from 'react';\r\n\r\nimport { Button, format } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nexport interface IElicitPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n appliedPromoCodeSubheadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\nexport interface IElicitPromoCodeComponent extends IComponent { }\r\n\r\nconst PromoCodeComponentActions = {\r\n};\r\n\r\ninterface IElicitPromoCodeState {\r\n isCollapseOpen: boolean;\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent}\r\n */\r\nclass ElicitPromoCode extends React.PureComponent {\r\n\r\n constructor(props: IElicitPromoCodeProps, state: IElicitPromoCodeState) {\r\n super(props);\r\n this.state = {\r\n isCollapseOpen: false,\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <>\r\n
{this.props.promoCodeHeadingText}
\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n

{this.state.error}

\r\n {this._renderAppliedPromoCode(this.props)}\r\n \r\n );\r\n }\r\n\r\n private _onInputChange = (e: React.ChangeEvent) => {\r\n const error = e.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: e.target.value, error: error,\r\n canApply: e.target.value ? true : false\r\n });\r\n };\r\n\r\n private _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart) {\r\n return;\r\n }\r\n const appliedPromo = this.state.promoCodeInputValue;\r\n\r\n cartState.addPromoCode({ promoCode: appliedPromo })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // show success text\r\n this.setState({ promoCodeInputValue: '', error: '', canApply: false});\r\n } else if (result.substatus === 'ALREADYADDED') {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n } else {\r\n this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n };\r\n\r\n private _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n return (\r\n // tslint:disable-next-line:react-this-binding-issue jsx-no-lambda\r\n
{e.preventDefault(); this._applyPromotion(cartState); }} className='msc-promo-code__form'>\r\n \r\n { this._applyPromotion(cartState); }}\r\n disabled={!this.state.canApply}\r\n >\r\n {promoCodeApplyButtonText}\r\n \r\n \r\n );\r\n };\r\n\r\n private _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const code = event.currentTarget.getAttribute('data-value') || '';\r\n cartState.removePromoCodes({\r\n promoCodes: [\r\n code\r\n ]\r\n })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n this.setState({ error: ''});\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText});\r\n });\r\n\r\n };\r\n private _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\r\n return;\r\n }\r\n let discountAmount = 0;\r\n for (const line of cartState.cart.CartLines) {\r\n if (line.DiscountLines) {\r\n for (const discountLine of line.DiscountLines) {\r\n if (discountLine.DiscountCode === code) {\r\n discountAmount += discountLine.DiscountCost!;\r\n }\r\n }\r\n }\r\n }\r\n return discountAmount * -1;\r\n };\r\n\r\n private _renderAppliedPromoCode = (props: IElicitPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\r\n return;\r\n }\r\n return (\r\n
\r\n
{this.props.appliedPromoCodeHeadingText}
\r\n
{this.props.appliedPromoCodeSubheadingText}
\r\n
\r\n {\r\n props.cart.cart.Coupons.map((coupon: Coupon) => {\r\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\r\n return (\r\n
\r\n
\r\n {coupon.Code}\r\n \r\n {this._calculateDiscount(coupon.Code || '', props.cart) === 0\r\n ? null\r\n : <>\r\n (\r\n \r\n )\r\n \r\n }\r\n \r\n
\r\n {this._removePromotion(props.cart, event);}}\r\n data-value={coupon.Code}\r\n aria-label={ariaLabel}\r\n >\r\n {props.removePromoText}\r\n \r\n
\r\n );\r\n })\r\n }\r\n
\r\n
\r\n );\r\n };\r\n}\r\n\r\n// @ts-ignore\r\nexport const ElicitPromoCodeComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\r\n 'ElicitPromoCode',\r\n { component: ElicitPromoCode, ...PromoCodeComponentActions }\r\n);","import { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { CartUtilities } from '../../../Utilities/cart-utils';\r\nimport { calculateSavingPercentAmount } from '../../../Utilities/elicit-savings-calculation';\r\nimport { filterCartLines } from '../../../Utilities/subscription-manager';\r\nimport { IEditSubscriptionLinkData } from '../elicit-cart.props.autogenerated';\r\n\r\nexport interface IElicitSubscriptionUpsell {\r\n editSubscriptionLink?: IEditSubscriptionLinkData;\r\n cart: AsyncResult;\r\n}\r\n\r\n/**\r\n * displays an upsell for getting more subscription items to the user\r\n */\r\nexport class ElicitSubscriptionUpsell extends React.Component {\r\n\r\n public render(): JSX.Element {\r\n const {\r\n cart: { result: cartState },\r\n } = this.props;\r\n if (!cartState) { return
; }\r\n const subLines = filterCartLines(cartState.cart).subscriptionLines;\r\n const total = CartUtilities.countCartLineNetPrice(subLines);\r\n const savingRatioAmount = calculateSavingPercentAmount(subLines);\r\n let savingRatio = total / savingRatioAmount;\r\n if (!isFinite(savingRatio)) {\r\n savingRatio = 0;\r\n }\r\n const totalBottles = CartUtilities.countCartLineAmount(subLines);\r\n const showUpsell = totalBottles < 12 ? true : false;\r\n const upsellPercent = savingRatioAmount < 4 ? 10 : 15;\r\n const upsellBottleCount = upsellPercent === 10 ? 4 - totalBottles : 12 - totalBottles;\r\n return (\r\n
\r\n {showUpsell &&\r\n
\r\n Your order includes a subscription for a\r\n {` ${totalBottles} bottle `}\r\n box. Add\r\n {` ${upsellBottleCount} more `}\r\n bottles to your subscription to get\r\n {` ${upsellPercent}% off `}\r\n on your subsequent orders!\r\n
\r\n }\r\n {this._renderUpsellCTA(this.props.editSubscriptionLink)}\r\n
\r\n );\r\n }\r\n\r\n private _renderUpsellCTA(link: IEditSubscriptionLinkData | undefined): JSX.Element | null {\r\n if (link && link.linkUrl.destinationUrl && link.linkText) {\r\n return (\r\n \r\n {link.linkText}\r\n \r\n );\r\n }\r\n return null;\r\n }\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport classnames from 'classnames';\r\nimport { observable } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\n\r\nimport { Button, INodeProps, Waiting } from '@msdyn365-commerce-modules/utilities';\r\nimport { IWishlistActionSuccessResult } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IDictionary, IImageDimension, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AttributeValue, CartLine, CommerceProperty, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { SubscriptionCommerceValues } from '../../common/subscription-commerce.values';\r\nimport { publish } from '../../Utilities/analytics/analytics-dispatcher';\r\nimport CommerceAttributesParser from '../../Utilities/commerce-attributes-parser';\r\nimport { calculateSavingPercentAmount } from '../../Utilities/elicit-savings-calculation';\r\nimport { getAttributesForCart, IAttributeBank } from '../../Utilities/get-product-attributes';\r\nimport { filterCartLines, getSubscriptionValues, isLineSubscriptionLine, updateSubscription } from '../../Utilities/subscription-manager';\r\nimport { IOrderSummaryLines, OrderSummary } from './../../Utilities/smwe-order-summary-lineitem';\r\n\r\nimport { _assembleCartlines, ElicitCartLineItems, IElicitCartlinesViewProps } from './components/elicit-cart-line-items';\r\nimport { ElicitPromoCodeComponent } from './components/elicit-promo-code';\r\nimport { ElicitSubscriptionHeader } from './components/elicit-subscription-header';\r\nimport { ElicitSubscriptionUpsell } from './components/elicit-subscription-upsell';\r\nimport { IElicitCartData } from './elicit-cart.data';\r\nimport { IElicitCartProps } from './elicit-cart.props.autogenerated';\r\n\r\nexport interface IElicitCartViewProps extends IElicitCartProps {\r\n className: string;\r\n title?: React.ReactNode;\r\n CartlinesWrapper: INodeProps;\r\n cartlines?: IElicitCartlinesViewProps[];\r\n cart: ICartState | undefined;\r\n orderSummaryHeading: React.ReactNode;\r\n orderSummaryLineitems?: IOrderSummaryLines;\r\n OrderSummaryWrapper: INodeProps;\r\n OrderSummaryItems: INodeProps;\r\n checkoutAsGuestButton: React.ReactNode;\r\n checkoutAsSignInUserButton: React.ReactNode;\r\n storeSelector?: React.ReactNode;\r\n backToShoppingButton: React.ReactNode;\r\n waitingComponent: React.ReactNode;\r\n promoCode: React.ReactNode;\r\n cartLoadingStatus: string;\r\n cartDataResult: boolean;\r\n\r\n checkoutButtonDisabled: React.ReactNode;\r\n cartLineStatus: IDictionary;\r\n mixedCart: IDictionary;\r\n\r\n subscriptionHeader: React.ReactNode;\r\n subscriptionUpsell: React.ReactNode;\r\n\r\n shouldShowCheckoutInline: boolean;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n}\r\n\r\ninterface IImageSettingsViewports {\r\n xs: IImageDimension;\r\n sm?: IImageDimension | undefined;\r\n md?: IImageDimension | undefined;\r\n lg?: IImageDimension | undefined;\r\n xl?: IImageDimension | undefined;\r\n}\r\n\r\n/**\r\n *\r\n * Cart component\r\n * @extends {React.Component>}\r\n */\r\n@observer\r\nclass ElicitCart extends React.Component> {\r\n\r\n private cartLinesInvalid: IDictionary = {};\r\n private mixedCart: IDictionary = {};\r\n\r\n @observable private productAttributesList: { [key: number]: AttributeValue[] } = {};\r\n private parsedProductAttributes: IAttributeBank = {};\r\n\r\n constructor(props: IElicitCartProps) {\r\n super(props);\r\n this._updateSubscriptionName = this._updateSubscriptionName.bind(this);\r\n\r\n const modifiedImageSettings = props.config.imageSettings;\r\n if (modifiedImageSettings) {\r\n if (modifiedImageSettings.viewports) {\r\n modifiedImageSettings.viewports = this.usePNGImageSetting(modifiedImageSettings.viewports);\r\n props.config.imageSettings = modifiedImageSettings;\r\n }\r\n }\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n public componentDidMount(): void {\r\n if (this._displaySummary) {\r\n\r\n const { cart, products } = this.props.data;\r\n\r\n // Wait for all data to load (except attributes, which rely on product IDs)\r\n Promise.all([cart, products]).then(() => {\r\n\r\n // Fetch attributes, then generate the checkout event\r\n this._setProductAttributes().then(() => {\r\n this._generateCheckoutAnalyticsEvent(cart.result!, products.result!);\r\n }).catch(e => this.props.telemetry.exception(e));\r\n })\r\n .catch((e) => this.props.telemetry.exception(e));\r\n }\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n // tslint:disable-next-line:cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists }\r\n },\r\n context: {\r\n request: {\r\n user: {\r\n isAuthenticated,\r\n signInUrl\r\n },\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n },\r\n app: {\r\n routes\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const backToShoppingUrl = routes.backToShopping && routes.backToShopping.destinationUrl ?\r\n routes.backToShopping.destinationUrl\r\n : getUrlSync('home', this.props.context.actionContext) || '';\r\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && this._contextualLines.length === 0;\r\n const isCartREALLYEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n const isAllCartEmpty = cart?.cart.CartLines?.length === 0;\r\n\r\n const elicitCartItemProps = {\r\n percentSaving: calculateSavingPercentAmount(this._contextualLines),\r\n templatePercentSavingText: resources.elicitCart_subscriptionLinePercentSavingText,\r\n templateSavingText: resources.elicitCart_subscriptionSavingText,\r\n cartlines: this._contextualLines,\r\n cartLineErrors: this.cartLinesInvalid,\r\n mixedCart: this.mixedCart,\r\n mixedCartLines: cart?.cart.CartLines || [],\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\r\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 10,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.elicitCart__productDimensionTypeSize,\r\n colorString: resources.elicitCart__productDimensionTypeColor,\r\n configString: 'asd',\r\n styleString: resources.elicitCart__productDimensionTypeStyle,\r\n quantityDisplayString: resources.elicitCart__quantityDisplayText,\r\n inputQuantityAriaLabel: resources.elicitCart__inputQuantityAriaLabel,\r\n discountStringText: resources.elicitCart__discountStringText,\r\n\r\n originalPriceText: resources.elicitCart__originalPriceText,\r\n currentPriceText: resources.elicitCart__currentPriceText,\r\n shippingChargesText: resources.elicitCart__shippingCharges,\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.elicitCart__addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.elicitCart__removeFromWishlistButtonText,\r\n removeButtonText: resources.elicitCart__removeCartButtonText,\r\n shipItText: resources.elicitCart__shipInsteadDisplayText,\r\n pickitUpText: resources.elicitCart__pickItUpDisplayText,\r\n changeStoreText: resources.elicitCart__changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.elicitCart__defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n showImages: this.props.config.showImages,\r\n invalidProductError: this.props.resources.elicitCart__invalidProductError,\r\n outOfStockError: this.props.resources.elicitCart__outOfStockError,\r\n zeroAvailabilityError: this.props.resources.elicitCart__zeroAvailabilityError,\r\n showDiscountPercent: this.props.config.showDiscountPercent,\r\n productAttributesList: this.productAttributesList\r\n };\r\n\r\n // this ensures that all errors are populated in cart\r\n // the error object gets indirectly populated by the method\r\n _assembleCartlines(\r\n this.props.data.cart.result?.cart.CartLines || [],\r\n this.props.data.products.result || [],\r\n {\r\n ...elicitCartItemProps,\r\n cartlines: this.props.data.cart.result?.cart.CartLines || []\r\n },\r\n this.props.data.cart.result\r\n );\r\n\r\n const viewProps = {\r\n ...this.props,\r\n className: classnames('msc-cart'),\r\n title: this._title,\r\n CartlinesWrapper: { className: 'msc-cart-line' },\r\n OrderSummaryWrapper: { className: 'msc-order-summary' },\r\n OrderSummaryItems: { className: 'msc-order-summary__items' },\r\n cartlines: this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && this._contextualLines.length > 0 ?\r\n (\r\n ElicitCartLineItems(elicitCartItemProps)\r\n ) : undefined,\r\n promoCode: cart && (\r\n \r\n ),\r\n\r\n cart: this.props.data.cart.result,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry: this.props.telemetry,\r\n id: this.props.id,\r\n removePromoAriaLabelFormat: resources.elicitCart__removePromoAriaLabelFormat,\r\n orderSummaryHeading: this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && this._displaySummary && cart.cart.CartLines.length > 0 ?\r\n (\r\n

{resources.elicitCart__orderSummaryTitle}

\r\n ) : null,\r\n orderSummaryLineitems: cart && cart.cart && channelConfiguration && cart.cart.CartLines && this._displaySummary && cart.cart.CartLines.length > 0 ?\r\n (\r\n OrderSummary({\r\n cart: cart.cart,\r\n shipmentWarningText: this.props.config.shipmentWarningText as string,\r\n subTotalLabel: resources.elicitCart__itemsWithCountLabel,\r\n shippingLabel: resources.elicitCart__estimatedShippingLabel,\r\n taxLabel: resources.elicitCart__estimatedTaxLabel,\r\n orderTotalLabel: resources.elicitCart__orderTotal,\r\n totalDiscountsLabel: resources.elicitCart__totalDiscountsLabel,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n toBeCalculatedText: resources.elicitCart__yetToBeCalculatedText,\r\n freeText: resources.elicitCart__priceFree,\r\n channelConfiguration: channelConfiguration,\r\n telemetry: telemetry\r\n })\r\n ) :\r\n (\r\n undefined\r\n ),\r\n checkoutAsSignInUserButton: (!isCartREALLYEmpty) ?\r\n (\r\n \r\n ) : null,\r\n checkoutAsGuestButton: (!isCartREALLYEmpty && !isAuthenticated) ?\r\n (\r\n \r\n ) : null,\r\n backToShoppingButton: ,\r\n storeSelector: this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n waitingComponent: ,\r\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.elicitCart__cartLoadingErrorMessage : null,\r\n cartDataResult: !this._useForSubscriptions && this.props.data.cart.result && isAllCartEmpty,\r\n\r\n // DG: Additions to disable checkout button if an error is detected\r\n checkoutButtonDisabled: (\r\n \r\n ),\r\n cartLineStatus: this.cartLinesInvalid,\r\n mixedCart: this.mixedCart,\r\n subscriptionHeader: this._useForSubscriptions && !isCartEmpty && (\r\n \r\n ),\r\n subscriptionUpsell: this._useForSubscriptions && !isCartEmpty && (\r\n \r\n ),\r\n shouldShowCheckoutInline: this._shouldShowCheckoutInline\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n public usePNGImageSetting = (viewports: IImageSettingsViewports): IImageSettingsViewports => {\r\n const modifiedViewports = viewports;\r\n if (modifiedViewports?.xs?.q) {\r\n modifiedViewports.xs.q = modifiedViewports.xs.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.sm?.q) {\r\n modifiedViewports.sm.q = modifiedViewports.sm.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.md?.q) {\r\n modifiedViewports.md.q = modifiedViewports.md.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.lg?.q) {\r\n modifiedViewports.lg.q = modifiedViewports.lg.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.xl?.q) {\r\n modifiedViewports.xl.q = modifiedViewports.xl.q.replace('f=jpg', 'f=png');\r\n }\r\n\r\n return modifiedViewports;\r\n };\r\n\r\n private get _shouldShowCheckoutInline(): boolean {\r\n\r\n const lines = filterCartLines(this.props.data.cart.result?.cart);\r\n\r\n if (this._useForSubscriptions) {\r\n // if theres sub items, show\r\n if (lines.subscriptionLines.length > 0) {\r\n return true;\r\n }\r\n return false;\r\n } else {\r\n // if only non sub items, show\r\n if (lines.subscriptionLines.length === 0 && lines.lines.length > 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\r\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n\r\n // tslint:disable-next-line: no-typeof-undefined\r\n if ((typeof window !== 'undefined') && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${signInUrl.indexOf('?') === -1 ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n };\r\n\r\n /**\r\n * contextual line can be either only subscription lines or only item lines\r\n */\r\n private get _contextualLines(): CartLine[] {\r\n return this.props.data.cart.result?.cart.CartLines?.filter(line => {\r\n const isSubLine = isLineSubscriptionLine(line);\r\n if (this._useForSubscriptions) {\r\n return isSubLine;\r\n } else {\r\n return !isSubLine;\r\n }\r\n }) || [];\r\n }\r\n\r\n private get _useForSubscriptions(): boolean {\r\n return !!this.props.config.useForSubscriptions;\r\n }\r\n\r\n private get _displaySummary(): boolean {\r\n return !!this.props.config.displaySummary;\r\n }\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n\r\n if (this.props.data.cart.result) {\r\n this._generateRemovalAnalyticsEvent(cartlineToRemove);\r\n\r\n delete this.cartLinesInvalid[cartlineToRemove.LineId!.toString()];\r\n\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n\r\n this.props.data.cart.result.removeCartLines(input)\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _generateRemovalAnalyticsEvent(cartlineToRemove: CartLine): void {\r\n const productID = cartlineToRemove.ProductId;\r\n if (!productID) {\r\n return;\r\n }\r\n\r\n const product = this.props.data.products.result?.find(entry => entry.RecordId === productID);\r\n const isSubscription = isLineSubscriptionLine(cartlineToRemove);\r\n\r\n publish('removeFromCart', {\r\n product,\r\n quantity: cartlineToRemove.Quantity,\r\n attributes: this.parsedProductAttributes[productID],\r\n subscription: isSubscription,\r\n frequency: isSubscription && getSubscriptionValues(this.props.data.cart.result?.cart).frequency,\r\n context: this.props.context\r\n });\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _generateCheckoutAnalyticsEvent(cart: ICartState, products: SimpleProduct[]): void {\r\n\r\n const subFrequency = getSubscriptionValues(this.props.data.cart.result?.cart).frequency;\r\n\r\n // Convert to the format the analytics module requires\r\n const mappedProducts = cart.cart.CartLines?.map(line => {\r\n const product = products.find(entry => entry.RecordId === line.ProductId);\r\n const isSubscription = isLineSubscriptionLine(line);\r\n\r\n return {\r\n product,\r\n quantity: line.Quantity,\r\n attributes: this.parsedProductAttributes[line.ProductId!],\r\n subscription: isSubscription,\r\n frequency: isSubscription && subFrequency,\r\n discounts: line.DiscountLines,\r\n context: this.props.context,\r\n };\r\n });\r\n\r\n publish('checkout', {\r\n step: 0, // We're counting the cart page as step 0\r\n products: mappedProducts,\r\n coupon: cart.cart.Coupons?.map(coupon => coupon.Code).join(','),\r\n });\r\n }\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n };\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number) => {\r\n if (this.props.data.cart.result) {\r\n delete this.cartLinesInvalid[cartlineToUpdate.LineId!.toString()];\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n };\r\n\r\n private async _setProductAttributes(): Promise {\r\n const cart = this.props.data.cart?.result?.cart;\r\n if (cart && cart.CartLines) {\r\n this.parsedProductAttributes = await getAttributesForCart(cart?.CartLines, this.props.context.actionContext);\r\n\r\n Object.entries(this.parsedProductAttributes).forEach(([id, productAttribs]) => {\r\n this.productAttributesList[id] = CommerceAttributesParser.unParseAttributes(productAttribs);\r\n });\r\n }\r\n }\r\n\r\n private async _updateSubscriptionName(): Promise {\r\n const values = getSubscriptionValues(this.props.data.cart.result?.cart);\r\n if (!values.name) {\r\n const cartChanges: CommerceProperty[] = [];\r\n cartChanges.push({\r\n Key: SubscriptionCommerceValues.SUBSCRIPTION_NAME,\r\n Value: {\r\n StringValue: SubscriptionCommerceValues.SUBSCRIPTION_DEFAULT_NAME\r\n }\r\n });\r\n await updateSubscription(this.props.data.cart, cartChanges, this.props.context);\r\n return;\r\n }\r\n }\r\n\r\n private get _title(): JSX.Element | null {\r\n const { resources } = this.props;\r\n if (this._useForSubscriptions) {\r\n if (this._contextualLines.length === 0) { return null; }\r\n return

{resources.elicitCart__subCartTitle}

;\r\n }\r\n // special case where the subscription version has both\r\n if (this._contextualLines.length === 0 && filterCartLines(this.props.data.cart.result?.cart).subscriptionLines.length > 0) {\r\n return null;\r\n }\r\n return

{resources.elicitCart__cartTitle}

;\r\n }\r\n}\r\n\r\nexport default ElicitCart;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Alert, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IDictionary } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { IElicitCartlinesViewProps } from './components/elicit-cart-line-items';\r\nimport { IElicitCartViewProps } from './elicit-cart';\r\n\r\nconst _renderCartlines = (\r\n cartLines: IElicitCartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean,\r\n itemsTitle: string,\r\n qtyTitle: string,\r\n unitPriceTitle: string,\r\n totalTitle: string\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus};\r\n }\r\n if (cartLines) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {cartLines.map((cartLine, index) => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n \r\n {cartLine.pickUpInStore.defaultComponent}\r\n \r\n ) : null}\r\n
\r\n );\r\n })}\r\n
\r\n \r\n
{itemsTitle}{qtyTitle}{unitPriceTitle}{totalTitle}
\r\n );\r\n } else {\r\n return cartDataResult ? (\r\n
\r\n

{cartEmptyText}

\r\n {backToShoppingButton}\r\n
\r\n ) : (\r\n <>{waitingComponent}\r\n );\r\n }\r\n};\r\n\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: IElicitCartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n return (\r\n \r\n {orderSummaryLines.subtotal}\r\n {orderSummaryLines.shipping}\r\n {orderSummaryLines.tax}\r\n {orderSummaryLines.totalDiscounts\r\n ? orderSummaryLines.totalDiscounts\r\n : null}\r\n {orderSummaryLines.orderTotal}\r\n

{props.resources.elicitCart__conditionsText}

\r\n
\r\n );\r\n};\r\n\r\n// Detect invalid items in the cart. Items are flagged externally via the Comment field\r\nconst _isInvalidCart = (cartLinesInvalid: IDictionary): boolean => {\r\n\r\n for (const lineId of Object.keys(cartLinesInvalid)) {\r\n if (cartLinesInvalid[lineId]) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n//==================================================\r\n//==================================================\r\nconst ElicitCartView: React.FC = (props: IElicitCartViewProps) => {\r\n const preventCheckout = _isInvalidCart(props.cartLineStatus) || props.mixedCart.isMixedCart;\r\n const { faqLink } = props.config;\r\n\r\n return (\r\n \r\n {props.cartlines && props.title}\r\n {props.subscriptionUpsell}\r\n {props.subscriptionHeader}\r\n \r\n \r\n \r\n \r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.elicitCart__emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult,\r\n props.resources.elicitCart__itemsTitle,\r\n props.resources.elicitCart__qtyTitle,\r\n props.resources.elicitCart__unitPriceTitle,\r\n props.resources.elicitCart__totalTitle\r\n )}\r\n \r\n {props.shouldShowCheckoutInline && (preventCheckout ? props.checkoutButtonDisabled : props.checkoutAsSignInUserButton)}\r\n {props.orderSummaryHeading && (\r\n \r\n
\r\n {props.orderSummaryHeading}\r\n {\r\n faqLink?.linkUrl?.destinationUrl &&\r\n \r\n }\r\n
\r\n {_renderOrderSummarylines(\r\n props.orderSummaryLineitems,\r\n props.OrderSummaryItems,\r\n props\r\n )}\r\n
\r\n {props.promoCode}\r\n
\r\n \r\n {preventCheckout ? props.checkoutButtonDisabled : props.checkoutAsSignInUserButton}\r\n {props.backToShoppingButton}\r\n \r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default ElicitCartView;","import { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { get } from 'lodash';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n /**\r\n * ChoiceSummary component\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.Component {\r\n private closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n return (\r\n
\r\n {items.length > 0 && label && {label}}\r\n
    \r\n {items.map((item: IRefinerMap, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\r\n return (\r\n
  • \r\n \r\n {item.key}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n {items.length > 0 && clearAllText && {clearAllText}}\r\n
\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n switch (productRefinerValue.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n break;\r\n default:\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll: clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => (itemClicked.innerText && itemClicked.innerText.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","import * as React from 'react';\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => ( {text} );","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { ICoreContext, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ICartState, ICheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, ProductAvailableQuantity, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport ProductCard, { ISmweSearchResultContainerParentProps } from '../../../components/product.component';\r\nimport { IElicitSubscriptionsResources } from '../elicit-subscriptions.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IElicitSubscriptionsResources;\r\n telemetry: ITelemetry;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n parentProps: ISmweSearchResultContainerParentProps;\r\n checkoutState?: AsyncResult;\r\n disableQuantitySlider?: boolean;\r\n maxAdditionLimit?: number;\r\n cart?: AsyncResult;\r\n productAvailability?: ProductAvailableQuantity[] | undefined;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n parentProps,\r\n checkoutState,\r\n disableQuantitySlider,\r\n maxAdditionLimit,\r\n cart,\r\n productAvailability\r\n}) => {\r\n return (\r\n\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => {\r\n const availibity = productAvailability?.find((item) => {\r\n return item.ProductId === product.RecordId;\r\n });\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n );\r\n\r\n};","import * as React from 'react';\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => ( {text} );\r\n","import * as React from 'react';\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => ( {separator} );","import {\r\n Button,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle():void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const {text, onClick, ariaLabel, innerRef, id} = props;\r\n return ;\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps):ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n {props.resources.modalTitle}\r\n \r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};","import * as React from 'react';\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
{text}
\r\n
\r\n );\r\n};","import { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private minInput: React.RefObject;\r\n private maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n const initialMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
\r\n \r\n \r\n {validationErrorMin &&\r\n {validationErrorMin}\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n {validationErrorMax}\r\n }\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\r\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice =this._formatPrice(selectedMin);\r\n const selectedMaxPrice =this._formatPrice(selectedMax);\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({validationErrorMin: refineItemCommonProps.validationErrorNaN});\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({validationErrorMax: refineItemCommonProps.validationErrorNaN});\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // tslint:disable-next-line:no-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(sliderChangeNotification.id);\r\n if (!!element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}","import { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private anchorType: React.RefObject;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n children,\r\n onToggle,\r\n context,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const role = isSingleSelect ? 'radio' : undefined;\r\n itemTypeClassName = !!selectedRefinementCriterion ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n return (\r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n return (\r\n
  • \r\n \r\n \r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n \r\n \r\n
  • \r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n };\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\nimport { Button, Collapse } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { findMatchingRefinementCriterion, ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n refinerExpandText?: string;\r\n refinerMinimizeText?: string;\r\n minimizedRefiners?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n highestLevelRefinerText?: string;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.PureComponent {\r\n\r\n private isMinimizedRefiner: boolean = false;\r\n\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n this._expandCategoryRefiner = this._expandCategoryRefiner.bind(this);\r\n\r\n let isExpanded = this.props.isExpandedOnInitialLoad;\r\n if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n isExpanded = true;\r\n }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n\r\n if (this.props.minimizedRefiners) {\r\n const minimizedRefinersList = this.props.minimizedRefiners.split(',');\r\n this.isMinimizedRefiner = minimizedRefinersList.some(\r\n keyName => this.props.productRefinerHierarchy.KeyName && (keyName.toLowerCase() === this.props.productRefinerHierarchy.KeyName.toLocaleLowerCase())\r\n );\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n const isRangeRefiner = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range);\r\n let key = '';\r\n if (isRangeRefiner) {\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(productRefinerHierarchy.Values[0], this.props.selectedRefinerValues);\r\n key = selectedRefinementCriterion ? `($${selectedRefinementCriterion.LeftValueBoundString && parseFloat(selectedRefinementCriterion.LeftValueBoundString).toFixed(2)} - $${selectedRefinementCriterion.RightValueBoundString && parseFloat(selectedRefinementCriterion.RightValueBoundString).toFixed(2)})` : '';\r\n }\r\n\r\n if (this.isMinimizedRefiner) {\r\n return (\r\n
    \r\n
    {productRefinerHierarchy.KeyName} {key}
    \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n
    \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n \r\n {productRefinerHierarchy.KeyName} {key}\r\n \r\n \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n \r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n switch (productRefinerHierarchy.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n return this._renderRange(productRefinerHierarchy);\r\n default:\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect = productRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = this._getSortedValueList() || [];\r\n\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n \r\n );\r\n });\r\n if (this.isMinimizedRefiner) {\r\n return (\r\n
    \r\n
      \r\n {listItems}\r\n
    \r\n \r\n {this.props.refinerExpandText}\r\n \r\n
    \r\n );\r\n }\r\n return (\r\n
      \r\n {listItems}\r\n
    \r\n );\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = this._getSortedValueList() || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n // TODO BUGBUG 22424559 determine only from the DataTypeValue once live example is working (can test with the tempRangeTypeTODO derived from QSP until then)\r\n const rangeType = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput || this.props.tempRangeTypeTODO === 'input') ?\r\n 'input' :\r\n 'slider';\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n\r\n private _getSortedValueList(): ProductRefinerValue[] {\r\n const sortedList = this.props.productRefinerHierarchy.Values.sort((nextOption, curOption) => {\r\n const curOptionName =\r\n nextOption.LeftValueBoundString || nextOption.RightValueBoundString || '';\r\n const nextOptionName =\r\n curOption.LeftValueBoundString || curOption.RightValueBoundString || '';\r\n\r\n return curOptionName.localeCompare(nextOptionName);\r\n });\r\n\r\n const dividedList = {\r\n options: [] as ProductRefinerValue[],\r\n topLevel: [] as ProductRefinerValue[]\r\n };\r\n sortedList.forEach(option => {\r\n const optionName = option.LeftValueBoundString || option.RightValueBoundString || '';\r\n\r\n if (optionName === this.props.highestLevelRefinerText) {\r\n dividedList.topLevel.push(option);\r\n } else {\r\n dividedList.options.push(option);\r\n }\r\n });\r\n\r\n return [...dividedList.topLevel, ...dividedList.options];\r\n }\r\n\r\n private _expandCategoryRefiner(): void {\r\n const minimizedElement = document.getElementById(`refine-submenu-minimize__${this.props.productRefinerHierarchy.RecordId}`);\r\n const buttonElement = document.getElementById(`refine-submenu-minimize-button__${this.props.productRefinerHierarchy.RecordId}`);\r\n if (minimizedElement && buttonElement) {\r\n if (minimizedElement.className === 'ms-refine-submenu__list-min') {\r\n minimizedElement.className = 'ms-refine-submenu__list-full';\r\n buttonElement.textContent = this.props.refinerMinimizeText!;\r\n } else {\r\n minimizedElement.className = 'ms-refine-submenu__list-min';\r\n buttonElement.textContent = this.props.refinerExpandText!;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","import { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n */\r\nexport const enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (refinementCriterion.DataTypeValue === ProductRefinerValueDataTypeValue.Range ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List || itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, LabeledDropdown, UncontrolledPagination } from '@msdyn365-commerce-modules/utilities';\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\n// category description 1.0\r\nimport MsDyn365, { IImageDimension, RichText, RichTextComponent } from '@msdyn365-commerce/core';\r\nimport { AsyncResult, format, ProductAvailableQuantity, ProductRefinerValue, ProductSearchResult, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport { getEstimatedAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\r\n\r\nimport { ISmweSearchResultContainerParentProps } from '../../components/product.component';\r\nimport { buildListPageUrl, getCollectionProducts, getCurrentUrl, GetFullProductsByCollectionInput, hydrateRefinersFromUrl, IFullProductsSearchResultsWithCount, parseQueryParam, sortOptions } from '../../dataActions/search-result-container';\r\nimport { publish } from '../../Utilities/analytics/analytics-dispatcher';\r\nimport { filterInvalidCategories } from '../../Utilities/refiners';\r\nimport { filterCartLines } from '../../Utilities/subscription-manager';\r\n\r\nimport CommerceAttributesParser from '../../Utilities/commerce-attributes-parser';\r\nimport {\r\n ErrorMessage, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion, Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IElicitSubscriptionsData } from './elicit-subscriptions.data';\r\nimport { IElicitSubscriptionsProps } from './elicit-subscriptions.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends IElicitSubscriptionsProps<{}> {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n categoryDescription: JSX.Element | undefined;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title: ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n productAvailability: ProductAvailableQuantity[] | undefined;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\ninterface IImageSettingsViewports {\r\n xs: IImageDimension;\r\n sm?: IImageDimension | undefined;\r\n md?: IImageDimension | undefined;\r\n lg?: IImageDimension | undefined;\r\n xl?: IImageDimension | undefined;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component\r\n * @extends {React.Component>}\r\n */\r\n@observer\r\nexport default class SmweSearchResultContainer extends React.Component, ISearchResultContainerState> {\r\n\r\n @computed get isMobile(): boolean {\r\n return (this._viewport === 'xs' || this._viewport === 'sm' || this._viewport === 'md');\r\n }\r\n\r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [];\r\n private showSortByDropdown: boolean = false;\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n @observable\r\n private _refinersFiltered: boolean = false;\r\n\r\n private _modalToggleRef: React.RefObject;\r\n private _sortAndFilterContainerRef: React.RefObject;\r\n private _initialProductResultCount: number = 0;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n constructor(props: IElicitSubscriptionsProps) {\r\n super(props);\r\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this._addSortByDropdownOptions();\r\n\r\n this.props.data.checkoutState = this.props.data.checkoutState || {} as AsyncResult;\r\n\r\n const modifiedImageSettings = props.config.imageSettings;\r\n if (modifiedImageSettings) {\r\n if (modifiedImageSettings.viewports) {\r\n modifiedImageSettings.viewports = this.usePNGImageSetting(modifiedImageSettings.viewports);\r\n }\r\n }\r\n\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n productAvailability: undefined\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n\r\n reaction(\r\n () => { return [this.props.data.cart.result?.cart.CartLines, this.props.data.cart.result, this.props.data.cart.result?.cart]; },\r\n () => { this.setState({}); }\r\n );\r\n\r\n // Initalization of list page\r\n // Have an ugly promise cascade. Promise.all() does NOT work right here. That causes everything below to run after render instead of before.\r\n void this.props.data.products.then(products => {\r\n void this.props.data.listPageState.then(listPageState => {\r\n void this.props.data.refiners.then(refiners => {\r\n void this.props.data.categoryHierarchy.then(categoryHierarchy => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n this._initialProductResultCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n filterInvalidCategories(refiners, categoryHierarchy, this.props.context.app.config.refinerRemappers);\r\n this._refinersFiltered = true;\r\n\r\n // tslint:disable-next-line: no-floating-promises\r\n void this._getProductavailabilty(products);\r\n this._emitImpressionEvent(products.products);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n this.props.context.request.query && this.props.context.request.query.q);\r\n\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count || this._initialProductResultCount;\r\n // tslint:disable-next-line: no-floating-promises\r\n void this._getProductavailabilty(productResults);\r\n this._emitImpressionEvent(products.products);\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }\r\n );\r\n });\r\n });\r\n });\r\n });\r\n\r\n this._updateViewport();\r\n }\r\n\r\n public componentDidMount(): void {\r\n // tslint:disable-next-line: no-typeof-undefined\r\n if (typeof window !== 'undefined' && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n // tslint:disable-next-line: no-typeof-undefined\r\n if (typeof window !== 'undefined' && window.addEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public usePNGImageSetting = (viewports: IImageSettingsViewports): IImageSettingsViewports => {\r\n const modifiedViewports = viewports;\r\n if (modifiedViewports?.xs?.q) {\r\n modifiedViewports.xs.q = modifiedViewports.xs.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.sm?.q) {\r\n modifiedViewports.sm.q = modifiedViewports.sm.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.md?.q) {\r\n modifiedViewports.md.q = modifiedViewports.md.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.lg?.q) {\r\n modifiedViewports.lg.q = modifiedViewports.lg.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.xl?.q) {\r\n modifiedViewports.xl.q = modifiedViewports.xl.q.replace('f=jpg', 'f=png');\r\n }\r\n\r\n return modifiedViewports;\r\n };\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className, paragraph, showPagination } = this.props.config;\r\n const { resources, telemetry, data } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n let errorText = '';\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n\r\n const categoryHierarchy = (data.category && data.category.result) || undefined;\r\n const passedProps = { ...this.props, categoryHierarchy };\r\n const productsComponent = (\r\n \r\n );\r\n // category-description 1.0\r\n const categoryDescription = this._getCategoryDescription(paragraph);\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 && this.showSortByDropdown && this.props.config.showSortBy ? this._getSortingDropDown() : null,\r\n pagination: showPagination ? this._getPagination() : '',\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ?\r\n (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && (\r\n \r\n ),\r\n categoryDescription: categoryDescription\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private _addSortByDropdownOptions = (): void => {\r\n if (this.props.config.showSortingByRelevance) {\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc });\r\n this.showSortByDropdown = true;\r\n }\r\n if (this.props.config.showSortingByName) {\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc });\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc });\r\n this.showSortByDropdown = true;\r\n }\r\n if (this.props.config.showSortingByPrice) {\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc });\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc });\r\n this.showSortByDropdown = true;\r\n }\r\n if (this.props.config.showSortingByRating) {\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc });\r\n this.showSortByDropdown = true;\r\n }\r\n };\r\n\r\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal(\r\n {\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle = (data.category.result && SmweSearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: 'ms-search-result-container__title' },\r\n title: {\r\n titlePrefix: titlePrefix,\r\n titleText: titleText,\r\n titleCount: titleCount\r\n }\r\n };\r\n\r\n };\r\n private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n\r\n };\r\n\r\n private _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={this.sortByDropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />);\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount = listPageState && listPageState.currentPageNumber !== null ?\r\n (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) :\r\n ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\r\n const totalItems = listPageState && listPageState.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n const totalActiveProducts = listPageState?.activeProducts?.length || 0;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n if (totalActiveProducts <= 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp={'skip'}\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={<div className='msc-pagination__prev'><span className='ms-search-result__pagination-left' aria-hidden='true' /><span className='prev-text'>{previousText}</span></div>}\r\n nextText={<div className='msc-pagination__next'><span className='next-text'>{nextText}</span><span className='ms-search-result__pagination-right' aria-hidden='true' /></div>}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n />);\r\n };\r\n\r\n private _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = this._refinersFiltered && data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const subMenus = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (data.listPageState.result?.totalProductCount !== 0 ?\r\n (\r\n <RefineSubmenu\r\n highestLevelRefinerText={this.props.config.highestLevelItem}\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n refinerMinimizeText={this.props.resources.refinerMinimizeText}\r\n refinerExpandText={this.props.resources.refinerExpandText}\r\n minimizedRefiners={this.props.config.minimizedRefiners}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={this.props.config.collapseRefiners ? false : true}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n />) : null\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus || undefined // type shenanigans\r\n };\r\n\r\n };\r\n\r\n private _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-ignore: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n />\r\n );\r\n\r\n };\r\n\r\n private _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\r\n });\r\n };\r\n\r\n private _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === option.key; });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n private _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria?.Columns?.length && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find((mappedSearchConfig) => {\r\n return (mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName) &&\r\n (mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending);\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find((dropdownOption) => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\r\n };\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n };\r\n\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n },\r\n 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n } else {\r\n return 'xl';\r\n }\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private _getCategoryDescription(paragraph: RichText | undefined): JSX.Element | undefined {\r\n\r\n if (paragraph && paragraph.length > 0) {\r\n return <RichTextComponent className='category-description' text={paragraph} />;\r\n }\r\n return undefined;\r\n }\r\n\r\n private get _subscriptionQuantityLimit(): number {\r\n return this.props.config.quantityLimit || 12; // 12 is default\r\n }\r\n\r\n private get _shouldDisableQuantityAddition(): boolean {\r\n const { checkoutState: { result: checkoutState } } = this.props.data;\r\n if (!checkoutState) { return false; }\r\n const filteredLines = filterCartLines(checkoutState.checkoutCart.cart);\r\n let amount = 0;\r\n filteredLines.subscriptionLines.forEach(line => amount += line.Quantity || 0);\r\n if (amount >= this._subscriptionQuantityLimit) { return false; }\r\n return true;\r\n }\r\n\r\n private async _getProductavailabilty(products: IFullProductsSearchResultsWithCount): Promise<void> {\r\n if (products && products.count && products.count > 0) {\r\n const productIds: number[] = [];\r\n products.products.forEach((product) => {\r\n productIds.push(product.RecordId);\r\n });\r\n const availabilityAll = await getEstimatedAvailabilityAsync({ callerContext: this.props.context.actionContext }, { ProductIds: productIds, DefaultWarehouseOnly: true });\r\n const formattedResponse = availabilityAll.ProductWarehouseInventoryAvailabilities?.map((product) => {\r\n return { ProductId: product.ProductId, AvailableQuantity: product.PhysicalAvailable, ExtensionProperties: product.ExtensionProperties };\r\n }) as ProductAvailableQuantity[];\r\n this.setState({ productAvailability: formattedResponse });\r\n }\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _emitImpressionEvent(products: ProductSearchResult[]): void {\r\n const impressions = products.map(product => ({\r\n product,\r\n attributes: CommerceAttributesParser.getParsedAttributes(product.AttributeValues || []),\r\n }));\r\n\r\n publish('impression', {\r\n products: impressions,\r\n\r\n list: 'Category Page', // Could be Search Results if we ever enable search results pages\r\n category: this.props.data.category.result?.Name,\r\n context: this.props.context,\r\n });\r\n }\r\n}\r\n","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps, Title } from './components';\r\nimport { IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from './elicit-subscriptions';\r\nimport { IElicitSubscriptionsProps } from './elicit-subscriptions.props.autogenerated';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & IElicitSubscriptionsProps<{}>> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, categoryDescription } = props;\r\n // customization for 1.0\r\n const { showRefiners, showSortBy, showResultCount, categoryNamePrefix } = props.config;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-container__title-header'>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {categoryDescription}\r\n </div>\r\n <div className='ms-search-result-container__filter-sort'>\r\n {showRefiners && choiceSummary}\r\n {showRefiners && modalToggle}\r\n {showRefiners && createSearchResultModal(searchResultModal, refineMenu, sortByOptions, showSortBy!)}\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {showResultCount && TitleViewProps && <Node {...CategoryNavContainer}>\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {showRefiners && refineMenu && renderRefiner(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-container__title-header'>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {categoryDescription}\r\n </div>\r\n <div className='ms-search-result-container__filter-sort'>\r\n {showRefiners && choiceSummary}\r\n {showSortBy && sortByOptions && renderSort(sortByOptions, showSortBy)}\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown, showSortBy), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, showSortBy), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && showSortBy) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps, showResultPrefix: boolean, categoryNamePrefix: string): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={categoryNamePrefix} />;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {showResultPrefix && titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;","import { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductDimension } from '@msdyn365-commerce/retail-proxy';\r\nimport { IAddToCartFailureResult } from '../../../components/addtocart.component';\r\nimport { ISmweBuyboxResources } from '../smwe-buybox.props.autogenerated';\r\n\r\nexport function getQuantityError(stockLeft: number | undefined, resources: ISmweBuyboxResources): string | undefined {\r\n if (!stockLeft || stockLeft <= 0) {\r\n return resources.errorMessageOutOfStock;\r\n } else if (stockLeft === 1) {\r\n return resources.errorMessageOutOfRangeOneLeft;\r\n } else {\r\n return resources.errorMessageOutOfRangeFormat.replace('{numLeft}', stockLeft.toString());\r\n }\r\n}\r\n\r\nexport function getGenericError(result: IAddToCartFailureResult, resources: ISmweBuyboxResources, context: ICoreContext<IGeneric<IAny>>): string | undefined {\r\n if (result.failureReason === 'EMPTYINPUT') {\r\n return resources.addedToCartFailureMessage;\r\n } else if (result.failureReason === 'CARTACTIONFAILED') {\r\n if (result.cartActionResult && result.cartActionResult.substatus === 'MAXQUANTITY') {\r\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\r\n return resources.maxQuantityLimitText.replace('{quantity}', maxQuantityForLineItem.toString());\r\n }\r\n\r\n return resources.addedToCartFailureMessage;\r\n } else if(result.failureReason === 'MIXEDCART') {\r\n return resources.mixedCartErrorText;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function getConfigureErrors(result: ProductDimension[] | undefined, resources: ISmweBuyboxResources): { [configureId: string]: string | undefined } {\r\n if (!result) {\r\n return {};\r\n }\r\n\r\n const dimensions: { [configureId: string]: string | undefined } = {};\r\n\r\n result.forEach(dimension => {\r\n dimensions[dimension.DimensionTypeValue] = getDimensionErrorString(dimension.DimensionTypeValue, resources);\r\n });\r\n\r\n return dimensions;\r\n}\r\n\r\nexport function getDimensionErrorString(dimensionTypeValue: number, resources: ISmweBuyboxResources): string {\r\n switch (dimensionTypeValue) {\r\n case 1: // ProductDimensionType.Color\r\n return resources.productDimensionTypeColorErrorMessage;\r\n case 2: // ProductDimensionType.Configuration\r\n return resources.productDimensionTypeConfigurationErrorMessage;\r\n case 3: // ProductDimensionType.Size\r\n return resources.productDimensionTypeSizeErrorMessage;\r\n case 4: // ProductDimensionType.Style\r\n return resources.productDimensionTypeStyleErrorMessage;\r\n default:\r\n return '';\r\n }\r\n}","import * as React from 'react';\r\n\r\nimport { Alert, format, Heading, INodeProps, Quantity } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n AddToWishlistComponent,\r\n IWishlistActionErrorResult,\r\n PriceComponent,\r\n RatingComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { IBuyboxCallbacks, IBuyboxState, ISmweBuyboxData, ISmweBuyboxProps, ISmweBuyboxResources } from '../';\r\nimport AddToCart, { IAddToCartFailureResult } from '../../../components/addtocart.component';\r\nimport { ElicitAmountSelector } from '../../../components/elicit-amountselector.component';\r\nimport { getConfigureErrors, getGenericError, getQuantityError } from '../utilities/error-utilities';\r\n\r\nexport function getBuyboxProductTitle(props: ISmweBuyboxProps<ISmweBuyboxData>): React.ReactElement | undefined {\r\n const {\r\n data: { product: { result: product } },\r\n config: { titleHeadingTag = 'h1' }\r\n } = props;\r\n\r\n return product && (\r\n <Heading\r\n className='ms-buybox__product-title'\r\n headingTag={titleHeadingTag}\r\n text={product.Name || ''}\r\n />\r\n );\r\n}\r\n\r\nexport function getBuyboxProductDescription(props: ISmweBuyboxProps<ISmweBuyboxData>): React.ReactElement | undefined {\r\n const {\r\n data: { product: { result: product } }\r\n } = props;\r\n\r\n return product && (\r\n <p className='ms-buybox__product-description'>{product.Description}</p>\r\n );\r\n}\r\n\r\nexport interface IBuyboxAddToCartViewProps {\r\n ContainerProps: INodeProps;\r\n errorBlock?: React.ReactNode;\r\n button?: React.ReactNode;\r\n}\r\nexport function getBuyboxAddToCart(\r\n props: ISmweBuyboxProps<ISmweBuyboxData>,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks,\r\n shouldNavigateToCart: boolean,\r\n productTypeAttribute: AttributeValue | undefined,\r\n attributes: AttributeValue[],\r\n displaySubscription: boolean = false\r\n): IBuyboxAddToCartViewProps {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: { product: { result: product } },\r\n resources\r\n } = props;\r\n\r\n const\r\n {\r\n quantity,\r\n errorState: {\r\n configureErrors,\r\n quantityError,\r\n otherError,\r\n errorHost\r\n },\r\n selectedProduct\r\n } = state;\r\n\r\n const onAddToCartFailed = (result: IAddToCartFailureResult) => {\r\n callbacks.updateErrorState({\r\n errorHost: 'ADDTOCART',\r\n quantityError: result.failureReason === 'OUTOFSTOCK' ? getQuantityError(result.stockLeft, resources) : undefined,\r\n configureErrors: result.failureReason === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources) : {},\r\n otherError: getGenericError(result, resources, context)\r\n });\r\n };\r\n\r\n const emailDeliveryModeCode: string | undefined = props.data && props.data.channelConfiguration.result && props.data.channelConfiguration.result.EmailDeliveryModeCode;\r\n const keyedInPrice = props.data.keyedInPrice.result;\r\n let cartText: string = resources.addToCartText;\r\n if (props.config.addToCartText) {\r\n cartText = props.config.addToCartText;\r\n }\r\n if (displaySubscription) {\r\n cartText = resources.smweBuybox__subscriptionBtnText;\r\n }\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__add-to-cart-container'\r\n },\r\n button: product && (state.productAvailability || product.ItemId?.toLowerCase() === 'giftcard') && (\r\n <AddToCart\r\n useElicitAddToCart={!!props.config.useForElicit}\r\n isSubscriptionItem={displaySubscription}\r\n addToCartText={cartText}\r\n outOfStockText={resources.outOfStockText}\r\n navigationUrl={getUrlSync('cart', context.actionContext)}\r\n quantity={quantity}\r\n data={{ product: product, emailDeliveryModeCode: emailDeliveryModeCode, keyedInPrice: keyedInPrice }}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n onError={onAddToCartFailed}\r\n getSelectedProduct={selectedProduct}\r\n shouldNavigateToCart={shouldNavigateToCart}\r\n productAvailability={state.productAvailability}\r\n productTypeAttribute={productTypeAttribute}\r\n productAttributes={attributes}\r\n />\r\n ),\r\n errorBlock: !displaySubscription && (\r\n <BuyboxErrorBlock\r\n configureErrors={configureErrors}\r\n quantityError={quantityError}\r\n otherError={otherError}\r\n resources={resources}\r\n showError={errorHost === 'ADDTOCART'}\r\n />\r\n )\r\n };\r\n}\r\n\r\nexport function getBuyboxProductPrice(props: ISmweBuyboxProps<ISmweBuyboxData>): React.ReactElement | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: { productPrice: { result: productPrice } },\r\n resources\r\n } = props;\r\n\r\n return productPrice && (\r\n <PriceComponent\r\n id={id}\r\n typeName={typeName}\r\n context={context}\r\n data={{ price: productPrice }}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n />\r\n );\r\n}\r\n\r\nexport function getBuyboxProductRating(props: ISmweBuyboxProps<ISmweBuyboxData>): React.ReactElement | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: { ratingsSummary: { result: ratingsSummary } },\r\n resources\r\n } = props;\r\n\r\n const ratingComponent = ratingsSummary && ratingsSummary.averageRating && (\r\n <RatingComponent\r\n avgRating={ratingsSummary.averageRating || 0}\r\n readOnly={true}\r\n ariaLabel={format(resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\r\n ratingCount={`${ratingsSummary.reviewsCount}`}\r\n data={{}}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n />\r\n ) || undefined;\r\n\r\n return ratingsSummary && ratingComponent && (\r\n ratingComponent\r\n );\r\n}\r\n\r\nexport interface IBuyboxAddToWishlistViewProps {\r\n ContainerProps: INodeProps;\r\n errorBlock?: React.ReactNode;\r\n button?: React.ReactNode;\r\n}\r\nexport function getBuyboxProductAddToWishlist(props: ISmweBuyboxProps<ISmweBuyboxData>, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxAddToWishlistViewProps | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: {\r\n product: { result: product },\r\n wishlists: { result: wishlists }\r\n },\r\n resources\r\n } = props;\r\n\r\n const\r\n {\r\n errorState: {\r\n configureErrors,\r\n quantityError,\r\n otherError,\r\n errorHost\r\n },\r\n selectedProduct\r\n } = state;\r\n\r\n const onAddToWishlistFailed = (result: IWishlistActionErrorResult) => {\r\n callbacks.updateErrorState({\r\n errorHost: 'WISHLIST',\r\n configureErrors: result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources) : {},\r\n });\r\n };\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__add-to-wishlist-container'\r\n },\r\n button: product && (\r\n <AddToWishlistComponent\r\n addToWishlistButtonText={resources.addToWishlistButtonText}\r\n removeFromWishlistButtonText={resources.removeFromWishlistButtonText}\r\n addToWishlistMessage={resources.addToWishlistMessage}\r\n removedFromWishlistMessage={resources.removedFromWishlistMessage}\r\n addItemToWishlistError={resources.addItemToWishlistError}\r\n removeItemFromWishlistError={resources.removeItemFromWishlistError}\r\n nameOfWishlist={resources.nameOfWishlist}\r\n data={{ product: product, wishlists: wishlists }}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n onError={onAddToWishlistFailed}\r\n getSelectedProduct={selectedProduct}\r\n />\r\n ),\r\n errorBlock: (\r\n <BuyboxErrorBlock\r\n configureErrors={configureErrors}\r\n quantityError={quantityError}\r\n otherError={otherError}\r\n resources={resources}\r\n showError={errorHost === 'WISHLIST'}\r\n />\r\n )\r\n };\r\n}\r\n\r\nexport interface IBuyboxProductQuantityViewProps {\r\n ContainerProps: INodeProps;\r\n LabelContainerProps: INodeProps;\r\n\r\n heading: React.ReactNode;\r\n errors?: React.ReactNode;\r\n\r\n input: React.ReactNode;\r\n}\r\nexport function getBuyboxProductQuantity(props: ISmweBuyboxProps<ISmweBuyboxData>, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxProductQuantityViewProps {\r\n const {\r\n resources,\r\n context: {\r\n app: {\r\n config: {\r\n maxQuantityForCartLineItem\r\n }\r\n }\r\n }\r\n } = props;\r\n\r\n const\r\n {\r\n quantity,\r\n errorState: {\r\n quantityError,\r\n }\r\n } = state;\r\n\r\n const onChange = (newValue: number) => {\r\n if (callbacks.updateQuantity) {\r\n callbacks.updateQuantity(newValue);\r\n }\r\n };\r\n\r\n const _updateQuantity = (event:React.ChangeEvent<HTMLSelectElement>): void => {\r\n if (callbacks.updateQuantity) {\r\n callbacks.updateQuantity(parseInt(event.target.value, 10));\r\n }\r\n };\r\n\r\n const showQuanatityAsDropdown: boolean = props.config.showQuantityAsDropdown || false;\r\n const availability = state.productAvailability?.AvailableQuantity && state.productAvailability.AvailableQuantity - props.context.app.config.outOfStockThreshold;\r\n const productAvailability = availability || state.quantity || maxQuantityForCartLineItem || 10;\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__quantity'\r\n },\r\n LabelContainerProps: {\r\n tag: 'label',\r\n className: 'ms-buybox__product-quantity-label',\r\n htmlFor: 'ms-buybox__product-quantity-input'\r\n },\r\n heading: (\r\n <div className='ms-buybox__product-quantity-label-heading'>{resources.productQuantityHeading}</div>\r\n ),\r\n errors: quantityError && (\r\n <span className='msc-alert msc-alert-noborder msc-alert-danger'>\r\n <span className='msi-exclamation-triangle' aria-hidden='true' />\r\n <span>{quantityError}</span>\r\n </span>\r\n ),\r\n input: (showQuanatityAsDropdown)? (\r\n _generateSelectMenu(productAvailability, quantity, _updateQuantity)\r\n ) : (!props.config.useForElicit) ? (\r\n <Quantity\r\n id='ms-buybox__product-quantity-input'\r\n max={maxQuantityForCartLineItem || 10}\r\n currentCount={quantity}\r\n onChange={onChange}\r\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\r\n />) : (\r\n <ElicitAmountSelector\r\n _updateQuantityRaw={onChange}\r\n currentQuantity={quantity}\r\n />\r\n )\r\n };\r\n}\r\n\r\nconst _generateMenu = (quantity: number) => {\r\n const nodes = [];\r\n\r\n for (let i = 1; i <= quantity; i++) {\r\n // tslint:disable-next-line:react-a11y-role-has-required-aria-props\r\n nodes.push(<option className='ms-buybox__quantity__select-menu__item' value={i}>{i}</option>);\r\n }\r\n\r\n return nodes;\r\n};\r\n\r\nconst _generateSelectMenu = (maxQuantity: number, currentQuantity: number, onchange:(event:React.ChangeEvent<HTMLSelectElement>) => void): JSX.Element => {\r\n return (\r\n <select className='ms-buybox__quantity__select-menu' value={currentQuantity} onChange={onchange}>\r\n {\r\n _generateMenu(maxQuantity)\r\n }\r\n </select>\r\n );\r\n};\r\n\r\nexport interface IBuyboxErrorBlockProps {\r\n configureErrors: { [configureId: string]: string | undefined };\r\n quantityError?: string;\r\n otherError?: string;\r\n resources: ISmweBuyboxResources;\r\n showError: boolean;\r\n}\r\nexport const BuyboxErrorBlock: React.FC<IBuyboxErrorBlockProps> = ({ showError, configureErrors, quantityError, otherError, resources }) => {\r\n let errorMessages: (string | undefined)[] = [];\r\n\r\n errorMessages = Object.values(configureErrors).filter(message => message !== undefined);\r\n\r\n if (quantityError) {\r\n errorMessages.push(quantityError);\r\n }\r\n\r\n if (otherError) {\r\n errorMessages.push(otherError);\r\n }\r\n\r\n const isMixedCart = errorMessages.find(item => {\r\n return item === resources.mixedCartErrorText;\r\n });\r\n\r\n return (\r\n <Alert isOpen={showError && errorMessages.length > 0} color='danger' assertive={true} aria-label={resources.buyboxErrorMessageHeader} >\r\n <div className='msc-alert__header' aria-hidden='true'>\r\n <span className='msi-exclamation-triangle' />\r\n {!isMixedCart && (<span>{resources.buyboxErrorMessageHeader}</span>)}\r\n </div>\r\n {errorMessages.map((message, index: number) => {\r\n if (message) {\r\n return (\r\n <div key={index} className='msc-alert__line'>{message}</div>\r\n );\r\n } else {\r\n return null;\r\n }\r\n })}\r\n </Alert>\r\n );\r\n};","import * as React from 'react';\r\n\r\nimport { Heading, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ProductDimension } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IBuyboxCallbacks, IBuyboxState } from '../smwe-buybox';\r\nimport { ISmweBuyboxData } from '../smwe-buybox.data';\r\nimport { ISmweBuyboxProps } from '../smwe-buybox.props.autogenerated';\r\nimport { getConfigureErrors } from '../utilities/error-utilities';\r\nimport { BuyboxErrorBlock } from './index';\r\n\r\nexport interface IFindInStoreFailureResult {\r\n missingDimensions?: ProductDimension[];\r\n}\r\n\r\nexport interface IBuyboxFindInStoreViewProps {\r\n storeSelector?: React.ReactNode;\r\n heading?: React.ReactNode;\r\n description?: React.ReactNode;\r\n errors?: React.ReactNode;\r\n button?: React.ReactNode;\r\n\r\n ContainerProps: INodeProps;\r\n\r\n openFindInStoreDialog(): Promise<void>;\r\n}\r\n\r\nexport function getBuyboxFindInStore(props: ISmweBuyboxProps<ISmweBuyboxData>, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxFindInStoreViewProps | undefined {\r\n const {\r\n data: {\r\n product: { result: product },\r\n storeSelectorStateManager: { result: storeSelectorStateManager },\r\n cart: { result: cart },\r\n deliveryOptions: { result: deliveryOptions }\r\n },\r\n slots: {\r\n storeSelector\r\n },\r\n resources,\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n }\r\n } = props;\r\n\r\n const\r\n {\r\n errorState: {\r\n configureErrors,\r\n quantityError,\r\n otherError,\r\n errorHost\r\n }\r\n } = state;\r\n\r\n const onClick = () => findInStoreOnClick(props, state, callbacks);\r\n\r\n if (!product || !storeSelectorStateManager || storeSelector.length === 0) {\r\n return undefined;\r\n }\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (!deliveryOptions ||\r\n !deliveryOptions.DeliveryOptions ||\r\n !PickupDeliveryModeCode ||\r\n !deliveryOptions.DeliveryOptions.find(option => option.Code === PickupDeliveryModeCode)) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__find-in-store'\r\n },\r\n\r\n storeSelector: storeSelector[0],\r\n\r\n openFindInStoreDialog: onClick,\r\n\r\n heading: (\r\n <Heading\r\n className='ms-buybox__find-in-store-heading'\r\n headingTag='h4'\r\n text={resources.findInStoreHeaderText}\r\n />\r\n ),\r\n\r\n description: (\r\n <p className='ms-buybox__find-in-store-description'>{resources.findInStoreDescriptionText}</p>\r\n ),\r\n\r\n errors: (\r\n <BuyboxErrorBlock\r\n configureErrors={configureErrors}\r\n quantityError={quantityError}\r\n otherError={otherError}\r\n resources={resources}\r\n showError={errorHost === 'FINDINSTORE'}\r\n />\r\n ),\r\n\r\n button: (\r\n <button\r\n className='ms-buybox__find-in-store-button'\r\n onClick={onClick}\r\n color='secondary'\r\n aria-label={resources.findInStoreLinkText}\r\n disabled={cart === undefined}\r\n >\r\n {resources.findInStoreLinkText}\r\n </button>\r\n )\r\n };\r\n}\r\n\r\nasync function findInStoreOnClick(props: ISmweBuyboxProps<ISmweBuyboxData>, state: IBuyboxState, callbacks: IBuyboxCallbacks): Promise<void> {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager },\r\n cart: { result: cart }\r\n },\r\n resources,\r\n context\r\n } = props;\r\n\r\n const {\r\n selectedProduct\r\n } = state;\r\n\r\n let dataProduct = props.data.product.result;\r\n\r\n if (selectedProduct) {\r\n dataProduct = (await selectedProduct) || dataProduct;\r\n }\r\n\r\n if (!dataProduct || !storeSelectorStateManager) {\r\n return;\r\n }\r\n\r\n const product = dataProduct;\r\n\r\n const missingDimensions = product.Dimensions && product.Dimensions.filter(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value));\r\n\r\n if (missingDimensions && missingDimensions.length > 0) {\r\n if (callbacks.updateErrorState) {\r\n callbacks.updateErrorState(\r\n {\r\n errorHost: 'FINDINSTORE',\r\n configureErrors: getConfigureErrors(missingDimensions, resources),\r\n }\r\n );\r\n }\r\n } else {\r\n storeSelectorStateManager.openDialog({\r\n product,\r\n onLocationSelected: orgUnitLocation => {\r\n if (!cart) {\r\n return Promise.resolve();\r\n }\r\n\r\n return cart.addProductToCart({ product: product, count: 1, location: orgUnitLocation })\r\n .then(result => {\r\n const navigationUrl = getUrlSync('cart', context.actionContext);\r\n\r\n if (result.status === 'SUCCESS' && navigationUrl) {\r\n window.location.assign(navigationUrl);\r\n }\r\n }).catch(error => {\r\n return;\r\n });\r\n }\r\n }).catch(error => {\r\n return;\r\n });\r\n }\r\n\r\n return;\r\n}","/**\r\n * Copyright (c) 2018 Microsoft Corporation\r\n */\r\nimport * as React from 'react';\r\nimport { IDropdownProps } from './';\r\nimport { IDropdownItemProps } from './dropdown.props';\r\n\r\ntype IDropdownState = {\r\n /**\r\n * @friendlyName selectedIndex\r\n * @description selected index\r\n */\r\n selectedIndex: string;\r\n};\r\n\r\n/**\r\n *\r\n * DropDown component\r\n * @extends {React.PureComponent<IDropdownProps, IDropdownState>}\r\n */\r\nexport class Dropdown extends React.PureComponent<IDropdownProps, IDropdownState> {\r\n private selectMenu: React.RefObject<HTMLSelectElement> = React.createRef<HTMLSelectElement>();\r\n\r\n constructor(props: IDropdownProps, state: IDropdownState) {\r\n super(props);\r\n this.state = {\r\n selectedIndex: ''\r\n };\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (this.selectMenu.current) {\r\n this.selectMenu.current.selectedIndex = 0;\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {dropdownId, dropdownList, dropdownName, dropdownToggleName} = this.props;\r\n\r\n return (\r\n <select\r\n id={`msc-dropdown__entry-${dropdownId}`}\r\n ref={this.selectMenu}\r\n aria-label={dropdownName}\r\n className='msc-dropdown__select'\r\n onChange={this._onChanged}\r\n >\r\n <option value='' aria-selected={this.state.selectedIndex === ''} selected={this.state.selectedIndex === ''} hidden disabled>{dropdownToggleName}</option>\r\n {dropdownList.map(\r\n (item: IDropdownItemProps) => item && <option value={item.id} key={item.id} selected={this.state.selectedIndex === item.id.toString()} aria-selected={this.state.selectedIndex === item.id.toString()}>{item.value}</option>\r\n )}\r\n </select>\r\n );\r\n }\r\n\r\n private _onChanged = async (event: React.ChangeEvent<HTMLSelectElement>) => {\r\n this.setState({selectedIndex: event.target.value});\r\n\r\n if (this.props.onChange) {\r\n await this.props.onChange({\r\n dropdownId: this.props.dropdownId,\r\n selectId: event.target.value,\r\n selectedValue: event.target.innerText\r\n });\r\n }\r\n };\r\n}","import * as React from 'react';\r\n\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IBuyboxCallbacks, IBuyboxState } from '../smwe-buybox';\r\nimport { ISmweBuyboxData } from '../smwe-buybox.data';\r\nimport { ISmweBuyboxProps, ISmweBuyboxResources } from '../smwe-buybox.props.autogenerated';\r\nimport { Dropdown, IDropdownItemProps, IDropdownOnSelectionChangeNotification } from './dropdown';\r\n\r\nexport interface IBuyboxProductConfigureProps {\r\n product: SimpleProduct;\r\n productDimensions: ProductDimensionFull[];\r\n resources: ISmweBuyboxResources;\r\n channelId: number;\r\n actionContext: IActionContext;\r\n errors: { [configureId: string]: string | undefined };\r\n\r\n dimensionChanged?(newValue: number): void;\r\n}\r\n\r\nexport interface IBuyboxProductConfigureDropdownViewProps {\r\n ContainerProps: INodeProps;\r\n LabelContainerProps: INodeProps;\r\n\r\n heading: React.ReactNode;\r\n errors?: React.ReactNode;\r\n\r\n select: React.ReactNode;\r\n}\r\n\r\nexport interface IBuyboxProductConfigureViewProps {\r\n ContainerProps: INodeProps;\r\n\r\n dropdowns: IBuyboxProductConfigureDropdownViewProps[];\r\n}\r\n\r\nexport function getBuyboxProductConfigure(props: ISmweBuyboxProps<ISmweBuyboxData>, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxProductConfigureViewProps | undefined {\r\n const {\r\n data: {\r\n product: {result: product },\r\n productDimensions: {result: productDimensions },\r\n },\r\n resources\r\n } = props;\r\n\r\n const\r\n {\r\n errorState: {\r\n configureErrors,\r\n }\r\n } = state;\r\n\r\n const\r\n {\r\n getDropdownName\r\n } = callbacks;\r\n\r\n if (!product || !productDimensions) {\r\n return undefined;\r\n }\r\n\r\n const onChanged = async (notification: IDropdownOnSelectionChangeNotification) =>\r\n _onChanged(notification, callbacks.dimensionSelectedAsync);\r\n\r\n const dropdowns = productDimensions.map(productDimensionFull => _mapProductDimensionFullToDropdownViewProps(productDimensionFull, resources, configureErrors, getDropdownName, onChanged));\r\n\r\n if (!dropdowns || dropdowns.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__configure'\r\n },\r\n dropdowns: dropdowns\r\n };\r\n}\r\n\r\nconst _onChanged = async (\r\n notification: IDropdownOnSelectionChangeNotification,\r\n dimensionChanged: (newValue: number, selectedDimensionValue: string) => Promise<void>,\r\n ): Promise<void> => {\r\n await dimensionChanged(+notification.dropdownId, notification.selectId);\r\n};\r\n\r\nconst _mapProductDimensionFullToDropdownViewProps =\r\n (\r\n productDimensionFull: ProductDimensionFull,\r\n resources: ISmweBuyboxResources,\r\n configureErrors: {[configureId: string]: string | undefined},\r\n getDropdownName: (dimensionType: number, resources: ISmweBuyboxResources) => string,\r\n dropdownCallback: (notification: IDropdownOnSelectionChangeNotification) => Promise<void>\r\n ): IBuyboxProductConfigureDropdownViewProps => {\r\n const dropdownName = getDropdownName(productDimensionFull.DimensionTypeValue, resources);\r\n const dropdownId = productDimensionFull.DimensionTypeValue.toString();\r\n const dropdownToggleName = resources.selectDimensionFormatString.replace('{0}', dropdownName.toLocaleLowerCase());\r\n const dropdownList: IDropdownItemProps[] = productDimensionFull.DimensionValues\r\n ? productDimensionFull.DimensionValues.map<IDropdownItemProps>(dimensionValue => {\r\n return {\r\n value: dimensionValue.Value || '',\r\n id: dimensionValue.RecordId.toString()\r\n };\r\n })\r\n : [];\r\n const errorMessage = configureErrors[dropdownId];\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__dropdown'\r\n },\r\n LabelContainerProps: {\r\n tag: 'label',\r\n className: 'ms_buybox__dropdown-quantity-label',\r\n htmlFor: `ms-buybox__dropown-quantity-input-${dropdownId}`\r\n },\r\n errors: errorMessage && (\r\n <span className='msc-alert msc-alert-noborder msc-alert-danger'>\r\n <span className='msi-exclamation-triangle' aria-hidden='true' />\r\n <span>{errorMessage}</span>\r\n </span>\r\n ),\r\n heading: (\r\n <div>{dropdownName}</div>\r\n ),\r\n select: (\r\n <Dropdown\r\n dropdownId={dropdownId}\r\n dropdownName={dropdownName}\r\n dropdownToggleName={dropdownToggleName}\r\n dropdownList={dropdownList}\r\n onChange={dropdownCallback}\r\n />\r\n )\r\n };\r\n};","import classnames from 'classnames';\r\nimport { reaction, toJS } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getDimensionsForSelectedVariant, GetDimensionsForSelectedVariantInput, getSelectedVariant, SelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport { CartLine, ProductAvailableQuantity, ProductDimensionValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { createProductAvailabilitiesForSelectedVariantInput, getProductAvailabilitiesForSelectedVariantAction, ProductAvailabilitiesForSelectedVariantInput } from '../../actions/get-product-availabilities-for-selected-variant.override.action';\r\nimport { publish } from '../../Utilities/analytics/analytics-dispatcher';\r\nimport CommerceAttributesParser from '../../Utilities/commerce-attributes-parser';\r\nimport { isProductSubscribable } from '../../Utilities/subscription-manager';\r\n\r\nimport {\r\n getBuyboxAddToCart,\r\n getBuyboxFindInStore,\r\n getBuyboxProductAddToWishlist,\r\n getBuyboxProductConfigure,\r\n getBuyboxProductDescription,\r\n getBuyboxProductPrice,\r\n getBuyboxProductQuantity,\r\n getBuyboxProductRating,\r\n getBuyboxProductTitle,\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxAddToWishlistViewProps,\r\n IBuyboxFindInStoreViewProps,\r\n IBuyboxProductConfigureViewProps,\r\n IBuyboxProductQuantityViewProps\r\n} from './components';\r\nimport { ISmweBuyboxData } from './smwe-buybox.data';\r\nimport { ISmweBuyboxProps, ISmweBuyboxResources } from './smwe-buybox.props.autogenerated';\r\n\r\nexport declare type IBuyboxErrorHost = 'ADDTOCART' | 'FINDINSTORE' | 'WISHLIST';\r\n\r\nexport interface IErrorState {\r\n errorHost?: IBuyboxErrorHost;\r\n\r\n configureErrors: { [configureId: string]: string | undefined };\r\n quantityError?: string;\r\n otherError?: string;\r\n}\r\n\r\nexport interface IBuyboxCallbacks {\r\n updateQuantity(newQuantity: number): void;\r\n updateErrorState(newErrorState: IErrorState): void;\r\n updateSelectedProduct(selectedProduct: Promise<SimpleProduct | null>): void;\r\n getDropdownName(dimensionType: number, resources: ISmweBuyboxResources): string;\r\n\r\n dimensionSelectedAsync(selectedDimensionId: number, selectedDimensionValueId: string): Promise<void>;\r\n}\r\n\r\nexport interface IBuyboxState {\r\n quantity: number;\r\n\r\n errorState: IErrorState;\r\n\r\n selectedDimensions: { [id: number]: string | undefined };\r\n\r\n selectedProduct?: Promise<SimpleProduct | null>;\r\n productAvailability?: ProductAvailableQuantity;\r\n}\r\n\r\nexport interface ISmweBuyboxViewProps extends ISmweBuyboxProps<ISmweBuyboxData> {\r\n state: IBuyboxState;\r\n ModuleProps: IModuleProps;\r\n ProductInfoContainerProps: INodeProps;\r\n MediaGalleryContainerProps: INodeProps;\r\n callbacks: IBuyboxCallbacks;\r\n mediaGallery?: React.ReactNode;\r\n productApellation?: React.ReactNode;\r\n acclaimRatings?: React.ReactNode;\r\n cookbookTagline?: React.ReactNode;\r\n content?: React.ReactNode[];\r\n productTitle?: React.ReactNode;\r\n productDescription?: React.ReactNode;\r\n productPrice?: React.ReactNode;\r\n productClubPrice?: React.ReactNode;\r\n title?: React.ReactNode;\r\n description?: React.ReactNode;\r\n rating?: React.ReactNode;\r\n price?: React.ReactNode;\r\n addToWishlist?: IBuyboxAddToWishlistViewProps;\r\n show?: Boolean;\r\n addToCart: IBuyboxAddToCartViewProps;\r\n subscriptionButton?: IBuyboxAddToCartViewProps;\r\n findInStore?: IBuyboxFindInStoreViewProps;\r\n quantity?: IBuyboxProductQuantityViewProps;\r\n configure?: IBuyboxProductConfigureViewProps;\r\n eventSchedule?: React.ReactNode;\r\n tastingNotes?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Buybox Module\r\n */\r\nclass SmweBuybox extends React.Component<ISmweBuyboxProps<ISmweBuyboxData>, IBuyboxState> {\r\n\r\n private buyboxCallbacks: IBuyboxCallbacks = {\r\n updateQuantity: (newQuantity: number): void => {\r\n const errorState = { ...this.state.errorState };\r\n errorState.quantityError = undefined;\r\n\r\n this.setState({ quantity: newQuantity, errorState: errorState });\r\n },\r\n updateErrorState: (newErrorState: IErrorState): void => {\r\n this.setState({ errorState: newErrorState });\r\n },\r\n updateSelectedProduct: (newSelectedProduct: Promise<SimpleProduct | null>): void => {\r\n this.setState({ selectedProduct: newSelectedProduct });\r\n },\r\n dimensionSelectedAsync: (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\r\n return this._dimensionSelected(selectedDimensionId, selectedDimensionValueId);\r\n },\r\n getDropdownName: (dimensionType: number, resources: ISmweBuyboxResources): string => {\r\n return this._getDropdownName(dimensionType, resources);\r\n }\r\n };\r\n\r\n constructor(props: ISmweBuyboxProps<ISmweBuyboxData>, state: IBuyboxState) {\r\n super(props);\r\n this.state = {\r\n errorState: {\r\n configureErrors: {}\r\n },\r\n quantity: 1,\r\n selectedProduct: undefined,\r\n selectedDimensions: {}\r\n };\r\n\r\n // This is fragile. It will only trigger is the cart isn't loaded initially.\r\n // If the cart is already loaded by the time this is constructed, this will never trigger and\r\n // the add to cart button will never appear!\r\n reaction(\r\n () => {\r\n return this.props.data.cart.result?.cart.CartLines;\r\n },\r\n async (cartLines) => {\r\n await this._updateProductAvailability(cartLines);\r\n },\r\n { delay: 500 }\r\n );\r\n }\r\n\r\n // Restoring quantity check on render\r\n // There's a chance this will conflict with the reaction version. Worst case, two calls will be initiated.\r\n // However, this module has worse issues. It has strayed too far from the core and won't support variants.\r\n public componentDidMount(): void {\r\n const { data } = this.props;\r\n\r\n if (data.cart.result?.cart) {\r\n this._updateProductAvailability(data.cart.result.cart.CartLines).catch(() => {\r\n console.error('Failed to fetch availability');\r\n });\r\n }\r\n\r\n // Analytics event emitter\r\n // tslint:disable-next-line: no-floating-promises\r\n Promise.all([data.product.result, data.productSpecificationData.result, data.categories])\r\n .then(() => {\r\n publish('productDetailView', {\r\n product: data.product.result,\r\n attributes: CommerceAttributesParser.getParsedAttributes(data.productSpecificationData.result || []),\r\n category: this._getCurrentCategory(),\r\n context: this.props.context,\r\n });\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity\r\n public render(): JSX.Element | null {\r\n const {\r\n slots: {\r\n mediaGallery,\r\n productApellation,\r\n content,\r\n productTitle,\r\n productPrice,\r\n productClubPrice,\r\n acclaimRatings,\r\n cookbookTagline,\r\n productDescription,\r\n eventSchedule\r\n },\r\n data: {\r\n product: { result: product }\r\n },\r\n config: { className = '' }\r\n } = this.props;\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n const attributeList = this.props.data && this.props.data.productSpecificationData && this.props.data.productSpecificationData.result;\r\n\r\n const canAddToCartAttribute = attributeList && attributeList.filter(\r\n attribute => attribute.Name! === 'Can add to cart'\r\n );\r\n\r\n const productTypeAttribute = attributeList && attributeList.find(\r\n attribute => attribute.Name === 'Product Type'\r\n );\r\n\r\n const productType = (productTypeAttribute?.TextValue)?.replace(/\\s+/g, '-').toLowerCase();\r\n const show = (canAddToCartAttribute && canAddToCartAttribute.length) ? canAddToCartAttribute[0].BooleanValue : true;\r\n const shouldNavigateToCart = this.props.config.shouldNavigateToCart;\r\n const viewProps: ISmweBuyboxViewProps = {\r\n ...(this.props as ISmweBuyboxProps<ISmweBuyboxData>),\r\n state: this.state,\r\n mediaGallery: mediaGallery && mediaGallery.length > 0 ? mediaGallery[0] : undefined,\r\n productApellation: productApellation && productApellation.length > 0 ? productApellation[0] : undefined,\r\n acclaimRatings: acclaimRatings && acclaimRatings.length > 0 ? acclaimRatings[0] : undefined,\r\n cookbookTagline: cookbookTagline && cookbookTagline.length > 0 ? cookbookTagline[0] : undefined,\r\n content: content && content.length > 0 ? content : undefined,\r\n productTitle: productTitle && productTitle.length > 0 ? productTitle[0] : undefined,\r\n productDescription: productDescription && productDescription.length > 0 ? productDescription[0] : undefined,\r\n eventSchedule: eventSchedule && eventSchedule.length > 0 ? eventSchedule[0] : undefined,\r\n productPrice: productPrice && productPrice.length > 0 ? productPrice[0] : undefined,\r\n productClubPrice: productClubPrice && productClubPrice.length > 0 ? productClubPrice[0] : undefined,\r\n tastingNotes: mediaGallery && mediaGallery.length > 1 ? mediaGallery[1] : undefined,\r\n show,\r\n ModuleProps: {\r\n moduleProps: this.props,\r\n className: classnames('ms-buybox', className)\r\n },\r\n ProductInfoContainerProps: {\r\n className: classnames('ms-buybox__content', productType)\r\n },\r\n MediaGalleryContainerProps: {\r\n className: 'ms-buybox__media-gallery'\r\n },\r\n callbacks: this.buyboxCallbacks,\r\n title: getBuyboxProductTitle(this.props),\r\n description: getBuyboxProductDescription(this.props),\r\n configure: getBuyboxProductConfigure(this.props, this.state, this.buyboxCallbacks),\r\n findInStore: getBuyboxFindInStore(this.props, this.state, this.buyboxCallbacks),\r\n price: getBuyboxProductPrice(this.props),\r\n addToCart: getBuyboxAddToCart(this.props, this.state, this.buyboxCallbacks, shouldNavigateToCart, productTypeAttribute, attributeList || []),\r\n subscriptionButton: (this._showSubscriptionButton) ? getBuyboxAddToCart(this.props, this.state, this.buyboxCallbacks, shouldNavigateToCart, productTypeAttribute, attributeList || [], true) : undefined,\r\n addToWishlist: getBuyboxProductAddToWishlist(this.props, this.state, this.buyboxCallbacks),\r\n rating: getBuyboxProductRating(this.props),\r\n quantity: getBuyboxProductQuantity(this.props, this.state, this.buyboxCallbacks),\r\n };\r\n\r\n return this.props.renderView(viewProps);\r\n }\r\n\r\n private get _showSubscriptionButton(): boolean {\r\n const availableQuantity = (this.state.productAvailability && this.state.productAvailability.AvailableQuantity) || 0;\r\n const stockLeft = Math.max(availableQuantity - this.props.context.app.config.outOfStockThreshold, 0);\r\n if (!stockLeft) { return false; }\r\n\r\n const attributes = this.props.data.productSpecificationData.result;\r\n return isProductSubscribable(attributes);\r\n }\r\n\r\n private _dimensionSelected = async (selectedDimensionId: number, selectedDimensionValue?: string): Promise<void> => {\r\n const {\r\n data: {\r\n product: { result: product },\r\n productDimensions: { result: productDimensions },\r\n },\r\n context: {\r\n actionContext,\r\n request: {\r\n apiSettings: {\r\n channelId\r\n }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const\r\n {\r\n selectedDimensions\r\n } = this.state;\r\n\r\n if (!product || !productDimensions) {\r\n return;\r\n }\r\n\r\n // Step 1: Update state to indicate which dimensions are selected\r\n const newSelectedDimensions: { [id: number]: string | undefined } = { ...selectedDimensions };\r\n newSelectedDimensions[selectedDimensionId] = selectedDimensionValue;\r\n\r\n this.setState({ selectedDimensions: newSelectedDimensions });\r\n\r\n // Step 2: Clear any errors indicating the dimension wasn't selected\r\n if (this.state.errorState.configureErrors[selectedDimensionId]) {\r\n const errorState = { ...this.state.errorState };\r\n errorState.configureErrors[selectedDimensionId] = undefined;\r\n\r\n this.setState({ errorState: errorState });\r\n }\r\n\r\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\r\n // over the information in data\r\n const mappedDimensions = productDimensions.map(dimension => {\r\n return {\r\n DimensionTypeValue: dimension.DimensionTypeValue,\r\n DimensionValue: this._updateDimensionValue(dimension, newSelectedDimensions[dimension.DimensionTypeValue]) || dimension.DimensionValue,\r\n ExtensionProperties: dimension.ExtensionProperties\r\n };\r\n }).filter(dimension => {\r\n return dimension && dimension.DimensionValue;\r\n });\r\n\r\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\r\n // so that places like add to cart can await it\r\n const selectedProduct = new Promise<SimpleProduct | null>(async (resolve, reject) => {\r\n const newProduct = (await getSelectedVariant(\r\n new SelectedVariantInput(\r\n product.MasterProductId ? product.MasterProductId : product.RecordId,\r\n channelId,\r\n mappedDimensions\r\n ),\r\n actionContext\r\n ));\r\n\r\n if (newProduct) {\r\n await getDimensionsForSelectedVariant(\r\n new GetDimensionsForSelectedVariantInput(\r\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\r\n channelId,\r\n mappedDimensions\r\n ),\r\n actionContext\r\n );\r\n }\r\n\r\n resolve(newProduct);\r\n });\r\n\r\n this.setState({ selectedProduct: selectedProduct });\r\n\r\n await selectedProduct;\r\n };\r\n\r\n private _updateDimensionValue = (productDimensionFull: ProductDimensionFull, newValueId: string | undefined): ProductDimensionValue | undefined => {\r\n if (newValueId && productDimensionFull.DimensionValues) {\r\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n private _getDropdownName = (dimensionType: number, resources: ISmweBuyboxResources): string => {\r\n switch (dimensionType) {\r\n case 1: // ProductDimensionType.Color\r\n return resources.productDimensionTypeColor;\r\n case 2: // ProductDimensionType.Configuration\r\n return resources.productDimensionTypeConfiguration;\r\n case 3: // ProductDimensionType.Size\r\n return resources.productDimensionTypeSize;\r\n case 4: // ProductDimensionType.Style\r\n return resources.productDimensionTypeStyle;\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n private async _updateProductAvailability(cartLines: CartLine[] | undefined): Promise<void> {\r\n let qtyInCart = 0;\r\n if (cartLines) {\r\n cartLines.map(cartline => {\r\n if (cartline.ProductId === this.props.data.product.result?.RecordId) {\r\n qtyInCart = qtyInCart + cartline.Quantity!;\r\n }\r\n });\r\n }\r\n const productAvailability = await getProductAvailabilitiesForSelectedVariantAction(\r\n createProductAvailabilitiesForSelectedVariantInput(this.props.context.actionContext) as ProductAvailabilitiesForSelectedVariantInput,\r\n this.props.context.actionContext\r\n );\r\n\r\n if (productAvailability) {\r\n const clonedProductAvailability = {\r\n AvailableQuantity: productAvailability.AvailableQuantity! - qtyInCart,\r\n ExtensionProperties: productAvailability.ExtensionProperties,\r\n ProductId: productAvailability.ProductId,\r\n UnitOfMeasure: productAvailability.UnitOfMeasure\r\n } as ProductAvailableQuantity;\r\n this.setState({ productAvailability: clonedProductAvailability });\r\n }\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _getCurrentCategory(): string {\r\n const categorySlug = this._getCategorySlug();\r\n\r\n // Attempt to locate category slug in the category hierarchy\r\n // Array.concat doesn't work with mobx Observables, so convert to JS first\r\n let categories = toJS(this.props.data.categories.result || []);\r\n while (categories.length) {\r\n // Pull an entry from the front or back of the list -- either is fine (the front may be marginally faster)\r\n const category = categories.shift();\r\n\r\n // Check for a match\r\n if (category!.Slug === categorySlug) {\r\n return category!.Name || categorySlug;\r\n }\r\n\r\n // No match, so add any children to the list to scan\r\n if (category!.Children && category!.Children.length) {\r\n categories = categories.concat(category!.Children); // Add new entries to the front or back of the list -- again it doesn't matter which\r\n }\r\n }\r\n\r\n // No match was found, so use the category slug as a fallback\r\n return categorySlug;\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Figure out the slug for the current category\r\n //----------------------------------------------------------\r\n private _getCategorySlug(): string {\r\n\r\n // Based on the page type (category or product) we want to remove a\r\n // different number of chunks of the URL\r\n const sliceIndexes = {\r\n '.c': -1,\r\n '.p': -2,\r\n };\r\n\r\n const currentUrl = window.location.pathname;\r\n\r\n // Use the last 2 chars of the pathname to determine if we're on a product (.p) or category (.c) page\r\n const suffix = currentUrl.slice(-2);\r\n\r\n if (sliceIndexes[suffix]) {\r\n // Slice off part of the current URL to find the category URL\r\n return currentUrl.split('/').slice(0, sliceIndexes[suffix]).join('/');\r\n }\r\n\r\n // We don't really know what to do here. Just use the current URL, even though it will probably fail.\r\n return currentUrl;\r\n }\r\n\r\n}\r\n\r\nexport default SmweBuybox;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxProductQuantityViewProps\r\n} from '@msdyn365-commerce-modules/buybox/dist/types';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport Table from 'reactstrap/lib/Table';\r\nimport { ISmweBuyboxViewProps } from './smwe-buybox';\r\n\r\nconst SmweBuyboxView: React.FC<ISmweBuyboxViewProps> = props => {\r\n const {\r\n ModuleProps,\r\n MediaGalleryContainerProps,\r\n ProductInfoContainerProps,\r\n addToCart,\r\n quantity,\r\n title,\r\n productDescription,\r\n productTitle,\r\n productPrice,\r\n productClubPrice,\r\n show,\r\n acclaimRatings,\r\n cookbookTagline,\r\n eventSchedule,\r\n subscriptionButton\r\n } = props;\r\n // @ts-ignore\r\n const tableClass: AsyncResult<string> = props.context.actionContext.get('String', 'Generic-SkuSelectorClasses');\r\n const isGiftCard = props.data.product && props.data.product.result ? props.data.product.result.ItemId?.toLowerCase() === 'giftcard' : false;\r\n\r\n return (\r\n <Module {...ModuleProps}>\r\n <Node {...MediaGalleryContainerProps}>{props.mediaGallery}</Node>\r\n <Node {...ProductInfoContainerProps}>\r\n {props.productApellation && (\r\n <div>{props.productApellation}</div>\r\n )}\r\n {title}\r\n {productDescription}\r\n {eventSchedule}\r\n {acclaimRatings}\r\n {cookbookTagline}\r\n {show && _renderTable({\r\n addToCart: addToCart,\r\n quantity: quantity,\r\n productPrice: productPrice,\r\n productClubPrice: productClubPrice,\r\n tableClass: tableClass,\r\n isGiftCard: isGiftCard,\r\n productTitle,\r\n subscriptionButton\r\n })}\r\n {props.content &&\r\n props.content.map(\r\n (contentSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {contentSlotData}\r\n </div>\r\n );\r\n }\r\n )}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nexport interface IRenderTable {\r\n subscriptionButton?: IBuyboxAddToCartViewProps;\r\n addToCart: IBuyboxAddToCartViewProps;\r\n quantity: IBuyboxProductQuantityViewProps | undefined;\r\n productTitle: React.ReactNode;\r\n productPrice: React.ReactNode;\r\n productClubPrice: React.ReactNode;\r\n isGiftCard: boolean;\r\n tableClass: AsyncResult<string>;\r\n}\r\n\r\nconst _renderTable = (props: IRenderTable) => {\r\n const { addToCart, quantity, productTitle, productPrice, productClubPrice, tableClass, isGiftCard, subscriptionButton } = props;\r\n\r\n return (\r\n <div className={`sku-selector-container row ${tableClass && tableClass.result}`}>\r\n <Table borderless responsive size='lg' role='presentation'>\r\n <thead>\r\n <tr>\r\n {productTitle && <th scope='col' className='sku-selector-product-title'>Product</th>}\r\n {productPrice && <th scope='col' className={`sku-selector-product-price ${isGiftCard ? 'price-width-adjust' : ''}`}>Price</th>}\r\n {!isGiftCard && productClubPrice && <th scope='col' className='sku-selector-product-price'>Club</th>}\r\n {quantity && <th scope='col' className='sku-selector-product-quantity'>QTY</th>}\r\n {addToCart && <th scope='col' className='sku-selector-add-to-cart' />}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n {productTitle && <td className='sku-selector-product-title'>{productTitle}</td>}\r\n {productPrice && <td className={`sku-selector-product-price ${isGiftCard ? 'price-width-adjust' : ''}`}>{productPrice}</td>}\r\n {!isGiftCard && productClubPrice && <td className='sku-selector-product-price'>{productClubPrice}</td>}\r\n {quantity && <td className={`sku-selector-product-quantity ${isGiftCard ? 'unselectable' : ''}`}>{_renderQuantity(quantity)}</td>}\r\n {addToCart && <td className='sku-selector-add-to-cart'>{_renderAddToCart(addToCart)}</td>}\r\n {subscriptionButton && <td className='sku-selector-add-to-cart'>{_renderAddToCart(subscriptionButton)}</td>}\r\n </tr>\r\n </tbody>\r\n </Table>\r\n </div>\r\n);};\r\n\r\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {errorBlock}\r\n {button}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, input, errors } = quantity;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {errors}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\nexport default SmweBuyboxView;\r\n","import { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\n\r\nexport interface IPickUpInStoreViewProps {\r\n callbacks: {\r\n toggleBopis(isBopisSelected: boolean): void;\r\n };\r\n defaultComponent?: React.ReactNode;\r\n orgUnitName?: string;\r\n isBopisSelected: boolean;\r\n ContainerProps: INodeProps;\r\n}\r\n\r\nexport interface IPickUpInStoreProps {\r\n cartline: CartLine;\r\n product: SimpleProduct;\r\n shipitText: string;\r\n pickUpInStoreText: string;\r\n changeStoreText: string;\r\n cartState: ICartState | undefined;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n orgUnitLocations?: OrgUnitLocation[] | undefined;\r\n deliveryOptions?: ProductDeliveryOptions;\r\n pickupDeliveryModeCode?: string;\r\n}\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\r\n const _onLocationChangedCallback = (orgUnitLocation: OrgUnitLocation, cartState: ICartState | undefined, cartline: CartLine) => {\r\n if(!cartState) {\r\n return Promise.resolve();\r\n }\r\n return cartState.updateCartLinePickupLocation({cartLineId: cartline.LineId!, location: orgUnitLocation})\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // do something\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n };\r\n\r\n const _toggleBOPIS = (isBopisSelected: boolean) => {\r\n const { storeSelectorStateManager, product, cartline, cartState } = props;\r\n\r\n if(isBopisSelected) {\r\n if(!storeSelectorStateManager) {\r\n return;\r\n }\r\n storeSelectorStateManager.openDialog({\r\n product,\r\n alreadySelectedLocation: {\r\n InventoryLocationId: cartline.FulfillmentStoreId\r\n },\r\n onLocationSelected: (orgUnitLocation) => {\r\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline);\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n } else {\r\n if(!cartState) {\r\n return;\r\n }\r\n cartline.DeliveryMode = '';\r\n cartline.FulfillmentStoreId = '';\r\n cartline.ShippingAddress = {};\r\n cartState.clearCartLinePickupLocation({cartLineId: cartline.LineId!})\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // do something\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n }\r\n };\r\n\r\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if(!orgUnitLocations || !fulfillmentStoreId || !(orgUnitLocations.length > 0)) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.InventoryLocationId === fulfillmentStoreId;\r\n });\r\n\r\n if(foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n } else {\r\n return fulfillmentStoreId;\r\n }\r\n };\r\n\r\n const _renderShippingMethod = (\r\n cartLine: CartLine,\r\n shipItText: string,\r\n pickupInStoretext: string,\r\n changeStoreText:string,\r\n orgUnitLocations: OrgUnitLocation[] | undefined):JSX.Element => {\r\n\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\r\n const bopisSelected = cartLine.FulfillmentStoreId ? true : false;\r\n\r\n return (\r\n // tslint:disable:react-this-binding-issue react-a11y-role-has-required-aria-props jsx-no-lambda\r\n <>\r\n <label className='msc-cart-line__bopis-shipping'>\r\n <input\r\n id={`ms-cart-bopis-ship-option-${cartLine.LineId}`}\r\n type='radio'\r\n name={`shippingType ${cartLine.LineId}`}\r\n onChange={() => {_toggleBOPIS(false);}}\r\n value={shipItText}\r\n checked={!bopisSelected}\r\n />\r\n {shipItText}\r\n </label>\r\n <label className='msc-cart-line__bopis-store-pickup'>\r\n <input\r\n id={`ms-cart-bopis-pickup-option-${cartLine.LineId}`}\r\n type='radio'\r\n name={`shippingType ${cartLine.LineId}`}\r\n onChange={() => {_toggleBOPIS(true);}}\r\n value={pickupInStoretext}\r\n checked={bopisSelected}\r\n />\r\n {pickupInStoretext}\r\n </label>\r\n {\r\n cartLine.FulfillmentStoreId ? (\r\n <div className='msc-cart-line__bopis__fullfilment'>\r\n <span className='msc-cart-line__bopis__fullfilment-store'>{orgUnitName}</span>\r\n <button className='msc-cart-line__bopis-changestore btn' onClick={() => {_toggleBOPIS(true);}}>{changeStoreText}</button>\r\n </div>\r\n ) : null\r\n }\r\n </>\r\n );\r\n };\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (!props.deliveryOptions ||\r\n !props.deliveryOptions.DeliveryOptions ||\r\n !props.pickupDeliveryModeCode ||\r\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n callbacks: {\r\n toggleBopis: _toggleBOPIS\r\n },\r\n defaultComponent: _renderShippingMethod(props.cartline, props.shipitText, props.pickUpInStoreText, props.changeStoreText, props.orgUnitLocations),\r\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\r\n isBopisSelected: props.cartline.FulfillmentStoreId ? true : false,\r\n ContainerProps: {\r\n className: 'msc-cart-line__bopis-container'\r\n }\r\n };\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, format } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n AddToWishlistComponent,\r\n ICartlineResourceString,\r\n IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport {\r\n IActionContext,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageSettings,\r\n ITelemetry\r\n} from '@msdyn365-commerce/core';\r\nimport { BaseCartState, getCartState, GlobalStateInput, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n CommerceList,\r\n OrgUnitLocation,\r\n ProductAvailableQuantity,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport SmweCartLine from '../../../components/cartlineitem.component';\r\nimport ProductType from '../../../Utilities/productType';\r\nimport {\r\n IPickUpInStoreViewProps,\r\n PickUpInStore\r\n} from './smwe-cart-pick-up-in-store';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n mixedCart: { [index: string]: boolean };\r\n cartLineErrors: { [index: string]: boolean };\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: ProductAvailableQuantity[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n /** GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n outOfStockThreshold: number;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n showImages: boolean | undefined;\r\n invalidProductError: string;\r\n outOfStockError: string;\r\n zeroAvailabilityError: string;\r\n showDiscountPercent?: boolean;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(\r\n result: IWishlistActionSuccessResult,\r\n cartlineId: CartLine\r\n ): void;\r\n updateCartLinesQuantitySuccessHandler(\r\n cartline: CartLine,\r\n quantity: number\r\n ): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n}\r\n\r\nconst _getProduct = (\r\n productId: number | undefined,\r\n products: SimpleProduct[]\r\n): SimpleProduct | undefined => {\r\n if (productId !== undefined && products) {\r\n return products.find(product => {\r\n return productId === product.RecordId;\r\n });\r\n }\r\n return undefined;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxCartlineQuantity: number,\r\n isStockCheckEnabled: boolean,\r\n productAvailability?: ProductAvailableQuantity\r\n) => {\r\n if (isStockCheckEnabled) {\r\n if (\r\n !productAvailability ||\r\n !productAvailability.AvailableQuantity ||\r\n productAvailability.AvailableQuantity <= 0\r\n ) {\r\n return 0;\r\n }\r\n return productAvailability.AvailableQuantity;\r\n }\r\n\r\n return maxCartlineQuantity;\r\n};\r\n\r\nconst _updateCartLine = (ctx: IActionContext, cartState: ICartState, cartLine: CartLine): void => {\r\n if (ctx && cartState) {\r\n updateCartLinesAsync({ callerContext: ctx }, cartState.cart.Id, [cartLine])\r\n .then(cart => {\r\n const cartInput = new GlobalStateInput<ICartState>(\r\n 'CARTSTATE',\r\n BaseCartState,\r\n ctx.requestContext.apiSettings);\r\n getCartState(ctx).then(newCart => {\r\n ctx.update(cartInput, newCart);\r\n // tslint:disable-next-line: no-floating-promises\r\n void newCart.refreshCart({});\r\n }).catch(e => ctx.telemetry.exception(e));\r\n }).catch(e => ctx.telemetry.exception(e));\r\n }\r\n};\r\n\r\n// tslint:disable:max-func-body-length\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n zeroAvailabilityError: boolean,\r\n cartState: ICartState | undefined,\r\n foundProductAvailability?: ProductAvailableQuantity,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions,\r\n): ICartlinesViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n moveToWishlistSuccessHandler,\r\n addToWishlistButtonText,\r\n removeFromWishlistButtonText,\r\n wishlists,\r\n defaultWishlistName,\r\n cartLineErrors,\r\n showDiscountPercent\r\n } = props;\r\n\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n foundProductAvailability\r\n );\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist =\r\n wishlists && wishlists.length > 0 && wishlists[0].Name\r\n ? wishlists[0].Name\r\n : defaultWishlistName;\r\n\r\n const onRemoveClickHandler = (event: React.MouseEvent<HTMLElement>) => {\r\n removeItemClickHandler(cartline);\r\n };\r\n\r\n return {\r\n cartline: (\r\n <SmweCartLine\r\n data={{\r\n cartLine: cartline,\r\n product: product\r\n }}\r\n currentQuantity={cartline.Quantity}\r\n maxQuantity={maxQuantity}\r\n isOutOfStock={\r\n product.ItemId?.toLowerCase() === props.context.request.channel?.GiftCardItemId?.toLowerCase() ? false :\r\n props.isStockCheckEnabled ? (maxQuantity <= 0 ? true : false) : false\r\n }\r\n gridSettings={gridSettings}\r\n imageSettings={imageSettings}\r\n id={id}\r\n typeName={typeName}\r\n productUrl={getProductUrlSync(\r\n product,\r\n props.context.actionContext,\r\n undefined\r\n )}\r\n context={context}\r\n resources={resources}\r\n key={index}\r\n isQuantityEditable={true}\r\n quantityOnChange={props.updateCartLinesQuantitySuccessHandler}\r\n primaryImageUrl={product.PrimaryImageUrl}\r\n remove={\r\n <Button\r\n className='msc-cart-line__remove-item'\r\n aria-label='Remove Cart Item'\r\n onClick={onRemoveClickHandler}\r\n title={removeButtonText}\r\n />\r\n }\r\n showImages={props.showImages}\r\n zeroAvailabilityError={zeroAvailabilityError}\r\n cartLineOnChange={_updateCartLine}\r\n cartState={cartState}\r\n cartLineErrors={cartLineErrors}\r\n showDiscountPercent={showDiscountPercent}\r\n />\r\n ),\r\n pickUpInStore: PickUpInStore({\r\n cartState: props.cartState,\r\n cartline: cartline,\r\n product: product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: foundProductDeliveryOptions,\r\n pickupDeliveryModeCode: props.pickupDeliveryModeCode\r\n }),\r\n remove: (\r\n <Button\r\n className='msc-cart-line__remove-item'\r\n aria-label='Remove Cart Item'\r\n onClick={onRemoveClickHandler}\r\n title={removeButtonText}\r\n >\r\n {removeButtonText}\r\n </Button>\r\n ),\r\n addToWishlist: isAuthenticated ? (\r\n <AddToWishlistComponent\r\n className={'msc-cart-line__add-to-wishlist'}\r\n addToWishlistButtonText={addToWishlistButtonText}\r\n removeFromWishlistButtonText={removeFromWishlistButtonText}\r\n context={context}\r\n id={id}\r\n key={cartline.LineId}\r\n typeName={typeName}\r\n nameOfWishlist={nameOfWishlist}\r\n cartline={cartline}\r\n showButtonText={true}\r\n showStatusMessage={false}\r\n showRemoveButton={false}\r\n showButtonTooltip={false}\r\n data={{\r\n wishlists: wishlists,\r\n product: product\r\n }}\r\n onSuccess={moveToWishlistSuccessHandler}\r\n />\r\n ) : (\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nconst _assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps,\r\n cartState: ICartState | undefined\r\n): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n return null;\r\n }\r\n\r\n const productTypeInit = new ProductType();\r\n\r\n cartlines.map(cartLine => {\r\n productTypeInit.check(cartLine?.DeliveryMode, props.context);\r\n });\r\n props.mixedCart.isMixedCart = productTypeInit.isMixedProduct();\r\n\r\n cartlines.map((cartline, index) => {\r\n const product = _getProduct(cartline.ProductId, products);\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find(\r\n productAvailability => {\r\n return productAvailability.ProductId! === cartline.ProductId;\r\n }\r\n );\r\n }\r\n let foundProductDeliveryOption;\r\n if (\r\n props.productDeliveryOptions &&\r\n props.productDeliveryOptions.length > 0\r\n ) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find(\r\n deliveryOption => {\r\n return (\r\n deliveryOption && deliveryOption.ProductId === cartline.ProductId\r\n );\r\n }\r\n );\r\n }\r\n\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n foundProductAvailability\r\n );\r\n\r\n let zeroAvailabilityError: boolean = false;\r\n const productType = new ProductType();\r\n productType.check(cartline?.DeliveryMode, props.context);\r\n\r\n // Check for zero availability\r\n if (productType.isWineProduct() && cartline.Quantity && (maxQuantity <= 0)) {\r\n cartline.Comment = props.zeroAvailabilityError;\r\n props.cartLineErrors[cartline.LineId!] = true;\r\n zeroAvailabilityError = true;\r\n\r\n // Check for insufficient availability\r\n } else if (productType.isWineProduct() && cartline.Quantity && (maxQuantity < cartline.Quantity)) {\r\n cartline.Comment = format(props.outOfStockError, maxQuantity);\r\n props.cartLineErrors[cartline.LineId!] = true;\r\n\r\n // Clear errors (except for gift cards -- gift cards must use the comment line for something else)\r\n } else if (cartline.ItemId?.toLowerCase() !== props.context.request.channel?.GiftCardItemId?.toLowerCase()) {\r\n cartline.Comment = '';\r\n props.cartLineErrors[cartline.LineId!] = false;\r\n }\r\n\r\n if (product) {\r\n reactNodes.push(\r\n _assembleNode(\r\n cartline,\r\n product,\r\n props,\r\n index,\r\n zeroAvailabilityError,\r\n cartState,\r\n foundProductAvailability,\r\n foundProductDeliveryOption\r\n )\r\n );\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component\r\n */\r\n\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines, cartState } = props;\r\n return _assembleCartlines(cartlines, products, props, cartState);\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { Button, format } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n appliedPromoCodeSubheadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\nexport interface IPromoCodeComponent extends IComponent<IPromoCodeProps> { }\r\n\r\nconst PromoCodeComponentActions = {\r\n};\r\n\r\ninterface IPromoCodeState {\r\n isCollapseOpen: boolean;\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass PromoCode extends React.PureComponent<IPromoCodeProps, IPromoCodeState> {\r\n\r\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\r\n super(props);\r\n this.state = {\r\n isCollapseOpen: false,\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <div>\r\n <div role='heading' aria-level={2} className='msc-promo-code-heading'>{this.props.promoCodeHeadingText}</div>\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n <p className={this.state.error ? 'msc-alert-danger' : ''}aria-live='assertive'>{this.state.error}</p>\r\n {this._renderAppliedPromoCode(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n private _onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const error = e.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: e.target.value, error: error,\r\n canApply: e.target.value ? true : false\r\n });\r\n };\r\n\r\n private _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart) {\r\n return;\r\n }\r\n const appliedPromo = this.state.promoCodeInputValue;\r\n\r\n cartState.addPromoCode({ promoCode: appliedPromo })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // show success text\r\n this.setState({ promoCodeInputValue: '', error: '', canApply: false});\r\n } else if (result.substatus === 'ALREADYADDED') {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n } else {\r\n this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n };\r\n\r\n private _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n return (\r\n // tslint:disable-next-line:react-this-binding-issue jsx-no-lambda\r\n <form onSubmit={e => {e.preventDefault(); this._applyPromotion(cartState); }} className='msc-promo-code__form-container'>\r\n <div className='msc-promo-code__group'>\r\n <input\r\n className='msc-promo-code__input-box'\r\n aria-label={promoPlaceholderText}\r\n onChange={this._onInputChange}\r\n value={this.state.promoCodeInputValue}\r\n placeholder={promoPlaceholderText}\r\n />\r\n <Button\r\n title={promoCodeApplyButtonText}\r\n className='msc-promo-code__apply-btn btn'\r\n // tslint:disable-next-line:jsx-no-lambda\r\n onClick={() => { this._applyPromotion(cartState); }}\r\n disabled={!this.state.canApply}\r\n >\r\n {promoCodeApplyButtonText}\r\n </Button>\r\n </div>\r\n </form>\r\n );\r\n };\r\n\r\n private _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const code = event.currentTarget.getAttribute('data-value') || '';\r\n cartState.removePromoCodes({\r\n promoCodes: [\r\n code\r\n ]\r\n })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n this.setState({ error: ''});\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText});\r\n });\r\n\r\n };\r\n private _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\r\n return;\r\n }\r\n let discountAmount = 0;\r\n for (const line of cartState.cart.CartLines) {\r\n if (line.DiscountLines) {\r\n for (const discountLine of line.DiscountLines) {\r\n if (discountLine.DiscountCode === code) {\r\n discountAmount += discountLine.DiscountCost!;\r\n }\r\n }\r\n }\r\n }\r\n return discountAmount * -1;\r\n };\r\n\r\n private _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\r\n return;\r\n }\r\n return (\r\n <div className='msc-promo-code__applied'>\r\n <div className='msc-promo-code__applied-heading'>{this.props.appliedPromoCodeHeadingText}</div>\r\n <div className='msc-promo-code__applied-subheading'>{this.props.appliedPromoCodeSubheadingText}</div>\r\n <div className='msc-promo-code__applied-lines'>\r\n {\r\n props.cart.cart.Coupons.map((coupon: Coupon) => {\r\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\r\n return (\r\n <div key={coupon.Code} className='msc-promo-code__line-container'>\r\n <div className='msc-promo-code__line-value'>\r\n <span className='msc-promo-code__line-value-code'>{coupon.Code}</span>\r\n <span className='msc-promo-code__line-value-price'>\r\n {this._calculateDiscount(coupon.Code || '', props.cart) === 0\r\n ? null\r\n : <>\r\n (\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: this._calculateDiscount(coupon.Code || '', props.cart)\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-promo-code__line-discount-value'}\r\n />\r\n )\r\n </>\r\n }\r\n </span>\r\n </div>\r\n <Button\r\n title={props.removePromoText}\r\n className={'msc-promo-code__line__btn-remove'}\r\n // tslint:disable-next-line:jsx-no-lambda react-this-binding-issue\r\n onClick={(event) => {this._removePromotion(props.cart, event);}}\r\n data-value={coupon.Code}\r\n aria-label={ariaLabel}\r\n >\r\n {props.removePromoText}\r\n </Button>\r\n </div>\r\n );\r\n })\r\n }\r\n </div>\r\n </div>\r\n );\r\n };\r\n}\r\n\r\n// @ts-ignore\r\nexport const PromoCodeComponent: React.FunctionComponent<IPromoCodeProps> = msdyn365Commerce.createComponent<IPromoCodeComponent>(\r\n 'PromoCode',\r\n { component: PromoCode, ...PromoCodeComponentActions }\r\n);","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport classnames from 'classnames';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\n\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Waiting } from '@msdyn365-commerce-modules/utilities';\r\nimport { IWishlistActionSuccessResult } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IDictionary, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { publish } from '../../Utilities/analytics/analytics-dispatcher';\r\nimport { getAttributesForCart, IAttributeBank } from '../../Utilities/get-product-attributes';\r\nimport { isLineSubscriptionLine } from '../../Utilities/subscription-manager';\r\n\r\nimport { CartLineItems, ICartlinesViewProps } from './components/smwe-cart-line-items';\r\nimport { PromoCodeComponent } from './components/smwe-promo-code';\r\nimport { ISmweCartData } from './smwe-cart.data';\r\nimport { ISmweCartProps } from './smwe-cart.props.autogenerated';\r\nimport getNotificationMessage, { createNotificationMessage } from '../../dataActions/get-notification-message';\r\nimport { NotificationType } from '../../models/notification-message-type';\r\n\r\nexport interface ICartViewProps extends ISmweCartProps<ISmweCartData> {\r\n className: string;\r\n title?: React.ReactNode;\r\n CartlinesWrapper: INodeProps;\r\n cartlines?: ICartlinesViewProps[];\r\n cart: ICartState | undefined;\r\n orderSummaryHeading: React.ReactNode;\r\n orderSummaryLineitems?: IOrderSummaryLines;\r\n OrderSummaryWrapper: INodeProps;\r\n OrderSummaryItems: INodeProps;\r\n checkoutAsGuestButton: React.ReactNode;\r\n checkoutAsSignInUserButton: React.ReactNode;\r\n storeSelector?: React.ReactNode;\r\n content?: React.ReactNode[];\r\n backToShoppingButton: React.ReactNode;\r\n waitingComponent: React.ReactNode;\r\n promoCode: React.ReactNode;\r\n cartLoadingStatus: string;\r\n cartDataResult: boolean;\r\n\r\n checkoutButtonDisabled: React.ReactNode;\r\n cartLineStatus: IDictionary<boolean>;\r\n mixedCart: IDictionary<boolean>;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n}\r\n\r\n/**\r\n *\r\n * Cart component\r\n * @extends {React.Component<ISmweCartProps<ISmweCartData>>}\r\n */\r\n@observer\r\nclass Cart extends React.Component<ISmweCartProps<ISmweCartData>> {\r\n\r\n private cartLinesInvalid: IDictionary<boolean> = {};\r\n private mixedCart: IDictionary<boolean> = {};\r\n\r\n private parsedProductAttributes: IAttributeBank = {};\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n public componentDidMount(): void {\r\n const { cart, products } = this.props.data;\r\n\r\n // Wait for all data to load (except attributes, which rely on product IDs)\r\n Promise.all([cart, products]).then(() => {\r\n\r\n // Fetch attributes, then generate the checkout event\r\n this._setProductAttributes().then(() => {\r\n this._generateCheckoutAnalyticsEvent(cart.result!, products.result!);\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n // tslint:disable-next-line:cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists }\r\n },\r\n context: {\r\n request: {\r\n user: {\r\n isAuthenticated,\r\n signInUrl\r\n },\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n },\r\n app: {\r\n routes\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n // Routes link is unable to choose a non-static page, so override is needed for now\r\n const backToShoppingUrlOverride = this.props.config.backToShoppingOverride?.destinationUrl;\r\n const backToShoppingUrl = backToShoppingUrlOverride || routes.backToShopping?.destinationUrl || getUrlSync('home', this.props.context.actionContext) || '';\r\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n\r\n const viewProps = {\r\n ...this.props,\r\n className: classnames('ms-cart'),\r\n title: <h1 className={'msc-cart__heading'}>{resources.cartTitle}</h1>,\r\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\r\n OrderSummaryWrapper: { className: 'msc-order-summary-wrapper' },\r\n OrderSummaryItems: { className: 'msc-order-summary__items' },\r\n cartlines: this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\r\n (\r\n CartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n cartLineErrors: this.cartLinesInvalid,\r\n mixedCart: this.mixedCart,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\r\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 10,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: 'asd',\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges,\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n showImages: this.props.config.showImages,\r\n invalidProductError: this.props.resources.invalidProductError,\r\n outOfStockError: this.props.resources.outOfStockError,\r\n zeroAvailabilityError: this.props.resources.zeroAvailabilityError,\r\n showDiscountPercent: this.props.config.showDiscountPercent\r\n })\r\n ) : undefined,\r\n promoCode: cart && (\r\n <PromoCodeComponent\r\n cart={cart}\r\n promoCodeHeadingText={resources.promoCodeHeadingText}\r\n promoPlaceholderText={resources.promoPlaceholderText}\r\n promoCodeApplyButtonText={resources.promoCodeApplyButtonText}\r\n appliedPromoCodeHeadingText={resources.appliedPromoCodeHeadingText}\r\n appliedPromoCodeSubheadingText={resources.appliedPromoCodeSubheadingText}\r\n collapseTimeOut={350}\r\n removePromoAriaLabelFormat={resources.removePromoAriaLabelFormat}\r\n removePromoText={resources.removePromoText}\r\n invalidPromoCodeErrorText={resources.invalidPromoCodeErrorText}\r\n failedToAddPromoCodeErrorText={resources.failedToAddPromoCodeErrorText}\r\n failedToRemovePromoCodeErrorText={resources.failedToRemovePromoCodeErrorText}\r\n duplicatePromoCodeErrorText={resources.duplicatePromotionErrorText}\r\n context={this.props.context}\r\n id={this.props.id}\r\n typeName={this.props.typeName}\r\n data={{}}\r\n />\r\n ),\r\n\r\n cart: this.props.data.cart.result,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry: this.props.telemetry,\r\n id: this.props.id,\r\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\r\n orderSummaryHeading: this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\r\n (\r\n <h2 className={'msc-order-summary__heading'}>{resources.orderSummaryTitle}</h2>\r\n ) : null,\r\n orderSummaryLineitems: cart && cart.cart && channelConfiguration && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\r\n (\r\n OrderSummary({\r\n cart: cart.cart,\r\n subTotalLabel: resources.itemsWithCountLabel,\r\n shippingLabel: resources.estimatedShippingLabel,\r\n taxLabel: resources.estimatedTaxLabel,\r\n orderTotalLabel: resources.orderTotal,\r\n totalDiscountsLabel: resources.totalDiscountsLabel,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n toBeCalculatedText: resources.yetToBeCalculatedText,\r\n freeText: resources.priceFree,\r\n channelConfiguration: channelConfiguration,\r\n telemetry: telemetry\r\n })\r\n ) :\r\n (\r\n undefined\r\n ),\r\n checkoutAsSignInUserButton: (!isCartEmpty) ?\r\n (\r\n <Button className={'msc-cart__btn-checkout'} href={checkoutURL} title={resources.checkoutButtonTitle}>{resources.checkoutButtonTitle}</Button>\r\n ) : null,\r\n checkoutAsGuestButton: (!isCartEmpty && !isAuthenticated) ?\r\n (\r\n <Button className={'msc-cart__btn-guestcheckout'} href={guestCheckoutUrl} title={resources.guestCheckoutButtonTitle}>{resources.guestCheckoutButtonTitle}</Button>\r\n ) : null,\r\n backToShoppingButton: <Button className={'msc-cart__btn-backtoshopping'} href={backToShoppingUrl} title={resources.backToShoppingButtonTitle}>{resources.backToShoppingButtonTitle}</Button>,\r\n storeSelector: this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\r\n content: this.props.slots.content && this.props.slots.content.length > 0 ? this.props.slots.content : null,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n waitingComponent: <Waiting className='msc-waiting-circular msc-waiting-lg' />,\r\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\r\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\r\n\r\n // DG: Additions to disable checkout button if an error is detected\r\n checkoutButtonDisabled: (\r\n <Button className={'msc-cart__btn-checkout'} href={checkoutURL} disabled={true} title={resources.checkoutButtonTitle}>{resources.checkoutButtonTitle}</Button>\r\n ),\r\n cartLineStatus: this.cartLinesInvalid,\r\n mixedCart: this.mixedCart\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\r\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n // tslint:disable-next-line: no-typeof-undefined\r\n if ((typeof window !== 'undefined') && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${signInUrl.indexOf('?') === -1 ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n };\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n\r\n if (this.props.data.cart.result) {\r\n this._generateRemovalAnalyticsEvent(cartlineToRemove);\r\n\r\n delete this.cartLinesInvalid[cartlineToRemove.LineId!.toString()];\r\n\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input).then(() => {\r\n getNotificationMessage( // eslint-disable-line\r\n createNotificationMessage({ message: \"Item Removed from cart successfully\", messagetype: NotificationType.success }),\r\n this.props.context.actionContext\r\n );\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _generateRemovalAnalyticsEvent(cartlineToRemove: CartLine): void {\r\n const productID = cartlineToRemove.ProductId;\r\n if (!productID) {\r\n return;\r\n }\r\n\r\n const product = this.props.data.products.result?.find(entry => entry.RecordId === productID);\r\n const attributes = this.parsedProductAttributes[productID];\r\n\r\n publish('removeFromCart', {\r\n product,\r\n quantity: cartlineToRemove.Quantity,\r\n attributes,\r\n subscription: isLineSubscriptionLine(cartlineToRemove),\r\n context: this.props.context\r\n });\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _generateCheckoutAnalyticsEvent(cart: ICartState, products: SimpleProduct[]): void {\r\n\r\n // Convert to the format the analytics module requires\r\n const mappedProducts = cart.cart.CartLines?.map(line => {\r\n const product = products.find(entry => entry.RecordId === line.ProductId);\r\n\r\n return {\r\n product,\r\n quantity: line.Quantity,\r\n attributes: this.parsedProductAttributes[line.ProductId!],\r\n subscription: isLineSubscriptionLine(line),\r\n discounts: line.DiscountLines,\r\n context: this.props.context,\r\n };\r\n });\r\n\r\n publish('checkout', {\r\n step: 0, // We're counting the cart page as step 0\r\n products: mappedProducts,\r\n coupon: cart.cart.Coupons?.map(coupon => coupon.Code).join(','),\r\n });\r\n }\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n };\r\n\r\n private async _setProductAttributes(): Promise<void> {\r\n const cart = this.props.data.cart?.result?.cart;\r\n if (cart && cart.CartLines) {\r\n this.parsedProductAttributes = await getAttributesForCart(cart?.CartLines, this.props.context.actionContext);\r\n }\r\n }\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number) => {\r\n if (this.props.data.cart.result) {\r\n delete this.cartLinesInvalid[cartlineToUpdate.LineId!.toString()];\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n };\r\n}\r\n\r\nexport default Cart;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Alert, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IDictionary } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ICartlinesViewProps } from './components/smwe-cart-line-items';\r\nimport { ICartViewProps } from './smwe-cart';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean,\r\n itemsTitle: string,\r\n qtyTitle: string,\r\n unitPriceTitle: string,\r\n totalTitle: string\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus}</>;\r\n }\r\n if (cartLines) {\r\n return (\r\n <table>\r\n <thead>\r\n <tr className='cart-lineitems-header'>\r\n <th scope='col' className='header-items'>{itemsTitle}</th>\r\n <th scope='col' className='header-qty'>{qtyTitle}</th>\r\n <th scope='col' className='header-unitprice'>{unitPriceTitle}</th>\r\n <th scope='col' className='header-total'>{totalTitle}</th>\r\n </tr>\r\n </thead>\r\n <tbody className='cart-lineitems-container'>\r\n <div>\r\n {cartLines.map((cartLine, index) => {\r\n return (\r\n <div className='msc-cart-lines-item' key={index}>\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n <Node {...cartLine.pickUpInStore.ContainerProps}>\r\n {cartLine.pickUpInStore.defaultComponent}\r\n </Node>\r\n ) : null}\r\n {cartLine.addToWishlist}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </tbody>\r\n </table>\r\n );\r\n } else {\r\n return cartDataResult ? (\r\n <div className='msc-cart__empty-cart'>\r\n <p className='msc-cart-line'>{cartEmptyText}</p>\r\n {backToShoppingButton}\r\n </div>\r\n ) : (\r\n <>{waitingComponent}</>\r\n );\r\n }\r\n};\r\n\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n return (\r\n <Node {...OrderSummaryItems}>\r\n {orderSummaryLines.subtotal}\r\n <div className='sr-only'></div>\r\n {orderSummaryLines.shipping}\r\n <div className='sr-only'></div>\r\n {orderSummaryLines.tax}\r\n <div className='sr-only'></div>\r\n {orderSummaryLines.totalDiscounts\r\n ? orderSummaryLines.totalDiscounts\r\n : null}\r\n <div className='sr-only'></div>\r\n {orderSummaryLines.orderTotal}\r\n <div className='sr-only'></div>\r\n <p className='cart-order-summary-asterix'>{props.resources.conditionsText}</p>\r\n </Node>\r\n );\r\n};\r\n\r\n// Detect invalid items in the cart. Items are flagged externally via the Comment field\r\nconst _isInvalidCart = (cartLinesInvalid: IDictionary<boolean>): boolean => {\r\n\r\n for (const lineId of Object.keys(cartLinesInvalid)) {\r\n if (cartLinesInvalid[lineId]) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n//==================================================\r\n//==================================================\r\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => {\r\n const preventCheckout = _isInvalidCart(props.cartLineStatus) || props.mixedCart.isMixedCart;\r\n\r\n return (\r\n <div\r\n className={props.className}\r\n id={props.id}\r\n {...props.renderModuleAttributes(props)}\r\n >\r\n {props.title}\r\n <Alert isOpen={props.cartlines !== undefined && props.mixedCart && props.mixedCart.isMixedCart} className='cart-error' color='danger' assertive={true} >\r\n <div className='cart-error-wrapper'>\r\n <div className='msc-alert__header' aria-hidden='true'>\r\n <span className='msi-exclamation-triangle' />\r\n <span>{props.resources.mixModeCartError}</span>\r\n </div>\r\n </div>\r\n </Alert>\r\n <Node {...props.CartlinesWrapper}>\r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult,\r\n props.resources.itemsTitle,\r\n props.resources.qtyTitle,\r\n props.resources.unitPriceTitle,\r\n props.resources.totalTitle\r\n )}\r\n </Node>\r\n {props.content &&\r\n props.content.map(\r\n (contentSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {contentSlotData}\r\n </div>\r\n );\r\n }\r\n )}\r\n {props.orderSummaryHeading && (\r\n <Node {...props.OrderSummaryWrapper}>\r\n {_renderOrderSummarylines(\r\n props.orderSummaryLineitems,\r\n props.OrderSummaryItems,\r\n props\r\n )}\r\n <Node className='checkout-btn-wrap'>\r\n {props.backToShoppingButton}\r\n {preventCheckout ? props.checkoutButtonDisabled : props.checkoutAsSignInUserButton}\r\n </Node>\r\n <div className='promo-code-wrap'>\r\n {props.promoCode}\r\n </div>\r\n </Node>\r\n )}\r\n {props.storeSelector}\r\n </div>\r\n );\r\n};\r\n\r\nexport default CartView;","\r\n/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\nexport interface ICheckoutDeliveryOptionsDescriptionProps {\r\n description?: string;\r\n}\r\n\r\n/**\r\n *\r\n * AddPaymentForm SFC\r\n * @extends {React.FC<ICheckoutDeliveryOptionsDescriptionProps>}\r\n */\r\nconst CheckoutDeliveryOptionsDescription: React.FC<ICheckoutDeliveryOptionsDescriptionProps> = ({\r\n description\r\n}) => {\r\n if (!description) {\r\n return null;\r\n }\r\n\r\n return <span className='ms-checkout-delivery-options__description'>{description}</span>;\r\n};\r\n\r\nexport default CheckoutDeliveryOptionsDescription;","\r\n/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\nexport interface ICheckoutDeliveryOptionsErrorMessageProps {\r\n message?: string;\r\n}\r\n\r\n/**\r\n *\r\n * AddPaymentForm SFC\r\n * @extends {React.FC<ICheckoutDeliveryOptionsErrorMessageProps>}\r\n */\r\nconst CheckoutDeliveryOptionsErrorMessage: React.FC<ICheckoutDeliveryOptionsErrorMessageProps> = ({\r\n message\r\n}) => {\r\n if (!message) {\r\n return null;\r\n }\r\n\r\n return (\r\n <p className='ms-checkout-delivery-options__error-message'>{message}</p>\r\n );\r\n\r\n};\r\n\r\nexport default CheckoutDeliveryOptionsErrorMessage;","\r\n/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\nexport interface ICheckoutDeliveryOptionsErrorTitleProps {\r\n title?: string;\r\n}\r\n\r\n/**\r\n *\r\n * AddPaymentForm SFC\r\n * @extends {React.FC<ICheckoutDeliveryOptionsErrorTitleProps>}\r\n */\r\nconst CheckoutDeliveryOptionsErrorTitle: React.FC<ICheckoutDeliveryOptionsErrorTitleProps> = ({\r\n title\r\n}) => {\r\n if (!title) {\r\n return null;\r\n }\r\n\r\n return (\r\n <p className='ms-checkout-delivery-options__error-title'>{title}</p>\r\n );\r\n\r\n};\r\n\r\nexport default CheckoutDeliveryOptionsErrorTitle;","\r\n/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\nexport interface ICheckoutDeliveryOptionsRadioButtonProps {\r\n isChecked: boolean;\r\n value?: string;\r\n ariaSetSize: number;\r\n ariaPosInSet: number;\r\n ariaLabel?: string;\r\n onChange(event: React.ChangeEvent<HTMLInputElement>): void;\r\n}\r\n\r\n/**\r\n *\r\n * AddPaymentForm SFC\r\n * @extends {React.FC<ICheckoutDeliveryOptionsRadioButtonProps>}\r\n */\r\nconst CheckoutDeliveryOptionsRadioButton: React.FC<ICheckoutDeliveryOptionsRadioButtonProps> = ({\r\n isChecked,\r\n value,\r\n ariaSetSize,\r\n ariaPosInSet,\r\n ariaLabel,\r\n onChange\r\n}) => {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n return (\r\n <input\r\n className='ms-checkout-delivery-options__input-radio'\r\n checked={isChecked}\r\n aria-checked={isChecked}\r\n type='radio'\r\n value={value}\r\n name='deliveryOptions'\r\n onChange={onChange}\r\n />\r\n );\r\n};\r\n\r\nexport default CheckoutDeliveryOptionsRadioButton;\r\n","/* eslint-disable @typescript-eslint/no-floating-promises */\r\n/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport classname from 'classnames';\r\nimport get from 'lodash/get';\r\nimport { action, observable, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport { Button, IModuleProps, INodeProps, Waiting } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getDeliveryOptionsAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport {\r\n Address, CartLine, DeliveryOption\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nimport ProductType from '../../Utilities/productType';\r\nimport DescriptionComponent from './components/smwe-checkout-delivery-options.description';\r\nimport ErrorMessageComponent from './components/smwe-checkout-delivery-options.error-message';\r\nimport ErrorTitleComponent from './components/smwe-checkout-delivery-options.error-title';\r\nimport RadioButtonComponent from './components/smwe-checkout-delivery-options.radio-button';\r\nimport { ISmweCheckoutDeliveryOptionsData } from './smwe-checkout-delivery-options.data';\r\nimport { ISmweCheckoutDeliveryOptionsProps } from './smwe-checkout-delivery-options.props.autogenerated';\r\n\r\nexport interface ICheckoutDeliveryOptionsModuleProps extends ISmweCheckoutDeliveryOptionsProps<ISmweCheckoutDeliveryOptionsData>, IModuleStateProps { }\r\n\r\nexport interface ICheckoutDeliveryOption {\r\n DeliveryOption: INodeProps;\r\n description?: React.ReactNode;\r\n price?: React.ReactNode;\r\n}\r\n\r\nexport interface ICheckoutDeliveryOptionEdit extends ICheckoutDeliveryOption {\r\n code: string;\r\n radioButton?: React.ReactNode;\r\n}\r\n\r\nexport interface ICheckoutDeliveryOptionsList {\r\n DeliveryOptionsList: INodeProps;\r\n list: ICheckoutDeliveryOptionEdit[];\r\n}\r\n\r\nexport interface ICheckoutDeliveryOptionsError {\r\n Error: INodeProps;\r\n title: React.ReactNode;\r\n message: React.ReactNode;\r\n}\r\n\r\nexport interface ICheckoutDeliveryOptionsViewState {\r\n isLoading: boolean;\r\n isError: boolean;\r\n isShowList: boolean;\r\n isShowSelected: boolean;\r\n isShowSaveButton: boolean;\r\n isShowEditButton: boolean;\r\n isShowCancelButton: boolean;\r\n}\r\n\r\nexport interface ICheckoutDeliveryOptionsViewProps extends ISmweCheckoutDeliveryOptionsProps<{}> {\r\n CheckoutDeliveryOptions: IModuleProps;\r\n selectedItemId: string;\r\n deliveryOptionsData: DeliveryOption[];\r\n isLoading: boolean;\r\n errorMessageData: string;\r\n viewState: ICheckoutDeliveryOptionsViewState;\r\n deliveryOptions?: ICheckoutDeliveryOptionsList;\r\n deliveryOptionSelected?: ICheckoutDeliveryOption;\r\n errorMessage?: ICheckoutDeliveryOptionsError;\r\n waiting?: React.ReactNode;\r\n saveButton?: React.ReactNode;\r\n editButton?: React.ReactNode;\r\n cancelButton?: React.ReactNode;\r\n checkoutState?: ICheckoutState;\r\n onDeliveryOptionChange(event: React.ChangeEvent<HTMLInputElement>): void;\r\n onSave(): void;\r\n onEdit(): void;\r\n onCancel(): void;\r\n}\r\n\r\n/**\r\n *\r\n * CheckoutDeliveryOptions component\r\n * @extends {React.Component<ISmweCheckoutDeliveryOptionsProps<ISmweCheckoutDeliveryOptionsData>>}\r\n */\r\n// @ts-ignore\r\n@withModuleState\r\n@observer\r\nclass CheckoutDeliveryOptions extends React.Component<ICheckoutDeliveryOptionsModuleProps> {\r\n @observable private selectedItemId: string = '';\r\n @observable private deliveryOptions: DeliveryOption[] = [];\r\n @observable private isLoading: boolean = false;\r\n @observable private errorMessage?: string;\r\n\r\n public async componentDidMount(): Promise<void> {\r\n this.props.data.checkout.then(async() => {\r\n await this.init();\r\n }).catch(e => this.props.telemetry.exception(e));\r\n\r\n this.loadDeliveryOptions();\r\n\r\n // @ts-ignore: Compiler not reconizing condition check for function params\r\n reaction(\r\n () => this.props.data.checkout.result?.shippingAddress,\r\n async () => {\r\n await this.loadDeliveryOptions();\r\n this.props.moduleState.setIsCancellable(false);\r\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\r\n }\r\n );\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n if (!this.canShip()) {\r\n return null;\r\n }\r\n\r\n const {\r\n moduleState: { isReady, isUpdating, hasError }\r\n } = this.props;\r\n const isError = !this.isLoading && hasError;\r\n const isShowList = !this.isLoading && !hasError && isUpdating;\r\n const isShowSelected = !this.isLoading && !hasError && isReady;\r\n\r\n const viewProps = {\r\n ...this.props,\r\n onDeliveryOptionChange: this.onDeliveryOptionChange,\r\n selectedItemId: this.selectedItemId,\r\n deliveryOptionsData: this.deliveryOptions,\r\n isLoading: this.isLoading,\r\n errorMessageData: this.errorMessage,\r\n viewState: {\r\n isLoading: this.isLoading,\r\n isError: isError,\r\n isShowList: isShowList,\r\n isShowSelected: isShowSelected,\r\n isShowSaveButton: isShowList && !this.props.moduleState.hasExternalSubmitGroup,\r\n isShowEditButton: isShowSelected && !this.props.moduleState.hasExternalSubmitGroup,\r\n isShowCancelButton: isShowList && !this.props.moduleState.hasExternalSubmitGroup && !!this.getSavedDeliveryOption()\r\n },\r\n CheckoutDeliveryOptions: {\r\n moduleProps: this.props,\r\n className: classname('ms-checkout-delivery-options', this.props.config.className)\r\n },\r\n deliveryOptions: {\r\n // @ts-ignore\r\n DeliveryOptionsList: { className: 'ms-checkout-delivery-options__list' },\r\n list: this.getDeliveryOptionList()\r\n },\r\n deliveryOptionSelected: this.getDeliveryOptionSelected(),\r\n errorMessage: this.getErrorMessage(),\r\n waiting: <Waiting />,\r\n saveButton: this.getSaveButton(),\r\n editButton: this.getEditButton(),\r\n cancelButton: this.getCancelButton(),\r\n checkoutState: this.props.data.checkout.result,\r\n onSave: this.onSave,\r\n onEdit: this.onEdit,\r\n onCancel: this.onCancel\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n @action\r\n private init = async (): Promise<void> => {\r\n this.props.moduleState.init({\r\n onEdit: this.onEdit,\r\n onCancel: this.onCancel,\r\n onSubmit: this.onSubmit,\r\n status: this.canShip() ? 'updating' : 'disabled'\r\n });\r\n await this.loadDeliveryOptions();\r\n };\r\n\r\n private canShip = (): boolean => {\r\n return this.getCartLinesForShipping().length > 0;\r\n };\r\n\r\n private getDeliveryOptionSelected = (): ICheckoutDeliveryOption | null => {\r\n const selectedItem = this.deliveryOptions.find(deliveryOption => deliveryOption.Code === this.selectedItemId);\r\n if (!selectedItem) {\r\n return null;\r\n }\r\n\r\n const { id, typeName, context } = this.props;\r\n const { priceFree } = this.props.resources;\r\n const price = get(selectedItem, 'ShippingChargeAmount', 0);\r\n\r\n // @ts-ignore\r\n return {\r\n // @ts-ignore\r\n DeliveryOption: { className: 'ms-checkout-delivery-options__option-selected' },\r\n description: <DescriptionComponent {...{ description: selectedItem.Description }} />,\r\n price: <PriceComponent id={id} typeName={typeName} context={context} className='ms-checkout-delivery-options__price' data={{price: { CustomerContextualPrice: price }}} freePriceText={priceFree} />\r\n };\r\n };\r\n\r\n private getErrorMessage = (): ICheckoutDeliveryOptionsError => {\r\n const { errorMessageTitle } = this.props.resources;\r\n return {\r\n // @ts-ignore\r\n CheckoutDeliveryOptionsError: { tag: 'span', className: 'ms-address-form__error', role: 'alert', 'aria-live': 'assertive' },\r\n title: <ErrorTitleComponent {...{ title: errorMessageTitle }} />,\r\n message: <ErrorMessageComponent {...{ message: this.errorMessage }} />\r\n };\r\n };\r\n\r\n private getDeliveryOptionList = (): ICheckoutDeliveryOptionEdit[] => {\r\n const count = this.deliveryOptions.length - 1;\r\n const { priceFree } = this.props.resources;\r\n const { id, typeName, context } = this.props;\r\n\r\n // @ts-ignore\r\n return this.deliveryOptions.map((deliveryOption: DeliveryOption, index: number) => {\r\n return {\r\n // @ts-ignore\r\n DeliveryOption: { className: 'ms-checkout-delivery-options__option' },\r\n code: deliveryOption.Code || '',\r\n radioButton: (\r\n <RadioButtonComponent\r\n {\r\n ...{\r\n isChecked: deliveryOption.Code === this.selectedItemId,\r\n value: deliveryOption.Code,\r\n ariaSetSize: count,\r\n ariaPosInSet: index + 1,\r\n ariaLabel: `${deliveryOption.Description} ${priceFree}`,\r\n onChange: this.onDeliveryOptionChange\r\n }\r\n }\r\n />\r\n ),\r\n description: (\r\n <DescriptionComponent\r\n {\r\n ...{\r\n description: deliveryOption.Description\r\n }\r\n }\r\n />\r\n ),\r\n price: (\r\n <PriceComponent\r\n id={id}\r\n typeName={typeName}\r\n context={context}\r\n className='ms-checkout-delivery-options__price'\r\n data={{ price: { CustomerContextualPrice: get(deliveryOption, 'ShippingChargeAmount', 0) }}}\r\n freePriceText={priceFree}\r\n />\r\n )\r\n };\r\n });\r\n };\r\n\r\n private getSaveButton = (): React.ReactNode => {\r\n const { saveBtnLabel = 'Save' } = this.props.resources;\r\n return (\r\n <Button\r\n className='ms-checkout-delivery-options__btn-save'\r\n title={saveBtnLabel}\r\n color='primary'\r\n disabled={!this.selectedItemId}\r\n onClick={this.onSave}\r\n >\r\n {saveBtnLabel}\r\n </Button>\r\n );\r\n };\r\n\r\n private getEditButton = (): React.ReactNode => {\r\n const { editBtnLabel = 'Change' } = this.props.resources;\r\n return (\r\n <Button\r\n className='ms-checkout-delivery-options__btn-edit'\r\n title={editBtnLabel}\r\n color='primary'\r\n onClick={this.onEdit}\r\n >\r\n {editBtnLabel}\r\n </Button>\r\n );\r\n };\r\n\r\n private getCancelButton = (): React.ReactNode => {\r\n const { cancelBtnLabel = 'Cancel' } = this.props.resources;\r\n return (\r\n <Button\r\n className='ms-checkout-delivery-options__btn-cancel'\r\n title={cancelBtnLabel}\r\n color='secondary'\r\n onClick={this.onCancel}\r\n >\r\n {cancelBtnLabel}\r\n </Button>\r\n );\r\n };\r\n\r\n private setError = (errorMessage: string): void => {\r\n this.props.telemetry.error(errorMessage);\r\n this.props.moduleState.setHasError(true);\r\n this.props.moduleState.onUpdating();\r\n this.errorMessage = errorMessage;\r\n };\r\n\r\n private clearError = (): void => {\r\n this.props.moduleState.setHasError(false);\r\n this.errorMessage = undefined;\r\n };\r\n\r\n private onSave = (): void => {\r\n this.onSubmit();\r\n };\r\n\r\n private readonly onEdit = async (): Promise<void> => {\r\n this.props.telemetry.information('Delivery options onEdit is called.');\r\n this.onUpdating();\r\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\r\n };\r\n\r\n private readonly onSubmit = async (): Promise<void> => {\r\n this.props.telemetry.information('Delivery options onSubmit is called.');\r\n // tslint:disable-next-line:no-floating-promises\r\n await this.updateCartDeliverySpecification(this.selectedItemId);\r\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\r\n };\r\n\r\n private readonly onCancel = async(): Promise<void> => {\r\n // Reset to the saved value\r\n const savedDeliveryOption = this.getSavedDeliveryOption();\r\n if (savedDeliveryOption) {\r\n this.selectedItemId = savedDeliveryOption;\r\n this.onReady();\r\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\r\n } else {\r\n this.onUpdating();\r\n }\r\n };\r\n\r\n private getSavedDeliveryOption = (): string | undefined => {\r\n const cartLinesForShipping = this.getCartLinesForShipping();\r\n return cartLinesForShipping[0] && cartLinesForShipping[0].DeliveryMode;\r\n };\r\n\r\n private updateCartDeliverySpecification = async (deliveryModeId: string): Promise<void> => {\r\n if (deliveryModeId.trim() === '') {\r\n return;\r\n }\r\n\r\n const { resources } = this.props;\r\n const checkoutState = this.props.data.checkout.result as ICheckoutState;\r\n const updateCartDeliverySpecificationInput = {\r\n deliveryModeId: deliveryModeId,\r\n shippingAddress: checkoutState.shippingAddress\r\n };\r\n\r\n this.clearError();\r\n this.onPending();\r\n\r\n await checkoutState.checkoutCart.updateCartDeliverySpecification(updateCartDeliverySpecificationInput)\r\n .then((response) => {\r\n if (response.status === 'FAILED') {\r\n this.setError(resources.genericErrorMessage);\r\n } else {\r\n this.onReady();\r\n }\r\n })\r\n .catch(\r\n () => {\r\n this.setError(resources.genericErrorMessage);\r\n }\r\n );\r\n };\r\n\r\n private getCartLinesForShipping = (): CartLine[] => {\r\n const { request } = this.props.context;\r\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\r\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\r\n\r\n return ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(\r\n cartLine => cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode && cartLine.DeliveryMode !== ProductType.EventDeliveryMode\r\n );\r\n };\r\n\r\n private getDeliveryOptions = async (shippingAddress: Address): Promise<void> => {\r\n if (!this.props.data.checkout.result) {\r\n return;\r\n }\r\n\r\n const { context, resources } = this.props;\r\n const cartId = (this.props.data.checkout.result.checkoutCart.cart as Cart).Id;\r\n if (context) {\r\n this.isLoading = true;\r\n this.deliveryOptions = [];\r\n this.selectedItemId = '';\r\n this.clearError();\r\n\r\n try {\r\n // TODO: Check if we can move this getDeliveryOptions to checkout state\r\n const response = await getDeliveryOptionsAsync({ callerContext: context.actionContext, queryResultSettings: {} }, cartId, shippingAddress, [], 1);\r\n\r\n if (response && response.length) {\r\n this.deliveryOptions = response;\r\n }\r\n } catch (error) {\r\n this.setError(resources.genericErrorMessage);\r\n }\r\n\r\n if (this.deliveryOptions.length === 0) {\r\n this.setError(resources.deliveryOptionsNotFound);\r\n } else {\r\n this.onUpdating();\r\n this.selectedItemId = this.deliveryOptions.length > 0 ? this.deliveryOptions[0].Code || '' : ''; // By default, select first delivery\r\n }\r\n\r\n this.isLoading = false;\r\n }\r\n };\r\n\r\n private loadDeliveryOptions = async (): Promise<void> => {\r\n const shippingAddress = this.props.data.checkout.result && this.props.data.checkout.result.shippingAddress;\r\n\r\n if (this.canShip() && shippingAddress) {\r\n // tslint:disable-next-line:no-floating-promises\r\n await this.getDeliveryOptions(shippingAddress);\r\n }\r\n };\r\n\r\n private onDeliveryOptionChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const deliveryModeId = event.currentTarget.value;\r\n this.selectedItemId = deliveryModeId;\r\n };\r\n\r\n private onReady = () => {\r\n this.props.moduleState.onReady();\r\n };\r\n\r\n private onUpdating = () => {\r\n this.props.moduleState.onUpdating();\r\n };\r\n\r\n private onPending = () => {\r\n this.props.moduleState.onPending();\r\n };\r\n}\r\n\r\nexport default CheckoutDeliveryOptions;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { DeliveryOption as DeliveryOptionData } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICheckoutDeliveryOption, ICheckoutDeliveryOptionEdit, ICheckoutDeliveryOptionsError, ICheckoutDeliveryOptionsList, ICheckoutDeliveryOptionsViewProps } from './smwe-checkout-delivery-options';\r\ninterface ICheckoutDeliveryOptionsListFiltered extends ICheckoutDeliveryOptionsList {\r\n globalConfig?: {\r\n [x: string]: unknown;\r\n };\r\n options?: DeliveryOptionData[];\r\n}\r\n\r\ntype ModShipping = {\r\n id: number;\r\n amount: number;\r\n}[];\r\n\r\nconst DeliveryOptionList: React.FC<ICheckoutDeliveryOptionsListFiltered> = ({\r\n DeliveryOptionsList,\r\n list,\r\n globalConfig,\r\n options\r\n}) => {\r\n if (!list || list.length === 0) {\r\n return null;\r\n }\r\n\r\n const pennyShippingMethodIds = globalConfig?.pennyShippingIds as number[] || [];\r\n const modShippingMethodIds = globalConfig?.modShippingIds as ModShipping || [];\r\n\r\n let localList: ICheckoutDeliveryOptionEdit[] = [];\r\n if (options) {\r\n // maps options with list for sorting\r\n const combinedList: {option: DeliveryOptionData; list: ICheckoutDeliveryOptionEdit}[] = [];\r\n options.map((option, index) => combinedList.push({option: option, list: list[index]}));\r\n // sort list by lowest to highest price\r\n const combinedListSorted = combinedList.sort((a, b) => (a.option.ShippingChargeAmount! > b.option.ShippingChargeAmount!) ? 1 : ((b.option.ShippingChargeAmount! > a.option.ShippingChargeAmount!) ? -1 : 0));\r\n combinedListSorted.forEach((deliveryData) => {\r\n if (deliveryData.list) {\r\n // search to find out if it is a mod shipping method\r\n const isModShippingMethod = modShippingMethodIds.find(modShipping => Number(modShipping.id) === deliveryData.option.RecordId);\r\n // backwards compatibility for penny shipping\r\n const isPennyShippingMethod = pennyShippingMethodIds.find(pennyShipping => Number(pennyShipping) === deliveryData.option.RecordId);\r\n\r\n // Filter out mod shipping methods that are declared\r\n // in the global config, only show shipping methods\r\n // that have a matching mod price for the customer at this current time\r\n // of checkout. If it's not a mod shipping method, always display\r\n // it.\r\n if (isModShippingMethod && deliveryData.option.ShippingChargeAmount === isModShippingMethod.amount) {\r\n localList.push(deliveryData.list);\r\n } else if (isPennyShippingMethod && deliveryData.option.ShippingChargeAmount === 0.01) {\r\n localList.push(deliveryData.list);\r\n } else if (!isModShippingMethod && !isPennyShippingMethod) {\r\n localList.push(deliveryData.list);\r\n }\r\n }\r\n });\r\n }\r\n // just in case options doesn't load in, fail safely back to the original\r\n // list\r\n if (localList.length === 0) { localList = list; }\r\n return (\r\n <Node {...DeliveryOptionsList}>\r\n {localList.map((deliveryOption: ICheckoutDeliveryOptionEdit) => {\r\n return (<Node {...deliveryOption.DeliveryOption} key={deliveryOption.code}>\r\n <label className='ms-checkout-delivery-options__label'>\r\n {deliveryOption.radioButton}\r\n {deliveryOption.description}\r\n <span className='sr-only'>{deliveryOption.price}</span>\r\n </label>\r\n {deliveryOption.price}\r\n </Node>);\r\n })}\r\n </Node>\r\n );\r\n};\r\n\r\nconst DeliveryOptionSelected: React.FC<ICheckoutDeliveryOption> = ({\r\n DeliveryOption,\r\n description,\r\n price,\r\n}) => {\r\n\r\n return (\r\n <Node {...DeliveryOption}>\r\n {description}\r\n {price}\r\n </Node>\r\n );\r\n};\r\n\r\nconst ErrorMessage: React.FC<ICheckoutDeliveryOptionsError> = ({\r\n Error,\r\n title,\r\n message,\r\n}) => {\r\n\r\n return (\r\n <Node {...Error}>\r\n {title}\r\n {message}\r\n </Node>\r\n );\r\n};\r\n\r\nconst CheckoutDeliveryOptionsView: React.FC<ICheckoutDeliveryOptionsViewProps> = props => {\r\n const { CheckoutDeliveryOptions,\r\n viewState,\r\n deliveryOptions,\r\n deliveryOptionsData,\r\n deliveryOptionSelected,\r\n errorMessage,\r\n waiting,\r\n saveButton,\r\n editButton,\r\n cancelButton } = props;\r\n return (\r\n // TODO: All wrapper div should be provided by viewProps. Once SDK provide the sln, update markup.\r\n <Module {...CheckoutDeliveryOptions}>\r\n {viewState.isLoading && waiting}\r\n {viewState.isError && errorMessage && <ErrorMessage {...errorMessage} />}\r\n {viewState.isShowList && deliveryOptions &&<fieldset><legend className='sr-only'>Delivery Options</legend><DeliveryOptionList {...deliveryOptions} globalConfig={props.context.app.config} options={deliveryOptionsData} /></fieldset>}\r\n {viewState.isShowSelected && deliveryOptionSelected && <DeliveryOptionSelected {...deliveryOptionSelected} />}\r\n {viewState.isShowSaveButton && saveButton}\r\n {viewState.isShowEditButton && editButton}\r\n {viewState.isShowCancelButton && cancelButton}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default CheckoutDeliveryOptionsView;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface IAlertProps {\r\n message: string;\r\n}\r\n\r\nconst CheckoutAlert: React.FC<IAlertProps> = ({ message }) => (\r\n <p className='ms-checkout__error-message' role='alert' aria-live='assertive'>\r\n {message}\r\n </p>\r\n);\r\n\r\nexport default CheckoutAlert;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport get from 'lodash/get';\r\nimport * as React from 'react';\r\n\r\nimport { ISmweCheckoutData } from '../smwe-checkout.data';\r\nimport { ISmweCheckoutProps } from '../smwe-checkout.props.autogenerated';\r\n\r\nexport interface IInvoicePaymentSummary {\r\n heading?: React.ReactNode;\r\n lines?: IInvoiceSummaryLines;\r\n}\r\nexport const getInvoicePaymentSummary = (input: ISmweCheckoutProps<ISmweCheckoutData>): IInvoicePaymentSummary => {\r\n const {\r\n data: { checkout },\r\n resources: {\r\n totalAmountLabel,\r\n invoiceLabel,\r\n invoiceSummaryTitle\r\n },\r\n context,\r\n typeName,\r\n id,\r\n telemetry\r\n } = input;\r\n\r\n const checkoutCart = get(checkout, 'result.checkoutCart');\r\n const cart = get(checkout, 'result.checkoutCart.cart');\r\n\r\n return {\r\n heading: <h2 className='msc-invoice-summary__heading'>\r\n { invoiceSummaryTitle }\r\n </h2>,\r\n lines: checkoutCart?.hasInvoiceLine ? InvoiceSummary({\r\n orderTotalLabel: totalAmountLabel,\r\n invoiceLabel,\r\n cart,\r\n context,\r\n typeName,\r\n telemetry,\r\n id,\r\n checkoutState: checkout.result\r\n }) : undefined\r\n };\r\n\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { getProductUrlSync, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport { CartLineItemComponent } from '@msdyn365-commerce/components';\r\nimport MsDyn365, { ContentEditableEvent, Text, getUrlSync } from '@msdyn365-commerce/core';\r\nimport { CartLine, OrgUnitLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classnames from 'classnames';\r\nimport get from 'lodash/get';\r\nimport groupBy from 'lodash/groupBy';\r\nimport * as React from 'react';\r\nimport { SubscriptionCommerceValues } from '../../../common/subscription-commerce.values';\r\nimport { ISmweCheckoutData } from '../smwe-checkout.data';\r\nimport { ISmweCheckoutProps } from '../smwe-checkout.props.autogenerated';\r\n\r\ntype deliveryType = 'pickup' | 'ship' | 'email';\r\n\r\nexport interface IPickUpAtStore {\r\n PickUpAtStore: INodeProps;\r\n label: React.ReactNode;\r\n location: React.ReactNode;\r\n}\r\n\r\nexport interface IEmailDelivery {\r\n EmailDelivery: INodeProps;\r\n label: React.ReactNode;\r\n}\r\n\r\nexport interface ILineItem {\r\n LineId: string;\r\n LineItem: INodeProps;\r\n item?: React.ReactNode;\r\n pickUpAtStore?: IPickUpAtStore;\r\n emailDelivery?: IEmailDelivery;\r\n}\r\n\r\nexport interface ILineItemDeliveryGroup {\r\n LineItemDeliveryGroup: INodeProps;\r\n LineItemList: INodeProps;\r\n heading: React.ReactNode;\r\n lineItemWraper?: React.ReactNode;\r\n lineItemWraperIcon?: React.ReactNode;\r\n lineItems: ILineItem[];\r\n}\r\n\r\nexport interface ILineItems {\r\n LineItems: INodeProps;\r\n Header: INodeProps;\r\n heading: React.ReactNode;\r\n editLink: React.ReactNode;\r\n itemsForPickup?: ILineItemDeliveryGroup;\r\n itemsForShip?: ILineItemDeliveryGroup;\r\n itemsForSubscription?: ILineItem[];\r\n subscriptionHeader?: string;\r\n itemsForEmail?: ILineItemDeliveryGroup;\r\n itemsGroupWithMulitplePickupMode?: ILineItemDeliveryGroup[];\r\n}\r\n\r\nexport const getLineItems = (input: ISmweCheckoutProps<ISmweCheckoutData>, telemetryContent?: ITelemetryContent): ILineItems | undefined => {\r\n let subscriptionLineItems: ILineItem[] = [];\r\n const pickupDeliveryModeCode = get(input, 'context.request.channel.PickupDeliveryModeCode');\r\n const emailDeliveryModeCode = get(input, 'context.request.channel.EmailDeliveryModeCode');\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const { channelDeliveryOptionConfig, featureState } = input.data;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)?.IsEnabled;\r\n\r\n const _getDeliveryLocation = (cartLine: CartLine): string => {\r\n const orgUnitLocations = get(input, 'data.orgUnitLocations.result');\r\n if (!cartLine.FulfillmentStoreId || !orgUnitLocations) {\r\n return '';\r\n }\r\n\r\n const locationMatch = (orgUnitLocations || []).find((location: OrgUnitLocation): boolean => {\r\n return location.OrgUnitNumber === cartLine.FulfillmentStoreId;\r\n });\r\n\r\n return locationMatch && locationMatch.OrgUnitName;\r\n };\r\n\r\n const _getProduct = (productId: number): SimpleProduct | undefined => {\r\n const products = get(input, 'data.products.result') || [];\r\n return products.find((_product: SimpleProduct) => {\r\n return productId === _product.RecordId;\r\n });\r\n };\r\n\r\n const _getLineItemComponent = (cartLine: CartLine): JSX.Element | undefined => {\r\n const product = cartLine.ProductId && _getProduct(cartLine.ProductId);\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n config: { imageSettings, showShippingChargesForLineItems },\r\n resources: {\r\n quantityDisplayString,\r\n productDimensionTypeColor,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle,\r\n productDimensionTypeAmount,\r\n configString,\r\n inputQuantityAriaLabel,\r\n discountStringText,\r\n shippingCharges\r\n },\r\n context: {\r\n request: { gridSettings }\r\n }\r\n } = input;\r\n\r\n if (!product) {\r\n return;\r\n }\r\n\r\n let productUrl = getProductUrlSync(product, context.actionContext, undefined);\r\n if (MsDyn365.isBrowser) {\r\n const fullUrl = new URL(productUrl, window.location.href);\r\n fullUrl.searchParams.set('catalogid', `${cartLine.CatalogId ?? 0}`);\r\n productUrl = fullUrl.href;\r\n }\r\n\r\n return (\r\n <CartLineItemComponent\r\n id={id}\r\n typeName={typeName}\r\n context={context}\r\n resources={{\r\n sizeString: productDimensionTypeSize,\r\n colorString: productDimensionTypeColor,\r\n styleString: productDimensionTypeStyle,\r\n amountString: productDimensionTypeAmount,\r\n quantityDisplayString,\r\n configString,\r\n inputQuantityAriaLabel,\r\n discountStringText,\r\n originalPriceText: '',\r\n currentPriceText: '',\r\n shippingChargesText: shippingCharges\r\n }}\r\n isQuantityEditable={false}\r\n imageSettings={imageSettings!}\r\n gridSettings={gridSettings!}\r\n productUrl={productUrl}\r\n primaryImageUrl={product.PrimaryImageUrl}\r\n data={{\r\n cartLine,\r\n product\r\n }}\r\n showShippingChargesForLineItems={showShippingChargesForLineItems}\r\n telemetryContent={telemetryContent}\r\n channelDeliveryOptionConfig={channelDeliveryOptionConfig?.result}\r\n />\r\n );\r\n };\r\n\r\n const _getPickUpAtStoreComponents = (pickupDeliveryLocation: string): IPickUpAtStore => {\r\n const {\r\n resources: { pickUpAtStoreWithLocationText }\r\n } = input;\r\n\r\n return {\r\n PickUpAtStore: { className: 'ms-checkout__pick-up-at-store' },\r\n label: <span className='ms-checkout__store-label'>\r\n {pickUpAtStoreWithLocationText}\r\n </span>,\r\n location: <div className='ms-checkout__store-location'>\r\n {pickupDeliveryLocation}\r\n </div>\r\n };\r\n };\r\n\r\n const _getEmailDeliveryComponents = (): IEmailDelivery => {\r\n const {\r\n resources: { emailDeliveryText }\r\n } = input;\r\n\r\n return {\r\n EmailDelivery: { className: 'ms-checkout__email-delivery' },\r\n label: <span className='ms-checkout__email-label'>\r\n {emailDeliveryText}\r\n </span>\r\n };\r\n };\r\n\r\n const _getLineItemsComponents = (items: CartLine[]): ILineItem[] => {\r\n return items.map(cartLine => {\r\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\r\n const isPickUp = _getCartPickDeliveryMode(cartLine);\r\n const isEmailDelivery = (cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\r\n return {\r\n LineId: cartLine.LineId || '',\r\n LineItem: { className: 'ms-checkout__line-item' },\r\n item: _getLineItemComponent(cartLine),\r\n pickUpAtStore: isPickUp ? _getPickUpAtStoreComponents(pickupDeliveryLocation) : undefined,\r\n emailDelivery: isEmailDelivery ? _getEmailDeliveryComponents() : undefined\r\n };\r\n });\r\n };\r\n\r\n const _getCartPickDeliveryMode = (cartLineItem: CartLine): boolean => {\r\n return (!StringExtensions.isNullOrWhitespace(cartLineItem.DeliveryMode)) ? (retailMultiplePickUpOptionEnabled ? cartLineItem.DeliveryMode === channelDeliveryOptionConfig?.result?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLineItem.DeliveryMode) : (cartLineItem.DeliveryMode === pickupDeliveryModeCode)) : false;\r\n };\r\n\r\n const _getCartShipDeliveryMode = (cartLineItem: CartLine): boolean => {\r\n return (!StringExtensions.isNullOrWhitespace(cartLineItem.DeliveryMode)) ? (retailMultiplePickUpOptionEnabled ? cartLineItem.DeliveryMode !== channelDeliveryOptionConfig?.result?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLineItem.DeliveryMode) : (cartLineItem.DeliveryMode !== pickupDeliveryModeCode)) : false;\r\n };\r\n\r\n const _getGroupTitleComponent = (count: number, type: deliveryType): string => {\r\n const {\r\n resources: {\r\n itemLabel,\r\n itemsLabel,\r\n inStorePickUpLabel,\r\n shippingCountCheckoutLineItem\r\n }\r\n } = input;\r\n\r\n let emailDeliveryModeDesc: string = '';\r\n\r\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\r\n emailDeliveryModeDesc = emailDeliveryModeDesc ? emailDeliveryModeDesc : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === emailDeliveryModeCode)?.Description!;\r\n });\r\n\r\n const suffix = count > 1 ? itemsLabel : itemLabel;\r\n const title = type === 'ship' ? shippingCountCheckoutLineItem : (type === 'pickup' ? inStorePickUpLabel : `${emailDeliveryModeDesc} (${count} ${suffix})`);\r\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\r\n };\r\n\r\n const _countItems = (items: CartLine[]): number => {\r\n return items.reduce((count, item) => {\r\n return count + (item.Quantity || 0);\r\n // tslint:disable-next-line:align\r\n }, 0);\r\n };\r\n\r\n const _filterItemsByDiliveryType = (type: deliveryType): CartLine[] => {\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n if (type === 'ship') {\r\n return cart.CartLines.filter((\r\n cartLine: CartLine) => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (_getCartShipDeliveryMode(cartLine) && cartLine.DeliveryMode !== emailDeliveryModeCode) : cartLine)\r\n );\r\n } else if (type === 'pickup') {\r\n return cart.CartLines.filter((cartLine: CartLine) => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (_getCartPickDeliveryMode(cartLine)) : null)\r\n );\r\n }\r\n return cart.CartLines.filter((cartLine: CartLine) => cartLine.DeliveryMode === emailDeliveryModeCode);\r\n\r\n };\r\n\r\n const _getLineItemsByDeliveryType = (type: deliveryType): ILineItemDeliveryGroup | undefined => {\r\n if ((pickupDeliveryModeCode === '' || pickupDeliveryModeCode === undefined) && (type === 'pickup' || type === 'email')) {\r\n return;\r\n }\r\n\r\n const items = _filterItemsByDiliveryType(type);\r\n\r\n if (items.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const count = _countItems(items);\r\n const title = _getGroupTitleComponent(count, type);\r\n\r\n // separate out subscriptions from nonsubscriptions on checkout summary\r\n let nonSubscriptionItems: CartLine[] = [];\r\n const subscriptionItems: CartLine[] = [];\r\n const subLine = SubscriptionCommerceValues.SUBCRIPTION_LINE;\r\n items.forEach((item) => {\r\n const isSubscription = item.ExtensionProperties?.find(attribute => attribute.Key === subLine);\r\n if (isSubscription) {\r\n subscriptionItems.push(item);\r\n } else {\r\n nonSubscriptionItems.push(item);\r\n }\r\n });\r\n\r\n // fallback to complete list if no subscriptions found\r\n if (subscriptionItems.length === 0) {\r\n nonSubscriptionItems = items;\r\n } else {\r\n subscriptionLineItems =_getLineItemsComponents(subscriptionItems);\r\n }\r\n\r\n return {\r\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group', type) },\r\n LineItemList: { className: 'ms-checkout__line-items-list' },\r\n heading: <div className='ms-checkout__line-items-group-title'>\r\n {title}\r\n </div>,\r\n lineItems: _getLineItemsComponents(nonSubscriptionItems)\r\n };\r\n };\r\n\r\n const _getLineItems = (): ILineItems | undefined => {\r\n const {\r\n context,\r\n config: { lineItemsHeading },\r\n data: { products },\r\n resources: { editCartText, subscriptionHeader }\r\n } = input;\r\n\r\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.EditCart);\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n const groupClass = retailMultiplePickUpOptionEnabled ? ' multiple-pickup-enabled' : '';\r\n\r\n if (!cart || !cart.CartLines || cart.CartLines.length === 0 || !products) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n LineItems: { className: `ms-checkout__line-items${groupClass}` },\r\n Header: { className: 'ms-checkout__line-items-header' },\r\n heading: lineItemsHeading && lineItemsHeading.text && (\r\n <Text\r\n className='ms-checkout__line-items-heading'\r\n {...lineItemsHeading}\r\n tag={lineItemsHeading.tag || 'h2'}\r\n text={lineItemsHeading.text}\r\n editProps={{ onEdit: handleLineItemHeadingChange, requestContext: context.request }}\r\n />\r\n ),\r\n editLink: (\r\n <Button\r\n className='ms-checkout__line-items-edit-cart-link'\r\n title={editCartText}\r\n color='link'\r\n href={getUrlSync('cart', context.actionContext) || ''}\r\n {...attribute}\r\n >\r\n {editCartText}\r\n </Button>\r\n ),\r\n itemsForPickup: _getLineItemsByDeliveryType('pickup'),\r\n itemsForShip: _getLineItemsByDeliveryType('ship'),\r\n itemsForSubscription: subscriptionLineItems,\r\n subscriptionHeader: subscriptionHeader,\r\n itemsForEmail: _getLineItemsByDeliveryType('email'),\r\n itemsGroupWithMulitplePickupMode: retailMultiplePickUpOptionEnabled ? _getLineItemsByDeliveryTypeWithMulitplePickupMode() : undefined\r\n };\r\n };\r\n\r\n const handleLineItemHeadingChange = (event: ContentEditableEvent) => {\r\n const {\r\n config: { lineItemsHeading }\r\n } = input;\r\n lineItemsHeading!.text = event.target.value;\r\n };\r\n\r\n const _getGroupTitleComponentWithMultiplePickUp = (count: number, type: deliveryType, deliveryMode?: string, fulFillmentStoreId?: string): string => {\r\n const {\r\n resources: {\r\n itemLabel,\r\n itemsLabel\r\n }\r\n } = input;\r\n\r\n let emailDeliveryModeDesc: string = '';\r\n let pickupDeliveryModeDesc: string = '';\r\n\r\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\r\n emailDeliveryModeDesc = emailDeliveryModeDesc ? emailDeliveryModeDesc : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === emailDeliveryModeCode)?.Description!;\r\n });\r\n\r\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\r\n pickupDeliveryModeDesc = pickupDeliveryModeDesc ? pickupDeliveryModeDesc : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === deliveryMode)?.Description!;\r\n });\r\n\r\n const pickupTitle: string = `${pickupDeliveryModeDesc}, ${fulFillmentStoreId}`;\r\n const suffix = count > 1 ? itemsLabel : itemLabel;\r\n const title = type === 'ship' ? `(${count} ${suffix})` : (type === 'pickup' ? `${pickupTitle} (${count} ${suffix})` : `${emailDeliveryModeDesc} (${count} ${suffix})`);\r\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\r\n };\r\n\r\n const _filterItemsByMultiplePickupMode = (): CartLine[][] => {\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\r\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => (item.DeliveryMode));\r\n const groupDelivery = getGroupByDelivery(cart.CartLines);\r\n const cartLinesGroup: CartLine[] = [];\r\n const cartLinesGrp: CartLine[][] = [];\r\n\r\n // 1) Group by store and pick up mode\r\n Object.entries(groupDelivery).forEach(([deliveryMode, groupByDeliveryType]) => {\r\n // @ts-expect-error\r\n groupDelivery[deliveryMode] = getGroupByStorePickup(groupByDeliveryType);\r\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\r\n });\r\n\r\n Object.keys(cartLinesGroup).forEach(key => {\r\n const cartLines = cartLinesGroup[key];\r\n Object.keys(cartLines).forEach(index => {\r\n const cartLine = cartLines[index];\r\n cartLinesGrp.push(cartLine);\r\n });\r\n });\r\n\r\n return cartLinesGrp;\r\n };\r\n\r\n const _getLineItemsByDeliveryTypeWithMulitplePickupMode = (): ILineItemDeliveryGroup[] | undefined => {\r\n if (pickupDeliveryModeCode === '' || pickupDeliveryModeCode === undefined) {\r\n return;\r\n }\r\n\r\n const {\r\n resources: {\r\n multiplePickUpLabel,\r\n shippingLable\r\n }\r\n } = input;\r\n\r\n const items = _filterItemsByMultiplePickupMode();\r\n\r\n if (items.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const lineItemDeliveryGroup: ILineItemDeliveryGroup[] = [];\r\n items.map(item => {\r\n const count = _countItems(item);\r\n const cartLine = item[0];\r\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\r\n const type: deliveryType = cartLine.FulfillmentStoreId && cartLine.DeliveryMode ? 'pickup' : (cartLine.FulfillmentStoreId === '' && cartLine.DeliveryMode === emailDeliveryModeCode ? 'email' : 'ship');\r\n const title = _getGroupTitleComponentWithMultiplePickUp(count, type, cartLine.DeliveryMode, pickupDeliveryLocation);\r\n const groupTitle = type === 'pickup' ? multiplePickUpLabel : (type === 'ship' ? shippingLable : 'email');\r\n const iconClass = `ms-checkout__line-items-group-title-multiple-pickup-${type}icon`;\r\n lineItemDeliveryGroup.push({\r\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group multiple-pickup', type) },\r\n LineItemList: { className: 'ms-checkout__line-items-list' },\r\n lineItemWraperIcon: <div className={iconClass} />,\r\n lineItemWraper: <div className='ms-checkout__line-items-group-title-multiple-pickup-heading'>\r\n {groupTitle}\r\n </div>,\r\n heading: <div className='ms-checkout__line-items-group-title-multiple-pickup-subheading'>\r\n {title}\r\n </div>,\r\n lineItems: _getLineItemsComponents(item)\r\n });\r\n });\r\n\r\n return lineItemDeliveryGroup;\r\n };\r\n\r\n return _getLineItems();\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Text, ContentEditableEvent } from '@msdyn365-commerce/core';\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport get from 'lodash/get';\r\nimport * as React from 'react';\r\nimport { ISmweCheckoutData } from '../smwe-checkout.data';\r\nimport { ISmweCheckoutProps } from '../smwe-checkout.props.autogenerated';\r\n\r\nexport interface IOrderSummary {\r\n orderSummaryProps: INodeProps;\r\n heading?: React.ReactNode;\r\n lines?: IOrderSummaryLines;\r\n}\r\nexport const getOrderSummary = (input: ISmweCheckoutProps<ISmweCheckoutData>): IOrderSummary => {\r\n const {\r\n config: { orderSummaryHeading },\r\n data: { checkout },\r\n resources: {\r\n subTotalLabel,\r\n shippingLabel,\r\n taxLabel,\r\n orderTotalLabel,\r\n loyaltyLabel,\r\n giftcardLabel,\r\n totalDiscountsLabel,\r\n freeText,\r\n toBeCalculatedText,\r\n otherCharges\r\n },\r\n context,\r\n typeName,\r\n id,\r\n telemetry\r\n } = input;\r\n\r\n const checkoutState = get(checkout, 'result');\r\n const cart = get(checkout, 'result.checkoutCart.cart');\r\n const showLineItems = cart.CartLines && cart.CartLines.length > 0;\r\n const channelConfiguration = context.request.channel!;\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const { channelDeliveryOptionConfig, featureState } = input.data;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)?.IsEnabled;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n const isShowOrHideTaxEnabled = context.request.app.config.isEnableShowOrHideSalesTaxECommerceEnabled === true;\r\n\r\n const handleOrderSummaryHeadingChange = (event: ContentEditableEvent) => {\r\n const {\r\n config: { orderSummaryHeading }\r\n } = input;\r\n orderSummaryHeading!.text = event.target.value;\r\n };\r\n\r\n return {\r\n orderSummaryProps: { className: 'ms-checkout-guest-profile__selected-item' },\r\n heading: orderSummaryHeading && orderSummaryHeading.text && (\r\n <Text\r\n className='msc-order-summary__heading'\r\n {...orderSummaryHeading}\r\n tag={orderSummaryHeading.tag || 'h2'}\r\n text={orderSummaryHeading.text}\r\n editProps={{ onEdit: handleOrderSummaryHeadingChange, requestContext: context.request }}\r\n />\r\n ),\r\n lines: showLineItems\r\n ? OrderSummary({\r\n checkoutState,\r\n cart,\r\n subTotalLabel,\r\n shippingLabel,\r\n taxLabel,\r\n orderTotalLabel,\r\n loyaltyLabel,\r\n giftcardLabel,\r\n totalDiscountsLabel,\r\n freeText,\r\n toBeCalculatedText,\r\n context,\r\n typeName,\r\n id,\r\n channelConfiguration,\r\n telemetry,\r\n otherChargeLabel: otherCharges,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- existing property.\r\n isTaxIncludedInPrice: cart.IsTaxIncludedInPrice,\r\n isShowTaxBreakup: isShowOrHideTaxEnabled\r\n }) : undefined\r\n };\r\n\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\nimport { Heading as HeadingType } from '@msdyn365-commerce-modules/data-types';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport classname from 'classnames';\r\nimport * as React from 'react';\r\n\r\nexport interface ICheckoutGuidedCardProps {\r\n step: number;\r\n title?: HeadingType;\r\n disabled?: boolean; // Module is not available\r\n isActive?: boolean; // Step === currentStep\r\n isVisted?: boolean; // Step < currentStep\r\n isExpanded?: boolean;\r\n isReady?: boolean;\r\n isPending?: boolean;\r\n isUpdating?: boolean;\r\n isSubmitting?: boolean;\r\n isCancelAllowed?: boolean;\r\n isMobile?: boolean;\r\n hasInitialized?: boolean;\r\n hasControlGroup?: boolean;\r\n children: React.ReactNode;\r\n resource: {\r\n checkoutStepTitleFormat: string;\r\n saveBtnLabel: string;\r\n changeBtnLabel: string;\r\n cancelBtnLabel: string;\r\n saveAndContinueBtnLabel: string;\r\n };\r\n telemetryContent?: ITelemetryContent;\r\n onEdit?(): void;\r\n onCancel?(): void;\r\n onSubmit?(): void;\r\n onNext(): void;\r\n}\r\n\r\n/**\r\n *\r\n * CheckoutGuidedCard component.\r\n * @extends {React.Component<ICheckoutGuidedCardProps>}\r\n */\r\nclass CheckoutGuidedCard extends React.PureComponent<ICheckoutGuidedCardProps> {\r\n private readonly editButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\r\n\r\n private readonly formCardRef: React.RefObject<HTMLDivElement> = React.createRef();\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n constructor(props: ICheckoutGuidedCardProps) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n }\r\n\r\n public componentDidUpdate(prevProps: ICheckoutGuidedCardProps): void {\r\n /**\r\n * Move to next step when current step is ready.\r\n */\r\n const { isActive, isReady, onNext, isVisted, onEdit } = this.props;\r\n\r\n // Move to next step after completing the current step\r\n if (isActive && isReady) {\r\n onNext();\r\n }\r\n\r\n // Set the focus to Edit button once edit button appear\r\n // (It happens when current step switch to isReady status)\r\n const prevCanEdit = prevProps.isReady && prevProps.isVisted && !!prevProps.onEdit;\r\n const canEdit = isReady && isVisted && !!onEdit;\r\n if (!prevCanEdit && canEdit) {\r\n this.focusOnEditButton();\r\n this.scrollToTitle();\r\n }\r\n\r\n // Set the focus to the first focusable element\r\n // (It happens when current step switch to isUpdating status)\r\n if (prevProps.isReady && !isReady) {\r\n this.focusOnFirstFocusableElement();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n title,\r\n disabled,\r\n isExpanded,\r\n isActive,\r\n isVisted,\r\n children,\r\n isReady,\r\n isPending,\r\n isUpdating,\r\n hasInitialized,\r\n hasControlGroup,\r\n onEdit,\r\n resource\r\n } = this.props;\r\n const { changeBtnLabel } = resource;\r\n\r\n this.payLoad.contentAction.etext = TelemetryConstant.CheckoutChange;\r\n const changeBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n const canEdit = hasControlGroup && isReady && isVisted && onEdit;\r\n\r\n return (\r\n <div\r\n className={classname('ms-checkout__guided-card', {\r\n active: isActive,\r\n expanded: isExpanded,\r\n closed: !isExpanded,\r\n visted: isVisted,\r\n hidden: disabled,\r\n initialized: hasInitialized,\r\n disabled,\r\n ready: isReady,\r\n pending: isPending,\r\n updating: isUpdating\r\n })}\r\n ref={this.formCardRef}\r\n >\r\n <div className='ms-checkout__guided-card-header'>\r\n {this.getTitle()}\r\n\r\n {canEdit && (\r\n <Button\r\n innerRef={this.editButtonRef}\r\n className='ms-checkout__guided-card-btn-edit'\r\n title={changeBtnLabel}\r\n color='link'\r\n onClick={onEdit}\r\n role='link'\r\n aria-label={title && title.text ? `${changeBtnLabel} ${title.text}` : ''}\r\n {...changeBtnAttributes}\r\n >\r\n {changeBtnLabel}\r\n </Button>\r\n )}\r\n </div>\r\n\r\n <div\r\n className={classname('ms-checkout__guided-card-body', {\r\n hidden: !isExpanded\r\n })}\r\n >\r\n <div className='ms-checkout__guided-card-content'>\r\n {children}\r\n </div>\r\n\r\n {this.renderFooder()}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private readonly renderFooder = (): JSX.Element | null => {\r\n const { isVisted, isReady, isSubmitting, isCancelAllowed, hasControlGroup, onCancel, onSubmit, resource } = this.props;\r\n const { saveBtnLabel, cancelBtnLabel, saveAndContinueBtnLabel } = resource;\r\n\r\n const canSubmit = !isReady && onSubmit;\r\n const canCancel = !isReady && isVisted && isCancelAllowed && onCancel;\r\n\r\n if (!hasControlGroup || (!canSubmit && !canCancel)) {\r\n return null;\r\n }\r\n\r\n this.payLoad.contentAction.etext = isVisted ? TelemetryConstant.Save : TelemetryConstant.SaveContinue;\r\n const saveBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.Cancel;\r\n const cancelBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n <div className='ms-checkout__guided-card-footer'>\r\n {canSubmit && (\r\n <Button\r\n className={classname('ms-checkout__guided-card-btn-save', { 'is-submitting': isSubmitting })}\r\n title={isVisted ? saveBtnLabel : saveAndContinueBtnLabel}\r\n color='primary'\r\n disabled={isSubmitting}\r\n onClick={onSubmit}\r\n {...saveBtnAttributes}\r\n >\r\n {isVisted && isCancelAllowed ? saveBtnLabel : saveAndContinueBtnLabel}\r\n </Button>\r\n )}\r\n {canCancel && (\r\n <Button\r\n className='ms-checkout__guided-card-btn-cancel'\r\n title={cancelBtnLabel}\r\n color='secondary'\r\n onClick={onCancel}\r\n {...cancelBtnAttributes}\r\n >\r\n {cancelBtnLabel}\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n private readonly focusOnFirstFocusableElement = (): void => {\r\n const node = this.formCardRef.current as HTMLElement;\r\n const focussableElements = `\r\n a:not([disabled]),\r\n button:not([disabled]),\r\n input[type=submit]:not([disabled]),\r\n input[type=checkbox]:not([disabled]),\r\n input[type=text]:not([disabled]),\r\n input[type=radio]:not([disabled]),\r\n input[type=password]:not([disabled]),\r\n select:not([disabled]),\r\n textarea:not([disabled]),\r\n [tabindex]:not([disabled]):not([tabindex=\"-1\"])\r\n `;\r\n\r\n const child = node && node.querySelector && (node.querySelector(focussableElements) as HTMLElement);\r\n child && child.focus && child.focus();\r\n };\r\n\r\n private readonly focusOnEditButton = (): void => {\r\n // Focus on edit button\r\n const editButton =\r\n this.editButtonRef &&\r\n this.editButtonRef.current &&\r\n this.editButtonRef.current.focus &&\r\n (this.editButtonRef.current as HTMLElement);\r\n editButton && editButton.focus();\r\n };\r\n\r\n private readonly scrollToTitle = (): void => {\r\n // Scroll window to the title of the step that was just completed only in mobile viewport\r\n const formCard = this.props.isMobile && this.formCardRef && this.formCardRef.current && (this.formCardRef.current as HTMLElement);\r\n formCard && formCard.scrollIntoView();\r\n };\r\n\r\n private readonly getTitle = (): JSX.Element => {\r\n const { step, title } = this.props;\r\n const { headingTag: Tag = 'h2', text = '' } = title || {};\r\n return (\r\n <Tag className='ms-checkout__guided-card-title'>\r\n <span className='ms-checkout__guided-card-title-step'>\r\n {step + 1}\r\n .\r\n {' '}\r\n </span>\r\n {text && <span className='ms-checkout__guided-card-title-text'>\r\n {text}\r\n </span>}\r\n </Tag>\r\n );\r\n };\r\n}\r\n\r\nexport default CheckoutGuidedCard;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport get from 'lodash/get';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IModuleStateManager } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport { Heading } from '@msdyn365-commerce-modules/data-types';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { publish } from '../../../Utilities/analytics/analytics-dispatcher';\r\nimport { getAttributesForCart } from '../../../Utilities/get-product-attributes';\r\nimport { getSubscriptionValues, isLineSubscriptionLine } from '../../../Utilities/subscription-manager';\r\n\r\nimport GuidedCard from './guided-card';\r\n\r\nexport interface ICheckoutGuidedFormProps {\r\n items: React.ReactNode[];\r\n moduleState: IModuleStateManager;\r\n disableGuidedCheckoutFlow?: boolean;\r\n isMobile?: boolean;\r\n isEditor?: boolean;\r\n resource: {\r\n checkoutStepTitleFormat: string;\r\n saveBtnLabel: string;\r\n changeBtnLabel: string;\r\n cancelBtnLabel: string;\r\n saveAndContinueBtnLabel: string;\r\n };\r\n\r\n products: AsyncResult<SimpleProduct[]>;\r\n cart: AsyncResult<ICartState>;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n telemetryContent?: ITelemetryContent;\r\n isPaymentVerificationRedirection?: boolean;\r\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\r\n hasError?: boolean;\r\n hasShippingAddress?: boolean | undefined;\r\n hasCartDeliveryMode?: boolean | undefined;\r\n hasGuestCheckoutEmail?: boolean | undefined;\r\n isTermsAndConditionAccepted?: boolean | undefined;\r\n}\r\n\r\ninterface ICheckoutGuidedFormState {\r\n currentStep: number;\r\n}\r\n\r\nconst paymentInstrumentModuleId = 'payment-instrument';\r\n\r\n/**\r\n *\r\n * CheckoutGuidedForm component.\r\n * @extends {React.Component<ICheckoutGuidedFormProps>}\r\n */\r\n@observer\r\nclass CheckoutGuidedForm extends React.PureComponent<ICheckoutGuidedFormProps> {\r\n\r\n @computed public get hasMissingInfo(): boolean {\r\n if (this.props.hasShippingAddress === false || this.props.hasCartDeliveryMode === false ||\r\n this.props.hasGuestCheckoutEmail === false || this.props.isTermsAndConditionAccepted === false) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n @computed public get hasOrderError(): boolean {\r\n for (const item of this.props.items) {\r\n const childId = this.getId(item);\r\n const state = this.props.moduleState.getModule(childId);\r\n\r\n const isPaymentSectionContainer = ArrayExtensions.hasElements(\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n state.childIds?.filter(currentId => currentId?.includes(paymentInstrumentModuleId)));\r\n\r\n if (!isPaymentSectionContainer && !state.isDisabled && state.hasError) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public state: ICheckoutGuidedFormState = {\r\n currentStep: 0\r\n };\r\n\r\n public componentDidMount(): void {\r\n /**\r\n * Append child modules.\r\n */\r\n const childIds = this.props.items.map((item: React.ReactNode) => get(item, 'props.id'));\r\n this.props.moduleState.init({ childIds });\r\n\r\n void this._emitAnalyticsEvent(this.state.currentStep);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { moduleState, items, resource } = this.props;\r\n\r\n if (!items || !moduleState) {\r\n return null;\r\n }\r\n\r\n const shouldCollapseAfterRedirect = this.props.isPaymentVerificationRedirection &&\r\n this.props.shouldEnableSinglePaymentAuthorizationCheckout &&\r\n !this.props.hasError && !this.hasMissingInfo && !this.hasOrderError;\r\n\r\n return (\r\n <div className='ms-checkout__guided-form'>\r\n {items.map((item: React.ReactNode) => {\r\n const childId = this.getId(item);\r\n const step = this.getStep(childId);\r\n const title = this.getHeading(item);\r\n const state = this.props.moduleState.getModule(childId);\r\n const { isReady, isPending, isUpdating, isDisabled, isCancelAllowed, onEdit, onCancel, onSubmit, hasModuleState, hasInitialized } =\r\n state || ({} as IModuleStateManager);\r\n return (\r\n <GuidedCard\r\n key={childId}\r\n step={step}\r\n title={title}\r\n resource={resource}\r\n disabled={!hasModuleState || isDisabled}\r\n isActive={!shouldCollapseAfterRedirect && this.isActive(step)}\r\n isVisted={!shouldCollapseAfterRedirect && this.isVisted(step)}\r\n isExpanded={!shouldCollapseAfterRedirect && this.isExpanded(step)}\r\n isSubmitting={isPending}\r\n isMobile={this.props.isMobile}\r\n isPending={isPending}\r\n isUpdating={isUpdating}\r\n hasInitialized={hasInitialized}\r\n isReady={isReady}\r\n isCancelAllowed={isCancelAllowed}\r\n onSubmit={onSubmit}\r\n onCancel={onCancel}\r\n onEdit={onEdit}\r\n onNext={this.onNext}\r\n hasControlGroup={!this.props.disableGuidedCheckoutFlow && hasInitialized}\r\n telemetryContent={this.props.telemetryContent}\r\n >\r\n {React.cloneElement(item as React.ReactElement, { enableControl: true })}\r\n </GuidedCard>\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n private readonly getEnabledModules = (): string[] => {\r\n const {\r\n moduleState: { childIds, getModule }\r\n } = this.props;\r\n return childIds.filter((childId: string) => {\r\n const state = getModule(childId);\r\n return !!state && !state.isDisabled;\r\n });\r\n };\r\n\r\n private readonly getStep = (id: string): number => {\r\n return this.getEnabledModules().indexOf(id);\r\n };\r\n\r\n private readonly getId = (item: React.ReactNode): string => {\r\n return get(item, 'props.id') || '';\r\n };\r\n\r\n private readonly getHeading = (item: React.ReactNode): Heading => {\r\n return get(item, 'props.config.heading') || '';\r\n };\r\n\r\n private readonly isExpanded = (step: number): boolean => {\r\n if (this.props.isEditor) {\r\n // Editorial mode: Expand all the drawers\r\n return true;\r\n }\r\n return step > -1 && step <= this.state.currentStep;\r\n };\r\n\r\n private readonly isActive = (step: number): boolean => {\r\n return step === this.state.currentStep;\r\n };\r\n\r\n private readonly isVisted = (step: number): boolean => {\r\n return step > -1 && step < this.state.currentStep;\r\n };\r\n\r\n private readonly onNext = (): void => {\r\n void this._emitAnalyticsEvent(this.state.currentStep + 1);\r\n\r\n this.setState({\r\n currentStep: this.state.currentStep + 1\r\n });\r\n };\r\n\r\n //----------------------------------------------------------\r\n // Emit a Checkout Step event\r\n //----------------------------------------------------------\r\n private async _emitAnalyticsEvent(step: number): Promise<void> {\r\n\r\n // Wait for the cart to load -- we need it before we can request attributes\r\n const cart = (await this.props.cart).cart;\r\n if (cart.CartLines && cart.CartLines.length) {\r\n\r\n // Wait for products and attributes to be loaded\r\n // Everything has been requested as early as possible, so these aren't linear events\r\n const attributes = await getAttributesForCart(cart.CartLines, this.props.context.actionContext);\r\n const products = await this.props.products;\r\n const subFrequency = getSubscriptionValues(cart).frequency;\r\n\r\n // Convert to the format the analytics module requires\r\n const mappedProducts = cart.CartLines.map(line => {\r\n const isSubscription = isLineSubscriptionLine(line);\r\n\r\n return {\r\n product: products.find(product => product.RecordId === line.ProductId),\r\n quantity: line.Quantity,\r\n attributes: line.ProductId ? attributes[line.ProductId] : [],\r\n subscription: isSubscription,\r\n frequency: isSubscription && subFrequency,\r\n discounts: line.DiscountLines,\r\n context: this.props.context,\r\n };\r\n });\r\n\r\n publish('checkout', {\r\n step: step + 1, // The cart page is step 0, so start from 1 here\r\n products: mappedProducts,\r\n coupon: cart.Coupons?.map(coupon => coupon.Code).join(','),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport default CheckoutGuidedForm;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\ninterface ICheckoutPlaceOrderButtonProps {\r\n canPlaceOrder: boolean;\r\n checkoutBtnText: string;\r\n telemetryContent?: ITelemetryContent;\r\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\r\n isPlaceOrderLoading?: boolean;\r\n isExpressCheckoutApplied?: boolean;\r\n isPaymentVerificationRedirection?: boolean;\r\n placeOrder(): Promise<void>;\r\n}\r\n\r\nconst buttonsStates: React.Dispatch<React.SetStateAction<boolean>>[] = [];\r\n\r\n/**\r\n * On place order function.\r\n * @param isBusy -Check is busy.\r\n * @param canPlaceOrder -Check can place order.\r\n * @param placeOrder -Place order function.\r\n * @returns Set state of button.\r\n */\r\nconst onPlaceOrderHandler = (isBusy: boolean, canPlaceOrder: boolean, placeOrder: () => Promise<void>) => async () => {\r\n if (isBusy || !canPlaceOrder) {\r\n return;\r\n }\r\n buttonsStates.map(buttonSetState => {\r\n buttonSetState(true);\r\n return true;\r\n });\r\n await placeOrder();\r\n};\r\n\r\nconst CheckoutPlaceOrderButton: React.FC<ICheckoutPlaceOrderButtonProps> = ({\r\n checkoutBtnText, canPlaceOrder, placeOrder, telemetryContent,\r\n shouldEnableSinglePaymentAuthorizationCheckout, isPlaceOrderLoading, isExpressCheckoutApplied, isPaymentVerificationRedirection }) => {\r\n const [isBusy, setIsBusy] = useState(false);\r\n buttonsStates.push(setIsBusy);\r\n const payload = getPayloadObject(TelemetryEvent.Purchase, telemetryContent!, checkoutBtnText, '');\r\n const attributes = getTelemetryAttributes(telemetryContent!, payload);\r\n\r\n if (shouldEnableSinglePaymentAuthorizationCheckout &&\r\n (!isExpressCheckoutApplied || isPaymentVerificationRedirection)) {\r\n return (\r\n <Button\r\n className={classnames('ms-checkout__btn-place-order', { 'is-busy': isPlaceOrderLoading ?? false })}\r\n color='primary'\r\n onClick={placeOrder}\r\n title={checkoutBtnText}\r\n {...attributes}\r\n disabled={!canPlaceOrder || isPlaceOrderLoading}\r\n >\r\n {checkoutBtnText}\r\n </Button>\r\n );\r\n }\r\n\r\n return (\r\n <Button\r\n className={classnames('ms-checkout__btn-place-order', { 'is-busy': isBusy })}\r\n color='primary'\r\n onClick={onPlaceOrderHandler(isBusy, canPlaceOrder, placeOrder)}\r\n title={checkoutBtnText}\r\n {...attributes}\r\n disabled={!canPlaceOrder || isBusy}\r\n >\r\n {checkoutBtnText}\r\n </Button>\r\n );\r\n};\r\n\r\nexport default CheckoutPlaceOrderButton;\r\n","import { IActionContext } from '@msdyn365-commerce/core';\r\nimport { getCartState, getCheckoutState } from '@msdyn365-commerce/global-state';\r\n\r\nasync function emptyActiveCart(ctx: IActionContext): Promise<void> {\r\n let cartState;\r\n let checkoutState;\r\n const lineItemIdsToRemove = [];\r\n\r\n try {\r\n cartState = await getCartState(ctx);\r\n checkoutState = await getCheckoutState(ctx);\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n if (!cartState || !cartState.cart) {\r\n throw new Error('Fail to fetch active cart');\r\n }\r\n\r\n if (!checkoutState || !checkoutState.checkoutCart) {\r\n throw new Error('Fail to fetch checkoutCart cart');\r\n }\r\n\r\n const activeCart = cartState.cart;\r\n const checkoutCart = checkoutState.checkoutCart.cart;\r\n\r\n for (const activeCartLine of activeCart.CartLines || []) {\r\n for (const checkoutCartLine of checkoutCart.CartLines || []) {\r\n if (activeCartLine.LineId && activeCartLine.LineId === checkoutCartLine.LineId) {\r\n lineItemIdsToRemove.push(activeCartLine.LineId);\r\n }\r\n }\r\n }\r\n\r\n try {\r\n await cartState.removeCartLines({ cartLineIds: lineItemIdsToRemove });\r\n await cartState.removeAllPromoCodes({});\r\n await checkoutState.removeCheckoutCartId({});\r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n\r\nexport default emptyActiveCart;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { getCheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { checkoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { getTenderTypesAsync, resolveCardTypesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport {\r\n Address,\r\n CardPaymentAcceptResult,\r\n CardType,\r\n CartTenderLine,\r\n RetailOperation,\r\n SalesOrder,\r\n TenderType,\r\n TokenizedPaymentCard\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nexport const OPERATIONS = {\r\n PayCard: 201,\r\n PayGiftCertificate: 214,\r\n PayLoyalty: 207,\r\n PayCustomerAccount: 202\r\n};\r\n\r\nconst getCardTypeId = async (ctx: IActionContext, cardPrefix: string = ''): Promise<string | undefined> => {\r\n try {\r\n // Check that the card type is credit card ( InternationalCreditCard (0) or CorporateCard (3))\r\n const response = await resolveCardTypesAsync({ callerContext: ctx }, cardPrefix, CardType.Unknown);\r\n if (response && response.length > 0) {\r\n return response[0].TypeId;\r\n }\r\n } catch (error) {\r\n ctx.telemetry.error('Call to resolveCardTypesAsync failed.', error);\r\n }\r\n return undefined;\r\n};\r\n\r\nconst findTenderIdTypeByOperationId = (tenderTypes: TenderType[], operationId: RetailOperation): string | undefined => {\r\n const matchedTenderType = tenderTypes.find(tenderType => tenderType.OperationId === operationId);\r\n if (matchedTenderType) {\r\n return matchedTenderType.TenderTypeId;\r\n }\r\n return;\r\n};\r\n\r\nconst roundNumber = (value: number) => Number(value.toFixed(2));\r\n\r\nasync function getLoyaltyTenderLine(\r\n ctx: IActionContext,\r\n LoyaltyCardId: string,\r\n Amount: number = 0,\r\n Currency: string = 'USD'\r\n): Promise<CartTenderLine> {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n\r\n if (!tenderTypes) {\r\n throw new Error('Fail to get gift card tender line');\r\n }\r\n\r\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayLoyalty);\r\n return {\r\n // @ts-expect-error\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n TenderTypeId,\r\n Amount,\r\n LoyaltyCardId\r\n };\r\n}\r\n\r\nasync function getGiftCardTenderLine(\r\n ctx: IActionContext,\r\n GiftCardId: string = '',\r\n Amount: number = 0,\r\n Currency: string = 'USD',\r\n tenderTypeId?: string,\r\n giftCardPin?: string,\r\n giftCardExpirationYear?: number,\r\n giftCardExpirationMonth?: number\r\n): Promise<CartTenderLine> {\r\n let TenderTypeId = tenderTypeId;\r\n\r\n if (!TenderTypeId) {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n if (!tenderTypes) {\r\n throw new Error('Fail to get gift card tender line');\r\n }\r\n TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayGiftCertificate);\r\n }\r\n\r\n const GiftCardPin = giftCardPin;\r\n const GiftCardExpirationYear = giftCardExpirationYear;\r\n const GiftCardExpirationMonth = giftCardExpirationMonth;\r\n return {\r\n // @ts-expect-error\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n TenderTypeId,\r\n Amount,\r\n GiftCardId,\r\n GiftCardPin,\r\n GiftCardExpirationYear,\r\n GiftCardExpirationMonth\r\n };\r\n}\r\n\r\nasync function getCreditCardTenderLine(\r\n ctx: IActionContext,\r\n tokenizedPaymentCard: TokenizedPaymentCard,\r\n cardPrefix: string = '',\r\n Amount: number = 0,\r\n Currency: string = 'USD',\r\n billingAddress?: Address\r\n): Promise<CartTenderLine> {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n let cartTypeId = tokenizedPaymentCard.CardTypeId;\r\n\r\n if (!cartTypeId) {\r\n cartTypeId = await getCardTypeId(ctx, cardPrefix);\r\n }\r\n\r\n if (!tenderTypes) {\r\n throw new Error('Fail to get card tender type');\r\n }\r\n\r\n if (!cartTypeId) {\r\n throw new Error('Fail to get card type id');\r\n }\r\n\r\n const TenderTypeId = tokenizedPaymentCard.TenderType ?? findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\r\n const cardTenderLine: CartTenderLine = {\r\n // @ts-expect-error\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n Amount,\r\n TenderTypeId,\r\n CardTypeId: cartTypeId\r\n };\r\n cardTenderLine.TokenizedPaymentCard = {\r\n ...tokenizedPaymentCard,\r\n CardTypeId: cartTypeId,\r\n\r\n // @ts-expect-error\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.TokenizedPaymentCard',\r\n House: tokenizedPaymentCard.House || 'N/A',\r\n ...(tokenizedPaymentCard.CardTokenInfo && {\r\n CardTokenInfo: {\r\n ...tokenizedPaymentCard.CardTokenInfo,\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CardTokenInfo'\r\n }\r\n }),\r\n ...(billingAddress && {\r\n Phone: billingAddress.Phone,\r\n Country: billingAddress.ThreeLetterISORegionName,\r\n Address1: billingAddress.Street,\r\n City: billingAddress.City,\r\n State: billingAddress.State,\r\n Zip: billingAddress.ZipCode\r\n })\r\n };\r\n\r\n return cardTenderLine;\r\n}\r\n\r\n/**\r\n * Get credit card tender line.\r\n * @param context - Action context.\r\n * @param amount - Due amount for credit card.\r\n * @param currency - Currency.\r\n * @param cardPaymentAcceptResult - CardPaymentAcceptResult.\r\n * @param billingAddress - BillingAddress.\r\n * @returns - The credit card tender line.\r\n */\r\nasync function getCreditCardTenderLineForSinglePaymentAuth(\r\n context: IActionContext,\r\n amount: number = 0,\r\n currency: string = 'USD',\r\n cardPaymentAcceptResult?: CardPaymentAcceptResult,\r\n billingAddress?: Address\r\n): Promise<CartTenderLine> {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: context, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n\r\n const tenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\r\n\r\n if (cardPaymentAcceptResult) {\r\n cardPaymentAcceptResult.TokenizedPaymentCard = {\r\n // @ts-expect-error\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.TokenizedPaymentCard',\r\n House: 'N/A',\r\n ...(billingAddress && {\r\n Phone: billingAddress.Phone,\r\n Country: billingAddress.ThreeLetterISORegionName,\r\n Address1: billingAddress.Street,\r\n City: billingAddress.City,\r\n State: billingAddress.State,\r\n Zip: billingAddress.ZipCode\r\n })\r\n };\r\n }\r\n\r\n const cardTenderLine: CartTenderLine = {\r\n // @ts-expect-error -- existing data.\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n 'Amount@odata.type': '#Decimal',\r\n Currency: currency,\r\n Amount: amount,\r\n TenderTypeId: tenderTypeId,\r\n CardPaymentAcceptResult: cardPaymentAcceptResult\r\n };\r\n\r\n return cardTenderLine;\r\n}\r\n\r\nasync function createCustomerAccountTenderLine(\r\n ctx: IActionContext,\r\n Amount: number,\r\n Currency: string = 'USD'\r\n): Promise<CartTenderLine> {\r\n const CustomerId = null;\r\n if (!ctx.requestContext.user.isAuthenticated) {\r\n ctx.telemetry.error('A customer id is required to pay with customer account');\r\n }\r\n\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n\r\n if (!tenderTypes) {\r\n ctx.telemetry.error('No tender types found for this channel');\r\n }\r\n\r\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCustomerAccount);\r\n if (!TenderTypeId) {\r\n ctx.telemetry.error('No customer account tender type');\r\n }\r\n return {\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n TenderTypeId,\r\n Amount,\r\n\r\n // @ts-expect-error\r\n CustomerId\r\n };\r\n}\r\n\r\nexport default async (ctx: IActionContext, updatedCartVersion?: number, isPaymentVerificationRedirection?: boolean): Promise<SalesOrder> => {\r\n const checkoutState = await getCheckoutState(ctx).catch(error => {\r\n throw error;\r\n });\r\n\r\n const cartState = checkoutState.checkoutCart;\r\n\r\n const channelConfiguration = ctx.requestContext.channel;\r\n\r\n if (!cartState || Object.keys(cartState).length === 0 || !channelConfiguration) {\r\n throw new Error('Fail to placeOrder');\r\n }\r\n\r\n const {\r\n giftCardExtends,\r\n tokenizedPaymentCard,\r\n cardPrefix,\r\n guestCheckoutEmail,\r\n billingAddress,\r\n loyaltyAmount,\r\n cardPaymentAcceptResult,\r\n shouldEnableSinglePaymentAuthorizationCheckout,\r\n isExpressCheckoutApplied,\r\n isExpressAddressApplied\r\n } = checkoutState;\r\n const { Currency } = channelConfiguration;\r\n\r\n let amountDue = cartState.cart.AmountDue || 0;\r\n let cartTenderLines;\r\n const getTenderLinePromises = [];\r\n const loyaltyCardNumber = cartState.cart.LoyaltyCardId;\r\n\r\n // Pay by loyalty first\r\n if (loyaltyAmount && loyaltyCardNumber) {\r\n const chargedAmount = roundNumber(Math.min(loyaltyAmount, amountDue));\r\n const loyaltyTenderLinePromise = getLoyaltyTenderLine(ctx, loyaltyCardNumber, chargedAmount, Currency);\r\n getTenderLinePromises.push(loyaltyTenderLinePromise);\r\n amountDue = roundNumber(amountDue - chargedAmount);\r\n }\r\n\r\n // Then by gift card\r\n if (giftCardExtends && giftCardExtends.length > 0) {\r\n giftCardExtends.some(giftCardExtend => {\r\n if (giftCardExtend.Balance && amountDue > 0) {\r\n const chargedAmount = roundNumber(Math.min(giftCardExtend.Balance, amountDue));\r\n const tenderTypeId = giftCardExtend.TenderTypeId;\r\n const giftCardPin = giftCardExtend.Pin;\r\n const giftCardExpirationYear = giftCardExtend.ExpirationDate ? Number.parseInt(giftCardExtend.ExpirationDate?.split('/')[1], 10) : undefined;\r\n const giftCardExpirationMonth = giftCardExtend.ExpirationDate ? Number.parseInt(giftCardExtend.ExpirationDate?.split('/')[0], 10) : undefined;\r\n const creditCardTenderLinePromise = getGiftCardTenderLine(ctx, giftCardExtend.Id, chargedAmount, Currency, tenderTypeId, giftCardPin, giftCardExpirationYear, giftCardExpirationMonth);\r\n getTenderLinePromises.push(creditCardTenderLinePromise);\r\n amountDue = roundNumber(amountDue - chargedAmount);\r\n }\r\n return amountDue === 0;\r\n });\r\n }\r\n\r\n // Then by customer account\r\n if (checkoutState.customerAccountAmount > 0) {\r\n const chargedAmount = roundNumber(Math.min(checkoutState.customerAccountAmount, amountDue));\r\n const customerAccountTenderLinePromise = createCustomerAccountTenderLine(ctx, chargedAmount, Currency);\r\n getTenderLinePromises.push(customerAccountTenderLinePromise);\r\n amountDue = roundNumber(amountDue - chargedAmount);\r\n }\r\n\r\n // Pay the rest by credit card\r\n if (amountDue > 0) {\r\n let creditCardTenderLinePromise: Promise<CartTenderLine>;\r\n\r\n if (\r\n shouldEnableSinglePaymentAuthorizationCheckout &&\r\n (!(isExpressCheckoutApplied && !isExpressAddressApplied) || (isExpressCheckoutApplied && isPaymentVerificationRedirection))\r\n ) {\r\n creditCardTenderLinePromise = getCreditCardTenderLineForSinglePaymentAuth(\r\n ctx,\r\n amountDue,\r\n Currency,\r\n cardPaymentAcceptResult,\r\n billingAddress\r\n );\r\n } else {\r\n if (!tokenizedPaymentCard) {\r\n throw new Error('Fail to placeOrder: no token found');\r\n }\r\n creditCardTenderLinePromise = getCreditCardTenderLine(\r\n ctx,\r\n tokenizedPaymentCard,\r\n cardPrefix,\r\n amountDue,\r\n Currency,\r\n billingAddress\r\n );\r\n }\r\n\r\n getTenderLinePromises.push(creditCardTenderLinePromise);\r\n }\r\n\r\n if (getTenderLinePromises.length > 0) {\r\n // When payment methods is required\r\n cartTenderLines = await Promise.all(getTenderLinePromises).catch(error => {\r\n throw error;\r\n });\r\n\r\n if (!cartTenderLines || cartTenderLines.length === 0) {\r\n throw new Error('Fail to placeOrder: fail to get cart tender lines');\r\n }\r\n }\r\n\r\n const cartVersion = updatedCartVersion || cartState.cart.Version;\r\n\r\n // Proceed checkout\r\n const salesOrder = await checkoutAsync(\r\n { callerContext: ctx, bypassCache: 'get' },\r\n cartState.cart.Id,\r\n guestCheckoutEmail,\r\n // @ts-ignore fields tokenizedPaymentCard and receiptNumberSequence are optional\r\n undefined,\r\n undefined,\r\n cartTenderLines || null,\r\n cartVersion\r\n ).catch(async error => {\r\n if (checkoutState.shouldEnableSinglePaymentAuthorizationCheckout) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown type.\r\n if (error.data?.AdditionalContext) {\r\n await checkoutState.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown type.\r\n await checkoutState.updateRedirectAdditionalContext({ newRedirectAdditionalContext: error?.data?.AdditionalContext as string });\r\n await checkoutState.updateRedirectPaymentConnectorId({ newRedirectPaymentConnectorId: cardPaymentAcceptResult?.Settings?.PaymentConnectorId as string });\r\n } else {\r\n await checkoutState.updateIsCheckoutCallFailed({ newIsCheckoutCallFailed: true });\r\n\r\n if (isPaymentVerificationRedirection) {\r\n await checkoutState.checkoutCart.refreshCart({});\r\n await checkoutState.updateIsExpressCheckoutApplied({ newIsExpressCheckoutApplied: false});\r\n await checkoutState.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\r\n }\r\n }\r\n }\r\n\r\n throw error;\r\n });\r\n\r\n if (!salesOrder) {\r\n throw new Error('Fail to placeOrder: fail to checkout');\r\n }\r\n\r\n return salesOrder;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\nimport { IModuleStateManager, IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, TelemetryConstant, Waiting } from '@msdyn365-commerce-modules/utilities';\r\nimport { Cart, CartLineValidationResults, CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport { AsyncResultStatus, getUrlSync, Text, ContentEditableEvent } from '@msdyn365-commerce/core';\r\nimport { updateLineDeliverySpecificationsAsync, validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport {\r\n DeliveryPreferenceType,\r\n LineDeliverySpecification,\r\n SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport {\r\n ArrayExtensions,\r\n getAvailabilitiesForCartLineItems,\r\n IProductInventoryInformation,\r\n ProductAvailabilitiesForCartLineItems,\r\n validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport classnames from 'classnames';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport { computed, reaction, when } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { SubscriptionCommerceValues } from '../../common/subscription-commerce.values';\r\nimport { wineClubSetup } from '../../settings/app.settings';\r\nimport { getSubscriptionValues, updateSubscription } from '../../Utilities/subscription-manager';\r\nimport AlertComponent from './components/alert';\r\nimport { getInvoicePaymentSummary, IInvoicePaymentSummary } from './components/get-invoice-payment-summary';\r\nimport { getLineItems, ILineItems } from './components/get-line-items';\r\nimport { getOrderSummary, IOrderSummary } from './components/get-order-summary';\r\nimport GuidedFormComponent from './components/guided-form';\r\nimport PlaceOrderButtonComponent from './components/place-order-button';\r\nimport placeOrder from './methods/place-order';\r\nimport { ISmweCheckoutData } from './smwe-checkout.data';\r\nimport { ICheckoutHeadingData, ISmweCheckoutProps } from './smwe-checkout.props.autogenerated';\r\n\r\nexport * from './components/get-line-items';\r\nexport * from './components/get-order-summary';\r\n\r\n/**\r\n * Device type.\r\n */\r\ntype DeviceType = 'Mobile';\r\n\r\n/**\r\n * The Checkout state.\r\n */\r\ninterface ICheckoutState {\r\n errorMessage: string;\r\n isValidationPassed: boolean;\r\n isPlaceOrderLoading?: boolean;\r\n}\r\n\r\n/**\r\n * The Checkout view props.\r\n * @extends ISmweCheckoutProps<ISmweCheckoutData>\r\n */\r\nexport interface ICheckoutViewProps extends ISmweCheckoutProps<ISmweCheckoutData> {\r\n className: string;\r\n canShow?: boolean;\r\n isEmptyCart?: boolean;\r\n isConsentGiven?: boolean;\r\n hasError?: boolean;\r\n isPaymentVerificationRedirection?: boolean;\r\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\r\n cartStatus?: string;\r\n isMobile?: boolean;\r\n isEditorialMode?: boolean;\r\n backToShoppingUrl?: string;\r\n editCartLink?: string;\r\n hasSalesOrder: boolean;\r\n hasInvoiceLine?: boolean;\r\n\r\n checkoutProps: IModuleProps;\r\n headerProps: INodeProps;\r\n bodyProps: INodeProps;\r\n mainProps: INodeProps;\r\n mainControlProps: INodeProps;\r\n sideProps: INodeProps;\r\n sideControlFirstProps: INodeProps;\r\n sideControlSecondProps: INodeProps;\r\n termsAndConditionsProps: INodeProps;\r\n\r\n guidedForm?: React.ReactNode;\r\n title?: React.ReactNode;\r\n loading?: React.ReactNode;\r\n alert?: React.ReactNode;\r\n orderSummary?: IOrderSummary;\r\n invoicePaymentSummary?: IInvoicePaymentSummary;\r\n lineItems?: ILineItems;\r\n placeOrderButton?: React.ReactNode;\r\n termsAndConditions?: React.ReactNode;\r\n keepShoppingButton?: React.ReactNode;\r\n orderConfirmation?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * The checkout module props interface.\r\n */\r\nexport interface ICheckoutModuleProps extends ISmweCheckoutProps<ISmweCheckoutData>, IModuleStateProps { }\r\n\r\nconst expressPaymentSectionClassName = 'msc-express-payment-container';\r\n\r\n/**\r\n *\r\n * CheckoutContainer component.\r\n * @extends {React.Component<ICheckoutModuleProps>}\r\n */\r\n// @ts-expect-error\r\n@withModuleState\r\n@observer\r\nclass Checkout extends React.PureComponent<ICheckoutModuleProps> {\r\n public state: ICheckoutState = {\r\n errorMessage: '',\r\n isValidationPassed: false,\r\n isPlaceOrderLoading: false\r\n };\r\n\r\n @computed get cartStatus(): AsyncResultStatus {\r\n return this.props.data.checkout?.status;\r\n }\r\n\r\n @computed get isEmptyCart(): boolean {\r\n if (this.isEditorialMode) {\r\n // Editorial mode: Ignore empty cart\r\n return false;\r\n }\r\n const cart = this.props.data.checkout?.result?.checkoutCart?.cart;\r\n return this.cartStatus === 'SUCCESS' && !!cart && !isEmpty(cart) && (!cart.CartLines || cart.CartLines.length === 0);\r\n }\r\n\r\n @computed get hasError(): boolean {\r\n const cart = this.props.data.checkout?.result?.checkoutCart?.cart;\r\n return this.cartStatus === 'FAILED' || (this.cartStatus === 'SUCCESS' && (!cart || isEmpty(cart)));\r\n }\r\n\r\n @computed get isEditorialMode(): boolean {\r\n return this.props.context.request.params.isEditor;\r\n }\r\n\r\n @computed get canPlaceOrder(): boolean {\r\n const isTermsAndConditionAccepted = this.props.data.checkout.result && this.props.data.checkout.result?.isTermsAndConditionAccepted;\r\n\r\n const shouldEnableSinglePaymentAuthorizationCheckout = this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout ?? false;\r\n\r\n // If isTermsAndConditionAccepted is undefined means TermsAndCondition module is not added to page and we should able to place order.\r\n return this.props.moduleState.isReady &&\r\n (isTermsAndConditionAccepted === undefined ||\r\n isTermsAndConditionAccepted ||\r\n shouldEnableSinglePaymentAuthorizationCheckout) &&\r\n ((this.state.errorMessage === '' || shouldEnableSinglePaymentAuthorizationCheckout) || (this.props.data.checkout.result?.isPaymentVerificationRedirection ?? false));\r\n }\r\n\r\n @computed private get _clubItemIds(): string[] {\r\n const wineClub = this.props.app.config.wineClubSetup as wineClubSetup;\r\n const ids: string[] = [];\r\n wineClub.forEach(club => club.variants.forEach(variant => ids.push(variant.itemId)));\r\n return ids;\r\n }\r\n\r\n constructor(props: ICheckoutModuleProps) {\r\n super(props);\r\n if (props.config.subscriptions) {\r\n props.data.cart.then(() => {\r\n this._setDefaultSubscriptionFields().then(() => {\r\n this.props.telemetry.debug('Successfully set default subscription fields');\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.debug(`[_setDefaultSubscriptionFields] ${error}`);\r\n });\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }\r\n }\r\n\r\n @computed get isCartReady(): boolean {\r\n return !!this.props.data.checkout.result?.checkoutCart?.cart &&\r\n this.props.data.customerInformation.status !== 'LOADING' &&\r\n this.props.data.featureState.status !== 'LOADING';\r\n }\r\n\r\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry);\r\n\r\n public componentDidMount(): void {\r\n const {\r\n resources: { genericErrorMessage }\r\n } = this.props;\r\n // @ts-ignore: Compiler not reconizing condition check for function params\r\n when(\r\n () => this.hasError,\r\n () => {\r\n this.setState({\r\n errorMessage: genericErrorMessage\r\n });\r\n this.props.context.telemetry.error('Failed to get cart');\r\n }\r\n );\r\n\r\n // @ts-ignore: Compiler not reconizing condition check for function params\r\n when(\r\n () => {\r\n return this.isEmptyCart;\r\n },\r\n () => {\r\n this.redirectToCartPage('Cart is empty, but no editCartLink found');\r\n }\r\n );\r\n\r\n if (this.props.config.isWineClubCheckout) {\r\n this._isCartValidAsClub()\r\n .then(isValid => {\r\n if (!isValid) {\r\n const notFoundEditCartLinkMessage = 'Cart doesn\\'t pass validation, but no editCartLink found';\r\n this.redirectToCartPage(notFoundEditCartLinkMessage);\r\n }\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }\r\n\r\n when(\r\n () => this.isCartReady,\r\n () => {\r\n this.validateForCheckout();\r\n }\r\n );\r\n\r\n reaction(\r\n () => this.props.moduleState.isReady,\r\n () => {\r\n this.onContainerReady();\r\n }\r\n );\r\n\r\n // Reaction to call place order when isPaymentSectionContainerReady is true for new checkout flow.\r\n reaction(\r\n () => this.props.data.checkout.result?.isPaymentSectionContainerReady,\r\n async (isReady) => {\r\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && isReady &&\r\n !this.props.data.checkout.result?.redirectAdditionalContext &&\r\n (!this.props.data.checkout.result?.isExpressCheckoutApplied || this.props.data.checkout.result?.isPaymentVerificationRedirection)) {\r\n if (!this.state.isPlaceOrderLoading) {\r\n this.setState({ isPlaceOrderLoading: true });\r\n }\r\n\r\n await this.onPlaceOrder();\r\n\r\n // If 3D authentication redirection, don't update isPlaceOrderLoading\r\n if (!this.props.data.checkout.result.isPaymentVerificationRequired) {\r\n this.setState({ isPlaceOrderLoading: false });\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Reaction to enable place order button when isPaymentSectionContainerHasError is true for new checkout flow.\r\n reaction(\r\n () => this.props.data.checkout.result?.isPaymentSectionContainerHasError,\r\n (hasError) => {\r\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && hasError) {\r\n this.setState({ isPlaceOrderLoading: false });\r\n }\r\n }\r\n );\r\n\r\n // Reaction to enable place order button when redirection is true for new checkout flow.\r\n reaction(\r\n () => this.canPlaceOrder,\r\n async () => {\r\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && this.canPlaceOrder) {\r\n if (this.props.data.checkout.result?.isPaymentVerificationRedirection) {\r\n await this.props.data.checkout.result.updateIsPlaceOrderEnabledInRedirection({\r\n newIsPlaceOrderEnabledInRedirection: true\r\n });\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n // eslint-disable-next-line complexity -- ignore the complexity.\r\n public render(): JSX.Element {\r\n const {\r\n moduleState,\r\n config: { className, checkoutHeading, disableGuidedCheckoutFlow },\r\n resources,\r\n context: {\r\n request: {\r\n user: {\r\n isAuthenticated\r\n }\r\n }\r\n }\r\n } = this.props;\r\n const { errorMessage } = this.state;\r\n const { backToShopping, placeOrderText, confirmPaymentText, cookieConsentRequiredMessage, genericErrorMessage } = resources;\r\n const checkoutClass = classnames('ms-checkout', className);\r\n const checkoutInformation = this.getSlotItems('checkoutInformation');\r\n\r\n const isConsentGiven =\r\n this.props.context.request &&\r\n this.props.context.request.cookies &&\r\n this.props.context.request.cookies.isConsentGiven &&\r\n this.props.context.request.cookies.isConsentGiven();\r\n\r\n const isMobile =\r\n this.props.context.request &&\r\n this.props.context.request.device &&\r\n (this.props.context.request.device.Type as DeviceType) === 'Mobile';\r\n\r\n const backToShoppingUrlOverride = this.props.config.backToShoppingOverride?.destinationUrl;\r\n const backToShoppingUrl = backToShoppingUrlOverride || getUrlSync('home', this.props.context.actionContext) || '';\r\n const editCartLink = getUrlSync('cart', this.props.context.actionContext) || '';\r\n\r\n const termsAndConditions =\r\n this.props.slots.termsAndConditions &&\r\n this.props.slots.termsAndConditions.length > 0 &&\r\n this.props.slots.termsAndConditions[0];\r\n\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\r\n const backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n\r\n const hasInvoiceLine = this.props.data.checkout && this.props.data.checkout.result?.checkoutCart.hasInvoiceLine;\r\n const checkoutBtnText = hasInvoiceLine ? confirmPaymentText : placeOrderText;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n const shouldEnableSinglePaymentAuthorizationCheckout = this.props.data.checkout?.result?.shouldEnableSinglePaymentAuthorizationCheckout ?? false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const isExpressCheckoutApplied = this.props.data.checkout?.result?.isExpressCheckoutApplied ?? false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const hasShippingAddress = this.props.data.checkout?.result?.hasShippingAddress;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const hasCartDeliveryMode = this.props.data.checkout?.result?.hasCartDeliveryMode;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const hasGuestCheckoutEmail = this.props.data.checkout?.result?.hasGuestCheckoutEmail;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const isTermsAndConditionAccepted = this.props.data.checkout?.result?.isTermsAndConditionAccepted;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const isPaymentVerificationRedirection = this.props.data.checkout?.result?.isPaymentVerificationRedirection ?? false;\r\n\r\n let hasExpressPaymentContainer = false;\r\n\r\n if (typeof window !== 'undefined' &&\r\n (document?.getElementsByClassName(expressPaymentSectionClassName) as HTMLCollectionOf<HTMLElement>)[0]?.style.display === '') {\r\n hasExpressPaymentContainer = true;\r\n }\r\n\r\n let viewProps: ICheckoutViewProps = {\r\n ...this.props,\r\n className: checkoutClass,\r\n isEmptyCart: this.isEmptyCart,\r\n isConsentGiven,\r\n hasError: this.hasError,\r\n hasSalesOrder: this.props.data.checkout && this.props.data.checkout.result !== undefined && this.props.data.checkout.result.salesOrder !== undefined,\r\n isPaymentVerificationRedirection: this.props.data.checkout?.result?.isPaymentVerificationRedirection,\r\n shouldEnableSinglePaymentAuthorizationCheckout,\r\n hasInvoiceLine,\r\n cartStatus: this.cartStatus,\r\n isMobile,\r\n backToShoppingUrl,\r\n editCartLink,\r\n isEditorialMode: this.isEditorialMode,\r\n orderConfirmation: this.props.slots.orderConfirmation && this.props.slots.orderConfirmation.length > 0 ? this.props.slots.orderConfirmation[0] : undefined,\r\n checkoutProps: { moduleProps: this.props, className: checkoutClass },\r\n headerProps: { className: 'ms-checkout__head' },\r\n bodyProps: { className: 'ms-checkout__body' },\r\n mainProps: { className: 'ms-checkout__main' },\r\n mainControlProps: { className: 'ms-checkout__main-control' },\r\n sideProps: { className: hasExpressPaymentContainer ? 'ms-checkout__has-express-side' : 'ms-checkout__side' },\r\n sideControlFirstProps: { className: 'ms-checkout__side-control-first' },\r\n sideControlSecondProps: { className: 'ms-checkout__side-control-second' },\r\n termsAndConditionsProps: { className: 'ms-checkout__terms-and-conditions' },\r\n title: checkoutHeading && (\r\n this.renderMsdyn365Text(checkoutHeading)\r\n )\r\n };\r\n\r\n if (!isConsentGiven && isAuthenticated) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: <AlertComponent {...{ message: cookieConsentRequiredMessage }} />\r\n };\r\n } else if (this.isLoading()) {\r\n viewProps = {\r\n ...viewProps,\r\n loading: <Waiting className='msc-waiting-circular msc-waiting-lg' />\r\n };\r\n } else if (this.hasError) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: <AlertComponent {...{ message: genericErrorMessage }} />\r\n };\r\n } else {\r\n viewProps = {\r\n ...viewProps,\r\n alert: errorMessage && <AlertComponent {...{ message: errorMessage }} />,\r\n canShow: true,\r\n guidedForm: checkoutInformation ? (\r\n <GuidedFormComponent\r\n {...{\r\n items: checkoutInformation,\r\n moduleState,\r\n disableGuidedCheckoutFlow,\r\n resource: resources,\r\n isMobile,\r\n isEditor: this.isEditorialMode,\r\n products: this.props.data.products,\r\n cart: this.props.data.cart,\r\n telemetryContent: this.telemetryContent,\r\n isPaymentVerificationRedirection: this.props.data.checkout?.result?.isPaymentVerificationRedirection,\r\n shouldEnableSinglePaymentAuthorizationCheckout,\r\n hasError: !!errorMessage,\r\n hasShippingAddress,\r\n hasCartDeliveryMode,\r\n hasGuestCheckoutEmail,\r\n isTermsAndConditionAccepted,\r\n context: this.props.context\r\n }}\r\n />\r\n ) : (\r\n undefined\r\n ),\r\n orderSummary: getOrderSummary(this.props),\r\n invoicePaymentSummary: getInvoicePaymentSummary(this.props),\r\n lineItems: hasInvoiceLine ? undefined : getLineItems(this.props, this.telemetryContent),\r\n placeOrderButton: (\r\n <PlaceOrderButtonComponent {...{\r\n checkoutBtnText,\r\n placeOrder: (\r\n !isExpressCheckoutApplied && shouldEnableSinglePaymentAuthorizationCheckout\r\n ) ? this.triggerPaymentWithPlaceOrder : this.onPlaceOrder,\r\n\r\n canPlaceOrder: this.canPlaceOrder,\r\n telemetryContent: this.telemetryContent,\r\n shouldEnableSinglePaymentAuthorizationCheckout: this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout,\r\n isPlaceOrderLoading: this.state.isPlaceOrderLoading,\r\n isExpressCheckoutApplied,\r\n isPaymentVerificationRedirection\r\n }} />\r\n ),\r\n termsAndConditions,\r\n keepShoppingButton: backToShoppingUrl && (\r\n <Button\r\n className='ms-checkout__btn-keep-shopping msc-btn'\r\n title={backToShopping}\r\n color='secondary'\r\n href={backToShoppingUrl}\r\n {...backToShoppingAttributes}\r\n >\r\n {backToShopping}\r\n </Button>\r\n )\r\n };\r\n }\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Renders heading.\r\n * @param checkoutHeading - The checkout heading.\r\n * @returns React node.\r\n */\r\n public renderMsdyn365Text(checkoutHeading: ICheckoutHeadingData): React.ReactNode {\r\n return (\r\n <Text\r\n {...checkoutHeading}\r\n tag={checkoutHeading.tag || 'h2'}\r\n className='ms-checkout__title'\r\n text={checkoutHeading.text}\r\n editProps={{ onEdit: this.handleCheckoutHeadingChange, requestContext: this.props.context.request }}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Event handler for heading change event.\r\n * @param event - The content change event in heading element.\r\n * @returns The new heading value.\r\n */\r\n public handleCheckoutHeadingChange = (event: ContentEditableEvent) => this.props.config.checkoutHeading!.text = event.target.value;\r\n\r\n /**\r\n * Checks if cart is loading.\r\n * @returns True if is loading, false otherwise.\r\n */\r\n private readonly isLoading = (): boolean => {\r\n return !this.cartStatus || this.cartStatus === 'LOADING' || this.isEmptyCart || !this.state.isValidationPassed;\r\n };\r\n\r\n /**\r\n * Get slot items.\r\n * @param key - The slot key.\r\n * @returns React node or undefined.\r\n */\r\n private readonly getSlotItems = (key: string): React.ReactNode[] | undefined => {\r\n const { slots } = this.props;\r\n return slots && slots[key] && slots[key].length > 0 ? slots[key] : undefined;\r\n };\r\n\r\n /**\r\n * Redirects to cart page.\r\n * @param notFoundEditCartLinkMessage - Not found edit cart link message.\r\n */\r\n private readonly redirectToCartPage = (notFoundEditCartLinkMessage: string): void => {\r\n const {\r\n resources: { genericErrorMessage }\r\n } = this.props;\r\n const editCartLink = getUrlSync('cart', this.props.context.actionContext) || '';\r\n if (window && editCartLink) {\r\n window.location.assign(editCartLink);\r\n } else {\r\n this.setState({\r\n errorMessage: genericErrorMessage\r\n });\r\n this.props.context.telemetry.error(notFoundEditCartLinkMessage);\r\n }\r\n };\r\n\r\n private async _isCartValidAsClub(): Promise<boolean> {\r\n const checkoutState = await this.props.data.checkout;\r\n const lines = checkoutState.checkoutCart.cart.CartLines || [];\r\n if (lines.length !== 1) { return false; } // you can only checkout with one item\r\n // find the first existing line\r\n const line = lines.find(lineFind => !!lineFind)!;\r\n const isClubItem = this._clubItemIds.find(clubItemId => line.ProductId === +clubItemId);\r\n if (!isClubItem) { return false; }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Trigger the payment section container submit when placing order.\r\n */\r\n private readonly triggerPaymentWithPlaceOrder = async (): Promise<void> => {\r\n this.setState({ isPlaceOrderLoading: true });\r\n\r\n await this.props.data.checkout.result?.updateShouldTriggerPaymentWithPlaceOrder(\r\n { newShouldTriggerPaymentWithPlaceOrder: !this.props.data.checkout.result.shouldTriggerPaymentWithPlaceOrder });\r\n };\r\n\r\n /**\r\n * On place order.\r\n * @returns Void promise.\r\n */\r\n private readonly onPlaceOrder = async (): Promise<void> => {\r\n const {\r\n resources: { checkoutOutOfStockErrorMessage, genericErrorMessage, invalidCartVersionErrorMessage, missingRequiredCartTenderLinesErrorMessage },\r\n context: { actionContext, app: { config: { enableStockCheck = false } } },\r\n slots: { orderConfirmation },\r\n data: { checkout, products }\r\n } = this.props;\r\n\r\n if (this.props.config.isWineClubCheckout) {\r\n await this._setWineClubDeliveryOption();\r\n }\r\n\r\n // If hasInvoiceLine is true, no inventory check\r\n if (!this.props.data.checkout.result?.checkoutCart.hasInvoiceLine && enableStockCheck &&\r\n await this.isOverMaxQuantity((await checkout).checkoutCart.cart, (await products))) {\r\n this.setState({\r\n errorMessage: checkoutOutOfStockErrorMessage\r\n });\r\n this.props.context.telemetry.error(checkoutOutOfStockErrorMessage);\r\n } else {\r\n const hasOrderConfirmation = orderConfirmation && orderConfirmation.length > 0;\r\n const cartState = (await this.props.data.checkout).checkoutCart;\r\n let updatedCartVersion = cartState.cart.Version;\r\n const giftCardLines = cartState?.cart.CartLines?.filter(line => line.IsGiftCardLine);\r\n const isPurchasingGiftCard = giftCardLines?.length! > 0;\r\n if(!isPurchasingGiftCard) {\r\n updatedCartVersion = await this.updateCartLineEmailAddress(this.props.data.checkout.result?.guestCheckoutEmail || '');\r\n }\r\n const orderConfirmationLinkOverride = this.props.config.orderConfirmationOverride?.destinationUrl;\r\n await placeOrder(actionContext, this.props.data.checkout.result, this.props.data.products.result, !hasOrderConfirmation, orderConfirmationLinkOverride, updatedCartVersion, this.props.data.checkout.result?.isPaymentVerificationRedirection).catch(error => {\r\n let errorMessage = genericErrorMessage;\r\n\r\n if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n errorMessage = invalidCartVersionErrorMessage;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown error type.\r\n } else if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines') {\r\n errorMessage = missingRequiredCartTenderLinesErrorMessage;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown error type.\r\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && error.data?.AdditionalContext &&\r\n !this.props.data.checkout.result?.isPaymentVerificationRedirection) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n errorMessage\r\n });\r\n this.props.telemetry.exception(error);\r\n });\r\n\r\n await checkout.result?.updateIsPaymentSectionContainerReady({ newIsPaymentSectionContainerReady: false });\r\n }\r\n };\r\n\r\n private async _setWineClubDeliveryOption(): Promise<void> {\r\n const checkoutState = await this.props.data.checkout;\r\n const deliveryOptionInput = {\r\n deliveryModeId: this.props.app.config.wineClubDeliveryOption,\r\n shippingAddress: checkoutState.shippingAddress || {}\r\n };\r\n\r\n await checkoutState.checkoutCart.updateCartDeliverySpecification(\r\n deliveryOptionInput\r\n )\r\n .then((response) => {\r\n if (response.status === 'FAILED') {\r\n this.props.moduleState.setHasError(true);\r\n this.props.moduleState.onUpdating();\r\n }\r\n })\r\n .catch(() => {\r\n this.props.moduleState.setHasError(true);\r\n this.props.moduleState.onUpdating();\r\n });\r\n }\r\n\r\n /**\r\n * Update receipt email address for electronic cart line.\r\n * @param newGuestCheckoutEmail - The guest checkout email.\r\n * @returns The updated cart version.\r\n */\r\n private readonly updateCartLineEmailAddress = async (newGuestCheckoutEmail: string): Promise<number | undefined> => {\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n\r\n const emailDeliveryCartLines = this.props.data.checkout.result?.checkoutCart.cart.CartLines?.filter(\r\n cartLine => (cartLine.DeliveryMode && cartLine.DeliveryMode !== '' && cartLine.DeliveryMode === emailDeliveryModeCode)\r\n );\r\n\r\n let updatedCartVersion: number | undefined;\r\n if (emailDeliveryCartLines && emailDeliveryCartLines.length > 0) {\r\n const lineDeliverySpecifications: LineDeliverySpecification[] = emailDeliveryCartLines.map(line => {\r\n return { LineId: line.LineId,\r\n DeliverySpecification: {\r\n DeliveryModeId: emailDeliveryModeCode,\r\n DeliveryPreferenceTypeValue: DeliveryPreferenceType.ElectronicDelivery,\r\n ElectronicDeliveryEmailAddress: newGuestCheckoutEmail\r\n }\r\n };\r\n });\r\n\r\n await updateLineDeliverySpecificationsAsync(\r\n { callerContext: this.props.context.actionContext },\r\n (await this.props.data.checkout).checkoutCart.cart.Id,\r\n lineDeliverySpecifications\r\n ).then(updatedCart => {\r\n updatedCartVersion = updatedCart.Version;\r\n }).catch(error => {\r\n this.props.context.actionContext.telemetry.exception(error);\r\n throw new Error('[updateLineDeliverySpecificationsAsync] Unable to update electronic delivery email address in cart');\r\n });\r\n }\r\n\r\n return updatedCartVersion;\r\n };\r\n\r\n /**\r\n * Return true if any product in the cart is over its max quantity.\r\n * @param cart -- The checkout cart.\r\n * @param products -- The checkout products.\r\n * @returns - Is any product in the cart is over max quantity.\r\n */\r\n private readonly isOverMaxQuantity = async (cart: Cart, products: SimpleProduct[]): Promise<boolean> => {\r\n let isOverMaxQuantity = false;\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n\r\n await getAvailabilitiesForCartLineItems(\r\n new ProductAvailabilitiesForCartLineItems(this.props.context.actionContext.requestContext.apiSettings),\r\n this.props.context.actionContext\r\n ).then(productInventoryInformation => {\r\n const productsThatShouldValidateInventory: IProductInventoryInformation [] = [];\r\n\r\n cart.CartLines?.map((cartline) => {\r\n\r\n const cartlineProduct = products.find(product => product.RecordId === cartline.ProductId);\r\n\r\n // If product is non-stocked or cartline is electronic delivery, then no inventory check\r\n const isStockedItem = cartlineProduct?.Behavior?.IsStockedProduct;\r\n const isEmailDelivery = (cartline.DeliveryMode && cartline.DeliveryMode !== '') ? cartline.DeliveryMode === emailDeliveryModeCode : false;\r\n const shouldSkipInventoryCheck = !isStockedItem || isEmailDelivery;\r\n if (!shouldSkipInventoryCheck && ArrayExtensions.hasElements(productInventoryInformation)) {\r\n const foundProductAvailability = productInventoryInformation.find((productInventory) => {\r\n return productInventory.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n if (foundProductAvailability) {\r\n productsThatShouldValidateInventory.push(foundProductAvailability);\r\n }\r\n }\r\n });\r\n\r\n const cartLinesInventoryValidation = validateCartLinesInventory(\r\n cart.CartLines ?? [],\r\n productsThatShouldValidateInventory,\r\n this.props.context.actionContext,\r\n products,\r\n emailDeliveryModeCode);\r\n\r\n // If is invalid then exceeds the available quantity\r\n isOverMaxQuantity = !cartLinesInventoryValidation.isValid;\r\n return isOverMaxQuantity;\r\n }).catch(error => {\r\n this.props.context.actionContext.telemetry.exception(error);\r\n throw new Error('[getAvailabilitiesForCartLineItems] Unable to get availabilities for products in checkout cart');\r\n });\r\n\r\n return isOverMaxQuantity;\r\n };\r\n\r\n /**\r\n * Gets active child in module state.\r\n * @returns - The module state manager collection.\r\n */\r\n private readonly getActiveChildModuleStates = (): IModuleStateManager[] => {\r\n const { childIds, getModule } = this.props.moduleState;\r\n return childIds\r\n .map(getModule)\r\n .filter((state): state is IModuleStateManager => !!state && !state.isDisabled && state.hasModuleState);\r\n };\r\n\r\n /**\r\n * On container ready.\r\n */\r\n private readonly onContainerReady = (): void => {\r\n this.getActiveChildModuleStates().forEach(state => {\r\n state.isReady && state.onContainerReady && state.onContainerReady();\r\n });\r\n };\r\n\r\n /**\r\n * Validates for checkout.\r\n * @param retry - Retry flag.\r\n */\r\n private readonly validateForCheckout = (retry: boolean = true): void => {\r\n const notFoundEditCartLinkMessage = 'Cart doesn\\'t pass validation, but no editCartLink found';\r\n const cart = this.props.data.checkout.result!.checkoutCart.cart;\r\n const { Id, Version } = cart;\r\n const isOrderQuantityLimitsFeatureEnabledInHq = this.props.data.featureState.result\r\n ?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n const customerInfo = this.props.data.customerInformation.result;\r\n\r\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings = defaultOrderQuantityLimitsFeatureConfig === 'all' ||\r\n (customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\r\n if (isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings) {\r\n if (Version && Id) {\r\n validateForCheckoutAsync({ callerContext: this.props.context.actionContext, bypassCache: 'none' }, Id, Version)\r\n .then((result: CartLineValidationResults) => {\r\n if (result.ValidationFailuresByCartLines?.length !== 0) {\r\n this.redirectToCartPage(notFoundEditCartLinkMessage);\r\n } else {\r\n this.setState({ isValidationPassed: true });\r\n }\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n const cartState = this.props.data.checkout.result?.checkoutCart;\r\n cartState?.refreshCart({})\r\n .then(() => {\r\n this.validateForCheckout(false);\r\n })\r\n .catch((refreshError: Error) => {\r\n this.props.telemetry.warning(refreshError.message);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n });\r\n } else {\r\n this.redirectToCartPage(notFoundEditCartLinkMessage);\r\n }\r\n });\r\n } else {\r\n this.redirectToCartPage(notFoundEditCartLinkMessage);\r\n }\r\n } else {\r\n this.setState({ isValidationPassed: true });\r\n }\r\n };\r\n\r\n private async _setDefaultSubscriptionFields(): Promise<void> {\r\n const values = getSubscriptionValues(this.props.data.cart.result?.cart);\r\n const cartChanges: CommerceProperty[] = [];\r\n if (!values.name) {\r\n cartChanges.push({\r\n Key: SubscriptionCommerceValues.SUBSCRIPTION_NAME,\r\n Value: {\r\n StringValue: SubscriptionCommerceValues.SUBSCRIPTION_DEFAULT_NAME\r\n }\r\n });\r\n }\r\n if (!values.frequency) {\r\n cartChanges.push({\r\n Key: SubscriptionCommerceValues.SUBSCRIPTION_FREQUENCY,\r\n Value: {\r\n StringValue: this.props.context.app.config.defaultSubscriptionFrequencyId\r\n }\r\n });\r\n }\r\n if (cartChanges.length > 0) {\r\n await updateSubscription(this.props.data.cart, cartChanges, this.props.context);\r\n }\r\n }\r\n}\r\n\r\nexport default Checkout;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\r\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport emptyActiveCart from './empty-active-cart';\r\nimport checkout from './smwe-checkout';\r\n\r\nexport default async (ctx: IActionContext, checkoutState: ICheckoutState | undefined, orderedProducts: SimpleProduct[] | undefined, redirect: boolean, overrideConfirmationLink?: string, updatedCartVersion?: number, isPaymentVerificationRedirection?: boolean) => {\r\n return new Promise(async (resolve: () => void, reject: (reason?: Error) => void) => {\r\n let salesOrder: SalesOrder;\r\n\r\n // Proceed checkout\r\n try {\r\n salesOrder = await checkout(ctx, updatedCartVersion, isPaymentVerificationRedirection);\r\n } catch (error) {\r\n reject(error); return;\r\n }\r\n\r\n // Remove purchased items from the active cart\r\n try {\r\n await emptyActiveCart(ctx);\r\n } catch (error) {\r\n reject(error); return;\r\n }\r\n\r\n if (redirect) {\r\n // Redirect to the order confirmation page\r\n let orderConfirmationUrl: string = getUrlSync('orderConfirmation', ctx) || '';\r\n\r\n if (overrideConfirmationLink) {\r\n orderConfirmationUrl = overrideConfirmationLink;\r\n }\r\n\r\n if (!orderConfirmationUrl) {\r\n reject(new Error('Error: No orderConfirmationUrl')); return;\r\n }\r\n\r\n const separator = orderConfirmationUrl.includes('?') ? '&' : '?';\r\n const url = `${orderConfirmationUrl}${separator}transactionId=${salesOrder.Id}`;\r\n window.location.assign(url);\r\n } else {\r\n if (checkoutState) {\r\n const result = await checkoutState.updateSalesOrder({ newSalesOrder: salesOrder, newOrderedProducts: orderedProducts || [] });\r\n\r\n if (result.status === 'FAILED') {\r\n reject(new Error('Error: Updating error state failed')); return;\r\n }\r\n } else {\r\n reject(new Error('Error: No checkout state')); return;\r\n }\r\n resolve();\r\n }\r\n });\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node, Waiting } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore } from './smwe-checkout';\r\nimport { IEmailDelivery } from './components';\r\nimport { IInvoicePaymentSummary } from './components/get-invoice-payment-summary';\r\n\r\nexport const PickUpAtStoreComponent: React.FC<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\r\n <Node {...PickUpAtStore}>\r\n {label}\r\n {location}\r\n </Node>\r\n);\r\n\r\nexport const EmailDeliveryComponent: React.FC<IEmailDelivery> = ({ EmailDelivery, label }) => (\r\n <Node {...EmailDelivery}>\r\n {label}\r\n </Node>\r\n);\r\n\r\nexport const LineItemComponent: React.FC<ILineItem> = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\r\n <Node {...LineItem}>\r\n {item}\r\n {pickUpAtStore && <PickUpAtStoreComponent {...pickUpAtStore} />}\r\n {emailDelivery && <EmailDeliveryComponent {...emailDelivery} />}\r\n </Node>\r\n);\r\n\r\nexport const LineItemGroupComponent: React.FC<ILineItemDeliveryGroup> = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\r\n <Node {...LineItemDeliveryGroup}>\r\n {heading}\r\n <Node {...LineItemList}>\r\n {lineItems.map(lineItem => (\r\n <LineItemComponent key={lineItem.LineId} {...lineItem} />\r\n ))}\r\n </Node>\r\n </Node>\r\n);\r\n\r\nexport const LineItemGroupComponentWithMultiplePickUp: React.FC<ILineItemDeliveryGroup> = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems, lineItemWraper, lineItemWraperIcon }) => (\r\n <Node {...LineItemDeliveryGroup}>\r\n {lineItemWraperIcon}\r\n {lineItemWraper}\r\n {heading}\r\n <Node {...LineItemList}>\r\n {lineItems.map(lineItem => (\r\n <LineItemComponentWithMultiplePickUp key={lineItem.LineId} {...lineItem} />\r\n ))}\r\n </Node>\r\n </Node>\r\n);\r\n\r\nexport const LineItemComponentWithMultiplePickUp: React.FC<ILineItem> = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\r\n <Node {...LineItem}>\r\n {item}\r\n {emailDelivery && <EmailDeliveryComponent {...emailDelivery} />}\r\n </Node>\r\n);\r\n\r\nexport const PickUpAtStoreComponentWithMultiplePickUp: React.FC<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\r\n <Node {...PickUpAtStore}>\r\n {label}\r\n {location}\r\n </Node>\r\n);\r\n\r\nexport const LineItemsComponent: React.FC<ILineItems> = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForSubscription, subscriptionHeader, itemsForEmail, itemsGroupWithMulitplePickupMode }) => (\r\n <Node {...LineItems}>\r\n <Node {...Header}>\r\n {heading}\r\n {editLink}\r\n </Node>\r\n {itemsGroupWithMulitplePickupMode === undefined && itemsForPickup && <LineItemGroupComponent {...itemsForPickup} />}\r\n {itemsGroupWithMulitplePickupMode === undefined && itemsForEmail && <LineItemGroupComponent {...itemsForEmail} />}\r\n {itemsGroupWithMulitplePickupMode === undefined && itemsForShip && <LineItemGroupComponent {...itemsForShip} />}\r\n {itemsForSubscription && itemsForSubscription.length > 0 &&\r\n <Node className='ms-checkout__line-items-list__subscriptions'>\r\n <div className='ms-checkout__line-items-list__subscriptions-title'>{subscriptionHeader}</div>\r\n {itemsForSubscription.map(lineItem => (\r\n <LineItemComponent key={lineItem.LineId} {...lineItem} />\r\n ))}\r\n </Node>\r\n }\r\n {itemsGroupWithMulitplePickupMode !== undefined ? itemsGroupWithMulitplePickupMode.map((item, index) => {\r\n return <LineItemGroupComponentWithMultiplePickUp {...item} key={index} />;\r\n }) : null}\r\n </Node>\r\n);\r\n\r\nconst OrderSummaryComponent: React.FC<IOrderSummary> = ({ heading, lines }) => (\r\n <div className='msc-order-summary-wrapper'>\r\n {heading}\r\n <div className='msc-order-summary__items'>\r\n {lines && (\r\n <>\r\n {lines.subtotal}\r\n <div className='sr-only'></div>\r\n {lines.shipping}\r\n <div className='sr-only'></div>\r\n {lines.otherCharge}\r\n {lines.tax}\r\n <div className='sr-only'></div>\r\n {lines.totalDiscounts}\r\n <div className='sr-only'></div>\r\n {lines.loyalty}\r\n <div className='sr-only'></div>\r\n {lines.giftCard}\r\n <div className='sr-only'></div>\r\n {lines.orderTotal}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n);\r\n\r\nconst PaymentSummaryComponent: React.FC<IInvoicePaymentSummary> = ({ heading, lines }) => (\r\n <div className='msc-invoice-summary-wrapper'>\r\n {heading}\r\n <div className='msc-invoice-summary__items'>\r\n {lines && (\r\n <>\r\n {lines.invoices}\r\n {lines.giftCard}\r\n {lines.loyalty}\r\n {lines.orderTotal}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n);\r\n\r\nconst CheckoutView: React.FC<ICheckoutViewProps> = props => {\r\n const {\r\n isPaymentVerificationRedirection,\r\n shouldEnableSinglePaymentAuthorizationCheckout,\r\n canShow,\r\n checkoutProps,\r\n headerProps,\r\n hasSalesOrder,\r\n hasInvoiceLine,\r\n bodyProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n sideControlFirstProps,\r\n sideControlSecondProps,\r\n termsAndConditionsProps,\r\n orderConfirmation,\r\n loading,\r\n alert,\r\n title,\r\n guidedForm,\r\n orderSummary,\r\n invoicePaymentSummary,\r\n lineItems,\r\n placeOrderButton,\r\n termsAndConditions,\r\n keepShoppingButton\r\n } = props;\r\n\r\n return (\r\n <Module {...checkoutProps}>\r\n {!hasSalesOrder && <Node {...headerProps}>\r\n {title}\r\n </Node>}\r\n {!hasSalesOrder && isPaymentVerificationRedirection && shouldEnableSinglePaymentAuthorizationCheckout && !alert && !loading &&\r\n <Waiting className='msc-waiting-circular msc-waiting-lg' />}\r\n {!hasSalesOrder &&\r\n <Node {...bodyProps}>\r\n {loading}\r\n {alert}\r\n {canShow && (\r\n <>\r\n <Node {...mainProps}>\r\n {guidedForm}\r\n <Node {...termsAndConditionsProps}>\r\n {termsAndConditions}\r\n </Node>\r\n <Node {...mainControlProps}>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n </Node>\r\n <Node {...sideProps}>\r\n {!hasInvoiceLine ? orderSummary && <OrderSummaryComponent {...orderSummary} /> : invoicePaymentSummary && <PaymentSummaryComponent {...invoicePaymentSummary} />}\r\n <Node {...sideControlFirstProps}>\r\n <Node {...termsAndConditionsProps}>\r\n {termsAndConditions}\r\n </Node>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n {lineItems && <LineItemsComponent {...lineItems} />}\r\n <Node {...sideControlSecondProps}>\r\n <Node {...termsAndConditionsProps}>\r\n {termsAndConditions}\r\n </Node>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n </Node>\r\n </>\r\n )}\r\n </Node>}\r\n {hasSalesOrder && orderConfirmation}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default CheckoutView;\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * ISmweProductCollection contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum layout {\r\n carousel = 'carousel',\r\n grid = 'grid'\r\n}\r\n\r\nexport interface ISmweProductCollectionConfig extends Msdyn365.IModuleConfig {\r\n addToCart?: boolean;\r\n productCollection: Msdyn365.IProductList;\r\n heading?: IHeadingData;\r\n layout?: layout;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n className?: string;\r\n showPrice?: boolean;\r\n showStarRating?: boolean;\r\n launchLightboxButtonText?: string;\r\n productLightboxHref: string;\r\n productLightboxWidth: number;\r\n productLightboxHeight: number;\r\n productLightboxClassName?: string;\r\n productLightboxIframeClassName?: string;\r\n cardBanner?: string;\r\n showQuantityAsDropdown?: boolean;\r\n}\r\n\r\nexport interface ISmweProductCollectionResources {\r\n priceFree: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addToCartText: string;\r\n addToCartMessage: string;\r\n giftCardText: string;\r\n}\r\n\r\nexport const enum HeadingTag {\r\n h1 = 'h1',\r\n h2 = 'h2',\r\n h3 = 'h3',\r\n h4 = 'h4',\r\n h5 = 'h5',\r\n h6 = 'h6'\r\n}\r\n\r\nexport interface IHeadingData {\r\n text: string;\r\n tag?: HeadingTag;\r\n}\r\n\r\nexport interface ISmweProductCollectionProps<T> extends Msdyn365.IModule<T> {\r\n resources: ISmweProductCollectionResources;\r\n config: ISmweProductCollectionConfig;\r\n}\r\n","import { addThrottledEvent, Flipper, getCSS } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\ninterface ISingleSlideCarouselState {\r\n showPrevious: boolean;\r\n showNext: boolean;\r\n offset: number;\r\n activeItem: number;\r\n}\r\n\r\ninterface ISingleSlideCarouselProps {\r\n flipperNextLabel?: string;\r\n flipperPrevLabel?: string;\r\n vertical?: boolean;\r\n touchScrollThreshold?: number;\r\n parentId?: string;\r\n useTabList?: boolean;\r\n}\r\n\r\n/**\r\n * SingleSlideCarousel\r\n */\r\nexport default class SingleSlideCarousel extends React.PureComponent<ISingleSlideCarouselProps, ISingleSlideCarouselState> {\r\n private static itemsSelector: string = 'msc-ss-carousel-item';\r\n private static verticalItemsSelector: string = 'msc-ss-carousel-vert-item';\r\n private direction: string;\r\n private item: HTMLElement | undefined;\r\n private slide: HTMLElement | undefined;\r\n private carousel: HTMLElement | undefined;\r\n private carouselSize: number = 0;\r\n private slideSize: number = 0;\r\n private itemSize: number = 0;\r\n private resizeThrottledEventHandler?: (event: Event) => void;\r\n private ref: React.RefObject<HTMLDivElement>;\r\n private slideRef: React.RefObject<HTMLUListElement>;\r\n private itemRef: React.RefObject<HTMLLIElement>;\r\n private id: string;\r\n private scrollStart: number | undefined;\r\n private scrollThreshold: number;\r\n\r\n constructor (props: ISingleSlideCarouselProps) {\r\n super(props);\r\n this._nextSlide = this._nextSlide.bind(this);\r\n this._previousSlide = this._previousSlide.bind(this);\r\n this._handleTouchStart = this._handleTouchStart.bind(this);\r\n this._handleTouchEnd = this._handleTouchEnd.bind(this);\r\n this._onFocus = this._onFocus.bind(this);\r\n this._onResized = this._onResized.bind(this);\r\n this.state = { showPrevious: false, showNext: false, offset: 0, activeItem: 0 };\r\n this.ref = React.createRef();\r\n this.slideRef = React.createRef();\r\n this.itemRef = React.createRef();\r\n this.direction = 'left';\r\n this.id = props.parentId || '';\r\n this.scrollThreshold = this.props.touchScrollThreshold !== undefined ? this.props.touchScrollThreshold : 100;\r\n }\r\n\r\n public componentDidUpdate (): void {\r\n this.carousel = this.ref.current!;\r\n this.slide = this.slideRef.current!;\r\n this.item = this.itemRef.current!;\r\n this._setSizes();\r\n this._updateFlippers(this.state.offset);\r\n }\r\n\r\n public componentDidMount (): void {\r\n this.direction = this.props.vertical ? 'top' : 'left';\r\n this.carousel = this.ref.current!;\r\n this.slide = this.slideRef.current!;\r\n this.item = this.itemRef.current!;\r\n this._setSizes();\r\n this.resizeThrottledEventHandler =\r\n window && addThrottledEvent(window, 'resize', this._onResized as EventListener);\r\n this._updateFlippers(0);\r\n }\r\n\r\n public componentWillUnmount (): void {\r\n window && window.removeEventListener('resize', this.resizeThrottledEventHandler!, false);\r\n }\r\n\r\n public render (): JSX.Element {\r\n const isVert: boolean = this.props.vertical === true;\r\n const slidePositionStyle = {} as React.CSSProperties;\r\n const modifiedChildren = this._getClonedChildren(isVert);\r\n slidePositionStyle[this.direction] = `${this.state.offset}px`;\r\n const carouselClass = (isVert) ? 'msc-ss-carousel-vert' : 'msc-ss-carousel';\r\n const carouselSlideClass = (isVert) ? 'msc-ss-carousel-vert-slide' : 'msc-ss-carousel-slide';\r\n const overflowClass = (isVert) ? 'msc-ss-carousel-vert-strip' : 'msc-ss-carousel-strip';\r\n const previousFlipperGlyph = (isVert) ? 'msi-chevron-up' : 'msi-chevron-left';\r\n const nextFlipperGlyph = (isVert) ? 'msi-chevron-down' : 'msi-chevron-right';\r\n const previousFlipperClassName = (isVert) ? 'msc-ss-carousel-vert__flipper' : 'msc-ss-carousel__flipper';\r\n const nextFlipperClassName = (isVert) ? 'msc-ss-carousel-vert__flipper msc-ss-carousel-vert__flipper--next' : 'msc-ss-carousel__flipper msc-ss-carousel__flipper--next';\r\n const disableClassName = !this.state.showPrevious || !this.state.showNext ? 'disabled' : null;\r\n return (\r\n <div\r\n className={carouselClass}\r\n onTouchStart={this._handleTouchStart}\r\n onTouchEnd={this._handleTouchEnd}\r\n >\r\n <Flipper\r\n id={`flipperPreviousButton_${this.id}`}\r\n tabIndex={-1}\r\n glyphProps={{ className: previousFlipperGlyph }}\r\n onClick={this._previousSlide}\r\n className={!this.state.showPrevious ? `${previousFlipperClassName} ${disableClassName}`: `${previousFlipperClassName}`}\r\n aria-hidden={true}\r\n aria-label={this.props.flipperPrevLabel}\r\n disabled={!this.state.showPrevious ? true : false}\r\n displayTooltip={this.props.flipperPrevLabel && this.props.flipperPrevLabel.length > 0 ? true : false}\r\n />\r\n <div ref={this.ref} className={`${overflowClass}`}>\r\n <ul className={carouselSlideClass} style={slidePositionStyle} ref={this.slideRef} role={this.props.useTabList ? 'tablist' : 'list'}>\r\n {modifiedChildren}\r\n </ul>\r\n </div>\r\n <Flipper\r\n id={`flipperNextButton_${this.id}`}\r\n tabIndex={-1}\r\n glyphProps={{ className: nextFlipperGlyph }}\r\n onClick={this._nextSlide}\r\n className={!this.state.showNext ? `${nextFlipperClassName} ${disableClassName}`: `${nextFlipperClassName}`}\r\n aria-hidden={true}\r\n aria-label={this.props.flipperNextLabel}\r\n disabled={!this.state.showNext? true : false}\r\n displayTooltip={this.props.flipperNextLabel && this.props.flipperNextLabel.length > 0 ? true : false}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private _getClonedChildren (isVert: boolean): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>[] {\r\n return React.Children.map(this.props.children, (child: React.ReactNode, index: number) => {\r\n const castChild = (child as React.ReactChild) as React.ReactElement<HTMLLIElement>;\r\n if (index === 1) {\r\n return React.cloneElement(castChild, {\r\n className: `${isVert ? SingleSlideCarousel.verticalItemsSelector : SingleSlideCarousel.itemsSelector} ${(this.state.activeItem) === index ? 'active' : ''} ${castChild.props.className}`,\r\n // @ts-ignore\r\n ref: this.itemRef,\r\n onFocus: this._onFocus\r\n });\r\n }\r\n return React.cloneElement(castChild, {\r\n className: `${isVert ? SingleSlideCarousel.verticalItemsSelector : SingleSlideCarousel.itemsSelector} ${(this.state.activeItem) === index ? 'active' : ''} ${castChild.props.className}`,\r\n // @ts-ignore\r\n onFocus: this._onFocus\r\n });\r\n });\r\n }\r\n\r\n private _nextSlide (): void {\r\n this._moveSingleSlide(true);\r\n }\r\n\r\n private _previousSlide (): void {\r\n this._moveSingleSlide(false);\r\n }\r\n\r\n private _handleTouchStart(evt: React.TouchEvent<HTMLDivElement>): void {\r\n if (evt.touches.length === 0) {\r\n this.scrollStart = undefined;\r\n } else {\r\n this.scrollStart = this.props.vertical === true ? evt.touches[0].screenY : evt.touches[0].screenX;\r\n }\r\n }\r\n\r\n private _handleTouchEnd(evt: React.TouchEvent<HTMLDivElement>): void {\r\n if (evt.changedTouches.length > 0 && this.scrollStart !== undefined) {\r\n const newTarget: number = this.props.vertical === true ? evt.changedTouches[0].screenY : evt.changedTouches[0].screenX;\r\n\r\n const delta = newTarget - this.scrollStart;\r\n\r\n if (delta > this.scrollThreshold) {\r\n this._previousSlide();\r\n }\r\n\r\n if (delta < -this.scrollThreshold) {\r\n this._nextSlide();\r\n }\r\n }\r\n\r\n this.scrollStart = undefined;\r\n\r\n return;\r\n }\r\n\r\n private _setActiveItem (offset: number): void {\r\n if (offset === 0) {\r\n this.setState({ activeItem: 0 });\r\n } else {\r\n this.setState({ activeItem: Math.abs(Math.round(offset / this.itemSize)) });\r\n }\r\n }\r\n\r\n private _moveSingleSlide (next: boolean): void {\r\n let currentOffset = parseInt(getCSS(this.slide!, this.direction), 10);\r\n const carouselSize = this.carouselSize;\r\n\r\n let maxScrollCount = Math.floor(carouselSize / (this.itemSize));\r\n const directionModifier = next ? -1 : 1;\r\n currentOffset = !isNaN(currentOffset) && typeof currentOffset === 'number' ? currentOffset : 0;\r\n\r\n if (maxScrollCount === 0) {\r\n maxScrollCount = 1;\r\n }\r\n\r\n maxScrollCount = carouselSize % (this.itemSize) === 0 ? maxScrollCount - 1 : maxScrollCount;\r\n maxScrollCount = Math.max(maxScrollCount, 1);\r\n const maxScrollDistance = maxScrollCount * (this.itemSize);\r\n\r\n let distanceToEdge = next ? this.slideSize - carouselSize + currentOffset : Math.abs(currentOffset);\r\n distanceToEdge = Math.max(0, distanceToEdge);\r\n\r\n const offset =\r\n maxScrollDistance <= distanceToEdge\r\n ? maxScrollDistance * directionModifier + currentOffset\r\n : distanceToEdge * directionModifier + currentOffset;\r\n\r\n this._setActiveItem(offset);\r\n this._updateFlippers(offset);\r\n }\r\n\r\n private _setSizes (): void {\r\n const item = this.item;\r\n if (!!item) {\r\n this.itemSize = this.props.vertical ? item.scrollHeight : item.scrollWidth;\r\n } else {\r\n this.itemSize = 0;\r\n }\r\n\r\n this.carouselSize = this._calculateCarouselSize();\r\n this.slideSize = this.slide ? (this.props.vertical ? this.slide.scrollHeight : this.slide.scrollWidth) : 0;\r\n }\r\n\r\n private _calculateCarouselSize (): number {\r\n if (!this.carousel) {\r\n return 0;\r\n }\r\n\r\n const carouselStyle = getComputedStyle(this.carousel);\r\n\r\n const padding = this.props.vertical ? parseFloat(carouselStyle.paddingTop || '') + parseFloat(carouselStyle.paddingBottom || '')\r\n : parseFloat(carouselStyle.paddingLeft || '') + parseFloat(carouselStyle.paddingRight || '');\r\n\r\n return this.props.vertical ? this.carousel.clientHeight - padding : this.carousel.clientWidth - padding;\r\n }\r\n\r\n private _canScrollPrevious (offset: number): boolean {\r\n return !isNaN(offset) && offset !== 0;\r\n }\r\n\r\n private _canScrollNext (offset: number): boolean {\r\n if (this.carouselSize + Math.abs(offset) >= this.slideSize) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _updateFlippers (offset: number): void {\r\n this.setState({\r\n showPrevious: this._canScrollPrevious(offset),\r\n showNext: this._canScrollNext(offset),\r\n offset: offset\r\n });\r\n }\r\n\r\n private _scrollItemIntoView (item: HTMLElement): void {\r\n const carouselSize = this.carouselSize;\r\n let offset = (this.props.vertical) ? item.offsetTop : item.offsetLeft;\r\n let updateOffset = false;\r\n\r\n const left = parseInt(getCSS(this.slide!, 'left'), 10) || 0;\r\n const top = parseInt(getCSS(this.slide!, 'top'), 10) || 0;\r\n\r\n if (this.props.vertical) {\r\n if (top < 0 && -top > offset) {\r\n if (offset !== 0) {\r\n offset = -offset + 1;\r\n }\r\n updateOffset = true;\r\n } else if (top + offset > carouselSize - this.itemSize) {\r\n offset = carouselSize - this.itemSize - offset - 1;\r\n updateOffset = true;\r\n }\r\n } else if (this.direction === 'left') {\r\n if (left < 0 && -left > offset) {\r\n if (offset !== 0) {\r\n offset = -offset + 1;\r\n }\r\n updateOffset = true;\r\n } else if (left + offset > carouselSize - this.itemSize) {\r\n offset = carouselSize - this.itemSize - offset - 1;\r\n updateOffset = true;\r\n }\r\n }\r\n\r\n if (updateOffset) {\r\n this._updateFlippers(offset);\r\n\r\n if (this.props.vertical) {\r\n setTimeout(() => {\r\n (this.slide as Node).parentElement!.scrollTop = 0;\r\n }, 0);\r\n } else {\r\n setTimeout(() => {\r\n (this.slide as Node).parentElement!.scrollLeft = 0;\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _onFocus (event: React.FocusEvent): void {\r\n const target = event.currentTarget as HTMLElement;\r\n this._scrollItemIntoView(target);\r\n }\r\n\r\n private _onCarouselResized (): void {\r\n this._setSizes();\r\n let offset = parseInt(getCSS(this.slide!, this.direction), 10);\r\n\r\n // Ensure the carousel slide fits across the entire alotted space\r\n if (!isNaN(offset) && offset < 0 && this.slideSize + offset < this.carouselSize) {\r\n offset = Math.min(0, this.carouselSize - this.slideSize);\r\n }\r\n\r\n this._updateFlippers(offset);\r\n }\r\n\r\n private _onResized = (): void => {\r\n this._onCarouselResized();\r\n };\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { format, Heading, IComponentNodeProps, IModuleProps, INodeProps, ISingleSlideCarouselProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport { AffiliationLoyaltyTier, ProductAvailableQuantity, ProductPrice, ProductSearchResult, ProjectionDomain } from '@msdyn365-commerce/retail-proxy';\r\nimport { getActivePricesAsync, getEstimatedAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\nimport ProductCard from '../../components/product.component';\r\nimport { publish } from '../../Utilities/analytics/analytics-dispatcher';\r\nimport CommerceAttributesParser from '../../Utilities/commerce-attributes-parser';\r\nimport SingleSlideCarousel from '../../Utilities/single-slide-carousel';\r\n\r\nimport { ISmweProductCollectionData } from './smwe-product-collection.data';\r\nimport { ISmweProductCollectionProps, layout } from './smwe-product-collection.props.autogenerated';\r\n\r\nexport interface IProductCollectionViewProps extends ISmweProductCollectionProps<ISmweProductCollectionData> {\r\n heading?: React.ReactNode;\r\n ProductCollectionContainer: IModuleProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n GridComponentProps: INodeProps;\r\n products: IProductComponentViewProps[];\r\n isCarousel: boolean;\r\n}\r\n\r\nexport interface IProductComponentViewProps {\r\n ProductContainer: INodeProps;\r\n productComponent: React.ReactNode;\r\n}\r\n\r\nexport interface IProductCollectionState {\r\n clubPricing: ProductPrice[] | undefined;\r\n productAvailability: ProductAvailableQuantity[] | undefined;\r\n}\r\n\r\n/**\r\n * ProductCollection component\r\n */\r\nclass ProductCollection extends React.PureComponent<ISmweProductCollectionProps<ISmweProductCollectionData>, IProductCollectionState> {\r\n\r\n constructor(props: ISmweProductCollectionProps<ISmweProductCollectionData>, state: IProductCollectionState) {\r\n super(props);\r\n\r\n this.state = {\r\n clubPricing: undefined,\r\n productAvailability: undefined\r\n };\r\n }\r\n\r\n public componentDidMount(): void {\r\n const products = this.props.config.productCollection.products;\r\n\r\n if (products && products.length) {\r\n void this._getClubPricing(products);\r\n void this._getProductavailabilty(products);\r\n\r\n const impressions = products.map(product => ({\r\n product,\r\n attributes: CommerceAttributesParser.getParsedAttributes(product.AttributeValues || []),\r\n }));\r\n\r\n publish('impression', {\r\n products: impressions,\r\n\r\n list: 'Product Collection', // Could be Search Results if we ever enable search results pages\r\n category: this.props.config.heading?.text,\r\n context: this.props.context,\r\n });\r\n\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { heading, productCollection, className } = this.props.config;\r\n const { resources } = this.props;\r\n const products = productCollection && productCollection.products;\r\n const isCarousel = this.props.config.layout === layout.carousel;\r\n const headingComponent = heading && heading.text && <Heading className='ms-product-collection__heading' headingTag={heading.tag} text={heading.text} />;\r\n\r\n const productCollectionViewProps = {\r\n ...this.props,\r\n heading: headingComponent,\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: '',\r\n flipperPrevLabel: resources.flipperPrevious,\r\n flipperNextLabel: resources.flipperNext,\r\n parentId: this.props.id\r\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\r\n ProductCollectionContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-product-collection ms-search-result-container', className)\r\n },\r\n GridComponentProps: {\r\n tag: 'ul' as NodeTag,\r\n className: 'ms-product-collection__items',\r\n },\r\n isCarousel: isCarousel,\r\n products: products && products.length > 0 && products.map((item: ProductSearchResult, index: number) => this._getProduct(item, index)),\r\n };\r\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\r\n }\r\n\r\n private async _getClubPricing(products:ProductSearchResult[]): Promise<void> {\r\n const projectDomain: ProjectionDomain = { ChannelId: +this.props.context.request.apiSettings.channelId, CatalogId: +this.props.context.request.apiSettings.catalogId };\r\n let affiliations: AffiliationLoyaltyTier[];\r\n if (this.props.context.app.config.affiliationId) {\r\n affiliations = [\r\n {\r\n AffiliationId: this.props.context.app.config.affiliationId\r\n }\r\n ];\r\n } else {\r\n affiliations = [];\r\n }\r\n const productIds: number[] = [];\r\n products.forEach((product) => {\r\n productIds.push(product.RecordId);\r\n });\r\n const clubPricingAll = await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext },\r\n projectDomain,\r\n productIds,\r\n new Date(),\r\n '',\r\n affiliations,\r\n true\r\n );\r\n this.setState({clubPricing: clubPricingAll});\r\n }\r\n\r\n private async _getProductavailabilty(products: ProductSearchResult[]): Promise<void> {\r\n if (products && products.length && products.length > 0) {\r\n const productIds: number[] = [];\r\n products.forEach((product) => {\r\n productIds.push(product.RecordId);\r\n });\r\n const availabilityAll = await getEstimatedAvailabilityAsync({ callerContext: this.props.context.actionContext }, { ProductIds: productIds, DefaultWarehouseOnly: true});\r\n const formattedResponse = availabilityAll.ProductWarehouseInventoryAvailabilities?.map((product) => {\r\n return {ProductId: product.ProductId, AvailableQuantity: product.PhysicalAvailable, ExtensionProperties: product.ExtensionProperties};\r\n }) as ProductAvailableQuantity[];\r\n this.setState({productAvailability: formattedResponse});\r\n }\r\n }\r\n\r\n private _getProduct = (product: ProductSearchResult, index: number): IProductComponentViewProps => {\r\n const { imageSettings, showPrice } = this.props.config;\r\n const addToCart = this.props.config.addToCart || false;\r\n const resources = this.props.resources;\r\n const categoryHierarchy = undefined;\r\n const passedProps = { ...this.props, categoryHierarchy };\r\n const availibity = this.state.productAvailability?.find((item) => {\r\n return item.ProductId === product.RecordId;\r\n });\r\n const clubPrice = this.state.clubPricing?.find((item) => {\r\n return item.ProductId === product.RecordId;\r\n });\r\n const showQuantityAsDropdown = this.props.config.showQuantityAsDropdown || false;\r\n\r\n return {\r\n ProductContainer: {\r\n tag: 'li' as NodeTag,\r\n className: 'ms-product-collection__item ms-product-search-result__item',\r\n role: 'listitem',\r\n key: index,\r\n },\r\n productComponent: (\r\n <ProductCard\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={format(resources.ratingAriaLabel, product.AverageRating, 5)}\r\n id={this.props.id}\r\n key={product.RecordId}\r\n typeName={this.props.typeName}\r\n data={{ product: product }}\r\n parentProps={passedProps}\r\n showPrice={showPrice}\r\n addToCart={addToCart}\r\n addToCartText={resources.addToCartText}\r\n addToCartMessage={resources.addToCartMessage}\r\n giftCardText={resources.giftCardText}\r\n cart={this.props.data.cart}\r\n displayQuantitySlider={addToCart}\r\n clubPrice={clubPrice} // won't show clubPrice if addToCart is false\r\n availability={availibity}\r\n showQuantityAsDropdown={showQuantityAsDropdown}\r\n />\r\n )\r\n };\r\n };\r\n}\r\n\r\nexport default ProductCollection;\r\n","import { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './smwe-product-collection';\r\n\r\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\r\n const { heading, ProductCollectionContainer, products, SingleSlideCarouselComponentProps, GridComponentProps, isCarousel } = props;\r\n if (products) {\r\n return (\r\n <Module {...ProductCollectionContainer}>\r\n {heading}\r\n {\r\n isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)\r\n }\r\n </Module>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return (\r\n <Node {...carouselContainer}>\r\n {items && items.map(_renderProduct)}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return (\r\n <Node {...gridContainer}>\r\n {items && items.map(_renderProduct)}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\r\n const { ProductContainer, productComponent } = product;\r\n\r\n return (\r\n <Node {...ProductContainer}>\r\n {productComponent}\r\n </Node>\r\n );\r\n};\r\n\r\nexport default ProductCollectionView;","import { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { get } from 'lodash';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n /**\r\n * ChoiceSummary component\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.Component<IChoiceSummaryProps> {\r\n private closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly<IChoiceSummaryProps>) {\r\n super(props);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n return (\r\n <div className='msc-choice-summary'>\r\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\r\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\r\n {items.map((item: IRefinerMap, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\r\n return (\r\n <li className='msc-choice-summary__list-item' key={item.key} {...listItemProps}>\r\n <a\r\n className='msc-choice-summary__item'\r\n href={this.props.urlBuilder(item.value, false)}\r\n aria-label={`${item.key} ${choiceAriaLabel}`}\r\n onClick={this._onClick}\r\n >\r\n {item.key}\r\n <span className={`${this.closeButtonGlyph} msc-choice-summary__glyph`} />\r\n </a>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n {items.length > 0 && clearAllText && <a href={this.props.urlBuilder({}, true)} className={'msc-choice-summary__clear-all'} onClick={this._onClick}>{clearAllText}</a>}\r\n </div>\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n switch (productRefinerValue.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n break;\r\n default:\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll: clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => (itemClicked.innerText && itemClicked.innerText.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","import * as React from 'react';\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (<a className={className} href={href} aria-label={ariaLabel}> {text} </a>);","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { ICoreContext, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, ProductAvailableQuantity, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport ProductCard, { ISmweSearchResultContainerParentProps } from '../../../components/product.component';\r\nimport { ISmweSearchResultContainerResources } from '../smwe-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: ISmweSearchResultContainerResources;\r\n telemetry: ITelemetry;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n parentProps: ISmweSearchResultContainerParentProps;\r\n addToCart?: boolean;\r\n cart?: AsyncResult<ICartState>;\r\n productAvailability?: ProductAvailableQuantity[] | undefined;\r\n clubPricing?: ProductPrice[] | undefined;\r\n showQuantityAsDropdown?: boolean;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n parentProps,\r\n addToCart,\r\n cart,\r\n productAvailability,\r\n clubPricing,\r\n showQuantityAsDropdown\r\n}) => {\r\n return (\r\n <ul className='list-unstyled' role='presentation'>\r\n {products.map((product: ProductSearchResult, index: number) => {\r\n const availibity = productAvailability?.find((item) => {\r\n return item.ProductId === product.RecordId;\r\n });\r\n const clubPrice = clubPricing?.find((item) => {\r\n return item.ProductId === product.RecordId;\r\n });\r\n return (\r\n <li className='ms-product-search-result__item' key={index}>\r\n <ProductCard\r\n context={context}\r\n imageSettings={imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n id={moduleId}\r\n typeName={moduleType}\r\n data={{ product: product }}\r\n parentProps={parentProps}\r\n addToCart={addToCart}\r\n addToCartText={resources.addToCartTextPlp}\r\n addToCartMessage={resources.addToCartMessagePlp}\r\n giftCardText={resources.giftCardText}\r\n displayQuantitySlider={addToCart}\r\n cart={cart}\r\n availability={availibity}\r\n clubPrice={clubPrice}\r\n showQuantityAsDropdown={showQuantityAsDropdown || false}\r\n />\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n );\r\n};","import * as React from 'react';\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC<ITitle> = ({ text, className }) => (<span className={className}> {text} </span>);\r\n","import * as React from 'react';\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (<span> {separator} </span>);","import {\r\n Button,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\r\n onModalToggle():void;\r\n}\r\n\r\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\r\n const {text, onClick, ariaLabel, innerRef, id} = props;\r\n return <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>{text}</button>;\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps):ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: <ModalBody className='msc-review-modal-body'/>\r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <Modal\r\n autoFocus={true}\r\n applicationNode={'renderPage'}\r\n returnFocusRef={props.returnRef}\r\n isOpen={props.isOpen}\r\n toggle={props.onModalToggle}\r\n className={'msc-search-result-modal'}\r\n zIndex={1050}\r\n />\r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <ModalHeader toggle={props.onModalToggle}>\r\n {props.resources.modalTitle}\r\n </ModalHeader>\r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <ModalFooter>\r\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\r\n {props.resources.modalCloseButtonText}\r\n </Button>\r\n </ModalFooter>\r\n );\r\n};","import * as React from 'react';\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\r\n return (\r\n <span className='ms-search-result-container__no-results-message'>\r\n <h5> {text} </h5>\r\n </span>\r\n );\r\n};","import { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\r\n private _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private minInput: React.RefObject<HTMLInputElement>;\r\n private maxInput: React.RefObject<HTMLInputElement>;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef<HTMLInputElement>();\r\n this.maxInput = React.createRef<HTMLInputElement>();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n const initialMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\r\n <label className={minLabelClassName}>\r\n {refineItemCommonProps.minLabel}\r\n <input\r\n className={minInputClassName}\r\n onChange={this._changeMin}\r\n onFocus={this._changeMin}\r\n onBlur={this._finishChangeMin}\r\n value={formattedSelectedMin}\r\n ref={this.minInput}\r\n />\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel}\r\n <input\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._changeMax}\r\n onFocus={this._changeMax}\r\n onBlur={this._finishChangeMax}\r\n value={formattedSelectedMax}\r\n ref={this.maxInput}\r\n />\r\n </label>\r\n {validationErrorMin &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>{validationErrorMin}</span>\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>{validationErrorMax}</span>\r\n }\r\n </form>\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\r\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice =this._formatPrice(selectedMin);\r\n const selectedMaxPrice =this._formatPrice(selectedMax);\r\n\r\n return (\r\n <Slider\r\n className={'ms-refine-submenu__range-refiner'}\r\n key={sliderId}\r\n id={sliderId}\r\n inForm={false}\r\n min={min && Number(min) || undefined}\r\n max={max && Number(max) || undefined}\r\n step={1}\r\n orientation={'horizontal'}\r\n labels={[\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]}\r\n showLabels={true}\r\n showTooltip={true}\r\n sliderThumbs={[\r\n {\r\n id: `${sliderId}_slider_thumb_start`,\r\n value: selectedMin && Number(selectedMin) || 0,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]}\r\n onChangeEnd={this._onRangeUpdateEnd}\r\n onChange={debounce(this._onRangeUpdate, 500)}\r\n handleTooltipText={this._handleRangeTooltipText}\r\n {...ariaAttributes}\r\n />\r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({validationErrorMin: refineItemCommonProps.validationErrorNaN});\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({validationErrorMax: refineItemCommonProps.validationErrorNaN});\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // tslint:disable-next-line:no-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(sliderChangeNotification.id);\r\n if (!!element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}","import { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\r\n private anchorType: React.RefObject<HTMLAnchorElement>;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n children,\r\n onToggle,\r\n context,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const role = isSingleSelect ? 'radio' : undefined;\r\n itemTypeClassName = !!selectedRefinementCriterion ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role='radio'\r\n aria-checked='false'\r\n id={`${parentProductRefinerHierarchy.KeyName! }_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n >\r\n <a\r\n href={this._getRefinerUrl()}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n onClick={this._onClick}\r\n >\r\n <RatingComponent\r\n avgRating={parseInt(productRefinerValue.LeftValueBoundString, 10)}\r\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ? productRefinerValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString}\r\n hideCount={false}\r\n readOnly={true}\r\n ariaLabel=''\r\n context={context}\r\n id={this.props.moduleId}\r\n typeName={this.props.moduleTypeName}\r\n data={{}}\r\n />\r\n <span className='refine-submenu-item__rating'>{productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}</span>\r\n </a>\r\n </li>\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n return (\r\n <li className='ms-refine-submenu-item' role={role} id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundString}`}>\r\n <a\r\n key={!!selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={0}\r\n onClick={this._onClick}\r\n className={itemTypeClassName}\r\n role={inputType}\r\n aria-checked={!!selectedRefinementCriterion}\r\n {...attrs}\r\n >\r\n <span className='ms-refine-submenu-item__label'>\r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n };\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\nimport { Button, Collapse } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { findMatchingRefinementCriterion, ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n refinerExpandText?: string;\r\n refinerMinimizeText?: string;\r\n minimizedRefiners?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n highestLevelRefinerText?: string;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\r\n\r\n private isMinimizedRefiner: boolean = false;\r\n\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n this._expandCategoryRefiner = this._expandCategoryRefiner.bind(this);\r\n\r\n let isExpanded = this.props.isExpandedOnInitialLoad;\r\n if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n isExpanded = true;\r\n }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n\r\n if (this.props.minimizedRefiners) {\r\n const minimizedRefinersList = this.props.minimizedRefiners.split(',');\r\n this.isMinimizedRefiner = minimizedRefinersList.some(\r\n keyName => this.props.productRefinerHierarchy.KeyName && (keyName.toLowerCase() === this.props.productRefinerHierarchy.KeyName.toLocaleLowerCase())\r\n );\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n const isRangeRefiner = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range);\r\n let key = '';\r\n if (isRangeRefiner) {\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(productRefinerHierarchy.Values[0], this.props.selectedRefinerValues);\r\n key = selectedRefinementCriterion ? `($${selectedRefinementCriterion.LeftValueBoundString && parseFloat(selectedRefinementCriterion.LeftValueBoundString).toFixed(2)} - $${selectedRefinementCriterion.RightValueBoundString && parseFloat(selectedRefinementCriterion.RightValueBoundString).toFixed(2)})` : '';\r\n }\r\n\r\n if (this.isMinimizedRefiner) {\r\n return (\r\n <div className='ms-refine-submenu list-group'>\r\n <div className='ms-refine-submenu__minimized-header'>{productRefinerHierarchy.KeyName} {key}</div>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className='ms-refine-submenu list-group'>\r\n <Button\r\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label={productRefinerHierarchy.KeyName || 'refiner.Name'}\r\n onClick={this._onToggleSubmenu}\r\n aria-expanded={this.state.expanded}\r\n >\r\n {productRefinerHierarchy.KeyName} {key}\r\n </Button>\r\n <Collapse isOpen={this.state.expanded} timeout={350}>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n switch (productRefinerHierarchy.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n return this._renderRange(productRefinerHierarchy);\r\n default:\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect = productRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = this._getSortedValueList() || [];\r\n\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n />\r\n );\r\n });\r\n if (this.isMinimizedRefiner) {\r\n return (\r\n <div className='ms-refine-submenu__list-min' id={`refine-submenu-minimize__${this.props.productRefinerHierarchy.RecordId}`}>\r\n <ul className='ms-refine-submenu__list' {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n <a\r\n onClick={this._expandCategoryRefiner}\r\n className='ms-refine-submenu__expand-button'\r\n role='button'\r\n id={`refine-submenu-minimize-button__${productRefinerHierarchy.RecordId}`}\r\n >\r\n {this.props.refinerExpandText}\r\n </a>\r\n </div>\r\n );\r\n }\r\n return (\r\n <ul className='ms-refine-submenu__list' {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = this._getSortedValueList() || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n // TODO BUGBUG 22424559 determine only from the DataTypeValue once live example is working (can test with the tempRangeTypeTODO derived from QSP until then)\r\n const rangeType = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput || this.props.tempRangeTypeTODO === 'input') ?\r\n 'input' :\r\n 'slider';\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className='ms-refine-submenu__list list-unstyled'>{listItems}</ul>;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n\r\n private _getSortedValueList(): ProductRefinerValue[] {\r\n const sortedList = this.props.productRefinerHierarchy.Values.sort((nextOption, curOption) => {\r\n const curOptionName =\r\n nextOption.LeftValueBoundString || nextOption.RightValueBoundString || '';\r\n const nextOptionName =\r\n curOption.LeftValueBoundString || curOption.RightValueBoundString || '';\r\n\r\n return curOptionName.localeCompare(nextOptionName);\r\n });\r\n\r\n const dividedList = {\r\n options: [] as ProductRefinerValue[],\r\n topLevel: [] as ProductRefinerValue[]\r\n };\r\n sortedList.forEach(option => {\r\n const optionName = option.LeftValueBoundString || option.RightValueBoundString || '';\r\n\r\n if (optionName === this.props.highestLevelRefinerText) {\r\n dividedList.topLevel.push(option);\r\n } else {\r\n dividedList.options.push(option);\r\n }\r\n });\r\n\r\n return [...dividedList.topLevel, ...dividedList.options];\r\n }\r\n\r\n private _expandCategoryRefiner(): void {\r\n const minimizedElement = document.getElementById(`refine-submenu-minimize__${this.props.productRefinerHierarchy.RecordId}`);\r\n const buttonElement = document.getElementById(`refine-submenu-minimize-button__${this.props.productRefinerHierarchy.RecordId}`);\r\n if (minimizedElement && buttonElement) {\r\n if (minimizedElement.className === 'ms-refine-submenu__list-min') {\r\n minimizedElement.className = 'ms-refine-submenu__list-full';\r\n buttonElement.textContent = this.props.refinerMinimizeText!;\r\n } else {\r\n minimizedElement.className = 'ms-refine-submenu__list-min';\r\n buttonElement.textContent = this.props.refinerExpandText!;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","import { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n */\r\nexport const enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (refinementCriterion.DataTypeValue === ProductRefinerValueDataTypeValue.Range ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List || itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}","import * as React from 'react';\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { findMatchingRefinementCriterion, ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefinePulldownProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n highestLevelRefinerText?: string;\r\n buttonText: string | undefined;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefinePulldown extends React.Component<IRefinePulldownProps> {\r\n\r\n constructor(props: IRefinePulldownProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutsidePulldown);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutsidePulldown, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n const isRangeRefiner = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range);\r\n let key = '';\r\n if (isRangeRefiner) {\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(productRefinerHierarchy.Values[0], this.props.selectedRefinerValues);\r\n key = selectedRefinementCriterion ? `($${selectedRefinementCriterion.LeftValueBoundString && parseFloat(selectedRefinementCriterion.LeftValueBoundString).toFixed(2)} - $${selectedRefinementCriterion.RightValueBoundString && parseFloat(selectedRefinementCriterion.RightValueBoundString).toFixed(2)})` : '';\r\n }\r\n\r\n return (\r\n <div className='ms-refine-submenu list-group'>\r\n <div\r\n className={'ms-refine-submenu__toggle_expanded'}\r\n aria-label={productRefinerHierarchy.KeyName || 'refiner.Name'}\r\n >\r\n {productRefinerHierarchy.KeyName} {key}\r\n </div>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n switch (productRefinerHierarchy.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n return this._renderRange(productRefinerHierarchy);\r\n default:\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect = productRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = this._getSortedValueList() || [];\r\n\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n />\r\n );\r\n });\r\n return (\r\n <ul className='ms-refine-submenu__list' {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = this._getSortedValueList() || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n // TODO BUGBUG 22424559 determine only from the DataTypeValue once live example is working (can test with the tempRangeTypeTODO derived from QSP until then)\r\n const rangeType = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput || this.props.tempRangeTypeTODO === 'input') ?\r\n 'input' :\r\n 'slider';\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className='ms-refine-submenu__list list-unstyled'>{listItems}</ul>;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutsidePulldown = (event: any) => {\r\n const pulldown:boolean = event.target.id === 'refiner-pulldown-button';\r\n const pulldownElement = document.getElementById('refiner-pulldown-container');\r\n if (!pulldownElement?.contains(event.target) && !pulldown && pulldownElement?.className !== 'ms-search-result-container__refiner-pulldown-container pulldown-hide') {\r\n const buttonElement = document.getElementById('refiner-pulldown-button');\r\n if (buttonElement) {\r\n buttonElement.classList.toggle('refiner-pulldown-button-expanded');\r\n this._getPulldownText(this._getActiveRefinersText(this.props.selectedRefinerValues), this.props.buttonText);\r\n }\r\n if (pulldownElement) {\r\n pulldownElement.classList.toggle('pulldown-hide');\r\n }\r\n }\r\n };\r\n\r\n private _getPulldownText = (activeRefiners: string, buttonText: string | undefined): string => {\r\n const buttonElement = document.getElementById('refiner-pulldown-button');\r\n const spanElement = document.getElementById('refiner-pulldown-button-content');\r\n if (buttonElement && spanElement) {\r\n if (buttonElement.className === 'ms-search-result-container__refiner-pulldown-button refiner-pulldown-button-expanded' || !activeRefiners) {\r\n return spanElement.innerText = buttonText || '';\r\n } else {\r\n return spanElement.innerText = activeRefiners;\r\n }\r\n }\r\n return '';\r\n };\r\n\r\n private _getActiveRefinersText = (activeRefiners: ProductRefinerValue[]): string => {\r\n let formatedActiveRefiners = '';\r\n activeRefiners.forEach(refiner => {\r\n if (refiner.UnitText === 'USD') {\r\n formatedActiveRefiners += `$${refiner.LeftValueBoundString}-$${refiner.RightValueBoundString} / `;\r\n } else if (refiner.LeftValueBoundString) {\r\n formatedActiveRefiners += `${refiner.LeftValueBoundString} / `;\r\n }\r\n });\r\n // removes trailing slash and whitespace\r\n formatedActiveRefiners = formatedActiveRefiners.substring(0, formatedActiveRefiners.length - 2);\r\n return formatedActiveRefiners;\r\n };\r\n\r\n private _getSortedValueList(): ProductRefinerValue[] {\r\n const sortedList = this.props.productRefinerHierarchy.Values.sort((nextOption, curOption) => {\r\n const curOptionName =\r\n nextOption.LeftValueBoundString || nextOption.RightValueBoundString || '';\r\n const nextOptionName =\r\n curOption.LeftValueBoundString || curOption.RightValueBoundString || '';\r\n\r\n return curOptionName.localeCompare(nextOptionName);\r\n });\r\n\r\n const dividedList = {\r\n options: [] as ProductRefinerValue[],\r\n topLevel: [] as ProductRefinerValue[]\r\n };\r\n sortedList.forEach(option => {\r\n const optionName = option.LeftValueBoundString || option.RightValueBoundString || '';\r\n\r\n if (optionName === this.props.highestLevelRefinerText) {\r\n dividedList.topLevel.push(option);\r\n } else {\r\n dividedList.options.push(option);\r\n }\r\n });\r\n\r\n return [...dividedList.topLevel, ...dividedList.options];\r\n }\r\n}\r\n\r\nexport default RefinePulldown;","import classNames from 'classnames';\r\nimport * as React from 'react';\r\nimport { UncontrolledTooltip, mapToCssModules, PaginationItem, PaginationLink, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\n\r\n/**\r\n * UncontrolledPagination properties.\r\n */\r\nexport interface IUncontrolledPaginationProps extends React.HTMLAttributes<HTMLElement> {\r\n /** The current url */\r\n url: string;\r\n\r\n /** The qsp to use with the pagination */\r\n qsp: string;\r\n\r\n /** Number of items */\r\n items?: number;\r\n\r\n /** Items per page */\r\n itemsPerPage?: number;\r\n\r\n /** Index of first item returned */\r\n startingItem?: number;\r\n\r\n /** The text to display for the previous arrow */\r\n previousText?: React.ReactChild;\r\n\r\n /** The text to display for the next arrow */\r\n nextText?: React.ReactChild;\r\n\r\n /** The aria-label for the previous arrow */\r\n previousAriaLabel?: string;\r\n\r\n /** The aria-label for the next arrow */\r\n nextAriaLabel?: string;\r\n\r\n /** Tag property to set if you want the HTML tag to be something else */\r\n tag?: React.ReactType;\r\n\r\n /** List tag property to set if you want the HTML tag to be something else */\r\n listTag?: React.ReactType;\r\n\r\n /** ClassName Property to set any CSS classnames on the pagination */\r\n className?: string;\r\n\r\n /** List ClassName Property to set any CSS classnames on the pagination */\r\n listClassName?: string;\r\n\r\n /** CssModule Property to set any CSS classModule on the pagination */\r\n cssModule?: object;\r\n\r\n /** Set the pagination bar showed size */\r\n size?: string;\r\n\r\n /** Define a string that labels the current element */\r\n 'aria-label'?: string;\r\n\r\n /** Define a string that provide the role on the pagination */\r\n role?: string;\r\n\r\n /** The Id for the next arrow */\r\n nextId?: string;\r\n\r\n /** The Id for the prev arrow */\r\n prevId?: string;\r\n\r\n /** The text for the next arrow aria described */\r\n nextAreaDescribed?: string;\r\n\r\n /** The text for the prev arrow aria described */\r\n prevAreaDescribed?: string;\r\n\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\n/**\r\n * Uncontrolled Pagination component\r\n */\r\nexport default class SMWEPagination extends React.PureComponent<IUncontrolledPaginationProps> {\r\n public static defaultProps: Partial<IUncontrolledPaginationProps> = {\r\n tag: 'nav',\r\n listTag: 'ul',\r\n 'aria-label': 'pagination',\r\n items: 0,\r\n itemsPerPage: 25,\r\n startingItem: 0\r\n };\r\n\r\n private static readonly pagesDisplayed: number = 7;\r\n\r\n private maxPages: number;\r\n\r\n private activePage: number = 0;\r\n\r\n private qsps: { [param: string]: string };\r\n\r\n private url: string;\r\n\r\n private hash: string;\r\n\r\n constructor(props: IUncontrolledPaginationProps) {\r\n super(props);\r\n this.maxPages = this.props.items ? Math.ceil(this.props.items / this.props.itemsPerPage!) : 0;\r\n this.activePage = Math.floor((this.props.startingItem || 0) / this.props.itemsPerPage!);\r\n this.qsps = {};\r\n const splitUrl = this.props.url.split('?');\r\n\r\n if (splitUrl[1]) {\r\n this.url = splitUrl[0];\r\n const secondSplit = splitUrl[1].split('#');\r\n this.hash = secondSplit[1] ? `#${secondSplit[1]}` : '';\r\n const parsedQsps = secondSplit[0].split('&');\r\n\r\n for (const qsp of parsedQsps) {\r\n const qspPair = qsp.split('=');\r\n\r\n if (this.props.qsp !== qspPair[0]) {\r\n this.qsps[qspPair[0]] = qspPair[1];\r\n }\r\n }\r\n } else {\r\n const secondSplit = splitUrl[0].split('#');\r\n this.url = secondSplit[0];\r\n this.hash = secondSplit[1] ? `#${secondSplit[1]}` : '';\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n className,\r\n baseUrl,\r\n qsp,\r\n items,\r\n itemsPerPage,\r\n startingItem,\r\n previousText,\r\n nextText,\r\n previousAriaLabel,\r\n nextAriaLabel,\r\n listClassName,\r\n cssModule,\r\n children,\r\n size,\r\n tag: Tag,\r\n listTag: ListTag,\r\n 'aria-label': label,\r\n role,\r\n ...props\r\n\r\n }: any = this.props;\r\n\r\n this.maxPages = this.props.items ? Math.ceil(this.props.items / this.props.itemsPerPage!) : 0;\r\n this.activePage = Math.floor((this.props.startingItem || 0) / this.props.itemsPerPage!);\r\n this.qsps = {};\r\n const splitUrl = this.props.url.split('?');\r\n\r\n if (splitUrl[1]) {\r\n this.url = splitUrl[0];\r\n const secondSplit = splitUrl[1].split('#');\r\n this.hash = secondSplit[1] ? `#${secondSplit[1]}` : '';\r\n const parsedQsps = secondSplit[0].split('&');\r\n\r\n for (const activeQsp of parsedQsps) {\r\n const qspPair = activeQsp.split('=');\r\n\r\n if (this.props.qsp !== qspPair[0]) {\r\n this.qsps[qspPair[0]] = qspPair[1];\r\n }\r\n }\r\n } else {\r\n const secondSplit = splitUrl[0].split('#');\r\n this.url = secondSplit[0];\r\n this.hash = secondSplit[1] ? `#${secondSplit[1]}` : '';\r\n }\r\n\r\n const paginationClasses = mapToCssModules(\r\n classNames(\r\n className\r\n ),\r\n cssModule\r\n );\r\n\r\n const listpaginationClasses = mapToCssModules(\r\n classNames(\r\n listClassName,\r\n 'msc-pagination',\r\n {\r\n [`msc-pagination-${size}`]: !!size\r\n }\r\n ),\r\n cssModule\r\n );\r\n\r\n return (\r\n <Tag className={paginationClasses} role='navigation' aria-label={label}>\r\n <ListTag {...props} className={listpaginationClasses}>\r\n {this._generatePageLinks()}\r\n </ListTag>\r\n </Tag>\r\n );\r\n }\r\n\r\n private _generateUrl(page: number): string {\r\n const items = this.props.itemsPerPage! * page;\r\n const keys = Object.keys(this.qsps);\r\n let qspUrl = page > 0 ? `?${this.props.qsp}=${items}` : '';\r\n\r\n keys.forEach((key: string) => {\r\n qspUrl = qspUrl ? `${qspUrl}&${key}=${this.qsps[key]}` : `?${key}=${this.qsps[key]}`;\r\n });\r\n\r\n return this.url + qspUrl + this.hash;\r\n }\r\n\r\n private _generatePaginationArrow(next: boolean, disable: boolean, className: string): React.ReactElement<PaginationItem> {\r\n const url = disable ? undefined : this._generateUrl(this.activePage + (next ? 1 : -1));\r\n const tooltipId = next ? this.props.nextId : this.props.prevId;\r\n const ariaDescribedBy = next ? this.props.nextAreaDescribed : this.props.prevAreaDescribed;\r\n const placement = next ? 'right' : 'left';\r\n const tag = disable ? 'span' : 'a';\r\n\r\n return (\r\n <PaginationItem disabled={disable} className={className}>\r\n <PaginationLink\r\n id={tooltipId}\r\n href={url}\r\n next={next}\r\n previous={!next}\r\n aria-describedby={ariaDescribedBy}\r\n tag={tag}\r\n aria-label={disable ? undefined : next ? this.props.nextAriaLabel : this.props.previousAriaLabel}\r\n aria-disabled={disable}\r\n telemetryContent={this.props.telemetryContent}\r\n >\r\n {next ? this.props.nextText : this.props.previousText}\r\n </PaginationLink>\r\n {tooltipId && (\r\n <UncontrolledTooltip placement={placement} id={ariaDescribedBy} target={tooltipId}>\r\n {next ? 'next' : 'previous'}\r\n </UncontrolledTooltip>\r\n )}\r\n </PaginationItem>\r\n );\r\n }\r\n\r\n private _generatePaginationItem(page: number): React.ReactElement<PaginationItem> {\r\n const active = this.activePage === page;\r\n const url = this._generateUrl(page);\r\n page += 1;\r\n const label = `Page ${page}`;\r\n return (\r\n <PaginationItem active={active} >\r\n <PaginationLink href={active ? undefined : url} {...(active ? { 'aria-current': 'page' } : {})} aria-label={label} telemetryContent={this.props.telemetryContent}>\r\n {page}\r\n </PaginationLink>\r\n </PaginationItem>\r\n );\r\n }\r\n\r\n private _generateEllipse(): React.ReactElement<PaginationItem> {\r\n return (\r\n <PaginationItem>\r\n <PaginationLink tag='span'>\r\n ...\r\n </PaginationLink>\r\n </PaginationItem>\r\n );\r\n }\r\n\r\n private _generatePageLinks(): React.ReactFragment {\r\n const displayCountSide = 3;\r\n let leftDistance = this.activePage;\r\n let rightDistance = this.maxPages - this.activePage - 1;\r\n const leftEllipse = this.maxPages > SMWEPagination.pagesDisplayed && leftDistance > 3;\r\n const rightEllipse = this.maxPages > SMWEPagination.pagesDisplayed && rightDistance > 3;\r\n\r\n leftDistance = Math.min(leftDistance, displayCountSide);\r\n rightDistance = Math.min(rightDistance, displayCountSide);\r\n const pages = [];\r\n const ellipseOffset = leftEllipse ? -1 : 0;\r\n const displayedPagesOnLeft = leftDistance + (displayCountSide - rightDistance) + ellipseOffset;\r\n const startingIndex = Math.max(this.activePage - displayedPagesOnLeft, 0);\r\n const endIndex = Math.min((startingIndex + 5 + (rightEllipse ? 0 : 1) + (leftEllipse ? 0 : 1)),\r\n (rightEllipse ? this.maxPages - 1 : this.maxPages));\r\n\r\n if (leftEllipse) {\r\n pages.push(this._generatePaginationItem(0));\r\n pages.push(this._generateEllipse());\r\n }\r\n\r\n for (let i = startingIndex; i < endIndex; i++) {\r\n pages.push(this._generatePaginationItem(i));\r\n }\r\n\r\n if (rightEllipse) {\r\n pages.push(this._generateEllipse());\r\n pages.push(this._generatePaginationItem(this.maxPages - 1));\r\n }\r\n\r\n return (\r\n <>\r\n {this._generatePaginationArrow(false, (this.activePage === 0), 'previous')}\r\n {pages}\r\n {this._generatePaginationArrow(true, (this.activePage === this.maxPages - 1), 'next')}\r\n </>\r\n );\r\n }\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, LabeledDropdown } from '@msdyn365-commerce-modules/utilities';\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\n// category description 1.0\r\nimport MsDyn365, { IImageDimension, RichText, RichTextComponent } from '@msdyn365-commerce/core';\r\nimport { format, ProductAvailableQuantity, ProductRefinerValue, ProductSearchResult, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport { getActivePricesAsync, getEstimatedAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { AffiliationLoyaltyTier, ProductPrice, ProjectionDomain } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nimport { buildListPageUrl, getCollectionProducts, getCurrentUrl, GetFullProductsByCollectionInput, hydrateRefinersFromUrl, IFullProductsSearchResultsWithCount, parseQueryParam, sortOptions, } from '../../dataActions/search-result-container';\r\nimport { publish } from '../../Utilities/analytics/analytics-dispatcher';\r\nimport CommerceAttributesParser from '../../Utilities/commerce-attributes-parser';\r\nimport { filterInvalidCategories } from '../../Utilities/refiners';\r\n\r\nimport { ErrorMessage, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion, Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title } from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefinePulldown from './components/refine-pulldown';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport SMWEPagination from './components/smwe-pagination';\r\nimport { ISmweSearchResultContainerData } from './smwe-search-result-container.data';\r\nimport { ISmweSearchResultContainerProps } from './smwe-search-result-container.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends ISmweSearchResultContainerProps<{}> {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n categoryDescription: JSX.Element | undefined;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title:ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n activeRefiners: ProductRefinerValue[];\r\n pulldownText?: string;\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?:React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n productAvailability: ProductAvailableQuantity[] | undefined;\r\n clubPricing: ProductPrice[] | undefined;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\ninterface IImageSettingsViewports {\r\n xs: IImageDimension;\r\n sm?: IImageDimension | undefined;\r\n md?: IImageDimension | undefined;\r\n lg?: IImageDimension | undefined;\r\n xl?: IImageDimension | undefined;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component\r\n * @extends {React.Component<ISmweSearchResultContainerProps<ISmweSearchResultContainerData>>}\r\n */\r\n@observer\r\nexport default class SmweSearchResultContainer extends React.Component<ISmweSearchResultContainerProps<ISmweSearchResultContainerData>, ISearchResultContainerState> {\r\n\r\n @computed get isMobile(): boolean {\r\n return (this._viewport === 'xs' || this._viewport === 'sm' || this._viewport === 'md');\r\n }\r\n\r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [];\r\n private showSortByDropdown: boolean= false;\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n @observable\r\n private _refinersFiltered: boolean = false;\r\n\r\n private _modalToggleRef: React.RefObject<HTMLButtonElement>;\r\n private _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\r\n private _initialProductResultCount: number = 0;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n constructor(props: ISmweSearchResultContainerProps<ISmweSearchResultContainerData>, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\r\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this._addSortByDropdownOptions();\r\n\r\n const modifiedImageSettings = props.config.imageSettings;\r\n if(modifiedImageSettings) {\r\n if(modifiedImageSettings.viewports) {\r\n modifiedImageSettings.viewports = this.usePNGImageSetting(modifiedImageSettings.viewports);\r\n }\r\n }\r\n\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n productAvailability: undefined,\r\n clubPricing: undefined\r\n };\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n\r\n // Initalization of list page\r\n // Have an ugly promise cascade. Promise.all() does NOT work right here. That causes everything below to run after render instead of before.\r\n void this.props.data.products.then(products => {\r\n void this.props.data.listPageState.then(listPageState => {\r\n void this.props.data.refiners.then(refiners => {\r\n void this.props.data.categoryHierarchy.then(categoryHierarchy => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n // This sets off a render cascade\r\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n this._initialProductResultCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n filterInvalidCategories(refiners, categoryHierarchy, this.props.context.app.config.refinerRemappers);\r\n this._refinersFiltered = true;\r\n\r\n if (props.config.addToCart) {\r\n // tslint:disable-next-line: no-floating-promises\r\n void this._getProductavailabilty(products);\r\n if (props.context.app.config.affiliationId) {\r\n void this._getClubPricing(products);\r\n }\r\n }\r\n this._emitImpressionEvent(products.products);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n this.props.context.request.query && this.props.context.request.query.q);\r\n\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count || this._initialProductResultCount;\r\n if (props.config.addToCart) {\r\n // tslint:disable-next-line: no-floating-promises\r\n void this._getProductavailabilty(productResults);\r\n if (this.props.context.app.config.affiliationId) {\r\n void this._getClubPricing(productResults);\r\n }\r\n }\r\n this._emitImpressionEvent(productResults.products);\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }\r\n );\r\n });\r\n });\r\n });\r\n });\r\n\r\n this._updateViewport();\r\n }\r\n\r\n public componentDidMount(): void {\r\n // tslint:disable-next-line: no-typeof-undefined\r\n if (typeof window !== 'undefined' && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n // tslint:disable-next-line: no-typeof-undefined\r\n if (typeof window !== 'undefined' && window.addEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public usePNGImageSetting = (viewports: IImageSettingsViewports): IImageSettingsViewports => {\r\n const modifiedViewports = viewports;\r\n if(modifiedViewports?.xs?.q) {\r\n modifiedViewports.xs.q = modifiedViewports.xs.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.sm?.q) {\r\n modifiedViewports.sm.q = modifiedViewports.sm.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.md?.q) {\r\n modifiedViewports.md.q = modifiedViewports.md.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.lg?.q) {\r\n modifiedViewports.lg.q = modifiedViewports.lg.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.xl?.q) {\r\n modifiedViewports.xl.q = modifiedViewports.xl.q.replace('f=jpg', 'f=png');\r\n }\r\n\r\n return modifiedViewports;\r\n };\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className, paragraph, showPagination, addToCart } = this.props.config;\r\n const { resources, telemetry, data } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n let errorText = '';\r\n if(!products || products.length === 0) {\r\n errorText = this._pageType === 'Category'? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n\r\n }\r\n const categoryHierarchy = (data.category && data.category.result) || undefined;\r\n const passedProps = {...this.props, categoryHierarchy };\r\n const showQuantityAsDropdown = this.props.config.showQuantityAsDropdown || false;\r\n const productsComponent = (\r\n <ProductSearchResultItems\r\n cart={this.props.data.cart}\r\n addToCart={addToCart}\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n telemetry={telemetry}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n parentProps={passedProps}\r\n productAvailability={this.state.productAvailability}\r\n clubPricing={this.state.clubPricing}\r\n showQuantityAsDropdown={showQuantityAsDropdown}\r\n />\r\n );\r\n // category-description 1.0\r\n const categoryDescription = this._getCategoryDescription(paragraph);\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 && this.showSortByDropdown && this.props.config.showSortBy ? this._getSortingDropDown(): null,\r\n pagination: showPagination ? this._getPagination() : '',\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: {className: 'ms-search-result-container__product-section'},\r\n CategoryNavContainer: {className: 'ms-search-result-container__category-nav-section'},\r\n RefineAndProductSectionContainer: {className: 'ms-search-result-container__refine-product-section'},\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ?\r\n (\r\n <ModalToggle\r\n text={resources.modalTitle}\r\n ariaLabel={resources.modalTitle}\r\n innerRef={this._modalToggleRef}\r\n onClick={this._toggleModal}\r\n id='search-result-modal'\r\n />\r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && (\r\n <ErrorMessage text={errorText} />\r\n ),\r\n categoryDescription: categoryDescription\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private _addSortByDropdownOptions = ():void => {\r\n if(this.props.config.showSortingByRelevance) {\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc });\r\n this.showSortByDropdown = true;\r\n }\r\n if(this.props.config.showSortingByName) {\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc });\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc });\r\n this.showSortByDropdown = true;\r\n }\r\n if(this.props.config.showSortingByPrice) {\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc });\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc });\r\n this.showSortByDropdown = true;\r\n }\r\n if(this.props.config.showSortingByRating) {\r\n this.sortByDropdownOptions.push({ key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc });\r\n this.showSortByDropdown = true;\r\n }\r\n };\r\n\r\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const {resources} = this.props;\r\n return SearchResultModal(\r\n {\r\n resources:{\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen:this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle = (data.category.result && SmweSearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: 'ms-search-result-container__title' },\r\n title:{\r\n titlePrefix: titlePrefix,\r\n titleText: titleText,\r\n titleCount: titleCount\r\n }\r\n };\r\n\r\n };\r\n private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n\r\n };\r\n\r\n private _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={this.sortByDropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />);\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown:dropdown\r\n };\r\n };\r\n\r\n private _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount = listPageState && listPageState.currentPageNumber !== null ?\r\n (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) :\r\n ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\r\n const totalItems = listPageState && listPageState.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n const totalActiveProducts = listPageState?.activeProducts?.length || 0;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n if (totalActiveProducts <= 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <SMWEPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={'Product Navigation'}\r\n url={fullUrl.href}\r\n qsp={'skip'}\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={<div className='msc-pagination__prev'><span className='ms-search-result__pagination-left' aria-hidden='true'/><span className='prev-text'>{previousText}</span></div>}\r\n nextText={<div className='msc-pagination__next'><span className='next-text'>{nextText}</span><span className='ms-search-result__pagination-right' aria-hidden='true'/></div>}\r\n previousAriaLabel={'Previous, click here to view the previous page'}\r\n nextAriaLabel={'Next, click here to view the next page'}\r\n />);\r\n };\r\n\r\n private _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = this._refinersFiltered && data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n let subMenus;\r\n if (validRefiners) {\r\n if (this.props.config.pulldownRefiners) {\r\n subMenus = validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (data.listPageState.result!.totalProductCount !== 0 ?\r\n (\r\n <RefinePulldown\r\n highestLevelRefinerText={this.props.config.highestLevelItem}\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n buttonText={this.props.config.pulldownButtonText}\r\n />) : null\r\n );\r\n });\r\n } else {\r\n subMenus = validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (data.listPageState.result!.totalProductCount !== 0 ?\r\n (\r\n <RefineSubmenu\r\n highestLevelRefinerText={this.props.config.highestLevelItem}\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n refinerMinimizeText={this.props.resources.refinerMinimizeText}\r\n refinerExpandText={this.props.resources.refinerExpandText}\r\n minimizedRefiners={this.props.config.minimizedRefiners}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={this.props.config.collapseRefiners ? false : true}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n />) : null\r\n );\r\n });\r\n }\r\n }\r\n\r\n return {\r\n RefineMenuContainer:{className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer:{className: 'ms-search-result-container__refiner-section'},\r\n refiners: subMenus || undefined, // type shenanigans\r\n activeRefiners: activeRefiners,\r\n pulldownText: this.props.config.pulldownButtonText || 'All Wines'\r\n };\r\n\r\n };\r\n\r\n private _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-ignore: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n />\r\n );\r\n\r\n };\r\n\r\n private _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\r\n });\r\n };\r\n\r\n private _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === option.key; });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n private _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria?.Columns?.length && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find((mappedSearchConfig) => {\r\n return (mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName) &&\r\n (mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending);\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find((dropdownOption) => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\r\n };\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n };\r\n\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n },\r\n 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n } else {\r\n return 'xl';\r\n }\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private _getCategoryDescription(paragraph: RichText | undefined): JSX.Element | undefined {\r\n\r\n if (paragraph && paragraph.length > 0) {\r\n return <RichTextComponent className='category-description' text={paragraph}/>;\r\n }\r\n return undefined;\r\n }\r\n\r\n private async _getProductavailabilty(products: IFullProductsSearchResultsWithCount): Promise<void> {\r\n if (products && products.count && products.count > 0) {\r\n const productIds: number[] = [];\r\n products.products.forEach((product) => {\r\n productIds.push(product.RecordId);\r\n });\r\n const availabilityAll = await getEstimatedAvailabilityAsync({ callerContext: this.props.context.actionContext }, {ProductIds: productIds, DefaultWarehouseOnly: true});\r\n const formattedResponse = availabilityAll.ProductWarehouseInventoryAvailabilities?.map((product) => {\r\n return {ProductId: product.ProductId, AvailableQuantity: product.PhysicalAvailable, ExtensionProperties: product.ExtensionProperties};\r\n }) as ProductAvailableQuantity[];\r\n this.setState({productAvailability: formattedResponse});\r\n }\r\n }\r\n\r\n private async _getClubPricing(products: IFullProductsSearchResultsWithCount): Promise<void> {\r\n const projectDomain: ProjectionDomain = { ChannelId: +this.props.context.request.apiSettings.channelId, CatalogId: +this.props.context.request.apiSettings.catalogId };\r\n let affiliations: AffiliationLoyaltyTier[];\r\n if (this.props.context.app.config.affiliationId) {\r\n affiliations = [\r\n {\r\n AffiliationId: this.props.context.app.config.affiliationId\r\n }\r\n ];\r\n } else {\r\n affiliations = [];\r\n }\r\n const productIds: number[] = [];\r\n products.products.forEach((product) => {\r\n productIds.push(product.RecordId);\r\n });\r\n const clubPricingAll = await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext },\r\n projectDomain,\r\n productIds,\r\n new Date(),\r\n '',\r\n affiliations,\r\n true\r\n );\r\n this.setState({clubPricing: clubPricingAll});\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _emitImpressionEvent(products: ProductSearchResult[]): void {\r\n const impressions = products.map(product => ({\r\n product,\r\n attributes: CommerceAttributesParser.getParsedAttributes(product.AttributeValues || []),\r\n }));\r\n\r\n publish('impression', {\r\n products: impressions,\r\n\r\n list: 'Category Page', // Could be Search Results if we ever enable search results pages\r\n category: this.props.data.category.result?.Name,\r\n context: this.props.context,\r\n });\r\n }\r\n}\r\n","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps, Title } from './components';\r\nimport { IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from './smwe-search-result-container';\r\nimport { ISmweSearchResultContainerProps } from './smwe-search-result-container.props.autogenerated';\r\n\r\n// tslint:disable-next-line:cyclomatic-complexity\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISmweSearchResultContainerProps<{}>> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, categoryDescription } = props;\r\n // customization for 1.0\r\n const { showRefiners, showSortBy, showResultCount, categoryNamePrefix } = props.config;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {/*TODO remove after final testing */}\r\n {/*categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)*/}\r\n {renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {showRefiners && !props.config.pulldownRefiners && choiceSummary}\r\n {showRefiners && !props.config.pulldownRefiners && modalToggle}\r\n {showRefiners && !props.config.pulldownRefiners && createSearchResultModal(searchResultModal, refineMenu, sortByOptions, showSortBy!)}\r\n {showRefiners && props.config.pulldownRefiners && refineMenu && renderRefinerPulldown(refineMenu)}\r\n {categoryDescription}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {showResultCount && TitleViewProps && <Node {...CategoryNavContainer}>\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {showRefiners && !props.config.pulldownRefiners && refineMenu && renderRefiner(refineMenu)}\r\n {showRefiners && props.config.pulldownRefiners && refineMenu && renderRefinerPulldown(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {showRefiners && choiceSummary}\r\n {showSortBy && sortByOptions && renderSort(sortByOptions, showSortBy)}\r\n {categoryDescription}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown, showSortBy), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, showSortBy), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefinerPulldown = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer, pulldownText, activeRefiners } = props;\r\n const activeRefinersText = getActiveRefinersText(activeRefiners);\r\n const dynamicPulldownText = getPulldownText(activeRefinersText, pulldownText);\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n <button onClick={() => togglePulldown(getActiveRefinersText(activeRefiners), pulldownText)} className='ms-search-result-container__refiner-pulldown-button' id='refiner-pulldown-button'>\r\n <span className='ms-search-result-container__refiner-pulldown-button-content' id='refiner-pulldown-button-content'>{dynamicPulldownText}</span>\r\n </button>\r\n <div className='ms-search-result-container__refiner-pulldown-container pulldown-hide' id='refiner-pulldown-container'>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n <button onClick={() => togglePulldown(getActiveRefinersText(activeRefiners), pulldownText)} className='ms-search-result-container__refiner-close-pulldown-button'>Close</button>\r\n </div>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst getPulldownText = (activeRefiners: string, buttonText: string | undefined): string => {\r\n const buttonElement = document.getElementById('refiner-pulldown-button');\r\n const spanElement = document.getElementById('refiner-pulldown-button-content');\r\n if (buttonElement && spanElement) {\r\n if (buttonElement.className === 'ms-search-result-container__refiner-pulldown-button refiner-pulldown-button-expanded' || !activeRefiners) {\r\n return spanElement.innerText = buttonText || '';\r\n } else {\r\n return spanElement.innerText = activeRefiners;\r\n }\r\n }\r\n return '';\r\n};\r\n\r\nconst togglePulldown = (activeRefiners: string, buttonText: string | undefined): void => {\r\n const buttonElement = document.getElementById('refiner-pulldown-button');\r\n if (buttonElement) {\r\n buttonElement.classList.toggle('refiner-pulldown-button-expanded');\r\n getPulldownText(activeRefiners, buttonText);\r\n }\r\n const pulldownElement = document.getElementById('refiner-pulldown-container');\r\n if (pulldownElement) {\r\n pulldownElement.classList.toggle('pulldown-hide');\r\n }\r\n\r\n};\r\n\r\nconst getActiveRefinersText = (activeRefiners: ProductRefinerValue[]): string => {\r\n let formatedActiveRefiners = '';\r\n activeRefiners.forEach(refiner => {\r\n if (refiner.UnitText === 'USD') {\r\n formatedActiveRefiners += `$${refiner.LeftValueBoundString}-$${refiner.RightValueBoundString} / `;\r\n } else if (refiner.LeftValueBoundString) {\r\n formatedActiveRefiners += `${refiner.LeftValueBoundString} / `;\r\n }\r\n });\r\n // removes trailing slash and whitespace\r\n formatedActiveRefiners = formatedActiveRefiners.substring(0, formatedActiveRefiners.length - 2);\r\n return formatedActiveRefiners;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && showSortBy) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps, showResultPrefix: boolean, categoryNamePrefix: string): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={categoryNamePrefix} />;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2 aria-level={1}>\r\n {showResultPrefix && titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;","import * as React from 'react';\r\n\r\nimport { Image } from '@msdyn365-commerce/core';\r\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { filterCartLines } from '../../../Utilities/subscription-manager';\r\nimport { ISubscriptionsMinicartData } from '../subscriptions-minicart.data';\r\nimport { ISubscriptionsMinicartProps } from '../subscriptions-minicart.props.autogenerated';\r\n\r\ninterface IBottleCountDisplay {\r\n subscriptionProps: ISubscriptionsMinicartProps<ISubscriptionsMinicartData>;\r\n}\r\n\r\n/**\r\n * declaration for component that renders a list that displays the percent off\r\n */\r\nexport class BottleCountDisplay extends React.Component<IBottleCountDisplay> {\r\n\r\n private readonly _maxBottleCount: number = 12;\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <div className='subscription-minicart-bottle-display'>\r\n {this._fillBottleList(this._generateBottleListFromProducts().slice(0, this._maxBottleCount))}\r\n </div>\r\n );\r\n }\r\n\r\n private _fillBottleList(bottleList: JSX.Element[]): JSX.Element[] {\r\n for (let newBottleIndex = bottleList.length; newBottleIndex < this._maxBottleCount; newBottleIndex++) {\r\n bottleList.push(\r\n (\r\n <div className='subscription-minicart-bottle-item'>\r\n <div className='subscription-minicart-bottle-item-empty' />\r\n {this._specializeIndex(newBottleIndex)}\r\n </div>\r\n )\r\n );\r\n }\r\n return bottleList;\r\n }\r\n\r\n private _generateBottleListFromProducts(): JSX.Element[] {\r\n let rollingIndex = 0;\r\n const fragments: JSX.Element[] = [];\r\n this._cartFilteredLines.subscriptionLines?.forEach((line) => {\r\n\r\n const gridSettings = this.props.subscriptionProps.context.actionContext.requestContext.gridSettings;\r\n const product = this._getProductFromLine(line);\r\n for (let lineIdx = 0; lineIdx < line.Quantity!; lineIdx++) {\r\n fragments.push((\r\n <div className='subscription-minicart-bottle-item'>\r\n {gridSettings && product &&\r\n <Image\r\n src={product.PrimaryImageUrl || ''}\r\n alt={product.Name || ''}\r\n imageSettings={this.props.subscriptionProps.config.imageSettings}\r\n gridSettings={gridSettings}\r\n />\r\n }\r\n {this._specializeIndex(rollingIndex)}\r\n </div>\r\n ));\r\n rollingIndex++;\r\n }\r\n });\r\n return fragments;\r\n }\r\n\r\n private _getProductFromLine(line: CartLine): SimpleProduct | undefined {\r\n const { products: { result: products } } = this.props.subscriptionProps.data;\r\n return products?.find(product => product.ItemId === line.ItemId);\r\n }\r\n\r\n private _specializeIndex(currentIndex: number): JSX.Element | null {\r\n const {\r\n subscriptionsMinicart__discount10Percent,\r\n subscriptionsMinicart__discount15Percent\r\n } = this.props.subscriptionProps.resources;\r\n if (currentIndex === 3) {\r\n return <div className='subscription-minicart-bottle-discount'>{subscriptionsMinicart__discount10Percent}</div>;\r\n } else if (currentIndex === 11) {\r\n return <div className='subscription-minicart-bottle-discount'>{subscriptionsMinicart__discount15Percent}</div>;\r\n }\r\n return null;\r\n }\r\n\r\n private get _cartFilteredLines(): {\r\n subscriptionLines: CartLine[];\r\n lines: CartLine[];\r\n } {\r\n return filterCartLines(this.props.subscriptionProps.data.cart.result?.cart);\r\n }\r\n}","import debounce from 'lodash/debounce';\r\nimport { observable, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { Modal, ModalBody, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport { IWishlistActionSuccessResult } from '@msdyn365-commerce/components';\r\nimport { RichTextComponent } from '@msdyn365-commerce/core';\r\nimport { AttributeValue, CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getEstimatedAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\nimport { publish } from '../../../Utilities/analytics/analytics-dispatcher';\r\nimport { calculateSavingPercentAmount } from '../../../Utilities/elicit-savings-calculation';\r\nimport { filterCartLines, getSubscriptionValues } from '../../../Utilities/subscription-manager';\r\nimport { ElicitCartLineItems, IElicitCartLineItemsProps } from '../../elicit-cart/components/elicit-cart-line-items';\r\nimport { ElicitSubscriptionHeader, IElicitSubscriptionHeaderProps } from '../../elicit-cart/components/elicit-subscription-header';\r\n\r\nimport { ISubscriptionsMinicartData } from '../subscriptions-minicart.data';\r\nimport { IFrequencyTableData, ISubscriptionsMinicartProps } from '../subscriptions-minicart.props.autogenerated';\r\n\r\nexport interface IBoxEditComponentProps {\r\n initialValues: {\r\n name?: string;\r\n frequencyId?: string;\r\n };\r\n props: ISubscriptionsMinicartProps<ISubscriptionsMinicartData>;\r\n onBoxNameChange(newName: string): void;\r\n onFrequencyChange(newFrequency: IFrequencyTableData): void;\r\n}\r\n\r\n/**\r\n * declaration for the component that manages the editing\r\n * of the minicart when a user decides to name their box or\r\n * change their frequency\r\n */\r\n@observer\r\nexport class BoxEditComponent extends React.Component<IBoxEditComponentProps> {\r\n\r\n @observable private _popupState: boolean = false;\r\n @observable private _name: string;\r\n @observable private _selectedFrequencyId: string;\r\n\r\n constructor(props: IBoxEditComponentProps) {\r\n super(props);\r\n\r\n this._onBoxNameChange = this._onBoxNameChange.bind(this);\r\n this._publishBoxNameChange = debounce(this._publishBoxNameChange.bind(this), 500);\r\n this._onFrequencyChange = this._onFrequencyChange.bind(this);\r\n this._togglePopup = this._togglePopup.bind(this);\r\n this._emptyCart = this._emptyCart.bind(this);\r\n\r\n const { name, frequencyId } = this.props.initialValues;\r\n this._name = name || '';\r\n this._selectedFrequencyId = frequencyId || props.props.config.frequencyTable?.find((freq) => !!freq.id)!.id!;\r\n\r\n reaction(\r\n () => { return this._popupState; },\r\n async () => {\r\n // tslint:disable-next-line: no-floating-promises\r\n await this._getProductavailabilty(this.props.props.data.products.result);\r\n }\r\n );\r\n }\r\n\r\n // tslint:disable-next-line:cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n resources: {\r\n subscriptionsMinicart__editBoxBtn,\r\n subscriptionsMinicart__editBoxNamePlaceholder,\r\n subscriptionsMinicart_subscriptionSavingText,\r\n subscriptionsMinicart_subscriptionLinePercentSavingText,\r\n subscriptionsMinicart_emptyCartBtn\r\n }, config: { faqLink }\r\n } = this.props.props;\r\n\r\n const contextProps = this.props.props;\r\n const resources = contextProps.resources;\r\n const cart = contextProps.data.cart.result;\r\n const products = contextProps.data.products.result;\r\n const productAvailabilities = contextProps.data.productAvailabilites.result;\r\n const productDeliveryOptions = contextProps.data.deliveryOptions.result;\r\n const storeSelectorStateManager = contextProps.data.storeSelectorStateManager.result;\r\n const orgUnitLocations = contextProps.data.orgUnitLocations.result;\r\n\r\n if (!cart || !products || !productAvailabilities || !productDeliveryOptions || !storeSelectorStateManager || !orgUnitLocations) {\r\n return null;\r\n }\r\n\r\n const elicitModalProps: IElicitCartLineItemsProps = {\r\n percentSaving: calculateSavingPercentAmount(this._cartFilteredLines.subscriptionLines),\r\n templatePercentSavingText: subscriptionsMinicart_subscriptionLinePercentSavingText,\r\n templateSavingText: subscriptionsMinicart_subscriptionSavingText,\r\n cartlines: this._cartFilteredLines.subscriptionLines,\r\n cartLineErrors: {},\r\n mixedCart: {},\r\n mixedCartLines: cart.cart.CartLines|| [],\r\n products: products,\r\n productAvailabilites: productAvailabilities,\r\n productDeliveryOptions: productDeliveryOptions,\r\n imageSettings: contextProps.config.imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n },\r\n outOfStockThreshold: contextProps.context.app.config.outOfStockThreshold || 10,\r\n isStockCheckEnabled: contextProps.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: contextProps.app.config.maxQuantityForCartLineItem,\r\n gridSettings: contextProps.context.request.gridSettings!,\r\n context: contextProps.context,\r\n typeName: contextProps.typeName,\r\n id: contextProps.id,\r\n resources: {\r\n sizeString: resources.subscriptionsMinicart__productDimensionTypeSize,\r\n colorString: resources.subscriptionsMinicart__productDimensionTypeColor,\r\n configString: 'asd',\r\n styleString: resources.subscriptionsMinicart__productDimensionTypeStyle,\r\n quantityDisplayString: resources.subscriptionsMinicart__quantityDisplayText,\r\n inputQuantityAriaLabel: resources.subscriptionsMinicart__inputQuantityAriaLabel,\r\n discountStringText: resources.subscriptionsMinicart__discountStringText,\r\n\r\n originalPriceText: resources.subscriptionsMinicart__originalPriceText,\r\n currentPriceText: resources.subscriptionsMinicart__currentPriceText,\r\n shippingChargesText: resources.subscriptionsMinicart__shippingCharges,\r\n },\r\n telemetry: contextProps.telemetry,\r\n addToWishlistButtonText: resources.subscriptionsMinicart__addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.subscriptionsMinicart__removeFromWishlistButtonText,\r\n removeButtonText: resources.subscriptionsMinicart__removeCartButtonText,\r\n shipItText: resources.subscriptionsMinicart__shipInsteadDisplayText,\r\n pickitUpText: resources.subscriptionsMinicart__pickItUpDisplayText,\r\n changeStoreText: resources.subscriptionsMinicart__changeStoreDisplayText,\r\n storeSelectorStateManager: storeSelectorStateManager,\r\n cartState: cart,\r\n orgUnitLocations: orgUnitLocations,\r\n wishlists: [],\r\n defaultWishlistName: resources.subscriptionsMinicart__defaultWishlistName,\r\n pickupDeliveryModeCode: contextProps.context.request.channel?.PickupDeliveryModeCode!,\r\n showImages: contextProps.config.showImages,\r\n invalidProductError: resources.subscriptionsMinicart__invalidProductError,\r\n outOfStockError: resources.subscriptionsMinicart__outOfStockError,\r\n zeroAvailabilityError: resources.subscriptionsMinicart__zeroAvailabilityError,\r\n showDiscountPercent: contextProps.config.showDiscountPercent,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n };\r\n\r\n const headerProps: IElicitSubscriptionHeaderProps = {\r\n cart: this.props.props.data.cart,\r\n className: 'minicart-modal-subscription-header',\r\n context: this.props.props.context,\r\n frequencyTable: this.props.props.config.frequencyTable!.map(freq => { return { freqId: freq.id, freqLabel: freq.label }; }),\r\n resources: {\r\n deliveryText: resources.subscriptionsMinicart_subscriptionDeliveryText,\r\n savingText: resources.subscriptionsMinicart_subscriptionSavingText,\r\n savingLabel: resources.subscriptionsMinicart_subscriptionSavingLabel,\r\n wineBottleSummaryCount: resources.subscriptionsMinicart_subscriptionWineBottleSummaryCount,\r\n boxNamePlaceholder: resources.subscriptionsMinicart__editBoxNamePlaceholder\r\n }\r\n };\r\n\r\n return (\r\n <div className='subscription-minicart-box-edit'>\r\n <input\r\n className='subscription-minicart-box-input'\r\n type='text'\r\n placeholder={subscriptionsMinicart__editBoxNamePlaceholder}\r\n value={this._name}\r\n onChange={this._onBoxNameChange}\r\n />\r\n {this._renderFrequencies()}\r\n <div className='subscription-minicart-box-edit-group'>\r\n <button className='subscription-minicart-box-edit-button' onClick={this._togglePopup} disabled={this._isCartEmpty}>{subscriptionsMinicart__editBoxBtn}</button>\r\n {faqLink?.linkUrl?.destinationUrl &&\r\n <a\r\n className='subscription-minicart-box-edit-faq'\r\n href={faqLink.linkUrl.destinationUrl}\r\n target={faqLink.openInNewTab ? '_blank' : undefined}\r\n aria-label={faqLink.ariaLabel}\r\n role='button'\r\n rel=\"noreferrer\"\r\n />\r\n }\r\n </div>\r\n <Modal\r\n autoFocus={true}\r\n fade={true}\r\n isOpen={this._popupState}\r\n horizontalPosition={'center'}\r\n verticalPosition={'center'}\r\n zIndex={1000}\r\n toggle={this._togglePopup}\r\n applicationNode={'rsg-root'}\r\n modalClassName={'subscription-minicart-edit-modal'}\r\n >\r\n <ModalHeader toggle={this._togglePopup} />\r\n <ModalBody>\r\n <div className='subscription-minicart-header-container'>\r\n <ElicitSubscriptionHeader {...headerProps} />\r\n </div>\r\n <ul className='msc-cart-line__container'>\r\n {ElicitCartLineItems(elicitModalProps)?.map((cartLine, index) => {\r\n return (\r\n <li className='msc-cart-line__item-wrapper' key={index}>\r\n {cartLine.cartline}\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n <button onClick={this._emptyCart} className='subscription-minicart-edit-modal-button'>{subscriptionsMinicart_emptyCartBtn}</button>\r\n {this.props.props.config.editBoxWarning && <RichTextComponent\r\n className='subscription-minicart-edit-modal-warning'\r\n text={this.props.props.config.editBoxWarning as string || ''}\r\n />}\r\n </ModalBody>\r\n </Modal>\r\n </div>\r\n );\r\n }\r\n\r\n private get _cartFilteredLines(): {\r\n subscriptionLines: CartLine[];\r\n lines: CartLine[];\r\n } {\r\n return filterCartLines(this.props.props.data.cart.result?.cart);\r\n }\r\n\r\n private _togglePopup(): void {\r\n if (this._popupState) {\r\n const { name: newName, frequency: newFreq } = getSubscriptionValues(this.props.props.data.cart.result?.cart);\r\n this._name = newName || '';\r\n this._selectedFrequencyId = newFreq || this._selectedFrequencyId;\r\n }\r\n this._popupState = !this._popupState;\r\n }\r\n\r\n private _renderFrequencies(): JSX.Element {\r\n return (\r\n <select className='subscription-minicart-select' value={this._selectedFrequencyId} onChange={this._onFrequencyChange}>\r\n {\r\n this.props.props.config.\r\n frequencyTable?.map(\r\n (frequency, key) => (\r\n <option\r\n value={frequency.id}\r\n key={key}\r\n aria-selected={frequency.id === this._selectedFrequencyId}\r\n >\r\n {frequency.label}\r\n </option>\r\n )\r\n )\r\n }\r\n </select>\r\n );\r\n }\r\n\r\n // ========================================================================\r\n // Taken from elicit-cart.tsx\r\n // ========================================================================\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n const cart = this.props.props.data.cart.result;\r\n\r\n if (cart) {\r\n this._generateRemovalAnalyticsEvent(cartlineToRemove);\r\n\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n\r\n cart.removeCartLines(input)\r\n .then(() => {\r\n if (cart.cart.CartLines?.length === 0) { this._popupState = false; }\r\n })\r\n .catch((error) => {\r\n this.props.props.telemetry.warning(error);\r\n this.props.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n //----------------------------------------------------------\r\n // Almost identical to elicit-cart -- why isn't this shared code??\r\n //----------------------------------------------------------\r\n private _generateRemovalAnalyticsEvent = (cartlineToRemove: CartLine): void => {\r\n const productID = cartlineToRemove.ProductId;\r\n if (!productID) {\r\n return;\r\n }\r\n\r\n const product = this.props.props.data.products.result?.find(entry => entry.RecordId === productID);\r\n const attributes: AttributeValue[] = [];\r\n\r\n publish('removeFromCart', {\r\n product,\r\n quantity: cartlineToRemove.Quantity,\r\n attributes,\r\n subscription: true,\r\n context: this.props.props.context\r\n });\r\n };\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n };\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number) => {\r\n if (this.props.props.data.cart.result) {\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity\r\n };\r\n this.props.props.data.cart.result.updateCartLineQuantity(input)\r\n .catch((error) => {\r\n this.props.props.telemetry.warning(error);\r\n this.props.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n };\r\n\r\n // ========================================================================\r\n // end\r\n // ========================================================================\r\n\r\n private get _isCartEmpty(): boolean {\r\n return this._cartFilteredLines.subscriptionLines?.length === 0;\r\n }\r\n\r\n private async _emptyCart(): Promise<void> {\r\n const { result: cart } = this.props.props.data.cart;\r\n\r\n if (cart) {\r\n const linesToRemove = this._cartFilteredLines.subscriptionLines;\r\n\r\n // Generate a removal event for each line\r\n linesToRemove.forEach(this._generateRemovalAnalyticsEvent);\r\n\r\n const lineIds = linesToRemove.map(line => line.LineId!);\r\n await cart.removeCartLines({ cartLineIds: lineIds });\r\n this._popupState = false;\r\n }\r\n }\r\n\r\n private _publishBoxNameChange(): void {\r\n this.props.onBoxNameChange(this._name);\r\n }\r\n\r\n private _onFrequencyChange(event: React.ChangeEvent<HTMLSelectElement>): void {\r\n this._selectedFrequencyId = event.target.value;\r\n const frequency = this.props.props.config.frequencyTable?.find(freq => freq.id === this._selectedFrequencyId)!;\r\n this.props.onFrequencyChange(frequency);\r\n }\r\n\r\n private _onBoxNameChange(event: React.ChangeEvent<HTMLInputElement>): void {\r\n this._name = event.target.value;\r\n this._publishBoxNameChange();\r\n }\r\n\r\n private async _getProductavailabilty(products: SimpleProduct[] | undefined): Promise<void> {\r\n if (products && products.length > 0) {\r\n const productIds: number[] = [];\r\n products.forEach((product) => {\r\n productIds.push(product.RecordId);\r\n });\r\n const availabilityAll = await getEstimatedAvailabilityAsync({ callerContext: this.props.props.context.actionContext }, {ProductIds: productIds, DefaultWarehouseOnly: true});\r\n this.props.props.data.productAvailabilites.result = availabilityAll.ProductWarehouseInventoryAvailabilities?.map((product) => {\r\n return {ProductId: product.ProductId, AvailableQuantity: product.PhysicalAvailable, ExtensionProperties: product.ExtensionProperties};\r\n });\r\n }\r\n }\r\n}","import { Button, format } from '@msdyn365-commerce-modules/utilities';\r\nimport { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { calculateSavingPercentAmount } from '../../../Utilities/elicit-savings-calculation';\r\nimport { orderSummaryShipmentCalculation } from '../../../Utilities/smwe-order-summary-shipment-calculation';\r\nimport { filterCartLines } from '../../../Utilities/subscription-manager';\r\nimport { ISubscriptionsMinicartData } from '../subscriptions-minicart.data';\r\nimport { ISubscriptionsMinicartProps } from '../subscriptions-minicart.props.autogenerated';\r\ninterface ICartDisplayComponentProps {\r\n subscriptionsProps: ISubscriptionsMinicartProps<ISubscriptionsMinicartData>;\r\n}\r\n\r\n/**\r\n * declaration for display the minicart summary info to the user\r\n */\r\nexport class CartDisplayComponent extends React.Component<ICartDisplayComponentProps> {\r\n public render(): JSX.Element | null {\r\n const {\r\n subscriptionsProps: {\r\n resources: { subscriptionsMinicart__boxPrice, subscriptionsMinicart__shipping, subscriptionsMinicart__savings, subscriptionsMinicart__goToCart },\r\n data: { cart: { result: cartState } },\r\n context: {\r\n actionContext\r\n }\r\n }\r\n } = this.props;\r\n if (!cartState) { return null; }\r\n const { cart } = cartState;\r\n\r\n const savingPercent = calculateSavingPercentAmount(this._cartFilteredLines.subscriptionLines);\r\n\r\n const formatter = this.props.subscriptionsProps.context.cultureFormatter.formatCurrency;\r\n const cartUrl = getUrlSync('cart', actionContext) || '';\r\n const amount = savingPercent ? this._calculateDiscountedTotalAmount : this._calculateTotalAmount;\r\n return (\r\n <div className='subscription-minicart-cart-summary'>\r\n <div className='subscription-minicart-amount-summary'>\r\n <span className='subscription-minicart-boxprice'>{subscriptionsMinicart__boxPrice}</span>\r\n <div className='subscription-minicart-amount'>{formatter(amount || 0)}</div>\r\n <div className='subscription-minicart-savings'>\r\n <div className='subscription-minicart-savings-amount'>\r\n {format(subscriptionsMinicart__savings, formatter(((this._calculateTotalAmount || 0) * (savingPercent / 100))), savingPercent)}\r\n </div>\r\n <div className='subscription-minicart-amount-savings'>{savingPercent}% off</div>\r\n </div>\r\n </div>\r\n <div className='subscription-minicart-shipping-summary'>\r\n <span className='subscription-minicart-shipping'>{subscriptionsMinicart__shipping}</span>\r\n <div className='subscription-minicart-shipping-amount'>{formatter(orderSummaryShipmentCalculation({ cart }).price)}</div>\r\n </div>\r\n <div className='subscription-minicart-cart-button-container'>\r\n <Button className='subscription-minicart-cart-button' href={cartUrl}>{subscriptionsMinicart__goToCart}</Button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private get _cartFilteredLines(): {\r\n subscriptionLines: CartLine[];\r\n lines: CartLine[];\r\n } {\r\n return filterCartLines(this.props.subscriptionsProps.data.cart.result?.cart);\r\n }\r\n\r\n private get _calculateTotalAmount(): number {\r\n let amount = 0;\r\n this._cartFilteredLines.subscriptionLines.forEach(line => amount += line.NetPrice || 0);\r\n return amount;\r\n }\r\n\r\n private get _calculateDiscountedTotalAmount(): number {\r\n let amount = 0;\r\n this._cartFilteredLines.subscriptionLines.forEach(line => amount += line.TotalAmount || 0);\r\n return amount;\r\n }\r\n}","import * as React from 'react';\r\nimport { ISubscriptionsMinicartResources } from '../subscriptions-minicart.props.autogenerated';\r\nexport interface ISubscriptionBannerDisplayProps {\r\n resources: ISubscriptionsMinicartResources;\r\n subscriptionName: string;\r\n}\r\n\r\n/**\r\n * Wrapper component for the subscription banner display\r\n */\r\nexport class SubscriptionBannerDisplayComponent extends React.Component<ISubscriptionBannerDisplayProps> {\r\n public render(): JSX.Element {\r\n const { subscriptionName } = this.props;\r\n return (\r\n <div className='subscription-minicart-title'>\r\n <div className='subscription-minicart-title-icon' />\r\n {subscriptionName && <h2 className='subscription-minicart-title-text'>{subscriptionName}</h2>}\r\n </div>\r\n );\r\n }\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\nimport { ActiveCartProductsInput, getActiveCartProductsAction } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IImageDimension } from '@msdyn365-commerce/core';\r\nimport { CartLine, CommerceProperty, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { observable, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport { SubscriptionCommerceValues } from '../../common/subscription-commerce.values';\r\nimport { BusLoader, LoadBus } from '../../Utilities/event-bus';\r\nimport { getSubscriptionValues, updateSubscription } from '../../Utilities/subscription-manager';\r\nimport { BottleCountDisplay } from './components/bottle-count-display.component';\r\nimport { BoxEditComponent } from './components/box-edit.component';\r\nimport { CartDisplayComponent } from './components/cart-display.component';\r\nimport { SubscriptionBannerDisplayComponent } from './components/subscription-banner-display.component';\r\nimport { ISubscriptionsMinicartData } from './subscriptions-minicart.data';\r\nimport { IFrequencyTableData, ISubscriptionsMinicartProps } from './subscriptions-minicart.props.autogenerated';\r\nexport interface ISubscriptionsMinicartViewProps extends ISubscriptionsMinicartProps<ISubscriptionsMinicartData> {\r\n editBoxComponent: React.ReactNode;\r\n bottleCountComponent: React.ReactNode;\r\n cartDisplaySummaryComponent: React.ReactNode;\r\n subscriptionBannerDisplayComponent: React.ReactNode;\r\n baseProps: {\r\n boxName: string;\r\n frequency: IFrequencyTableData;\r\n };\r\n}\r\n\r\nexport interface IWineBoxLine {\r\n line: CartLine;\r\n product: SimpleProduct;\r\n}\r\n\r\ninterface IImageSettingsViewports {\r\n xs: IImageDimension;\r\n sm?: IImageDimension | undefined;\r\n md?: IImageDimension | undefined;\r\n lg?: IImageDimension | undefined;\r\n xl?: IImageDimension | undefined;\r\n}\r\n\r\n/**\r\n *\r\n * SubscriptionsMinicart component\r\n * @extends {React.Component<ISubscriptionsMinicartProps<ISubscriptionsMinicartData>>}\r\n */\r\n@LoadBus('product-component-wrapper')\r\n@observer\r\nclass SubscriptionsMinicart extends React.Component<ISubscriptionsMinicartProps<ISubscriptionsMinicartData>> {\r\n\r\n @observable private _boxName: string;\r\n @observable private _frequencyId: string;\r\n private bus: BusLoader | undefined;\r\n private _eventId: number;\r\n\r\n constructor(props: ISubscriptionsMinicartProps<ISubscriptionsMinicartData>) {\r\n super(props);\r\n\r\n this._onBoxNameChange = this._onBoxNameChange.bind(this);\r\n this._onFrequencyChange = this._onFrequencyChange.bind(this);\r\n\r\n const modifiedImageSettings = props.config.imageSettings;\r\n if (modifiedImageSettings) {\r\n if (modifiedImageSettings.viewports) {\r\n modifiedImageSettings.viewports = this.usePNGImageSetting(modifiedImageSettings.viewports);\r\n props.config.imageSettings = modifiedImageSettings;\r\n }\r\n }\r\n\r\n this._boxName = '';\r\n this._frequencyId = '';\r\n\r\n reaction(\r\n () => { return this.props.data.cart.result?.cart.CartLines; },\r\n () => {\r\n this.props.data.products.run(async (exec) => {\r\n exec(\r\n await getActiveCartProductsAction(\r\n new ActiveCartProductsInput(),\r\n this.props.context.actionContext\r\n )\r\n );\r\n });\r\n }\r\n );\r\n\r\n reaction(\r\n () => { return this.props.data.cart.result?.cart; },\r\n () => {\r\n const { name: newName, frequency: newFreq } = getSubscriptionValues(this.props.data.cart.result?.cart);\r\n this._boxName = newName || '';\r\n if (newFreq) { this._frequencyId = newFreq; }\r\n }\r\n );\r\n\r\n this._eventId = this.bus?.subscribe('finished-adding-to-cart', () => {\r\n this.props.data.cart.result && this.props.data.cart.result.refreshCart({});\r\n }).id!;\r\n\r\n // sets default subscription box name if unset\r\n props.data.cart.then(() => {\r\n const values = getSubscriptionValues(this.props.data.cart.result?.cart);\r\n if (!values.name) {\r\n // tslint:disable-next-line: no-floating-promises\r\n void this._onBoxNameChange(SubscriptionCommerceValues.SUBSCRIPTION_DEFAULT_NAME);\r\n }\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n this.bus?.unsubscribe(this._eventId);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n if (!this.props.data.cart.result) { return <div />; }\r\n const values = getSubscriptionValues(this.props.data.cart.result?.cart);\r\n const renderProps: ISubscriptionsMinicartViewProps = {\r\n ...this.props,\r\n baseProps: {\r\n boxName: this._boxName,\r\n frequency: this.props.config.frequencyTable?.find(freq => this._frequencyId === freq.id)!\r\n },\r\n subscriptionBannerDisplayComponent: (\r\n <SubscriptionBannerDisplayComponent\r\n resources={this.props.resources}\r\n subscriptionName={this._boxName || values.name!}\r\n />\r\n ),\r\n editBoxComponent: (\r\n <BoxEditComponent\r\n onBoxNameChange={this._onBoxNameChange}\r\n onFrequencyChange={this._onFrequencyChange}\r\n initialValues={{ name: this._boxName || values.name, frequencyId: this._frequencyId || values.frequency }}\r\n props={this.props}\r\n />\r\n ),\r\n bottleCountComponent: (\r\n <BottleCountDisplay\r\n subscriptionProps={this.props}\r\n />\r\n ),\r\n cartDisplaySummaryComponent: (\r\n <CartDisplayComponent\r\n subscriptionsProps={this.props}\r\n />\r\n )\r\n };\r\n\r\n return this.props.renderView(renderProps);\r\n }\r\n\r\n public usePNGImageSetting = (viewports: IImageSettingsViewports): IImageSettingsViewports => {\r\n const modifiedViewports = viewports;\r\n if (modifiedViewports?.xs?.q) {\r\n modifiedViewports.xs.q = modifiedViewports.xs.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.sm?.q) {\r\n modifiedViewports.sm.q = modifiedViewports.sm.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.md?.q) {\r\n modifiedViewports.md.q = modifiedViewports.md.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.lg?.q) {\r\n modifiedViewports.lg.q = modifiedViewports.lg.q.replace('f=jpg', 'f=png');\r\n }\r\n if (modifiedViewports?.xl?.q) {\r\n modifiedViewports.xl.q = modifiedViewports.xl.q.replace('f=jpg', 'f=png');\r\n }\r\n\r\n return modifiedViewports;\r\n };\r\n\r\n private async _pushUpdateToCart(updates: { key: string; value: string }[]): Promise<void> {\r\n // we need to parse this form's format into how the cart likes to\r\n // handle things\r\n const cartChanges: CommerceProperty[] = updates.map(change => {\r\n return {\r\n Key: change.key,\r\n Value: {\r\n StringValue: change.value\r\n }\r\n };\r\n });\r\n\r\n await updateSubscription(this.props.data.cart, cartChanges, this.props.context);\r\n }\r\n\r\n private async _onBoxNameChange(newName: string): Promise<void> {\r\n this._boxName = newName;\r\n await this._pushUpdateToCart([\r\n {\r\n key: SubscriptionCommerceValues.SUBSCRIPTION_NAME,\r\n value: this._boxName\r\n },\r\n {\r\n key: SubscriptionCommerceValues.SUBSCRIPTION_FREQUENCY,\r\n value: this._frequencyId\r\n },\r\n ]);\r\n }\r\n\r\n private async _onFrequencyChange(frequency: IFrequencyTableData): Promise<void> {\r\n this._frequencyId = frequency.id;\r\n await this._pushUpdateToCart([\r\n {\r\n key: SubscriptionCommerceValues.SUBSCRIPTION_FREQUENCY,\r\n value: this._frequencyId\r\n }\r\n ]);\r\n }\r\n\r\n}\r\n\r\nexport default SubscriptionsMinicart;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { ISubscriptionsMinicartViewProps } from './subscriptions-minicart';\r\n\r\nexport default ({\r\n bottleCountComponent,\r\n editBoxComponent,\r\n cartDisplaySummaryComponent,\r\n subscriptionBannerDisplayComponent\r\n}: ISubscriptionsMinicartViewProps) => {\r\n return (\r\n <div className='subscription-minicart'>\r\n <div className='subscription-minicart-header'>\r\n {subscriptionBannerDisplayComponent}\r\n </div>\r\n <div className='subscription-minicart-content'>\r\n {bottleCountComponent}\r\n <div className='subscription-minicart-summary-group'>\r\n {editBoxComponent}\r\n {cartDisplaySummaryComponent}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxProductQuantityViewProps\r\n} from '@msdyn365-commerce-modules/buybox/dist/types';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ISmweBuyboxViewProps } from '../../../modules/smwe-buybox/smwe-buybox';\r\nimport { ISmweBuyboxProps } from '../definition-extensions/smwe-buybox.ext.props.autogenerated';\r\n\r\nconst SmweBuyboxView: React.FC<ISmweBuyboxViewProps & ISmweBuyboxProps<{}>> = props => {\r\n const { subscriptionButton, ModuleProps, MediaGalleryContainerProps, ProductInfoContainerProps, addToCart, quantity, title, productDescription, productClubPrice, productPrice, show, acclaimRatings, cookbookTagline, eventSchedule } = props;\r\n // @ts-ignore\r\n const tableClass: AsyncResult<string> = props.context.actionContext.get('String', 'Generic-SkuSelectorClasses');\r\n const isGiftCard = props.data.product?.result ? props.data.product.result.ItemId?.toLowerCase() === 'giftcard' : false;\r\n return (\r\n <Module {...ModuleProps}>\r\n <div className='ms-buybox__mobile-header'>\r\n {props.productApellation && <>{props.productApellation}</>}\r\n {title}\r\n </div>\r\n <div className='ms-buybox__media-gallery-wrapper'>\r\n <Node {...MediaGalleryContainerProps}>\r\n {props.mediaGallery}\r\n </Node>\r\n {props.tastingNotes}\r\n </div>\r\n <Node {...ProductInfoContainerProps}>\r\n {props.productApellation && <>{props.productApellation}</>}\r\n {title}\r\n {productDescription}\r\n {eventSchedule}\r\n {acclaimRatings}\r\n {cookbookTagline}\r\n {show && <div className={`sku-selector ${tableClass && tableClass.result}`}>\r\n <div className='sku-selector__price'>\r\n {productPrice && <div className='sku-selector__product-price'>{productPrice}</div>}\r\n {!isGiftCard && productClubPrice && <div className='sku-selector__product-price-club'>{productClubPrice} Club</div>}\r\n {isGiftCard && addToCart && <div className='sku-selector__add-to-cart'>{_renderAddToCart(addToCart)}</div>}\r\n </div>\r\n {!isGiftCard && quantity && <div className='sku-selector__product-quantity'>{_renderQuantity(quantity)}</div>}\r\n {!isGiftCard && addToCart && <div className='sku-selector__add-to-cart'>{_renderAddToCart(addToCart)}</div>}\r\n {subscriptionButton && <div className='sku-selector__add-to-subscription'>{_renderAddToCart(subscriptionButton)}</div>}\r\n </div>}\r\n {props.content &&\r\n props.content.map(\r\n (contentSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <React.Fragment key={index}>\r\n {contentSlotData}\r\n </React.Fragment>\r\n );\r\n }\r\n )\r\n }\r\n </Node>\r\n {props.slots?.productCollection?.length &&\r\n <div className='ms-buybox__product-collection'>\r\n {props.slots.productCollection.map(\r\n (productCollectionSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <React.Fragment key={index}>\r\n {productCollectionSlotData}\r\n </React.Fragment>\r\n );\r\n }\r\n )\r\n }\r\n </div>\r\n }\r\n </Module>\r\n );\r\n};\r\n\r\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {button}\r\n {errorBlock}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, input, errors } = quantity;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {errors}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\nexport default SmweBuyboxView;\r\n","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps, Title } from '../../../modules/smwe-search-result-container/components';\r\nimport { IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from '../../../modules/smwe-search-result-container/smwe-search-result-container';\r\n\r\nconst renderSort = (props: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && showSortBy) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, showSortBy), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown, showSortBy), modalProps.modalFooter);\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps, showResultPrefix: boolean, categoryNamePrefix: string): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={categoryNamePrefix} />;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {showResultPrefix && titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst SmweSearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage,\r\n categoryDescription } = props;\r\n // customization for 1.0\r\n const { showRefiners, showSortBy, showResultCount, categoryNamePrefix } = props.config;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-container__title-header'>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {categoryDescription}\r\n </div>\r\n <div className='ms-search-result-container__filter-sort'>\r\n {showRefiners && choiceSummary}\r\n {showRefiners && modalToggle}\r\n {showRefiners && createSearchResultModal(searchResultModal, refineMenu, sortByOptions, showSortBy!)}\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {showResultCount && TitleViewProps && <Node {...CategoryNavContainer}>\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {showRefiners && refineMenu && renderRefiner(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-container__title-header'>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {categoryDescription}\r\n </div>\r\n <div className='ms-search-result-container__filter-sort'>\r\n {showRefiners && choiceSummary}\r\n {showSortBy && sortByOptions && renderSort(sortByOptions, showSortBy)}\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nexport default SmweSearchResultContainerView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { DeliveryOption as DeliveryOptionData } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICheckoutDeliveryOption, ICheckoutDeliveryOptionEdit, ICheckoutDeliveryOptionsError, ICheckoutDeliveryOptionsList, ICheckoutDeliveryOptionsViewProps } from '../../../modules/smwe-checkout-delivery-options/smwe-checkout-delivery-options';\r\ninterface ICheckoutDeliveryOptionsListFiltered extends ICheckoutDeliveryOptionsList {\r\n globalConfig?: {\r\n [x: string]: unknown;\r\n };\r\n options?: DeliveryOptionData[];\r\n}\r\n\r\ntype ModShipping = {\r\n id: number;\r\n amount: number;\r\n}[];\r\n\r\nconst DeliveryOptionList: React.FC<ICheckoutDeliveryOptionsListFiltered> = ({\r\n DeliveryOptionsList,\r\n list,\r\n globalConfig,\r\n options\r\n}) => {\r\n if (!list || list.length === 0) {\r\n return null;\r\n }\r\n\r\n const pennyShippingMethodIds = globalConfig?.pennyShippingIds as number[] || [];\r\n const modShippingMethodIds = globalConfig?.modShippingIds as ModShipping || [];\r\n\r\n let localList: ICheckoutDeliveryOptionEdit[] = [];\r\n if (options) {\r\n // maps options with list for sorting\r\n const combinedList: {option: DeliveryOptionData; list: ICheckoutDeliveryOptionEdit}[] = [];\r\n options.map((option, index) => combinedList.push({option: option, list: list[index]}));\r\n // sort list by lowest to highest price\r\n const combinedListSorted = combinedList.sort((a, b) => (a.option.ShippingChargeAmount! > b.option.ShippingChargeAmount!) ? 1 : ((b.option.ShippingChargeAmount! > a.option.ShippingChargeAmount!) ? -1 : 0));\r\n combinedListSorted.forEach((deliveryData) => {\r\n if (deliveryData.list) {\r\n // search to find out if it is a mod shipping method\r\n const isModShippingMethod = modShippingMethodIds.find(modShipping => Number(modShipping.id) === deliveryData.option.RecordId);\r\n // backwards compatibility for penny shipping\r\n const isPennyShippingMethod = pennyShippingMethodIds.find(pennyShipping => Number(pennyShipping) === deliveryData.option.RecordId);\r\n\r\n // Filter out mod shipping methods that are declared\r\n // in the global config, only show shipping methods\r\n // that have a matching mod price for the customer at this current time\r\n // of checkout. If it's not a mod shipping method, always display\r\n // it.\r\n if (isModShippingMethod && deliveryData.option.ShippingChargeAmount === isModShippingMethod.amount) {\r\n localList.push(deliveryData.list);\r\n } else if (isPennyShippingMethod && deliveryData.option.ShippingChargeAmount === 0.01) {\r\n localList.push(deliveryData.list);\r\n } else if (!isModShippingMethod && !isPennyShippingMethod) {\r\n localList.push(deliveryData.list);\r\n }\r\n }\r\n });\r\n }\r\n // just in case options doesn't load in, fail safely back to the original\r\n // list\r\n if (localList.length === 0) { localList = list; }\r\n return (\r\n <Node {...DeliveryOptionsList}>\r\n {localList.map((deliveryOption: ICheckoutDeliveryOptionEdit) => {\r\n return (<Node {...deliveryOption.DeliveryOption} key={deliveryOption.code}>\r\n <label className='ms-checkout-delivery-options__label'>\r\n {deliveryOption.radioButton}\r\n {deliveryOption.description}\r\n <span className='sr-only'>{deliveryOption.price}</span>\r\n </label>\r\n {deliveryOption.price}\r\n </Node>);\r\n })}\r\n </Node>\r\n );\r\n};\r\n\r\nconst DeliveryOptionSelected: React.FC<ICheckoutDeliveryOption> = ({\r\n DeliveryOption,\r\n description,\r\n price,\r\n}) => {\r\n\r\n return (\r\n <Node {...DeliveryOption}>\r\n {description}\r\n {price}\r\n </Node>\r\n );\r\n};\r\n\r\nconst ErrorMessage: React.FC<ICheckoutDeliveryOptionsError> = ({\r\n Error,\r\n title,\r\n message,\r\n}) => {\r\n\r\n return (\r\n <Node {...Error}>\r\n {title}\r\n {message}\r\n </Node>\r\n );\r\n};\r\n\r\nconst CheckoutDeliveryOptionsView: React.FC<ICheckoutDeliveryOptionsViewProps> = props => {\r\n const { CheckoutDeliveryOptions,\r\n viewState,\r\n deliveryOptions,\r\n deliveryOptionsData,\r\n deliveryOptionSelected,\r\n errorMessage,\r\n waiting,\r\n saveButton,\r\n editButton,\r\n cancelButton } = props;\r\n return (\r\n // TODO: All wrapper div should be provided by viewProps. Once SDK provide the sln, update markup.\r\n <Module {...CheckoutDeliveryOptions}>\r\n {viewState.isLoading && waiting}\r\n {viewState.isError && errorMessage && <ErrorMessage {...errorMessage} />}\r\n {viewState.isShowList && deliveryOptions &&<fieldset><legend className='sr-only'>Delivery Options</legend><DeliveryOptionList {...deliveryOptions} globalConfig={props.context.app.config} options={deliveryOptionsData} /></fieldset>}\r\n {viewState.isShowSelected && deliveryOptionSelected && <DeliveryOptionSelected {...deliveryOptionSelected} />}\r\n {viewState.isShowSaveButton && saveButton}\r\n {viewState.isShowEditButton && editButton}\r\n {viewState.isShowCancelButton && cancelButton}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default CheckoutDeliveryOptionsView;","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps, Title } from '../../../modules/smwe-search-result-container/components';\r\nimport { IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from '../../../modules/smwe-search-result-container/smwe-search-result-container';\r\nimport { ISmweSearchResultContainerProps } from '../../../modules/smwe-search-result-container/smwe-search-result-container.props.autogenerated';\r\n\r\n// tslint:disable-next-line:cyclomatic-complexity\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISmweSearchResultContainerProps<{}>> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, categoryDescription } = props;\r\n // customization for 1.0\r\n const { showRefiners, showSortBy, showResultCount, categoryNamePrefix } = props.config;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {/*TODO remove after final testing */}\r\n {/*categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)*/}\r\n {renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {showRefiners && !props.config.pulldownRefiners && choiceSummary}\r\n {showRefiners && !props.config.pulldownRefiners && modalToggle}\r\n {showRefiners && !props.config.pulldownRefiners && createSearchResultModal(searchResultModal, refineMenu, sortByOptions, showSortBy!)}\r\n {showRefiners && props.config.pulldownRefiners && refineMenu && renderRefinerPulldown(refineMenu)}\r\n {categoryDescription}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {showResultCount && TitleViewProps && <Node {...CategoryNavContainer}>\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {showRefiners && !props.config.pulldownRefiners && refineMenu && renderRefiner(refineMenu)}\r\n {showRefiners && props.config.pulldownRefiners && refineMenu && renderRefinerPulldown(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {showRefiners && choiceSummary}\r\n {showSortBy && sortByOptions && renderSort(sortByOptions, showSortBy)}\r\n {categoryDescription}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown, showSortBy), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, showSortBy), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefinerPulldown = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer, pulldownText, activeRefiners } = props;\r\n const activeRefinersText = getActiveRefinersText(activeRefiners);\r\n const dynamicPulldownText = getPulldownText(activeRefinersText, pulldownText);\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n <button onClick={() => togglePulldown(getActiveRefinersText(activeRefiners), pulldownText)} className='ms-search-result-container__refiner-pulldown-button' id='refiner-pulldown-button'>\r\n <span className='ms-search-result-container__refiner-pulldown-button-content' id='refiner-pulldown-button-content'>{dynamicPulldownText}</span>\r\n </button>\r\n <div className='ms-search-result-container__refiner-pulldown-container pulldown-hide' id='refiner-pulldown-container'>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n <button onClick={() => togglePulldown(getActiveRefinersText(activeRefiners), pulldownText)} className='ms-search-result-container__refiner-close-pulldown-button'>Close</button>\r\n </div>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst getPulldownText = (activeRefiners: string, buttonText: string | undefined): string => {\r\n const buttonElement = document.getElementById('refiner-pulldown-button');\r\n const spanElement = document.getElementById('refiner-pulldown-button-content');\r\n if (buttonElement && spanElement) {\r\n if (buttonElement.className === 'ms-search-result-container__refiner-pulldown-button refiner-pulldown-button-expanded' || !activeRefiners) {\r\n return spanElement.innerText = buttonText || '';\r\n } else {\r\n return spanElement.innerText = activeRefiners;\r\n }\r\n }\r\n return '';\r\n};\r\n\r\nconst togglePulldown = (activeRefiners: string, buttonText: string | undefined): void => {\r\n const buttonElement = document.getElementById('refiner-pulldown-button');\r\n if (buttonElement) {\r\n buttonElement.classList.toggle('refiner-pulldown-button-expanded');\r\n getPulldownText(activeRefiners, buttonText);\r\n }\r\n const pulldownElement = document.getElementById('refiner-pulldown-container');\r\n if (pulldownElement) {\r\n pulldownElement.classList.toggle('pulldown-hide');\r\n }\r\n\r\n};\r\n\r\nconst getActiveRefinersText = (activeRefiners: ProductRefinerValue[]): string => {\r\n let formatedActiveRefiners = '';\r\n activeRefiners.forEach(refiner => {\r\n if (refiner.UnitText === 'USD') {\r\n formatedActiveRefiners += `$${refiner.LeftValueBoundString}-$${refiner.RightValueBoundString} / `;\r\n } else if (refiner.LeftValueBoundString) {\r\n formatedActiveRefiners += `${refiner.LeftValueBoundString} / `;\r\n }\r\n });\r\n // removes trailing slash and whitespace\r\n formatedActiveRefiners = formatedActiveRefiners.substring(0, formatedActiveRefiners.length - 2);\r\n return formatedActiveRefiners;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && showSortBy) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps, showResultPrefix: boolean, categoryNamePrefix: string): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={categoryNamePrefix} />;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h1 className='h2'>\r\n {showResultPrefix && titlePrefix}\r\n {title.titleText}\r\n </h1>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;","import {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxProductQuantityViewProps\r\n} from '@msdyn365-commerce-modules/buybox/dist/types';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ISmweBuyboxViewProps } from '../../../modules/smwe-buybox/smwe-buybox';\r\nimport { ISmweBuyboxProps } from '../definition-extensions/smwe-buybox.ext.props.autogenerated';\r\n\r\nconst SmweBuyboxView: React.FC<ISmweBuyboxViewProps & ISmweBuyboxProps<{}>> = props => {\r\n const { subscriptionButton, ModuleProps, MediaGalleryContainerProps, ProductInfoContainerProps, addToCart, quantity, title, productDescription, productPrice, show, acclaimRatings, cookbookTagline, eventSchedule } = props;\r\n // @ts-ignore\r\n const tableClass: AsyncResult<string> = props.context.actionContext.get('String', 'Generic-SkuSelectorClasses');\r\n return (\r\n <Module {...ModuleProps}>\r\n <div className='ms-buybox__mobile-header'>\r\n {props.productApellation && <>{props.productApellation}</>}\r\n {title}\r\n </div>\r\n <div className='ms-buybox__media-gallery-wrapper'>\r\n <Node {...MediaGalleryContainerProps}>\r\n {props.mediaGallery}\r\n </Node>\r\n {props.tastingNotes}\r\n </div>\r\n <Node {...ProductInfoContainerProps}>\r\n {props.productApellation && <>{props.productApellation}</>}\r\n {title}\r\n {productDescription}\r\n {eventSchedule}\r\n {acclaimRatings}\r\n {cookbookTagline}\r\n {show && <div className={`sku-selector ${tableClass && tableClass.result}`}>\r\n {productPrice && <div className='sku-selector__product-price'>{productPrice}</div>}\r\n {quantity && <div className='sku-selector__product-quantity'>{_renderQuantity(quantity)}</div>}\r\n {addToCart && <div className='sku-selector__add-to-cart'>{_renderAddToCart(addToCart)}</div>}\r\n {subscriptionButton && <div className='sku-selector__add-to-subscription'>{_renderAddToCart(subscriptionButton)}</div>}\r\n </div>}\r\n {props.content &&\r\n props.content.map(\r\n (contentSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <React.Fragment key={index}>\r\n {contentSlotData}\r\n </React.Fragment>\r\n );\r\n }\r\n )\r\n }\r\n </Node>\r\n {props.slots?.productCollection?.length &&\r\n <div className='ms-buybox__product-collection'>\r\n {props.slots.productCollection.map(\r\n (productCollectionSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <React.Fragment key={index}>\r\n {productCollectionSlotData}\r\n </React.Fragment>\r\n );\r\n }\r\n )\r\n }\r\n </div>\r\n }\r\n </Module>\r\n );\r\n};\r\n\r\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {errorBlock}\r\n {button}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, input, errors } = quantity;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {errors}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\nexport default SmweBuyboxView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { DeliveryOption as DeliveryOptionData } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICheckoutDeliveryOption, ICheckoutDeliveryOptionEdit, ICheckoutDeliveryOptionsError, ICheckoutDeliveryOptionsList, ICheckoutDeliveryOptionsViewProps } from '../../../modules/smwe-checkout-delivery-options/./smwe-checkout-delivery-options';\r\nimport { orderSummaryShipmentCalculation } from '../../../Utilities/smwe-order-summary-shipment-calculation';\r\ninterface ICheckoutDeliveryOptionsListFiltered extends ICheckoutDeliveryOptionsList {\r\n globalConfig?: {\r\n [x: string]: unknown;\r\n };\r\n options?: DeliveryOptionData[];\r\n props: React.PropsWithChildren<ICheckoutDeliveryOptionsViewProps>;\r\n\r\n}\r\n\r\ntype ModShipping = {\r\n id: number;\r\n amount: number;\r\n}[];\r\n\r\nconst DeliveryOptionList: React.FC<ICheckoutDeliveryOptionsListFiltered> = ({\r\n DeliveryOptionsList,\r\n list,\r\n globalConfig,\r\n options,\r\n props\r\n}) => {\r\n const cart = props.checkoutState?.checkoutCart.cart;\r\n if (!list || list.length === 0 || !cart) {\r\n return null;\r\n }\r\n\r\n let cartRequirements = orderSummaryShipmentCalculation({ cart }).summary;\r\n const shippingState = props.checkoutState?.shippingAddress?.State;\r\n if (shippingState === 'AK' || shippingState === 'HI') {\r\n cartRequirements = `${cartRequirements}_AKHI`;\r\n }\r\n\r\n const shippingMethodTiers = globalConfig && globalConfig.shipmentMethodTiers as {} || {};\r\n const allowedShippingMethodIds = shippingMethodTiers[cartRequirements] as string[] || [];\r\n const pennyShippingMethodIds = globalConfig?.pennyShippingIds as number[] || [];\r\n const modShippingMethodIds = globalConfig?.modShippingIds as ModShipping || [];\r\n const localList: ICheckoutDeliveryOptionEdit[] = [];\r\n if (options) {\r\n // maps options with list for sorting\r\n const combinedList: { option: DeliveryOptionData; list: ICheckoutDeliveryOptionEdit }[] = [];\r\n options.map((option, index) => combinedList.push({ option: option, list: list[index] }));\r\n // sort list by lowest to highest price\r\n const combinedListSorted = combinedList.sort((a, b) => (a.option.ShippingChargeAmount! > b.option.ShippingChargeAmount!) ? 1 : ((b.option.ShippingChargeAmount! > a.option.ShippingChargeAmount!) ? -1 : 0));\r\n combinedListSorted.forEach((deliveryData) => {\r\n if (deliveryData.list) {\r\n // search to find out if it is a mod shipping method\r\n const allowedShippingMethod = allowedShippingMethodIds.find(shippingMethodId => Number(shippingMethodId) === deliveryData.option.RecordId);\r\n const isModShippingMethod = modShippingMethodIds.find(modShipping => Number(modShipping.id) === deliveryData.option.RecordId);\r\n // backwards compatibility for penny shipping\r\n const isPennyShippingMethod = pennyShippingMethodIds.find(pennyShipping => Number(pennyShipping) === deliveryData.option.RecordId);\r\n\r\n // Filter out penny shipping methods that are declared\r\n // in the global config, only show shipping methods\r\n // that have a price of 0.01 for the customer at this current time\r\n // of checkout. If it's not a penny shipping method, always display\r\n // it.\r\n if (isModShippingMethod && deliveryData.option.ShippingChargeAmount === isModShippingMethod.amount) {\r\n localList.push(deliveryData.list);\r\n } else if (isPennyShippingMethod && deliveryData.option.ShippingChargeAmount === 0.01) {\r\n localList.push(deliveryData.list);\r\n } else if (!isModShippingMethod && !isPennyShippingMethod && allowedShippingMethod) {\r\n localList.push(deliveryData.list);\r\n }\r\n }\r\n });\r\n }\r\n // in case options doesn't load in or undefined, display error message\r\n if (localList.length === 0) {\r\n return (\r\n <div className='ms-checkout-delivery-options__error'>\r\n {props.resources.shippingMethodConfigError}\r\n </div>\r\n );\r\n }\r\n\r\n const currentMethodAllowed = localList.find((item) => {\r\n return props.selectedItemId === item.code;\r\n });\r\n if (!currentMethodAllowed) {\r\n const event = { currentTarget: { value: localList[0].code } } as React.ChangeEvent<HTMLInputElement>;\r\n props.onDeliveryOptionChange(event);\r\n }\r\n\r\n return (\r\n <Node {...DeliveryOptionsList}>\r\n {localList.map((deliveryOption: ICheckoutDeliveryOptionEdit) => {\r\n return (<Node {...deliveryOption.DeliveryOption} key={deliveryOption.code}>\r\n <label className='ms-checkout-delivery-options__label'>\r\n {deliveryOption.radioButton}\r\n {deliveryOption.description}\r\n </label>\r\n {deliveryOption.price}\r\n </Node>);\r\n })}\r\n </Node>\r\n );\r\n};\r\n\r\nconst DeliveryOptionSelected: React.FC<ICheckoutDeliveryOption> = ({\r\n DeliveryOption,\r\n description,\r\n price,\r\n}) => {\r\n\r\n return (\r\n <Node {...DeliveryOption}>\r\n {description}\r\n {price}\r\n </Node>\r\n );\r\n};\r\n\r\nconst ErrorMessage: React.FC<ICheckoutDeliveryOptionsError> = ({\r\n Error,\r\n title,\r\n message,\r\n}) => {\r\n\r\n return (\r\n <Node {...Error}>\r\n {title}\r\n {message}\r\n </Node>\r\n );\r\n};\r\n\r\nconst CheckoutDeliveryOptionsView: React.FC<ICheckoutDeliveryOptionsViewProps> = props => {\r\n const { CheckoutDeliveryOptions,\r\n viewState,\r\n deliveryOptions,\r\n deliveryOptionsData,\r\n deliveryOptionSelected,\r\n errorMessage,\r\n waiting,\r\n saveButton,\r\n editButton,\r\n cancelButton } = props;\r\n return (\r\n // TODO: All wrapper div should be provided by viewProps. Once SDK provide the sln, update markup.\r\n <Module {...CheckoutDeliveryOptions}>\r\n {viewState.isLoading && waiting}\r\n {viewState.isError && errorMessage && <ErrorMessage {...errorMessage} />}\r\n {viewState.isShowList && deliveryOptions && <DeliveryOptionList {...deliveryOptions} globalConfig={props.context.app.config} options={deliveryOptionsData} props={props} />}\r\n {viewState.isShowSelected && deliveryOptionSelected && <DeliveryOptionSelected {...deliveryOptionSelected} />}\r\n {viewState.isShowSaveButton && saveButton}\r\n {viewState.isShowEditButton && editButton}\r\n {viewState.isShowCancelButton && cancelButton}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default CheckoutDeliveryOptionsView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\r\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore, ISmweCheckoutData } from '../../../modules/smwe-checkout';\r\nimport { brandCodeParser } from '../../../Utilities/brand-code-parser';\r\nimport { ISmweCheckoutProps } from '../definition-extensions/smwe-checkout.ext.props.autogenerated';\r\n\r\nexport const PickUpAtStoreComponent: React.FC<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\r\n <Node {...PickUpAtStore}>\r\n {label}\r\n {location}\r\n </Node>\r\n);\r\n\r\nexport const LineItemComponent: React.FC<{ line: ILineItem; cartItem?: CartLine; context: ICoreContext }> = ({ line: { LineItem, item, pickUpAtStore }, cartItem, context }) => {\r\n let brandCode: string = '';\r\n if (cartItem) {\r\n brandCode = brandCodeParser({ description: cartItem.Description, appContext: context });\r\n }\r\n return (\r\n <Node {...LineItem}>\r\n {brandCode && <div className='msc-cart-line__brand'>{brandCode}</div>}\r\n {item}\r\n {pickUpAtStore && <PickUpAtStoreComponent {...pickUpAtStore} />}\r\n </Node>\r\n );\r\n};\r\n\r\nexport const LineItemGroupComponent: React.FC<{ group: ILineItemDeliveryGroup; props: ISmweCheckoutProps<{}>; data: ISmweCheckoutData; context: ICoreContext }> = (\r\n { group: { LineItemDeliveryGroup, LineItemList, heading, lineItems }, props, data, context }\r\n) => {\r\n const { nonSubscriptionHeader } = props.resources;\r\n return (\r\n <Node {...LineItemDeliveryGroup}>\r\n {heading}\r\n {lineItems.length > 0 &&\r\n <Node {...LineItemList}>\r\n <div className='ms-checkout__line-items-list-title'>{nonSubscriptionHeader}</div>\r\n {lineItems.map(lineItem => {\r\n // get the item and send it to the component\r\n const item = data.checkout.result?.checkoutCart.cart.CartLines?.find(cartItem => cartItem.LineId === lineItem.LineId);\r\n return (\r\n <LineItemComponent key={lineItem.LineId} line={lineItem} cartItem={item} context={context} />\r\n );\r\n })}\r\n </Node>\r\n }\r\n </Node>\r\n );\r\n};\r\n\r\nexport const LineItemsComponent: React.FC<{ lineItems: ILineItems; props: ISmweCheckoutProps<{}>; data: ISmweCheckoutData; context: ICoreContext }> = (\r\n { lineItems: { LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForSubscription, subscriptionHeader },\r\n props,\r\n data,\r\n context }\r\n) => (\r\n <Node {...LineItems}>\r\n <Node {...Header}>\r\n {heading}\r\n {editLink}\r\n </Node>\r\n {itemsForPickup && <LineItemGroupComponent group={itemsForPickup} props={props} data={data} context={context} />}\r\n {itemsForShip && <LineItemGroupComponent group={itemsForShip} props={props} data={data} context={context} />}\r\n {itemsForSubscription && itemsForSubscription.length > 0 &&\r\n <Node className='ms-checkout__line-items-list'>\r\n <div className='ms-checkout__line-items-list-title'>{subscriptionHeader}</div>\r\n {itemsForSubscription.map((lineItem: ILineItem) => {\r\n // get the item and send it to the component\r\n const item = data.checkout.result?.checkoutCart.cart.CartLines?.find(cartItem => cartItem.LineId === lineItem.LineId);\r\n return (\r\n <LineItemComponent key={lineItem.LineId} line={lineItem} cartItem={item} context={context} />\r\n );\r\n })}\r\n </Node>\r\n }\r\n </Node>\r\n);\r\n\r\nconst OrderSummaryComponent: React.FC<IOrderSummary> = ({ heading, lines }) => (\r\n <div className='msc-order-summary-wrapper'>\r\n {heading}\r\n <div className='msc-order-summary__items'>\r\n {lines && (\r\n <>\r\n {lines.subtotal}\r\n {lines.shipping}\r\n {lines.tax}\r\n {lines.totalDiscounts}\r\n {lines.loyalty}\r\n {lines.giftCard}\r\n {lines.orderTotal}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n);\r\n\r\nconst CheckoutView: React.FC<ICheckoutViewProps & ISmweCheckoutProps<{}>> = props => {\r\n const {\r\n canShow,\r\n checkoutProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n loading,\r\n alert,\r\n guidedForm,\r\n orderSummary,\r\n lineItems,\r\n placeOrderButton,\r\n data,\r\n context\r\n } = props;\r\n return (\r\n <Module {...checkoutProps}>\r\n {loading}\r\n {alert}\r\n {canShow && (\r\n <>\r\n <Node {...mainProps}>\r\n {guidedForm}\r\n <Node {...mainControlProps}>\r\n {placeOrderButton}\r\n </Node>\r\n </Node>\r\n <Node {...sideProps}>\r\n {orderSummary && <OrderSummaryComponent {...orderSummary} />}\r\n {lineItems && <LineItemsComponent lineItems={lineItems} props={props} data={data} context={context} />}\r\n </Node>\r\n </>\r\n )}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default CheckoutView;\r\n","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps, Title } from '../../../modules/smwe-search-result-container/components';\r\nimport { IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from '../../../modules/smwe-search-result-container/smwe-search-result-container';\r\n\r\nconst renderSort = (props: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && showSortBy) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, showSortBy), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown, showSortBy), modalProps.modalFooter);\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps, showResultPrefix: boolean, categoryNamePrefix: string): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={categoryNamePrefix} />;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {showResultPrefix && titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst SmweSearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage,\r\n categoryDescription } = props;\r\n // customization for 1.0\r\n const { showRefiners, showSortBy, showResultCount, categoryNamePrefix } = props.config;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-container__title-header'>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {categoryDescription}\r\n </div>\r\n <div className='ms-search-result-container__filter-sort'>\r\n {showRefiners && choiceSummary}\r\n {showRefiners && modalToggle}\r\n {showRefiners && createSearchResultModal(searchResultModal, refineMenu, sortByOptions, showSortBy!)}\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {showResultCount && TitleViewProps && <Node {...CategoryNavContainer}>\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {showRefiners && refineMenu && renderRefiner(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-container__title-header'>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {categoryDescription}\r\n </div>\r\n <div className='ms-search-result-container__filter-sort'>\r\n {showRefiners && choiceSummary}\r\n {showSortBy && sortByOptions && renderSort(sortByOptions, showSortBy)}\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nexport default SmweSearchResultContainerView;\r\n","import {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxProductQuantityViewProps\r\n} from '@msdyn365-commerce-modules/buybox/dist/types';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport Table from 'reactstrap/lib/Table';\r\nimport { ISmweBuyboxViewProps } from '../../../modules/smwe-buybox/smwe-buybox';\r\n\r\nconst SmweBuyboxView: React.FC<ISmweBuyboxViewProps> = props => {\r\n const {\r\n ModuleProps,\r\n MediaGalleryContainerProps,\r\n ProductInfoContainerProps,\r\n addToCart,\r\n quantity,\r\n title,\r\n productDescription,\r\n productTitle,\r\n productPrice,\r\n productClubPrice,\r\n show,\r\n acclaimRatings,\r\n cookbookTagline,\r\n eventSchedule,\r\n subscriptionButton\r\n } = props;\r\n // @ts-ignore\r\n const tableClass: AsyncResult<string> = props.context.actionContext.get('String', 'Generic-SkuSelectorClasses');\r\n return (\r\n <Module {...ModuleProps}>\r\n <Node {...MediaGalleryContainerProps}>{props.mediaGallery}</Node>\r\n <Node {...ProductInfoContainerProps}>\r\n {props.productApellation && (\r\n <div>{props.productApellation}</div>\r\n )}\r\n {title}\r\n {productDescription}\r\n {eventSchedule}\r\n {acclaimRatings}\r\n {cookbookTagline}\r\n {show && <div className={`sku-selector-container row ${tableClass && tableClass.result}`}>\r\n <Table borderless responsive size='lg'>\r\n <thead>\r\n <tr>\r\n {productTitle && <th scope='col' className='sku-selector-product-title'>Product</th>}\r\n {productPrice && <th scope='col' className='sku-selector-product-price'>Retail</th>}\r\n {productClubPrice && <th scope='col' className='sku-selector-product-price'>Your Price</th>}\r\n {quantity && <th scope='col' className='sku-selector-product-quantity'>QTY</th>}\r\n {addToCart && <th scope='col' className='sku-selector-add-to-cart' />}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n {productTitle && <td className='sku-selector-product-title'>{productTitle}</td>}\r\n {productPrice && <td className='sku-selector-product-price'>{productPrice}</td>}\r\n {productClubPrice && <td className='sku-selector-product-price'>{productClubPrice}</td>}\r\n {quantity && <td className='sku-selector-product-quantity'>{_renderQuantity(quantity)}</td>}\r\n {addToCart && <td className='sku-selector-add-to-cart'>{_renderAddToCart(addToCart)}</td>}\r\n {subscriptionButton && <td className='sku-selector-add-to-cart'>{_renderAddToCart(subscriptionButton)}</td>}\r\n </tr>\r\n </tbody>\r\n </Table>\r\n </div>}\r\n {props.content &&\r\n props.content.map(\r\n (contentSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <React.Fragment key={index}>\r\n {contentSlotData}\r\n </React.Fragment>\r\n );\r\n }\r\n )}\r\n\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {errorBlock}\r\n {button}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, input, errors } = quantity;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {errors}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\nexport default SmweBuyboxView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IDictionary } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ICartlinesViewProps } from '../../../modules/smwe-cart/components/smwe-cart-line-items';\r\nimport { ICartViewProps } from '../../../modules/smwe-cart/smwe-cart';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean,\r\n itemsTitle: string,\r\n qtyTitle: string,\r\n unitPriceTitle: string,\r\n totalTitle: string\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus}</>;\r\n }\r\n if (cartLines) {\r\n return (\r\n <div>\r\n <div className='cart-lineitems-header'>\r\n <div className='header-items'>{itemsTitle}</div>\r\n <div className='header-qty'>{qtyTitle}</div>\r\n <div className='header-unitprice'>{unitPriceTitle}</div>\r\n <div className='header-total'>{totalTitle}</div>\r\n </div>\r\n\r\n <ul className='cart-lineitems-container'>\r\n {cartLines.map((cartLine, index) => {\r\n return (\r\n <li className='msc-cart-lines-item' key={index}>\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n <Node {...cartLine.pickUpInStore.ContainerProps}>\r\n {cartLine.pickUpInStore.defaultComponent}\r\n </Node>\r\n ) : null}\r\n {cartLine.addToWishlist}\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n );\r\n } else {\r\n return cartDataResult ? (\r\n <div className='msc-cart__empty-cart'>\r\n <p className='msc-cart-line'>{cartEmptyText}</p>\r\n {backToShoppingButton}\r\n </div>\r\n ) : (\r\n <>{waitingComponent}</>\r\n );\r\n }\r\n};\r\n\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n return (\r\n <Node {...OrderSummaryItems}>\r\n {orderSummaryLines.subtotal}\r\n {orderSummaryLines.shipping}\r\n {orderSummaryLines.tax}\r\n {orderSummaryLines.totalDiscounts\r\n ? orderSummaryLines.totalDiscounts\r\n : null}\r\n {orderSummaryLines.orderTotal}\r\n <p className='cart-order-summary-asterix'>{props.resources.conditionsText}</p>\r\n </Node>\r\n );\r\n};\r\n\r\n// Detect invalid items in the cart. Items are flagged externally via the Comment field\r\nconst _isInvalidCart = (cartLinesInvalid: IDictionary<boolean>): boolean => {\r\n\r\n for (const lineId of Object.keys(cartLinesInvalid)) {\r\n if (cartLinesInvalid[lineId]) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n//==================================================\r\n//==================================================\r\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => {\r\n const preventCheckout = _isInvalidCart(props.cartLineStatus);\r\n\r\n return (\r\n <div\r\n className={props.className}\r\n id={props.id}\r\n {...props.renderModuleAttributes(props)}\r\n >\r\n {props.title}\r\n <Node {...props.CartlinesWrapper}>\r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult,\r\n props.resources.itemsTitle,\r\n props.resources.qtyTitle,\r\n props.resources.unitPriceTitle,\r\n props.resources.totalTitle\r\n )}\r\n </Node>\r\n {props.orderSummaryHeading && (\r\n <Node {...props.OrderSummaryWrapper}>\r\n {props.orderSummaryHeading}\r\n {_renderOrderSummarylines(\r\n props.orderSummaryLineitems,\r\n props.OrderSummaryItems,\r\n props\r\n )}\r\n <Node className='checkout-btn-wrap'>\r\n {props.backToShoppingButton}\r\n {preventCheckout ? props.checkoutButtonDisabled : props.checkoutAsSignInUserButton}\r\n </Node>\r\n <div className='msc-promo-code'>\r\n {props.promoCode}\r\n </div>\r\n </Node>\r\n )}\r\n {props.storeSelector}\r\n </div>\r\n);};\r\n\r\nexport default CartView;","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps, Title } from '../../../modules/smwe-search-result-container/components';\r\nimport { IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from '../../../modules/smwe-search-result-container/smwe-search-result-container';\r\n\r\nimport { ISmweSearchResultContainerProps } from '../definition-extensions/smwe-search-result-container.ext.props.autogenerated';\r\n\r\nconst renderSort = (props: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && showSortBy) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, showSortBy), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown, showSortBy), modalProps.modalFooter);\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps, showResultPrefix: boolean, categoryNamePrefix: string): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={categoryNamePrefix} />;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {showResultPrefix && titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst SmweSearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISmweSearchResultContainerProps<{}>> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage,\r\n categoryDescription } = props;\r\n // customization for 1.0\r\n const { showRefiners, showSortBy, showResultCount, categoryNamePrefix } = props.config;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-container__title-header'>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {categoryDescription}\r\n </div>\r\n <div className='ms-search-result-container__filter-sort'>\r\n {showRefiners && choiceSummary}\r\n {showRefiners && modalToggle}\r\n {showRefiners && createSearchResultModal(searchResultModal, refineMenu, sortByOptions, showSortBy!)}\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {showResultCount && TitleViewProps && <Node {...CategoryNavContainer}>\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {showRefiners && refineMenu && renderRefiner(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-container__title-header'>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {categoryDescription}\r\n </div>\r\n <div className='ms-search-result-container__filter-sort'>\r\n {showRefiners && choiceSummary}\r\n {showSortBy && sortByOptions && renderSort(sortByOptions, showSortBy)}\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n\r\n};\r\n\r\nexport default SmweSearchResultContainerView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxProductQuantityViewProps\r\n} from '@msdyn365-commerce-modules/buybox/dist/types';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ISmweBuyboxViewProps } from '../../../modules/smwe-buybox/./smwe-buybox';\r\n\r\nconst SmweBuyboxView: React.FC<ISmweBuyboxViewProps> = props => {\r\n const {\r\n ModuleProps,\r\n MediaGalleryContainerProps,\r\n ProductInfoContainerProps,\r\n addToCart,\r\n quantity,\r\n title,\r\n productDescription,\r\n productTitle,\r\n productPrice,\r\n productClubPrice,\r\n show,\r\n acclaimRatings,\r\n cookbookTagline,\r\n eventSchedule\r\n } = props;\r\n // @ts-ignore\r\n const tableClass: AsyncResult<string> = props.context.actionContext.get('String', 'Generic-SkuSelectorClasses');\r\n const isGiftCard = props.data.product && props.data.product.result ? props.data.product.result.ItemId?.toLowerCase() === 'giftcard' : false;\r\n\r\n return (\r\n <Module {...ModuleProps}>\r\n <Node {...MediaGalleryContainerProps}>{props.mediaGallery}</Node>\r\n <Node {...ProductInfoContainerProps}>\r\n {props.productApellation && (\r\n <div>{props.productApellation}</div>\r\n )}\r\n {title}\r\n {productTitle}\r\n {productDescription}\r\n {eventSchedule}\r\n {acclaimRatings}\r\n {cookbookTagline}\r\n {show && _renderTable({\r\n addToCart: addToCart,\r\n quantity: quantity,\r\n productPrice: productPrice,\r\n productClubPrice: productClubPrice,\r\n tableClass: tableClass,\r\n isGiftCard: isGiftCard\r\n })}\r\n {props.content &&\r\n props.content.map(\r\n (contentSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <React.Fragment key={index}>\r\n {contentSlotData}\r\n </React.Fragment>\r\n );\r\n }\r\n )}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nexport interface IRenderTable {\r\n addToCart: IBuyboxAddToCartViewProps;\r\n quantity: IBuyboxProductQuantityViewProps | undefined;\r\n productPrice: React.ReactNode;\r\n productClubPrice: React.ReactNode;\r\n isGiftCard: boolean;\r\n tableClass: AsyncResult<string>;\r\n}\r\n\r\nconst _renderTable = (props: IRenderTable) => {\r\n const { addToCart, quantity, productPrice, productClubPrice, tableClass, isGiftCard } = props;\r\n\r\n return (\r\n <div className={classnames('sku-selector', tableClass?.result)}>\r\n <div className='sku-selector__price'>\r\n {productPrice && (<><span className='sr-only'>Regular Price {productPrice}</span><div aria-hidden='true' className={classnames('sku-selector__price-default', { 'price-width-adjust': isGiftCard })}>{productPrice}</div></>)}\r\n {!isGiftCard && productClubPrice && (<><span className='sr-only'>Club Price {productClubPrice}</span><div aria-hidden='true' className='sku-selector__price-club'>{productClubPrice} Club</div></>)}\r\n </div>\r\n <div className='sku-selector__cart'>\r\n {quantity && <div className={classnames('sku-selector__cart-quantity', { unselectable: isGiftCard })}>{_renderQuantity(quantity)}</div>}\r\n {addToCart && <div className='sku-selector__cart-button'>{_renderAddToCart(addToCart)}</div>}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {errorBlock}\r\n {button}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, input, errors } = quantity;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {errors}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\nexport default SmweBuyboxView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore } from '../../../modules/smwe-checkout';\r\n\r\nexport const PickUpAtStoreComponent: React.FC<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\r\n <Node {...PickUpAtStore}>\r\n {label}\r\n {location}\r\n </Node>\r\n);\r\n\r\nexport const LineItemComponent: React.FC<ILineItem> = ({ LineItem, item, pickUpAtStore }) => (\r\n <Node {...LineItem}>\r\n {item}\r\n {pickUpAtStore && <PickUpAtStoreComponent {...pickUpAtStore} />}\r\n </Node>\r\n);\r\n\r\nexport const LineItemGroupComponent: React.FC<ILineItemDeliveryGroup> = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\r\n <Node {...LineItemDeliveryGroup}>\r\n {heading}\r\n <Node {...LineItemList}>\r\n {lineItems.map(lineItem => (\r\n <LineItemComponent key={lineItem.LineId} {...lineItem} />\r\n ))}\r\n </Node>\r\n </Node>\r\n);\r\n\r\nexport const LineItemsComponent: React.FC<ILineItems> = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForSubscription, subscriptionHeader }) => (\r\n <Node {...LineItems}>\r\n <Node {...Header}>\r\n {heading}\r\n {editLink}\r\n </Node>\r\n {itemsForPickup && <LineItemGroupComponent {...itemsForPickup} />}\r\n {itemsForShip && <LineItemGroupComponent {...itemsForShip} />}\r\n {itemsForSubscription && itemsForSubscription.length > 0 &&\r\n <Node className='ms-checkout__line-items-list__subscriptions'>\r\n <div className='ms-checkout__line-items-list__subscriptions-title'>{subscriptionHeader}</div>\r\n {itemsForSubscription.map(lineItem => (\r\n <LineItemComponent key={lineItem.LineId} {...lineItem} />\r\n ))}\r\n </Node>\r\n }\r\n </Node>\r\n);\r\n\r\nconst OrderSummaryComponent: React.FC<IOrderSummary> = ({ heading, lines }) => (\r\n <div className='msc-order-summary-wrapper'>\r\n {heading}\r\n <div className='msc-order-summary__items'>\r\n {lines && (\r\n <>\r\n {lines.subtotal}\r\n {lines.shipping}\r\n {lines.tax}\r\n {lines.totalDiscounts}\r\n {lines.loyalty}\r\n {lines.giftCard}\r\n {lines.orderTotal}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n);\r\n\r\nconst CheckoutView: React.FC<ICheckoutViewProps> = props => {\r\n const {\r\n canShow,\r\n checkoutProps,\r\n headerProps,\r\n hasSalesOrder,\r\n bodyProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n sideControlFirstProps,\r\n sideControlSecondProps,\r\n orderConfirmation,\r\n loading,\r\n alert,\r\n title,\r\n guidedForm,\r\n orderSummary,\r\n lineItems,\r\n placeOrderButton,\r\n keepShoppingButton\r\n } = props;\r\n\r\n return (\r\n <Module {...checkoutProps}>\r\n {!hasSalesOrder && <Node {...headerProps}>{title}</Node>}\r\n {!hasSalesOrder &&\r\n <Node {...bodyProps}>\r\n {loading}\r\n {alert}\r\n {canShow && (\r\n <>\r\n <Node {...sideProps}>\r\n {orderSummary && <OrderSummaryComponent {...orderSummary} />}\r\n <Node {...sideControlFirstProps}>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n {lineItems && <LineItemsComponent {...lineItems} />}\r\n <Node {...sideControlSecondProps}>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n </Node>\r\n <Node {...mainProps}>\r\n {guidedForm}\r\n <Node {...mainControlProps}>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n </Node>\r\n </>\r\n )}\r\n </Node>\r\n }\r\n {hasSalesOrder && orderConfirmation}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default CheckoutView;\r\n","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps, Title } from '../../../modules/smwe-search-result-container/components';\r\nimport { IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from '../../../modules/smwe-search-result-container/smwe-search-result-container';\r\nimport { ISmweSearchResultContainerProps } from '../../../modules/smwe-search-result-container/smwe-search-result-container.props.autogenerated';\r\n\r\n// tslint:disable-next-line:cyclomatic-complexity\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISmweSearchResultContainerProps<{}>> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, categoryDescription } = props;\r\n // customization for 1.0\r\n const { showRefiners, showSortBy, showResultCount, categoryNamePrefix } = props.config;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {/*TODO remove after final testing */}\r\n {/*categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)*/}\r\n {renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {showRefiners && !props.config.pulldownRefiners && choiceSummary}\r\n {showRefiners && !props.config.pulldownRefiners && modalToggle}\r\n {showRefiners && !props.config.pulldownRefiners && createSearchResultModal(searchResultModal, refineMenu, sortByOptions, showSortBy!)}\r\n {showRefiners && props.config.pulldownRefiners && refineMenu && renderRefinerPulldown(refineMenu)}\r\n {categoryDescription}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {showResultCount && TitleViewProps && <Node {...CategoryNavContainer}>\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {showRefiners && !props.config.pulldownRefiners && refineMenu && renderRefiner(refineMenu)}\r\n {showRefiners && props.config.pulldownRefiners && refineMenu && renderRefinerPulldown(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {showRefiners && choiceSummary}\r\n {showSortBy && sortByOptions && renderSort(sortByOptions, showSortBy)}\r\n {categoryDescription}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown, showSortBy), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, showSortBy), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefinerPulldown = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer, pulldownText, activeRefiners } = props;\r\n const activeRefinersText = getActiveRefinersText(activeRefiners);\r\n const dynamicPulldownText = getPulldownText(activeRefinersText, pulldownText);\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n <button onClick={() => togglePulldown(getActiveRefinersText(activeRefiners), pulldownText)} aria-expanded='false' className='ms-search-result-container__refiner-pulldown-button' id='refiner-pulldown-button'>\r\n <span className='ms-search-result-container__refiner-pulldown-button-content' id='refiner-pulldown-button-content'>{dynamicPulldownText}</span>\r\n </button>\r\n <div className='ms-search-result-container__refiner-pulldown-container pulldown-hide' id='refiner-pulldown-container'>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n <button onClick={() => togglePulldown(getActiveRefinersText(activeRefiners), pulldownText)} className='ms-search-result-container__refiner-close-pulldown-button'>Close</button>\r\n </div>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst getPulldownText = (activeRefiners: string, buttonText: string | undefined): string => {\r\n const buttonElement = document.getElementById('refiner-pulldown-button');\r\n const spanElement = document.getElementById('refiner-pulldown-button-content');\r\n if (buttonElement && spanElement) {\r\n if (buttonElement.className === 'ms-search-result-container__refiner-pulldown-button refiner-pulldown-button-expanded' || !activeRefiners) {\r\n return spanElement.innerText = buttonText || '';\r\n } else {\r\n return spanElement.innerText = activeRefiners;\r\n }\r\n }\r\n return '';\r\n};\r\n\r\nconst togglePulldown = (activeRefiners: string, buttonText: string | undefined): void => {\r\n const buttonElement = document.getElementById('refiner-pulldown-button');\r\n var expanded = buttonElement?.getAttribute('aria-expanded');\r\n if (buttonElement) {\r\n buttonElement.classList.toggle('refiner-pulldown-button-expanded');\r\n getPulldownText(activeRefiners, buttonText);\r\n }\r\n const pulldownElement = document.getElementById('refiner-pulldown-container');\r\n if (pulldownElement) {\r\n pulldownElement.classList.toggle('pulldown-hide');\r\n }\r\n if (expanded === 'false') {\r\n buttonElement?.setAttribute('aria-expanded', 'true');\r\n }\r\n else if (buttonElement?.classList.contains('refiner-pulldown-button-expanded')) {\r\n buttonElement?.setAttribute('aria-expanded', 'true');\r\n }\r\n else {\r\n buttonElement?.setAttribute('aria-expanded', 'false');\r\n }\r\n if (pulldownElement?.classList.contains('pulldown-hide') && buttonElement) {\r\n buttonElement?.setAttribute('aria-expanded', 'false');\r\n }\r\n\r\n};\r\n\r\nconst getActiveRefinersText = (activeRefiners: ProductRefinerValue[]): string => {\r\n let formatedActiveRefiners = '';\r\n activeRefiners.forEach(refiner => {\r\n if (refiner.UnitText === 'USD') {\r\n formatedActiveRefiners += `$${refiner.LeftValueBoundString}-$${refiner.RightValueBoundString} / `;\r\n } else if (refiner.LeftValueBoundString) {\r\n formatedActiveRefiners += `${refiner.LeftValueBoundString} / `;\r\n }\r\n });\r\n // removes trailing slash and whitespace\r\n formatedActiveRefiners = formatedActiveRefiners.substring(0, formatedActiveRefiners.length - 2);\r\n return formatedActiveRefiners;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && showSortBy) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps, showResultPrefix: boolean, categoryNamePrefix: string): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={categoryNamePrefix} />;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {showResultPrefix && titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxProductQuantityViewProps\r\n} from '@msdyn365-commerce-modules/buybox/dist/types';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport Table from 'reactstrap/lib/Table';\r\nimport { ISmweBuyboxViewProps } from '../../../modules/smwe-buybox';\r\n\r\nconst SmweBuyboxView: React.FC<ISmweBuyboxViewProps> = props => {\r\n const {\r\n ModuleProps,\r\n MediaGalleryContainerProps,\r\n ProductInfoContainerProps,\r\n addToCart,\r\n quantity,\r\n title,\r\n productDescription,\r\n productTitle,\r\n productPrice,\r\n productClubPrice,\r\n show,\r\n acclaimRatings,\r\n cookbookTagline,\r\n eventSchedule,\r\n subscriptionButton\r\n } = props;\r\n // @ts-ignore\r\n const tableClass: AsyncResult<string> = props.context.actionContext.get('String', 'Generic-SkuSelectorClasses');\r\n const isGiftCard = props.data.product && props.data.product.result ? props.data.product.result.ItemId?.toLowerCase() === 'giftcard' : false;\r\n\r\n return (\r\n <Module {...ModuleProps}>\r\n <Node {...MediaGalleryContainerProps}>{props.mediaGallery}</Node>\r\n <Node {...ProductInfoContainerProps}>\r\n {props.productApellation && (\r\n <div>{props.productApellation}</div>\r\n )}\r\n {title}\r\n {productDescription}\r\n {eventSchedule}\r\n {acclaimRatings}\r\n {cookbookTagline}\r\n {show && _renderTable({\r\n addToCart: addToCart,\r\n quantity: quantity,\r\n productPrice: productPrice,\r\n productClubPrice: productClubPrice,\r\n tableClass: tableClass,\r\n isGiftCard: isGiftCard,\r\n productTitle,\r\n subscriptionButton\r\n })}\r\n {props.content &&\r\n props.content.map(\r\n (contentSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {contentSlotData}\r\n </div>\r\n );\r\n }\r\n )}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nexport interface IRenderTable {\r\n subscriptionButton?: IBuyboxAddToCartViewProps;\r\n addToCart: IBuyboxAddToCartViewProps;\r\n quantity: IBuyboxProductQuantityViewProps | undefined;\r\n productTitle: React.ReactNode;\r\n productPrice: React.ReactNode;\r\n productClubPrice: React.ReactNode;\r\n isGiftCard: boolean;\r\n tableClass: AsyncResult<string>;\r\n}\r\n\r\nconst _renderTable = (props: IRenderTable) => {\r\n const { addToCart, quantity, productTitle, productPrice, productClubPrice, tableClass, isGiftCard, subscriptionButton } = props;\r\n\r\n return (\r\n <div className={`sku-selector-container row ${tableClass && tableClass.result}`}>\r\n <Table borderless responsive size='lg' role='presentation'>\r\n <thead>\r\n <tr>\r\n {productTitle && <th scope='col' className='sku-selector-product-title'>Product</th>}\r\n {productPrice && !isGiftCard && <th scope='col' className={`sku-selector-product-price ${isGiftCard ? 'price-width-adjust' : ''}`}>Price</th>}\r\n {productPrice && isGiftCard && <th scope='col' className={`sku-selector-product-price ${isGiftCard ? 'price-width-adjust' : ''}`}><label htmlFor=\"Price\">Price</label></th>}\r\n {!isGiftCard && productClubPrice && <th scope='col' className='sku-selector-product-price'>Club</th>}\r\n {quantity && <th scope='col' className='sku-selector-product-quantity'>{_renderQuantityHeader(quantity)}</th>}\r\n {addToCart && <th scope='col' className='sku-selector-add-to-cart' />}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n {productTitle && <td className='sku-selector-product-title'>{productTitle}</td>}\r\n {productPrice && <td className={`sku-selector-product-price ${isGiftCard ? 'price-width-adjust' : ''}`}>{productPrice}</td>}\r\n {!isGiftCard && productClubPrice && <td className='sku-selector-product-price'>{productClubPrice}</td>}\r\n {quantity && <td className={`sku-selector-product-quantity ${isGiftCard ? 'unselectable' : ''}`}>{_renderQuantity(quantity)}</td>}\r\n {addToCart && <td className='sku-selector-add-to-cart'>{_renderAddToCart(addToCart)}</td>}\r\n {subscriptionButton && <td className='sku-selector-add-to-cart'>{_renderAddToCart(subscriptionButton)}</td>}\r\n </tr>\r\n </tbody>\r\n </Table>\r\n </div>\r\n );\r\n};\r\n\r\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {errorBlock}\r\n {button}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, input, errors } = quantity;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {errors}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\nconst _renderQuantityHeader = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\r\n const { LabelContainerProps } = quantity;\r\n\r\n return (\r\n <Node {...LabelContainerProps} style={{display:\"inline-block\"}}>\r\n QTY\r\n </Node>\r\n );\r\n};\r\n\r\nexport default SmweBuyboxView;\r\n","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps, Title } from '../../../modules/smwe-search-result-container/components';\r\nimport { IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from '../../../modules/smwe-search-result-container/smwe-search-result-container';\r\nimport { ISmweSearchResultContainerProps } from '../../../modules/smwe-search-result-container/smwe-search-result-container.props.autogenerated';\r\n\r\n// tslint:disable-next-line:cyclomatic-complexity\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISmweSearchResultContainerProps<{}>> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, categoryDescription } = props;\r\n // customization for 1.0\r\n const { showRefiners, showSortBy, showResultCount, categoryNamePrefix } = props.config;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {/*TODO remove after final testing */}\r\n {/*categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)*/}\r\n {renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {showRefiners && !props.config.pulldownRefiners && choiceSummary}\r\n {showRefiners && !props.config.pulldownRefiners && modalToggle}\r\n {showRefiners && !props.config.pulldownRefiners && createSearchResultModal(searchResultModal, refineMenu, sortByOptions, showSortBy!)}\r\n {showRefiners && props.config.pulldownRefiners && refineMenu && renderRefinerPulldown(refineMenu)}\r\n {categoryDescription}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {showResultCount && TitleViewProps && <Node {...CategoryNavContainer}>\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {showRefiners && !props.config.pulldownRefiners && refineMenu && renderRefiner(refineMenu)}\r\n {showRefiners && props.config.pulldownRefiners && refineMenu && renderRefinerPulldown(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n {TitleViewProps && renderTitle(TitleViewProps, showResultCount!, categoryNamePrefix!)}\r\n {showRefiners && choiceSummary}\r\n {showSortBy && sortByOptions && renderSort(sortByOptions, showSortBy)}\r\n {categoryDescription}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown, showSortBy), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, showSortBy), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefinerPulldown = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer, pulldownText, activeRefiners } = props;\r\n const activeRefinersText = getActiveRefinersText(activeRefiners);\r\n const dynamicPulldownText = getPulldownText(activeRefinersText, pulldownText);\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n <button onClick={() => togglePulldown(getActiveRefinersText(activeRefiners), pulldownText)} className='ms-search-result-container__refiner-pulldown-button' id='refiner-pulldown-button'>\r\n <span className='ms-search-result-container__refiner-pulldown-button-content' id='refiner-pulldown-button-content'>{dynamicPulldownText}</span>\r\n </button>\r\n <div className='ms-search-result-container__refiner-pulldown-container pulldown-hide' id='refiner-pulldown-container'>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n <button onClick={() => togglePulldown(getActiveRefinersText(activeRefiners), pulldownText)} className='ms-search-result-container__refiner-close-pulldown-button'>Close</button>\r\n </div>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst getPulldownText = (activeRefiners: string, buttonText: string | undefined): string => {\r\n const buttonElement = document.getElementById('refiner-pulldown-button');\r\n const spanElement = document.getElementById('refiner-pulldown-button-content');\r\n if (buttonElement && spanElement) {\r\n if (buttonElement.className === 'ms-search-result-container__refiner-pulldown-button refiner-pulldown-button-expanded' || !activeRefiners) {\r\n return spanElement.innerText = buttonText || '';\r\n } else {\r\n return spanElement.innerText = activeRefiners;\r\n }\r\n }\r\n return '';\r\n};\r\n\r\nconst togglePulldown = (activeRefiners: string, buttonText: string | undefined): void => {\r\n const buttonElement = document.getElementById('refiner-pulldown-button');\r\n if (buttonElement) {\r\n buttonElement.classList.toggle('refiner-pulldown-button-expanded');\r\n getPulldownText(activeRefiners, buttonText);\r\n }\r\n const pulldownElement = document.getElementById('refiner-pulldown-container');\r\n if (pulldownElement) {\r\n pulldownElement.classList.toggle('pulldown-hide');\r\n }\r\n\r\n};\r\n\r\nconst getActiveRefinersText = (activeRefiners: ProductRefinerValue[]): string => {\r\n let formatedActiveRefiners = '';\r\n activeRefiners.forEach(refiner => {\r\n if (refiner.UnitText === 'USD') {\r\n formatedActiveRefiners += `$${refiner.LeftValueBoundString}-$${refiner.RightValueBoundString} / `;\r\n } else if (refiner.LeftValueBoundString) {\r\n formatedActiveRefiners += `${refiner.LeftValueBoundString} / `;\r\n }\r\n });\r\n // removes trailing slash and whitespace\r\n formatedActiveRefiners = formatedActiveRefiners.substring(0, formatedActiveRefiners.length - 2);\r\n return formatedActiveRefiners;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, showSortBy: boolean): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && showSortBy) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps, showResultPrefix: boolean, categoryNamePrefix: string): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={categoryNamePrefix} />;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2 aria-level={1}>\r\n {showResultPrefix && titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxProductQuantityViewProps\r\n} from '@msdyn365-commerce-modules/buybox/dist/types';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ISmweBuyboxViewProps } from '../../../modules/smwe-buybox/./smwe-buybox';\r\n\r\nconst SmweBuyboxView: React.FC<ISmweBuyboxViewProps> = props => {\r\n const {\r\n ModuleProps,\r\n MediaGalleryContainerProps,\r\n ProductInfoContainerProps,\r\n addToCart,\r\n quantity,\r\n title,\r\n productDescription,\r\n productTitle,\r\n productPrice,\r\n productClubPrice,\r\n show,\r\n acclaimRatings,\r\n cookbookTagline,\r\n eventSchedule\r\n } = props;\r\n // @ts-ignore\r\n const tableClass: AsyncResult<string> = props.context.actionContext.get('String', 'Generic-SkuSelectorClasses');\r\n const isGiftCard = props.data.product && props.data.product.result ? props.data.product.result.ItemId?.toLowerCase() === 'giftcard' : false;\r\n\r\n return (\r\n <Module {...ModuleProps}>\r\n <Node {...MediaGalleryContainerProps}>{props.mediaGallery}</Node>\r\n <Node {...ProductInfoContainerProps}>\r\n {props.productApellation && (\r\n <div>{props.productApellation}</div>\r\n )}\r\n {title}\r\n {productTitle}\r\n {productDescription}\r\n {eventSchedule}\r\n {acclaimRatings}\r\n {cookbookTagline}\r\n {show && _renderTable({\r\n addToCart: addToCart,\r\n quantity: quantity,\r\n productPrice: productPrice,\r\n productClubPrice: productClubPrice,\r\n tableClass: tableClass,\r\n isGiftCard: isGiftCard\r\n })}\r\n {props.content &&\r\n props.content.map(\r\n (contentSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <React.Fragment key={index}>\r\n {contentSlotData}\r\n </React.Fragment>\r\n );\r\n }\r\n )}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nexport interface IRenderTable {\r\n addToCart: IBuyboxAddToCartViewProps;\r\n quantity: IBuyboxProductQuantityViewProps | undefined;\r\n productPrice: React.ReactNode;\r\n productClubPrice: React.ReactNode;\r\n isGiftCard: boolean;\r\n tableClass: AsyncResult<string>;\r\n}\r\n\r\nconst _renderTable = (props: IRenderTable) => {\r\n const { addToCart, quantity, productPrice, productClubPrice, tableClass, isGiftCard } = props;\r\n\r\n return (\r\n <div className={classnames('sku-selector', tableClass?.result)}>\r\n <div className='sku-selector__price'>\r\n {productPrice && <div className={classnames('sku-selector__price-default', { 'price-width-adjust': isGiftCard })}>{productPrice}</div>}\r\n {!isGiftCard && productClubPrice && <div className='sku-selector__price-club'>{productClubPrice} Club</div>}\r\n </div>\r\n <div className='sku-selector__cart'>\r\n {quantity && <div className={classnames('sku-selector__cart-quantity', { unselectable: isGiftCard })}>{_renderQuantity(quantity)}</div>}\r\n {addToCart && <div className='sku-selector__cart-button'>{_renderAddToCart(addToCart)}</div>}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {errorBlock}\r\n {button}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, input, errors } = quantity;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {errors}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\nexport default SmweBuyboxView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResults,\n CartLineValidationResultsByLineId,\n CartsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n cart: AsyncResult<ICartState>,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true\n): Promise<CartLineValidationResultsByLineId | undefined> {\n let cartResult: ICartState;\n let cartVersion: number | undefined;\n try {\n cartResult = await cart;\n cartVersion = cartResult.cart.Version;\n } catch (error) {\n telemetry.warning(error);\n telemetry.debug('Unable to get cart or cart version.');\n return AsyncResult.resolve();\n }\n\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: propsContext.actionContext, bypassCache: 'none' },\n cartResult.cart.Id,\n cartVersion\n );\n\n return await AsyncResult.resolve(validationResult.ValidationResultsByLineId ?? undefined);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- error type is not defined.\n if (shouldRetry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n telemetry.warning(refreshError);\n telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await validateCartAsync(cart, telemetry, propsContext, false);\n return AsyncResult.resolve();\n } catch (validateError) {\n telemetry.warning(validateError);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n telemetry.warning(error);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n}\n\n/**\n * Check if cart line quantity update is success.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function isCartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise<boolean> {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult.status === 'SUCCESS');\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve(false);\n}\n\n/**\n * Update cart line with cart action result.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function cartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise<ICartActionResult | undefined> {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Find the product in array of products considering product id.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @returns - The found product.\n */\nexport function getProductByProductId(productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined {\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n\n return undefined;\n}\n\n/**\n * Find the product in array of products considering product id and product behavior's warehouse.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @param warehouseId - Warehouse id of cartLine.\n * @param cartState - The cart start in case cart line has no warehouse.\n * @returns - The found product.\n */\nexport function getProductByProductIdAndWarehouse(\n productId: number | undefined,\n products?: SimpleProduct[],\n warehouseId?: string,\n cartState?: ICartState\n): SimpleProduct | undefined {\n const targetWarehouseValue = warehouseId ?? cartState?.cart.WarehouseId;\n\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId && product.Behavior?.InventoryLocationId === targetWarehouseValue;\n });\n }\n\n return undefined;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n ActiveCartProductsInput,\n QueryResultSettingsProxy,\n buildCacheKey,\n getActiveCartProductsAction\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Input class for pickup delivery options for items in cart.\n */\nexport class ProductPickUpOptionsForCartLineItems implements IActionInput {\n public readonly apiSettings: ICommerceApiSettings;\n\n public constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => buildCacheKey('ActiveCartLineItemsPickUpOptions', this.apiSettings);\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'ActiveCartLineItemsPickUpOptions';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetPickUpOptionCartLineItems method.\n * @param inputData - The input data passed to the createInput method.\n * @returns - Input for data action.\n */\nconst createInput = (inputData: ICreateActionContext<IGeneric<IAny>>) => {\n return new ProductPickUpOptionsForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the GetPickUpOptionCartLineItems data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - Order Template object.\n */\nexport async function getPickUpOptionsForCartLineItems(\n input: ProductPickUpOptionsForCartLineItems,\n context: IActionContext\n): Promise<ProductDeliveryOptions[]> {\n // If no input is provided fail out\n if (!input.apiSettings.channelId) {\n throw new Error('[getPickUpOptionsForCartLineItems]No valid Input was provided, failing');\n }\n const cartState = await getCartState(context);\n const cart = cartState.cart;\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), context);\n const filterOption = 4;\n const response: ProductDeliveryOptions[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code.\n if (cart === undefined || !ArrayExtensions.hasElements(products)) {\n return Promise.resolve(response);\n }\n\n const pickupoptions = await ProductsDataActions.getDeliveryOptionsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n products.map(product => product.RecordId),\n {},\n filterOption\n );\n\n return pickupoptions;\n}\n\n/**\n * The GetPickupOptionCartLineItems Data Action\n * Returns pickup options.\n */\nexport const getPickUpOptionsForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-pickup-options-for-cartlines',\n action: getPickUpOptionsForCartLineItems as IAction<ProductDeliveryOptions[]>,\n input: createInput\n});\n\nexport default getPickUpOptionsForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n DeliveryOption,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n retailMulitplePickupFeatureState?: boolean;\n locationChangedHandler(): void;\n}\n\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = async (\n orgUnitLocation: OrgUnitLocation,\n cartState: ICartState | undefined,\n cartline: CartLine,\n deliveryMode?: string\n ) => {\n if (!cartState) {\n return Promise.resolve();\n }\n return cartState\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if (isBopisSelected) {\n if (!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager\n .openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {});\n } else {\n if (!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n }\n };\n\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n };\n\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText: string,\n orgUnitLocations: OrgUnitLocation[] | undefined\n ): JSX.Element => {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = !!cartLine.FulfillmentStoreId;\n\n const toggleBOPIS = (isBopisSelected: boolean) => {\n return () => {\n _toggleBOPIS(isBopisSelected);\n };\n };\n\n return (\n <>\n <label className='msc-cart-line__bopis-shipping'>\n <input\n id={`ms-cart-bopis-ship-option-${cartLine.LineId}`}\n type='radio'\n name={`shippingType ${cartLine.LineId}`}\n onChange={toggleBOPIS(false)}\n value={shipItText}\n checked={!bopisSelected}\n aria-checked={!bopisSelected}\n key={`${cartLine.LineId}-shipit`}\n />\n {shipItText}\n </label>\n <label className='msc-cart-line__bopis-store-pickup'>\n <input\n id={`ms-cart-bopis-pickup-option-${cartLine.LineId}`}\n type='radio'\n name={`shippingType ${cartLine.LineId}`}\n onChange={toggleBOPIS(true)}\n value={pickupInStoretext}\n checked={bopisSelected}\n aria-checked={bopisSelected}\n key={`${cartLine.LineId}-pickup`}\n />\n {pickupInStoretext}\n </label>\n {cartLine.FulfillmentStoreId ? (\n <div className='msc-cart-line__bopis__fullfilment'>\n <span className='msc-cart-line__bopis__fullfilment-store'>{orgUnitName}</span>\n <button className='msc-cart-line__bopis-changestore btn' onClick={toggleBOPIS(true)}>\n {changeStoreText}\n </button>\n </div>\n ) : null}\n </>\n );\n };\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n /**\n * Method to check if we have atleast one common delivery code between product and channel.\n * @param productdeliveryOptions - Product DeliveryOption List.\n * @param storePickUpOptionList - Channel DeliveryOption List.\n * @returns Boolean flag.\n */\n const matchDeliveryOptions = (\n productdeliveryOptions: DeliveryOption[] | undefined,\n storePickUpOptionList: string[] | undefined\n ): boolean => {\n const deliveryOption: string[] = [];\n productdeliveryOptions?.map(delivery => {\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\n if (pickup) {\n deliveryOption.push(pickup);\n }\n return deliveryOption;\n });\n\n return ArrayExtensions.hasElements(deliveryOption);\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\n return undefined;\n }\n\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\n return undefined;\n }\n } else if (\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\n ) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(\n props.cartline,\n props.shipitText,\n props.pickUpInStoreText,\n props.changeStoreText,\n props.orgUnitLocations\n ),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\n }\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n CartLineItemComponent,\n IAddToOrderTemplateDialogResources,\n ICartlineResourceString,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult\n} from '@msdyn365-commerce/components';\nimport MsDyn365, {\n IAny,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageSettings,\n ITelemetry,\n TelemetryEvent,\n isChannelTypeB2B\n} from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResultsByLineId,\n ChannelDeliveryOptionConfiguration,\n CommerceList,\n Customer,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n ArrayExtensions,\n getInvoiceDetailsPageUrlSync,\n getProductUrlSync,\n IProductInventoryInformation,\n isCartLineItemPickUpType,\n ObjectExtensions,\n OrderTemplate,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: CartLineValidationResultsByLineId;\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n retailMulitplePickupFeatureState?: boolean;\n\n /* GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n\n /* ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext<IGeneric<IAny>>;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n hasInvoiceLine?: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateButtonTooltip: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n shouldIgnoreWarehouse: boolean | undefined;\n productAvailability?: AsyncResult<IProductInventoryInformation[]>;\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n catalogId?: number;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n cartlineId?: string;\n hasError?: boolean;\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n productAvailability: IProductInventoryInformation | undefined\n): number => {\n if (\n !isStockCheckEnabled ||\n !productAvailability ||\n !productAvailability.ProductAvailableQuantity ||\n !productAvailability.IsProductAvailable ||\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\n ) {\n return 0;\n }\n\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\nconst _getErrorMessage = (\n availableQuantityInStock: number,\n currentQuantity: number,\n props: ICartLineItemsProps,\n shouldSkipStockCheck: boolean,\n cartLine: CartLine,\n lineId: string | undefined,\n foundProductAvailability?: IProductInventoryInformation\n): string | undefined => {\n const finalErrorMessages: string[] = [];\n\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\n if (isLoadingDeliveryOptions) {\n return undefined;\n }\n // check availability passed as prop for each cartline\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n if (foundProductAvailability === undefined) {\n finalErrorMessages.push(props.outOfStockText);\n return finalErrorMessages.toString();\n }\n }\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\n if (availableQuantityInStock <= 0) {\n finalErrorMessages.push(props.outOfStockText);\n } else if (availableQuantityInStock < currentQuantity) {\n if (availableQuantityInStock === 1) {\n finalErrorMessages.push(props.outOfRangeOneText);\n } else {\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\n }\n }\n }\n\n // Server-side validation\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\n if (errorsFoundByLineId !== undefined) {\n for (const i of errorsFoundByLineId) {\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\n i.ValidationFailures.forEach(validation => {\n if (validation.ErrorContext !== undefined) {\n finalErrorMessages.push(validation.ErrorContext);\n }\n });\n }\n }\n }\n\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\n return finalErrorMessages.join(' ');\n }\n\n return undefined;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\n\n// eslint-disable-next-line complexity -- Auto-suppressed.\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n productPickUpOptions?: ProductDeliveryOptions\n): ICartlinesViewProps => {\n const {\n imageSettings,\n gridSettings,\n id,\n typeName,\n context,\n resources,\n removeButtonText,\n removeItemClickHandler,\n moveToWishlistSuccessHandler,\n addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip,\n addToOrderTemplateDialogResources,\n createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources,\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText,\n removeFromWishlistButtonText,\n orderTemplates,\n customerInformation,\n wishlists,\n defaultWishlistName,\n storeSelectorModuleId,\n isMultipleCatalogFeatureEnabledInHq\n } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\n\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Skip stock check if the cart line is a service item or an invoice line\n const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\n\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\n ? undefined\n : _getErrorMessage(\n availableQuantityInStock,\n cartline.Quantity!,\n props,\n shouldSkipStockCheck,\n cartline,\n cartline.LineId,\n foundProductAvailability\n );\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\n : undefined;\n const productDimension = 4;\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\n const isCustomPriceSelected =\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\n 'Custom';\n\n let productUrl: string | undefined;\n if (product) {\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n } else {\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\n }\n\n return {\n data: {\n product,\n cartline\n },\n cartlineId: cartline.LineId,\n error: errorMessage,\n hasError:\n (!shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false) ||\n (!ObjectExtensions.isNullOrUndefined(errorMessage) && !StringExtensions.isNullOrEmpty(errorMessage)),\n cartline: (\n <CartLineItemComponent\n data={{\n cartLine: cartline,\n cartState: props.cartState,\n product,\n catalogs: props.catalogs\n }}\n currentQuantity={cartline.Quantity}\n maxQuantity={maxQuantity}\n isOutOfStock={!shouldSkipStockCheck && props.isStockCheckEnabled ? availableQuantityInStock <= 0 : false}\n gridSettings={gridSettings}\n imageSettings={imageSettings}\n id={id}\n typeName={typeName}\n productUrl={productUrl}\n context={context}\n resources={resources}\n key={`${index}-${productUrl}`}\n lineIndex={index}\n isQuantityEditable={!ObjectExtensions.isNullOrUndefined(product)}\n quantityOnChange={props.updateCartLinesQuantitySuccessHandler}\n primaryImageUrl={product?.PrimaryImageUrl}\n errorMessage={errorMessage}\n inventoryInformationLabel={inventoryLbl}\n inventoryLabelClassName={inventoryCode}\n isCartStateReady={props.cartState?.status === 'READY'}\n showShippingChargesForLineItems={props.showShippingChargesForLineItems}\n telemetryContent={props.telemetryContent}\n channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\n priceCurrency={context.request.channel?.Currency}\n />\n ),\n pickUpInStore: product\n ? PickUpInStore({\n storeSelectorModuleId,\n cartState: props.cartState,\n cartline,\n product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: productPickUpOptions,\n pickupDeliveryModeCode:\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\n locationChangedHandler: props.locationChangedHandler\n })\n : undefined,\n remove: (\n <Button className='msc-cart-line__remove-item' onClick={onRemoveClickHandler} title={removeButtonText} {...attributes}>\n {removeButtonText}\n </Button>\n ),\n addToWishlist:\n isAuthenticated && product && !isCustomPriceSelected ? (\n <AddToWishlistComponent\n className='msc-cart-line__add-to-wishlist'\n addToWishlistButtonText={addToWishlistButtonText}\n removeFromWishlistButtonText={removeFromWishlistButtonText}\n context={context}\n id={id}\n key={cartline.LineId}\n typeName={typeName}\n nameOfWishlist={nameOfWishlist}\n cartline={cartline}\n showButtonText\n showStatusMessage={false}\n showRemoveButton={false}\n showButtonTooltip={false}\n ariaRole='button'\n data={{\n wishlists,\n product\n }}\n onSuccess={moveToWishlistSuccessHandler}\n />\n ) : (\n undefined\n ),\n addToOrderTemplate:\n isAuthenticated && orderTemplates && product ? (\n <AddToOrderTemplateComponent\n className={classnames('msc-cart-line__add-to-order-template', isCustomPriceSelected ? 'disabled' : '')}\n addToOrderTemplateButtonText={addToOrderTemplateButtonText}\n addToOrderTemplateButtonTooltip={addToOrderTemplateButtonTooltip}\n addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\n createOrderTemplateDialogResources={createOrderTemplateDialogResources}\n itemAddedToOrderTemplateDialogResources={itemAddedToOrderTemplateDialogResources}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={duplicateItemsWhenAddingToOrderTemplateDialogResources}\n data={{ product, quantity: cartline.Quantity || 1, orderTemplates, customerInformation }}\n context={context}\n showButtonText\n shouldShowButtonFailedTooltip={isCustomPriceSelected}\n disableButton={isCustomPriceSelected}\n id={id}\n typeName={typeName}\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value\n showButtonTooltip={!props.context.app.config.disableTooltip || false}\n imageSettings={props.imageSettings !== undefined ? props.imageSettings : undefined}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq || false}\n catalogId={cartline.CatalogId}\n />\n ) : (\n undefined\n )\n };\n};\n\nexport const assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[] | null => {\n const reactNodes: ICartlinesViewProps[] = [];\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n\n // check if cartlineitem is pickup item\n const isPickUpItem = isCartLineItemPickUpType(\n cartline,\n props.retailMulitplePickupFeatureState,\n props.channelDeliveryOptionConfig,\n props.pickupDeliveryModeCode\n );\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n if (!props.shouldIgnoreWarehouse && isPickUpItem) {\n // check warehouse only if siteBuilder setting is not \"Based on aggregate for shipping and pickup warehouses\" and cartlineitem is pickupitem\n return (\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\n );\n }\n return productAvailability.ProductAvailableQuantity.ProductId === cartline.ProductId;\n });\n }\n\n let productPickUpOptions;\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n * @param props\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return assembleCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\n\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './cart-line-items';\n\nconst _assembleGroupCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-expect-error\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n });\n\n return reactNodes;\n};\n\nconst _assembleGroupInvoiceCartlines = (\n cartLines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (cartLines && cartLines.length > 0) {\n // Create invoice cartLines group\n const carLineViewProps = assembleCartlines(cartLines, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n }\n return reactNodes;\n};\n\n/**\n * CartLine Group component.\n * @param props\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines, hasInvoiceLine } = props;\n return hasInvoiceLine\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\n : _assembleGroupCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data.\n * @param ctx\n */\nexport async function getPromotionData(ctx: IActionContext): Promise<IPromotionData> {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n ILinesAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult,\n PromoCodeComponent,\n SaveCartToOrderTemplateComponent\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, getUrlSync, IImageSettings, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\nimport { FeatureState, ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport {\n ActiveCartProductsInput,\n ArrayExtensions,\n getActiveCartProductsAction,\n ICartLineInventoryValidationResult,\n ObjectExtensions,\n validateCartLinesInventory,\n ProductPickUpOptionsForCartLineItems,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant,\n Waiting,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-cartlines';\n\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\n/**\n * Cart view props interface.\n */\nexport interface ICartViewProps extends ICartProps<ICartData> {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?: ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n expressCheckoutButton?: React.ReactNode[];\n ExpressCheckoutSectionWrapper: INodeProps;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n multiplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\n/**\n * Order summary errors interface.\n */\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\n/**\n * Cart component state interface.\n */\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: CartLineValidationResultsByLineId;\n promotionData: IPromotionData;\n isCartValid: boolean;\n productPickUpOptions?: ProductDeliveryOptions[];\n}\n\n/**\n * Cart component.\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass Cart extends React.Component<ICartProps<ICartData>> {\n public state: ICartComponentState;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n private isQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isMounted: boolean = false;\n\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n public constructor(props: ICartProps<ICartData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n\n this.state = {\n showPromotionDialog: false,\n promotionData: {},\n isCartValid: true,\n productPickUpOptions: undefined,\n cartlinesErrors: {}\n };\n }\n\n /**\n * Component did mount function.\n */\n public async componentDidMount(): Promise<void> {\n this._isMounted = true;\n const {\n config,\n context: { actionContext }\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled =\n (await this.getOrderQuantityLimitsFeatureFlag()) || (await this._isChannelLimitsFeatureEnabled());\n if (this.isQuantityLimitsFeatureEnabled) {\n await this.validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n }\n );\n }\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\n }\n }\n );\n }\n\n /**\n * Component will unmount function.\n */\n public componentWillUnmount(): void {\n this._isMounted = false;\n }\n\n /**\n * Should component update function.\n * @param nextProps - Next props.\n * @param nextState - Next state.\n * @returns True if component should update, false otherwise.\n */\n public shouldComponentUpdate(nextProps: ICartProps<ICartData>, nextState: ICartComponentState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n /* eslint-disable complexity -- Disabling complexity for render method */\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products }\n },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const cartLines = this._getCartLines();\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.props.data.productAvailabilites.result ?? [],\n this.props.context.actionContext,\n products ?? [],\n emailDeliveryModeCode\n );\n\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\n for (const cartLineGroup of cartLinesGroup) {\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\n }\n }\n\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\n }\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title: <h1 className='msc-cart__heading'>{resources.cartTitle}</h1>,\n cart: this.props.data.cart.result,\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\n cartlines: cartLines,\n cartLinesGroup,\n promoCode: this._getPromoCode(),\n promotionOptions: this._getPromotions(),\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry: this.props.telemetry,\n id: this.props.id,\n multiplePickUpEnabled,\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n cart?.hasInvoiceLine ? (\n <h2 className='msc-invoice-summary__heading'>{resources.invoiceSummaryTitle}</h2>\n ) : (\n <h2 className='msc-order-summary__heading'>{resources.orderSummaryTitle}</h2>\n )\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\n checkoutAsSignInUserButton: !isCartEmpty ? (\n <Button\n disabled={hasError}\n className='msc-cart__btn-checkout'\n href={checkoutURL}\n title={resources.checkoutButtonTitle}\n {...checkoutBySignInAttributes}\n >\n {resources.checkoutButtonTitle}\n </Button>\n ) : null,\n checkoutAsGuestButton:\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\n <Button\n disabled={hasError}\n className='msc-cart__btn-guestcheckout'\n href={guestCheckoutUrl}\n title={resources.guestCheckoutButtonTitle}\n {...checkoutByGuestAttributes}\n >\n {resources.guestCheckoutButtonTitle}\n </Button>\n ) : null,\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\n backToShoppingButton: (\n <Button\n className='msc-cart__btn-backtoshopping'\n {...backtoShoppingAttributes}\n href={backToShoppingUrl}\n title={resources.backToShoppingButtonTitle}\n >\n {resources.backToShoppingButtonTitle}\n </Button>\n ),\n createTemplateFromCartButton:\n this._displayAddCartToTemplate() && products ? (\n <SaveCartToOrderTemplateComponent\n addToOrderTemplateDialogResources={this._generateAddToOrderTemplateDialogResources(resources)}\n createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(resources)}\n linesAddedToOrderTemplateDialogResources={this._generateLinesAddedToOrderTemplateDialogResources(resources)}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n )}\n createOrderTemplateFromCartButton={resources.createOrderTemplateFromCartButton}\n createOrderTemplateFromCartButtonTooltip={resources.createOrderTemplateFromCartButtonTooltip}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled || false}\n catalogId={currentCatalogId}\n data={{\n orderTemplates: this.props.data.orderTemplates.result!,\n cartLines: this.props.data.cart.result!.cart.CartLines!,\n customerInformation: this.props.data.customerInformation.result\n }}\n />\n ) : null,\n checkoutBlockedDueToUnavailableFunds: null,\n storeSelector:\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n waitingComponent: <Waiting className='msc-waiting-circular msc-waiting-lg' />,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n /* eslint-enable complexity -- Disabling complexity for render method */\n\n /**\n * Promotion click event handler.\n * @param event - The mouse event.\n */\n private readonly promotionLinkClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n /**\n * Promotion close button click.\n */\n private readonly promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n /**\n * Hide promotion dialog.\n */\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n /**\n * Display add to cart template.\n * @returns True if should display, false otherwise.\n */\n private _displayAddCartToTemplate(): boolean {\n const cart = this.props.data.cart?.result;\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\n return false;\n }\n\n if (\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\n this.props.data.orderTemplates.result &&\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\n this.props.data.customerInformation.result\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get promotions.\n * @returns React node with the promotions.\n */\n private _getPromotions(): React.ReactNode {\n return (\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n /**\n * Add error message in cart line in case the quantity exceeds the current inventory.\n * @param cartLines - The cart lines.\n * @param cartLineInventoryValidationResult - The cart line inventory result.\n */\n private _updateCartLineErrorForInvalidInventory(\n cartLines: ICartlinesViewProps[] | null,\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\n ) {\n const { resources } = this.props;\n\n if (\n ArrayExtensions.hasElements(cartLines) &&\n !cartLineInventoryValidationResult.isValid &&\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\n ) {\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\n if (cartLine) {\n cartLine.error = resources.outOfStockErrorMessage;\n cartLine.hasError = true;\n }\n }\n }\n }\n\n /**\n * Get order summary errors.\n * @param cartLines - The cart lines.\n * @returns Order summary errors.\n */\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors =\n (cartLines &&\n cartLines\n .map(cartline => {\n // Check if the product is service or not by product type\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\n\n if (!isServiceItem && cartline.error) {\n const fullError =\n cartline.data && cartline.data.product?.Name\n ? `${cartline.data.product.Name}: ${cartline.error}`\n : cartline.error;\n\n return (\n <div key={fullError} className='msc-alert__line'>\n {fullError}\n </div>\n );\n }\n\n return null;\n })\n .filter((line): line is JSX.Element => !!line)) ||\n [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>{this.props.resources.outOfStockErrorMessageHeader}</span>\n </div>\n ),\n errors: allErrors\n };\n }\n\n /**\n * Gets invoice summary line items.\n * @returns Invoice summary lines.\n */\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart }\n },\n telemetry,\n resources\n } = this.props;\n\n return cart?.hasInvoiceLine\n ? InvoiceSummary({\n orderTotalLabel: resources.totalAmountLabel,\n invoiceLabel: resources.invoiceLabel,\n cart: cart.cart,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry,\n id: this.props.id\n })\n : undefined;\n }\n\n /**\n * Gets order summary line items.\n * @returns Order summary lines.\n */\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\n ? OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry,\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\n isShowTaxBreakup: isShowOrHideTaxEnabled\n })\n : undefined;\n }\n\n /**\n * Gets promo code.\n * @returns React node with the promo code.\n */\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return (\n cart && (\n <PromoCodeComponent\n cart={cart}\n promoCodeHeadingText={resources.promoCodeHeadingText}\n promoPlaceholderText={resources.promoPlaceholderText}\n promoCodeApplyButtonText={resources.promoCodeApplyButtonText}\n appliedPromoCodeHeadingText={resources.appliedPromoCodeHeadingText}\n collapseTimeOut={350}\n removePromoAriaLabelFormat={resources.removePromoAriaLabelFormat}\n removePromoText={resources.removePromoText}\n invalidPromoCodeErrorText={resources.invalidPromoCodeErrorText}\n failedToAddPromoCodeErrorText={resources.failedToAddPromoCodeErrorText}\n failedToRemovePromoCodeErrorText={resources.failedToRemovePromoCodeErrorText}\n duplicatePromoCodeErrorText={resources.duplicatePromotionErrorText}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n telemetryContent={this.telemetryContent}\n />\n )\n );\n }\n\n /**\n * Generate add to order template dialog resources.\n * @param resources - The resources.\n * @returns IAddToOrderTemplateDialogResources.\n */\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n /**\n * Generate item added to order template dialog resources.\n * @param resources - The resources.\n * @returns IItemAddedToOrderTemplateDialogResources.\n */\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n /**\n * Generate lines added to order template dialog resources.\n * @param resources - The resources.\n * @returns ILinesAddedToOrderTemplateDialogResources.\n */\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\n };\n }\n\n /**\n * Generate duplicate items when adding to order template dialog resources.\n * @param resources - The resources.\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\n */\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources: ICartResources\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n /**\n * Generate order template name dialog resources.\n * @param resources - The resources.\n * @returns IOrderTemplateNameDialogResources.\n */\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n /**\n * Gets the cart lines view props.\n * @returns ICartlinesViewProps [].\n */\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n this.props.data.featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled ||\n false;\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\n ? CartLineItems({\n cartlines: cart!.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n productAvailability: this.props.data.productAvailabilites,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n\n /**\n * Gets the checkout URL.\n * @param isAuthenticated - Is authenticated flag.\n * @param guestCheckoutUrl - Guest checkout URL.\n * @param signInUrl -The sign in URL.\n * @returns The checkout URL.\n */\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Gets the image settings.\n * @param imageSettings - Image settings.\n * @returns IImageSettings.\n */\n private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n /**\n * Remove item from cart handler.\n * @param cartlineToRemove - The cart line to remove.\n */\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result\n .removeCartLines(input)\n .then(() => {\n this.validateCart().catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n /**\n * Move to wish list handler.\n * @param result - The wish list action success result.\n * @param cartline - The cart line.\n */\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this.removeItemFromCartHandler(cartline);\n }\n };\n\n /**\n * Updates the cart line quantity.\n * @param cartlineToUpdate - The cart line.\n * @param quantity - The quantity.\n * @param lineIndex - The line index.\n * @returns True if the cart line was updated, false otherwise.\n */\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\n cartLineQuantityUpdatedAsync(\n this.isQuantityLimitsFeatureEnabled,\n this.props.data.cart.result,\n this.props.telemetry,\n this.props.data.products.result,\n cartlineToUpdate,\n quantity\n )\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\n if (cartActionResult?.status === 'SUCCESS') {\n this.validateCart().catch(error => {\n this.props.telemetry.warning((error as Error).message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n\n return true;\n }\n\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\n // Show update line error message.\n const lineUpdateFailure: LineValidationResult = {\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\n ValidationFailures: [\n {\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\n ? cartActionResult.validationResults[0].ErrorContext\n : '',\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\n }\n ]\n };\n\n this.setState({\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\n });\n }\n\n return false;\n })\n .catch(() => {\n return false;\n });\n\n return false;\n };\n\n /**\n * Fulfillment store id is updated.\n */\n private readonly fulfillmentStoreIdUpdated = () => {\n if (this.isQuantityLimitsFeatureEnabled) {\n // Refresh products (in props.data) based on latest cart.\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\n .then(async () => this.validateCart())\n .catch((error: Error) => {\n this.props.telemetry.warning(error.message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n };\n\n /**\n * Validates cart.\n * @returns Void promise.\n */\n private async validateCart(): Promise<void> {\n if (!this.isQuantityLimitsFeatureEnabled) {\n this.setState({ isCartValid: true });\n return AsyncResult.resolve();\n }\n\n const {\n data: { cart },\n telemetry,\n context\n } = this.props;\n\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(cart, telemetry, context, true);\n\n if (validationResults) {\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\n this.setState({\n cartlinesErrors: validationResults,\n isCartValid: isValid\n });\n } else {\n this.setState({ isCartValid: true });\n }\n\n return AsyncResult.resolve();\n }\n\n /**\n * Get order quantity limit feature flag.\n * @returns True if flag is enabled, false otherwise.\n */\n private async getOrderQuantityLimitsFeatureFlag(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n try {\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n\n try {\n const customerInfo = await this.props.data.customerInformation;\n return (\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n }\n\n /**\n * Gets the cart lines group.\n * @returns ICartlinesViewProps [][].\n */\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const { featureState } = this.props.data;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n return this.props.data.products &&\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\n cart &&\n cart.cart.CartLines &&\n cart.cart.CartLines.length > 0 &&\n this.props.data.channelDeliveryOptionConfig?.result\n ? CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n hasInvoiceLine: cart?.hasInvoiceLine || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n productAvailability: this.props.data.productAvailabilites,\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n}\n\nexport default Cart;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent<HTMLElement>): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n const {\n id,\n showPromotionPopup,\n promotions,\n resources: { promotionLinkText, promotionPopupHeading },\n onCloseButtonClick,\n onSeeAllClick\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n <>\n <span className='msi-promotion-icon' />\n <span> {props.resources.promotionStringHeading}</span>\n </>\n ),\n promotionSeeAllLink: (\n <a className='msc-cart__promotion_link' tabIndex={0} role='link' onClick={onSeeAllClick}>\n {` `}\n {promotionLinkText} {` `}\n </a>\n ),\n promotionDialog: (\n <Modal isOpen={showPromotionPopup} className={`${className}`} toggle={onCloseButtonClick}>\n <ModalHeader className={`${className}__dialog__header`} toggle={onCloseButtonClick}>\n <h5 id={titleId} className='msc-cart__promotion-popup_title'>\n {promotionPopupHeading}\n </h5>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <ul>\n {promotions.map(_promotion => {\n return (\n <li className='msc-cart__promotion-popup_name' key={_promotion.LineId}>\n {_promotion.Promotion?.OfferName} {` `}\n </li>\n );\n })}\n </ul>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`} />\n </Modal>\n )\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\nimport { ICartlinesViewProps } from './components/cart-line-items';\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\n\nconst _renderCartlines = (\n cartLines: ICartlinesViewProps[] | undefined,\n cartEmptyText: string,\n CartlinesWrapper: INodeProps,\n storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode,\n waitingComponent: React.ReactNode,\n cartLoadingStatus: string,\n cartDataResult: boolean\n): JSX.Element[] | JSX.Element => {\n if (cartLoadingStatus) {\n return <>{cartLoadingStatus}</>;\n }\n if (cartLines) {\n return cartLines.map(cartLine => {\n return (\n <div className='msc-cart-lines-item' key={`${cartLine.cartlineId ?? ''}-${MsDyn365.isBrowser.toString()}`}>\n {cartLine.cartline}\n {storeSelector && cartLine.pickUpInStore ? (\n <Node {...cartLine.pickUpInStore.ContainerProps}>{cartLine.pickUpInStore.defaultComponent}</Node>\n ) : null}\n {cartLine.addToOrderTemplate ? (\n <Node className='msc-cart-line__extra-actions'>\n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n </Node>\n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n </>\n )}\n </div>\n );\n });\n }\n return cartDataResult ? (\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>{cartEmptyText}</p>\n {backToShoppingButton}\n </div>\n ) : (\n <>{waitingComponent}</>\n );\n};\n\n/**\n * Method will render error block.\n * @param errorData -The order summary errors interface.\n * @returns Jsx element.\n */\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\n return null;\n }\n return (\n <Node {...errorData.Wrapper}>\n {errorData.header}\n {errorData.errors}\n </Node>\n );\n};\n\n/**\n * Method will render invoice summary lines.\n * @param invoiceSummaryLines -The invoicesummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderInvoiceSummarylines = (\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!invoiceSummaryLines) {\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render order summary lines.\n * @param orderSummaryLines -The ordersummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderOrderSummarylines = (\n orderSummaryLines: IOrderSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!orderSummaryLines) {\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render cart promotions.\n * @param promotions -The cartline item view props.\n * @returns Jsx element.\n */\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n <>\n <Node {...promotions.promotionMessageWrapper}>\n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n </Node>\n </>\n );\n};\n\n/**\n * Method will render cartlines group title.\n * @param cartLine -The cartline view props.\n * @param titleSeparate -The title separate.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n return (\n <>\n <Node className='msc-cart-lines-group-wraper__bopis-heading-title'>\n {isBopisSelected ? (\n <p className='msc-cart-lines-group-wraper__bopis-heading-title-st'>\n {cartLine.pickUpInStore?.deliveryOption}\n {titleSeparate}\n {cartLine.pickUpInStore?.orgUnitName}\n </p>\n ) : null}\n </Node>\n </>\n );\n};\n\n/**\n * Method will render cartlines groups header title.\n * @param pickUpText -The pickup text for group.\n * @param shippingText -The shipping text for group.\n * @param emailShippingText -The email shipping text for group.\n * @param titleSeparate -The title separator.\n * @param cartLine -The cartline view props.\n * @param emailDeliveryModeCode -The email delivery code from channel.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupHeader = (\n pickUpText: string,\n shippingText: string,\n emailShippingText: string,\n titleSeparate: string,\n cartLine: ICartlinesViewProps,\n emailDeliveryModeCode?: string\n) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n let groupTitle: string;\n\n groupTitle = isBopisSelected ? pickUpText : shippingText;\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\n }\n\n return (\n <>\n <div className='msc-cart-lines-group-wraper__bopis-heading'>\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}-icon`} />\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}`}>{groupTitle}</p>\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\n </div>\n </>\n );\n};\n\n/**\n * Method will render cartlines in groups.\n * @param props -The cartline.\n * @returns Jsx element.\n */\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\n return (\n <div className='msc-cart-lines-group'>\n {props.cartLinesGroup.map(cartlines => {\n return (\n <div key={cartlines[0].cartlineId} className='msc-cart-lines-group-wraper'>\n {renderCartLinesGroupHeader(\n props.resources.pickUpText,\n props.resources.shippingText,\n props.resources.emailshippingText,\n props.resources.titleSeparate,\n cartlines[0],\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\n )}\n {_renderCartlines(\n cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n </div>\n );\n })}\n </div>\n );\n }\n return props.cartDataResult ? (\n <div className='msc-cartline-wraper'>\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>{props.resources.emptyCartText}</p>\n {props.backToShoppingButton}\n </div>\n </div>\n ) : (\n <>{props.waitingComponent}</>\n );\n};\n\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => (\n <div className={props.className} id={props.id} {...props.renderModuleAttributes(props)}>\n {props.title}\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? (\n renderCartLinesGroup(props)\n ) : (\n <Node {...props.CartlinesWrapper}>\n {_renderCartlines(\n props.cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n </Node>\n )}\n {props.orderSummaryHeading && (\n <Node {...props.OrderSummaryWrapper}>\n {props.orderSummaryHeading}\n {props.cart?.hasInvoiceLine\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\n <Node {...props.ExpressCheckoutSectionWrapper}>{props.expressCheckoutButton}</Node>\n ) : null}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n </Node>\n )}\n {props.storeSelector}\n </div>\n);\n\nexport default CartView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\n/**\n * EnabledPaymentsForOBO enum.\n */\n export enum EnabledPaymentsForOBO {\n OnCustomerAccount = 1,\n ExpressPayment = 0,\n Loyalty = 0,\n GiftCard = 0,\n PaymentInstrument = 0,\n ApplePay = 0\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionContext, IActionInput } from '@msdyn365-commerce/core';\n\nimport { IModuleStates } from './module-state.data';\n\n/**\n * GetModulesInput.\n */\nexport class ModuleStatesCacheKey implements IActionInput {\n public getCacheKey = () => 'ModuleState';\n\n public getCacheObjectType = () => 'ModuleState';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nexport function getModuleStates(ctx: IActionContext): IModuleStates {\n const cacheKey = new ModuleStatesCacheKey();\n\n let moduleStates = <IModuleStates>ctx.get<IModuleStates>(cacheKey.getCacheObjectType(), cacheKey.getCacheKey());\n if (moduleStates) {\n return moduleStates;\n }\n ctx.update(cacheKey, {});\n moduleStates = <IModuleStates>ctx.get<IModuleStates>(cacheKey.getCacheObjectType(), cacheKey.getCacheKey());\n return moduleStates;\n}\n\nexport function updateModuleStates(value: IModuleStates, ctx: IActionContext): void {\n const cacheKey = new ModuleStatesCacheKey();\n ctx.update(cacheKey, value);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModule } from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport isMatch from 'lodash/isMatch';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { getModuleStates, updateModuleStates } from './module-state';\nimport { IModuleState, IModuleStateManager, IModuleStateProps, IModuleStates } from './module-state.data';\n\nexport interface IProps extends IModule, IModuleStateProps {\n enableControl?: boolean;\n}\n\nconst sectionContainerModuleId = 'section-container';\nconst paymentInstrumentModuleId = 'payment-instrument';\n\nconst withModuleState = <P extends IProps>(WrappedComponent: React.ComponentType<P>): React.ComponentType<P> => {\n /**\n *\n * ModuleState component.\n * @extends {React.Component<P>}\n */\n @observer\n class ModuleState extends React.Component<P> {\n constructor(props: P) {\n super(props);\n this.initializeState();\n }\n\n public shouldComponentUpdate(nextProps: IModuleStateProps): boolean {\n if (this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { id } = this.props;\n return <WrappedComponent {...this.props} moduleState={this.getModuleStateManager(id)} />;\n }\n\n private readonly initializeState = (): void => {\n const { id, typeName, context } = this.props;\n const states = getModuleStates(context.actionContext);\n if (!states) {\n this.props.telemetry.error('withModuleState initializeState() - states not found');\n return;\n }\n\n if (states[id]) {\n // State has been initialized\n return;\n }\n\n updateModuleStates(\n {\n ...states,\n [id]: {\n id,\n typeName,\n hasInitialized: false,\n hasError: false,\n isRequired: true,\n isCancellable: true,\n isSubmitContainer: false,\n status: undefined,\n childIds: []\n }\n },\n context.actionContext\n );\n };\n\n /**\n * GetModuleStateManager\n * Get module state manager by id.\n * @param id\n */\n private readonly getModuleStateManager = (id: string): IModuleStateManager => {\n const moduleState = this.get()[id];\n return {\n ...moduleState!,\n hasInitialized: this.validate(id, { hasInitialized: true }, true), // All has initialized is initialized\n hasError: this.validate(id, { hasError: true }), // Partial has error is error\n isReady: this.validate(id, { status: 'ready' }, true, true), // All ready is ready (exclued disabled and skipped)\n isUpdating: this.validate(id, { status: 'updating' }), // Partial updating is updating\n isPending: this.validate(id, { status: 'pending' }), // Partial pending is pending\n isSkipped: this.validate(id, { status: 'skipped' }, true, true), // All skipped is skipped (exclued disabled)\n isDisabled: this.validate(id, { status: 'disabled' }, true), // All disabled is disabled\n isCancelAllowed: this.validate(id, { isCancellable: true }, true, true), // Partial not allowed is not allowed\n shouldSubmitContainer: this.validate(id, { isSubmitContainer: true }), // Partial submit is submit.\n hasExternalSubmitGroup: this.hasExternalSubmitGroup(),\n hasModuleState: this.hasModuleState(id),\n setIsRequired: (value: boolean): void => {\n this.update(id, { isRequired: value });\n },\n setIsCancellable: (value: boolean): void => {\n this.update(id, { isCancellable: value });\n },\n setIsSubmitContainer: (value: boolean): void => {\n this.update(id, { isSubmitContainer: value });\n },\n setHasError: (value: boolean): void => {\n this.update(id, { hasError: value });\n },\n onReady: (): void => {\n this.update(id, { status: 'ready' });\n },\n onUpdating: (): void => {\n this.update(id, { status: 'updating' });\n },\n onPending: (): void => {\n this.update(id, { status: 'pending' });\n },\n onSkip: (): void => {\n this.update(id, { status: 'skipped' });\n },\n onDisable: (): void => {\n this.update(id, { status: 'disabled' });\n },\n getModule: (moduleId: string): IModuleStateManager => this.getModuleStateManager(moduleId),\n getModuleByTypeName: (typeName: string): IModuleStateManager => this.getModuleStateManagerByTypeName(typeName),\n init: (options?: Partial<IModuleState>): void => {\n if (moduleState?.hasInitialized) {\n // State has been initialized\n return;\n }\n this.update(id, {\n hasInitialized: true,\n ...options\n });\n }\n };\n };\n\n /**\n * GetModuleStateManagerByTypeName\n * Get module state manager by type name.\n * @param typeName\n */\n private readonly getModuleStateManagerByTypeName = (typeName: string): IModuleStateManager => {\n const moduleStates = getModuleStates(this.props.context.actionContext);\n const moduleState = Object.values(moduleStates).find(_moduleState => _moduleState?.typeName === typeName);\n return this.getModuleStateManager((moduleState && moduleState.id) || '');\n };\n\n /**\n * Get\n * Get all module states.\n */\n private readonly get = (): IModuleStates => {\n return getModuleStates(this.props.context.actionContext);\n };\n\n /**\n * Update\n * Update module state.\n * @param id\n * @param value\n */\n private readonly update = (id: string, value: Partial<IModuleState>): void => {\n // Console.log('withModuleState - update', id, value);\n const modules = this.get();\n if (!modules[id]) {\n this.props.telemetry.error(`withModuleState update() - Module state with id ${id} is not found.`);\n return;\n }\n modules[id] = {\n ...modules[id]!,\n ...value\n };\n };\n\n private readonly _validateLeaf = (id: string, source: Partial<IModuleState>): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n return false;\n }\n return isMatch(module, source);\n };\n\n private readonly _validateContainer = (\n id: string,\n source: Partial<IModuleState>,\n allMatched?: boolean,\n skipSkippableItem?: boolean\n ): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n // Module doesn't has module state\n return !!allMatched;\n }\n\n if (skipSkippableItem && (module.status === 'disabled' || module.status === 'skipped')) {\n // Skip disabled or skipped modules\n return !!allMatched;\n }\n\n // It is leaf module\n if (!module.childIds || module.childIds.length === 0) {\n return this._validateLeaf(id, source);\n }\n\n let childIds = module.childIds;\n\n if (this.props.context.app.config.shouldEnableSinglePaymentAuthorizationCheckout) {\n // For new checkout flow, we bypass the isReady check for payment section container to enable the place order button.\n childIds = childIds.filter(childId => !this._isPaymentSectionContainer(childId));\n }\n\n // It is container module\n const method = allMatched ? 'every' : 'some';\n return childIds[method](childId => this._validateContainer(childId, source, allMatched, skipSkippableItem));\n };\n\n /**\n * Check if it is a section container with payment module.\n * @param moduleId -- The id of the module.\n * @returns If it is a section container with payment module.\n */\n private readonly _isPaymentSectionContainer = (moduleId: string): boolean => {\n if (!moduleId.includes(sectionContainerModuleId)) {\n return false;\n }\n\n const modules = this.get();\n const module = modules[moduleId];\n\n if (module && ArrayExtensions.hasElements(module.childIds.filter(childId => childId.includes(paymentInstrumentModuleId)))) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Validate\n * Validate current module and all its child module match the provided condition.\n * @param id\n * @param source\n * @param allMatched\n * @param skipSkippableItem\n */\n private readonly validate = (\n id: string,\n source: Partial<IModuleState>,\n allMatched?: boolean,\n skipSkippableItem?: boolean\n ): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n return false;\n }\n\n // It is leaf module\n if (!module.childIds || module.childIds.length === 0) {\n return this._validateLeaf(id, source);\n }\n\n // It is container module\n return this._validateContainer(id, source, allMatched, skipSkippableItem);\n };\n\n /**\n * HasExternalSubmitGroup\n * Module will use external submit group.\n */\n private readonly hasExternalSubmitGroup = (): boolean => {\n return !!this.props.enableControl;\n };\n\n /**\n * HasModuleState\n * Module is using module state manager.\n * @param id\n */\n private readonly hasModuleState = (id: string): boolean => {\n const modules = this.get();\n const module = modules[id];\n return !!module;\n };\n }\n\n return ModuleState;\n};\n\nexport default withModuleState;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IInvoiceSummaryProps {\n orderTotalLabel: string;\n invoiceLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n id: string;\n typeName: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n}\n\nexport interface IInvoiceSummaryLines {\n orderTotal: React.ReactNode;\n invoices: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IInvoiceSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\nconst InvoiceSummaryLine: React.FC<IInvoiceSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n <p className={`msc-invoice-summary__line-${cssLabel}`}>\n <span className=\"msc-invoice-summary__label\">{label}</span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className=\"msc-invoice-summary__value\"\n />\n ) : (\n <span className=\"msc-invoice-summary__value\">{toBeCalculatedText}</span>\n )}\n </p>\n );\n};\n\nconst _buildPaymentSummarySection = (\n props: IInvoiceSummaryProps,\n price: number | undefined,\n label: string,\n cssLabel: string\n): React.ReactNode => {\n return (\n <InvoiceSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nexport const InvoiceSummary = (props: IInvoiceSummaryProps) => {\n const { TotalAmount, CartLines } = props.cart;\n const invoiceLines = CartLines?.filter(cartLine => cartLine.IsInvoiceLine);\n const reactNodes: IInvoiceSummaryLines = {\n invoices: invoiceLines?.map((invoiceLine: CartLine) => {\n return _buildPaymentSummarySection(\n props,\n invoiceLine.InvoiceAmount,\n format(props.invoiceLabel, invoiceLine.InvoiceId),\n 'invoice'\n );\n }),\n orderTotal: _buildPaymentSummarySection(props, TotalAmount, props.orderTotalLabel, 'total')\n };\n\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildPaymentSummarySection(props, -loyaltyAmount, props.loyaltyLabel || 'Loyalty amount', 'loyalty');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildPaymentSummarySection(\n props,\n -giftCardAmount,\n props.giftcardLabel || 'Gift card amount',\n 'gift-card'\n );\n }\n\n reactNodes.orderTotal = _buildPaymentSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n props.orderTotalLabel,\n 'total'\n );\n }\n\n return reactNodes;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderSummaryProps {\n subTotalLabel: string;\n shippingLabel: string;\n taxLabel: string;\n orderTotalLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n totalDiscountsLabel: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n id: string;\n typeName: string;\n otherChargeLabel?: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isTaxIncludedInPrice?: boolean;\n isShowTaxBreakup?: boolean;\n customerAccountLabel?: string;\n}\n\nexport interface IOrderSummaryLines {\n subtotal: React.ReactNode;\n shipping?: React.ReactNode;\n otherCharge?: React.ReactNode;\n tax: React.ReactNode;\n orderTotal: React.ReactNode;\n totalDiscounts?: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n customerAccount?: React.ReactNode;\n}\n\ninterface IOrderSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n priceCurrency?: string;\n}\n\ninterface IShippingOrderLine {\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n canShip?: boolean;\n hasDeliveryMethod?: boolean;\n hasShippingMethod?: boolean;\n freightFee?: number;\n}\n\nconst OrderSummaryLine: React.FC<IOrderSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel,\n priceCurrency\n}) => {\n return (\n <p className={`msc-order-summary__line-${cssLabel}`}>\n <span className=\"msc-order-summary__label\">{label}</span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className=\"msc-order-summary__value\"\n currencyCode={priceCurrency}\n />\n ) : (\n <span className=\"msc-order-summary__value\">{toBeCalculatedText}</span>\n )}\n </p>\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = ''\n): React.ReactNode => {\n return (\n <OrderSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n priceCurrency={props.channelConfiguration.Currency}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computedCustomerAccountAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.customerAccountAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nconst getDeliveryConfiguration = (\n cart: Cart,\n channelConfiguration: ChannelConfiguration,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n retailMultiplePickUpOptionEnabled?: boolean,\n isTaxIncludedInPrice?: boolean,\n isShowTaxBreakup?: boolean\n): IShippingOrderLine => {\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\n const emailDeliveryModeCode = channelConfiguration && channelConfiguration.EmailDeliveryModeCode;\n const cartLines = cart.CartLines || [];\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\n const taxOnShippingCharge = cart.TaxOnShippingCharge !== undefined ? cart.TaxOnShippingCharge : 0;\n const shippingChargeAmount = cart.ShippingChargeAmount !== undefined ? cart.ShippingChargeAmount : 0;\n\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True shippingChargeAmount\n // True True shippingChargeAmount\n // True false shippingChargeAmount + taxOnShippingCharge\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n let freightFee: number | undefined = 0;\n if (isTaxIncludedInPrice === undefined || isShowTaxBreakup === undefined) {\n freightFee = cart.ShippingChargeAmount;\n } else {\n freightFee = isTaxIncludedInPrice && !isShowTaxBreakup ? shippingChargeAmount + taxOnShippingCharge : cart.ShippingChargeAmount;\n }\n const canShip = deliveryModes.some(\n deliveryMode =>\n !(\n deliveryMode !== '' &&\n (deliveryMode ===\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) ||\n deliveryMode === emailDeliveryModeCode)\n )\n );\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(\n deliveryMode =>\n !!deliveryMode &&\n deliveryMode !==\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) &&\n deliveryMode !== emailDeliveryModeCode\n );\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (\n deliveryMode?: string,\n featureSate: boolean = false,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n pickupDeliveryMode?: string\n) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n};\n\n// eslint-disable-next-line complexity\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const {\n SubtotalAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n SubtotalAmountWithoutTax,\n TaxAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n TaxOnNonShippingCharges,\n DiscountAmount = 0,\n TotalAmount,\n OtherChargeAmount\n } = props.cart;\n\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(\n props.cart,\n props.channelConfiguration,\n props.channelDeliveryOptionConfig,\n props.retailMultiplePickUpOptionEnabled,\n props.isTaxIncludedInPrice,\n props.isShowTaxBreakup\n );\n\n let reactNodes: IOrderSummaryLines;\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n if (props.isTaxIncludedInPrice === undefined || props.isShowTaxBreakup === undefined) {\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, SubtotalAmount, 'sub-total', props.subTotalLabel),\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount : undefined, 'tax-amount', props.taxLabel),\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n } else {\n const otherChargeAmount = OtherChargeAmount !== undefined ? OtherChargeAmount : 0;\n const taxOnNonShippingCharges = TaxOnNonShippingCharges !== undefined ? TaxOnNonShippingCharges : 0;\n const isTaxGreaterThanZero = TaxAmount !== undefined && TaxAmount > 0;\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True otherChargeAmount\n // True True otherChargeAmount\n // True false otherChargeAmount+TaxOnNonShippingCharges\n\n const otherChargeAmountTotal =\n props.isTaxIncludedInPrice && !props.isShowTaxBreakup ? otherChargeAmount + taxOnNonShippingCharges : otherChargeAmount;\n\n const subtotalAmountActual = props.isTaxIncludedInPrice && props.isShowTaxBreakup ? SubtotalAmountWithoutTax : SubtotalAmount;\n\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, subtotalAmountActual, 'sub-total', props.subTotalLabel),\n tax: props.isShowTaxBreakup\n ? _buildOrderSummarySection(\n props,\n hasDeliveryMethod || isTaxGreaterThanZero ? TaxAmount : undefined,\n 'tax-amount',\n props.taxLabel\n )\n : '',\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, otherChargeAmountTotal, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n }\n if (canShip) {\n reactNodes.shipping = _buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const customerAccountAmount = _computedCustomerAccountAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount - customerAccountAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n if (customerAccountAmount > 0) {\n reactNodes.customerAccount = _buildOrderSummarySection(\n props,\n -customerAccountAmount,\n 'customer-credit-amount',\n props.customerAccountLabel || 'Customer Credit amount'\n );\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n 'total',\n props.orderTotalLabel\n );\n }\n\n if (DiscountAmount > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmount, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\n};\n"],"names":["brandCodeParser","_ref","description","appContext","brandCodeTable","app","config","currentBrandCode","slice","toLowerCase","brandFound","find","brand","brandCode","brandName","calculateSavingPercentAmount","lines","total","forEach","line","Quantity","EventBusLoader","constructor","_buses","getBus","busNamespace","this","BusLoader","subscribe","deleteBus","bind","purge","_subscriptions","subName","onPublish","nextId","IdGenerator","_readyForDeletion","id","unsubscribe","_purgeById","publish","_len","arguments","length","args","Array","_key","Object","keys","idValue","Loader","LoadBus","eventNamespace","CHILD_COMP","Component","props","super","prototype","bus","render","React","assign","ownKeys","e","r","t","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","attributeCache","async","getAttributesByProductID","productIDs","context","groupedIDs","_groupBy","uncachedAttributes","uncached","ctx","callerContext","productSearchCriteria","Ids","Context","ChannelId","requestContext","apiSettings","channelId","CatalogId","catalogId","searchAsync","reduce","output","product","translatedProperties","_get","RecordId","attributes","property","FriendlyName","ValueString","fetchProductAttributes","result","cached","getAttributesForCart","cartLines","_uniq","map","ProductId","ProductType","isWine","isEvent","isGiftCard","check","DeliveryMode","_context$request$chan","request","channel","EmailDeliveryModeCode","EventDeliveryMode","isWineProduct","isMixedProduct","Number","filterInvalidCategories","refiners","categoryHierarchy","remappers","categoryRemapper","remapRecord","originalName","categoryRefinerName","newName","categoryRefiners","entry","KeyName","categoryIDs","_categoryHierarchy$0$","Children","Values","RefinerRecordId","CartOrderPriceGuide","NONSUBSCRIPTION_LE_3","NONSUBSCRIPTION_G_3","SUBSCRIPTION_LE_3","SUBSCRIPTION_GE_4_LE_5","SUBSCRIPTION_GE_6_AND_LE_11","SUBSCRIPTION_GE_12","GIFT_CARDS_ONLY","MIXED_ADD_PRICE","orderSummaryShipmentCalculation","cart","filterCartLines","subscriptionCartLength","CartUtilities","countCartLineAmountNoGiftCards","subscriptionLines","nonSubscriptionCartLength","orderSubscriptionBased","formatShipmentCalculation","cartLength","shipmentCalculationResult","price","summary","orderMixedBased","shipCostDefinition","undefined","Error","isSalesLine","productUrl","resources","primaryImageUrl","showImages","gridSettings","imageSettings","zeroAvailabilityError","intlFormatter","cultureFormatter","cartLine","data","inputQuantityAriaLabel","_updateQuantity","event","quantityOnChange","parseInt","target","value","_generateSelectMenu","quantity","currentQuantity","_props$data$product$I","_props$context$reques","shouldDisableQty","ItemId","GiftCardItemId","className","onChange","disabled","nodes","i","_generateMenu","remove","_getPriceAdjustmentPercent","Price","toFixed","_getPriceDiscount","DiscountAmountWithoutTax","DiscountLines","showDiscountPercent","NetPrice","_doubleDiscounts","DiscountCode","GiftCardFieldType","giftCardFormObj","FirstName","Key","Type","Extension","StringValue","Required","isValid","LastName","ElectronicDeliveryEmail","Attribute","ElectronicDeliveryEmailContent","_getPriceAdjustmentSavings","Description","jsxName","Name","MasterProductId","MasterProdDisplay","masterProdId","variantName","href","Image","src","altText","_generateQuantityAndPrice","priceAdjustmentSavings","productType","isOutOfStock","isQuantityEditable","maxQuantity","quantityDisplayString","tabIndex","formatCurrency","_getCartLineComment","Comment","_renderGiftCardPrompt","IsGiftCardLine","giftCardFormField","setGiftCardFormField","useState","formFieldsDebounce","setFormFieldsDebounce","useEffect","setFormFieldState","unhydratedCartLineLoad","field","fieldState","ExtensionProperties","extension","_extension$Key","_fieldState$Key","prevState","_property$Value","Value","giftCardValidation","giftCardFormIsValid","trim","RegExp","test","cartLineErrors","LineId","delayDebounceFn","setTimeout","updateFormFieldToCartLine","ItemTaxGroupId","cartLineOnChange","actionContext","cartState","clearTimeout","handleChange","name","type","ElicitAmountSelector","constProps","_this$props$cart","_this$bus","_this$bus2","_this$bus3","_setQuantity","debounce","_upQuantity","_downQuantity","_onQuantityChange","_postValidateQuantity","isSubLine","_trackedTotal","reaction","_this$props$cart2","_this$props$cart3","CartLines","_this$props$cart4","unrelatedLines","cartLineId","countCartLineAmount","delta","state","quantityState","onClick","onBlur","_canAddMore","_this$bus4","setState","_this$bus5","_ref2","_this$bus6","_updateQuantityRaw","__decorate","observable","observer","num","_isWineProduct","productId","_getKitDescription","productAttributes","attribute","TextValue","_props$productAttribu","RichTextComponent","text","key","isLineSubscriptionLine","percentSaving","isFinite","TotalAmount","prodName","componentDidMount","masterProductInput","SelectedVariantInput","getSelectedVariant","then","masterProduct","catch","console","error","ProductLightbox","_handleKeyDown","focusable","document","getElementById","elements","querySelectorAll","firstFocusable","lastFocusable","ctrlKey","altKey","focus","9","shiftKey","keyCode","onMessage","isTrusted","origin","window","iframeSrcObj","URL","iframeSrc","url","cartInput","GlobalStateInput","BaseCartState","newCart","getCartState","update","refreshCart","_divTabIndexChange","divElement","getElementsByTagName","style","display","setAttribute","_closeModal","isOpen","_openModal","innerRef","addEventListener","lightboxClassName","iframeClassName","iframeId","_launchLightboxButton","buttonText","Modal","fade","horizontalPosition","verticalPosition","zIndex","toggle","applicationNode","onLoad","_this$innerRef$curren","current","ref","ModalHeader","ModalBody","width","height","title","Button","qtyAddedToCart","renderAttribute","renderPrice","clubPrice","classnames","replace","ProductComponent","msdyn365Commerce","createComponentOverride","component","_product$ItemId","savingsText","freePriceText","originalPriceText","currentPriceText","ratingAriaLabel","typeName","parentProps","checkoutState","subscriptionBtnText","displayQuantitySlider","showPrice","showStarRating","launchLightboxButtonText","productLightboxHref","productLightboxWidth","productLightboxHeight","productLightboxClassName","productLightboxIframeClassName","cardBanner","recordId","productLightboxProps","domainUrl","urlParts","split","indexOf","_getEndpoint","requestUrl","toString","tastingNotes","appellation","banner","AttributeValues","ariaLabel","imageProductClass","getProductPageUrlSync","imageUrl","PrimaryImageUrl","giftCardImage","img","imageProps","loadFailureBehavior","renderProductPlacementImage","AcclaimRatingsDisplay","productID","numberToShow","showReviewer","showDate","renderAcclaim","avgRating","totalRatings","numRatings","RatingComponent","ratingCount","readOnly","renderRating","AverageRating","TotalRatings","renderProductLightboxButton","ProductComponentWrapper","_this","_generateQuantityControl","showAsDropdown","max","disable","cartMessage","_decreaseCartQuantity","_increaseCartQuantity","_onClickAddToCart","_onClickAddToSubscription","addToCartSubId","finishAddToCartSubId","componentWillUnmount","_this$props$availabil","_this$props$availabil2","_this$props$availabil3","_this$props$clubPrice","bottleSize","outOfStock","availability","AvailableQuantity","outOfStockThreshold","showQuantityAsDropdown","quantityControl","giftCardText","CustomerContextualPrice","hidden","htmlFor","addToCart","addToCartText","addToCartMessage","_isAdditionInvalid","disableQuantitySlider","cartQty","TotalItems","amount","elicitAddItemIdToCart","onAddToCartAction","mixedCart","item","_this$bus7","_this$bus8","_this$props$cart5","_this$props$cart6","elicitAddSubscriptionItemIdToCart","onSubscribeAction","_this$props$cart7","cartQuantity","maxAdditionLimit","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","cartline","openDialog","alreadySelectedLocation","InventoryLocationId","FulfillmentStoreId","onLocationSelected","orgUnitLocation","_onLocationChangedCallback","updateCartLinePickupLocation","location","status","Promise","resolve","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","orgUnitLocations","foundLocation","OrgUnitName","deliveryOptions","DeliveryOptions","pickupDeliveryModeCode","option","Code","callbacks","toggleBopis","defaultComponent","_renderShippingMethod","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","checked","shipitText","pickUpInStoreText","ContainerProps","_getCartItemMaxQuantity","maxCartlineQuantity","isStockCheckEnabled","productAvailability","productInCartQty","productInCart","_updateCartLine","updateCartLinesAsync","Id","telemetry","exception","_assembleCartlines","cartlines","products","reactNodes","productTypeInit","isMixedCart","index","_cartline$ItemId","_props$context$reques2","_getProduct","foundProductAvailability","foundProductDeliveryOption","productAvailabilites","productDeliveryOptions","deliveryOption","mixedCartLines","format","outOfStockError","_assembleNode","foundProductDeliveryOptions","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToWishlistButtonText","removeFromWishlistButtonText","wishlists","defaultWishlistName","isAuthenticated","user","nameOfWishlist","onRemoveClickHandler","SmweCartLine","templatePercentSavingText","templateSavingText","getProductUrlSync","updateCartLinesQuantitySuccessHandler","productAttributesList","pickUpInStore","pickitUpText","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","onSuccess","ElicitCartLineItems","ElicitSubscriptionHeader","_name","SubscriptionCommerceValues","SUBSCRIPTION_DEFAULT_NAME","_onFrequencyChange","_onNameChange","_onNameBlur","_publishNameChange","_this$props$cart$resu","_this$props$cart$resu2","values","getSubscriptionValues","_selectedFrequency","frequencyTable","freq","freqId","frequency","wineBottleSummaryCount","deliveryText","savingText","savingLabel","boxNamePlaceholder","subState","subLines","formatter","countCartLineNetPrice","discountedTotal","countCartLineDiscountedPrice","totalBottles","futureSavings","savings","savingFormatted","placeholder","_frequencyTable","initialId","_this$_selectedFreque","firstId","_frequencyTable$find","_this$_selectedFreque2","freqLabel","updates","cartChanges","change","updateSubscription","_pushUpdateToCart","SUBSCRIPTION_NAME","_this$props$frequency","frequncy","_submitSubscriptionToCart","SUBSCRIPTION_FREQUENCY","OrderSummaryLine","label","toBeCalculatedText","freeText","cssLabel","PriceComponent","_buildOrderSummarySection","_computedLoyaltyAmount","loyaltyAmount","OrderSummary","TaxAmount","canShip","hasDeliveryMethod","hasShippingMethod","freightFee","getDeliveryConfiguration","channelConfiguration","PickupDeliveryModeCode","deliveryModes","count","ChargeLines","chargeTotal","chargeLine","IsShipping","CalculatedAmount","some","deliveryMode","shippingPrice","subtotal","subTotalLabel","tax","taxLabel","orderTotal","orderTotalLabel","shipping","shippingLabel","shipmentWarningText","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCards","giftCardCounter","giftCard","Balance","Math","min","totalAmountAfterGiftCard","loyalty","loyaltyLabel","giftcardLabel","totalDiscounts","totalDiscountsLabel","ElicitPromoCode","_onInputChange","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","promoCode","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","onSubmit","preventDefault","_removePromotion","code","currentTarget","getAttribute","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_calculateDiscount","discountAmount","discountLine","DiscountCost","_renderAppliedPromoCode","Coupons","appliedPromoCodeHeadingText","appliedPromoCodeSubheadingText","coupon","removePromoAriaLabelFormat","removePromoText","isCollapseOpen","promoCodeHeadingText","ElicitPromoCodeComponent","createComponent","ElicitSubscriptionUpsell","savingRatioAmount","savingRatio","showUpsell","upsellPercent","upsellBottleCount","_renderUpsellCTA","editSubscriptionLink","link","linkUrl","destinationUrl","linkText","ElicitCart","cartLinesInvalid","parsedProductAttributes","usePNGImageSetting","viewports","_modifiedViewports$xs","_modifiedViewports$sm","_modifiedViewports$md","_modifiedViewports$lg","_modifiedViewports$xl","modifiedViewports","xs","q","sm","md","lg","xl","_getImageSettings","w","h","lazyload","_removeItemFromCartHandler","cartlineToRemove","_generateRemovalAnalyticsEvent","input","cartLineIds","removeCartLines","warning","debug","_moveToWishlistSuccessHandler","_updateCartlineQuantity","cartlineToUpdate","newQuantity","updateCartLineQuantity","_updateSubscriptionName","modifiedImageSettings","_displaySummary","all","_setProductAttributes","_generateCheckoutAnalyticsEvent","_cart$cart$CartLines","_this$props$data$cart","_this$props$data$cart2","signInUrl","routes","guestCheckoutUrl","getUrlSync","backToShoppingUrl","backToShopping","checkoutURL","_getCheckoutURL","isCartEmpty","_contextualLines","isCartREALLYEmpty","isAllCartEmpty","elicitCartItemProps","elicitCart_subscriptionLinePercentSavingText","elicitCart_subscriptionSavingText","enableStockCheck","maxQuantityForCartLineItem","sizeString","elicitCart__productDimensionTypeSize","colorString","elicitCart__productDimensionTypeColor","configString","styleString","elicitCart__productDimensionTypeStyle","elicitCart__quantityDisplayText","elicitCart__inputQuantityAriaLabel","discountStringText","elicitCart__discountStringText","elicitCart__originalPriceText","elicitCart__currentPriceText","shippingChargesText","elicitCart__shippingCharges","elicitCart__addToWishlistButtonText","elicitCart__removeFromWishlistButtonText","elicitCart__removeCartButtonText","elicitCart__shipInsteadDisplayText","elicitCart__pickItUpDisplayText","elicitCart__changeStoreDisplayText","elicitCart__defaultWishlistName","invalidProductError","elicitCart__invalidProductError","elicitCart__outOfStockError","elicitCart__zeroAvailabilityError","viewProps","_title","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","elicitCart__promoCodeHeadingText","elicitCart__promoPlaceholderText","elicitCart__promoCodeApplyButtonText","elicitCart__appliedPromoCodeHeadingText","elicitCart__appliedPromoCodeSubheadingText","collapseTimeOut","elicitCart__removePromoAriaLabelFormat","elicitCart__removePromoText","elicitCart__invalidPromoCodeErrorText","elicitCart__failedToAddPromoCodeErrorText","elicitCart__failedToRemovePromoCodeErrorText","elicitCart__duplicatePromotionErrorText","orderSummaryHeading","elicitCart__orderSummaryTitle","orderSummaryLineitems","elicitCart__itemsWithCountLabel","elicitCart__estimatedShippingLabel","elicitCart__estimatedTaxLabel","elicitCart__orderTotal","elicitCart__totalDiscountsLabel","elicitCart__yetToBeCalculatedText","elicitCart__priceFree","checkoutAsSignInUserButton","elicitCart__checkoutButtonTitle","checkoutAsGuestButton","elicitCart__guestCheckoutButtonTitle","backToShoppingButton","elicitCart__backToShoppingButtonTitle","storeSelector","slots","waitingComponent","Waiting","cartLoadingStatus","elicitCart__cartLoadingErrorMessage","cartDataResult","_useForSubscriptions","checkoutButtonDisabled","cartLineStatus","subscriptionHeader","elicitCart_subscriptionDeliveryText","elicitCart_subscriptionSavingLabel","elicitCart_subscriptionWineBottleSummaryCount","elicitCart__editBoxNamePlaceholder","subscriptionUpsell","shouldShowCheckoutInline","_shouldShowCheckoutInline","renderView","_this$props$data$cart3","isAbsoluteUrl","returnURL","_this$props$data$cart4","useForSubscriptions","displaySummary","_this$props$data$prod","_this$props$data$cart5","isSubscription","subscription","_this$props$data$cart6","_cart$cart$CartLines2","_cart$cart$Coupons","subFrequency","mappedProducts","discounts","step","join","_this$props$data$cart7","entries","productAttribs","CommerceAttributesParser","unParseAttributes","_this$props$data$cart8","_this$props$data$cart9","elicitCart__subCartTitle","elicitCart__cartTitle","_faqLink$linkUrl","preventCheckout","lineId","_isInvalidCart","faqLink","renderModuleAttributes","Node","Alert","color","assertive","elicitCart__mixModeCartError","cartEmptyText","elicitCart__emptyCartText","itemsTitle","elicitCart__itemsTitle","qtyTitle","elicitCart__qtyTitle","unitPriceTitle","elicitCart__unitPriceTitle","totalTitle","elicitCart__totalTitle","scope","openInNewTab","role","rel","_renderOrderSummarylines","orderSummaryLines","elicitCart__conditionsText","_renderCartlines","ChoiceSummary","closeButtonGlyph","_onClick","stopPropagation","clearAll","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedChoices","_getKeyForRefinerValue","clearAllText","classNames","choiceAriaLabel","items","selectedRefinersMap","listItemProps","urlBuilder","productRefinerValue","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","isMatchingRefinementCriterion","DataTypeValue","ProductRefinerValueDataTypeValue","Range","RangeInput","_formatPrice","LeftValueBoundString","UnitText","RightValueBoundString","LeftValueBoundLocalizedString","currency","trace","priceAmount","locale","Intl","NumberFormat","currencyDisplay","minimumFractionDigits","selected","innerText","computed","Link","ProductSearchResultItems","moduleType","moduleId","availibity","ProductCard","elicitSubscriptions_buyboxSubscriptionBtnTxt","priceFree","addToBoxMessagePlp","Title","Separator","separator","ModalToggle","SearchResultModal","modal","modalNode","modalHeader","modalHeaderNode","modalFooter","modalFooterNode","modalBody","autoFocus","returnFocusRef","returnRef","onModalToggle","modalTitle","ModalFooter","modalCloseButtonText","ErrorMessage","RangeRefineItem","_formattedPriceReverseLookup","Map","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","isChecked","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","parentProductRefinerHierarchy","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onFocus","maxLabel","placeholderTextMax","sliderId","ariaAttributes","minPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","isSelecting","rangeStart","rangeEnd","selectedMaxValue","maxTouched","minNum","touched","validationError","validationErrorRange","formatPrice","has","set","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","tooltip","RefineItem","anchorType","_this$props","children","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","RefinerTypeValue","ProductRefinerTypeValue","Single","itemTypeClassName","SourceValue","ProductRefinerSource","Rating","_getRefinerUrl","hideCount","moduleTypeName","Count","RefineSubmenu","isMinimizedRefiner","_onToggleItem","_onToggleSubmenu","_expandCategoryRefiner","isExpanded","isExpandedOnInitialLoad","productRefinerHierarchy","expanded","minimizedRefiners","minimizedRefinersList","keyName","toLocaleLowerCase","findMatchingRefinementCriterion","selectedRefinerValues","parseFloat","_renderChildItems","Collapse","timeout","_renderRange","_renderSingleMultiSelect","listItems","_getSortedValueList","child","refinerExpandText","tempRangeTypeTODO","itemToggleNotification","onUpdateRefiners","sortedList","sort","nextOption","curOption","curOptionName","nextOptionName","localeCompare","dividedList","options","topLevel","highestLevelRefinerText","minimizedElement","buttonElement","textContent","refinerMinimizeText","refinementCriteria","refinementCriterion","RefinerSourceValue","getUpdatedRefinementCriteria","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","next","List","Boolean","matchingIndex","findIndex","criterion","splice","SmweSearchResultContainer","SmweSearchResultContainer_1","sortByDropdownOptions","showSortByDropdown","_pageType","urlTokens","pageType","_refinersFiltered","_initialProductResultCount","_addSortByDropdownOptions","showSortingByRelevance","sortOptions","sortByOptionRelevanceDesc","showSortingByName","sortByOptionNameAsc","sortByOptionNameDesc","showSortingByPrice","sortByOptionPriceAsc","sortByOptionPriceDesc","showSortingByRating","sortByOptionRatingDesc","_getSearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","query","category","getFriendlyName","NameTranslations","productCountNumber","productCountText","listPageState","totalProductCount","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","_listPageState$active","fullUrl","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","flipperPrevious","nextText","flipperNext","totalActiveProducts","activeProducts","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","previousAriaLabel","nextAriaLabel","_getRefineMenu","inputRange","validRefiners","refiner","activeRefiners","activeFilters","RefineMenuContainer","RefinerSectionContainer","_data$listPageState$r","highestLevelItem","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","collapseRefiners","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","searchConfiguration","mappedConfiguration","sortColumn","_sortCriteria$Columns","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","dropdownOption","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","_viewport","device","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","querySorting","sorting","parse","decodeURIComponent","pageSize","hydrateRefinersFromUrl","refinerRemappers","_getProductavailabilty","_emitImpressionEvent","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","itemId","getCollectionProducts","productResults","nameTranslations","nameTranslation","Language","Text","removeEventListener","paragraph","showPagination","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","passedProps","productsComponent","_shouldDisableQuantityAddition","_subscriptionQuantityLimit","categoryDescription","_getCategoryDescription","searchResultContainerViewProps","TitleViewProps","refineMenu","SearchResultContainer","moduleProps","sortByOptions","showSortBy","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","isMobile","errorMessage","_getViewport","MsDyn365","isBrowser","innerWidth","quantityLimit","filteredLines","checkoutCart","_availabilityAll$Prod","productIds","formattedResponse","getEstimatedAvailabilityAsync","ProductIds","DefaultWarehouseOnly","ProductWarehouseInventoryAvailabilities","PhysicalAvailable","_this$props$data$cate","impressions","getParsedAttributes","list","createSearchResultModal","modalProps","createModalBody","renderSort","renderRefiner","submenu","renderTitle","showResultPrefix","categoryNamePrefix","renderTitleCount","showRefiners","showResultCount","Module","getQuantityError","stockLeft","errorMessageOutOfStock","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","getGenericError","failureReason","addedToCartFailureMessage","cartActionResult","maxQuantityForLineItem","maxQuantityLimitText","mixedCartErrorText","getConfigureErrors","dimensions","dimension","DimensionTypeValue","dimensionTypeValue","productDimensionTypeColorErrorMessage","productDimensionTypeConfigurationErrorMessage","productDimensionTypeSizeErrorMessage","productDimensionTypeStyleErrorMessage","getDimensionErrorString","getBuyboxProductTitle","titleHeadingTag","Heading","headingTag","getBuyboxProductDescription","getBuyboxAddToCart","shouldNavigateToCart","productTypeAttribute","displaySubscription","errorState","configureErrors","quantityError","otherError","errorHost","selectedProduct","onAddToCartFailed","updateErrorState","missingDimensions","emailDeliveryModeCode","keyedInPrice","cartText","smweBuybox__subscriptionBtnText","button","AddToCart","useElicitAddToCart","useForElicit","isSubscriptionItem","outOfStockText","navigationUrl","onError","getSelectedProduct","errorBlock","BuyboxErrorBlock","showError","getBuyboxProductPrice","productPrice","getBuyboxProductRating","ratingsSummary","ratingComponent","averageRating","averageRatingAriaLabel","reviewsCount","getBuyboxProductAddToWishlist","addToWishlistMessage","removedFromWishlistMessage","addItemToWishlistError","removeItemFromWishlistError","getBuyboxProductQuantity","_state$productAvailab","newValue","updateQuantity","showQuanatityAsDropdown","LabelContainerProps","heading","productQuantityHeading","errors","currentCount","onchange","errorMessages","message","buyboxErrorMessageHeader","getBuyboxFindInStore","dataProduct","Dimensions","DimensionValue","addProductToCart","findInStoreOnClick","openFindInStoreDialog","findInStoreHeaderText","findInStoreDescriptionText","findInStoreLinkText","Dropdown","selectMenu","_onChanged","selectedIndex","selectId","selectedValue","dropdownList","dropdownName","dropdownToggleName","getBuyboxProductConfigure","productDimensions","getDropdownName","onChanged","dimensionSelectedAsync","dropdowns","productDimensionFull","_mapProductDimensionFullToDropdownViewProps","dimensionChanged","dropdownCallback","selectDimensionFormatString","DimensionValues","dimensionValue","select","SmweBuybox","buyboxCallbacks","newErrorState","updateSelectedProduct","newSelectedProduct","selectedDimensionId","selectedDimensionValueId","_dimensionSelected","dimensionType","_getDropdownName","selectedDimensionValue","selectedDimensions","newSelectedDimensions","mappedDimensions","_updateDimensionValue","reject","newProduct","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","newValueId","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeSize","productDimensionTypeStyle","_updateProductAvailability","delay","_data$cart$result","productSpecificationData","categories","_getCurrentCategory","_productTypeAttribute","mediaGallery","productApellation","content","productTitle","productClubPrice","acclaimRatings","cookbookTagline","productDescription","eventSchedule","attributeList","canAddToCartAttribute","show","BooleanValue","ModuleProps","ProductInfoContainerProps","MediaGalleryContainerProps","configure","findInStore","subscriptionButton","_showSubscriptionButton","rating","availableQuantity","isProductSubscribable","qtyInCart","getProductAvailabilitiesForSelectedVariantAction","createProductAvailabilitiesForSelectedVariantInput","clonedProductAvailability","UnitOfMeasure","categorySlug","_getCategorySlug","toJS","shift","Slug","concat","sliceIndexes","currentUrl","pathname","suffix","_renderTable","tableClass","Table","borderless","responsive","size","_renderQuantity","_renderAddToCart","_props$data$product$r","contentSlotData","CartLineItems","PromoCode","PromoCodeComponent","Cart","getNotificationMessage","createNotificationMessage","messagetype","NotificationType","success","_this$props$config$ba","_routes$backToShoppin","backToShoppingOverride","cartTitle","quantityDisplayText","shippingCharges","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","duplicatePromotionErrorText","orderSummaryTitle","itemsWithCountLabel","estimatedShippingLabel","estimatedTaxLabel","yetToBeCalculatedText","checkoutButtonTitle","guestCheckoutButtonTitle","backToShoppingButtonTitle","cartLoadingErrorMessage","isEmpty","mixModeCartError","emptyCartText","conditionsText","ariaSetSize","ariaPosInSet","CheckoutDeliveryOptions","selectedItemId","isLoading","init","moduleState","onEdit","onCancel","loadDeliveryOptions","getCartLinesForShipping","getDeliveryOptionSelected","selectedItem","DeliveryOption","DescriptionComponent","getErrorMessage","errorMessageTitle","CheckoutDeliveryOptionsError","ErrorTitleComponent","ErrorMessageComponent","getDeliveryOptionList","radioButton","RadioButtonComponent","onDeliveryOptionChange","getSaveButton","saveBtnLabel","onSave","getEditButton","editBtnLabel","getCancelButton","cancelBtnLabel","setError","setHasError","onUpdating","clearError","_this$props$data$chec","information","checkout","updateShouldCollapsePaymentSection","newShouldCollapsePaymentSection","_this$props$data$chec2","updateCartDeliverySpecification","savedDeliveryOption","getSavedDeliveryOption","_this$props$data$chec3","onReady","cartLinesForShipping","deliveryModeId","updateCartDeliverySpecificationInput","shippingAddress","onPending","response","genericErrorMessage","getDeliveryOptions","cartId","getDeliveryOptionsAsync","queryResultSettings","deliveryOptionsNotFound","_this$props$data$chec4","_this$props$data$chec5","setIsCancellable","isReady","isUpdating","hasError","isError","isShowList","isShowSelected","deliveryOptionsData","errorMessageData","viewState","isShowSaveButton","hasExternalSubmitGroup","isShowEditButton","isShowCancelButton","classname","DeliveryOptionsList","deliveryOptionSelected","waiting","saveButton","editButton","cancelButton","action","withModuleState","DeliveryOptionList","globalConfig","pennyShippingMethodIds","pennyShippingIds","modShippingMethodIds","modShippingIds","localList","combinedList","a","b","ShippingChargeAmount","deliveryData","isModShippingMethod","modShipping","isPennyShippingMethod","pennyShipping","DeliveryOptionSelected","_ref3","getInvoicePaymentSummary","totalAmountLabel","invoiceLabel","invoiceSummaryTitle","hasInvoiceLine","InvoiceSummary","getLineItems","telemetryContent","_featureState$result","subscriptionLineItems","channelDeliveryOptionConfig","featureState","retailMultiplePickUpOptionEnabled","feature","IsEnabled","_getDeliveryLocation","locationMatch","OrgUnitNumber","_getLineItemComponent","_product","showShippingChargesForLineItems","productDimensionTypeAmount","_cartLine$CatalogId","searchParams","CartLineItemComponent","amountString","_getPickUpAtStoreComponents","pickupDeliveryLocation","pickUpAtStoreWithLocationText","PickUpAtStore","_getEmailDeliveryComponents","emailDeliveryText","EmailDelivery","_getLineItemsComponents","isPickUp","_getCartPickDeliveryMode","isEmailDelivery","LineItem","pickUpAtStore","emailDelivery","cartLineItem","_channelDeliveryOptio","StringExtensions","isNullOrWhitespace","PickupDeliveryModeCodes","_countItems","_filterItemsByDiliveryType","_channelDeliveryOptio2","_getLineItemsByDeliveryType","_getGroupTitleComponent","_input$data$deliveryO","itemLabel","itemsLabel","inStorePickUpLabel","shippingCountCheckoutLineItem","emailDeliveryModeDesc","_productDeliveryOptio","nonSubscriptionItems","subscriptionItems","subLine","SUBCRIPTION_LINE","_item$ExtensionProper","LineItemDeliveryGroup","LineItemList","lineItems","handleLineItemHeadingChange","lineItemsHeading","_getLineItemsByDeliveryTypeWithMulitplePickupMode","multiplePickUpLabel","shippingLable","_filterItemsByMultiplePickupMode","getGroupByStorePickup","groupBy","groupDelivery","cartLinesGroup","cartLinesGrp","groupByDeliveryType","lineItemDeliveryGroup","_getGroupTitleComponentWithMultiplePickUp","fulFillmentStoreId","_input$data$deliveryO2","_input$data$deliveryO3","pickupDeliveryModeDesc","_productDeliveryOptio2","_productDeliveryOptio3","groupTitle","iconClass","lineItemWraperIcon","lineItemWraper","_getLineItems","editCartText","payLoad","getPayloadObject","TelemetryConstant","EditCart","getTelemetryAttributes","groupClass","LineItems","Header","editProps","editLink","itemsForPickup","itemsForShip","itemsForSubscription","itemsForEmail","itemsGroupWithMulitplePickupMode","getOrderSummary","otherCharges","showLineItems","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","orderSummaryProps","otherChargeLabel","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","CheckoutGuidedCard","editButtonRef","formCardRef","renderFooder","isVisted","isSubmitting","isCancelAllowed","hasControlGroup","resource","saveAndContinueBtnLabel","canSubmit","canCancel","contentAction","etext","Save","SaveContinue","saveBtnAttributes","Cancel","cancelBtnAttributes","focusOnFirstFocusableElement","node","querySelector","focusOnEditButton","scrollToTitle","formCard","scrollIntoView","getTitle","Tag","componentDidUpdate","prevProps","isActive","onNext","isPending","hasInitialized","changeBtnLabel","CheckoutChange","changeBtnAttributes","canEdit","active","closed","visted","initialized","ready","updating","CheckoutGuidedForm","currentStep","getEnabledModules","childIds","getModule","childId","getStep","getId","getHeading","isEditor","_emitAnalyticsEvent","hasShippingAddress","hasCartDeliveryMode","hasGuestCheckoutEmail","isTermsAndConditionAccepted","_state$childIds","ArrayExtensions","hasElements","currentId","includes","shouldCollapseAfterRedirect","isPaymentVerificationRedirection","shouldEnableSinglePaymentAuthorizationCheckout","hasMissingInfo","hasOrderError","hasModuleState","GuidedCard","disableGuidedCheckoutFlow","enableControl","_cart$Coupons","buttonsStates","onPlaceOrderHandler","isBusy","canPlaceOrder","placeOrder","buttonSetState","checkoutBtnText","isPlaceOrderLoading","isExpressCheckoutApplied","setIsBusy","payload","TelemetryEvent","Purchase","lineItemIdsToRemove","getCheckoutState","activeCart","activeCartLine","checkoutCartLine","removeAllPromoCodes","removeCheckoutCartId","OPERATIONS","getCardTypeId","cardPrefix","resolveCardTypesAsync","CardType","Unknown","TypeId","findTenderIdTypeByOperationId","tenderTypes","operationId","matchedTenderType","tenderType","OperationId","TenderTypeId","roundNumber","updatedCartVersion","giftCardExtends","tokenizedPaymentCard","guestCheckoutEmail","billingAddress","cardPaymentAcceptResult","isExpressAddressApplied","Currency","cartTenderLines","amountDue","AmountDue","getTenderLinePromises","loyaltyCardNumber","LoyaltyCardId","chargedAmount","loyaltyTenderLinePromise","Amount","getTenderTypesAsync","getLoyaltyTenderLine","giftCardExtend","_giftCardExtend$Expir","_giftCardExtend$Expir2","tenderTypeId","giftCardPin","Pin","giftCardExpirationYear","ExpirationDate","giftCardExpirationMonth","creditCardTenderLinePromise","GiftCardId","GiftCardPin","GiftCardExpirationYear","GiftCardExpirationMonth","getGiftCardTenderLine","customerAccountAmount","customerAccountTenderLinePromise","CustomerId","createCustomerAccountTenderLine","TokenizedPaymentCard","House","Phone","Country","ThreeLetterISORegionName","Address1","Street","City","State","Zip","ZipCode","CardPaymentAcceptResult","getCreditCardTenderLineForSinglePaymentAuth","_tokenizedPaymentCard","cartTypeId","CardTypeId","TenderType","cardTenderLine","CardTokenInfo","getCreditCardTenderLine","cartVersion","Version","salesOrder","checkoutAsync","bypassCache","_error$data","_error$data2","_cardPaymentAcceptRes","AdditionalContext","updateRedirectAdditionalContext","newRedirectAdditionalContext","updateRedirectPaymentConnectorId","newRedirectPaymentConnectorId","Settings","PaymentConnectorId","updateIsCheckoutCallFailed","newIsCheckoutCallFailed","updateIsExpressCheckoutApplied","newIsExpressCheckoutApplied","Checkout","isValidationPassed","getTelemetryObject","telemetryPageName","friendlyName","handleCheckoutHeadingChange","checkoutHeading","cartStatus","isEmptyCart","getSlotItems","redirectToCartPage","notFoundEditCartLinkMessage","editCartLink","triggerPaymentWithPlaceOrder","updateShouldTriggerPaymentWithPlaceOrder","newShouldTriggerPaymentWithPlaceOrder","shouldTriggerPaymentWithPlaceOrder","onPlaceOrder","checkoutOutOfStockErrorMessage","invalidCartVersionErrorMessage","missingRequiredCartTenderLinesErrorMessage","orderConfirmation","isWineClubCheckout","_setWineClubDeliveryOption","isOverMaxQuantity","_cartState$cart$CartL","_this$props$config$or","_checkout$result","hasOrderConfirmation","giftCardLines","updateCartLineEmailAddress","orderConfirmationLinkOverride","orderConfirmationOverride","orderedProducts","redirect","overrideConfirmationLink","emptyActiveCart","orderConfirmationUrl","updateSalesOrder","newSalesOrder","newOrderedProducts","_this$props$data$chec6","updateIsPaymentSectionContainerReady","newIsPaymentSectionContainerReady","_this$props$context$r","_this$props$data$chec7","emailDeliveryCartLines","lineDeliverySpecifications","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","DeliveryPreferenceType","ElectronicDelivery","ElectronicDeliveryEmailAddress","newGuestCheckoutEmail","updateLineDeliverySpecificationsAsync","updatedCart","_this$props$context$r2","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","productInventoryInformation","_cart$CartLines","_cart$CartLines2","productsThatShouldValidateInventory","_cartlineProduct$Beha","cartlineProduct","isStockedItem","Behavior","IsStockedProduct","productInventory","_productInventory$Pro","ProductAvailableQuantity","cartLinesInventoryValidation","validateCartLinesInventory","getActiveChildModuleStates","onContainerReady","validateForCheckout","_this$props$data$feat","_this$props$context","retry","isOrderQuantityLimitsFeatureEnabledInHq","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","validateForCheckoutAsync","_result$ValidationFai","ValidationFailuresByCartLines","_this$props$data$chec8","refreshError","subscriptions","_setDefaultSubscriptionFields","_this$props$data$chec9","_this$props$data$chec10","isEditorialMode","_this$props$data$chec11","params","_this$props$data$chec12","_this$props$data$chec13","_this$props$data$chec14","_this$props$data$chec15","_this$props$data$chec16","wineClub","wineClubSetup","ids","club","variants","variant","_this$props$data$chec17","when","_isCartValidAsClub","isCartReady","_this$props$data$chec18","isPaymentSectionContainerReady","_this$props$data$chec19","_this$props$data$chec20","_this$props$data$chec21","_this$props$data$chec22","redirectAdditionalContext","isPaymentVerificationRequired","_this$props$data$chec23","isPaymentSectionContainerHasError","_this$props$data$chec24","_this$props$data$chec25","_this$props$data$chec26","updateIsPlaceOrderEnabledInRedirection","newIsPlaceOrderEnabledInRedirection","_this$props$data$chec27","_this$props$data$chec28","_this$props$data$chec29","_this$props$data$chec30","_this$props$data$chec31","_this$props$data$chec32","_this$props$data$chec33","_this$props$data$chec34","_this$props$data$chec35","_this$props$data$chec36","_this$props$data$chec37","_document","_this$props$data$chec38","placeOrderText","confirmPaymentText","cookieConsentRequiredMessage","checkoutClass","checkoutInformation","isConsentGiven","cookies","termsAndConditions","BackToShopping","backToShoppingAttributes","hasExpressPaymentContainer","getElementsByClassName","hasSalesOrder","checkoutProps","headerProps","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","termsAndConditionsProps","renderMsdyn365Text","alert","AlertComponent","loading","_this$props$data$chec39","_this$props$data$chec40","canShow","guidedForm","GuidedFormComponent","orderSummary","invoicePaymentSummary","placeOrderButton","PlaceOrderButtonComponent","keepShoppingButton","lineFind","_clubItemIds","clubItemId","deliveryOptionInput","wineClubDeliveryOption","defaultSubscriptionFrequencyId","PickUpAtStoreComponent","EmailDeliveryComponent","LineItemComponent","LineItemGroupComponent","_ref4","lineItem","LineItemGroupComponentWithMultiplePickUp","_ref5","LineItemComponentWithMultiplePickUp","_ref6","PickUpAtStoreComponentWithMultiplePickUp","_ref7","LineItemsComponent","_ref8","OrderSummaryComponent","_ref9","otherCharge","PaymentSummaryComponent","_ref10","invoices","layout","HeadingTag","SingleSlideCarousel","carouselSize","slideSize","itemSize","_onResized","_onCarouselResized","_nextSlide","_previousSlide","_handleTouchStart","_handleTouchEnd","_onFocus","showPrevious","showNext","offset","activeItem","slideRef","itemRef","direction","parentId","scrollThreshold","touchScrollThreshold","carousel","slide","_setSizes","_updateFlippers","vertical","resizeThrottledEventHandler","addThrottledEvent","isVert","slidePositionStyle","modifiedChildren","_getClonedChildren","carouselClass","carouselSlideClass","overflowClass","previousFlipperGlyph","nextFlipperGlyph","previousFlipperClassName","nextFlipperClassName","disableClassName","onTouchStart","onTouchEnd","Flipper","glyphProps","flipperPrevLabel","displayTooltip","useTabList","flipperNextLabel","castChild","verticalItemsSelector","itemsSelector","_moveSingleSlide","evt","touches","scrollStart","screenY","screenX","changedTouches","_setActiveItem","abs","round","currentOffset","getCSS","maxScrollCount","floor","directionModifier","maxScrollDistance","distanceToEdge","scrollHeight","scrollWidth","_calculateCarouselSize","carouselStyle","getComputedStyle","padding","paddingTop","paddingBottom","paddingLeft","paddingRight","clientHeight","clientWidth","_canScrollPrevious","_canScrollNext","_scrollItemIntoView","offsetTop","offsetLeft","updateOffset","left","top","parentElement","scrollTop","scrollLeft","ProductCollection","_this$state$productAv","_this$state$clubPrici","clubPricing","ProductContainer","productComponent","productCollection","_this$props$config$he","_getClubPricing","isCarousel","headingComponent","productCollectionViewProps","SingleSlideCarouselComponentProps","ProductCollectionContainer","GridComponentProps","projectDomain","affiliations","affiliationId","AffiliationId","clubPricingAll","getActivePricesAsync","Date","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","addToCartTextPlp","addToCartMessagePlp","RefinePulldown","_handleClickOutsidePulldown","pulldown","pulldownElement","contains","classList","_getPulldownText","_getActiveRefinersText","spanElement","formatedActiveRefiners","substring","body","SMWEPagination","activePage","maxPages","ceil","qsps","splitUrl","secondSplit","hash","parsedQsps","qspPair","baseUrl","listClassName","cssModule","listTag","ListTag","activeQsp","paginationClasses","mapToCssModules","listpaginationClasses","_generatePageLinks","_generateUrl","page","qspUrl","_generatePaginationArrow","tooltipId","prevId","ariaDescribedBy","nextAreaDescribed","prevAreaDescribed","placement","PaginationItem","PaginationLink","previous","UncontrolledTooltip","_generatePaginationItem","_generateEllipse","leftDistance","rightDistance","leftEllipse","pagesDisplayed","rightEllipse","pages","displayedPagesOnLeft","startingIndex","endIndex","defaultProps","subMenus","pulldownRefiners","pulldownButtonText","pulldownText","renderRefinerPulldown","activeRefinersText","getActiveRefinersText","dynamicPulldownText","getPulldownText","togglePulldown","BottleCountDisplay","_maxBottleCount","_fillBottleList","_generateBottleListFromProducts","bottleList","newBottleIndex","_specializeIndex","_this$_cartFilteredLi","rollingIndex","fragments","_cartFilteredLines","subscriptionProps","_getProductFromLine","lineIdx","alt","currentIndex","subscriptionsMinicart__discount10Percent","subscriptionsMinicart__discount15Percent","_this$props$subscript","BoxEditComponent","_props$props$config$f","_popupState","_this$props$props$dat","_onBoxNameChange","_publishBoxNameChange","_togglePopup","_emptyCart","frequencyId","initialValues","_selectedFrequencyId","_contextProps$context","_ElicitCartLineItems","subscriptionsMinicart__editBoxBtn","subscriptionsMinicart__editBoxNamePlaceholder","subscriptionsMinicart_subscriptionSavingText","subscriptionsMinicart_subscriptionLinePercentSavingText","subscriptionsMinicart_emptyCartBtn","contextProps","productAvailabilities","elicitModalProps","subscriptionsMinicart__productDimensionTypeSize","subscriptionsMinicart__productDimensionTypeColor","subscriptionsMinicart__productDimensionTypeStyle","subscriptionsMinicart__quantityDisplayText","subscriptionsMinicart__inputQuantityAriaLabel","subscriptionsMinicart__discountStringText","subscriptionsMinicart__originalPriceText","subscriptionsMinicart__currentPriceText","subscriptionsMinicart__shippingCharges","subscriptionsMinicart__addToWishlistButtonText","subscriptionsMinicart__removeFromWishlistButtonText","subscriptionsMinicart__removeCartButtonText","subscriptionsMinicart__shipInsteadDisplayText","subscriptionsMinicart__pickItUpDisplayText","subscriptionsMinicart__changeStoreDisplayText","subscriptionsMinicart__defaultWishlistName","subscriptionsMinicart__invalidProductError","subscriptionsMinicart__outOfStockError","subscriptionsMinicart__zeroAvailabilityError","subscriptionsMinicart_subscriptionDeliveryText","subscriptionsMinicart_subscriptionSavingLabel","subscriptionsMinicart_subscriptionWineBottleSummaryCount","_renderFrequencies","_isCartEmpty","modalClassName","editBoxWarning","_this$props$props$dat2","_this$props$props$dat3","newFreq","_this$props$props$con","linesToRemove","lineIds","onBoxNameChange","_this$props$props$con2","onFrequencyChange","availabilityAll","CartDisplayComponent","subscriptionsProps","subscriptionsMinicart__boxPrice","subscriptionsMinicart__shipping","subscriptionsMinicart__savings","subscriptionsMinicart__goToCart","savingPercent","cartUrl","_calculateDiscountedTotalAmount","_calculateTotalAmount","SubscriptionBannerDisplayComponent","subscriptionName","SubscriptionsMinicart","_boxName","_frequencyId","run","exec","getActiveCartProductsAction","ActiveCartProductsInput","_eventId","_this$props$config$fr","renderProps","baseProps","boxName","subscriptionBannerDisplayComponent","editBoxComponent","bottleCountComponent","cartDisplaySummaryComponent","_props$data$product","_props$slots","productCollectionSlotData","_props$checkoutState","_props$checkoutState2","cartRequirements","shippingState","allowedShippingMethodIds","shipmentMethodTiers","allowedShippingMethod","shippingMethodId","shippingMethodConfigError","cartItem","group","nonSubscriptionHeader","_data$checkout$result","_data$checkout$result2","unselectable","_renderQuantityHeader","validateCartAsync","propsContext","cartResult","shouldRetry","AsyncResult","_validationResult$Val","validationResult","CartsDataActions","ValidationResultsByLineId","validateError","cartLineQuantityUpdatedAsync","isQuantityLimitsFeatureEnabled","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","MaximumQuantity","additionalProperties","updateLineResult","getProductByProductId","getProductByProductIdAndWarehouse","warehouseId","targetWarehouseValue","WarehouseId","_product$Behavior","ProductPickUpOptionsForCartLineItems","getCacheKey","buildCacheKey","getCacheObjectType","dataCacheType","getPickUpOptionsForCartLineItems","ProductsDataActions","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","createObservableDataAction","inputData","storeSelectorModuleId","locationChangedHandler","_props$channelDeliver","retailMulitplePickupFeatureState","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","delivery","pickup","deliveryCode","toggleBOPIS","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","productPickUpOptions","_foundProductAvailabi","_product$Dimensions","_props$cartState","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","orderTemplates","isMultipleCatalogFeatureEnabledInHq","availableQuantityInStock","IsProductAvailable","_getCartItemAvailableQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","shouldSkipStockCheck","ItemTypeValue","ReleasedProductType","Service","IsInvoiceLine","ObjectExtensions","isNullOrUndefined","_getErrorMessage","_props$productAvailab","finalErrorMessages","includeErrors","outOfRangeOneText","outOfRangeFormatText","checkForErrors","cartlinesErrors","ValidationResultsPairs","errorsFoundByLineId","ValidationFailures","validation","ErrorContext","onRemoveClickFunction","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","isCustomPriceSelected","isChannelTypeB2B","_cartline$CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","isNullOrEmpty","catalogs","lineIndex","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","priceCurrency","ariaRole","addToOrderTemplate","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","assembleCartlines","isPickUpItem","isCartLineItemPickUpType","_productAvailability$","_productAvailability$2","_cartline$WarehouseId","shouldIgnoreWarehouse","InventLocationId","toUpperCase","CartLineGroupItems","_assembleGroupInvoiceCartlines","carLineViewProps","_assembleGroupCartlines","deliveryType","getPromotionData","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","promotionOptions","_isMounted","promotionPopupId","promotionLinkClick","showPromotionDialog","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","removeItemFromCartHandler","validateCart","updateCartlineQuantity","_cartActionResult$err","lineUpdateFailure","validationResults","LocalizedMessage","errorDetails","fulfillmentStoreIdUpdated","isCartValid","getOrderQuantityLimitsFeatureFlag","_isChannelLimitsFeatureEnabled","showAvailablePromotions","shouldComponentUpdate","nextProps","nextState","getCheckoutURL","_getCartLines","validInventoryAcrossCartLines","RetailMultiplePickupFeatureState","multiplePickUpEnabled","isMultipleCatalogsFeatureEnabled","currentCatalogId","getCatalogId","validateCatalogId","getCartLinesGroup","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","_getPromoCode","_getPromotions","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","showGuestCheckoutButton","expressCheckoutButton","paymentExpress","ExpressCheckoutSectionWrapper","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","_generateOrderTemplateNameDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","checkoutBlockedDueToUnavailableFunds","OrderSummaryErrors","_getOrderSummaryErrors","_cart$cart","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","promotionStringHeading","promotionSeeAllLink","promotionDialog","_promotion","_promotion$Promotion","Promotion","OfferName","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","_element$data","outOfStockErrorMessage","allErrors","_cartline$data","_cartline$data$produc","fullError","Wrapper","outOfStockErrorMessageHeader","header","_featureState$result2","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateCustomPriceAlertMessageText","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","_this$props$data$feat2","_this$props$data$feat3","_this$props$data$cata","modules","storeSelectorId","updateMaxQuantityForCartLineItem","warehouseAggregation","decrementButtonAriaLabel","incrementButtonAriaLabel","salesAgreementPricePrompt","priceEditorResources","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","urlCheck","_featureStatuses$find2","featureStatuses","_featureStatuses$find","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_featureStatuses$find3","isChannelLimitsFeatureEnabledInHq","_this$props$data$feat4","_featureState$result3","_this$props$data$chan","_this$props$data$cata2","_this$props$data$chan2","cartLinesPickUpOptions","_cartLine$cartlineId","renderCartLinesGroupHeader","pickUpText","shippingText","emailShippingText","titleSeparate","_cartLine$pickUpInSto4","renderCartLinesGroupTitle","_cartLine$pickUpInSto","_cartLine$pickUpInSto2","_cartLine$pickUpInSto3","_props$cart","_props$cart2","errorData","_props$context$action","emailshippingText","renderCartLinesGroup","_renderInvoiceSummarylines","invoiceSummaryLines","EnabledPaymentsForOBO","ModuleStatesCacheKey","getModuleStates","cacheKey","moduleStates","updateModuleStates","WrappedComponent","_super","ModuleState","call","initializeState","_b","states","__assign","_a","isRequired","isCancellable","isSubmitContainer","getModuleStateManager","validate","isSkipped","shouldSubmitContainer","setIsRequired","setIsSubmitContainer","onSkip","onDisable","getModuleByTypeName","getModuleStateManagerByTypeName","_moduleState","_validateLeaf","source","module","isMatch","_validateContainer","allMatched","skipSkippableItem","_isPaymentSectionContainer","__extends","InvoiceSummaryLine","_buildPaymentSummarySection","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","getDeliveryMode","featureSate","pickupDeliveryMode","dM","SubtotalAmount","SubtotalAmountWithoutTax","TaxOnNonShippingCharges","DiscountAmount","OtherChargeAmount","taxOnShippingCharge","TaxOnShippingCharge","shippingChargeAmount","otherChargeAmount","taxOnNonShippingCharges","isTaxGreaterThanZero","otherChargeAmountTotal","subtotalAmountActual","customerAccount","customerAccountLabel"],"sourceRoot":""}