{"version":3,"file":"static/js/9.c80e1b4ccdc21c0a61a2.chunk.js","mappings":"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","sources":["webpack://Citta2.0/./src/modules/cart/actions/get-pickup-options-for-cartlines.ts?acad","webpack://Citta2.0/./src/modules/cart/components/cart-line-groups.tsx?f076","webpack://Citta2.0/./src/modules/cart/utils/get-promotion-in-cart.ts?4195","webpack://Citta2.0/./src/modules/cart/cart.tsx?d4e4","webpack://Citta2.0/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://Citta2.0/./src/modules/cart/cart.view.tsx?d8c2","webpack://Citta2.0/./src/modules/cart-icon/utils/get-products-in-mini-cart.ts?3c15","webpack://Citta2.0/./src/modules/cart-icon/cart-icon.tsx?4ae8","webpack://Citta2.0/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://Citta2.0/./src/modules/promo-banner/components/close-button.tsx?063b","webpack://Citta2.0/./src/modules/promo-banner/components/links.tsx?2587","webpack://Citta2.0/./src/modules/promo-banner/components/text.tsx?782b","webpack://Citta2.0/./src/modules/promo-banner/promo-banner.tsx?9ee9","webpack://Citta2.0/./src/modules/quick-order-grid/components/add-to-list/add-to-cart-selected-items.tsx?de21","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-actions.tsx?ca97","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-drawer.tsx?8701","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-form.tsx?5cbb","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-product.ts?187e","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-header-component.tsx?69b3","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-row-component.tsx?cd92","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-table/quick-order-grid-table-component.tsx?7cbc","webpack://Citta2.0/./src/modules/quick-order-grid/quick-order-grid.tsx?fddf","webpack://Citta2.0/./src/modules/quick-order-grid/components/utilities.ts?1806","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-pick-up-in-store.tsx?9701","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-items.tsx?0f67","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-groups.tsx?9a00","webpack://Citta2.0/./src/modules/citta-cart/utils/get-promotion-in-citta-cart.ts?15a5","webpack://Citta2.0/./src/modules/citta-cart/citta-cart.tsx?bb3f","webpack://Citta2.0/./src/modules/citta-cart/components/hso-validate-cartlines-inventory.tsx?97a2","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-items-promotion.tsx?25f5","webpack://Citta2.0/./src/modules/citta-media-gallery/utils/get-valid-product-images.ts?8597","webpack://Citta2.0/./src/modules/citta-media-gallery/citta-media-gallery.tsx?192b","webpack://Citta2.0/./src/modules/super-media-gallery/super-media-gallery.props.autogenerated.ts?e220","webpack://Citta2.0/./src/modules/super-media-gallery/utils/helper.ts?b8ed","webpack://Citta2.0/./src/modules/super-media-gallery/utils/get-valid-product-images.ts?50a8","webpack://Citta2.0/./src/modules/super-media-gallery/super-media-gallery.tsx?4f69","webpack://Citta2.0/./src/modules/citta-cart/citta-cart.view.tsx?6edb","webpack://Citta2.0/./src/modules/citta-media-gallery/citta-media-gallery.view.tsx?a3eb","webpack://Citta2.0/./src/modules/super-media-gallery/super-media-gallery.view.tsx?4d69","webpack://Citta2.0/./src/themes/citta/views/cart.view.tsx?dc69","webpack://Citta2.0/./src/themes/citta/views/checkout.view.tsx?084a","webpack://Citta2.0/./src/themes/citta/views/citta-cart.view.tsx?d1fe","webpack://Citta2.0/./src/modules/cart-icon/cart-icon.view.tsx?f9dd","webpack://Citta2.0/./src/modules/promo-banner/promo-banner.view.tsx?7f77","webpack://Citta2.0/./src/modules/quick-order-grid/quick-order-grid.view.tsx?f941","webpack://Citta2.0/./src/themes/citta/views/components/promocode.component.tsx?26ab","webpack://Citta2.0/./src/invoice-summary-lineitem.tsx?5f61","webpack://Citta2.0/./src/order-summary-lineitem.tsx?8a98","webpack://Citta2.0/./src/Common/get-product.ts?0a21","webpack://Citta2.0/./src/validate-cart.ts?cd50","webpack://Citta2.0/./src/modules/cart/components/cart-line-items.tsx?f6b2","webpack://Citta2.0/./src/modules/cart/components/cart-pick-up-in-store.tsx?dca8","webpack://Citta2.0/./src/modules/media-gallery/utils/helper.ts?b895","webpack://Citta2.0/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364","webpack://Citta2.0/./src/components/citta-cart/cart-line-items.tsx?5e8b","webpack://Citta2.0/./src/modules/cart/components/cart-line-items-promotion.tsx?80d9","webpack://Citta2.0/./src/modules/cart-icon/components/flyout-cart-line-items.tsx?f2c4"],"sourcesContent":["/*!\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 { 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                    this.setState({\n                        cartlinesErrors: {}\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({ cartlinesErrors: {}, 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({ cartlinesErrors: {}, 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 { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n    defaultDataScale,\n    IComponentNodeProps,\n    ImagefullView,\n    IModalViewProps,\n    IModuleProps,\n    inlineZoomImageOnHover,\n    inlineZoomImageOnMouseMove,\n    inlineZoomImageOnMouseOut,\n    inlineZoomInitClick,\n    INodeProps,\n    ISingleSlideCarouselProps,\n    isMobile,\n    KeyCodes,\n    NodeTag,\n    onContainerZoomInit,\n    onMouseMoveLensContainer,\n    onMouseOutLensContainer,\n    onMouseOverImageContainer,\n    removeContainerZoomStyle,\n    removeInlineZoomStyle,\n    SingleSlideCarousel,\n    VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\nimport { getAltText, IMediaData } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n    animating: boolean;\n    activeIndex: number;\n    isImageZoomed: boolean;\n    modalIsOpen: boolean;\n    lastUpdate?: number;\n    isMobileImageZoomed?: boolean;\n    mediaGalleryItems?: IMediaData[];\n    isInitialLoad?: boolean;\n    shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n    ThumbnailsContainerProps: INodeProps;\n    SingleSlideCarouselComponentProps: INodeProps;\n    items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n    ThumbnailItemContainerProps: INodeProps;\n    Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps<IMediaGalleryData> {\n    state: IMediaGalleryState;\n    MediaGallery: IModuleProps;\n    CarouselProps: INodeProps;\n    Thumbnails: IMediaGalleryThumbnailsViewProps;\n    Modal?: React.ReactElement | null;\n    callbackToggle?(): void;\n    callbackThumbnailClick?(index: number): void;\n    callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems<ItemType> {\n    items: ItemType[];\n    keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component<IMediaGalleryProps<IMediaGalleryData>, IMediaGalleryState> {\n    private readonly _inlineZoomDivRef: Map<number, HTMLDivElement> = new Map();\n\n    private readonly fullScreenOverlayButtonRef: React.RefObject<HTMLAnchorElement & HTMLButtonElement> = React.createRef();\n    private readonly player: React.RefObject<Player> = React.createRef<Player>();\n    private fallbackImage?: string;\n\n    private readonly defaultGalleryImageSettings: IImageSettings = {\n        viewports: {\n            xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n            sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n            md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n            lg: { q: 'h=772&m=8', w: 0, h: 0 }\n        },\n        lazyload: true,\n        cropFocalRegion: true\n    };\n\n    private readonly defaultThumbnailImageSettings: IImageSettings = {\n        viewports: {\n            xs: { q: 'w=100&m=8', w: 100, h: 0 },\n            lg: { q: 'w=100&m=8', w: 100, h: 0 }\n        },\n        lazyload: true,\n        cropFocalRegion: true\n    };\n\n    private readonly _zoomedImageSettings: IImageSettings;\n\n    public constructor(props: IMediaGalleryProps<IMediaGalleryData>) {\n        super(props);\n        this._toggleModal = this._toggleModal.bind(this);\n        const mediaGalleryImages = this.getImagesData();\n        this.state = {\n            activeIndex: 0,\n            animating: false,\n            isImageZoomed: false,\n            modalIsOpen: false,\n            isInitialLoad: true,\n            shouldUseOptimizedImage: !!this.props.config.skipImageValidation,\n            mediaGalleryItems: mediaGalleryImages\n        };\n\n        this._zoomedImageSettings =\n            props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n        this._onImageMouseOut = this._onImageMouseOut.bind(this);\n        this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n        this._onInlineImageClick = this._onInlineImageClick.bind(this);\n        this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n        this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n    }\n\n    public isMobile(): boolean {\n        const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n        return size === 'xs';\n    }\n\n    public async componentDidMount(): Promise<void> {\n        const source = this.props.config.imageSource ?? imageSource.pageContext;\n        const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n        this._setRenderType();\n        if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n            if (source === imageSource.pageContext) {\n                if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n                    const images = await validateProductImages(\n                        this.props.data.mediaLocationsForSelectedVariant.result,\n                        this.props.context.actionContext,\n                        this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n                    );\n                    await this._setImages(images);\n                } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n                    const product = this.props.data.product.result;\n                    const images = await getValidProductImages(\n                        product.RecordId,\n                        +this.props.context.request.apiSettings.channelId,\n                        this.props.context.actionContext,\n                        this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n                        product.productVariant\n                    );\n\n                    await this._setImages(images);\n                } else {\n                    await this._setImages([]);\n                }\n            }\n        }\n\n        reaction(\n            () => {\n                const product = this.props.data.product.result;\n                if (!product) {\n                    return null;\n                }\n\n                if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n                    return `${product.RecordId}`;\n                }\n\n                return `${product.RecordId}-${product.productVariant.RecordId}`;\n            },\n            async () => {\n                const product = this.props.data.product.result;\n                let images: IImageData[] = [];\n                if (product) {\n                    if (this.props.context.app?.config?.OmniChannelMedia) {\n                        images = await getProductImages(\n                            product.RecordId,\n                            this.shouldUseCmsAltText(),\n                            +this.props.context.request.apiSettings.channelId,\n                            this.props.context.actionContext,\n                            product.Name,\n                            shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n                        );\n                    } else {\n                        images = await getValidProductImages(\n                            product.RecordId,\n                            +this.props.context.request.apiSettings.channelId,\n                            this.props.context.actionContext,\n                            this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n                            shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n                        );\n                    }\n                    await this._setImages(images);\n                } else {\n                    await this._setImages([]);\n                }\n            },\n            { fireImmediately: true }\n        );\n\n        if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n            const images = await validateProductImages(\n                this.props.data.mediaLocations.result,\n                this.props.context.actionContext,\n                this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n            );\n            await this._setImages(images);\n        }\n    }\n\n    public shouldComponentUpdate(nextProps: IMediaGalleryProps<IMediaGalleryData>, nextState: IMediaGalleryState): boolean {\n        if (this.state === nextState && this.props.data === nextProps.data) {\n            return false;\n        }\n        return true;\n    }\n\n    public render(): JSX.Element {\n        const { id, config, resources } = this.props;\n\n        const { className, showPaginationTooltip } = config;\n\n        const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n        const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n        const zoomViewMode: string =\n            config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n        const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n        if (this.props.data.product.result) {\n            this.fallbackImage = getFallbackImageUrl(\n                this.props.data.product.result.ItemId,\n                this.props.context.request.apiSettings,\n                this.props.context.request.app?.config?.OmniChannelMedia\n            );\n        }\n        if (emptyPlaceHolderImage && this.fallbackImage) {\n            this.fallbackImage = `${this.fallbackImage}&fallback=${emptyPlaceHolderImage}`;\n        }\n\n        const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n        const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n        const viewProps: IMediaGalleryViewProps = {\n            ...(this.props as IMediaGalleryProps<IMediaGalleryData>),\n            state: this.state,\n            MediaGallery: {\n                moduleProps: this.props,\n                className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n            },\n            Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n            callbackToggle: this.openModalDialog,\n            callbackThumbnailClick: this._generateOnThumbnailClick,\n            callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n            CarouselProps: {\n                tag: Carousel,\n                className: 'ms-media-gallery__carousel',\n                items: mediaGalleryCarouselItems.items,\n                activeIndex: this.state.activeIndex,\n                next: this.next,\n                previous: this.previous,\n                interval: false,\n                directionTextPrev: resources.previousScreenshotFlipperText,\n                directionTextNext: resources.nextScreenshotFlipperText,\n                onIndicatorsClickHandler: this.goToIndex,\n                showPaginationTooltip: showPaginationTooltip === true,\n                indicatorAriaText: resources.ariaLabelForSlide,\n                handleOnExited: this.onExited,\n                handleOnExiting: this.onExiting,\n                key: mediaGalleryCarouselItems.keys\n            } as IComponentNodeProps<ICarouselProps>,\n            Thumbnails: {\n                ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n                SingleSlideCarouselComponentProps: {\n                    tag: SingleSlideCarousel,\n                    className: 'ms-media-gallery__thumbnails',\n                    vertical: isVertical,\n                    flipperPrevLabel: resources.previousScreenshotFlipperText,\n                    flipperNextLabel: resources.nextScreenshotFlipperText,\n                    parentId: id,\n                    useTabList: true,\n                    key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n                } as IComponentNodeProps<ISingleSlideCarouselProps>,\n                items: mediaGalleryThumbnailCarouselItems.items\n            }\n        };\n\n        return this.props.renderView(viewProps) as React.ReactElement;\n    }\n\n    /**\n     * Zoomed out image on previous/next click.\n     */\n    public updateZoomedInImage(): void {\n        this.setState({ isImageZoomed: false });\n    }\n\n    private readonly onExiting = () => {\n        this.setState({ animating: true });\n    };\n\n    private readonly onExited = () => {\n        this.setState({ animating: false });\n    };\n\n    /**\n     * On click next in carousel.\n     */\n    private readonly next = (): void => {\n        removeInlineZoomStyle();\n        if (this.isLastItem() === undefined) {\n            return;\n        }\n\n        const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n        this.goToIndex(nextIndex);\n\n        this.updateZoomedInImage();\n    };\n\n    /**\n     * On click previous in carousel.\n     */\n    private readonly previous = (): void => {\n        removeInlineZoomStyle();\n        const images = this.state.mediaGalleryItems;\n        const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n        this.goToIndex(nextIndex);\n        this.updateZoomedInImage();\n    };\n\n    private readonly goToIndex = (index: number): void => {\n        const { autoplay } = this.props.config;\n        const currentIndex = this.state.activeIndex;\n        const mediaItems = this.state.mediaGalleryItems;\n        if (autoplay && mediaItems) {\n            if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\n                this.player.current?.play();\n            } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\n                this.player.current?.pause();\n            }\n        }\n        this.setState({ activeIndex: index });\n    };\n\n    private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems<IMediaGalleryThumbnailItemViewProps> {\n        const mediaGalleryItems = this.state.mediaGalleryItems;\n        const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n        if (thumbnailImageSettings) {\n            thumbnailImageSettings.cropFocalRegion = true;\n        }\n\n        const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n        if (!hasMediaGalleryItems) {\n            if (this.state.lastUpdate) {\n                const defaultKey = 0;\n                return {\n                    items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n                    keys: ['empty']\n                };\n            }\n            return { items: [], keys: [] };\n        }\n\n        return {\n            items: [\n                // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n                ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n                    if (item.mediaTypeValue === MediaType.Video) {\n                        return this.getVideoThumbNailItem(\n                            item,\n                            thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n                            index,\n                            this.state.activeIndex\n                        );\n                    } else {\n                        return this._getThumbnailItem(\n                            item,\n                            thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n                            index,\n                            this.state.activeIndex\n                        );\n                    }\n                })\n            ],\n            // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n            keys: [...mediaGalleryItems!.map(item => item.src)]\n        };\n    }\n\n    private getImagesData = (): IImageData[] => {\n        if (this.props.config.skipImageValidation || this.props.context.request.app?.config?.OmniChannelMedia) {\n            const source = this.props.config.imageSource ?? imageSource.pageContext;\n            let images: IImageData[] = [];\n            let mediaLocations: MediaLocation[] = [];\n            if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n                mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n            } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n                mediaLocations = this.props.data.mediaLocations.result;\n            }\n            images = mediaLocations.map(mediaLocation => {\n                return {\n                    src: mediaLocation.Uri ?? '',\n                    altText: getAltText(\n                        this.props.context.actionContext.requestContext,\n                        this.shouldUseCmsAltText(),\n                        this.props.data.product.result?.Name,\n                        mediaLocation.AltText\n                    ),\n                    additionalProperties: mediaLocation.IsApplicableForChildEntities\n                        ? {\n                              isApplicableForChildEntities: 'true'\n                          }\n                        : undefined\n                };\n            });\n            const curatedImages = this.props.config.images ?? [];\n\n            return [...this._filterMasterImageFromVariant(images), ...curatedImages];\n        }\n        return [];\n    };\n\n    private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems<React.ReactNode> {\n        const mediaGalleryItems = this.state.mediaGalleryItems;\n        const galleryImageSettings = this.props.config.galleryImageSettings;\n        if (galleryImageSettings) {\n            galleryImageSettings.cropFocalRegion = true;\n        }\n\n        const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n        const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n        if (!hasMediaGalleryItems) {\n            if (this.state.lastUpdate) {\n                return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n            }\n            return { items: [], keys: [] };\n        }\n\n        return {\n            items: [\n                // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n                ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n                    return this._renderCarouselItemImageView(\n                        zoomView,\n                        item,\n                        galleryImageSettings ?? this.defaultGalleryImageSettings,\n                        index\n                    );\n                })\n            ],\n            // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n            keys: [...mediaGalleryItems!.map(item => item.src)]\n        };\n    }\n\n    private async _setImages(images?: IMediaData[]): Promise<void> {\n        const curatedImage = this.props.config.images || [];\n        const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\n\n        void Promise.all(\n            mediaToSet.map(async mediaData => {\n                if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\n                    try {\n                        const url = new URL(mediaData.src);\n                        const videoId = url.searchParams.get('CVID');\n                        if (videoId) {\n                            mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\n                        }\n                    } catch (error) {\n                        if (this.props.telemetry) {\n                            this.props.telemetry.debug('Error while fetching videoId');\n                        }\n                    }\n                }\n                return mediaData;\n            })\n        ).then(mediaData => {\n            const mediaItems = mediaData.filter(element => {\n                return (\n                    element.mediaTypeValue !== MediaType.Video ||\n                    (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\n                );\n            });\n\n            this.setState({\n                mediaGalleryItems: [...mediaItems, ...curatedImage],\n                activeIndex: 0,\n                lastUpdate: Date.now(),\n                shouldUseOptimizedImage: false\n            });\n        });\n\n        this.setState({\n            mediaGalleryItems: [...mediaToSet, ...curatedImage],\n            activeIndex: 0,\n            lastUpdate: Date.now(),\n            shouldUseOptimizedImage: false\n        });\n    }\n\n    private _setRenderType(): void {\n        this.setState({\n            isInitialLoad: false\n        });\n    }\n\n    private _renderCarouselItemImageView(\n        zoomView: string,\n        media: IMediaData,\n        imageSettings: IImageSettings,\n        index: number,\n        isInPopup: boolean = false\n    ): React.ReactNode {\n        if (media.mediaTypeValue === MediaType.Video) {\n            if (isInPopup || zoomView !== 'fullscreen') {\n                return <>{this._renderCarouselItemVideo(media, index, imageSettings)}</>;\n            }\n            return <>{this._renderVideoThumbnail(media, index, imageSettings)}</>;\n        } else {\n            if (this.isMobile()) {\n                if (isInPopup) {\n                    return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n                }\n                return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n            }\n\n            switch (zoomView) {\n                case 'container': {\n                    return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n                }\n                case 'inline': {\n                    return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\n                }\n                case 'fullscreen': {\n                    return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n                }\n\n                // No default\n            }\n            return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)}</>;\n        }\n    }\n\n    private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n        const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n        let variantImages = images ?? [];\n        const isVariantProduct =\n            !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n            !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n        const itemId = this.props.data.product.result?.ItemId;\n        if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n            variantImages = variantImages.filter(item => {\n                const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n                return !isApplicableForChildEntities;\n            });\n            if (!ArrayExtensions.hasElements(variantImages)) {\n                variantImages = images ?? [];\n            }\n        }\n        return variantImages;\n    }\n\n    private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n        const videoData = mediaData.videoData;\n        if (videoData) {\n            const options: IPlayerOptions = this.props.config as IPlayerOptions;\n            const playerResources = this.props.resources;\n            const videoMetaData: IVideoMetadata = {};\n            videoMetaData.videoId = videoData.id;\n            videoMetaData.title = videoData.title;\n            videoMetaData.duration = videoData.playTime;\n            if (videoData.thumbnail) {\n                videoMetaData.posterframeUrl = videoData.thumbnail.src;\n            }\n            if (videoData._links?.binaryReferences) {\n                videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n            }\n            const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n            const attributes = {\n                id: `${this.props.id}__carousel-item__${index}`\n            };\n            return (\n                <Video className='ms-media-gallery__player' editProps={{ key: videoData, requestContext: this.props.context.request }}>\n                    <Player\n                        ref={this.player}\n                        playerData={videoPlayerData}\n                        isEditor={this.props.context.request.params.isEditor}\n                        playerResources={playerResources}\n                        {...attributes}\n                    />\n                </Video>\n            );\n        }\n        return this._renderEmptyImage(imageSettings);\n    };\n\n    private readonly _getCarouselItem = (\n        image: IImageData,\n        imageSettings: IImageSettings,\n        index: number,\n        isInPopup: boolean = false\n    ): React.ReactNode => (\n        <Image\n            requestContext={this.props.context.actionContext.requestContext}\n            className='ms-media-gallery__item'\n            {...image}\n            fallBackSrc={this.props.context.request.app?.config?.OmniChannelMedia ? '' : index === 0 ? this.fallbackImage : image.src}\n            gridSettings={this.props.context.request.gridSettings!}\n            imageSettings={imageSettings}\n            loadFailureBehavior='hide'\n            id={`${this.props.id}__carousel-item__${index}`}\n            shouldSkipToMainImage={isInPopup}\n            bypassHideOnFailure={index === 0}\n        />\n    );\n\n    private readonly _getThumbnailItem = (\n        image: IImageData,\n        imageSettings: IImageSettings,\n        index: number,\n        modifiedActiveIndex: number\n    ): IMediaGalleryThumbnailItemViewProps => {\n        const classes = classnames(\n            'ms-media-gallery__thumbnail-item',\n            modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n        );\n\n        return {\n            ThumbnailItemContainerProps: {\n                tag: 'li' as NodeTag,\n                className: classes,\n                role: 'tab',\n                tabIndex: 0,\n                key: index,\n                'aria-label': image.altText,\n                'aria-selected': modifiedActiveIndex === index,\n                onClick: this._generateOnThumbnailClick(index),\n                onKeyDown: this._generateOnThumbnailKeyDown(index)\n            },\n            Picture: (\n                <Image\n                    requestContext={this.props.context.actionContext.requestContext}\n                    className='ms-media-gallery__thumbnail'\n                    {...image}\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n                    gridSettings={this.props.context.request.gridSettings!}\n                    imageSettings={imageSettings}\n                    loadFailureBehavior='hide'\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n                    bypassHideOnFailure={index === 0}\n                />\n            )\n        };\n    };\n\n    /**\n     * Gets the video thumbnail item to display media gallery.\n     * @param props - The Media gallery view props from business layer.\n     * @returns Return thumbnail view props which will be used to render video.\n     */\n    private readonly getVideoThumbNailItem = (\n        mediaData: IMediaData,\n        imageSettings: IImageSettings,\n        index: number,\n        modifiedActiveIndex: number\n    ): IMediaGalleryThumbnailItemViewProps => {\n        const classes = classnames(\n            'ms-media-gallery__thumbnail-item',\n            modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n        );\n\n        const videoData = mediaData.videoData;\n        let image: IImageData;\n        if (videoData?.thumbnail) {\n            image = videoData.thumbnail;\n        } else {\n            image = {\n                src: 'empty'\n            };\n        }\n\n        return {\n            ThumbnailItemContainerProps: {\n                tag: 'li' as NodeTag,\n                className: classes,\n                role: 'tab',\n                tabIndex: 0,\n                key: index,\n                'aria-label': image.altText,\n                'aria-selected': modifiedActiveIndex === index,\n                onClick: this._generateOnThumbnailClick(index),\n                onKeyDown: this._generateOnThumbnailKeyDown(index)\n            },\n            Picture: (\n                <Image\n                    requestContext={this.props.context.actionContext.requestContext}\n                    className='ms-media-gallery__thumbnail'\n                    {...image}\n                    fallBackSrc={image.src}\n                    gridSettings={this.props.context.request.gridSettings!}\n                    imageSettings={imageSettings}\n                    loadFailureBehavior='hide'\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n                    bypassHideOnFailure={index === 0}\n                />\n            )\n        };\n    };\n\n    /**\n     * Ref Handler.\n     * @param index -Remove item click function.\n     * @returns Set inline zoom.\n     */\n    private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n        this._inlineZoomDivRef.set(index, divRef);\n    };\n\n    private readonly _generateOnThumbnailKeyDown = (index: number) => {\n        return (event: React.KeyboardEvent) => {\n            if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n                event.preventDefault();\n\n                this.goToIndex(index);\n            }\n        };\n    };\n\n    private readonly _generateOnThumbnailClick = (index: number) => {\n        return (event: React.MouseEvent<HTMLLIElement>) => {\n            event.preventDefault();\n\n            this.goToIndex(index);\n        };\n    };\n\n    private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n        return (\n            <div\n                className={`ms-inline-zoom ${this.state.isImageZoomed ? 'zoomed' : ''}`}\n                ref={this._refHandler(index)}\n                data-scale={this.props.config.dataScale ?? defaultDataScale}\n            >\n                <Image\n                    requestContext={this.props.context.actionContext.requestContext}\n                    className='ms-media-gallery__item'\n                    {...image}\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n                    gridSettings={this.props.context.request.gridSettings!}\n                    imageSettings={imageSettings}\n                    loadFailureBehavior='hide'\n                    onClick={this._onInlineImageClick}\n                    onMouseOver={(this.state.isImageZoomed && this._inlineZoomImageOnHover) || undefined}\n                    id={`${this.props.id}__carousel-item__${index}`}\n                    shouldSkipToMainImage\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n                    bypassHideOnFailure={index === 0}\n                />\n                <Image\n                    role='presentation'\n                    requestContext={this.props.context.actionContext.requestContext}\n                    className='ms-inline-zoom__zoomedImg'\n                    {...image}\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n                    onClick={this._onImageMouseOut}\n                    gridSettings={this.props.context.request.gridSettings!}\n                    imageSettings={imageSettings}\n                    loadFailureBehavior='hide'\n                    id={`${this.props.id}__zoom__${index}`}\n                    onMouseMove={(this.state.isImageZoomed && inlineZoomImageOnMouseMove) || undefined}\n                    shouldSkipToMainImage\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n                    bypassHideOnFailure={index === 0}\n                />\n            </div>\n        );\n    }\n\n    private _inlineZoomImageOnHover(event: React.MouseEvent<HTMLImageElement>): void {\n        inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n    }\n\n    private _handleMobileViewZoomedImageClick(event: React.MouseEvent<HTMLImageElement>) {\n        const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n        const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n        if (!this.state.isMobileImageZoomed) {\n            const bounds = target.getBoundingClientRect();\n            const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n            const positionX = event.clientX - bounds.left;\n            const positionY = event.clientY - bounds.top;\n            const scaledPositionX = positionX * dataScale;\n            const scaledPositionY = positionY * dataScale;\n\n            target.style.transform = `scale(${dataScale})`;\n            target.classList.add(mobileZoomedInImageClassName);\n            target.parentElement!.style.overflow = 'auto';\n            target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n            this.setState({\n                isMobileImageZoomed: true\n            });\n        } else {\n            target.style.transform = '';\n            target.classList.remove(mobileZoomedInImageClassName);\n            target.parentElement!.style.overflow = '';\n            this.setState({\n                isMobileImageZoomed: false\n            });\n        }\n    }\n\n    private _onInlineImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n        if (window.innerWidth <= 768) {\n            // $msv-breakpoint-m\n            this._handleMobileViewZoomedImageClick(event);\n            return;\n        }\n        inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n        this.setState({\n            isImageZoomed: true\n        });\n    }\n\n    private _onImageMouseOut(event: React.MouseEvent<HTMLImageElement, MouseEvent>): void {\n        inlineZoomImageOnMouseOut(event);\n        this.setState({\n            isImageZoomed: false\n        });\n    }\n\n    private _onContainerZoomImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n        if (window.innerWidth <= 768) {\n            // $msv-breakpoint-m\n            this._handleMobileViewZoomedImageClick(event);\n            return;\n        }\n\n        onContainerZoomInit(event);\n\n        this.setState({\n            isImageZoomed: true\n        });\n    }\n\n    private _onMouseOutLensContainer(event: React.MouseEvent<HTMLImageElement>): void {\n        onMouseOutLensContainer(event);\n\n        this.setState({\n            isImageZoomed: false\n        });\n    }\n\n    private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n        return (\n            <div className='ms-containerZoom__container'>\n                <div\n                    data-scale={this.props.config.dataScale ?? defaultDataScale}\n                    className='ms-containerZoom__zoom-lens'\n                    role='presentation'\n                    onMouseOut={this._onMouseOutLensContainer}\n                    onClick={this._onMouseOutLensContainer}\n                    onMouseMove={(this.state.isImageZoomed && onMouseMoveLensContainer) || undefined}\n                />\n                <Image\n                    requestContext={this.props.context.actionContext.requestContext}\n                    className='ms-media-gallery__item'\n                    {...image}\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n                    gridSettings={this.props.context.request.gridSettings!}\n                    onClick={this._onContainerZoomImageClick}\n                    imageSettings={imageSettings}\n                    loadFailureBehavior='hide'\n                    onMouseOver={(this.state.isImageZoomed && onMouseOverImageContainer) || undefined}\n                    id={`${this.props.id}__carousel-item__${index}`}\n                    shouldSkipToMainImage\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n                    bypassHideOnFailure={index === 0}\n                />\n            </div>\n        );\n    }\n\n    private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n        return (\n            <div className='ms-fullscreen-section'>\n                <Image\n                    requestContext={this.props.context.actionContext.requestContext}\n                    className='ms-media-gallery__item'\n                    {...image}\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n                    gridSettings={this.props.context.request.gridSettings!}\n                    imageSettings={imageSettings}\n                    loadFailureBehavior='hide'\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n                    bypassHideOnFailure={index === 0}\n                />\n                <div className='ms-fullscreen-section__overlay'>\n                    {}\n                    <a\n                        href='javascript:void(0);'\n                        title={this.props.resources.fullScreenTitleText}\n                        role='button'\n                        ref={this.fullScreenOverlayButtonRef}\n                        onClick={this.openModalDialog}\n                        className='ms-fullscreen-section__magnifying-glass-icon'\n                    />\n                </div>\n            </div>\n        );\n    }\n\n    /**\n     * Render the video thumbnail in full screen.\n     * @param mediaData - Media Data.\n     * @param index - Index\n     * @param imageSettings - Image settings.\n     * @returns - JSX.Element\n     */\n    private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n        const videoData = mediaData.videoData;\n        let image: IImageData;\n        if (videoData?.thumbnail) {\n            image = videoData.thumbnail;\n        } else {\n            image = {\n                src: 'empty'\n            };\n        }\n\n        return (\n            <div className='ms-fullscreen-section'>\n                <Image\n                    requestContext={this.props.context.actionContext.requestContext}\n                    className='ms-fullscreen-section__video'\n                    {...image}\n                    fallBackSrc={image.src}\n                    gridSettings={this.props.context.request.gridSettings!}\n                    imageSettings={imageSettings}\n                    loadFailureBehavior='hide'\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n                    bypassHideOnFailure={index === 0}\n                />\n                <div className='ms-fullscreen-section__video-overlay'>\n                    {}\n                    <button\n                        title={this.props.resources.fullScreenTitleText}\n                        role='button'\n                        ref={this.fullScreenOverlayButtonRef}\n                        onClick={this.openModalDialog}\n                        className='ms-fullscreen-section__video-play-icon'\n                    />\n                </div>\n            </div>\n        );\n    };\n\n    private _mapProductToImageData(product: SimpleProduct): IImageData {\n        return {\n            src: product.PrimaryImageUrl ?? ''\n        };\n    }\n\n    private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n        return (\n            <div className='ms-media-gallery__item'>\n                <Image\n                    requestContext={this.props.context.actionContext.requestContext}\n                    className='ms-media-gallery__item__image'\n                    src='empty'\n                    fallBackSrc={this.fallbackImage}\n                    gridSettings={this.props.context.request.gridSettings!}\n                    imageSettings={imageSettings ?? this.defaultGalleryImageSettings}\n                    loadFailureBehavior='empty'\n                />\n            </div>\n        );\n    }\n\n    private _getEmptyThumbnailItem(\n        imageSettings: IImageSettings | undefined,\n        index: number,\n        modifiedActiveIndex: number\n    ): IMediaGalleryThumbnailItemViewProps {\n        const classes = classnames(\n            'ms-media-gallery__thumbnail-item',\n            modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n        );\n        return {\n            ThumbnailItemContainerProps: {\n                tag: 'li' as NodeTag,\n                className: classes,\n                role: 'tab',\n                tabIndex: 0,\n                key: 'empty',\n                'aria-label': '',\n                'aria-selected': modifiedActiveIndex === index,\n                onClick: this._generateOnThumbnailClick(index),\n                onKeyDown: this._generateOnThumbnailKeyDown(index)\n            },\n            Picture: (\n                <Image\n                    requestContext={this.props.context.actionContext.requestContext}\n                    className='ms-media-gallery__thumbnail-item__image'\n                    src='empty'\n                    fallBackSrc={this.fallbackImage}\n                    gridSettings={this.props.context.request.gridSettings!}\n                    imageSettings={imageSettings ?? this.defaultThumbnailImageSettings}\n                    loadFailureBehavior='empty'\n                />\n            )\n        };\n    }\n\n    private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n    private readonly isLastItem = () => {\n        const images = this.state.mediaGalleryItems;\n        return images && this.state.activeIndex === images.length - 1;\n    };\n\n    private readonly openModalDialog = (): void => {\n        this._toggleModal();\n    };\n\n    private _toggleModal(): void {\n        if (this.state.modalIsOpen) {\n            this.fullScreenOverlayButtonRef.current?.focus();\n            const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n            if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n                const image = parentDiv.children[1].querySelector('img');\n                if (image) {\n                    image.removeAttribute('style');\n                }\n            }\n            this.setState({\n                isImageZoomed: false\n            });\n        }\n        this.setState({\n            isImageZoomed: false,\n            modalIsOpen: !this.state.modalIsOpen\n        });\n        removeInlineZoomStyle();\n        removeContainerZoomStyle();\n    }\n\n    private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n        const {\n            data: {\n                product: { result: product }\n            },\n            resources\n        } = this.props;\n        let mediaGalleryItems = this.state.mediaGalleryItems;\n\n        if (!mediaGalleryItems && product) {\n            mediaGalleryItems = [this._mapProductToImageData(product)];\n        }\n        const carouselprops = {\n            tag: Carousel,\n            className: 'ms-media-gallery__carousel',\n            items:\n                mediaGalleryItems &&\n                mediaGalleryItems.map((item: IImageData, index: number) =>\n                    this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n                ),\n            activeIndex: this.state.activeIndex,\n            next: this.next,\n            previous: this.previous,\n            interval: false,\n            directionTextPrev: resources.previousScreenshotFlipperText,\n            directionTextNext: resources.nextScreenshotFlipperText,\n            onIndicatorsClickHandler: this.goToIndex,\n            showPaginationTooltip: true,\n            hideIndicator: false,\n            keyboard: false,\n            handleOnExited: this.onExited,\n            handleOnExiting: this.onExiting,\n            isDisabledFunctionality: this.state.isMobileImageZoomed\n        } as IComponentNodeProps<ICarouselProps>;\n        const carousel = <Carousel {...carouselprops} />;\n\n        const imageModalSliderProps: IModalViewProps = {\n            modalIsOpen: this.state.modalIsOpen,\n            ontoggle: this._toggleModal,\n            galleryCarousel: carousel,\n            classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n        };\n        return ImagefullView(imageModalSliderProps) as React.ReactElement;\n    };\n\n    private shouldUseCmsAltText = (): boolean => {\n        if (this.props.config.altTextSource === 'product') {\n            return false;\n        } else {\n            return true;\n        }\n    };\n}\n\nexport default MediaGallery;\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.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n    ActiveCartProductsInput,\n    getActiveCartProductsAction,\n    getAvailabilitiesForCartLineItems,\n    getDeliveryOptionsForCartLineItems,\n    IProductInventoryInformation,\n    ProductAvailabilitiesForCartLineItems,\n    ProductDeliveryOptionsForCartLineItems\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n    products?: SimpleProduct[];\n    productAvailabilites?: IProductInventoryInformation[];\n    deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n    return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data.\n * @param ctx\n * @param cartState\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise<IMiniCartData> {\n    const miniCartData: IMiniCartData = {};\n\n    const cart = cartState.cart;\n\n    // If there are cart lines, make call to get products\n    // If there are invocie linese, then there is no products, so don't make call to get products\n    if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\n        await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\n            .then(products => {\n                if (products) {\n                    miniCartData.products = products;\n                }\n            })\n            .catch(error => {\n                ctx.telemetry.exception(error);\n                throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n            });\n\n        await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\n            .then(availableQuantity => {\n                if (availableQuantity) {\n                    miniCartData.productAvailabilites = availableQuantity;\n                }\n            })\n            .catch(error => {\n                ctx.telemetry.exception(error);\n                throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n            });\n\n        await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n            .then(deliveryOptions => {\n                if (deliveryOptions) {\n                    miniCartData.deliveryOptions = deliveryOptions;\n                }\n            })\n            .catch(error => {\n                ctx.telemetry.exception(error);\n                throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n            });\n    }\n\n    return miniCartData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport {\n    CartLine,\n    ChannelDeliveryOptionConfiguration,\n    CartLineValidationResultsByLineId,\n    OrgUnitLocation\n} from '@msdyn365-commerce/retail-proxy';\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { ArrayExtensions, validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n    Button,\n    getPayloadObject,\n    getTelemetryAttributes,\n    getTelemetryObject,\n    INodeProps,\n    ITelemetryContent,\n    TelemetryConstant,\n    UncontrolledTooltip,\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';\n\nimport { ICartIconData } from './cart-icon.data';\nimport { cartLinesSortOrder, ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n    miniCartData: IMiniCartData;\n    orgUnitLocations?: OrgUnitLocation[];\n    isQuantityLimitsFeatureEnabled: boolean;\n    isCartValid: boolean;\n}\n\nexport interface ICartIconViewProps extends ICartIconProps<ICartIconData> {\n    className: string;\n    cartIcon: React.ReactNode;\n    FlyoutContainer?: INodeProps;\n    CartlinesWrapper: INodeProps;\n    miniCartWrapper: INodeProps;\n    miniCartItemWrapper: INodeProps;\n    cartlines?: IFlyoutCartLineItemViewProps[];\n    flyoutTitle: React.ReactNode;\n    totalPrice: React.ReactNode;\n    checkoutAsGuestButton?: React.ReactNode;\n    checkoutAsSignInUserButton?: React.ReactNode;\n    goToCartButton?: React.ReactNode;\n    waitingComponent?: React.ReactNode;\n    isCartLoading: boolean;\n    checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n\n    removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component.\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass CartIcon extends React.Component<ICartIconProps<ICartIconData>, IMiniCartState> {\n    private readonly telemetryContent: ITelemetryContent;\n\n    private readonly checkoutBySignInAttributes: IDictionary<string> | undefined;\n\n    private readonly checkoutByGuestAttributes: IDictionary<string> | undefined;\n\n    private readonly viewShoppingBagAttributes: IDictionary<string> | undefined;\n\n    private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n    private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n    private lastValidatedCartVersion: number | undefined;\n\n    constructor(props: ICartIconProps<ICartIconData>) {\n        super(props);\n        this.state = {\n            miniCartData: {},\n            isCartValid: true,\n            isQuantityLimitsFeatureEnabled: false\n        };\n        this.telemetryContent = getTelemetryObject(\n            this.props.context.request.telemetryPageName!,\n            this.props.friendlyName,\n            this.props.telemetry\n        );\n        const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\n        this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n        payload.contentAction.etext = TelemetryConstant.GuestCheckout;\n        this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n        payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\n        this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n    }\n\n    public async componentDidMount(): Promise<void> {\n        const context = this.props.context.actionContext;\n\n        reaction(\n            () => this.props.data.cart.result?.cart.CartLines,\n            async () => {\n                this.setState({\n                    miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\n                });\n            }\n        );\n        await this._setQuantityLimitsFeatureFlag();\n\n        this.setState({\n            orgUnitLocations: this.props.data.orgUnitLocations?.result\n        });\n\n        this._validateCart();\n    }\n\n    public componentDidUpdate(prevProps: ICartIconProps<ICartIconData>): void {\n        this._validateCart();\n    }\n\n    public shouldComponentUpdate(nextProps: ICartIconProps<ICartIconData>, nextState: IMiniCartState): boolean {\n        if (this.state === nextState && this.props.data === nextProps.data) {\n            return false;\n        }\n        return true;\n    }\n\n    // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\n    public render(): JSX.Element | null {\n        const {\n            id,\n            typeName,\n            config: { enableHoverCart, isAnonymousCheckout },\n            context: {\n                request: {\n                    user: { isAuthenticated, signInUrl }\n                }\n            },\n            context,\n            resources\n        } = this.props;\n\n        const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\n        const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n        const cartUrl = getUrlSync('cart', 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        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n        const shouldShowMiniCart =\n            cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n        const hasInvoiceLine = cart?.hasInvoiceLine;\n        const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n        const cartLines = this._getCartLines();\n        const validInventoryAcrossCartLines = validateCartLinesInventory(\n            cart?.cart.CartLines ?? [],\n            this.state.miniCartData.productAvailabilites ?? [],\n            this.props.context.actionContext,\n            this.state.miniCartData.products ?? [],\n            emailDeliveryModeCode\n        );\n        const hasError =\n            !validInventoryAcrossCartLines?.isValid ||\n            (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n            (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n        const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n        const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\n        const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\n        const flyoutTitle = resources.flyoutTitle;\n        const flyoutTooltip = {\n            tag: UncontrolledTooltip,\n            shouldShowMiniCart,\n            placement: 'bottom-end',\n            hideArrow: true,\n            className: 'ms-cart-icon__flyout-container',\n            trigger: 'hover',\n            displayMode: 'FLYOUT',\n            target: id,\n            shouldShowCloseButton: true,\n            cartPageUrl: cartUrl,\n            hideAriaHidden: true\n        };\n\n        // If there are invoice lines, don't update mini cart price\n        const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\n        const priceString = price\n            ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\n            : '';\n        const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n        this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n        this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\n            feature => feature.Name === multiplePickupStoreSwitchName\n        )?.IsEnabled;\n\n        const viewProps = {\n            ...this.props,\n            cartIcon: (\n                <CartIconComponent\n                    cartLabel={resources.cartLabel}\n                    cartQtyLabel={resources.cartQtyLabel}\n                    context={context}\n                    id={id}\n                    typeName={typeName}\n                    data={{ cart }}\n                    telemetryContent={this.telemetryContent}\n                />\n            ),\n            cartlines: cartLines,\n            FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\n            CartlinesWrapper: {\n                className: 'ms-cart-icon__cart-lines'\n            },\n            miniCartWrapper: {\n                className: classnames('ms-cart-icon'),\n                id: this.props.id\n            },\n            miniCartItemWrapper: {\n                className: classnames('msc-cart-lines-item')\n            },\n\n            // If there are invoice lines, don't update mini cart checkout button\n            // Checkout button will display by default to maintain backward compatibility.  When Anonymous user checkout is enabled &&\n            // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\n            checkoutAsSignInUserButton:\n                !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\n                    <Button\n                        disabled={hasError}\n                        className='ms-cart-icon__btn-checkout'\n                        href={checkoutURL}\n                        title={resources.checkoutButtonTitle}\n                        {...this.checkoutBySignInAttributes}\n                    >\n                        {resources.checkoutButtonTitle}\n                    </Button>\n                ) : null,\n            checkoutAsGuestButton:\n                isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\n                    <Button\n                        disabled={hasError}\n                        className='ms-cart-icon__btn-guestcheckout'\n                        href={guestCheckoutUrl}\n                        title={resources.guestCheckoutButtonTitle}\n                        {...this.checkoutByGuestAttributes}\n                    >\n                        {resources.guestCheckoutButtonTitle}\n                    </Button>\n                ) : null,\n            goToCartButton: (\n                <Button\n                    className='ms-cart-icon__btn-gotocart'\n                    href={cartUrl}\n                    title={goToCartButtonText}\n                    {...this.viewShoppingBagAttributes}\n                >\n                    {goToCartButtonText}\n                </Button>\n            ),\n            checkoutBlockedDueToUnavailableFunds: null,\n            flyoutTitle: <span className='ms-cart-icon__flyout-title'>{flyoutTitle}</span>,\n            totalPrice: <div className='ms-cart-icon__subtotal'>{priceString}</div>\n        };\n\n        return this.props.renderView(viewProps) as React.ReactElement;\n    }\n\n    private _validateCart(): void {\n        const {\n            data: { cart }\n        } = this.props;\n        const cartVersion = cart.result?.cart?.Version ?? undefined;\n        if (this.lastValidatedCartVersion === cartVersion) {\n            return;\n        }\n\n        this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\n\n        if (this.state.isQuantityLimitsFeatureEnabled) {\n            validateCartAsync(cart, this.props.telemetry, this.props.context)\n                .then((result: CartLineValidationResultsByLineId | undefined) => {\n                    this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\n                })\n                .catch(() => {\n                    this.setState({ isCartValid: false });\n                });\n        } else {\n            this.setState({ isCartValid: true });\n        }\n    }\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 (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\n            returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n        }\n\n        return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n    }\n\n    /**\n     * Sort cartline items.\n     * @param cartlines - Cartlines to be sorted.\n     * @param sortOrder - Ascending or descending.\n     * @returns - Sorted cartlines.\n     */\n    private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\n        const lines: CartLine[] = [...cartlines];\n        const zero: number = 0;\n\n        if (sortOrder === cartLinesSortOrder.descending) {\n            return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\n        }\n        return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\n    };\n\n    private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n        const {\n            context: {\n                request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n            },\n            config,\n            telemetry,\n            resources\n        } = this.props;\n\n        const imageSettings = this._getImageSettings(config.imageSettings);\n        const cart = this.props.data.cart && this.props.data.cart.result;\n\n        // Cart-icon could be placed in each page\n        // so we check cart content to reduce number of RS calls\n        return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\n            ? FlyoutCartLineItems({\n                  cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\n                  products: this.state.miniCartData.products,\n                  productAvailabilites: this.state.miniCartData.productAvailabilites,\n                  productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n                  imageSettings,\n                  outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\n                  isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n                  maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n                  gridSettings: this.props.context.request.gridSettings!,\n                  context: this.props.context,\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                      quantityDisplayString: resources.quantityDisplayText,\n                      salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n                      inputQuantityAriaLabel: '', // Not used\n                      discountStringText: '', // Not used\n                      originalPriceText: '',\n                      currentPriceText: '',\n                      shippingChargesText: '',\n                      shippingText: resources.shippingText\n                  },\n                  telemetry,\n                  removeButtonText: resources.removeCartButtonText,\n                  outOfStockText: '', // Not used\n                  outOfRangeOneText: '', // Not used\n                  outOfRangeFormatText: '', // Not used\n                  cartState: cart,\n                  orgUnitLocations: this.state.orgUnitLocations,\n                  removeItemClickHandler: this._removeItemFromCartHandler,\n                  pickupDeliveryModeCode: PickupDeliveryModeCode,\n                  telemetryContent: this.telemetryContent,\n                  channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\n                  isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled,\n                  catalogs: this.props.data.catalogs?.result\n              })\n            : null;\n    }\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    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.removeCartLines(input).catch(error => {\n                this.props.telemetry.warning(error);\n                this.props.telemetry.debug('Unable to Remove Cart Line');\n            });\n        }\n    };\n\n    private async _setQuantityLimitsFeatureFlag(): Promise<void> {\n        const featureStatuses = await this.props.data.featureState;\n\n        const isChannelQuantityLimitsFeatureEnabledInHq =\n            featureStatuses?.find(\n                featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n            )?.IsEnabled || false;\n        if (isChannelQuantityLimitsFeatureEnabledInHq) {\n            this.setState({ isQuantityLimitsFeatureEnabled: true });\n            return;\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 || defaultOrderQuantityLimitsFeatureConfig === 'none') {\n                this.setState({ isQuantityLimitsFeatureEnabled: false });\n                return;\n            }\n\n            try {\n                const featureStatuses = await this.props.data.featureState;\n                const isQuantityLimitsFeatureEnabledInHq =\n                    featureStatuses?.find(\n                        featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n                    )?.IsEnabled || false;\n                if (!isQuantityLimitsFeatureEnabledInHq) {\n                    this.setState({ isQuantityLimitsFeatureEnabled: false });\n                    return;\n                }\n            } catch (error) {\n                this.props.telemetry.warning(error);\n                this.props.telemetry.debug('Unable to get feature states');\n                this.setState({ isQuantityLimitsFeatureEnabled: false });\n                return;\n            }\n            if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n                this.setState({ isQuantityLimitsFeatureEnabled: true });\n            } else {\n                this.props.data.customerInformation\n                    .then(customerInfo => {\n                        const result =\n                            !!customerInfo &&\n                            ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n                                (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n                        this.setState({ isQuantityLimitsFeatureEnabled: result });\n                    })\n                    .catch(error => {\n                        this.props.telemetry.warning(error);\n                        this.props.telemetry.debug('Unable to get customer info');\n                    });\n            }\n        } else {\n            const cartConfiguration = await this.props.data.cartConfiguration;\n            this.setState({ isQuantityLimitsFeatureEnabled: !(cartConfiguration?.IgnoreOrderSettings ?? false) });\n            return;\n        }\n    }\n}\n\nexport default CartIcon;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\n    const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n    return (\n        <Module {...MediaGallery}>\n            <Node {...CarouselProps} />\n            {Modal}\n            {_renderThumbnails(Thumbnails)}\n        </Module>\n    );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n    const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n    return (\n        <Node {...ThumbnailsContainerProps}>\n            <Node {...SingleSlideCarouselComponentProps}>{items && items.map(_renderThumbnailItem)}</Node>\n        </Node>\n    );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n    const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n    return <Node {...ThumbnailItemContainerProps}>{Picture}</Node>;\n};\n\nexport default MediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n    closeButtonAriaLabel?: string;\n    label?: string;\n    telemetryContent?: ITelemetryContent;\n    onClose(): void;\n}\n\nexport const PromoBannerCloseButton: React.FC<IPromoBannerCloseButton> = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n    const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n    const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n    return (\n        <button className='ms-promo-banner__close-button' aria-label={closeButtonAriaLabel} onClick={onClose} {...attributes}>\n            <span className='ms-promo-banner__close-button__label' aria-hidden>\n                {label}\n            </span>\n        </button>\n    );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n    links: ILinksData[];\n    requestContext: Msdyn365.IRequestContext;\n    telemetryContent: ITelemetryContent;\n    onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC<IPromoBannerLinks> = ({ links, requestContext, onTextChange, telemetryContent }) => {\n    const editableLinks = _mapEditableLinks(links, telemetryContent);\n    return (\n        <span className='ms-promo-banner__links'>\n            {editableLinks && editableLinks.length > 0 ? (\n                <Msdyn365.Links links={editableLinks} editProps={{ onTextChange, requestContext }} />\n            ) : null}\n        </span>\n    );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n    if (!linkdata || linkdata.length === 0) {\n        return null;\n    }\n    const editableLinks: Msdyn365.ILinksData[] = [];\n    linkdata.forEach((link, index) => {\n        // Construct telemetry attribute to render\n        const payLoad = getPayloadObject('click', telemetryContent, '', '');\n        const linkText = link.linkText ? link.linkText : '';\n        payLoad.contentAction.etext = linkText;\n        const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n        const editableLink: Msdyn365.ILinksData = {\n            ariaLabel: link.ariaLabel,\n            className: 'ms-promo-banner__link',\n            linkText: link.linkText,\n            linkUrl: link.linkUrl.destinationUrl,\n            openInNewTab: link.openInNewTab,\n            role: 'link',\n            additionalProperties: attributes,\n            onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n        };\n        editableLinks.push(editableLink);\n    });\n\n    return editableLinks;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n    text: string;\n    requestContext: Msdyn365.IRequestContext;\n    onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC<IPromoBannerText> = ({ text, onTextChange, requestContext }) => {\n    return <Msdyn365.Text className='ms-promo-banner__text' tag='span' text={text} editProps={{ onEdit: onTextChange, requestContext }} />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps, IPromoBannerResources } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n    animating: boolean;\n    isVisible: boolean;\n    activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n    promoBannerProps: IModuleProps;\n    contentProps: INodeProps;\n    bannerMessages: IBannerMessagesData[];\n    promoBannerTextProps: INodeProps;\n    promoBannerLinksProps: INodeProps;\n    carouselProps: INodeProps;\n    closeButton?: React.ReactNode;\n    className: string;\n    promoBannerText: string;\n    resources: IPromoBannerResources;\n    onDismiss(): void;\n    handleText(): void;\n    handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent<IPromoBannerProps<IPromoBannerState>>}\n */\nclass PromoBanner extends React.PureComponent<IPromoBannerProps<{}>, IPromoBannerState> {\n    public state: IPromoBannerState = {\n        animating: false,\n        isVisible: true,\n        activeIndex: 0\n    };\n\n    private readonly telemetryContent: ITelemetryContent = getTelemetryObject(\n        this.props.context.request.telemetryPageName!,\n        this.props.friendlyName,\n        this.props.telemetry\n    );\n\n    public render(): JSX.Element | null {\n        const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n        const { closeButtonAriaLabel, closeButtonLabel, bannerText, bannerAriaLabel } = this.props.resources;\n        const { isVisible, activeIndex } = this.state;\n\n        if (!isVisible) {\n            this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n            return null;\n        }\n\n        const viewProps = {\n            // Context for telemetry and raw data for C1 to do customization\n            // Including computed data, state data and methods\n            ...this.props,\n            className: classnames('ms-promo-banner', className),\n            isVisible, // State data\n            onDismiss: this._onDismiss, // Methods\n            handleLinks: this.handleLinkTextChange,\n            handleText: this.handleTextChange,\n\n            promoBannerProps: {\n                className: classnames('ms-promo-banner', className),\n                moduleProps: this.props,\n                role: 'banner',\n                'aria-label': bannerAriaLabel\n            },\n            promoBannerTextProps: {\n                tag: PromoBannerText\n            },\n            promoBannerLinksProps: {\n                tag: PromoBannerLinks,\n                telemetryContent: this.telemetryContent\n            },\n            contentProps: { className: 'ms-promo-banner__content' },\n            promoBannerText: bannerText,\n            bannerMessages,\n            activeIndex,\n            carouselProps: {\n                tag: Carousel,\n                className: 'ms-promo-banner__carousel',\n                activeIndex,\n                next: this._next,\n                previous: this._previous,\n                onIndicatorsClickHandler: this._goToIndex,\n                hideIndicator: hideFlipper,\n                interval,\n                hideFlipper,\n                autoplay\n            },\n            closeButton: dismissEnabled && (\n                <PromoBannerCloseButton\n                    {...{\n                        onClose: this._onDismiss,\n                        label: closeButtonLabel,\n                        closeButtonAriaLabel,\n                        telemetryContent: this.telemetryContent\n                    }}\n                />\n            )\n        };\n\n        return this.props.renderView(viewProps) as React.ReactElement;\n    }\n\n    public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n        if (this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n            this.props.config.bannerMessages[0].text = event.target.value;\n        }\n    };\n\n    public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n        if (this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n            const links = this.props.config.bannerMessages[1].links;\n            if (links) {\n                links[linkIndex].linkText = event.target.value;\n            }\n        }\n    };\n\n    private readonly _next = (): void => {\n        const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n        this._goToIndex(nextIndex);\n    };\n\n    private readonly _previous = (): void => {\n        const nextIndex = this._isFirstItem()\n            ? this.props.config.bannerMessages\n                ? this.props.config.bannerMessages.length - 1\n                : 0\n            : this.state.activeIndex - 1;\n        this._goToIndex(nextIndex);\n    };\n\n    private readonly _goToIndex = (index: number): void => {\n        if (this.state.animating) {\n            return;\n        }\n        this.setState({ activeIndex: index });\n    };\n\n    private readonly _isFirstItem = () => this.state.activeIndex === 0;\n\n    private readonly _isLastItem = () =>\n        this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n    private readonly _onDismiss = (): void => {\n        this.setState({ isVisible: false });\n    };\n}\n\nexport default PromoBanner;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartComponent, IAddToCartFailureResult, IAddToCartResources, OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport { getUrlSync, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { SalesLine } from '@msdyn365-commerce/retail-proxy';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\n/**\n * The data on which the component should operate.\n */\nexport interface IAddToCartSelectedData {\n    quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * The resources needed to render a buy selected component.\n */\nexport interface IAddToCartSelectedResources {\n    quickOrderGridBuySelectedButtonText?: string;\n    quickOrderGridBuySelectedButtonAriaLabel?: string;\n    quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n    quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n    quickOrderGridGoToCartText?: string;\n    quickOrderGridDialogCloseText?: string;\n    quickOrderGridSingleItemText?: string;\n    quickOrderGridMultiLineItemFormatText?: string;\n    quickOrderGridMultiLinesFormatText?: string;\n    quickOrderGridHeaderMessageText?: string;\n    addedQuantityText?: string;\n    originalPriceText?: string;\n    currentPriceText?: string;\n    freePriceText?: string;\n}\n\n/**\n * Configuration of a buy selected component.\n */\nexport interface IAddToCartSelectedProps extends IComponentProps<IAddToCartSelectedData> {\n    className: string;\n    context: ICoreContext;\n\n    resources: IAddToCartSelectedResources;\n\n    isIcon?: boolean;\n    onError?(result: IAddToCartFailureResult): void;\n}\n\n/**\n * Get the dialog strings.\n * @param props - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getDialogStrings = (props: IAddToCartSelectedProps): IAddToCartResources => {\n    return {\n        goToCartText: props.resources.quickOrderGridGoToCartText ?? '',\n        continueShoppingText: props.resources.quickOrderGridDialogCloseText ?? '',\n        closeNotificationLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? '',\n        headerItemOneText: props.resources.quickOrderGridSingleItemText ?? '',\n        headerItemFormatText: props.resources.quickOrderGridMultiLineItemFormatText ?? '',\n        headerLinesFormatText: props.resources.quickOrderGridMultiLinesFormatText ?? '',\n        headerMessageText: props.resources.quickOrderGridHeaderMessageText ?? '',\n        freePriceText: props.resources.freePriceText ?? '',\n        originalPriceText: props.resources.originalPriceText ?? '',\n        currentPriceText: props.resources.currentPriceText ?? '',\n        addedQuantityText: props.resources.addedQuantityText ?? '',\n        buyAgainNotificationTitle: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationTitle ?? '',\n        buyAgainNotificationCloseAriaLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? ''\n    };\n};\n\n/**\n * Get the dialog strings.\n * @param quickOrder - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getOrderDetails = (quickOrder: QuickOrderTemplate): OrderDetailsProduct[] => {\n    const orderDetails: OrderDetailsProduct[] = [];\n    for (const quickLine of quickOrder.quickOrderTemplateLines) {\n        const quantity = quickLine.productListLine.Quantity;\n        const salesLine: SalesLine = {\n            Quantity: quantity\n        };\n        const products = new OrderDetailsProduct(salesLine, quickLine.fullProduct?.ProductDetails);\n        orderDetails.push(products);\n    }\n    return orderDetails;\n};\n\n/**\n * Renders a button which adds given products to the cart.\n * @param props - Configuration of the component.\n * @returns A react element or null if no products were given.\n */\nexport const AddToCartProductListComponent: React.FC<IAddToCartSelectedProps> = (props: IAddToCartSelectedProps): JSX.Element | null => {\n    const {\n        data: { quickOrderTemplate }\n    } = props;\n\n    if (quickOrderTemplate?.quickOrderTemplateLines[0].fullProduct?.ProductDetails === undefined) {\n        return null;\n    }\n    const quantity = quickOrderTemplate.quickOrderTemplateLines[0].productListLine.Quantity;\n    const buttonLabel = props.resources.quickOrderGridBuySelectedButtonText;\n    const buttonAriaLabel = props.resources.quickOrderGridBuySelectedButtonAriaLabel;\n    const dialogStrings: IAddToCartResources = getDialogStrings(props);\n    const shouldSkipSiteSettings: boolean = true;\n    const orderDetailProducts = getOrderDetails(quickOrderTemplate);\n    return (\n        <AddToCartComponent\n            addToCartText={buttonLabel ?? ''}\n            outOfStockText=''\n            addToCartArialLabel={buttonAriaLabel}\n            quantity={quantity}\n            id={props.id}\n            typeName={props.typeName}\n            className={props.className}\n            navigationUrl={getUrlSync('cart', props.context.actionContext)}\n            data={{ product: quickOrderTemplate.quickOrderTemplateLines[0].fullProduct?.ProductDetails }}\n            context={props.context}\n            dialogStrings={dialogStrings}\n            shouldSkipSiteSettings={shouldSkipSiteSettings}\n            orderDetailsProducts={orderDetailProducts}\n            onError={props.onError}\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 { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { AddToCartProductListComponent } from './add-to-list';\nimport { IQuickOrderGridActionsViewProps, IQuickOrderGridState } from './utilities';\n\n/**\n * Interface for quick order grid action data.\n */\nexport interface IQuickOrderGridActionsData {\n    quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * Interface for quick order grid action props.\n */\nexport interface IQuickOrderGridActionsProps extends IComponentProps<IQuickOrderGridActionsData> {\n    context: ICoreContext;\n    telemetryContent?: ITelemetryContent;\n    moduleClassName: string;\n    typeName: string;\n    handlers: {\n        removeProductList(productListId: string): void;\n        onErrorMessage(message: string): void;\n    };\n    quickOrderGridState: IQuickOrderGridState;\n    resources: {\n        quickOrderGridDeleteButtonText: string;\n        quickOrderGridBuySelectedButtonText?: string;\n        quickOrderGridBuySelectedButtonAriaLabel?: string;\n        quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n        quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n        quickOrderGridGoToCartText?: string;\n        quickOrderGridDialogCloseText?: string;\n        quickOrderGridSingleItemText?: string;\n        quickOrderGridMultiLineItemFormatText?: string;\n        quickOrderGridMultiLinesFormatText?: string;\n        quickOrderGridHeaderMessageText?: string;\n        addedQuantityText?: string;\n        originalPriceText?: string;\n        currentPriceText?: string;\n        freePriceText?: string;\n    };\n}\n\n/**\n * Remove ProductList Action.\n * @param props -Quick order grid action props.\n */\nconst removeQuickOrderList = (props: IQuickOrderGridActionsProps): void => {\n    const {\n        data: { quickOrderTemplate },\n        handlers\n    } = props;\n    const { removeProductList } = handlers;\n    // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- Need to check data.\n    if (quickOrderTemplate && quickOrderTemplate.productList.Id) {\n        removeProductList(quickOrderTemplate.productList.Id);\n    }\n};\n\n/**\n * Get Addtobag Button.\n * @param props -Order template action props.\n * @returns QuickOrderGrid actions view props.\n */\nconst getQuickOrderGridAddToCartDialog = (props: IQuickOrderGridActionsProps): React.ReactNode => {\n    const {\n        data: { quickOrderTemplate },\n        context,\n        moduleClassName,\n        resources,\n        typeName\n    } = props;\n    const buttonId = 'quick-order-grid';\n    return (\n        <AddToCartProductListComponent\n            className={`${moduleClassName}-action-bar__buy-selected msc-btn`}\n            id={buttonId}\n            typeName={typeName}\n            data={{ quickOrderTemplate }}\n            context={context}\n            resources={resources}\n            onError={(result): void => {\n                if (result.cartActionResult?.errorDetails?.LocalizedMessage) {\n                    props.handlers.onErrorMessage(result.cartActionResult.errorDetails.LocalizedMessage);\n                }\n            }}\n        />\n    );\n};\n\n/**\n * Remove Quick order grid action.\n * @param props -Quick order grid action props.\n * @returns Remove order template.\n */\nconst removeActionHandler = (props: IQuickOrderGridActionsProps) => () => {\n    removeQuickOrderList(props);\n};\n\n/**\n * Quick order grid action view.\n * @param props -Quick Order Grid template action props.\n * @returns QuickOrderGrid actions view props.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name needs to be this.\nexport const QuickOrderGridActionsView = (props: IQuickOrderGridActionsProps): IQuickOrderGridActionsViewProps => {\n    const { moduleClassName, quickOrderGridState, resources } = props;\n    const { quickOrderGridDeleteButtonText } = resources;\n\n    const userMessageNode = quickOrderGridState.topStateMessage ? (\n        <Alert color={quickOrderGridState.topStateMessage.statusCssString} isOpen={quickOrderGridState.topStateMessage.isOpen}>\n            <span className={quickOrderGridState.topStateMessage.messageGlyph} />\n            <span>{quickOrderGridState.topStateMessage.messageText}</span>\n        </Alert>\n    ) : (\n        undefined\n    );\n\n    return {\n        addProductListToBag: getQuickOrderGridAddToCartDialog(props),\n        removeProductList: (\n            <Button className={`${moduleClassName}-action-bar__delete-list-button`} onClick={removeActionHandler(props)}>\n                {quickOrderGridDeleteButtonText}\n            </Button>\n        ),\n        userMessage: userMessageNode\n    };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderGridDrawerProps } from './quick-order-grid-drawer-props';\n\n/**\n * Interface for drawer state.\n */\nexport interface IQuickOrderGridDrawerState {\n    isOpen: boolean;\n}\n\n/**\n * Placement of glyph.\n */\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Grid Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\nexport class QuickOrderGridDrawer extends React.Component<IQuickOrderGridDrawerProps, IQuickOrderGridDrawerState> {\n    private readonly _drawerOpenGlyph: string;\n\n    private readonly _drawerCloseGlyph: string;\n\n    private readonly _drawerGlyphClass: string;\n\n    private _isManuallyToggled: boolean;\n\n    public constructor(props: IQuickOrderGridDrawerProps) {\n        super(props);\n        this._isManuallyToggled = false;\n        this.state = { isOpen: props.collapseProps?.isOpen ?? false };\n        this._drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n        const closeGlyph = this.props.closeGlyph ? this.props.closeGlyph : '';\n        if (this.props.isAnimateGlyph) {\n            this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : closeGlyph);\n            this._drawerCloseGlyph = this._drawerOpenGlyph;\n        } else {\n            this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : '');\n            this._drawerCloseGlyph = classnames(this._drawerGlyphClass, closeGlyph);\n        }\n    }\n\n    /**\n     * Method to call on click of drawer button.\n     * @param event - Product DeliveryOption List.\n     */\n    public toggle = (event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): void => {\n        event.preventDefault();\n        this._isManuallyToggled = true;\n        if (this.props.onToggle) {\n            this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n            this.props.onToggle(this.state);\n        } else {\n            this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n        }\n    };\n\n    public shouldComponentUpdate(nextProps: IQuickOrderGridDrawerProps, nextState: IQuickOrderGridDrawerState): boolean {\n        if (this.state === nextState && this.props === nextProps) {\n            return false;\n        }\n        return true;\n    }\n\n    public render(): JSX.Element {\n        const collapseProps: ICollapseProps = { ...this.props.collapseProps };\n\n        // If the drawer is manually toggled by pressing the button, then we use the internal state\n        if (collapseProps.isOpen === undefined || this._isManuallyToggled) {\n            collapseProps.isOpen = this.state.isOpen;\n        }\n        collapseProps.children = this.props.children;\n        const drawerClass = classnames('drawer', this.props.className);\n        const drawerButtonClassName = `${this.props.className ? this.props.className : ''}__button`;\n        this._isManuallyToggled = false;\n        return (\n            <div className={drawerClass}>\n                <Button\n                    {...this.props.toggleButtonProps}\n                    onClick={this.toggle}\n                    aria-expanded={collapseProps.isOpen}\n                    block\n                    disabled={this.props.isDisabled}\n                    className={drawerButtonClassName}\n                    color='secondary'\n                >\n                    {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen, drawerClass)}\n                </Button>\n                <Collapse {...collapseProps} />\n            </div>\n        );\n    }\n\n    private _generateDrawerButtonInnerMarkup(isCollapseState: boolean, drawerClass: string): JSX.Element {\n        const drawerButtonTextClass = classnames(\n            'drawer__buttontext',\n            this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n        );\n        const headingDrawerClass = `${drawerClass}-heading`;\n        const descriptionDrawerClass = `${drawerClass}-description`;\n        return (\n            <>\n                <h2 className={classnames(drawerButtonTextClass, headingDrawerClass)}>{this.props.moduleHeadingText}</h2>\n                <span className={classnames(drawerButtonTextClass, descriptionDrawerClass)}>{this.props.moduleDescriptionText}</span>\n                {this._generateGlyphMarkup('drawer__glyph__end', isCollapseState)}\n            </>\n        );\n    }\n\n    private _generateGlyphMarkup(location: string, isCollapseState: boolean): JSX.Element {\n        let glyphClass = isCollapseState ? this._drawerOpenGlyph : this._drawerCloseGlyph;\n        glyphClass = `${glyphClass} ${location}`;\n        return <span className={glyphClass} />;\n    }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridState } from './utilities';\n\n/**\n * Interface quick order grid form props.\n */\nexport interface IQuickOrderGridFormProps {\n    isAddtoListDisabled: boolean | undefined;\n    productTextInput: React.RefObject<HTMLInputElement>;\n    quantityTextInput: React.RefObject<HTMLInputElement>;\n    maxChars: number;\n    minQuantity?: number;\n    maxQuantity?: number;\n    moduleClassName: string;\n    ariaLabelQuantity: string;\n    ariaLabelProduct: string;\n    ariaLabelAddtoCart: string;\n    quickOrderGridState: IQuickOrderGridState;\n    handleInputChange(query: string): void;\n    handleQuantityChange(query: string): void;\n    handleAddProductListClick(): Promise<void>;\n}\n\n/**\n * Interface quick order grid form view props.\n */\nexport interface IQuickOrderGridFormViewProps {\n    product: React.ReactNode;\n    quantity: React.ReactNode;\n    addToListBtn: React.ReactNode;\n    userMessage?: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Input change value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n    handleInputChange(event.target.value || '');\n};\n\n/**\n * On Quantity Change functionality.\n * @param handleQuantityChange -Quantity change function.\n * @returns Quantity change value.\n */\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n    handleQuantityChange(event.target.value || '');\n};\n\n/**\n * Quick order grid form component.\n * @param props -Component form props.\n * @returns Quick order gridp view props..\n */\nexport const QuickOrderGridFormComponent = (props: IQuickOrderGridFormProps): IQuickOrderGridFormViewProps => {\n    const {\n        moduleClassName,\n        productTextInput,\n        quantityTextInput,\n        quickOrderGridState,\n        maxChars,\n        minQuantity,\n        maxQuantity,\n        isAddtoListDisabled,\n        ariaLabelQuantity,\n        ariaLabelProduct,\n        ariaLabelAddtoCart,\n        handleQuantityChange,\n        handleInputChange,\n        handleAddProductListClick\n    } = props;\n\n    const onInputChange = onInputChangeFunction(handleInputChange);\n\n    const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n    const productNode = (\n        <div className={`${moduleClassName}__content-form-main-product`}>\n            <h2 className={`${moduleClassName}__content-form-main-product-lable`} aria-label={ariaLabelProduct}>\n                {ariaLabelProduct}\n            </h2>\n            <input\n                className={`${moduleClassName}__content-form-main-product-input`}\n                type='text'\n                aria-label={ariaLabelProduct}\n                ref={productTextInput}\n                onChange={onInputChange}\n            />\n        </div>\n    );\n\n    const quantityNode = (\n        <div className={`${moduleClassName}__content-form-main-quantity`}>\n            <h2 className={`${moduleClassName}__content-form-main-quantity-lable`} aria-label={ariaLabelQuantity}>\n                {ariaLabelQuantity}\n            </h2>\n            <input\n                className={`${moduleClassName}__content-form-main-quantity-input`}\n                pattern='[0-9]*'\n                ref={quantityTextInput}\n                onChange={onQuantityInputChange}\n                maxLength={maxChars}\n                type='number'\n                aria-live='polite'\n                aria-label={ariaLabelQuantity}\n                aria-valuemin={minQuantity}\n                aria-valuemax={maxQuantity}\n                aria-valuenow={quickOrderGridState.quantity}\n            />\n        </div>\n    );\n\n    const addToListNode = (\n        <div className={`${moduleClassName}__content-form-main-add-to-product-list`}>\n            <Button\n                className={`${moduleClassName}__content-form-main-add-to-product-list-button`}\n                disabled={isAddtoListDisabled}\n                aria-label={ariaLabelAddtoCart}\n                onClick={handleAddProductListClick}\n            >\n                {ariaLabelAddtoCart}\n            </Button>\n        </div>\n    );\n\n    const userMessageNode = quickOrderGridState.stateMessage ? (\n        <Alert color={quickOrderGridState.stateMessage.statusCssString} isOpen={quickOrderGridState.stateMessage.isOpen}>\n            <span className={quickOrderGridState.stateMessage.messageGlyph} />\n            <span>{quickOrderGridState.stateMessage.messageText}</span>\n        </Alert>\n    ) : (\n        undefined\n    );\n\n    return {\n        product: productNode,\n        addToListBtn: addToListNode,\n        quantity: quantityNode,\n        userMessage: userMessageNode\n    };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { QuickOrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order grid.\n */\nexport class QuickOrderGridProduct {\n    @observable\n    public isSelected: boolean;\n\n    public readonly productLine: QuickOrderTemplateLine;\n\n    public constructor(productLine: QuickOrderTemplateLine) {\n        this.productLine = productLine;\n        this.isSelected = false;\n    }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Interface for quick order grid table header resources.\n */\nexport interface IQuickOrderGridTableHeaderResources {\n    quickOrderGridProductNumberText: string;\n    quickOrderGridProductText: string;\n    quickOrderGridUnitPriceText: string;\n    quickOrderGridUnitOfMeasureText: string;\n    quickOrderGridQuantityText: string;\n    quickOrderGridActionsText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableHeaderProps extends IComponentProps {\n    context: ICoreContext;\n    className: string;\n\n    isMobile: boolean;\n    resources: IQuickOrderGridTableHeaderResources;\n}\n\n/**\n * Interface for quick order grid table header component.\n */\nexport interface IQuickOrderGridTableHeaderComponent extends IComponent<IQuickOrderGridTableHeaderProps> {}\n\n/**\n * Get the quick order grid header cells for desktop.\n * @param props -- The quick order grid table header props.\n * @returns The list of cells for quick order grid header component in desktop version.\n */\nconst QuickOrderGridDesktopHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n    const { resources } = props;\n    const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n    return (\n        <>\n            <th>\n                <span className={classnames(`${props.className}__emptyColumn`)} />\n            </th>\n            <th>{resources.quickOrderGridProductNumberText}</th>\n            <th>{resources.quickOrderGridProductText}</th>\n            <th className={columnWithNumberClassName}>{resources.quickOrderGridUnitPriceText}</th>\n            <th>{resources.quickOrderGridUnitOfMeasureText}</th>\n            <th className={columnWithNumberClassName}>{resources.quickOrderGridQuantityText}</th>\n            <th>{resources.quickOrderGridActionsText}</th>\n        </>\n    );\n};\n\n/**\n * Get the quick order grid header cells for mobile.\n * @param props -- The quick order grid table header props.\n * @returns The quick order grid header component in desktop version.\n */\nconst QuickOrderGridMobileHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n    const { resources } = props;\n    return (\n        <>\n            <th className={classnames(`${props.className}__emptyColumn`)} />\n            <th>{resources.quickOrderGridProductNumberText}</th>\n            <th />\n        </>\n    );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderGridTableHeaderComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n    const rowClassName = `${props.className}__row`;\n\n    let headerCells: JSX.Element;\n    if (props.isMobile) {\n        headerCells = <QuickOrderGridMobileHeaderCellsComponent {...props} />;\n    } else {\n        headerCells = <QuickOrderGridDesktopHeaderCellsComponent {...props} />;\n    }\n\n    return (\n        <thead className={props.className}>\n            <tr className={rowClassName}>{headerCells}</tr>\n        </thead>\n    );\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 MsDyn365, { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductPrice } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { QuickOrderGridProduct } from '../../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../../utilities';\n\n/**\n * Data required to render each quick order grid row.\n */\nexport interface IQuickOrderGridTableRowData {\n    product: QuickOrderGridProduct;\n}\n\n/**\n * Resources for quick order grid table rows.\n */\nexport interface IQuickOrderGridTableRowResources {\n    quickOrderGridQuantityMobileText: string;\n    quickOrderGridProductDimensionsSeparator: string;\n    quickOrderGridViewDetailsButtonText: string;\n    quickOrderGridViewDetailsButtonAriaLabel: string;\n    quickOrderGridRemoveItemButtonAriaLabel: string;\n    quickOrderGridInputQuantityAriaLabel: string;\n    quickOrderGridDecrementButtonAriaLabel: string;\n    quickOrderGridIncrementButtonAriaLabel: string;\n    originalPriceText: string;\n    currentPriceText: string;\n    freePriceText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableRowProps extends IComponentProps<IQuickOrderGridTableRowData> {\n    context: ICoreContext;\n    className: string;\n    productListLine: ProductListLine;\n    price?: ProductPrice;\n    moduleId: string;\n    moduleTypeName: string;\n    min: number;\n    max: number;\n    quantity: number;\n    imageSettings?: IImageSettings;\n    isMobile: boolean;\n    resources: IQuickOrderGridTableRowResources;\n    index: number;\n    callbacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * The default image settings for quick order grid table row.\n */\nconst defaultImageSettings: IImageSettings = {\n    viewports: {\n        xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n        lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n    },\n    lazyload: true,\n    cropFocalRegion: true\n};\n\n/**\n * Renders product image for quick order grid row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderGridTableRowProductImageComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n    const product = props.data.product.productLine.fullProduct?.ProductDetails;\n    const fallbackImageUrl = getFallbackImageUrl(\n        product?.ItemId,\n        props.context.actionContext.requestContext.apiSettings,\n        props.context.request.app?.config?.OmniChannelMedia\n    );\n\n    const containerClassName = `${props.className}__product-image-container`;\n\n    return (\n        <div className={containerClassName}>\n            <Image\n                requestContext={props.context.actionContext.requestContext}\n                className={`${containerClassName}__product-image`}\n                altText={product?.Name}\n                src={product?.PrimaryImageUrl ?? ''}\n                fallBackSrc={fallbackImageUrl}\n                gridSettings={props.context.request.gridSettings!}\n                imageSettings={props.imageSettings ?? defaultImageSettings}\n                loadFailureBehavior='empty'\n            />\n        </div>\n    );\n};\n\nlet setShowPreviousActions: React.Dispatch<React.SetStateAction<boolean>> | undefined;\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderProductPrice = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n    const { context, moduleId, moduleTypeName, resources } = props;\n    const price = props.price;\n\n    if (price) {\n        return (\n            <PriceComponent\n                id={moduleId}\n                typeName={moduleTypeName}\n                data={{ price }}\n                className='ms-quick-order-grid-row__product-price'\n                freePriceText={resources.freePriceText}\n                originalPriceText={resources.originalPriceText}\n                currentPriceText={resources.currentPriceText}\n                context={context}\n            />\n        );\n    }\n    return null;\n};\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderUnitOfMeasure = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n    const price = props.price;\n\n    if (price) {\n        return (\n            <div className='ms-quick-order-grid-row__product-unit-of-measure'>\n                {StringExtensions.isNullOrEmpty(props.productListLine.UnitOfMeasure) || price.UnitOfMeasure}\n            </div>\n        );\n    }\n    return null;\n};\n\n/**\n * On Change function.\n * @param onChangeQuantity -On change quantity function.\n * @param itemKey -String.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onChangeHandler = (\n    onChangeQuantity: (\n        orderTemplateLineId: string | undefined,\n        quantity: number,\n        props?: IQuickOrderGridTableRowProps | undefined\n    ) => boolean,\n    itemKey: string | undefined,\n    props: IQuickOrderGridTableRowProps\n) => (newValue: number) => {\n    onChangeQuantity(itemKey, newValue, props);\n    return true;\n};\n\n/**\n * On Change function.\n * @param onRemoveItem -On change quantity function.\n * @param quickOrderGridProductKey -QuickOrderGridp Product.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onRemoveHandler = (\n    onRemoveItem: (quickOrderGridProduct: QuickOrderGridProduct, props?: IQuickOrderGridTableRowProps | undefined) => void,\n    quickOrderGridProductKey: QuickOrderGridProduct,\n    props: IQuickOrderGridTableRowProps\n) => () => {\n    onRemoveItem(quickOrderGridProductKey, props);\n};\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderGridExtraActionsPopupComponent: React.FC<IQuickOrderGridTableRowProps> = (\n    props: IQuickOrderGridTableRowProps\n): JSX.Element | null => {\n    const {\n        resources: { quickOrderGridViewDetailsButtonAriaLabel, quickOrderGridViewDetailsButtonText }\n    } = props;\n    const product = props.data.product.productLine.fullProduct?.ProductDetails;\n    const [shouldShowActions, setShowActions] = useState(false);\n    let productUrl = '';\n    if (product === undefined) {\n        return null;\n    }\n    if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n        productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n    }\n\n    const onClickViewDetails = React.useCallback(() => {\n        if (MsDyn365.isBrowser) {\n            window.location.href = productUrl;\n        }\n    }, [productUrl]);\n\n    const toggle = React.useCallback(() => {\n        const shouldShowActionsNewValue = !shouldShowActions;\n        if (shouldShowActionsNewValue) {\n            if (setShowPreviousActions) {\n                setShowPreviousActions(false);\n            }\n            setShowActions(shouldShowActionsNewValue);\n            setShowPreviousActions = setShowActions;\n        } else {\n            setShowPreviousActions = undefined;\n            setShowActions(shouldShowActionsNewValue);\n        }\n    }, [shouldShowActions, setShowActions]);\n\n    if (StringExtensions.isNullOrWhitespace(productUrl)) {\n        return null;\n    }\n\n    const className = `${props.className}__extra-actions-cell`;\n    const actionsContainerClassName = `${className}__actions-container`;\n\n    return (\n        <div className={className}>\n            <Button className={`${className}__toggle`} onClick={toggle} />\n            {shouldShowActions && (\n                <div className={actionsContainerClassName}>\n                    <Button\n                        className={`${actionsContainerClassName}__view-details`}\n                        onClick={onClickViewDetails}\n                        aria-label={quickOrderGridViewDetailsButtonAriaLabel}\n                    >\n                        {quickOrderGridViewDetailsButtonText}\n                    </Button>\n                    <Button\n                        className={`${props.className}__product-remove`}\n                        aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n                    >\n                        {props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n                    </Button>\n                </div>\n            )}\n        </div>\n    );\n};\n\n/**\n * Renders quick order grid table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for desktop view.\n */\nexport const QuickOrderGridDesktopTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n    const product = props.data.product.productLine.fullProduct?.ProductDetails;\n    const productListLine = props.data.product.productLine.productListLine;\n    const { min, max, quantity } = props;\n    const columnWithNumberClassName = `${props.className}__column-with-number`;\n    if (product !== undefined) {\n        let productUrl = '';\n        if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n            productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n        }\n\n        return (\n            <>\n                <td>\n                    <QuickOrderGridTableRowProductImageComponent {...props} />\n                </td>\n                <td>{product.ItemId}</td>\n                <td>\n                    <div className={`${props.className}__product-info`}>\n                        <a className={`${props.className}__product-name`} href={productUrl}>\n                            {product.Name}\n                        </a>\n                        <span className={`${props.className}__product-dimensions`}>\n                            {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n                                .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n                                .join(props.resources.quickOrderGridProductDimensionsSeparator)}\n                        </span>\n                    </div>\n                </td>\n                <td className={columnWithNumberClassName}>{renderProductPrice(props)}</td>\n                <td>{renderUnitOfMeasure(props)}</td>\n                <td className={`${props.className}__product-quantity`}>\n                    <IncrementalQuantity\n                        id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n                        min={min}\n                        max={max}\n                        currentCount={quantity}\n                        inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n                        decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n                        incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n                        key={productListLine.LineId}\n                        isGiftCard={product.IsGiftCard}\n                        onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n                    />\n                </td>\n                <td>\n                    <Button\n                        className={`${props.className}__product-remove`}\n                        aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n                        onClick={onRemoveHandler(props.callbacks.onRemoveItem, props.data.product, props)}\n                    />\n                </td>\n            </>\n        );\n    }\n\n    return null;\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for mobile view.\n */\nexport const QuickOrderGridMobileTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n    const product = props.data.product.productLine.fullProduct?.ProductDetails;\n    const productListLine = props.data.product.productLine.productListLine;\n    const { min, max, quantity } = props;\n    if (product !== undefined) {\n        return (\n            <>\n                <td>\n                    <QuickOrderGridTableRowProductImageComponent {...props} />\n                </td>\n                <td>\n                    <div className={`${props.className}__product-info`}>\n                        <span className={`${props.className}__product-name`}>{product.RecordId}</span>\n                        <span className={`${props.className}__product-quantity`}>\n                            <IncrementalQuantity\n                                id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n                                min={min}\n                                max={max}\n                                currentCount={quantity}\n                                inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n                                decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n                                incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n                                key={productListLine.LineId}\n                                isGiftCard={product.IsGiftCard}\n                                onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n                            />\n                        </span>\n                    </div>\n                </td>\n                <td>\n                    <QuickOrderGridExtraActionsPopupComponent {...props} />\n                </td>\n            </>\n        );\n    }\n    return null;\n};\n\n/**\n * Quick order table row component.\n * @param props - Configuration of the component.\n * @returns React node for the row.\n */\nexport const QuickOrderGridTableRowComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n    const rowClassName = `${props.className}__row`;\n    const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n    let headerCells: JSX.Element;\n    if (isMobileView) {\n        headerCells = <QuickOrderGridMobileTableRowCellComponent {...props} />;\n    } else {\n        headerCells = <QuickOrderGridDesktopTableRowCellComponent {...props} />;\n    }\n\n    return (\n        <thead className={props.className}>\n            <tr className={rowClassName}>{headerCells}</tr>\n        </thead>\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, { IComponent, IComponentProps, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { QuickOrderGridProduct } from '../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../utilities';\nimport {\n    IQuickOrderGridTableHeaderResources,\n    IQuickOrderGridTableRowResources,\n    QuickOrderGridTableHeaderComponent,\n    QuickOrderGridTableRowComponent\n} from './components';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderGridTableData {\n    quickOrderGridProducts: QuickOrderGridProduct[];\n    isOrderQuantityLimitsFeatureEnabled: boolean;\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderGridTableResources extends IQuickOrderGridTableHeaderResources, IQuickOrderGridTableRowResources {}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderGridTableProps extends IComponentProps<IQuickOrderGridTableData> {\n    context: ICoreContext;\n    className: string;\n    moduleId: string;\n    moduleTypeName: string;\n\n    resources: IQuickOrderGridTableResources;\n    isMobileView: boolean;\n    imageSettings?: IImageSettings;\n    callBacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderGridTableComponent extends IComponent<IQuickOrderGridTableProps> {}\n\n/**\n * The quick order table.\n * @param props -- The quick order table props.\n * @returns The quick order table element.\n */\nexport const QuickOrderGridTableComponent: React.FC<IQuickOrderGridTableProps> = (props: IQuickOrderGridTableProps) => {\n    const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n    const quickOrderGridProducts = props.data.quickOrderGridProducts;\n    const isOrderQuantityLimitsFeatureEnabled = props.data.isOrderQuantityLimitsFeatureEnabled;\n\n    /**\n     * Update the view port.\n     */\n    const updateViewport = () => {\n        setIsMobile(props.isMobileView);\n    };\n\n    if (MsDyn365.isBrowser) {\n        window.addEventListener('resize', updateViewport);\n    }\n\n    const headerClassName = `${props.className}__header`;\n    const rowClassName = `${props.className}__row`;\n\n    return (\n        <table className={props.className}>\n            <QuickOrderGridTableHeaderComponent\n                context={props.context}\n                typeName={props.typeName}\n                id={headerClassName}\n                className={headerClassName}\n                isMobile={isMobile}\n                resources={props.resources}\n                data={{}}\n            />\n            {quickOrderGridProducts.map((quickOrderProduct, index) => {\n                let quantity = quickOrderProduct.productLine.productListLine.Quantity!;\n                const product = quickOrderProduct.productLine.fullProduct;\n                let min: number = 1;\n                let max: number = 10;\n                const behavior = product?.ProductDetails?.Behavior;\n                if (isOrderQuantityLimitsFeatureEnabled && !ObjectExtensions.isNullOrUndefined(behavior)) {\n                    if (behavior.MinimumQuantity && behavior.MinimumQuantity > 0) {\n                        min = behavior.MinimumQuantity;\n                    }\n                    if (behavior.MaximumQuantity && behavior.MaximumQuantity > 0) {\n                        max = behavior.MaximumQuantity;\n                    }\n                    quantity = Math.max(quantity, min);\n                }\n                const price = quickOrderProduct.productLine.fullProduct?.ProductPrice;\n                return (\n                    <QuickOrderGridTableRowComponent\n                        context={props.context}\n                        typeName={props.typeName}\n                        id={`${rowClassName}-${index}`}\n                        key={quickOrderProduct.productLine.fullProduct?.ProductDetails.RecordId}\n                        className={rowClassName}\n                        resources={props.resources}\n                        isMobile={isMobile}\n                        price={price}\n                        moduleId={props.moduleId}\n                        moduleTypeName={props.moduleTypeName}\n                        min={min}\n                        max={max}\n                        quantity={quantity}\n                        index={index}\n                        imageSettings={props.imageSettings}\n                        productListLine={quickOrderProduct.productLine.productListLine}\n                        callbacks={props.callBacks}\n                        data={{\n                            product: quickOrderProduct\n                        }}\n                    />\n                );\n            })}\n        </table>\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    getProductConfigure,\n    IProductDimensionCallbacks,\n    IProductDimensionConfigureResources,\n    IProductDimensionConfigureViewProps\n} from '@msdyn365-commerce/components';\nimport {\n    ProductDimension,\n    ProductDimensionType,\n    ProductDimensionValue,\n    ProductListsDataActions,\n    ProductListType,\n    SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n    addItemToProductListAction,\n    AddItemToProductListInput,\n    ArrayExtensions,\n    createProductList,\n    CreateProductListInput,\n    FinitePromiseQueue,\n    FinitePromiseQueueError,\n    getDimensionsForSelectedVariant,\n    GetDimensionsForSelectedVariantInput,\n    getScanResult,\n    GetScanResultInput,\n    getSelectedVariant,\n    IDimensionForSelectedVariant,\n    IPromiseQueue,\n    ObjectExtensions,\n    QuickOrderTemplate,\n    QuickOrderTemplateLine,\n    SelectedVariantInput,\n    StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n    getTelemetryObject,\n    Heading,\n    IModuleProps,\n    INodeProps,\n    isMobile,\n    ITelemetryContent,\n    VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { getCatalogId } from '@msdyn365-commerce/core';\nimport { ActiveProductListInput } from './actions';\nimport {\n    EcommerceQuantityLimitConfigurationsFeatureName,\n    IQuickOrderGridActionsProps,\n    IQuickOrderGridActionsViewProps,\n    IQuickOrderGridRowCallbacks,\n    IQuickOrderGridState,\n    QuickOrderGridActionsView,\n    QuickOrderGridDrawer,\n    QuickOrderGridFormComponent,\n    QuickOrderGridProduct,\n    QuickOrderGridTableComponent,\n    RetailDefaultOrderQuantityLimitsFeatureName\n} from './components';\nimport { IQuickOrderGridData } from './quick-order-grid.data';\nimport { IQuickOrderGridProps, IQuickOrderGridResources } from './quick-order-grid.props.autogenerated';\n\n/**\n * QuickOrder Grid View props.\n */\nexport interface IQuickOrderGridViewProps extends IQuickOrderGridProps<IQuickOrderGridData> {\n    header: JSX.Element;\n    actions?: INodeProps;\n    isB2bCustomer?: boolean;\n    isQuickOrderGridFormExpanded: boolean;\n    contentProps: INodeProps;\n    drawer: INodeProps;\n    loading?: React.ReactNode;\n    quickOrderGridForm: INodeProps;\n    quickOrderGridFormProductContent: INodeProps;\n    quickOrderGridFormMsgContent: INodeProps;\n    quickOrderGridProps: IModuleProps;\n    form: React.ReactNode;\n    configure?: IProductDimensionConfigureViewProps;\n    isMobileView: boolean;\n    container?: JSX.Element;\n    orderActions?: IQuickOrderGridActionsViewProps | null;\n    bulkPurchase?: React.ReactNode;\n}\n\n/**\n * QuickOrder Grid View port.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * QuickOrderGrid component.\n * @extends {React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>>}\n */\nclass QuickOrderGrid extends React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>, IQuickOrderGridState> {\n    private readonly _productTextInput: React.RefObject<HTMLInputElement>;\n\n    private readonly _quantityInput: React.RefObject<HTMLInputElement>;\n\n    private readonly _waitTime: number = 500;\n\n    private readonly _dimensionUpdateQueueMaxLength: number = 2;\n\n    private readonly _errorCssClass: string = 'danger';\n\n    private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n\n    private readonly _quickOrderGridFormClass: string;\n\n    private readonly _quickOrderGridFormProductContent: string;\n\n    private readonly _quickOrderGridFormMsgContent: string;\n\n    private readonly _telemetryContent: ITelemetryContent;\n\n    private readonly _dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(this._dimensionUpdateQueueMaxLength);\n\n    private _dimensions: { [id: number]: string } = {};\n\n    private _initializedDimensions: Set<string> = new Set();\n\n    private readonly _cssClassNameConfigure: string = 'ms-quick-order_grid__content-form-main';\n\n    private readonly _className: string = 'ms-quick-order-grid';\n\n    // @ts-expect-error: Debouce needs to be used as type.\n    private _cancellabelDebounce: debounce;\n\n    private _isOrderQuantityLimitsFeatureEnabled: boolean = false;\n\n    private _isChannelLimitsFeatureEnabled: boolean = false;\n\n    private _applyDefaultOrderSettingsForCartLine: boolean = false;\n\n    private readonly _quickOrderGridCallbacks: IProductDimensionCallbacks = {\n        initializeDimension: (initializedDimension: string): void => {\n            if (initializedDimension) {\n                this._initializedDimensions.add(initializedDimension);\n            }\n        },\n        /**\n         * Get Dropdown name.\n         * @param selectedDimensionId - Dimension type.\n         * @param selectedDimensionValueId - Resources.\n         * @returns Dropdown name.\n         */\n        dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n            this._dimensions[selectedDimensionId] = selectedDimensionValueId;\n            // Only trigger _updateDimensions when all dimensions are initialized\n            if (this._initializedDimensions.size === this.state.productDimensions?.length) {\n                return this._dimensionUpdateQueue\n                    .enqueue(async () => {\n                        return this._updateDimensions();\n                    })\n                    .catch((error: string) => {\n                        // Ignore discarded processes.\n                        if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n                            throw new Error(error);\n                        }\n                    });\n            }\n        },\n\n        /**\n         * Get Dropdown name.\n         * @param dimensionType - Dimension type.\n         * @param resources - Resources.\n         * @returns Dropdown name.\n         */\n        getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n            return this._getDropdownName(dimensionType, resources);\n        },\n\n        /**\n         * Method to call on dimension change.\n         * @param isUpdatingDimension - Flag to update dimension.\n         */\n        changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n            this.setState({ isUpdatingDimension });\n        }\n    };\n\n    private readonly _quickOrderGridRowCallbacks: IQuickOrderGridRowCallbacks = {\n        /**\n         * Method to call remove button.\n         * @param line - Grid row product.\n         */\n        onRemoveItem: (line: QuickOrderGridProduct): void => {\n            this._removeItemRowFromTable(line.productLine);\n        },\n\n        /**\n         * Method to call on change quantity button.\n         * @param productListLineId - Grid row product list line id.\n         * @param quantity - Product quantity.\n         * @returns - Falg to get confirmation for action.\n         */\n        onChangeQuantity: (productListLineId: string | undefined, quantity: number): boolean => {\n            return this._changeRowQuantity(productListLineId, quantity);\n        }\n    };\n\n    public constructor(props: IQuickOrderGridProps<IQuickOrderGridData>) {\n        super(props);\n        this._productTextInput = React.createRef();\n        this._quantityInput = React.createRef<HTMLInputElement>();\n\n        this._telemetryContent = getTelemetryObject(\n            this.props.context.request.telemetryPageName!,\n            this.props.friendlyName,\n            this.props.telemetry\n        );\n        this.state = {\n            isQuickOrderGridFormExpanded: false,\n            min: 0,\n            max: 10,\n            quantity: 1,\n            productResponse: undefined,\n            productDimensions: undefined,\n            productDimensionErrorState: {\n                configureErrors: {}\n            },\n            isMobile: this.isMobile,\n            products: [],\n            isUpdatingDimension: false,\n            productListId: ''\n        };\n\n        this._quickOrderGridFormClass = 'ms-quick-order-grid__content-form';\n        this._quickOrderGridFormProductContent = 'ms-quick-order-grid__content-form-main';\n        this._quickOrderGridFormMsgContent = 'ms-quick-order-grid__content-form-msg';\n\n        this._isOrderQuantityLimitsFeatureEnabled =\n            this.props.data.featureState.result?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)\n                ?.IsEnabled ?? false;\n\n        this._isChannelLimitsFeatureEnabled =\n            this.props.data.featureState.result?.find(featureState => featureState.Name === EcommerceQuantityLimitConfigurationsFeatureName)\n                ?.IsEnabled ?? false;\n\n        const cartConfiguration = this.props.data.cartConfiguration;\n        this._applyDefaultOrderSettingsForCartLine = cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n    }\n\n    @computed public get isMobile(): boolean {\n        const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n        return size === 'xs';\n    }\n\n    public render(): JSX.Element | null {\n        const { data } = this.props;\n        if (!data.customerInformation.result) {\n            return null;\n        }\n        const quickOrderTemplate = data.quickOrderTemplate;\n\n        if (quickOrderTemplate?.result !== undefined) {\n            this.setState({\n                products: quickOrderTemplate.result.quickOrderTemplateLines,\n                productListId: quickOrderTemplate.result.productList.Id\n            });\n        }\n        const { className = '', maxQuantity } = this.props.config;\n        const customerInfo = this.props.data.customerInformation.result;\n        const {\n            quickOrderGridModuleHeading,\n            quickOrderGridModuleDescription,\n            quickOrderGridAddtogrid,\n            quickOrderGridProductQuantityInputLabel,\n            quickOrderGridProductInputLabel,\n            quickOrderGridProductDimensionTypeColor,\n            quickOrderGridProductDimensionTypeConfiguration,\n            quickOrderGridSelectDimensionFormatString,\n            quickOrderGridProductDimensionTypeSize,\n            quickOrderGridProductDimensionTypeStyle,\n            quickOrderGridProductDimensionTypeAmount,\n            quickOrderGridModulePageHeading\n        } = this.props.resources;\n\n        const productConfigureResources: IProductDimensionConfigureResources = {\n            selectDimensionFormatString: quickOrderGridSelectDimensionFormatString,\n            productDimensionTypeColor: quickOrderGridProductDimensionTypeColor,\n            productDimensionTypeConfiguration: quickOrderGridProductDimensionTypeConfiguration,\n            productDimensionTypeSize: quickOrderGridProductDimensionTypeSize,\n            productDimensionTypeStyle: quickOrderGridProductDimensionTypeStyle,\n            productDimensionTypeAmount: quickOrderGridProductDimensionTypeAmount\n        };\n\n        const { isQuickOrderGridFormExpanded, productDimensionErrorState, productResponse, productDimensions } = this.state;\n\n        const headerClassName = `${this._className}__header`;\n\n        const header = (\n            <div className={headerClassName}>\n                <Heading className={`${headerClassName}-heading`} text={quickOrderGridModulePageHeading} />\n            </div>\n        );\n\n        const viewProps: IQuickOrderGridViewProps = {\n            ...(this.props as IQuickOrderGridProps<IQuickOrderGridData>),\n\n            quickOrderGridProps: { className: classnames('ms-quick-order-grid', className), moduleProps: this.props },\n            contentProps: { className: 'ms-quick-order-grid__content' },\n            isB2bCustomer: customerInfo?.IsB2b,\n            header,\n            actions: {\n                className: `${this._className}-action-bar`,\n                tag: 'div'\n            },\n            drawer: {\n                tag: QuickOrderGridDrawer,\n                className: `${this._className}__drawer`,\n                collapseProps: { isOpen: this.state.isQuickOrderGridFormExpanded },\n                moduleHeadingText: quickOrderGridModuleHeading,\n                moduleDescriptionText: quickOrderGridModuleDescription,\n                requestContext: this.props.context.request,\n                telemetryContent: this._telemetryContent\n            },\n            bulkPurchase: this._renderBulkPurchase(),\n            quickOrderGridForm: {\n                className: `${this._quickOrderGridFormClass} ${isQuickOrderGridFormExpanded ? 'qo-show' : 'qo-hide'}`\n            },\n            quickOrderGridFormProductContent: {\n                className: this._quickOrderGridFormProductContent\n            },\n            quickOrderGridFormMsgContent: {\n                className: this._quickOrderGridFormMsgContent\n            },\n            form: QuickOrderGridFormComponent({\n                productTextInput: this._productTextInput,\n                quantityTextInput: this._quantityInput,\n                isAddtoListDisabled: !productResponse,\n                ariaLabelAddtoCart: quickOrderGridAddtogrid,\n                ariaLabelProduct: quickOrderGridProductInputLabel,\n                ariaLabelQuantity: quickOrderGridProductQuantityInputLabel,\n                maxChars: 50,\n                minQuantity: this.state.min ?? 0,\n                maxQuantity: this.state.max ?? maxQuantity,\n                moduleClassName: this._className,\n                quickOrderGridState: this.state,\n                handleInputChange: this._handleInputChange,\n                handleQuantityChange: this._handleQuantityChange,\n                handleAddProductListClick: this._addItemToProductListLine\n            }),\n            configure:\n                productResponse && productDimensions\n                    ? getProductConfigure(\n                          this._cssClassNameConfigure,\n                          this.props.context,\n                          this.props.friendlyName,\n                          this.props.telemetry,\n                          quickOrderGridSelectDimensionFormatString,\n                          productConfigureResources,\n                          this._quickOrderGridCallbacks,\n                          productResponse,\n                          productDimensions,\n                          productDimensionErrorState\n                      )\n                    : undefined,\n            isQuickOrderGridFormExpanded: this.state.isQuickOrderGridFormExpanded,\n            isMobileView: this.state.isMobile,\n            container: ArrayExtensions.hasElements(this.state.products) ? this._renderListContainer() : undefined,\n            orderActions: this._renderQuickOrderGridActions(quickOrderTemplate?.result)\n        };\n\n        return this.props.renderView(viewProps) as React.ReactElement;\n    }\n\n    private _renderQuickOrderGridActions(quickOrderTemplate: QuickOrderTemplate | undefined): IQuickOrderGridActionsViewProps | null {\n        const { typeName, context, resources } = this.props;\n        const {\n            quickOrderGridDeleteButtonText,\n            quickOrderGridBuySelectedButtonText,\n            quickOrderGridBuySelectedButtonAriaLabel,\n            quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n            quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n            quickOrderGridGoToCartText,\n            quickOrderGridDialogCloseText,\n            quickOrderGridSingleItemText,\n            quickOrderGridMultiLineItemFormatText,\n            quickOrderGridMultiLinesFormatText,\n            quickOrderGridHeaderMessageText,\n            addedQuantityText,\n            originalPriceText,\n            currentPriceText,\n            freePriceText\n        } = resources;\n        if (ArrayExtensions.hasElements(quickOrderTemplate?.quickOrderTemplateLines)) {\n            const quickOrderGridActions: IQuickOrderGridActionsProps = {\n                data: { quickOrderTemplate },\n                moduleClassName: this._className,\n                id: 'quick-order-grid',\n                typeName,\n                context,\n                handlers: {\n                    removeProductList: this._removeProductList,\n                    onErrorMessage: (message: string) =>\n                        this.setState({\n                            topStateMessage: {\n                                messageText: message,\n                                statusCssString: this._errorCssClass,\n                                messageGlyph: this._errorCssGlyphClass,\n                                isOpen: true\n                            }\n                        })\n                },\n                quickOrderGridState: this.state,\n                resources: {\n                    quickOrderGridDeleteButtonText,\n                    quickOrderGridBuySelectedButtonText,\n                    quickOrderGridBuySelectedButtonAriaLabel,\n                    quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n                    quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n                    quickOrderGridGoToCartText,\n                    quickOrderGridDialogCloseText,\n                    quickOrderGridSingleItemText,\n                    quickOrderGridMultiLineItemFormatText,\n                    quickOrderGridMultiLinesFormatText,\n                    quickOrderGridHeaderMessageText,\n                    addedQuantityText,\n                    originalPriceText,\n                    currentPriceText,\n                    freePriceText\n                }\n            };\n\n            return QuickOrderGridActionsView(quickOrderGridActions);\n        }\n        return null;\n    }\n\n    /**\n     * Renders bulk purchase module.\n     * @returns Bulk purchase module react node.\n     */\n    private _renderBulkPurchase(): React.ReactNode {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Temporary switch for the feature which is under development.\n        if (!this.props.context.app.config.isBulkPurchaseEnabled) {\n            return null;\n        }\n\n        if (!ArrayExtensions.hasElements(this.props.slots.bulkPurchaseSlots)) {\n            return null;\n        }\n\n        const containerClass = `${this._className}__bulk-purchase`;\n        return (\n            <div className={containerClass}>\n                {React.cloneElement(this.props.slots.bulkPurchaseSlots[0] as React.ReactElement, {\n                    productDimensions: this.state.productDimensions\n                })}\n            </div>\n        );\n    }\n\n    /**\n     * Render list container.\n     * @returns JSX element.\n     */\n    private _renderListContainer(): JSX.Element {\n        const containerClass = `${this._className}__table-content`;\n        return <div className={containerClass}>{this._renderQuickOrderTable(this._className)}</div>;\n    }\n\n    /**\n     * Initial the products on quick order.\n     * @returns List of quick order products or undefined.\n     */\n    private _initQuickOrderGridProducts(): QuickOrderGridProduct[] {\n        const products: QuickOrderTemplateLine[] = this.state.products;\n\n        const quickOrderGridProduct: QuickOrderGridProduct[] = products.map((product: QuickOrderTemplateLine) => {\n            return new QuickOrderGridProduct(product);\n        });\n\n        return ArrayExtensions.validValues(quickOrderGridProduct);\n    }\n\n    /**\n     * Method to call on clear button.\n     */\n    private readonly _removeProductList = () => {\n        const { context, data, telemetry, resources } = this.props;\n        const { quickOrderTemplate } = data;\n        const userToken = context.request.user.isAuthenticated && context.request.user.token;\n        if (userToken && quickOrderTemplate && quickOrderTemplate.result) {\n            ProductListsDataActions.deleteAsync({ callerContext: context.actionContext }, quickOrderTemplate.result.productList)\n                .then(() => {\n                    window.location.reload();\n                })\n                .catch((error: string) => {\n                    telemetry.warning('[quick-order-grid] Unable to delete product list.');\n                    telemetry.error(error);\n                    this._updateStatusState(\n                        resources.quickOrderGridDeleteProductListFailedText,\n                        this._errorCssClass,\n                        this._errorCssGlyphClass,\n                        true\n                    );\n                });\n        } else {\n            telemetry.warning('[quick-order-grid] Failed to delete product list. Product List was not found');\n        }\n    };\n\n    /**\n     * Initial the products on quick order.\n     * @param className - Class name.\n     * @returns JSX element.\n     */\n    private _renderQuickOrderTable(className: string): JSX.Element {\n        const tableClassName = `${className}__table-list`;\n\n        return (\n            <QuickOrderGridTableComponent\n                id={tableClassName}\n                moduleId={this.props.id}\n                moduleTypeName={this.props.typeName}\n                typeName={this.props.typeName}\n                key={tableClassName}\n                className={tableClassName}\n                data={{\n                    quickOrderGridProducts: this._initQuickOrderGridProducts(),\n                    isOrderQuantityLimitsFeatureEnabled: this._isOrderQuantityLimitsFeatureEnabled\n                }}\n                context={this.props.context}\n                resources={this.props.resources}\n                isMobileView={this.state.isMobile}\n                callBacks={this._quickOrderGridRowCallbacks}\n            />\n        );\n    }\n\n    private _updateQuantitiesInState(product: SimpleProduct): void {\n        const min: number = this._getMinQuantityForCartLineItem(this._isOrderQuantityLimitsFeatureEnabled, product);\n        const max: number = this._getMaxQuantityForCartLineItem(\n            this._isChannelLimitsFeatureEnabled || this._isOrderQuantityLimitsFeatureEnabled,\n            product\n        );\n        let quantity: number = this._getQuantity(\n            this._isOrderQuantityLimitsFeatureEnabled,\n            this._applyDefaultOrderSettingsForCartLine,\n            product\n        );\n        quantity = Math.max(quantity, min);\n\n        this.setState({\n            min,\n            max,\n            quantity\n        });\n    }\n\n    private _getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n        if (\n            isOrderQuantityLimitsFeatureEnabled &&\n            this._getIgnoreOrderSettings() &&\n            product?.Behavior?.MinimumQuantity &&\n            product.Behavior.MinimumQuantity > 0\n        ) {\n            return product.Behavior.MinimumQuantity;\n        }\n\n        return 1;\n    }\n\n    private _getMaxQuantityForCartLineItem(isQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n        if (\n            isQuantityLimitsFeatureEnabled &&\n            this._getIgnoreOrderSettings() &&\n            product?.Behavior?.MaximumQuantity &&\n            product.Behavior.MaximumQuantity > 0\n        ) {\n            return product.Behavior.MaximumQuantity;\n        }\n\n        return this.props.context.app.config.maxQuantityForCartLineItem;\n    }\n\n    /**\n     * Retrieves the value of the IgnoreOrderSettings property from the cart configuration.\n     * If the property is not present, it defaults to false.\n     * @returns {boolean} The value of the IgnoreOrderSettings property.\n     */\n    private _getIgnoreOrderSettings(): boolean {\n        const cartConfiguration = this.props.data.cartConfiguration;\n        return !(cartConfiguration?.result?.IgnoreOrderSettings ?? false);\n    }\n\n    private _getQuantity(\n        isOrderQuantityLimitsFeatureEnabled: boolean,\n        applyDefaultOrderSettingsForCartLine: boolean,\n        product: SimpleProduct\n    ): number {\n        let defaultQuantity = 1;\n\n        if (!isOrderQuantityLimitsFeatureEnabled || !applyDefaultOrderSettingsForCartLine) {\n            return defaultQuantity;\n        }\n\n        if (product?.Behavior?.DefaultQuantity && product.Behavior.DefaultQuantity > 0) {\n            defaultQuantity = product.Behavior.DefaultQuantity;\n        }\n\n        return defaultQuantity;\n    }\n\n    /**\n     * Method to called on product input change.\n     * @param query - Product inventory info.\n     */\n    private readonly _handleInputChange = (query: string): void => {\n        const queryMinLength = 4;\n        if (!query || query.length > queryMinLength) {\n            this.setState({ quantity: 0, productDimensions: [], productResponse: undefined });\n            this._updateStatusState('', '', '', false);\n        }\n        if (this._cancellabelDebounce) {\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n            this._cancellabelDebounce.cancel();\n        }\n\n        const { telemetry, context } = this.props;\n        const zeroNumber = 0;\n        if (!StringExtensions.isNullOrEmpty(query)) {\n            this._cancellabelDebounce = debounce(() => {\n                getScanResult(\n                    new GetScanResultInput(\n                        context.actionContext.requestContext.apiSettings,\n                        query,\n                        context.actionContext.requestContext.apiSettings.channelId\n                    ),\n                    this.props.context.actionContext\n                )\n                    .then(results => {\n                        this.setState({\n                            productResponse: results?.Product,\n                            productDimensions: results?.ProductDimensionFull,\n                            isQuickOrderGridFormExpanded: true\n                        });\n                        if (results?.Product) {\n                            this._updateQuantitiesInState(results.Product);\n                        }\n                    })\n                    .catch((error: Error) => {\n                        telemetry.exception(error);\n                        telemetry.debug('Unable to get scan results');\n                    });\n            }, this._waitTime);\n\n            setTimeout(() => {\n                // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- Existing code.\n                this._cancellabelDebounce();\n            }, zeroNumber);\n            this.setState({ isQuickOrderGridFormExpanded: true });\n        } else {\n            this.setState({ productResponse: undefined, isQuickOrderGridFormExpanded: true });\n        }\n    };\n\n    /**\n     * Method to called on quantity change.\n     * @param value - Quantity value.\n     */\n    private readonly _handleQuantityChange = (value: string): void => {\n        let currentValue = Number.parseInt(value, 10);\n        const inputElement = this._quantityInput.current instanceof HTMLInputElement && this._quantityInput.current;\n        const quantityChangeDebounceTimeout = 200;\n        let minimumQuantity = 0;\n        let needToUpdateUIValue: boolean = false;\n        if (this._isOrderQuantityLimitsFeatureEnabled && !ObjectExtensions.isNullOrUndefined(this.state.productResponse?.Behavior)) {\n            const behavior = this.state.productResponse!.Behavior;\n            minimumQuantity = behavior?.MinimumQuantity ?? 0;\n            const newCurrentValue = Math.max(currentValue, minimumQuantity);\n            if (newCurrentValue !== currentValue) {\n                needToUpdateUIValue = true;\n            }\n            currentValue = newCurrentValue;\n        }\n\n        this.setState({ quantity: currentValue }, () => {\n            debounce(() => {\n                if (needToUpdateUIValue && !Number.isNaN(this.state.quantity) && inputElement) {\n                    inputElement.setAttribute('aria-valuenow', currentValue.toString());\n                    inputElement.value = currentValue.toString();\n                }\n            }, quantityChangeDebounceTimeout)();\n        });\n    };\n\n    /**\n     * Method to get dropdwon name.\n     * @param dimensionType - Dimension Type.\n     * @param resources - String resources.\n     * @returns Dropdwon label.\n     */\n    private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n        const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n        switch (dimensionType) {\n            case ProductDimensionType.Color: // ProductDimensionType.Color\n                return resources.productDimensionTypeColor;\n            case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n                return resources.productDimensionTypeConfiguration;\n            case ProductDimensionType.Size: // ProductDimensionType.Size\n                return resources.productDimensionTypeSize;\n            case ProductDimensionType.Style: // ProductDimensionType.Style\n                return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n            default:\n                return '';\n        }\n    };\n\n    /**\n     * Method to update dimension and product in UI.\n     */\n    private readonly _updateDimensions = async (): Promise<void> => {\n        const {\n            context: {\n                actionContext,\n                request: {\n                    apiSettings: { channelId }\n                }\n            }\n        } = this.props;\n        const { productDimensions, productResponse } = this.state;\n        const hasProductDimensions = ArrayExtensions.hasElements(productDimensions);\n        if (!productResponse || !hasProductDimensions) {\n            return;\n        }\n\n        const dimensionsToUpdate: { [id: number]: string } = { ...this._dimensions };\n        this.setState({ isUpdatingDimension: true });\n\n        // Step 1: Update state to indicate which dimensions are selected\n        if (this.state.productDimensionErrorState.otherError) {\n            // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n            const clearOtherErrorState = { ...this.state.productDimensionErrorState };\n            clearOtherErrorState.otherError = undefined;\n            this.setState({ productDimensionErrorState: clearOtherErrorState });\n        }\n\n        // Step 2: Clear any errors indicating the dimension wasn't selected\n        for (const dimensionKey of Object.keys(dimensionsToUpdate)) {\n            if (this.state.productDimensionErrorState.configureErrors[dimensionKey]) {\n                // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n                const errorState = { ...this.state.productDimensionErrorState };\n                errorState.configureErrors[dimensionKey] = undefined;\n\n                this.setState({ productDimensionErrorState: errorState });\n            }\n        }\n\n        // Step 3, Build the actually selected dimensions, prioritizing the information in state\n        // over the information in data\n        const mappedDimensions = productDimensions\n            ?.map(dimension => {\n                return {\n                    DimensionTypeValue: dimension.DimensionTypeValue,\n                    DimensionValue:\n                        this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) ?? dimension.DimensionValue,\n                    ExtensionProperties: dimension.ExtensionProperties\n                };\n            })\n            .filter(dimension => {\n                return dimension.DimensionValue;\n            });\n\n        // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n        // so that places like add to cart can await it\n        // eslint-disable-next-line no-async-promise-executor -- existing code\n        const selectedProduct = new Promise<SimpleProduct | null>(async resolve => {\n            const newProduct = await getSelectedVariant(\n                new SelectedVariantInput(\n                    productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n                    channelId,\n                    mappedDimensions,\n                    undefined,\n                    this.props.context.request\n                ),\n                actionContext\n            );\n            if (newProduct) {\n                await getDimensionsForSelectedVariant(\n                    new GetDimensionsForSelectedVariantInput(\n                        newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n                        channelId,\n                        mappedDimensions,\n                        this.props.context.request\n                    ),\n                    actionContext\n                );\n            }\n\n            resolve(newProduct);\n        });\n\n        const variantProduct = await selectedProduct;\n        this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n    };\n\n    /**\n     * Method to get updated dimension value.\n     * @param productDimensionFull - Product dimension full.\n     * @param newValueId - New Dimension value.\n     * @returns Dimension Value.\n     */\n    private readonly _updateDimensionValue = (\n        productDimensionFull: IDimensionForSelectedVariant,\n        newValueId: string | undefined\n    ): ProductDimensionValue | undefined => {\n        if (newValueId && productDimensionFull.DimensionValues) {\n            return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n        }\n\n        return undefined;\n    };\n\n    /**\n     * Method to get dropdwon name.\n     * @param dimensionTypeValue - Dimension Type.\n     * @param resources - String resources.\n     * @param isGiftCard - Flag to check if its a giftcard product.\n     * @returns Dropdwon error label.\n     */\n    private readonly _getDimensionErrorString = (\n        dimensionTypeValue: number,\n        resources: IQuickOrderGridResources,\n        isGiftCard?: boolean\n    ): string => {\n        const amountErrorMessage = resources.quickOrderGridproductDimensionTypeAmountErrorMessage;\n\n        switch (dimensionTypeValue) {\n            case ProductDimensionType.Color: // ProductDimensionType.Color\n                return resources.quickOrderGridproductDimensionTypeColorErrorMessage;\n            case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n                return resources.quickOrderGridproductDimensionTypeConfigurationErrorMessage;\n            case ProductDimensionType.Size: // ProductDimensionType.Size\n                return resources.quickOrderGridproductDimensionTypeSizeErrorMessage;\n            case ProductDimensionType.Style: // ProductDimensionType.Style\n                return isGiftCard ? amountErrorMessage : resources.quickOrderGridproductDimensionTypeStyleErrorMessage;\n            default:\n                return '';\n        }\n    };\n\n    /**\n     * Initial the products on quick order.\n     * @param productResponse - Simple Product.\n     * @param quantity - Product Quantity.\n     * @returns Flag to validate productlistline.\n     */\n    private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n        // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- existing code\n        const missingDimensions = productResponse.Dimensions?.filter(\n            dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n        );\n        const minimumQuantity = 0;\n        if (ArrayExtensions.hasElements(missingDimensions)) {\n            const userMessage = this._getConfigureErrors(missingDimensions, false);\n            // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code\n            if (this.state.productDimensionErrorState.configureErrors) {\n                // eslint-disable-next-line react/no-access-state-in-setstate -- existing code\n                const errorState = { ...this.state.productDimensionErrorState };\n                errorState.configureErrors = userMessage;\n\n                this.setState({ productDimensionErrorState: errorState });\n                return false;\n            }\n        }\n\n        if (quantity <= minimumQuantity) {\n            const resources = this.props.resources;\n            this._updateStatusState(resources.quickOrderGridWrongQuantityErrorMsg, this._errorCssClass, this._errorCssGlyphClass, true);\n            return false;\n        }\n        return true;\n    };\n\n    /**\n     * Initial the products on quick order.\n     * @param result - Simple Product.\n     * @param isGiftCard - Product Quantity.\n     * @returns Flag to validate cart.\n     */\n    private _getConfigureErrors(\n        result: ProductDimension[] | undefined,\n        isGiftCard?: boolean\n    ): { [configureId: string]: string | undefined } {\n        if (!result) {\n            return {};\n        }\n        const dimensions: { [configureId: string]: string | undefined } = {};\n        const resources = this.props.resources;\n        for (const dimension of result) {\n            dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n        }\n        return dimensions;\n    }\n\n    /**\n     * Method to call on quantity change in row.\n     * @param itemKey - Product Key.\n     * @param quantity - Product quantity.\n     * @returns Flag to update status.\n     */\n    private readonly _changeRowQuantity = (itemKey: string | undefined, quantity: number): boolean => {\n        const { context, data, telemetry } = this.props;\n        const { quickOrderTemplate } = data;\n        if (quickOrderTemplate?.result) {\n            const quickOrderTemplateLinesData = quickOrderTemplate.result.quickOrderTemplateLines;\n            if (ArrayExtensions.hasElements(quickOrderTemplateLinesData)) {\n                const orderLineIndex = quickOrderTemplateLinesData.findIndex(\n                    (lines: QuickOrderTemplateLine) => lines.productListLine.LineId === itemKey\n                );\n                const newProductListLine = { ...quickOrderTemplateLinesData[orderLineIndex] };\n                if (quickOrderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n                    return true;\n                }\n                const previousQuantity = newProductListLine.productListLine.Quantity;\n                newProductListLine.productListLine.Quantity = quantity;\n                const { fullProduct, ...line } = newProductListLine;\n\n                ProductListsDataActions.updateProductListLinesAsync(\n                    { callerContext: context.actionContext },\n                    quickOrderTemplate.result.productList.Id,\n                    [line.productListLine]\n                )\n                    .then(list => {\n                        if (ArrayExtensions.hasElements(list)) {\n                            const newLine = list.find(lines => lines.LineId === itemKey);\n                            quickOrderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n                            const updatedLines = [...quickOrderTemplateLinesData];\n                            updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n                            const updatedProductList = { ...quickOrderTemplate.result, ProductListLines: updatedLines };\n                            context.actionContext.update(\n                                new ActiveProductListInput(context.actionContext.requestContext),\n                                updatedProductList\n                            );\n                            return true;\n                        }\n\n                        return false;\n                    })\n                    .catch((error: Error) => {\n                        telemetry.warning('[quick-order-grid] Unable to update product quantity.');\n                        telemetry.error(error.message);\n                        const userMessage = 'Failed to update quantity value.';\n                        newProductListLine.productListLine.Quantity = previousQuantity;\n                        this._updateStatusState(userMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n                        return false;\n                    });\n            }\n            return false;\n        }\n\n        return false;\n    };\n\n    /**\n     * Method to call on remove item from table.\n     * @param line - Order Template Line.\n     */\n    private readonly _removeItemRowFromTable = (line: QuickOrderTemplateLine): void => {\n        const { context, data, telemetry } = this.props;\n        const { quickOrderTemplate } = data;\n\n        if (quickOrderTemplate?.result) {\n            const userToken = context.request.user.isAuthenticated && context.request.user.token;\n            if (userToken) {\n                ProductListsDataActions.removeProductListLinesAsync(\n                    { callerContext: context.actionContext },\n                    line.productListLine.ProductListId!,\n                    [line.productListLine]\n                )\n                    .then(() => {\n                        window.location.reload(false);\n                    })\n                    .catch((error: Error) => {\n                        telemetry.warning('[quick-order-grid] Unable remove item from product list grid');\n                        telemetry.error(error.message);\n                    });\n            } else {\n                telemetry.warning('[quick-order-grid] Unable remove items from product list grid user token was not found');\n            }\n        }\n    };\n\n    private readonly _isChannelMultipleCatalogsFeatureEnabled = (): boolean => {\n        let isMultipleCatalogFeatureEnabledInHq = false;\n        if (this.props.data.featureState) {\n            isMultipleCatalogFeatureEnabledInHq =\n                this.props.data.featureState.result?.find(\n                    feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n                )?.IsEnabled || false;\n        }\n        return isMultipleCatalogFeatureEnabledInHq;\n    };\n\n    /**\n     * Method to call on add item from form.\n     */\n    private readonly _addItemToProductListLine = async (): Promise<void> => {\n        const {\n            context: { actionContext },\n            resources,\n            telemetry\n        } = this.props;\n        const {\n            quickOrderGridAddedToGridSuccessMessage,\n            quickOrderGridAddedToGridFailureMessage,\n            quickOrderGridAddedToGridDuplicateError\n        } = resources;\n        const { productResponse, quantity, productListId } = this.state;\n        // get the current catalog id.\n        const catalogId = getCatalogId(this.props.context.request);\n\n        this._updateStatusState('', '', '', false);\n\n        if (productResponse !== undefined && this._validateCart(productResponse, quantity)) {\n            if (StringExtensions.isNullOrWhitespace(productListId)) {\n                await this._createProductList();\n            }\n\n            if (StringExtensions.isNullOrWhitespace(this.state.productListId)) {\n                this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n                return;\n            }\n            const input = new AddItemToProductListInput(\n                this.state.productListId,\n                productResponse.RecordId,\n                quantity,\n                productResponse.DefaultUnitOfMeasure ?? 'ea',\n                this._isChannelMultipleCatalogsFeatureEnabled(),\n                catalogId\n            );\n\n            await addItemToProductListAction(input, actionContext)\n                .then(result => {\n                    if (result.ProductListId) {\n                        this._updateStatusState(quickOrderGridAddedToGridSuccessMessage, 'success', 'fas fa-check', true);\n                        window.location.reload();\n                        this.setState({});\n                    }\n                })\n                .catch((error: Error) => {\n                    telemetry.debug('[quick-order-grid] Error trying to Update Grid Line from the quick order grid');\n                    if (error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n                        this._updateStatusState(\n                            quickOrderGridAddedToGridDuplicateError,\n                            this._errorCssClass,\n                            this._errorCssGlyphClass,\n                            true\n                        );\n                    } else {\n                        this._updateStatusState(\n                            quickOrderGridAddedToGridFailureMessage,\n                            this._errorCssClass,\n                            this._errorCssGlyphClass,\n                            true\n                        );\n                    }\n                });\n        }\n    };\n\n    /**\n     * Method to create product list.\n     * @returns - ProductListId.\n     */\n    private _createProductList = async (): Promise<string> => {\n        const {\n            context: { actionContext },\n            telemetry,\n            resources\n        } = this.props;\n        const { productListId } = this.state;\n        const { quickOrderGridAddedToGridFailureMessage } = resources;\n\n        if (StringExtensions.isNullOrWhitespace(productListId)) {\n            const input = new CreateProductListInput('', ProductListType.QuickOrder);\n\n            await createProductList(input, actionContext)\n                .then(result => {\n                    if (!StringExtensions.isNullOrWhitespace(result.Id)) {\n                        this.setState({ productListId: result.Id });\n                        return result.Id;\n                    }\n                    return '';\n                })\n                .catch((error: Error) => {\n                    telemetry.debug('[quick-order-grid] Error on creating productlist from quick order grid');\n                    telemetry.error(error.message);\n                    this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n                    return '';\n                });\n            return '';\n        }\n\n        return productListId;\n    };\n\n    /**\n     * Method to create product list.\n     * @param messageText - Message Text.\n     * @param statusCssString - Css class names.\n     * @param messageGlyph - Glyph string.\n     * @param isOpen - Flag to show.\n     */\n    private readonly _updateStatusState = (messageText: string, statusCssString: string, messageGlyph: string, isOpen: boolean): void => {\n        this.setState({\n            // eslint-disable-next-line react/no-unused-state -- Showing user message in Form component.\n            stateMessage: {\n                messageText,\n                statusCssString,\n                messageGlyph,\n                isOpen\n            }\n        });\n    };\n}\nexport default QuickOrderGrid;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IErrorState } from '@msdyn365-commerce/components';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { IDimensionForSelectedVariant, OrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { QuickOrderGridProduct } from './quick-order-grid-product';\n\n/**\n * QuickOrderGrid state message Interface.\n */\nexport interface IQuickOrderGridStateMessage {\n    isOpen: boolean;\n    messageGlyph: string;\n    messageText: string;\n    statusCssString: string;\n}\n\n/**\n * QuickOrderGrid state Interface.\n */\nexport interface IQuickOrderGridState {\n    isQuickOrderGridFormExpanded: boolean;\n    isUpdatingDimension?: boolean;\n    productResponse: SimpleProduct | undefined;\n    productDimensions: IDimensionForSelectedVariant[] | undefined;\n    min: number | undefined;\n    max: number | undefined;\n    quantity: number;\n    stateMessage?: IQuickOrderGridStateMessage;\n    topStateMessage?: IQuickOrderGridStateMessage;\n    productDimensionErrorState: IErrorState;\n    isMobile: boolean;\n    products: OrderTemplateLine[];\n    productListId: string;\n}\n\n/**\n * QuickOrder Grid Row view.\n */\nexport interface IQuickOrderGridRowViewModel extends OrderTemplateLine {\n    isChecked: boolean;\n}\n\n/**\n * Interface for quick order callbacks.\n */\nexport interface IQuickOrderGridRowCallbacks {\n    onRemoveItem(line: QuickOrderGridProduct): void;\n    onChangeQuantity(orderTemplateLineId: string | undefined, quantity: number): boolean;\n}\n\n/**\n * Interface for quick order grid action view props.\n */\nexport interface IQuickOrderGridActionsViewProps {\n    addProductListToBag: React.ReactNode;\n    removeProductList?: React.ReactNode;\n    userMessage?: React.ReactNode;\n}\n\nexport const RetailDefaultOrderQuantityLimitsFeatureName: string = 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature';\n\nexport const EcommerceQuantityLimitConfigurationsFeatureName: string =\n    'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature';\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\n/* eslint-disable no-duplicate-imports */\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n    CartLine,\r\n    ChannelDeliveryOptionConfiguration,\r\n    DeliveryOption,\r\n    OrgUnitLocation,\r\n    ProductDeliveryOptions,\r\n    SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\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    deliveryOption?: string;\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    storeSelectorModuleId?: string;\r\n    channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n    retailMulitplePickupFeatureState?: boolean;\r\n    locationChangedHandler(): void;\r\n}\r\n\r\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\r\n    const _onLocationChangedCallback = async (\r\n        orgUnitLocation: OrgUnitLocation,\r\n        cartState: ICartState | undefined,\r\n        cartline: CartLine,\r\n        deliveryMode?: string\r\n    ) => {\r\n        if (!cartState) {\r\n            return Promise.resolve();\r\n        }\r\n        return cartState\r\n            .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\r\n            .then(result => {\r\n                if (result.status === 'SUCCESS') {\r\n                    props.locationChangedHandler();\r\n                }\r\n            })\r\n            .catch(error => {});\r\n    };\r\n\r\n    const _toggleBOPIS = (isBopisSelected: boolean) => {\r\n        const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\r\n\r\n        if (isBopisSelected) {\r\n            if (!storeSelectorStateManager) {\r\n                return;\r\n            }\r\n            storeSelectorStateManager\r\n                .openDialog({\r\n                    id: storeSelectorModuleId,\r\n                    product,\r\n                    alreadySelectedLocation: {\r\n                        OrgUnitNumber: cartline.FulfillmentStoreId\r\n                    },\r\n                    deliveryOptions: props.deliveryOptions,\r\n                    onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\r\n                        return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\r\n                    }\r\n                })\r\n                .catch(error => {});\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\r\n                .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\r\n                .then(result => {\r\n                    if (result.status === 'SUCCESS') {\r\n                        props.locationChangedHandler();\r\n                    }\r\n                })\r\n                .catch(error => {});\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.OrgUnitNumber === fulfillmentStoreId;\r\n        });\r\n\r\n        if (foundLocation) {\r\n            return foundLocation.OrgUnitName;\r\n        }\r\n        return fulfillmentStoreId;\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\r\n    ): JSX.Element => {\r\n        const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\r\n        const bopisSelected = !!cartLine.FulfillmentStoreId;\r\n\r\n        const toggleBOPIS = (isBopisSelected: boolean) => {\r\n            return () => {\r\n                _toggleBOPIS(isBopisSelected);\r\n            };\r\n        };\r\n\r\n        return (\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                        aria-checked={!bopisSelected}\r\n                        key={`${cartLine.LineId}-shipit`}\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                        aria-checked={bopisSelected}\r\n                        key={`${cartLine.LineId}-pickup`}\r\n                    />\r\n                    {pickupInStoretext}\r\n                </label>\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)}>\r\n                            {changeStoreText}\r\n                        </button>\r\n                    </div>\r\n                ) : null}\r\n            </>\r\n        );\r\n    };\r\n\r\n    const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\r\n        const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\r\n        return delivery?.Description;\r\n    };\r\n\r\n    /**\r\n     * Method to check if we have atleast one common delivery code between product and channel.\r\n     * @param productdeliveryOptions - Product DeliveryOption List.\r\n     * @param storePickUpOptionList - Channel DeliveryOption List.\r\n     * @returns Boolean flag.\r\n     */\r\n    const matchDeliveryOptions = (\r\n        productdeliveryOptions: DeliveryOption[] | undefined,\r\n        storePickUpOptionList: string[] | undefined\r\n    ): boolean => {\r\n        const deliveryOption: string[] = [];\r\n        productdeliveryOptions?.map(delivery => {\r\n            const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\r\n            if (pickup) {\r\n                deliveryOption.push(pickup);\r\n            }\r\n            return deliveryOption;\r\n        });\r\n\r\n        return ArrayExtensions.hasElements(deliveryOption);\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 || !props.deliveryOptions.DeliveryOptions) {\r\n        return undefined;\r\n    }\r\n\r\n    if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\r\n        if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\r\n            return undefined;\r\n        }\r\n    } else if (\r\n        !props.pickupDeliveryModeCode ||\r\n        !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\r\n    ) {\r\n        return undefined;\r\n    }\r\n\r\n    return {\r\n        callbacks: {\r\n            toggleBopis: _toggleBOPIS\r\n        },\r\n        defaultComponent: _renderShippingMethod(\r\n            props.cartline,\r\n            props.shipitText,\r\n            props.pickUpInStoreText,\r\n            props.changeStoreText,\r\n            props.orgUnitLocations\r\n        ),\r\n        orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\r\n        isBopisSelected: !!props.cartline.FulfillmentStoreId,\r\n        deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\r\n        ContainerProps: {\r\n            className: 'msc-cart-line__bopis-container'\r\n        }\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\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n    AddToOrderTemplateComponent,\r\n    AddToWishlistComponent,\r\n    CartLineItemComponent,\r\n    IAddToOrderTemplateDialogResources,\r\n    ICartlineResourceString,\r\n    IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n    IItemAddedToOrderTemplateDialogResources,\r\n    IOrderTemplateNameDialogResources,\r\n    IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, {\r\n    IAny,\r\n    ICoreContext,\r\n    IGeneric,\r\n    IGridSettings,\r\n    IImageSettings,\r\n    ITelemetry,\r\n    TelemetryEvent,\r\n    isChannelTypeB2B\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n    AsyncResult,\r\n    CartLine,\r\n    CartLineValidationResultsByLineId,\r\n    ChannelDeliveryOptionConfiguration,\r\n    CommerceList,\r\n    Customer,\r\n    OrgUnitLocation,\r\n    ProductDeliveryOptions,\r\n    SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport {\r\n    ArrayExtensions,\r\n    getInvoiceDetailsPageUrlSync,\r\n    getProductUrlSync,\r\n    IProductInventoryInformation,\r\n    ObjectExtensions,\r\n    OrderTemplate\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '@msdyn365-commerce-modules/cart';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from './citta-cart-pick-up-in-store';\r\n\r\nexport interface ICartLineItemsProps {\r\n    cartlines: CartLine[];\r\n    cartlinesErrors: CartLineValidationResultsByLineId;\r\n    cartState: ICartState | undefined;\r\n    orgUnitLocations: OrgUnitLocation[] | undefined;\r\n    resources: ICartlineResourceString;\r\n    productAvailabilites: IProductInventoryInformation[] | undefined;\r\n    products: SimpleProduct[] | undefined;\r\n    productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n    pickupDeliveryModeCode?: string;\r\n    catalogs?: ProductCatalog[];\r\n    retailMulitplePickupFeatureState?: boolean;\r\n\r\n    /* GridSettings for the product image in cartline */\r\n    gridSettings: IGridSettings;\r\n\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<IGeneric<IAny>>;\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    outOfStockText: string;\r\n    outOfRangeOneText: string;\r\n    outOfRangeFormatText: string;\r\n    storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n    isStockCheckEnabled: boolean;\r\n    wishlists: CommerceList[] | undefined;\r\n    defaultWishlistName: string;\r\n    maxCartlineQuantity: number;\r\n    includeErrors?: boolean;\r\n    showShippingChargesForLineItems?: boolean;\r\n    telemetryContent?: ITelemetryContent;\r\n    isQuantityLimitsFeatureEnabled: boolean;\r\n    hasInvoiceLine?: boolean;\r\n    storeSelectorModuleId?: string;\r\n    channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n    addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n    createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n    itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n    duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n    addToOrderTemplateButtonText: string;\r\n    addToOrderTemplateButtonTooltip: string;\r\n    addToOrderTemplateMessage: string;\r\n    addItemToOrderTemplateError: string;\r\n    orderTemplates: OrderTemplate[] | undefined;\r\n    customerInformation: Customer | undefined;\r\n    shouldIgnoreWarehouse: boolean | undefined;\r\n    productAvailability?: AsyncResult<IProductInventoryInformation[]>;\r\n    productPickUpOptions?: ProductDeliveryOptions[] | undefined;\r\n    hsoConfig?: number;\r\n\r\n    removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n    moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n    updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\r\n    locationChangedHandler(): 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    addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n    error?: string;\r\n    cartlineId?: string;\r\n    hasError?: boolean;\r\n    data?: {\r\n        product?: SimpleProduct;\r\n        cartline: CartLine;\r\n    };\r\n}\r\n\r\nconst _getCartItemAvailableQuantity = (\r\n    isStockCheckEnabled: boolean,\r\n    productAvailability: IProductInventoryInformation | undefined\r\n): number => {\r\n    if (\r\n        !isStockCheckEnabled ||\r\n        !productAvailability ||\r\n        !productAvailability.ProductAvailableQuantity ||\r\n        !productAvailability.IsProductAvailable ||\r\n        !productAvailability.ProductAvailableQuantity.AvailableQuantity\r\n    ) {\r\n        return 0;\r\n    }\r\n\r\n    return productAvailability.ProductAvailableQuantity.AvailableQuantity;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n    maxQuantityByConfig: number,\r\n    isStockCheckEnabled: boolean,\r\n    availableQuantityInStock: number,\r\n    isQuantityLimitsFeatureEnabled: boolean,\r\n    maxByQuantityLimitsFeature: number\r\n) => {\r\n    if (isQuantityLimitsFeatureEnabled) {\r\n        let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\r\n\r\n        // If max by feature in not defined when feature is on then we suggest that there no max by feature\r\n        // and consider available qty if stock check enabled and max from config in site settings.\r\n        if (!maxByQuantityLimitsFeature) {\r\n            maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\r\n        }\r\n\r\n        return isStockCheckEnabled\r\n            ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\r\n                ? maxByQuantityLimitsFeatureResult\r\n                : availableQuantityInStock\r\n            : maxByQuantityLimitsFeatureResult;\r\n    }\r\n    if (isStockCheckEnabled) {\r\n        return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\r\n    }\r\n    return maxQuantityByConfig;\r\n};\r\n\r\nconst _getErrorMessage = (\r\n    availableQuantityInStock: number,\r\n    currentQuantity: number,\r\n    props: ICartLineItemsProps,\r\n    shouldSkipStockCheck: boolean,\r\n    cartLine: CartLine,\r\n    lineId: string | undefined\r\n): string | undefined => {\r\n    const finalErrorMessages: string[] = [];\r\n\r\n    const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\r\n    if (isLoadingDeliveryOptions) {\r\n        return undefined;\r\n    }\r\n\r\n    let foundProductAvailability;\r\n    if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n        foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n            if (props.shouldIgnoreWarehouse) {\r\n                return productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId;\r\n            }\r\n            return (\r\n                productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId &&\r\n                productAvailability.InventLocationId === cartLine.WarehouseId\r\n            );\r\n        });\r\n        if (foundProductAvailability === undefined) {\r\n            return undefined;\r\n        }\r\n    }\r\n\r\n    if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\r\n        if (availableQuantityInStock <= 0) {\r\n            finalErrorMessages.push(props.outOfStockText);\r\n        } else if (availableQuantityInStock < currentQuantity) {\r\n            if (availableQuantityInStock === 1) {\r\n                finalErrorMessages.push(props.outOfRangeOneText);\r\n            } else {\r\n                finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\r\n            }\r\n        }\r\n    }\r\n\r\n    // Server-side validation\r\n    const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\r\n    const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\r\n    if (errorsFoundByLineId !== undefined) {\r\n        for (const i of errorsFoundByLineId) {\r\n            if (ArrayExtensions.hasElements(i.ValidationFailures)) {\r\n                i.ValidationFailures.forEach(validation => {\r\n                    if (validation.ErrorContext !== undefined) {\r\n                        finalErrorMessages.push(validation.ErrorContext);\r\n                    }\r\n                });\r\n            }\r\n        }\r\n    }\r\n\r\n    if (ArrayExtensions.hasElements(finalErrorMessages)) {\r\n        return finalErrorMessages.join(' ');\r\n    }\r\n\r\n    return undefined;\r\n};\r\n\r\n/**\r\n * On Remove Click functionality.\r\n * @param removeItemClickHandler -Remove item click function.\r\n * @param cartline -CartLine.\r\n * @returns Remove change value.\r\n */\r\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\r\n    removeItemClickHandler(cartline);\r\n};\r\n\r\n// eslint-disable-next-line complexity -- Auto-suppressed.\r\nconst _assembleNode = (\r\n    cartline: CartLine,\r\n    product: SimpleProduct | undefined,\r\n    props: ICartLineItemsProps,\r\n    index: number,\r\n    foundProductAvailability?: IProductInventoryInformation,\r\n    productPickUpOptions?: 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        addToOrderTemplateButtonText,\r\n        addToOrderTemplateButtonTooltip,\r\n        addToOrderTemplateDialogResources,\r\n        createOrderTemplateDialogResources,\r\n        itemAddedToOrderTemplateDialogResources,\r\n        duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n        addToWishlistButtonText,\r\n        removeFromWishlistButtonText,\r\n        orderTemplates,\r\n        customerInformation,\r\n        wishlists,\r\n        defaultWishlistName,\r\n        storeSelectorModuleId,\r\n        hsoConfig\r\n    } = props;\r\n\r\n    const isAuthenticated = context.request.user.isAuthenticated;\r\n    const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n    const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\r\n\r\n    const maxQuantity =\r\n        product &&\r\n        _getCartItemMaxQuantity(\r\n            props.maxCartlineQuantity,\r\n            props.isStockCheckEnabled,\r\n            availableQuantityInStock,\r\n            props.isQuantityLimitsFeatureEnabled,\r\n            product?.Behavior?.MaximumQuantity || 0\r\n        );\r\n\r\n    // Skip stock check if the cart line is a service item or an invoice line\r\n    //const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\r\n    let shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\r\n    \r\n    if (hsoConfig) {\r\n        const estimatedDateProperty = availableQuantityInStock\r\n            && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n            && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'EstimatedDate'));\r\n\r\n        const estimatedDateValue = estimatedDateProperty && estimatedDateProperty.Value && estimatedDateProperty.Value.StringValue;\r\n\r\n        let estimatedDate = \"\";\r\n        if (estimatedDateValue == undefined) {\r\n            estimatedDate = \"\";\r\n        } else {\r\n            estimatedDate = estimatedDateValue.toString();\r\n        }\r\n\r\n        const StockThresholdprop = availableQuantityInStock\r\n            && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n            && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'StockThreshold'));\r\n        const StockThresholdpropval = StockThresholdprop && StockThresholdprop.Value && StockThresholdprop.Value.IntegerValue;\r\n        let StockThreshold = 0;\r\n        if (StockThresholdpropval != undefined) {\r\n            StockThreshold = StockThresholdpropval;\r\n        }\r\n\r\n        let onhand = 0;\r\n        if (availableQuantityInStock != undefined) {\r\n            onhand = Number(availableQuantityInStock);\r\n        }\r\n\r\n        if (StockThreshold == 0) {\r\n            shouldSkipStockCheck = true;\r\n        } else {\r\n            if (onhand >= StockThreshold) {\r\n                shouldSkipStockCheck = true;\r\n            } else {\r\n                if (estimatedDate != \"\") {\r\n                    shouldSkipStockCheck = true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n\r\n    const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\r\n        ? undefined\r\n        : _getErrorMessage(availableQuantityInStock, cartline.Quantity!, props, shouldSkipStockCheck, cartline, cartline.LineId);\r\n\r\n    const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\r\n\r\n    const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n    const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n    const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n    const inventoryCode = foundProductAvailability\r\n        ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\r\n        : undefined;\r\n    const productDimension = 4;\r\n    const customPriceDimensionType = productDimension as ProductDimensionType.Style;\r\n    const isCustomPriceSelected =\r\n        product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\r\n        'Custom';\r\n\r\n    let productUrl: string | undefined;\r\n    if (product) {\r\n        productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\r\n\r\n        if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\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    } else {\r\n        productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\r\n    }\r\n\r\n    return {\r\n        data: {\r\n            product,\r\n            cartline\r\n        },\r\n        cartlineId: cartline.LineId,\r\n        error: errorMessage,\r\n        hasError: !shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false,\r\n        cartline: (\r\n            <CartLineItemComponent\r\n                data={{\r\n                    cartLine: cartline,\r\n                    cartState: props.cartState,\r\n                    product,\r\n                    catalogs: props.catalogs\r\n                }}\r\n                currentQuantity={cartline.Quantity}\r\n                maxQuantity={maxQuantity}\r\n                isOutOfStock={!shouldSkipStockCheck && props.isStockCheckEnabled ? availableQuantityInStock <= 0 : false}\r\n                gridSettings={gridSettings}\r\n                imageSettings={imageSettings}\r\n                id={id}\r\n                typeName={typeName}\r\n                productUrl={productUrl}\r\n                context={context}\r\n                resources={resources}\r\n                key={`${index}-${productUrl}`}\r\n                lineIndex={index}\r\n                isQuantityEditable={!ObjectExtensions.isNullOrUndefined(product)}\r\n                quantityOnChange={props.updateCartLinesQuantitySuccessHandler}\r\n                primaryImageUrl={product?.PrimaryImageUrl}\r\n                errorMessage={errorMessage}\r\n                inventoryInformationLabel={inventoryLbl}\r\n                inventoryLabelClassName={inventoryCode}\r\n                isCartStateReady={props.cartState?.status === 'READY'}\r\n                showShippingChargesForLineItems={props.showShippingChargesForLineItems}\r\n                telemetryContent={props.telemetryContent}\r\n                channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\r\n            />\r\n        ),\r\n        pickUpInStore: product\r\n            ? PickUpInStore({\r\n                  storeSelectorModuleId,\r\n                  cartState: props.cartState,\r\n                  cartline,\r\n                  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: productPickUpOptions,\r\n                  pickupDeliveryModeCode:\r\n                      cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\r\n                  retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\r\n                  channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\r\n                  locationChangedHandler: props.locationChangedHandler\r\n              })\r\n            : undefined,\r\n        remove: (\r\n            <Button className='msc-cart-line__remove-item' onClick={onRemoveClickHandler} title={removeButtonText} {...attributes}>\r\n                {removeButtonText}\r\n            </Button>\r\n        ),\r\n        addToWishlist:\r\n            isAuthenticated && product && !isCustomPriceSelected ? (\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\r\n                    showStatusMessage={false}\r\n                    showRemoveButton={false}\r\n                    showButtonTooltip={false}\r\n                    ariaRole='button'\r\n                    data={{\r\n                        wishlists,\r\n                        product\r\n                    }}\r\n                    onSuccess={moveToWishlistSuccessHandler}\r\n                />\r\n            ) : (\r\n                undefined\r\n            ),\r\n        addToOrderTemplate:\r\n            isAuthenticated && orderTemplates && product ? (\r\n                <AddToOrderTemplateComponent\r\n                    className={classnames('msc-cart-line__add-to-order-template', isCustomPriceSelected ? 'disabled' : '')}\r\n                    addToOrderTemplateButtonText={addToOrderTemplateButtonText}\r\n                    addToOrderTemplateButtonTooltip={addToOrderTemplateButtonTooltip}\r\n                    addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\r\n                    createOrderTemplateDialogResources={createOrderTemplateDialogResources}\r\n                    itemAddedToOrderTemplateDialogResources={itemAddedToOrderTemplateDialogResources}\r\n                    duplicateItemsWhenAddingToOrderTemplateDialogResources={duplicateItemsWhenAddingToOrderTemplateDialogResources}\r\n                    data={{ product, quantity: cartline.Quantity || 1, orderTemplates, customerInformation }}\r\n                    context={context}\r\n                    showButtonText\r\n                    shouldShowButtonFailedTooltip={isCustomPriceSelected}\r\n                    disableButton={isCustomPriceSelected}\r\n                    id={id}\r\n                    typeName={typeName}\r\n                    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value\r\n                    showButtonTooltip={!props.context.app.config.disableTooltip || false}\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: ICartLineItemsProps\r\n): ICartlinesViewProps[] | null => {\r\n    const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n    cartlines.map((cartline, index) => {\r\n        let product;\r\n        if (props.isQuantityLimitsFeatureEnabled) {\r\n            // When feature is enabled the same products could have different quantity limits in Behavior so we need\r\n            // to check productId and WarehouseId for identification.\r\n            product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\r\n        } else {\r\n            product = getProductByProductId(cartline.ProductId, products);\r\n        }\r\n        let foundProductAvailability;\r\n        if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n            foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n                if (props.shouldIgnoreWarehouse) {\r\n                    return productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId;\r\n                }\r\n                return (\r\n                    productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\r\n                    productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\r\n                );\r\n            });\r\n        }\r\n\r\n        let productPickUpOptions;\r\n        if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\r\n            productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\r\n                return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n            });\r\n        }\r\n        reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\r\n    });\r\n\r\n    return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component.\r\n * @param props\r\n */\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n    const { products, cartlines } = props;\r\n    return assembleCartlines(cartlines, products, props);\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\n/* eslint-disable no-duplicate-imports */\r\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport groupBy from 'lodash/groupBy';\r\n\r\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './citta-cart-line-items';\r\n\r\nconst _assembleGroupCartlines = (\r\n    cartlines: CartLine[],\r\n    products: SimpleProduct[] | undefined,\r\n    props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n    const reactNodes: ICartlinesViewProps[][] = [];\r\n    if (!products || products.length === 0) {\r\n        props.context.telemetry.error('Products content is empty, module wont render');\r\n        return null;\r\n    }\r\n\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(cartlines);\r\n    const cartLinesGroup: CartLine[] = [];\r\n\r\n    // 1) Group by store and pick up mode\r\n    Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\r\n        // @ts-expect-error\r\n        groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\r\n        cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\r\n    });\r\n\r\n    // 2) Create cartlines group\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            const carLineViewProps = assembleCartlines(cartLine, products, props);\r\n            if (carLineViewProps !== null) {\r\n                reactNodes.push(carLineViewProps);\r\n            }\r\n        });\r\n    });\r\n\r\n    return reactNodes;\r\n};\r\n\r\nconst _assembleGroupInvoiceCartlines = (\r\n    cartLines: CartLine[],\r\n    products: SimpleProduct[] | undefined,\r\n    props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n    const reactNodes: ICartlinesViewProps[][] = [];\r\n    if (cartLines && cartLines.length > 0) {\r\n        // Create invoice cartLines group\r\n        const carLineViewProps = assembleCartlines(cartLines, products, props);\r\n        if (carLineViewProps !== null) {\r\n            reactNodes.push(carLineViewProps);\r\n        }\r\n    }\r\n    return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLine Group component.\r\n * @param props\r\n */\r\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\r\n    const { products, cartlines, hasInvoiceLine } = props;\r\n    return hasInvoiceLine\r\n        ? _assembleGroupInvoiceCartlines(cartlines, products, props)\r\n        : _assembleGroupCartlines(cartlines, products, props);\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\n/* eslint-disable no-duplicate-imports */\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n * IPromotionData entity interface.\r\n */\r\nexport interface IPromotionData {\r\n    promotionOptions?: CartPromotionLine[];\r\n}\r\n\r\n/**\r\n * Calls the Retail API and returns a promotion data.\r\n * @param ctx\r\n */\r\nexport async function getPromotionData(ctx: IActionContext): Promise<IPromotionData> {\r\n    const promotionData: IPromotionData = {};\r\n\r\n    await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n        .then(promotionOptions => {\r\n            if (promotionOptions) {\r\n                promotionData.promotionOptions = promotionOptions;\r\n            }\r\n        })\r\n        .catch(error => {\r\n            ctx.telemetry.exception(error);\r\n            return {};\r\n        });\r\n\r\n    return promotionData;\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\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n    IAddToOrderTemplateDialogResources,\r\n    IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n    IItemAddedToOrderTemplateDialogResources,\r\n    ILinesAddedToOrderTemplateDialogResources,\r\n    IOrderTemplateNameDialogResources,\r\n    IWishlistActionSuccessResult,\r\n    PromoCodeComponent,\r\n    SaveCartToOrderTemplateComponent\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync, IImageSettings, isChannelTypeB2B, isOboRequest } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport {\r\n    ActiveCartProductsInput,\r\n    ArrayExtensions,\r\n    getActiveCartProductsAction,\r\n    ICartLineInventoryValidationResult,\r\n    ObjectExtensions,\r\n    ProductPickUpOptionsForCartLineItems\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n    Alert,\r\n    Button,\r\n    getPayloadObject,\r\n    getTelemetryAttributes,\r\n    getTelemetryObject,\r\n    INodeProps,\r\n    IPayLoad,\r\n    ITelemetryContent,\r\n    TelemetryConstant,\r\n    Waiting,\r\n    updateMaxQuantityForCartLineItem,\r\n    urlCheck\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-citta-cartlines';\r\n\r\nimport { ICittaCartData } from './citta-cart.data';\r\nimport { ICittaCartProps, ICittaCartResources } from './citta-cart.props.autogenerated';\r\nimport { CartLineGroupItems } from './components/citta-cart-line-groups';\r\nimport { CartLineItems, ICartlinesViewProps } from './components/citta-cart-line-items';\r\nimport { cartPromotions, ICartLineItemViewProps } from './components/citta-cart-line-items-promotion';\r\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-citta-cart';\r\n\r\nimport { validateCartLinesInventory } from './components/hso-validate-cartlines-inventory';\r\n/**\r\n * Cart view props interface.\r\n */\r\nexport interface ICartViewProps extends ICittaCartProps<ICittaCartData> {\r\n    className: string;\r\n    title?: React.ReactNode;\r\n    CartlinesWrapper: INodeProps;\r\n    cartlines?: ICartlinesViewProps[];\r\n    cartLinesGroup?: ICartlinesViewProps[][];\r\n    cart: ICartState | undefined;\r\n    orderSummaryHeading: React.ReactNode;\r\n    orderSummaryLineitems?: IOrderSummaryLines;\r\n    invoiceSummaryLineitems?: IInvoiceSummaryLines;\r\n    OrderSummaryWrapper: INodeProps;\r\n    OrderSummaryItems: INodeProps;\r\n    OrderSummaryErrors?: IOrderSummaryErrors;\r\n    checkoutAsGuestButton: React.ReactNode;\r\n    checkoutAsSignInUserButton: React.ReactNode;\r\n    storeSelector?: React.ReactNode;\r\n    expressCheckoutButton?: React.ReactNode[];\r\n    ExpressCheckoutSectionWrapper: INodeProps;\r\n    backToShoppingButton: React.ReactNode;\r\n    waitingComponent: React.ReactNode;\r\n    promotionOptions?: ICartLineItemViewProps;\r\n    promoCode: React.ReactNode;\r\n    cartLoadingStatus: string;\r\n    cartDataResult: boolean;\r\n    multiplePickUpEnabled?: boolean;\r\n    createTemplateFromCartButton: React.ReactNode;\r\n    telemetryContent?: ITelemetryContent;\r\n    checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\r\n    removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n    moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n}\r\n\r\n/**\r\n * Order summary errors interface.\r\n */\r\nexport interface IOrderSummaryErrors {\r\n    Wrapper: INodeProps;\r\n    header: React.ReactNode;\r\n    errors: React.ReactNode[];\r\n}\r\n\r\n/**\r\n * Cart component state interface.\r\n */\r\ninterface ICartComponentState {\r\n    showPromotionDialog: boolean;\r\n    cartlinesErrors: CartLineValidationResultsByLineId;\r\n    promotionData: IPromotionData;\r\n    isCartValid: boolean;\r\n    productPickUpOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\n/**\r\n * Cart component.\r\n * @extends {React.PureComponent<ICittaCartProps<ICittaCartData>>}\r\n */\r\n@observer\r\nclass Cart extends React.Component<ICittaCartProps<ICittaCartData>> {\r\n    public state: ICartComponentState;\r\n\r\n    private readonly telemetryContent: ITelemetryContent;\r\n\r\n    private readonly payLoad: IPayLoad;\r\n\r\n    private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n    private _isMounted: boolean = false;\r\n\r\n    private readonly promotionPopupId: string = 'cart-promotion-popup';\r\n\r\n    public constructor(props: ICittaCartProps<ICittaCartData>) {\r\n        super(props);\r\n        this.telemetryContent = getTelemetryObject(\r\n            this.props.context.request.telemetryPageName!,\r\n            this.props.friendlyName,\r\n            this.props.telemetry\r\n        );\r\n        this.payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n        this.promotionLinkClick = this.promotionLinkClick.bind(this);\r\n        this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\r\n\r\n        this.state = {\r\n            showPromotionDialog: false,\r\n            promotionData: {},\r\n            isCartValid: true,\r\n            productPickUpOptions: undefined,\r\n            cartlinesErrors: {}\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Component did mount function.\r\n     */\r\n    public async componentDidMount(): Promise<void> {\r\n        this._isMounted = true;\r\n        const {\r\n            config,\r\n            context: { actionContext }\r\n        } = this.props;\r\n\r\n        this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n        if (this.isQuantityLimitsFeatureEnabled) {\r\n            await this.validateCart();\r\n        }\r\n\r\n        if (config.showAvailablePromotions) {\r\n            if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\r\n                this.setState({ promotionData: await getPromotionData(actionContext) });\r\n            }\r\n\r\n            reaction(\r\n                () => this.props.data.cart.result?.cart.CartLines,\r\n                async () => {\r\n                    if (this._isMounted) {\r\n                        this.setState({ promotionData: await getPromotionData(actionContext) });\r\n                    }\r\n                }\r\n            );\r\n        }\r\n        reaction(\r\n            () => this.props.data.cart.result?.cart.CartLines,\r\n            async () => {\r\n                if (this._isMounted) {\r\n                    const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\r\n                    this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\r\n                }\r\n            }\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Component will unmount function.\r\n     */\r\n    public componentWillUnmount(): void {\r\n        this._isMounted = false;\r\n    }\r\n\r\n    /**\r\n     * Should component update function.\r\n     * @param nextProps - Next props.\r\n     * @param nextState - Next state.\r\n     * @returns True if component should update, false otherwise.\r\n     */\r\n    public shouldComponentUpdate(nextProps: ICittaCartProps<ICittaCartData>, nextState: ICartComponentState): boolean {\r\n        if (this.state === nextState && this.props.data === nextProps.data) {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n\r\n    /* eslint-disable complexity -- Disabling complexity for render method */\r\n    public render(): JSX.Element | null {\r\n        const {\r\n            data: {\r\n                cart: { result: cart },\r\n                products: { result: products }\r\n            },\r\n            context: {\r\n                request: {\r\n                    user: { isAuthenticated, signInUrl }\r\n                }\r\n            },\r\n            resources\r\n        } = this.props;\r\n\r\n        const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n        const backToShoppingUrl = 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        const cartLines = this._getCartLines();\r\n        const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n\r\n        \r\n        const HSOConfigprop = this.props.data.channelConfiguration.result\r\n            && this.props.data.channelConfiguration.result.ExtensionProperties\r\n            && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n        let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n        if (HSOConfig == undefined) {\r\n            HSOConfig = 0;\r\n        }\r\n\r\n        const validInventoryAcrossCartLines = validateCartLinesInventory(\r\n            cart?.cart.CartLines ?? [],\r\n            this.props.data.productAvailabilites.result ?? [],\r\n            this.props.context.actionContext,\r\n            products ?? [],\r\n            emailDeliveryModeCode,\r\n            HSOConfig\r\n        );\r\n\r\n        let hasError =\r\n            !validInventoryAcrossCartLines?.isValid ||\r\n            this._isCheckoutBlockedDueToUnavailableFunds() ||\r\n            (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\r\n            (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\r\n\r\n        const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n            featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n        );\r\n        const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n        const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\r\n        this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\r\n        const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n        this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n        const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n        this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\r\n        const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n\r\n        // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\r\n        if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\r\n            if (multiplePickUpEnabled && cartLinesGroup !== null) {\r\n                for (const cartLineGroup of cartLinesGroup) {\r\n                    this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\r\n                }\r\n            }\r\n\r\n            this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\r\n        }\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            cart: this.props.data.cart.result,\r\n            CartlinesWrapper: { className: 'msc-cartline-wraper' },\r\n            OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\r\n            OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\r\n            cartlines: cartLines,\r\n            cartLinesGroup,\r\n            promoCode: this._getPromoCode(),\r\n            promotionOptions: this._getPromotions(),\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            multiplePickUpEnabled,\r\n            removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\r\n            orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\r\n                cart?.hasInvoiceLine ? (\r\n                    <h2 className='msc-invoice-summary__heading'>{resources.invoiceSummaryTitle}</h2>\r\n                ) : (\r\n                    <h2 className='msc-order-summary__heading'>{resources.orderSummaryTitle}</h2>\r\n                )\r\n            ) : null,\r\n            orderSummaryLineitems: this._getOrderSummaryLineItems(),\r\n            invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\r\n            checkoutAsSignInUserButton: !isCartEmpty ? (\r\n                <Button\r\n                    disabled={hasError}\r\n                    className='msc-cart__btn-checkout'\r\n                    href={checkoutURL}\r\n                    title={resources.checkoutButtonTitle}\r\n                    {...checkoutBySignInAttributes}\r\n                >\r\n                    {resources.checkoutButtonTitle}\r\n                </Button>\r\n            ) : null,\r\n            checkoutAsGuestButton:\r\n                !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\r\n                    <Button\r\n                        disabled={hasError}\r\n                        className='msc-cart__btn-guestcheckout'\r\n                        href={guestCheckoutUrl}\r\n                        title={resources.guestCheckoutButtonTitle}\r\n                        {...checkoutByGuestAttributes}\r\n                    >\r\n                        {resources.guestCheckoutButtonTitle}\r\n                    </Button>\r\n                ) : null,\r\n            expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\r\n            ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\r\n            backToShoppingButton: (\r\n                <Button\r\n                    className='msc-cart__btn-backtoshopping'\r\n                    {...backtoShoppingAttributes}\r\n                    href={backToShoppingUrl}\r\n                    title={resources.backToShoppingButtonTitle}\r\n                >\r\n                    {resources.backToShoppingButtonTitle}\r\n                </Button>\r\n            ),\r\n            createTemplateFromCartButton:\r\n                this._displayAddCartToTemplate() && products ? (\r\n                    <SaveCartToOrderTemplateComponent\r\n                        addToOrderTemplateDialogResources={this._generateAddToOrderTemplateDialogResources(resources)}\r\n                        createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(resources)}\r\n                        linesAddedToOrderTemplateDialogResources={this._generateLinesAddedToOrderTemplateDialogResources(resources)}\r\n                        duplicateItemsWhenAddingToOrderTemplateDialogResources={this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n                            resources\r\n                        )}\r\n                        createOrderTemplateFromCartButton={resources.createOrderTemplateFromCartButton}\r\n                        createOrderTemplateFromCartButtonTooltip={resources.createOrderTemplateFromCartButtonTooltip}\r\n                        context={this.props.context}\r\n                        id={this.props.id}\r\n                        typeName={this.props.typeName}\r\n                        data={{\r\n                            orderTemplates: this.props.data.orderTemplates.result!,\r\n                            cartLines: this.props.data.cart.result!.cart.CartLines!,\r\n                            customerInformation: this.props.data.customerInformation.result\r\n                        }}\r\n                    />\r\n                ) : null,\r\n            checkoutBlockedDueToUnavailableFunds: this._isCheckoutBlockedDueToUnavailableFunds() ? (\r\n                <span className='warning-message-box'>\r\n                    <span className='warning-message-icon msi-InfoCircle' aria-hidden='true'></span>\r\n                    <span className='warning-message-box__content'>\r\n                        <span className='warning-message-box__content__title'>{resources.checkoutBlockedDueToUnavailableFundsTitle}</span>\r\n                        {resources.checkoutBlockedDueToUnavailableFundsMessage}\r\n                    </span>\r\n                </span>\r\n            ) : null,\r\n            storeSelector:\r\n                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: <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            OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\r\n            telemetryContent: this.telemetryContent\r\n        };\r\n\r\n        return this.props.renderView(viewProps) as React.ReactElement;\r\n    }\r\n    /* eslint-enable complexity -- Disabling complexity for render method */\r\n\r\n    /**\r\n     * Promotion click event handler.\r\n     * @param event - The mouse event.\r\n     */\r\n    private readonly promotionLinkClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\r\n        this.setState({\r\n            showPromotionDialog: !this.state.showPromotionDialog\r\n        });\r\n    };\r\n\r\n    /**\r\n     * Promotion close button click.\r\n     */\r\n    private readonly promotionCloseButtonclick = () => {\r\n        this._hidePromotionDialog();\r\n    };\r\n\r\n    /**\r\n     * Hide promotion dialog.\r\n     */\r\n    private _hidePromotionDialog(): void {\r\n        this.setState({\r\n            showPromotionDialog: false\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Display add to cart template.\r\n     * @returns True if should display, false otherwise.\r\n     */\r\n    private _displayAddCartToTemplate(): boolean {\r\n        const cart = this.props.data.cart?.result;\r\n        if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\r\n            return false;\r\n        }\r\n\r\n        if (\r\n            isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\r\n            this.props.data.orderTemplates.result &&\r\n            ArrayExtensions.hasElements(cart.cart?.CartLines) &&\r\n            this.props.data.customerInformation.result\r\n        ) {\r\n            return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * Get promotions.\r\n     * @returns React node with the promotions.\r\n     */\r\n    private _getPromotions(): React.ReactNode {\r\n        return (\r\n            this.props.config.showAvailablePromotions &&\r\n            cartPromotions({\r\n                id: this.promotionPopupId,\r\n                showPromotionPopup: this.state.showPromotionDialog,\r\n                onSeeAllClick: this.promotionLinkClick,\r\n                onCloseButtonClick: this.promotionCloseButtonclick,\r\n                promotions: this.state.promotionData.promotionOptions,\r\n                resources: {\r\n                    promotionStringHeading: this.props.resources.promotionStringHeading,\r\n                    promotionLinkText: this.props.resources.promotionLinkText,\r\n                    promotionPopupHeading: this.props.resources.promotionPopupHeading,\r\n                    promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\r\n                }\r\n            })\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Add error message in cart line in case the quantity exceeds the current inventory.\r\n     * @param cartLines - The cart lines.\r\n     * @param cartLineInventoryValidationResult - The cart line inventory result.\r\n     */\r\n    private _updateCartLineErrorForInvalidInventory(\r\n        cartLines: ICartlinesViewProps[] | null,\r\n        cartLineInventoryValidationResult: ICartLineInventoryValidationResult\r\n    ) {\r\n        const { resources } = this.props;\r\n\r\n        if (\r\n            ArrayExtensions.hasElements(cartLines) &&\r\n            !cartLineInventoryValidationResult.isValid &&\r\n            ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\r\n        ) {\r\n            for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\r\n                const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\r\n                if (cartLine) {\r\n                    cartLine.error = resources.outOfStockErrorMessage;\r\n                    cartLine.hasError = true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Get order summary errors.\r\n     * @param cartLines - The cart lines.\r\n     * @returns Order summary errors.\r\n     */\r\n    private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\r\n        const allErrors =\r\n            (cartLines &&\r\n                cartLines\r\n                    .map(cartline => {\r\n                        // Check if the product is service or not by product type\r\n                        const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n                        if (!isServiceItem && cartline.error) {\r\n                            const fullError =\r\n                                cartline.data && cartline.data.product?.Name\r\n                                    ? `${cartline.data.product.Name}: ${cartline.error}`\r\n                                    : cartline.error;\r\n\r\n                            return (\r\n                                <div key={fullError} className='msc-alert__line'>\r\n                                    {fullError}\r\n                                </div>\r\n                            );\r\n                        }\r\n\r\n                        return null;\r\n                    })\r\n                    .filter((line): line is JSX.Element => !!line)) ||\r\n            [];\r\n\r\n        return {\r\n            Wrapper: {\r\n                tag: Alert,\r\n                className: 'msc-alert',\r\n                isOpen: allErrors.length > 0,\r\n                color: 'danger',\r\n                assertive: true,\r\n                'aria-label': this.props.resources.outOfStockErrorMessageHeader\r\n            },\r\n            header: (\r\n                <div className='msc-alert__header' aria-hidden='true'>\r\n                    <span className='msi-exclamation-triangle' />\r\n                    <span>{this.props.resources.outOfStockErrorMessageHeader}</span>\r\n                </div>\r\n            ),\r\n            errors: allErrors\r\n        };\r\n    }\r\n\r\n    private _isCheckoutBlockedDueToUnavailableFunds(): boolean {\r\n        if (isOboRequest(this.props.context.request)) {\r\n            const customerInfo = this.props.data.customerInformation && this.props.data.customerInformation?.result;\r\n            return !!customerInfo && (!customerInfo.AllowOnAccountPayment || customerInfo.CreditLimit === 0);\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * Gets invoice summary line items.\r\n     * @returns Invoice summary lines.\r\n     */\r\n    private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\r\n        const {\r\n            data: {\r\n                cart: { result: cart }\r\n            },\r\n            telemetry,\r\n            resources\r\n        } = this.props;\r\n\r\n        return cart?.hasInvoiceLine\r\n            ? InvoiceSummary({\r\n                  orderTotalLabel: resources.totalAmountLabel,\r\n                  invoiceLabel: resources.invoiceLabel,\r\n                  cart: cart.cart,\r\n                  context: this.props.context,\r\n                  typeName: this.props.typeName,\r\n                  telemetry,\r\n                  id: this.props.id\r\n              })\r\n            : undefined;\r\n    }\r\n\r\n    /**\r\n     * Gets order summary line items.\r\n     * @returns Order summary lines.\r\n     */\r\n    private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\r\n        const {\r\n            data: {\r\n                cart: { result: cart },\r\n                channelDeliveryOptionConfig\r\n            },\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 multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n        const featureState = this.props?.data?.featureState;\r\n        const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\r\n            ?.IsEnabled;\r\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n        const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\r\n\r\n        return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\r\n            ? OrderSummary({\r\n                  cart: cart!.cart,\r\n                  subTotalLabel: resources.itemsWithCountLabel,\r\n                  shippingLabel: resources.estimatedShippingLabel,\r\n                  otherChargeLabel: resources.otherCharges,\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,\r\n                  retailMultiplePickUpOptionEnabled,\r\n                  channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\r\n                  telemetry,\r\n                  isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\r\n                  isShowTaxBreakup: isShowOrHideTaxEnabled\r\n              })\r\n            : undefined;\r\n    }\r\n\r\n    /**\r\n     * Gets promo code.\r\n     * @returns React node with the promo code.\r\n     */\r\n    private _getPromoCode(): React.ReactNode {\r\n        const {\r\n            data: {\r\n                cart: { result: cart }\r\n            },\r\n            resources\r\n        } = this.props;\r\n\r\n        return (\r\n            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                    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                    telemetryContent={this.telemetryContent}\r\n                />\r\n            )\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Generate add to order template dialog resources.\r\n     * @param resources - The resources.\r\n     * @returns IAddToOrderTemplateDialogResources.\r\n     */\r\n    private _generateAddToOrderTemplateDialogResources(resources: ICittaCartResources): IAddToOrderTemplateDialogResources {\r\n        return {\r\n            addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n            noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n            noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n            createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n            createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n            cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n            selectTemplatesText: resources.selectTemplatesText,\r\n            addToTemplateButtonText: resources.addToTemplateButtonText,\r\n            lineItemsText: resources.lineItemsText\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Generate item added to order template dialog resources.\r\n     * @param resources - The resources.\r\n     * @returns IItemAddedToOrderTemplateDialogResources.\r\n     */\r\n    private _generateItemAddedToOrderTemplateDialogResources(resources: ICittaCartResources): IItemAddedToOrderTemplateDialogResources {\r\n        return {\r\n            viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n            continueShoppingButtonText: resources.continueShoppingButtonText,\r\n            itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n            itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n            itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n            freePriceText: resources.freePriceText,\r\n            originalPriceText: resources.originalPriceText,\r\n            currentPriceText: resources.currentPriceText\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Generate lines added to order template dialog resources.\r\n     * @param resources - The resources.\r\n     * @returns ILinesAddedToOrderTemplateDialogResources.\r\n     */\r\n    private _generateLinesAddedToOrderTemplateDialogResources(resources: ICittaCartResources): ILinesAddedToOrderTemplateDialogResources {\r\n        return {\r\n            viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n            continueShoppingButtonText: resources.continueShoppingButtonText,\r\n            linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\r\n            linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\r\n            linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\r\n            linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\r\n            linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\r\n            linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Generate duplicate items when adding to order template dialog resources.\r\n     * @param resources - The resources.\r\n     * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\r\n     */\r\n    private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n        resources: ICittaCartResources\r\n    ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n        return {\r\n            duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n            duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n            updateQuantityButtonText: resources.updateQuantityButtonText,\r\n            cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Generate order template name dialog resources.\r\n     * @param resources - The resources.\r\n     * @returns IOrderTemplateNameDialogResources.\r\n     */\r\n    private _generateOrderTemplateNameDialogResources(resources: ICittaCartResources): IOrderTemplateNameDialogResources {\r\n        return {\r\n            orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n            orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n            orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n            orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n            defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n            orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n            orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Gets the cart lines view props.\r\n     * @returns ICartlinesViewProps [].\r\n     */\r\n    private _getCartLines(): ICartlinesViewProps[] | null {\r\n        const {\r\n            data: {\r\n                cart: { result: cart },\r\n                wishlists: { result: wishlists },\r\n                orderTemplates: { result: orderTemplates },\r\n                customerInformation: { result: customerInformation }\r\n            },\r\n            context: {\r\n                request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n            },\r\n            config,\r\n            telemetry,\r\n            resources,\r\n            modules\r\n        } = this.props;\r\n\r\n        const imageSettings = this.getImageSettings(config.imageSettings);\r\n\r\n        const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n            featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n        );\r\n        const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n\r\n        const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\r\n        let storeSelectorId: string = '';\r\n        if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n            storeSelectorId = modules.storeSelector[0].id;\r\n        }\r\n\r\n        const HSOConfigprop = this.props.data.channelConfiguration.result\r\n        && this.props.data.channelConfiguration.result.ExtensionProperties\r\n        && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n        let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n        if (HSOConfig == undefined) {\r\n            HSOConfig = 0;\r\n        }\r\n\r\n        return ArrayExtensions.hasElements(cart?.cart.CartLines)\r\n            ? CartLineItems({\r\n                  cartlines: cart!.cart.CartLines,\r\n                  storeSelectorModuleId: storeSelectorId,\r\n                  cartlinesErrors,\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                  catalogs: this.props.data.catalogs?.result,\r\n                  imageSettings,\r\n                  isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n                  maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n                  shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\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                  retailMulitplePickupFeatureState: multiplePickUpEnabled,\r\n                  resources: {\r\n                      sizeString: \"Size:\" || resources.productDimensionTypeSize,\r\n                      colorString: resources.productDimensionTypeColor,\r\n                      configString: resources.productDimensionTypeConfiguration,\r\n                      styleString: resources.productDimensionTypeStyle,\r\n                      amountString: resources.productDimensionTypeAmount,\r\n                      quantityDisplayString: resources.quantityDisplayText,\r\n                      inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n                      decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n                      incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n                      discountStringText: resources.discountStringText,\r\n                      originalPriceText: resources.originalPriceText,\r\n                      currentPriceText: resources.currentPriceText,\r\n                      shippingChargesText: resources.shippingCharges,\r\n                      salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n                      priceEditorResources: {\r\n                          ...resources\r\n                      }\r\n                  },\r\n                  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                  outOfStockText: resources.outOfStockErrorMessage,\r\n                  outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n                  outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\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                  locationChangedHandler: this.fulfillmentStoreIdUpdated,\r\n                  wishlists,\r\n                  defaultWishlistName: resources.defaultWishlistName,\r\n                  pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n                  includeErrors: config.showOutOfStockErrors,\r\n                  showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n                  telemetryContent: this.telemetryContent,\r\n                  isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n                  addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n                  createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n                  itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n                  duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n                      resources\r\n                  ),\r\n\r\n                  addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n                  addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n                  addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n                  addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n                  orderTemplates,\r\n                  customerInformation,\r\n                  productAvailability: this.props.data.productAvailabilites,\r\n                  hsoConfig: HSOConfig\r\n              })\r\n            : null;\r\n    }\r\n\r\n    /**\r\n     * Gets the checkout URL.\r\n     * @param isAuthenticated - Is authenticated flag.\r\n     * @param guestCheckoutUrl - Guest checkout URL.\r\n     * @param signInUrl -The sign in URL.\r\n     * @returns The checkout URL.\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 isAbsoluteUrl = urlCheck(guestCheckoutUrl);\r\n        let returnURL = guestCheckoutUrl;\r\n        if (MsDyn365.isBrowser && !isAbsoluteUrl) {\r\n            returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n        }\r\n\r\n        return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\r\n    }\r\n\r\n    /**\r\n     * Gets the image settings.\r\n     * @param imageSettings - Image settings.\r\n     * @returns IImageSettings.\r\n     */\r\n    private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n        return (\r\n            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    /**\r\n     * Remove item from citta-cart handler.\r\n     * @param cartlineToRemove - The cart line to remove.\r\n     */\r\n    private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n        if (this.props.data.cart.result) {\r\n            const input = {\r\n                cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n            };\r\n            this.props.data.cart.result\r\n                .removeCartLines(input)\r\n                .then(() => {\r\n                    this.validateCart().catch(error => {\r\n                        this.props.telemetry.warning(error);\r\n                        this.props.telemetry.debug('Unable to validate Cart');\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     * Move to wish list handler.\r\n     * @param result - The wish list action success result.\r\n     * @param cartline - The cart line.\r\n     */\r\n    private readonly 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    /**\r\n     * Updates the cart line quantity.\r\n     * @param cartlineToUpdate - The cart line.\r\n     * @param quantity - The quantity.\r\n     * @param lineIndex - The line index.\r\n     * @returns True if the cart line was updated, false otherwise.\r\n     */\r\n    private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\r\n        cartLineQuantityUpdatedAsync(\r\n            this.isQuantityLimitsFeatureEnabled,\r\n            this.props.data.cart.result,\r\n            this.props.telemetry,\r\n            this.props.data.products.result,\r\n            cartlineToUpdate,\r\n            quantity\r\n        )\r\n            .then((cartActionResult: ICartActionResult | undefined): boolean => {\r\n                if (cartActionResult?.status === 'SUCCESS') {\r\n                    this.validateCart().catch(error => {\r\n                        this.props.telemetry.warning((error as Error).message);\r\n                        this.props.telemetry.debug('Unable to validate Cart');\r\n                    });\r\n\r\n                    return true;\r\n                }\r\n\r\n                if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\r\n                    // Show update line error message.\r\n                    const lineUpdateFailure: LineValidationResult = {\r\n                        LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\r\n                        ValidationFailures: [\r\n                            {\r\n                                ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\r\n                                    ? cartActionResult.validationResults[0].ErrorContext\r\n                                    : '',\r\n                                LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\r\n                            }\r\n                        ]\r\n                    };\r\n\r\n                    this.setState({\r\n                        cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\r\n                    });\r\n                }\r\n\r\n                return false;\r\n            })\r\n            .catch(() => {\r\n                return false;\r\n            });\r\n\r\n        return false;\r\n    };\r\n\r\n    /**\r\n     * Fulfillment store id is updated.\r\n     */\r\n    private readonly fulfillmentStoreIdUpdated = () => {\r\n        if (this.isQuantityLimitsFeatureEnabled) {\r\n            // Refresh products (in props.data) based on latest cart.\r\n            getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\r\n                .then(async () => this.validateCart())\r\n                .catch((error: Error) => {\r\n                    this.props.telemetry.warning(error.message);\r\n                    this.props.telemetry.debug('Unable to validate Cart');\r\n                });\r\n        }\r\n    };\r\n\r\n    /**\r\n     * Validates cart.\r\n     * @returns Void promise.\r\n     */\r\n    private async validateCart(): Promise<void> {\r\n        const {\r\n            data: { cart },\r\n            telemetry,\r\n            context\r\n        } = this.props;\r\n\r\n        const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(\r\n           // this.isQuantityLimitsFeatureEnabled,  //version upgrade commented the line as this is not part of validateCartAsync method\r\n            cart,\r\n            telemetry,\r\n            context,\r\n            true\r\n        );\r\n\r\n        const HSOConfigprop = this.props.data.channelConfiguration.result\r\n        && this.props.data.channelConfiguration.result.ExtensionProperties\r\n        && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n        let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n        if (HSOConfig == undefined) {\r\n            HSOConfig = 0;\r\n        }\r\n        if (HSOConfig) {\r\n            this.setState({ isCartValid: true });\r\n        }\r\n\r\n        if (validationResults) {\r\n            const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\r\n            this.setState({\r\n                cartlinesErrors: validationResults,\r\n                isCartValid: isValid\r\n            });\r\n        } else {\r\n            this.setState({ isCartValid: true });\r\n        }\r\n\r\n        return AsyncResult.resolve();\r\n    }\r\n\r\n    /**\r\n     * Get order quantity limit feature flag.\r\n     * @returns True if flag is enabled, false otherwise.\r\n     */\r\n    private async getOrderQuantityLimitsFeatureFlag(): Promise<boolean> {\r\n        const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n        if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n            return false;\r\n        }\r\n\r\n        try {\r\n            const featureStatuses = await this.props.data.featureState;\r\n            const isQuantityLimitsFeatureEnabledInHq =\r\n                featureStatuses.find(\r\n                    featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n                )?.IsEnabled || false;\r\n            if (!isQuantityLimitsFeatureEnabledInHq) {\r\n                return false;\r\n            }\r\n        } catch (error) {\r\n            this.props.telemetry.warning(error);\r\n            this.props.telemetry.debug('Unable to get feature states');\r\n            return false;\r\n        }\r\n\r\n        if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n            return true;\r\n        }\r\n        try {\r\n            const customerInfo = await this.props.data.customerInformation;\r\n            return (\r\n                !!customerInfo &&\r\n                ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n                    (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n            );\r\n        } catch (error) {\r\n            this.props.telemetry.warning(error);\r\n            this.props.telemetry.debug('Unable to get customer info');\r\n            return false;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Gets the cart lines group.\r\n     * @returns ICartlinesViewProps [][].\r\n     */\r\n    private getCartLinesGroup(): ICartlinesViewProps[][] | null {\r\n        const {\r\n            data: {\r\n                cart: { result: cart },\r\n                wishlists: { result: wishlists },\r\n                orderTemplates: { result: orderTemplates },\r\n                customerInformation: { result: customerInformation }\r\n            },\r\n            context: {\r\n                request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n            },\r\n            config,\r\n            telemetry,\r\n            resources,\r\n            modules\r\n        } = this.props;\r\n\r\n        const imageSettings = this.getImageSettings(config.imageSettings);\r\n        const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\r\n        let storeSelectorId: string = '';\r\n        if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n            storeSelectorId = modules.storeSelector[0].id;\r\n        }\r\n\r\n        const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n            featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n        );\r\n        const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n\r\n        return this.props.data.products &&\r\n            (cart?.hasInvoiceLine || this.props.data.products.result) &&\r\n            cart &&\r\n            cart.cart.CartLines &&\r\n            cart.cart.CartLines.length > 0 &&\r\n            this.props.data.channelDeliveryOptionConfig?.result\r\n            ? CartLineGroupItems({\r\n                  cartlines: cart.cart.CartLines,\r\n                  storeSelectorModuleId: storeSelectorId,\r\n                  cartlinesErrors,\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                  catalogs: this.props.data.catalogs?.result,\r\n                  imageSettings,\r\n                  isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n                  hasInvoiceLine: cart?.hasInvoiceLine || false,\r\n                  maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n                  gridSettings: this.props.context.request.gridSettings!,\r\n                  context: this.props.context,\r\n                  retailMulitplePickupFeatureState: multiplePickUpEnabled,\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: resources.productDimensionTypeConfiguration,\r\n                      styleString: resources.productDimensionTypeStyle,\r\n                      amountString: resources.productDimensionTypeAmount,\r\n                      quantityDisplayString: resources.quantityDisplayText,\r\n                      inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n                      decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n                      incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n                      discountStringText: resources.discountStringText,\r\n                      originalPriceText: resources.originalPriceText,\r\n                      currentPriceText: resources.currentPriceText,\r\n                      shippingChargesText: resources.shippingCharges,\r\n                      salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n                      priceEditorResources: {\r\n                          ...resources\r\n                      }\r\n                  },\r\n                  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                  outOfStockText: resources.outOfStockErrorMessage,\r\n                  outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n                  outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\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                  locationChangedHandler: this.fulfillmentStoreIdUpdated,\r\n                  wishlists,\r\n                  defaultWishlistName: resources.defaultWishlistName,\r\n                  pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n                  includeErrors: config.showOutOfStockErrors,\r\n                  showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n                  telemetryContent: this.telemetryContent,\r\n                  isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n                  addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n                  createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n                  itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n                  duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n                      resources\r\n                  ),\r\n\r\n                  addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n                  addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n                  addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n                  addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n                  orderTemplates,\r\n                  customerInformation,\r\n                  channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\r\n                  shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\r\n                  productAvailability: this.props.data.productAvailabilites,\r\n                  productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result\r\n              })\r\n            : null;\r\n    }\r\n}\r\n\r\nexport default Cart;\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 { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nimport { ArrayExtensions, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\n/**\r\n * Cart line inventory validation result interface.\r\n */\r\nexport interface ICartLineInventoryValidationResult {\r\n    /**\r\n     * Define whether the cart lines inventory is valid across multiple cart lines.\r\n     */\r\n    readonly isValid: boolean;\r\n\r\n    /**\r\n     * Defines the list of product id with invalid inventory.\r\n     */\r\n    readonly productIdWithErrors: number[];\r\n}\r\n\r\n/**\r\n * Validates inventory across cart lines.\r\n * @param cartLines - The cart lines.\r\n * @param productAvailabilities - The product availability collection.\r\n * @param actionContext - The action context.\r\n * @param products - The products.\r\n * @param emailDeliveryModeCode - The emailDeliveryModeCode.\r\n * @returns True if all product quantity are available, false otherwise.\r\n */\r\n// eslint-disable-next-line complexity -- existing code.\r\nexport function validateCartLinesInventory(\r\n    cartLines: CartLine[],\r\n    productAvailabilities: IProductInventoryInformation[],\r\n    actionContext: IActionContext,\r\n    products?: SimpleProduct[],\r\n    emailDeliveryModeCode?: string | undefined,\r\n    hsoConfig?: number\r\n): ICartLineInventoryValidationResult {\r\n    const cartLineMap = new Map<number, number>();\r\n    const defaultCartLineQuantity = 1;\r\n    if (!actionContext.requestContext.app.config.enableStockCheck) {\r\n        return {\r\n            isValid: true,\r\n            productIdWithErrors: []\r\n        };\r\n    }\r\n    const productIdWithErrors = [];\r\n    let isValid = true;\r\n\r\n    if (ArrayExtensions.hasElements(cartLines) && ArrayExtensions.hasElements(productAvailabilities)) {\r\n        // Consolidate products in different cart lines into single entry with the total cart quantity\r\n        for (const cartLine of cartLines) {\r\n            // Skip validation if is an invoice inline.\r\n            if (cartLine.ProductId && !cartLine.IsInvoiceLine && !cartLine.IsGiftCardLine) {\r\n                if (!cartLineMap.has(cartLine.ProductId)) {\r\n                    cartLineMap.set(cartLine.ProductId, cartLine.Quantity ?? defaultCartLineQuantity);\r\n                } else {\r\n                    const cartLineTotal = cartLineMap.get(cartLine.ProductId) ?? 0;\r\n                    cartLineMap.delete(cartLine.ProductId);\r\n                    cartLineMap.set(cartLine.ProductId, cartLineTotal + (cartLine.Quantity ?? defaultCartLineQuantity));\r\n                }\r\n            }\r\n        }\r\n\r\n        // Hashing product availability object by product ID.\r\n        const productAvailabilityMap = new Map<number, IProductInventoryInformation>();\r\n        for (const productAvailability of productAvailabilities) {\r\n            if (\r\n                productAvailability.ProductAvailableQuantity.ProductId &&\r\n                !productAvailabilityMap.has(productAvailability.ProductAvailableQuantity.ProductId)\r\n            ) {\r\n                productAvailabilityMap.set(productAvailability.ProductAvailableQuantity.ProductId, productAvailability);\r\n            }\r\n        }\r\n\r\n        // Compare total quantity with the available quantity from the inventory API, also validate that the product is available.\r\n        for (const productId of Array.from(cartLineMap.keys())) {\r\n            const cartLineQty = cartLineMap.get(productId) ?? defaultCartLineQuantity;\r\n            const productAvailability = productAvailabilityMap.get(productId);\r\n            const availableQuantity = productAvailability?.ProductAvailableQuantity.AvailableQuantity ?? undefined;\r\n\r\n            // If product is non-stocked or cartLine is electronic delivery, then no inventory check\r\n            const cartLine = cartLines.find(line => line.ProductId === productId);\r\n            const cartLineProduct = products?.find(product => product.RecordId === productId);\r\n            let isStockedItem = true;\r\n            if (cartLineProduct) {\r\n                isStockedItem = !!cartLineProduct.Behavior?.IsStockedProduct;\r\n            }\r\n            const isEmailDelivery =\r\n                cartLine?.DeliveryMode && cartLine.DeliveryMode !== '' ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\r\n            let shouldSkipInventoryCheck = !isStockedItem || isEmailDelivery;\r\n\r\n            if (hsoConfig) {\r\n                const estimatedDateProperty = availableQuantity\r\n                    && productAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n                    && productAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'EstimatedDate'));\r\n\r\n                const estimatedDateValue = estimatedDateProperty && estimatedDateProperty.Value && estimatedDateProperty.Value.StringValue;\r\n\r\n                let estimatedDate = \"\";\r\n                if (estimatedDateValue == undefined) {\r\n                    estimatedDate = \"\";\r\n                } else {\r\n                    estimatedDate = estimatedDateValue.toString();\r\n                }\r\n\r\n                const StockThresholdprop = availableQuantity\r\n                    && productAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n                    && productAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'StockThreshold'));\r\n                const StockThresholdpropval = StockThresholdprop && StockThresholdprop.Value && StockThresholdprop.Value.IntegerValue;\r\n                let StockThreshold = 0;\r\n                if (StockThresholdpropval != undefined) {\r\n                    StockThreshold = StockThresholdpropval;\r\n                }\r\n\r\n                let onhand = 0;\r\n                if (availableQuantity != undefined) {\r\n                    onhand = Number(availableQuantity);\r\n                }\r\n\r\n                if (StockThreshold == 0) {\r\n                    shouldSkipInventoryCheck = true;\r\n                } else {\r\n                    if (onhand >= StockThreshold) {\r\n                        shouldSkipInventoryCheck = true;\r\n                    } else {\r\n                        if (estimatedDate != \"\") {\r\n                            shouldSkipInventoryCheck = true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            // If product is non-stocked or cartLine is electronic delivery, then no inventory check\r\n            if (shouldSkipInventoryCheck) {\r\n                continue;\r\n            }\r\n            if (!productAvailability?.IsProductAvailable || (availableQuantity && cartLineQty > availableQuantity)) {\r\n                productIdWithErrors.push(productId);\r\n                isValid = false;\r\n            }\r\n        }\r\n    }\r\n    return {\r\n        isValid,\r\n        productIdWithErrors\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\n/* eslint-disable no-duplicate-imports */\r\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ICartLineItemPromotion {\r\n    id: string;\r\n    showPromotionPopup: boolean;\r\n    promotions: CartPromotionLine[] | undefined;\r\n    resources: ICartLineItemPromotionResourceString;\r\n    onSeeAllClick(event: React.MouseEvent<HTMLElement>): void;\r\n    onCloseButtonClick(): void;\r\n}\r\n\r\nexport interface ICartLineItemViewProps {\r\n    promotionMessageWrapper: INodeProps;\r\n    promotionMessage: React.ReactNode;\r\n    promotionSeeAllLink: React.ReactElement;\r\n    promotionDialog: React.ReactNode;\r\n}\r\n\r\nexport interface ICartLineItemPromotionResourceString {\r\n    promotionLinkText: string;\r\n    promotionStringHeading: string;\r\n    promotionPopupHeading: string;\r\n    promotionCloseButtonAriaLabel: string;\r\n}\r\n\r\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\r\n    const {\r\n        id,\r\n        showPromotionPopup,\r\n        promotions,\r\n        resources: { promotionLinkText, promotionPopupHeading },\r\n        onCloseButtonClick,\r\n        onSeeAllClick\r\n    } = props;\r\n\r\n    if (!ArrayExtensions.hasElements(promotions)) {\r\n        return;\r\n    }\r\n\r\n    const titleId = `${id}_title`;\r\n    const className = 'msc-cart__promotion';\r\n    return {\r\n        promotionMessageWrapper: {\r\n            className: 'msc-cart__promotion'\r\n        },\r\n        promotionMessage: (\r\n            <>\r\n                <span className='msi-promotion-icon' />\r\n                <span> {props.resources.promotionStringHeading}</span>\r\n            </>\r\n        ),\r\n        promotionSeeAllLink: (\r\n            <a className='msc-cart__promotion_link' tabIndex={0} role='link' onClick={onSeeAllClick}>\r\n                {` `}\r\n                {promotionLinkText} {` `}\r\n            </a>\r\n        ),\r\n        promotionDialog: (\r\n            <Modal isOpen={showPromotionPopup} className={`${className}`} toggle={onCloseButtonClick}>\r\n                <ModalHeader className={`${className}__dialog__header`} toggle={onCloseButtonClick}>\r\n                    <h5 id={titleId} className='msc-cart__promotion-popup_title'>\r\n                        {promotionPopupHeading}\r\n                    </h5>\r\n                </ModalHeader>\r\n                <ModalBody className={`${className}__dialog__body`}>\r\n                    <ul>\r\n                        {promotions.map(_promotion => {\r\n                            return (\r\n                                <li className='msc-cart__promotion-popup_name' key={_promotion.LineId}>\r\n                                    {_promotion.Promotion?.OfferName} {` `}\r\n                                </li>\r\n                            );\r\n                        })}\r\n                    </ul>\r\n                </ModalBody>\r\n                <ModalFooter className={`${className}__dialog__footer`} />\r\n            </Modal>\r\n        )\r\n    };\r\n};\r\n","/* eslint-disable no-duplicate-imports */\r\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport async function getValidProductImages(productId: number, channelId: number, actionContext: IActionContext, imageSettings: IImageSettings): Promise<IImageData[]> {\r\n    const actionInput = new MediaLocationsForSelectedVariantInput(\r\n        productId,\r\n        channelId,\r\n    );\r\n\r\n    return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n        .then(mediaLocations => {\r\n            if (mediaLocations) {\r\n                return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\r\n                    .then(pairs => {\r\n                        return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n                    });\r\n            }\r\n\r\n            return [];\r\n        }).catch(error => {\r\n            actionContext.telemetry.exception(error);\r\n            actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n            return [];\r\n        });\r\n}\r\n\r\nexport async function validateProductImages(mediaLocations: MediaLocation[], actionContext: IActionContext, imageSettings: IImageSettings): Promise<IImageData[]> {\r\n    return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\r\n        .then(pairs => {\r\n            return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n        }).catch(error => {\r\n            actionContext.telemetry.exception(error);\r\n            actionContext.telemetry.debug('Unable to validate prodcut images');\r\n            return [];\r\n        });\r\n}\r\n\r\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings: IImageSettings): Promise<[IImageData, boolean]> {\r\n    const imageData = {\r\n        src: mediaLocation.Uri || '',\r\n        altText: mediaLocation.AltText || ''\r\n    };\r\n\r\n    const imageSettingsVal = ((imageSettings.viewports?.lg!.q!).replace(/['\"]+/g, ''));\r\n\r\n    if (imageData.src === '') {\r\n        return [imageData, false];\r\n    }\r\n\r\n    const imageConcatVal = `${imageData.src}` + `&` + `${imageSettingsVal}`;\r\n\r\n    return new Promise<[IImageData, boolean]>((resolve) => {\r\n        try {\r\n            const http = new XMLHttpRequest();\r\n            http.open('HEAD', imageConcatVal, true);\r\n\r\n            http.onload = () => {\r\n                resolve([imageData, http.status === 200 || http.status === 201]);\r\n            };\r\n\r\n            http.onerror = () => {\r\n                resolve([imageData, false]);\r\n            };\r\n\r\n            http.send();\r\n        } catch (e) {\r\n            resolve([imageData, false]);\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\n/* eslint-disable no-duplicate-imports */\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\r\n\r\nimport {\r\n    IComponentNodeProps,\r\n    ImagefullView,\r\n    IModalViewProps,\r\n    IModuleProps,\r\n    inlineZoomImageOnHover,\r\n    inlineZoomImageOnMouseMove,\r\n    inlineZoomImageOnMouseOut,\r\n    inlineZoomInit,\r\n    INodeProps,\r\n    ISingleSlideCarouselProps,\r\n    KeyCodes,\r\n    NodeTag,\r\n    onContainerZoomInit,\r\n    onMouseMoveLensContainer,\r\n    onMouseOutLensContainer,\r\n    onMouseOverImageContainer,\r\n    removeInlineZoomStyle,\r\n    SingleSlideCarousel\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n//@ts-ignore\r\nimport { imageSource, imageZoom, ICittaMediaGalleryData, ICittaMediaGalleryProps, thumbnailsOrientation } from '@msdyn365-commerce-modules/media-gallery';\r\nimport { getValidProductImages, validateProductImages } from './utils';\r\n\r\nexport interface IMediaGalleryState {\r\n    animating: boolean;\r\n    activeIndex: number;\r\n    mediaGalleryItems: IImageData[] | undefined;\r\n    isImageZoomed: boolean;\r\n    modalIsOpen: boolean;\r\n    lastUpdate?: number;\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailsViewProps {\r\n    ThumbnailsContainerProps: INodeProps;\r\n    SingleSlideCarouselComponentProps: INodeProps;\r\n    items?: IMediaGalleryThumbnailItemViewProps[];\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailItemViewProps {\r\n    ThumbnailItemContainerProps: INodeProps;\r\n    Picture: React.ReactElement;\r\n}\r\n\r\nexport interface IMediaGalleryViewProps extends ICittaMediaGalleryProps<ICittaMediaGalleryData> {\r\n    state: IMediaGalleryState;\r\n    MediaGallery: IModuleProps;\r\n    CarouselProps: INodeProps;\r\n    Thumbnails: IMediaGalleryThumbnailsViewProps;\r\n    Modal?:React.ReactElement|null;\r\n}\r\n\r\n/**\r\n * Media gallery component\r\n */\r\nclass MediaGallery extends React.Component<ICittaMediaGalleryProps<ICittaMediaGalleryData>, IMediaGalleryState> {\r\n    private _inlineZoomDivRef: Map<number, HTMLDivElement> = new Map();\r\n    private readonly defaultGalleryImageSettings: IImageSettings = {\r\n        viewports: {\r\n            xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\r\n            sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\r\n            md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\r\n            lg: { q: 'h=772&m=8', w: 0, h: 0 }\r\n        },\r\n        lazyload: true,\r\n        cropFocalRegion: true\r\n    };\r\n\r\n    private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n        viewports: {\r\n            xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n            lg: { q: 'w=100&m=8', w: 100, h: 0 }\r\n        },\r\n        lazyload: true,\r\n        cropFocalRegion: true\r\n    };\r\n\r\n    constructor(props: ICittaMediaGalleryProps<ICittaMediaGalleryData>) {\r\n        super(props);\r\n        this._toggleModal = this._toggleModal.bind(this);\r\n        this.state = { activeIndex: 0, animating: false, mediaGalleryItems: undefined, isImageZoomed: false, modalIsOpen:false };\r\n\r\n        this._onImageMouseOut = this._onImageMouseOut.bind(this);\r\n        this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\r\n        this._onInlineImageClick = this._onInlineImageClick.bind(this);\r\n        this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\r\n        this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\r\n    }\r\n\r\n    public async componentDidMount(): Promise<void> {\r\n        const source = this.props.config.imageSource || imageSource.pageContext;\r\n        const curatedImage = this.props.config.images || [];\r\n\r\n        if (source === imageSource.pageContext) {\r\n            reaction(\r\n                () => (this.props.data.product.result ? this.props.data.product.result.RecordId : null),\r\n                async () => {\r\n                    if (this.props.data.product.result) {\r\n                        const images = await getValidProductImages(\r\n                            this.props.data.product.result.RecordId,\r\n                            +this.props.context.request.apiSettings.channelId,\r\n                            this.props.context.actionContext,\r\n                            this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n                        );\r\n                        this.setState({\r\n                            mediaGalleryItems: [...images, ...curatedImage],\r\n                            activeIndex: 0,\r\n                            lastUpdate: Date.now()\r\n                        });\r\n                    } else {\r\n                        this.setState({\r\n                            mediaGalleryItems: [...curatedImage],\r\n                            activeIndex: 0,\r\n                            lastUpdate: Date.now()\r\n                        });\r\n                    }\r\n                }\r\n            );\r\n        }\r\n\r\n        if (source === imageSource.productId && this.props.data.mediaLocations.result) {\r\n            const images = await validateProductImages(\r\n                this.props.data.mediaLocations.result,\r\n                this.props.context.actionContext,\r\n                this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n            );\r\n            this.setState({\r\n                mediaGalleryItems: [...images, ...curatedImage],\r\n                activeIndex: 0,\r\n                lastUpdate: Date.now()\r\n            });\r\n        } else if (source === imageSource.pageContext && this.props.data.product.result) {\r\n            const images = await getValidProductImages(\r\n                this.props.data.product.result.RecordId,\r\n                +this.props.context.request.apiSettings.channelId,\r\n                this.props.context.actionContext,\r\n                this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n            );\r\n\r\n            this.setState({\r\n                mediaGalleryItems: [...images, ...curatedImage],\r\n                activeIndex: 0,\r\n                lastUpdate: Date.now()\r\n            });\r\n        } else {\r\n            this.setState({\r\n                mediaGalleryItems: [...curatedImage],\r\n                activeIndex: 0,\r\n                lastUpdate: Date.now()\r\n            });\r\n        }\r\n    }\r\n\r\n    public render(): JSX.Element {\r\n        const {\r\n            id,\r\n            config,\r\n            resources\r\n        } = this.props;\r\n\r\n        const mediaGalleryItems = this.state.mediaGalleryItems;\r\n        const { className, showPaginationTooltip } = config;\r\n        const galleryImageSettings = config.galleryImageSettings;\r\n        if(galleryImageSettings) {\r\n            galleryImageSettings.cropFocalRegion = true;\r\n        }\r\n        const thumbnailImageSettings = config.thumbnailImageSettings;\r\n        if(thumbnailImageSettings) {\r\n            thumbnailImageSettings.cropFocalRegion = true;\r\n        }\r\n\r\n        const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\r\n        const allowFullscreen:boolean = config.allowFullScreen || false;\r\n        const zoomViewMode: string =\r\n            config.imageZoom === imageZoom.inline\r\n                ? imageZoom.inline\r\n                : config.imageZoom === imageZoom.container\r\n                ? imageZoom.container\r\n                : '';\r\n        const zoomView = allowFullscreen ? 'fullscreen': zoomViewMode;\r\n\r\n        const viewProps: IMediaGalleryViewProps = {\r\n            ...(this.props as ICittaMediaGalleryProps<ICittaMediaGalleryData>),\r\n            state: this.state,\r\n            MediaGallery: {\r\n                moduleProps: this.props,\r\n                className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\r\n            },\r\n            Modal: allowFullscreen ? this.imageModalSlider(zoomViewMode): null,\r\n            CarouselProps: {\r\n                tag: Carousel,\r\n                className: 'ms-media-gallery__carousel',\r\n                items:\r\n                    mediaGalleryItems &&\r\n                    mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(zoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\r\n                activeIndex: this.state.activeIndex,\r\n                next: this.next,\r\n                previous: this.previous,\r\n                interval: false,\r\n                directionTextPrev: resources.previousScreenshotFlipperText,\r\n                directionTextNext: resources.nextScreenshotFlipperText,\r\n                onIndicatorsClickHandler: this.goToIndex,\r\n                showPaginationTooltip: showPaginationTooltip === true,\r\n                handleOnExited: this.onExited,\r\n                handleOnExiting: this.onExiting,\r\n                key: this.state.lastUpdate\r\n            } as IComponentNodeProps<ICarouselProps>,\r\n            Thumbnails: {\r\n                ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\r\n                SingleSlideCarouselComponentProps: {\r\n                    tag: SingleSlideCarousel,\r\n                    className: 'ms-media-gallery__thumbnails',\r\n                    vertical: isVertical,\r\n                    flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n                    flipperNextLabel: resources.nextScreenshotFlipperText,\r\n                    parentId: id,\r\n                    useTabList: true,\r\n                    key: this.state.lastUpdate\r\n                } as IComponentNodeProps<ISingleSlideCarouselProps>,\r\n                items:\r\n                    mediaGalleryItems &&\r\n                    mediaGalleryItems.map((item: IImageData, index: number) => this._getThumbnailItem(item, thumbnailImageSettings || this.defaultThumbnailImageSettings, index, this.state.activeIndex))\r\n            }\r\n        };\r\n\r\n        return this.props.renderView(viewProps) as React.ReactElement;\r\n    }\r\n\r\n    private onExiting = () => {\r\n        this.setState({ animating: true });\r\n    };\r\n\r\n    private onExited = () => {\r\n        this.setState({ animating: false });\r\n    };\r\n\r\n    private next = (): void => {\r\n        if (this.isLastItem() === undefined) {\r\n            return;\r\n        }\r\n\r\n        const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\r\n        this.goToIndex(nextIndex);\r\n    };\r\n\r\n    private previous = (): void => {\r\n        const nextIndex = this.isFirstItem()\r\n            ? this.state.mediaGalleryItems\r\n                ? this.state.mediaGalleryItems.length - 1\r\n                : 0\r\n            : this.state.activeIndex - 1;\r\n        this.goToIndex(nextIndex);\r\n    };\r\n\r\n    private goToIndex = (index: number): void => {\r\n        this.setState({ activeIndex: index });\r\n    };\r\n\r\n    private _renderCarouselItemImageView(zoomView: string, image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n        if (zoomView === 'container') {\r\n            return this._renderImageInContainerOnZoom(image, imageSettings, index);\r\n        } else if (zoomView === 'inline') {\r\n            return this._renderImageInlineOnZoom(image, imageSettings, index);\r\n        } else if (zoomView === 'fullscreen') {\r\n            return this._renderImageFullScreenOnZoom(image, imageSettings, index);\r\n        } else {\r\n            return <React.Fragment>{this._getCarouselItem(image, imageSettings, index)}</React.Fragment>;\r\n        }\r\n    }\r\n\r\n    private _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\r\n        <Image\r\n            className='ms-media-gallery__item'\r\n            {...image}\r\n            gridSettings={this.props.context.request.gridSettings!}\r\n            imageSettings={imageSettings}\r\n            loadFailureBehavior='default'\r\n            role='tabpanel'\r\n            id={`${this.props.id}__carousel-item__${index}`}\r\n        />\r\n    );\r\n\r\n    private _getThumbnailItem = (image: IImageData, imageSettings: IImageSettings, index: number, modifiedActiveIndex: number): IMediaGalleryThumbnailItemViewProps => {\r\n        const classes = classnames(\r\n            'ms-media-gallery__thumbnail-item',\r\n            modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n        );\r\n\r\n        return {\r\n            ThumbnailItemContainerProps: {\r\n                tag: 'li' as NodeTag,\r\n                className: classes,\r\n                role: 'tab',\r\n                tabIndex: 0,\r\n                key: index,\r\n                'aria-label': image.altText,\r\n                'aria-selected': modifiedActiveIndex === index,\r\n                'aria-controls': `${this.props.id}__carousel-item__${index}`,\r\n                onClick: this._generateOnThumbnailClick(index),\r\n                onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n            },\r\n            Picture: (\r\n                <Image\r\n                    className='ms-media-gallery__thumbnail'\r\n                    {...image}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='default'\r\n                />\r\n            )\r\n        };\r\n    };\r\n\r\n    private _generateOnThumbnailKeyDown = (index: number) => {\r\n        return (event: React.KeyboardEvent) => {\r\n            if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\r\n                event.preventDefault();\r\n\r\n                this.goToIndex(index);\r\n            }\r\n        };\r\n    };\r\n\r\n    private _generateOnThumbnailClick = (index: number) => {\r\n        return (event: React.MouseEvent<HTMLLIElement>) => {\r\n            event.preventDefault();\r\n\r\n            this.goToIndex(index);\r\n        };\r\n    };\r\n\r\n    private _renderImageInlineOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n        return (\r\n            // tslint:disable-next-line: react-this-binding-issue\r\n            <div className={`ms-inline-zoom ${this.state.isImageZoomed ? 'zoomed' : ''}`} ref={divRef => this._inlineZoomDivRef.set(index, divRef!)} data-scale={this.props.config.dataScale}>\r\n                <Image\r\n                    className='ms-media-gallery__item'\r\n                    {...image}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='default'\r\n                    role='tabpanel'\r\n                    onClick={this._onInlineImageClick}\r\n                    onMouseOver={this.state.isImageZoomed && this._inlineZoomImageOnHover || undefined}\r\n                    id={`${this.props.id}__carousel-item__${index}`}\r\n                />\r\n                <Image\r\n                    role='presentation'\r\n                    className='ms-inline-zoom__zoomedImg'\r\n                    {...image}\r\n                    onClick={this._onImageMouseOut}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='default'\r\n                    id={`${this.props.id}__zoom__${index}`}\r\n                    onMouseMove={this.state.isImageZoomed && inlineZoomImageOnMouseMove || undefined}\r\n                />\r\n            </div>\r\n        );\r\n    }\r\n\r\n    private _inlineZoomImageOnHover(event: React.MouseEvent<HTMLImageElement>): void {\r\n        inlineZoomImageOnHover(event, this.props.config.dataScale);\r\n    }\r\n\r\n    private _onInlineImageClick(event: React.MouseEvent<HTMLImageElement>): void {\r\n        if (window.innerWidth <= 768) { // $msv-breakpoint-m\r\n            return;\r\n        }\r\n\r\n        inlineZoomInit(event, this.props.config.dataScale);\r\n        this.setState({\r\n            isImageZoomed: true\r\n        });\r\n    }\r\n\r\n    private _onImageMouseOut(event: React.MouseEvent<HTMLImageElement, MouseEvent>): void {\r\n        inlineZoomImageOnMouseOut(event);\r\n        this.setState({\r\n            isImageZoomed: false\r\n        });\r\n\r\n    }\r\n\r\n    private _onContainerZoomImageClick(event: React.MouseEvent<HTMLImageElement>): void {\r\n        if (window.innerWidth <= 768) { // $msv-breakpoint-m\r\n            return;\r\n        }\r\n\r\n        onContainerZoomInit(event);\r\n\r\n        this.setState({\r\n            isImageZoomed: true\r\n        });\r\n    }\r\n\r\n    private _onMouseOutLensContainer(event: React.MouseEvent<HTMLImageElement>): void {\r\n        onMouseOutLensContainer(event);\r\n\r\n        this.setState({\r\n            isImageZoomed: false\r\n        });\r\n    }\r\n\r\n    private _renderImageInContainerOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n        return (\r\n            <div className='ms-containerZoom__container'>\r\n                <div className='ms-containerZoom__zoom-lens' role='presentation' onMouseOut={this._onMouseOutLensContainer} onClick={this._onMouseOutLensContainer} onMouseMove={this.state.isImageZoomed && onMouseMoveLensContainer || undefined} />\r\n                <Image\r\n                    className='ms-media-gallery__item'\r\n                    {...image}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    onClick={this._onContainerZoomImageClick}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='default'\r\n                    onMouseOver={this.state.isImageZoomed && onMouseOverImageContainer || undefined}\r\n                    id={`${this.props.id}__carousel-item__${index}`}\r\n                />\r\n            </div>\r\n        );\r\n    }\r\n\r\n    private _renderImageFullScreenOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n        return (\r\n            <div className='ms-fullscreen-section'>\r\n                <Image\r\n                    className='ms-media-gallery__item'\r\n                    {...image}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='default'\r\n                    role='tabpanel'\r\n                />\r\n                <div className='ms-fullscreen-section__overlay'>\r\n                    <a href='javascript:void(0);' title={this.props.resources.fullScreenTitleText} role='button' onClick={this.openModalDialog} className='ms-fullscreen-section__magnifying-glass-icon'/>\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n\r\n    private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n        return {\r\n            src: product.PrimaryImageUrl || ''\r\n        };\r\n    }\r\n\r\n    private isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n    private isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\r\n\r\n    private openModalDialog = (): void => {\r\n        this._toggleModal();\r\n    }\r\n\r\n    private _toggleModal(): void {\r\n        if (this.state.modalIsOpen) {\r\n            const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\r\n            if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\r\n                const image = parentDiv.children[1].querySelector('img');\r\n                if (image) {\r\n                    image.removeAttribute('style');\r\n                }\r\n            }\r\n            this.setState({\r\n                isImageZoomed: false\r\n            });\r\n        }\r\n        this.setState({\r\n            isImageZoomed: false,\r\n            modalIsOpen: !this.state.modalIsOpen\r\n        });\r\n        removeInlineZoomStyle();\r\n    }\r\n\r\n    private imageModalSlider=(ZoomView:string):React.ReactElement => {\r\n        const {\r\n            data: {\r\n                product: { result: product }\r\n            },\r\n            resources,\r\n            config\r\n        } = this.props;\r\n        let mediaGalleryItems = this.state.mediaGalleryItems;\r\n\r\n        if (!mediaGalleryItems && product) {\r\n            mediaGalleryItems = [this._mapProductToImageData(product)];\r\n        }\r\n\r\n        const galleryImageSettings = config.galleryImageSettings;\r\n        if(galleryImageSettings) {\r\n            galleryImageSettings.cropFocalRegion = true;\r\n        }\r\n\r\n        const carouselprops = {\r\n            tag: Carousel,\r\n            className: 'ms-media-gallery__carousel',\r\n            items:\r\n                mediaGalleryItems &&\r\n                mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(ZoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\r\n            activeIndex: this.state.activeIndex,\r\n            next: this.next,\r\n            previous: this.previous,\r\n            interval: false,\r\n            directionTextPrev: resources.previousScreenshotFlipperText,\r\n            directionTextNext: resources.nextScreenshotFlipperText,\r\n            onIndicatorsClickHandler: this.goToIndex,\r\n            showPaginationTooltip: true,\r\n            hideIndicator: true,\r\n            handleOnExited: this.onExited,\r\n            handleOnExiting: this.onExiting,\r\n        } as IComponentNodeProps<ICarouselProps>;\r\n\r\n        const carousel = <Carousel  {...carouselprops} />;\r\n\r\n        const imageModalSliderProps:IModalViewProps = {\r\n            modalIsOpen:this.state.modalIsOpen,\r\n            ontoggle:this._toggleModal,\r\n            galleryCarousel: carousel\r\n       };\r\n        return ImagefullView(imageModalSliderProps) as React.ReactElement;\r\n    }\r\n}\r\n\r\nexport default MediaGallery;\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 * ISuperMediaGallery 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 imageSource {\r\n    pageContext = 'pageContext',\r\n    productId = 'productId'\r\n}\r\n\r\nexport const enum imageZoom {\r\n    inline = 'inline',\r\n    container = 'container'\r\n}\r\n\r\nexport const enum thumbnailsOrientation {\r\n    vertical = 'vertical',\r\n    horizontal = 'horizontal'\r\n}\r\n\r\nexport const enum altTextSource {\r\n    product = 'product',\r\n    cms = 'cms'\r\n}\r\n\r\nexport interface ISuperMediaGalleryConfig extends Msdyn365.IModuleConfig {\r\n    imageSource?: imageSource;\r\n    images?: Msdyn365.IImageData[];\r\n    productId?: string;\r\n    imageZoom?: imageZoom;\r\n    allowFullScreen?: boolean;\r\n    dataScale?: string;\r\n    zoomedImageSettings?: Msdyn365.IImageSettings;\r\n    thumbnailsOrientation?: thumbnailsOrientation;\r\n    thumbnailImageSettings?: Msdyn365.IImageSettings;\r\n    galleryImageSettings?: Msdyn365.IImageSettings;\r\n    shouldHideMasterProductImagesForVariant?: boolean;\r\n    altTextSource?: altTextSource;\r\n    showPaginationTooltip?: boolean;\r\n    shouldUpdateOnPartialDimensionSelection?: boolean;\r\n    className?: string;\r\n    skipImageValidation?: boolean;\r\n    autoplay?: boolean;\r\n    mute?: boolean;\r\n    playPauseTrigger?: boolean;\r\n    controls?: boolean;\r\n    clientRender?: boolean;\r\n}\r\n\r\nexport interface ISuperMediaGalleryResources {\r\n    nextScreenshotFlipperText: string;\r\n    previousScreenshotFlipperText: string;\r\n    fullScreenTitleText: string;\r\n    ariaLabelForSlide: string;\r\n    playLabel: string;\r\n    pauseLabel: string;\r\n    pausedLabel: string;\r\n    playingLabel: string;\r\n    unMuteLabel: string;\r\n    muteLabel: string;\r\n    fullScreenLabel: string;\r\n    exitFullScreenLabel: string;\r\n    seekBarLabel: string;\r\n    videoTimeDurationLabel: string;\r\n    closedCaptionLabel: string;\r\n    optionButtonLabel: string;\r\n    sliderThumbLabel: string;\r\n    volumeThumbLabel: string;\r\n    playVideoTitleText: string;\r\n}\r\n\r\nexport interface ISuperMediaGalleryProps<T> extends Msdyn365.IModule<T> {\r\n    resources: ISuperMediaGalleryResources;\r\n    config: ISuperMediaGalleryConfig;\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\n/* eslint-disable no-duplicate-imports */\r\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\r\n\r\nexport enum MediaType {\r\n    /**\r\n     * The None.\r\n     */\r\n    None = 0,\r\n    /**\r\n     * The Image type.\r\n     */\r\n    Image = 1,\r\n    /**\r\n     * The video type.\r\n     */\r\n    Video = 2,\r\n    /**\r\n     * The file type.\r\n     */\r\n    File = 3\r\n}\r\n\r\nexport interface IMediaData extends IImageData {\r\n    mediaTypeValue?: MediaType;\r\n    displayOrder?: number;\r\n    videoData?: IVideoData;\r\n}\r\n\r\n/**\r\n * Gets correct alt text for image based on configuration of site.\r\n * @param productName Product name.\r\n * @param context Current request context.\r\n * @param imageAltText Alt-text from CMS image.\r\n */\r\nexport function getAltText(\r\n    context: IRequestContext,\r\n    shouldUseCmsAltText: boolean,\r\n    productName?: string,\r\n    imageAltText?: string\r\n): string | undefined {\r\n    if (!context?.app?.config?.OmniChannelMedia) {\r\n        return productName;\r\n    }\r\n    if (shouldUseCmsAltText) {\r\n        return imageAltText;\r\n    }\r\n    return productName;\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\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n    commerceApiRequest,\r\n    commerceVideoMetadataRequest,\r\n    getCatalogId,\r\n    IActionContext,\r\n    IImageData,\r\n    IImageSettings,\r\n    IVideoData\r\n} from '@msdyn365-commerce/core';\r\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n    ArrayExtensions,\r\n    getMediaLocationsForSelectedVariant,\r\n    MediaLocationsForSelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getAltText } from './helper';\r\n\r\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\r\n    const imageData: IImageData = {\r\n        src: mediaLocation.Uri || '',\r\n        altText: mediaLocation.AltText || ''\r\n    };\r\n    if (mediaLocation.IsApplicableForChildEntities) {\r\n        imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\r\n    }\r\n\r\n    if (imageData.src === '') {\r\n        return [imageData, false];\r\n    }\r\n\r\n    return new Promise<[IImageData, boolean]>(resolve => {\r\n        try {\r\n            const http = new XMLHttpRequest();\r\n            http.open('HEAD', imageData.src!, true);\r\n\r\n            http.addEventListener('load', () => {\r\n                resolve([imageData, http.status === 200 || http.status === 201]);\r\n            });\r\n\r\n            http.addEventListener('error', () => {\r\n                resolve([imageData, false]);\r\n            });\r\n\r\n            http.send();\r\n        } catch {\r\n            resolve([imageData, false]);\r\n        }\r\n    });\r\n}\r\n\r\nexport async function getValidProductImages(\r\n    productId: number,\r\n    channelId: number,\r\n    actionContext: IActionContext,\r\n    imageSettings: IImageSettings,\r\n    selectedProduct?: SimpleProduct\r\n): Promise<IImageData[]> {\r\n    const catalogId = getCatalogId(actionContext.requestContext);\r\n    const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\r\n\r\n    return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n        .then(mediaLocations => {\r\n            if (mediaLocations) {\r\n                return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\r\n                    return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n                });\r\n            }\r\n\r\n            return [];\r\n        })\r\n        .catch(error => {\r\n            actionContext.telemetry.exception(error);\r\n            actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n            return [];\r\n        });\r\n}\r\n\r\n/**\r\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\r\n * @param productId Product record id.\r\n * @param shouldUseCmsAltText Alt-text source to use.\r\n * @param channelId Current channel id.\r\n * @param actionContext Current action context.\r\n * @param productName Product name.\r\n * @param selectedProduct Currently selected variant product.\r\n * @returns List of images.\r\n */\r\n\r\nexport async function getProductImages(\r\n    productId: number,\r\n    shouldUseCmsAltText: boolean,\r\n    channelId: number,\r\n    actionContext: IActionContext,\r\n    productName?: string,\r\n    selectedProduct?: SimpleProduct\r\n): Promise<IImageData[]> {\r\n    const catalogId = getCatalogId(actionContext.requestContext);\r\n    if (actionContext.requestContext?.params?.isPreview) {\r\n        const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\r\n            productId: productId,\r\n            channelId: channelId,\r\n            catalogId: catalogId\r\n        });\r\n        if (response.status !== 200) {\r\n            actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\r\n            return [];\r\n        }\r\n        const previewImageData = response?.data as MediaLocation[];\r\n        if (previewImageData) {\r\n            return previewImageData.map(mediaLocation => {\r\n                return {\r\n                    src: mediaLocation.Uri ?? '',\r\n                    altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\r\n                    displayOrder: mediaLocation.DisplayOrder,\r\n                    mediaTypeValue: mediaLocation.MediaTypeValue,\r\n                    additionalProperties: mediaLocation.IsApplicableForChildEntities\r\n                        ? {\r\n                              isApplicableForChildEntities: 'true'\r\n                          }\r\n                        : undefined\r\n                };\r\n            });\r\n        }\r\n        return [];\r\n    }\r\n    const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\r\n    return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n        .then(mediaLocations => {\r\n            if (mediaLocations) {\r\n                return mediaLocations.map(mediaLocation => {\r\n                    return {\r\n                        src: mediaLocation.Uri ?? '',\r\n                        altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\r\n                        displayOrder: mediaLocation.DisplayOrder,\r\n                        mediaTypeValue: mediaLocation.MediaTypeValue,\r\n                        additionalProperties: mediaLocation.IsApplicableForChildEntities\r\n                            ? {\r\n                                  isApplicableForChildEntities: 'true'\r\n                              }\r\n                            : undefined\r\n                    };\r\n                });\r\n            }\r\n            return [];\r\n        })\r\n        .catch(error => {\r\n            actionContext.telemetry.exception(error);\r\n            actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n            return [];\r\n        });\r\n}\r\n\r\nexport async function validateProductImages(\r\n    mediaLocations: MediaLocation[],\r\n    actionContext: IActionContext,\r\n    imageSettings: IImageSettings\r\n): Promise<IImageData[]> {\r\n    return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\r\n        .then(pairs => {\r\n            return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n        })\r\n        .catch(error => {\r\n            actionContext.telemetry.exception(error);\r\n            actionContext.telemetry.debug('Unable to validate product images');\r\n            return [];\r\n        });\r\n}\r\n\r\n/**\r\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\r\n * @param videoId: Video Id\r\n * @param actionContext: Action context\r\n * @returns: Returns the meta data of the video.\r\n */\r\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise<IVideoData | undefined> {\r\n    let videoPlayerData: IVideoData | undefined;\r\n    if (videoId) {\r\n        const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\r\n\r\n        if (response.status !== 200) {\r\n            actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\r\n            return;\r\n        }\r\n\r\n        const videoData = response.data as [];\r\n        if (videoData && ArrayExtensions.hasElements(videoData)) {\r\n            videoPlayerData = videoData[0];\r\n        }\r\n    }\r\n    return videoPlayerData;\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/* eslint-disable no-duplicate-imports */\r\nimport { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\r\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\r\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n    defaultDataScale,\r\n    IComponentNodeProps,\r\n    ImagefullView,\r\n    IModalViewProps,\r\n    IModuleProps,\r\n    inlineZoomImageOnHover,\r\n    inlineZoomImageOnMouseMove,\r\n    inlineZoomImageOnMouseOut,\r\n    inlineZoomInitClick,\r\n    INodeProps,\r\n    ISingleSlideCarouselProps,\r\n    isMobile,\r\n    KeyCodes,\r\n    NodeTag,\r\n    onContainerZoomInit,\r\n    onMouseMoveLensContainer,\r\n    onMouseOutLensContainer,\r\n    onMouseOverImageContainer,\r\n    removeContainerZoomStyle,\r\n    removeInlineZoomStyle,\r\n    SingleSlideCarousel,\r\n    VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { ISuperMediaGalleryData } from './super-media-gallery.data';\r\nimport { imageSource, imageZoom, ISuperMediaGalleryProps, thumbnailsOrientation } from './super-media-gallery.props.autogenerated';\r\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\r\nimport { getAltText, IMediaData } from './utils/helper';\r\n\r\n/**\r\n * IMediaGalleryState Interface.\r\n */\r\nexport interface IMediaGalleryState {\r\n    animating: boolean;\r\n    activeIndex: number;\r\n    isImageZoomed: boolean;\r\n    modalIsOpen: boolean;\r\n    lastUpdate?: number;\r\n    isMobileImageZoomed?: boolean;\r\n    mediaGalleryItems?: IMediaData[];\r\n    isInitialLoad?: boolean;\r\n    shouldUseOptimizedImage?: boolean;\r\n}\r\n\r\n/**\r\n * IMediaGalleryThumbnailsViewProps Interface.\r\n */\r\nexport interface IMediaGalleryThumbnailsViewProps {\r\n    ThumbnailsContainerProps: INodeProps;\r\n    SingleSlideCarouselComponentProps: INodeProps;\r\n    items?: IMediaGalleryThumbnailItemViewProps[];\r\n}\r\n\r\n/**\r\n * IMediaGalleryThumbnailItemViewProps Interface.\r\n */\r\nexport interface IMediaGalleryThumbnailItemViewProps {\r\n    ThumbnailItemContainerProps: INodeProps;\r\n    Picture: React.ReactElement;\r\n}\r\n\r\n/**\r\n * IMediaGalleryViewProps Interface.\r\n */\r\nexport interface IMediaGalleryViewProps extends ISuperMediaGalleryProps<ISuperMediaGalleryData> {\r\n    state: IMediaGalleryState;\r\n    MediaGallery: IModuleProps;\r\n    CarouselProps: INodeProps;\r\n    Thumbnails: IMediaGalleryThumbnailsViewProps;\r\n    Modal?: React.ReactElement | null;\r\n    callbackToggle?(): void;\r\n    callbackThumbnailClick?(index: number): void;\r\n    callbackThumbnailKeyDown?(index: number): void;\r\n}\r\n\r\n/**\r\n * Props for carousel.\r\n */\r\ninterface IMediaGalleryCarouselItems<ItemType> {\r\n    items: ItemType[];\r\n    keys: (string | undefined)[];\r\n}\r\n\r\n/**\r\n * Media gallery component.\r\n */\r\nclass MediaGallery extends React.Component<ISuperMediaGalleryProps<ISuperMediaGalleryData>, IMediaGalleryState> {\r\n    private readonly _inlineZoomDivRef: Map<number, HTMLDivElement> = new Map();\r\n\r\n    private readonly fullScreenOverlayButtonRef: React.RefObject<HTMLAnchorElement & HTMLButtonElement> = React.createRef();\r\n    private readonly player: React.RefObject<Player> = React.createRef<Player>();\r\n\r\n    private mediaGalleryImages: IImageData[] = [];\r\n\r\n    private fallbackImage?: string;\r\n\r\n    private readonly defaultGalleryImageSettings: IImageSettings = {\r\n        viewports: {\r\n            xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\r\n            sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\r\n            md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\r\n            lg: { q: 'h=772&m=8', w: 0, h: 0 }\r\n        },\r\n        lazyload: true,\r\n        cropFocalRegion: true\r\n    };\r\n\r\n    private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n        viewports: {\r\n            xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n            lg: { q: 'w=100&m=8', w: 100, h: 0 }\r\n        },\r\n        lazyload: true,\r\n        cropFocalRegion: true\r\n    };\r\n\r\n    private readonly _zoomedImageSettings: IImageSettings;\r\n\r\n    public constructor(props: ISuperMediaGalleryProps<ISuperMediaGalleryData>) {\r\n        super(props);\r\n        this._toggleModal = this._toggleModal.bind(this);\r\n        this.state = {\r\n            activeIndex: 0,\r\n            animating: false,\r\n            isImageZoomed: false,\r\n            modalIsOpen: false,\r\n            isInitialLoad: true,\r\n            shouldUseOptimizedImage: !!this.props.config.skipImageValidation,\r\n        };\r\n\r\n        this._zoomedImageSettings =\r\n            props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\r\n\r\n        this._onImageMouseOut = this._onImageMouseOut.bind(this);\r\n        this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\r\n        this._onInlineImageClick = this._onInlineImageClick.bind(this);\r\n        this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\r\n        this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\r\n    }\r\n\r\n    public isMobile(): boolean {\r\n        const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n        return size === 'xs';\r\n    }\r\n\r\n    public async componentDidMount(): Promise<void> {\r\n        const source = this.props.config.imageSource ?? imageSource.pageContext;\r\n        const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\r\n        this._setRenderType();\r\n        if (!this.props.context.request.app?.config?.OmniChannelMedia) {\r\n            if (source === imageSource.pageContext) {\r\n                if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\r\n                    const images = await validateProductImages(\r\n                        this.props.data.mediaLocationsForSelectedVariant.result,\r\n                        this.props.context.actionContext,\r\n                        this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\r\n                    );\r\n                    await this._setImages(images);\r\n                } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\r\n                    const product = this.props.data.product.result;\r\n                    const images = await getValidProductImages(\r\n                        product.RecordId,\r\n                        +this.props.context.request.apiSettings.channelId,\r\n                        this.props.context.actionContext,\r\n                        this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n                        product.productVariant\r\n                    );\r\n\r\n                    await this._setImages(images);\r\n                } else {\r\n                    await this._setImages([]);\r\n                }\r\n            }\r\n        }\r\n\r\n        reaction(\r\n            () => {\r\n                const product = this.props.data.product.result;\r\n                if (!product) {\r\n                    return null;\r\n                }\r\n\r\n                if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\r\n                    return `${product.RecordId}`;\r\n                }\r\n\r\n                return `${product.RecordId}-${product.productVariant.RecordId}`;\r\n            },\r\n            async () => {\r\n                const product = this.props.data.product.result;\r\n                let images: IImageData[] = [];\r\n                if (product) {\r\n                    if (this.props.context.app?.config?.OmniChannelMedia) {\r\n                        images = await getProductImages(\r\n                            product.RecordId,\r\n                            this.shouldUseCmsAltText(),\r\n                            +this.props.context.request.apiSettings.channelId,\r\n                            this.props.context.actionContext,\r\n                            product.Name,\r\n                            shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\r\n                        );\r\n                    } else {\r\n                        images = await getValidProductImages(\r\n                            product.RecordId,\r\n                            +this.props.context.request.apiSettings.channelId,\r\n                            this.props.context.actionContext,\r\n                            this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n                            shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\r\n                        );\r\n                    }\r\n                    await this._setImages(images);\r\n                } else {\r\n                    await this._setImages([]);\r\n                }\r\n            },\r\n            { fireImmediately: true }\r\n        );\r\n\r\n        if (source === imageSource.productId && this.props.data.mediaLocations.result) {\r\n            const images = await validateProductImages(\r\n                this.props.data.mediaLocations.result,\r\n                this.props.context.actionContext,\r\n                this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\r\n            );\r\n            await this._setImages(images);\r\n        }\r\n    }\r\n\r\n    public shouldComponentUpdate(nextProps: ISuperMediaGalleryProps<ISuperMediaGalleryData>, nextState: IMediaGalleryState): boolean {\r\n        if (this.state === nextState && this.props.data === nextProps.data) {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n\r\n    public render(): JSX.Element {\r\n        const { id, config, resources } = this.props;\r\n\r\n        const { className, showPaginationTooltip } = config;\r\n\r\n        const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\r\n        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\r\n        const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\r\n        const zoomViewMode: string =\r\n            config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\r\n            const source = this.props.config.imageSource ?? imageSource.pageContext;\r\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n        const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\r\n        if (this.props.data.product.result) {\r\n            this.fallbackImage = getFallbackImageUrl(\r\n                this.props.data.product.result.ItemId,\r\n                this.props.context.request.apiSettings,\r\n                this.props.context.request.app?.config?.OmniChannelMedia\r\n            );\r\n        }\r\n        if (emptyPlaceHolderImage && this.fallbackImage) {\r\n            this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\r\n        }\r\n        if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\r\n            let images: IImageData[] = [];\r\n            let mediaLocations: MediaLocation[] = [];\r\n            if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\r\n                mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\r\n            } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\r\n                mediaLocations = this.props.data.mediaLocations.result;\r\n            }\r\n            images = mediaLocations.map(mediaLocation => {\r\n                return {\r\n                    src: mediaLocation.Uri ?? '',\r\n                    altText: getAltText(\r\n                        this.props.context.actionContext.requestContext,\r\n                        this.shouldUseCmsAltText(),\r\n                        this.props.data.product.result?.Name,\r\n                        mediaLocation.AltText\r\n                    )\r\n                };\r\n            });\r\n            const curatedImages = this.props.config.images ?? [];\r\n            this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\r\n        }\r\n        const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\r\n        const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\r\n        const viewProps: IMediaGalleryViewProps = {\r\n            ...(this.props as ISuperMediaGalleryProps<ISuperMediaGalleryData>),\r\n            state: this.state,\r\n            MediaGallery: {\r\n                moduleProps: this.props,\r\n                className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\r\n            },\r\n            Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\r\n            callbackToggle: this.openModalDialog,\r\n            callbackThumbnailClick: this._generateOnThumbnailClick,\r\n            callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\r\n            CarouselProps: {\r\n                tag: Carousel,\r\n                className: 'ms-media-gallery__carousel',\r\n                items: mediaGalleryCarouselItems.items,\r\n                activeIndex: this.state.activeIndex,\r\n                next: this.next,\r\n                previous: this.previous,\r\n                interval: false,\r\n                directionTextPrev: resources.previousScreenshotFlipperText,\r\n                directionTextNext: resources.nextScreenshotFlipperText,\r\n                onIndicatorsClickHandler: this.goToIndex,\r\n                showPaginationTooltip: showPaginationTooltip === true,\r\n                indicatorAriaText: resources.ariaLabelForSlide,\r\n                handleOnExited: this.onExited,\r\n                handleOnExiting: this.onExiting,\r\n                key: mediaGalleryCarouselItems.keys\r\n            } as IComponentNodeProps<ICarouselProps>,\r\n            Thumbnails: {\r\n                ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\r\n                SingleSlideCarouselComponentProps: {\r\n                    tag: SingleSlideCarousel,\r\n                    className: 'ms-media-gallery__thumbnails',\r\n                    vertical: isVertical,\r\n                    flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n                    flipperNextLabel: resources.nextScreenshotFlipperText,\r\n                    parentId: id,\r\n                    useTabList: true,\r\n                    key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\r\n                } as IComponentNodeProps<ISingleSlideCarouselProps>,\r\n                items: mediaGalleryThumbnailCarouselItems.items\r\n            }\r\n        };\r\n\r\n        return this.props.renderView(viewProps) as React.ReactElement;\r\n    }\r\n\r\n    /**\r\n     * Zoomed out image on previous/next click.\r\n     */\r\n    public updateZoomedInImage(): void {\r\n        this.setState({ isImageZoomed: false });\r\n    }\r\n\r\n    private readonly onExiting = () => {\r\n        this.setState({ animating: true });\r\n    };\r\n\r\n    private readonly onExited = () => {\r\n        this.setState({ animating: false });\r\n    };\r\n\r\n    /**\r\n     * On click next in carousel.\r\n     */\r\n    private readonly next = (): void => {\r\n        removeInlineZoomStyle();\r\n        if (this.isLastItem() === undefined) {\r\n            return;\r\n        }\r\n\r\n        const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\r\n        this.goToIndex(nextIndex);\r\n\r\n        this.updateZoomedInImage();\r\n    };\r\n\r\n    /**\r\n     * On click previous in carousel.\r\n     */\r\n    private readonly previous = (): void => {\r\n        removeInlineZoomStyle();\r\n        const images = this.state.mediaGalleryItems;\r\n        const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\r\n        this.goToIndex(nextIndex);\r\n        this.updateZoomedInImage();\r\n    };\r\n\r\n    private readonly goToIndex = (index: number): void => {\r\n        const { autoplay } = this.props.config;\r\n        const currentIndex = this.state.activeIndex;\r\n        const mediaItems = this.state.mediaGalleryItems;\r\n        if (autoplay && mediaItems) {\r\n            if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\r\n                this.player.current?.play();\r\n            } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\r\n                this.player.current?.pause();\r\n            }\r\n        }\r\n        this.setState({ activeIndex: index });\r\n    };\r\n\r\n    private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems<IMediaGalleryThumbnailItemViewProps> {\r\n        const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\r\n        const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\r\n        if (thumbnailImageSettings) {\r\n            thumbnailImageSettings.cropFocalRegion = true;\r\n        }\r\n\r\n        const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\r\n\r\n        if (!hasMediaGalleryItems) {\r\n            if (this.state.lastUpdate) {\r\n                const defaultKey = 0;\r\n                return {\r\n                    items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\r\n                    keys: ['empty']\r\n                };\r\n            }\r\n            return { items: [], keys: [] };\r\n        }\r\n\r\n        return {\r\n            items: [\r\n                // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n                ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\r\n                    if (item.mediaTypeValue === MediaType.Video) {\r\n                        return this.getVideoThumbNailItem(\r\n                            item,\r\n                            thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n                            index,\r\n                            this.state.activeIndex\r\n                        );\r\n                    } else {\r\n                        return this._getThumbnailItem(\r\n                            item,\r\n                            thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n                            index,\r\n                            this.state.activeIndex\r\n                        );\r\n                    }\r\n                })\r\n            ],\r\n            // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n            keys: [...mediaGalleryItems!.map(item => item.src)]\r\n        };\r\n    }\r\n\r\n    private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems<React.ReactNode> {\r\n        const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\r\n        const galleryImageSettings = this.props.config.galleryImageSettings;\r\n        if (galleryImageSettings) {\r\n            galleryImageSettings.cropFocalRegion = true;\r\n        }\r\n\r\n        const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\r\n\r\n        const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\r\n\r\n        if (!hasMediaGalleryItems) {\r\n            if (this.state.lastUpdate) {\r\n                return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\r\n            }\r\n            return { items: [], keys: [] };\r\n        }\r\n\r\n        return {\r\n            items: [\r\n                // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n                ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\r\n                    return this._renderCarouselItemImageView(\r\n                        zoomView,\r\n                        item,\r\n                        galleryImageSettings ?? this.defaultGalleryImageSettings,\r\n                        index\r\n                    );\r\n                })\r\n            ],\r\n            // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n            keys: [...mediaGalleryItems!.map(item => item.src)]\r\n        };\r\n    }\r\n\r\n    private async _setImages(images?: IMediaData[]): Promise<void> {\r\n        const curatedImage = this.props.config.images || [];\r\n        const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\r\n\r\n        void Promise.all(\r\n            mediaToSet.map(async mediaData => {\r\n                if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\r\n                    try {\r\n                        const url = new URL(mediaData.src);\r\n                        const videoId = url.searchParams.get('CVID');\r\n                        if (videoId) {\r\n                            mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\r\n                        }\r\n                    } catch (error) {\r\n                        if (this.props.telemetry) {\r\n                            this.props.telemetry.debug('Error while fetching videoId');\r\n                        }\r\n                    }\r\n                }\r\n                return mediaData;\r\n            })\r\n        ).then(mediaData => {\r\n            const mediaItems = mediaData.filter(element => {\r\n                return (\r\n                    element.mediaTypeValue !== MediaType.Video ||\r\n                    (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\r\n                );\r\n            });\r\n\r\n            this.setState({\r\n                mediaGalleryItems: [...mediaItems, ...curatedImage],\r\n                activeIndex: 0,\r\n                lastUpdate: Date.now(),\r\n                shouldUseOptimizedImage: false\r\n            });\r\n        });\r\n\r\n        this.setState({\r\n            mediaGalleryItems: [...mediaToSet, ...curatedImage],\r\n            activeIndex: 0,\r\n            lastUpdate: Date.now(),\r\n            shouldUseOptimizedImage: false\r\n        });\r\n    }\r\n\r\n    private _setRenderType(): void {\r\n        this.setState({\r\n            isInitialLoad: false\r\n        });\r\n    }\r\n\r\n    private _renderCarouselItemImageView(\r\n        zoomView: string,\r\n        media: IMediaData,\r\n        imageSettings: IImageSettings,\r\n        index: number,\r\n        isInPopup: boolean = false\r\n    ): React.ReactNode {\r\n        if (media.mediaTypeValue === MediaType.Video) {\r\n            if (isInPopup || zoomView !== 'fullscreen') {\r\n                return <>{this._renderCarouselItemVideo(media, index, imageSettings)}</>;\r\n            }\r\n            return <>{this._renderVideoThumbnail(media, index, imageSettings)}</>;\r\n        } else {\r\n            if (this.isMobile()) {\r\n                if (isInPopup) {\r\n                    return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\r\n                }\r\n                return this._renderImageFullScreenOnZoom(media, imageSettings, index);\r\n            }\r\n\r\n            switch (zoomView) {\r\n                case 'container': {\r\n                    return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\r\n                }\r\n                case 'inline': {\r\n                    return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\r\n                }\r\n                case 'fullscreen': {\r\n                    return this._renderImageFullScreenOnZoom(media, imageSettings, index);\r\n                }\r\n\r\n                // No default\r\n            }\r\n            return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)}</>;\r\n        }\r\n    }\r\n\r\n    private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\r\n        const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\r\n        let variantImages = images ?? [];\r\n        const isVariantProduct =\r\n            !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\r\n            !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\r\n        const itemId = this.props.data.product.result?.ItemId;\r\n        if (shouldHidePrimaryImages && isVariantProduct && itemId) {\r\n            variantImages = variantImages.filter(item => {\r\n                const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\r\n                return !isApplicableForChildEntities;\r\n            });\r\n            if (!ArrayExtensions.hasElements(variantImages)) {\r\n                variantImages = images ?? [];\r\n            }\r\n        }\r\n        return variantImages;\r\n    }\r\n\r\n    private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\r\n        const videoData = mediaData.videoData;\r\n        if (videoData) {\r\n            const options: IPlayerOptions = this.props.config as IPlayerOptions;\r\n            const playerResources = this.props.resources;\r\n            const videoMetaData: IVideoMetadata = {};\r\n            videoMetaData.videoId = videoData.id;\r\n            videoMetaData.title = videoData.title;\r\n            videoMetaData.duration = videoData.playTime;\r\n            if (videoData.thumbnail) {\r\n                videoMetaData.posterframeUrl = videoData.thumbnail.src;\r\n            }\r\n            if (videoData._links?.binaryReferences) {\r\n                videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\r\n            }\r\n            const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\r\n            const attributes = {\r\n                id: `${this.props.id}__carousel-item__${index}`\r\n            };\r\n            return (\r\n                <Video className='ms-media-gallery__player' editProps={{ key: videoData, requestContext: this.props.context.request }}>\r\n                    <Player\r\n                        ref={this.player}\r\n                        playerData={videoPlayerData}\r\n                        isEditor={this.props.context.request.params.isEditor}\r\n                        playerResources={playerResources}\r\n                        {...attributes}\r\n                    />\r\n                </Video>\r\n            );\r\n        }\r\n        return this._renderEmptyImage(imageSettings);\r\n    };\r\n\r\n    private readonly _getCarouselItem = (\r\n        image: IImageData,\r\n        imageSettings: IImageSettings,\r\n        index: number,\r\n        isInPopup: boolean = false\r\n    ): React.ReactNode => (\r\n        <Image\r\n            requestContext={this.props.context.actionContext.requestContext}\r\n            className='ms-media-gallery__item'\r\n            {...image}\r\n            fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n            gridSettings={this.props.context.request.gridSettings!}\r\n            imageSettings={imageSettings}\r\n            loadFailureBehavior='hide'\r\n            id={`${this.props.id}__carousel-item__${index}`}\r\n            shouldSkipToMainImage={isInPopup}\r\n            bypassHideOnFailure={index === 0}\r\n        />\r\n    );\r\n\r\n    private readonly _getThumbnailItem = (\r\n        image: IImageData,\r\n        imageSettings: IImageSettings,\r\n        index: number,\r\n        modifiedActiveIndex: number\r\n    ): IMediaGalleryThumbnailItemViewProps => {\r\n        const classes = classnames(\r\n            'ms-media-gallery__thumbnail-item',\r\n            modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n        );\r\n\r\n        return {\r\n            ThumbnailItemContainerProps: {\r\n                tag: 'li' as NodeTag,\r\n                className: classes,\r\n                role: 'tab',\r\n                tabIndex: 0,\r\n                key: index,\r\n                'aria-label': image.altText,\r\n                'aria-selected': modifiedActiveIndex === index,\r\n                onClick: this._generateOnThumbnailClick(index),\r\n                onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n            },\r\n            Picture: (\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__thumbnail'\r\n                    {...image}\r\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n            )\r\n        };\r\n    };\r\n\r\n    /**\r\n     * Gets the video thumbnail item to display media gallery.\r\n     * @param props - The Media gallery view props from business layer.\r\n     * @returns Return thumbnail view props which will be used to render video.\r\n     */\r\n    private readonly getVideoThumbNailItem = (\r\n        mediaData: IMediaData,\r\n        imageSettings: IImageSettings,\r\n        index: number,\r\n        modifiedActiveIndex: number\r\n    ): IMediaGalleryThumbnailItemViewProps => {\r\n        const classes = classnames(\r\n            'ms-media-gallery__thumbnail-item',\r\n            modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n        );\r\n\r\n        const videoData = mediaData.videoData;\r\n        let image: IImageData;\r\n        if (videoData?.thumbnail) {\r\n            image = videoData.thumbnail;\r\n        } else {\r\n            image = {\r\n                src: 'empty'\r\n            };\r\n        }\r\n\r\n        return {\r\n            ThumbnailItemContainerProps: {\r\n                tag: 'li' as NodeTag,\r\n                className: classes,\r\n                role: 'tab',\r\n                tabIndex: 0,\r\n                key: index,\r\n                'aria-label': image.altText,\r\n                'aria-selected': modifiedActiveIndex === index,\r\n                onClick: this._generateOnThumbnailClick(index),\r\n                onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n            },\r\n            Picture: (\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__thumbnail'\r\n                    {...image}\r\n                    fallBackSrc={image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n            )\r\n        };\r\n    };\r\n\r\n    /**\r\n     * Ref Handler.\r\n     * @param index -Remove item click function.\r\n     * @returns Set inline zoom.\r\n     */\r\n    private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\r\n        this._inlineZoomDivRef.set(index, divRef);\r\n    };\r\n\r\n    private readonly _generateOnThumbnailKeyDown = (index: number) => {\r\n        return (event: React.KeyboardEvent) => {\r\n            if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\r\n                event.preventDefault();\r\n\r\n                this.goToIndex(index);\r\n            }\r\n        };\r\n    };\r\n\r\n    private readonly _generateOnThumbnailClick = (index: number) => {\r\n        return (event: React.MouseEvent<HTMLLIElement>) => {\r\n            event.preventDefault();\r\n\r\n            this.goToIndex(index);\r\n        };\r\n    };\r\n\r\n    private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n        return (\r\n            <div\r\n                className={`ms-inline-zoom ${this.state.isImageZoomed ? 'zoomed' : ''}`}\r\n                ref={this._refHandler(index)}\r\n                data-scale={this.props.config.dataScale ?? defaultDataScale}\r\n            >\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__item'\r\n                    {...image}\r\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    onClick={this._onInlineImageClick}\r\n                    onMouseOver={(this.state.isImageZoomed && this._inlineZoomImageOnHover) || undefined}\r\n                    id={`${this.props.id}__carousel-item__${index}`}\r\n                    shouldSkipToMainImage\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n                <Image\r\n                    role='presentation'\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-inline-zoom__zoomedImg'\r\n                    {...image}\r\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n                    onClick={this._onImageMouseOut}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    id={`${this.props.id}__zoom__${index}`}\r\n                    onMouseMove={(this.state.isImageZoomed && inlineZoomImageOnMouseMove) || undefined}\r\n                    shouldSkipToMainImage\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n            </div>\r\n        );\r\n    }\r\n\r\n    private _inlineZoomImageOnHover(event: React.MouseEvent<HTMLImageElement>): void {\r\n        inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\r\n    }\r\n\r\n    private _handleMobileViewZoomedImageClick(event: React.MouseEvent<HTMLImageElement>) {\r\n        const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\r\n        const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\r\n        if (!this.state.isMobileImageZoomed) {\r\n            const bounds = target.getBoundingClientRect();\r\n            const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\r\n\r\n            const positionX = event.clientX - bounds.left;\r\n            const positionY = event.clientY - bounds.top;\r\n            const scaledPositionX = positionX * dataScale;\r\n            const scaledPositionY = positionY * dataScale;\r\n\r\n            target.style.transform = `scale(${dataScale})`;\r\n            target.classList.add(mobileZoomedInImageClassName);\r\n            target.parentElement!.style.overflow = 'auto';\r\n            target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\r\n            this.setState({\r\n                isMobileImageZoomed: true\r\n            });\r\n        } else {\r\n            target.style.transform = '';\r\n            target.classList.remove(mobileZoomedInImageClassName);\r\n            target.parentElement!.style.overflow = '';\r\n            this.setState({\r\n                isMobileImageZoomed: false\r\n            });\r\n        }\r\n    }\r\n\r\n    private _onInlineImageClick(event: React.MouseEvent<HTMLImageElement>): void {\r\n        if (window.innerWidth <= 768) {\r\n            // $msv-breakpoint-m\r\n            this._handleMobileViewZoomedImageClick(event);\r\n            return;\r\n        }\r\n        inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\r\n        this.setState({\r\n            isImageZoomed: true\r\n        });\r\n    }\r\n\r\n    private _onImageMouseOut(event: React.MouseEvent<HTMLImageElement, MouseEvent>): void {\r\n        inlineZoomImageOnMouseOut(event);\r\n        this.setState({\r\n            isImageZoomed: false\r\n        });\r\n    }\r\n\r\n    private _onContainerZoomImageClick(event: React.MouseEvent<HTMLImageElement>): void {\r\n        if (window.innerWidth <= 768) {\r\n            // $msv-breakpoint-m\r\n            this._handleMobileViewZoomedImageClick(event);\r\n            return;\r\n        }\r\n\r\n        onContainerZoomInit(event);\r\n\r\n        this.setState({\r\n            isImageZoomed: true\r\n        });\r\n    }\r\n\r\n    private _onMouseOutLensContainer(event: React.MouseEvent<HTMLImageElement>): void {\r\n        onMouseOutLensContainer(event);\r\n\r\n        this.setState({\r\n            isImageZoomed: false\r\n        });\r\n    }\r\n\r\n    private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n        return (\r\n            <div className='ms-containerZoom__container'>\r\n                <div\r\n                    data-scale={this.props.config.dataScale ?? defaultDataScale}\r\n                    className='ms-containerZoom__zoom-lens'\r\n                    role='presentation'\r\n                    onMouseOut={this._onMouseOutLensContainer}\r\n                    onClick={this._onMouseOutLensContainer}\r\n                    onMouseMove={(this.state.isImageZoomed && onMouseMoveLensContainer) || undefined}\r\n                />\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__item'\r\n                    {...image}\r\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    onClick={this._onContainerZoomImageClick}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    onMouseOver={(this.state.isImageZoomed && onMouseOverImageContainer) || undefined}\r\n                    id={`${this.props.id}__carousel-item__${index}`}\r\n                    shouldSkipToMainImage\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n            </div>\r\n        );\r\n    }\r\n\r\n    private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n        return (\r\n            <div className='ms-fullscreen-section'>\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__item'\r\n                    {...image}\r\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n                <div className='ms-fullscreen-section__overlay'>\r\n                    {}\r\n                    <a\r\n                        href='javascript:void(0);'\r\n                        title={this.props.resources.fullScreenTitleText}\r\n                        role='button'\r\n                        ref={this.fullScreenOverlayButtonRef}\r\n                        onClick={this.openModalDialog}\r\n                        className='ms-fullscreen-section__magnifying-glass-icon'\r\n                    />\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Render the video thumbnail in full screen.\r\n     * @param mediaData - Media Data.\r\n     * @param index - Index\r\n     * @param imageSettings - Image settings.\r\n     * @returns - JSX.Element\r\n     */\r\n    private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\r\n        const videoData = mediaData.videoData;\r\n        let image: IImageData;\r\n        if (videoData?.thumbnail) {\r\n            image = videoData.thumbnail;\r\n        } else {\r\n            image = {\r\n                src: 'empty'\r\n            };\r\n        }\r\n\r\n        return (\r\n            <div className='ms-fullscreen-section'>\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-fullscreen-section__video'\r\n                    {...image}\r\n                    fallBackSrc={image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n                <div className='ms-fullscreen-section__video-overlay'>\r\n                    {}\r\n                    <button\r\n                        title={this.props.resources.fullScreenTitleText}\r\n                        role='button'\r\n                        ref={this.fullScreenOverlayButtonRef}\r\n                        onClick={this.openModalDialog}\r\n                        className='ms-fullscreen-section__video-play-icon'\r\n                    />\r\n                </div>\r\n            </div>\r\n        );\r\n    };\r\n\r\n    private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n        return {\r\n            src: product.PrimaryImageUrl ?? ''\r\n        };\r\n    }\r\n\r\n    private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\r\n        return (\r\n            <div className='ms-media-gallery__item'>\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__item__image'\r\n                    src='empty'\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings ?? this.defaultGalleryImageSettings}\r\n                    loadFailureBehavior='empty'\r\n                />\r\n            </div>\r\n        );\r\n    }\r\n\r\n    private _getEmptyThumbnailItem(\r\n        imageSettings: IImageSettings | undefined,\r\n        index: number,\r\n        modifiedActiveIndex: number\r\n    ): IMediaGalleryThumbnailItemViewProps {\r\n        const classes = classnames(\r\n            'ms-media-gallery__thumbnail-item',\r\n            modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n        );\r\n        return {\r\n            ThumbnailItemContainerProps: {\r\n                tag: 'li' as NodeTag,\r\n                className: classes,\r\n                role: 'tab',\r\n                tabIndex: 0,\r\n                key: 'empty',\r\n                'aria-label': '',\r\n                'aria-selected': modifiedActiveIndex === index,\r\n                onClick: this._generateOnThumbnailClick(index),\r\n                onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n            },\r\n            Picture: (\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__thumbnail-item__image'\r\n                    src='empty'\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings ?? this.defaultThumbnailImageSettings}\r\n                    loadFailureBehavior='empty'\r\n                />\r\n            )\r\n        };\r\n    }\r\n\r\n    private readonly isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n    private readonly isLastItem = () => {\r\n        const images = this.state.mediaGalleryItems;\r\n        return images && this.state.activeIndex === images.length - 1;\r\n    };\r\n\r\n    private readonly openModalDialog = (): void => {\r\n        this._toggleModal();\r\n    };\r\n\r\n    private _toggleModal(): void {\r\n        if (this.state.modalIsOpen) {\r\n            this.fullScreenOverlayButtonRef.current?.focus();\r\n            const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\r\n            if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\r\n                const image = parentDiv.children[1].querySelector('img');\r\n                if (image) {\r\n                    image.removeAttribute('style');\r\n                }\r\n            }\r\n            this.setState({\r\n                isImageZoomed: false\r\n            });\r\n        }\r\n        this.setState({\r\n            isImageZoomed: false,\r\n            modalIsOpen: !this.state.modalIsOpen\r\n        });\r\n        removeInlineZoomStyle();\r\n        removeContainerZoomStyle();\r\n    }\r\n\r\n    private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\r\n        const {\r\n            data: {\r\n                product: { result: product }\r\n            },\r\n            resources\r\n        } = this.props;\r\n        let mediaGalleryItems = this.state.mediaGalleryItems;\r\n\r\n        if (!mediaGalleryItems && product) {\r\n            mediaGalleryItems = [this._mapProductToImageData(product)];\r\n        }\r\n        const carouselprops = {\r\n            tag: Carousel,\r\n            className: 'ms-media-gallery__carousel',\r\n            items:\r\n                mediaGalleryItems &&\r\n                mediaGalleryItems.map((item: IImageData, index: number) =>\r\n                    this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\r\n                ),\r\n            activeIndex: this.state.activeIndex,\r\n            next: this.next,\r\n            previous: this.previous,\r\n            interval: false,\r\n            directionTextPrev: resources.previousScreenshotFlipperText,\r\n            directionTextNext: resources.nextScreenshotFlipperText,\r\n            onIndicatorsClickHandler: this.goToIndex,\r\n            showPaginationTooltip: true,\r\n            hideIndicator: false,\r\n            keyboard: false,\r\n            handleOnExited: this.onExited,\r\n            handleOnExiting: this.onExiting,\r\n            isDisabledFunctionality: this.state.isMobileImageZoomed\r\n        } as IComponentNodeProps<ICarouselProps>;\r\n        const carousel = <Carousel {...carouselprops} />;\r\n\r\n        const imageModalSliderProps: IModalViewProps = {\r\n            modalIsOpen: this.state.modalIsOpen,\r\n            ontoggle: this._toggleModal,\r\n            galleryCarousel: carousel,\r\n            classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\r\n        };\r\n        return ImagefullView(imageModalSliderProps) as React.ReactElement;\r\n    };\r\n\r\n    private shouldUseCmsAltText = (): boolean => {\r\n        if (this.props.config.altTextSource === 'product') {\r\n            return false;\r\n        } else {\r\n            return true;\r\n        }\r\n    };\r\n}\r\n\r\nexport default MediaGallery;\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\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartViewProps, IOrderSummaryErrors } from './citta-cart';\r\nimport { ICartlinesViewProps } from './components/citta-cart-line-items';\r\nimport { ICartLineItemViewProps } from './components/citta-cart-line-items-promotion';\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): JSX.Element[] | JSX.Element => {\r\n    if (cartLoadingStatus) {\r\n        return <>{cartLoadingStatus}</>;\r\n    }\r\n    if (cartLines) {\r\n        return cartLines.map(cartLine => {\r\n            return (\r\n                <div className='msc-cart-lines-item' key={`${cartLine.cartlineId ?? ''}-${MsDyn365.isBrowser.toString()}`}>\r\n                    {cartLine.cartline}\r\n                    {storeSelector && cartLine.pickUpInStore ? (\r\n                        <Node {...cartLine.pickUpInStore.ContainerProps}>{cartLine.pickUpInStore.defaultComponent}</Node>\r\n                    ) : null}\r\n                    {cartLine.addToOrderTemplate ? (\r\n                        <Node className='msc-cart-line__extra-actions'>\r\n                            {cartLine.remove}\r\n                            {cartLine.addToWishlist}\r\n                            {cartLine.addToOrderTemplate}\r\n                        </Node>\r\n                    ) : (\r\n                        <>\r\n                            {cartLine.remove}\r\n                            {cartLine.addToWishlist}\r\n                        </>\r\n                    )}\r\n                </div>\r\n            );\r\n        });\r\n    }\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\n * Method will render error block.\r\n * @param errorData -The order summary errors interface.\r\n * @returns Jsx element.\r\n */\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n    if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\r\n        return null;\r\n    }\r\n    return (\r\n        <Node {...errorData.Wrapper}>\r\n            {\"Please review cart errors before proceeding to checkout\"}\r\n        </Node>\r\n    );\r\n};\r\n\r\n/**\r\n * Method will render invoice summary lines.\r\n * @param invoiceSummaryLines -The invoicesummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderInvoiceSummarylines = (\r\n    invoiceSummaryLines: IInvoiceSummaryLines | undefined,\r\n    OrderSummaryItems: INodeProps,\r\n    props: ICartViewProps\r\n): JSX.Element | null => {\r\n    if (!invoiceSummaryLines) {\r\n        props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\r\n        return null;\r\n    }\r\n    return (\r\n        <Node {...OrderSummaryItems}>\r\n            {invoiceSummaryLines.invoices}\r\n            {invoiceSummaryLines.giftCard}\r\n            {invoiceSummaryLines.loyalty}\r\n            {invoiceSummaryLines.orderTotal}\r\n        </Node>\r\n    );\r\n};\r\n\r\n/**\r\n * Method will render order summary lines.\r\n * @param orderSummaryLines -The ordersummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\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        props.context.telemetry.error('OrderSummary content is empty, module wont render');\r\n        return null;\r\n    }\r\n    return (\r\n        <Node {...OrderSummaryItems}>\r\n            {props.promoCode}\r\n            {orderSummaryLines.subtotal}\r\n            {orderSummaryLines.shipping}\r\n            {orderSummaryLines.otherCharge}\r\n            {orderSummaryLines.tax}\r\n            {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n            {orderSummaryLines.orderTotal}\r\n        </Node>\r\n    );\r\n};\r\n\r\n/**\r\n * Method will render cart promotions.\r\n * @param promotions -The cartline item view props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\r\n    return (\r\n        <>\r\n            <Node {...promotions.promotionMessageWrapper}>\r\n                {promotions.promotionMessage}\r\n                {promotions.promotionSeeAllLink}\r\n                {promotions.promotionDialog}\r\n            </Node>\r\n        </>\r\n    );\r\n};\r\n\r\n/**\r\n * Method will render cartlines group title.\r\n * @param cartLine -The cartline view props.\r\n * @param titleSeparate -The title separate.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\r\n    const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n    return (\r\n        <>\r\n            <Node className='msc-cart-lines-group-wraper__bopis-heading-title'>\r\n                {isBopisSelected ? (\r\n                    <p className='msc-cart-lines-group-wraper__bopis-heading-title-st'>\r\n                        {cartLine.pickUpInStore?.deliveryOption}\r\n                        {titleSeparate}\r\n                        {cartLine.pickUpInStore?.orgUnitName}\r\n                    </p>\r\n                ) : null}\r\n            </Node>\r\n        </>\r\n    );\r\n};\r\n\r\n/**\r\n * Method will render cartlines groups header title.\r\n * @param pickUpText -The pickup text for group.\r\n * @param shippingText -The shipping text for group.\r\n * @param emailShippingText -The email shipping text for group.\r\n * @param titleSeparate -The title separator.\r\n * @param cartLine -The cartline view props.\r\n * @param emailDeliveryModeCode -The email delivery code from channel.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupHeader = (\r\n    pickUpText: string,\r\n    shippingText: string,\r\n    emailShippingText: string,\r\n    titleSeparate: string,\r\n    cartLine: ICartlinesViewProps,\r\n    emailDeliveryModeCode?: string\r\n) => {\r\n    const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n    let groupTitle: string;\r\n\r\n    groupTitle = isBopisSelected ? pickUpText : shippingText;\r\n    if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\r\n        groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\r\n    }\r\n\r\n    return (\r\n        <>\r\n            <div className='msc-cart-lines-group-wraper__bopis-heading'>\r\n                <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}-icon`} />\r\n                <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}`}>{groupTitle}</p>\r\n                {renderCartLinesGroupTitle(cartLine, titleSeparate)}\r\n            </div>\r\n        </>\r\n    );\r\n};\r\n\r\n/**\r\n * Method will render cartlines in groups.\r\n * @param props -The cartline.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\r\n    if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\r\n        return (\r\n            <div className='msc-cart-lines-group'>\r\n                {props.cartLinesGroup.map(cartlines => {\r\n                    return (\r\n                        <div key={cartlines[0].cartlineId} className='msc-cart-lines-group-wraper'>\r\n                            {renderCartLinesGroupHeader(\r\n                                props.resources.pickUpText,\r\n                                props.resources.shippingText,\r\n                                props.resources.emailshippingText,\r\n                                props.resources.titleSeparate,\r\n                                cartlines[0],\r\n                                props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\r\n                            )}\r\n                            {_renderCartlines(\r\n                                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                            )}\r\n                        </div>\r\n                    );\r\n                })}\r\n            </div>\r\n        );\r\n    }\r\n    return props.cartDataResult ? (\r\n        <div className='msc-cartline-wraper'>\r\n            <div className='msc-cart__empty-cart'>\r\n                <p className='msc-cart-line'>{props.resources.emptyCartText}</p>\r\n                {props.backToShoppingButton}\r\n            </div>\r\n        </div>\r\n    ) : (\r\n        <>{props.waitingComponent}</>\r\n    );\r\n};\r\n\r\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => (\r\n    <div className={props.className} id={props.id} {...props.renderModuleAttributes(props)}>\r\n        {props.checkoutBlockedDueToUnavailableFunds}\r\n        {props.title}\r\n        {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\r\n        {props.multiplePickUpEnabled ? (\r\n            renderCartLinesGroup(props)\r\n        ) : (\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                )}\r\n            </Node>\r\n        )}\r\n        {props.orderSummaryHeading && (\r\n            <Node {...props.OrderSummaryWrapper}>\r\n                {props.orderSummaryHeading}\r\n                {props.cart?.hasInvoiceLine\r\n                    ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\r\n                    : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\r\n                {_renderErrorBlock(props.OrderSummaryErrors)}\r\n                {props.checkoutAsSignInUserButton}\r\n                {props.checkoutAsGuestButton}\r\n                {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\r\n                    <Node {...props.ExpressCheckoutSectionWrapper}>{props.expressCheckoutButton}</Node>\r\n                ) : null}\r\n                {props.backToShoppingButton}\r\n                {props.createTemplateFromCartButton}\r\n            </Node>\r\n        )}\r\n        {props.storeSelector}\r\n    </div>\r\n);\r\n\r\nexport default CartView;\r\n","/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '@msdyn365-commerce-modules/media-gallery';\r\n\r\nconst MediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\r\n    const {CarouselProps, Thumbnails, MediaGallery, Modal} = props;\r\n\r\n    return (\r\n        <Module {...MediaGallery}>\r\n            <Node {...CarouselProps} />\r\n            {Modal}\r\n            {_renderThumbnails(Thumbnails)}\r\n        </Module>\r\n    );\r\n};\r\n\r\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\r\n    const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\r\n\r\n    return (\r\n        <Node {...ThumbnailsContainerProps}>\r\n            <Node {...SingleSlideCarouselComponentProps}>\r\n                {items && items.map(_renderThumbnailItem)}\r\n            </Node>\r\n        </Node>\r\n    );\r\n};\r\n\r\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n    const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n    return (\r\n        <Node {...ThumbnailItemContainerProps}>\r\n            {Picture}\r\n        </Node>\r\n    );\r\n};\r\n\r\nexport default MediaGalleryView;","/*--------------------------------------------------------------\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\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { IMediaGalleryThumbnailItemViewProps,\r\n    IMediaGalleryThumbnailsViewProps,\r\n    IMediaGalleryViewProps\r\n} from '@msdyn365-commerce-modules/media-gallery';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\n\r\n/**\r\n * Render the thumbnail item images.\r\n * @param thumbnail - The carousel thumbnail line props.\r\n * @returns Return HTML having thumnailcontainer props with image.\r\n */\r\nconst renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n    // eslint-disable-next-line @typescript-eslint/naming-convention --  Dependency from media-gallery.tsx file\r\n    const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n    return (\r\n        <Node {...ThumbnailItemContainerProps}>\r\n            {Picture}\r\n        </Node>\r\n    );\r\n};\r\n\r\n/**\r\n * Gets the thumbnail item to display media gallery images.\r\n * @param image - The media gallery images.\r\n * @param imageSettings - Image settings for the image gallery items.\r\n * @param imageId - Image id.\r\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render images.\r\n */\r\nconst GetThumbnailItemComponent = (\r\n    image: IImageData,\r\n    imageSettings: IImageSettings,\r\n    imageId: number,\r\n    modifiedActiveIndex: number,\r\n    props: IMediaGalleryViewProps\r\n): IMediaGalleryThumbnailItemViewProps => {\r\n\r\n    /**\r\n     * OnClick method of media gallery item.\r\n     * */\r\n    const onClick = () => {\r\n        // @ts-ignore\r\n        props.callbackToggle?.();\r\n        // @ts-ignore\r\n        props.callbackThumbnailClick?.(imageId);\r\n        props.state.activeIndex = imageId;\r\n    };\r\n\r\n    const classes = classnames(\r\n        'ms-media-gallery__thumbnail-item',\r\n        modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n    );\r\n\r\n    /**\r\n     * Keydown event of media gallery item.\r\n     * @param event - React.KeyboardEvent.\r\n     * */\r\n    const handleKeyDown = (event: React.KeyboardEvent) => {\r\n        if (event.keyCode === KeyCodes.Enter) {\r\n            event.preventDefault();\r\n            onClick();\r\n        }\r\n    };\r\n\r\n    return {\r\n        ThumbnailItemContainerProps: {\r\n            tag: 'li' as NodeTag,\r\n            className: classes,\r\n            role: 'presentation',\r\n            key: imageId\r\n        },\r\n        Picture: (\r\n            <Node className='ms-fullscreen-section'>\r\n                <Button\r\n                    role='tab'\r\n                    aria-label={image.altText}\r\n                    aria-selected={modifiedActiveIndex === imageId}\r\n                    aria-controls={`${props.id}__carousel-item__${imageId}`}\r\n                    className='msc-ss-carousel-vert-button-wrapper'\r\n                    // onClick={onClick}\r\n                    onKeyDown={handleKeyDown}>\r\n                    <Image\r\n                        fetchpriority=\"high\"\r\n                        requestContext={props.context.actionContext.requestContext}\r\n                        className='ms-media-gallery__thumbnail'\r\n                        {...image}\r\n                        gridSettings={props.context.request.gridSettings!}\r\n                        imageSettings={props.config.thumbnailImageSettings ?? imageSettings}\r\n                        loadFailureBehavior='hide'\r\n                    />\r\n                </Button>\r\n                {/* <Node className='ms-fullscreen-section__overlay'>\r\n                    <Button\r\n                        onKeyDown={handleKeyDown}\r\n                        title={props.resources.fullScreenTitleText} role='button'\r\n                        className='ms-fullscreen-section__magnifying-glass-icon'\r\n                        onClick={onClick}\r\n                    />\r\n                </Node> */}\r\n            </Node>\r\n        )\r\n    };\r\n};\r\n\r\n/**\r\n * Gets the empty thumbnail item to display media gallery images.\r\n * @param imageSettings - Image settings for the image gallery items.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render empty images.\r\n */\r\nconst GetEmptyThumbnailItemComponent = (imageSettings: IImageSettings, props: IMediaGalleryViewProps): IMediaGalleryThumbnailItemViewProps => {\r\n    return {\r\n        ThumbnailItemContainerProps: {\r\n            tag: 'li' as NodeTag,\r\n            className: 'ms-media-gallery__thumbnail-item',\r\n            role: 'tab',\r\n            tabIndex: 0,\r\n            key: 0,\r\n            'aria-label': '',\r\n            'aria-selected': true\r\n        },\r\n        Picture: (\r\n            <Image\r\n                requestContext={props.context.actionContext.requestContext}\r\n                className='ms-media-gallery__thumbnail-item__image'\r\n                src='empty'\r\n                gridSettings={props.context.request.gridSettings!}\r\n                imageSettings={props.config.thumbnailImageSettings ?? imageSettings}\r\n                loadFailureBehavior='empty'\r\n            />\r\n        )\r\n    };\r\n};\r\n\r\n/**\r\n * Update media gallery items method.\r\n * @param items - The media gallery thumbnail item view props.\r\n * @returns The IImageData array.\r\n */\r\nconst getMediaGalleryItems = (items?: IMediaGalleryThumbnailItemViewProps[]): IImageData[] | undefined => {\r\n    return items?.map(item => {\r\n        return {\r\n            altText: item.Picture.props.altText,\r\n            src: item.Picture.props.src\r\n        };\r\n    });\r\n};\r\n\r\nconst defaultThumbnailImageSettings: IImageSettings = {\r\n    viewports: {\r\n        xs: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 },\r\n        xl: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 }\r\n    },\r\n    lazyload: true,\r\n    cropFocalRegion: true\r\n};\r\n\r\n/**\r\n * Render the Media gallery thumbnails to represent images in grid view.\r\n * @param thumbnails - The thumbnail view props.\r\n * @param props - The media gallery view props.\r\n * @returns - The single slide carousel component to render as media gallery image.\r\n */\r\nconst renderThumbnails = (\r\n    thumbnails: IMediaGalleryThumbnailsViewProps,\r\n    props: IMediaGalleryViewProps\r\n): JSX.Element => {\r\n    // eslint-disable-next-line @typescript-eslint/naming-convention --  Dependency from media-gallery.tsx file\r\n    const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\r\n    const { state, Thumbnails } = props;\r\n    const mediaGalleryItems = getMediaGalleryItems(Thumbnails.items);\r\n\r\n    const items: IMediaGalleryThumbnailItemViewProps[] | undefined =\r\n    // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\r\n    state.lastUpdate && !ArrayExtensions.hasElements(mediaGalleryItems) ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)] :\r\n    // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\r\n        mediaGalleryItems?.map((item: IImageData, id: number) => GetThumbnailItemComponent(item,\r\n            defaultThumbnailImageSettings, id, state.activeIndex, props));\r\n\r\n    return (\r\n        <Node {...ThumbnailsContainerProps}>\r\n            <Node {...SingleSlideCarouselComponentProps}>\r\n                {items?.map(renderThumbnailItem)}\r\n            </Node>\r\n        </Node>\r\n    );\r\n};\r\n\r\n/**\r\n * Render the Media gallery items using viewprops.\r\n * @param props - The media gallery view props.\r\n * @returns The media gallery module wrapping up images node.\r\n */\r\nconst mediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\r\n    // eslint-disable-next-line @typescript-eslint/naming-convention --  Dependency from media-gallery.tsx file\r\n    const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\r\n    return (\r\n        <Module {...MediaGallery}>\r\n            <Node {...CarouselProps} />\r\n            {Modal}\r\n            {renderThumbnails(Thumbnails, props)}\r\n        </Module>\r\n    );\r\n};\r\n\r\nexport default mediaGalleryView;\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    ICartlinesViewProps,\r\n    ICartResources,\r\n    ICartViewProps,\r\n    IOrderSummaryErrors\r\n} from '@msdyn365-commerce-modules/cart';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n    IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources,\r\n    IOrderTemplateNameDialogResources, IWishlistActionSuccessResult, PriceComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport { CartLineItems } from '../../../components/citta-cart/cart-line-items';\r\nimport { ICartProps } from '../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nimport CittaTelemetry from '../../../common/telemetry/citta-telemetry';\r\n// import PriceComponent from '../../../components/price-component'\r\n\r\ninterface ICartViewState {\r\n    cartlinesErrors: LineDataValidationFailure[];\r\n}\r\n\r\n/**\r\n *\r\n * CartView\r\n * @extends {React.PureComponent<ICartViewProps>}\r\n */\r\nexport class CartView extends React.PureComponent<ICartViewProps & ICartProps<{}>, ICartViewState>  {\r\n    private cittaTelemetry: CittaTelemetry = new CittaTelemetry(this.props.context.app.config.cittaInstrumentationKey);\r\n\r\n    public state: ICartViewState = {\r\n        cartlinesErrors: []\r\n    };\r\n\r\n    private createLogMessage = (message: string): string => {\r\n        const url: string = decodeURI(window.location.search);\r\n        const origin = window.location.origin;\r\n        const logMessage = `${message} Url: - ${url} - Origin: ${origin}`;\r\n        return logMessage;\r\n    }\r\n\r\n    private logMessage = (message: string): void => {\r\n        this.cittaTelemetry.trace(this.createLogMessage(message));\r\n    }\r\n\r\n    // private isQuantityLimitsFeatureEnabled: boolean = true;\r\n    private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n\r\n    constructor(props: ICartViewProps & ICartProps<{}>) {\r\n        super(props);\r\n\r\n        this._renderCartlines = this._renderCartlines.bind(this);\r\n    }\r\n\r\n    public async componentDidMount(): Promise<void> {\r\n        // if (this.isQuantityLimitsFeatureEnabled) {\r\n        //     await this._validateCart();\r\n        // }\r\n        this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n        if (this.isQuantityLimitsFeatureEnabled) {\r\n            await this._validateCart();\r\n        }\r\n\r\n        this.logMessage('landed on cart page');\r\n    }\r\n\r\n    public render(): JSX.Element | null {\r\n        return (\r\n            <div className={this.props.className} id={this.props.id} {...this.props.renderModuleAttributes(this.props)}>\r\n                {this.props.title}\r\n                <Node {...this.props.CartlinesWrapper}>\r\n                    {this._renderCartlines()}\r\n                </Node>\r\n                {this.props.orderSummaryHeading &&\r\n                    < Node {...this.props.OrderSummaryWrapper}>\r\n                        {this.props.orderSummaryHeading}\r\n                        {_renderOrderSummarylines(this.props.orderSummaryLineitems, this.props.OrderSummaryItems, this.props)}\r\n                        {this.state.cartlinesErrors.length > 0 ? _renderErrorBlock(this.props.OrderSummaryErrors) : null}\r\n                        {_renderGIftCardError(this.props)}\r\n                        {this.props.config.freightCalculationText ? <div className='cart-freight-asterix'>{this.props.config.freightCalculationText}</div> : null}\r\n                        <div className={'cart-checkout-button'}>\r\n                            {this.props.checkoutAsSignInUserButton}\r\n                            {this.props.context.request && this.props.context.request.user && this.props.context.request.user.isAuthenticated ? null : <div className='cart-checkout-button-option'>{this.props.resources.orLabel}</div>}\r\n                            <div className={'cart-checkout-button-back-guest'}>\r\n                                {_renderBackToShoppingButton(this.props.resources)}\r\n                                {this.props.checkoutAsGuestButton}\r\n                            </div>\r\n                        </div>\r\n                    </Node>\r\n                }\r\n                {this.props.storeSelector}\r\n            </div>\r\n        );\r\n    }\r\n\r\n    private _renderCartlines(): JSX.Element[] | JSX.Element {\r\n        const { emptyCartText } = this.props.resources;\r\n\r\n        if (this.props.cartLoadingStatus) {\r\n            return <>{this.props.cartLoadingStatus}</>;\r\n        }\r\n        const cartLines = this._getCartLines();\r\n        if (cartLines) {\r\n            return cartLines.map((cartLine, index) => {\r\n                return (\r\n                    <div className='msc-cart-lines-item' key={index}>\r\n                        {cartLine.cartline}\r\n                        {_renderBOPISBlock(cartLine, this.props.resources, this.props.storeSelector)}\r\n                        <div className='msc-cart-lines-item-buttons'>\r\n                            {cartLine.addToWishlist}\r\n                            {cartLine.remove}\r\n                        </div>\r\n                    </div>\r\n                );\r\n            });\r\n        } else {\r\n            return (this.props.cartDataResult ?\r\n                (\r\n                    <div className='msc-cart__empty-cart'>\r\n                        <p className='msc-cart-line'>{emptyCartText}</p>\r\n                        {this.props.backToShoppingButton}\r\n                    </div>\r\n                ) : <>{this.props.waitingComponent}</>\r\n            );\r\n        }\r\n    }\r\n\r\n    private _getCartLines(): ICartlinesViewProps[] | null {\r\n        const {\r\n            data: {\r\n                cart: { result: cart },\r\n                wishlists: { result: wishlists },\r\n                orderTemplates: { result: orderTemplates },\r\n                customerInformation: { result: customerInformation }\r\n            },\r\n            context: {\r\n                request: {\r\n                    channel: {\r\n                        PickupDeliveryModeCode\r\n                    } = { PickupDeliveryModeCode: undefined }\r\n                }\r\n            },\r\n            config: config,\r\n            telemetry,\r\n            resources,\r\n            modules\r\n        } = this.props;\r\n\r\n        const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n        const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\r\n        let storeSelectorId: string = '';\r\n        if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n            storeSelectorId = modules.storeSelector[0].id;\r\n        }\r\n        return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ? (\r\n            CartLineItems({\r\n                cartlines: cart.cart.CartLines,\r\n                storeSelectorModuleId: storeSelectorId,\r\n                cartlinesErrors: cartlinesErrors,\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                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: \"Colour:\" || resources.productDimensionTypeColor,\r\n                    configString: resources.productDimensionTypeConfiguration,\r\n                    styleString: resources.productDimensionTypeStyle,\r\n                    quantityDisplayString: resources.quantityDisplayText,\r\n                    inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n                    decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n                    incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n                    discountStringText: resources.discountStringText,\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                outOfStockText: resources.outOfStockErrorMessage,\r\n                outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n                outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\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                locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n                wishlists: wishlists,\r\n                defaultWishlistName: resources.defaultWishlistName,\r\n                pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n                includeErrors: config.showOutOfStockErrors,\r\n                showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n                telemetryContent: this.props.telemetryContent,\r\n                isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n                addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n                createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n                itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n                duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\r\n\r\n                addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n                addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n                addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n                orderTemplates: orderTemplates,\r\n                customerInformation: customerInformation\r\n            })\r\n        ) : null;\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        if (this.props.data.cart.result) {\r\n            const input = {\r\n                cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n            };\r\n            this.props.data.cart.result.removeCartLines(input)\r\n                .then(() => {\r\n                    this._validateCart()\r\n                        .catch((error) => {\r\n                            this.props.telemetry.warning(error);\r\n                            this.props.telemetry.debug('Unable to validate Cart');\r\n                        });\r\n                    const cartLines = this.props.data.cart.result?.cart.CartLines;\r\n                    if(cartLines && cartLines.length === 1 && cartLines.some(item => item.ItemId === \"GiftCard\")) {\r\n                        location.reload()\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    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): boolean => {\r\n        if (this.props.data.cart.result) {\r\n            const input = {\r\n                cartLineId: cartlineToUpdate.LineId!.toString(),\r\n                newQuantity: quantity,\r\n                additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\r\n            };\r\n            this.props.data.cart.result.updateCartLineQuantity(input)\r\n                .then((result: ICartActionResult) => {\r\n                    if (result.status === 'SUCCESS') {\r\n                        this._validateCart().catch((error) => {\r\n                            this.props.telemetry.warning(error);\r\n                            this.props.telemetry.debug('Unable to validate Cart');\r\n                        });\r\n                        return true;\r\n                    }\r\n                    return false;\r\n                })\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        return false;\r\n    }\r\n\r\n    private _fulfillmentStoreIdUpdated = () => {\r\n        this._validateCart().catch((error) => {\r\n            this.props.telemetry.warning(error);\r\n            this.props.telemetry.debug('Unable to validate Cart');\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Get order quantity limit feature flag.\r\n     * @returns True if flag is enabled, false otherwise.\r\n     */\r\n    private async getOrderQuantityLimitsFeatureFlag(): Promise<boolean> {\r\n        const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n        if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n            return false;\r\n        }\r\n\r\n        try {\r\n            const featureStatuses = await this.props.data.featureState;\r\n            const isQuantityLimitsFeatureEnabledInHq =\r\n                featureStatuses.find(\r\n                    featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n                )?.IsEnabled || false;\r\n            if (!isQuantityLimitsFeatureEnabledInHq) {\r\n                return false;\r\n            }\r\n        } catch (error) {\r\n            this.props.telemetry.warning(error);\r\n            this.props.telemetry.debug('Unable to get feature states');\r\n            return false;\r\n        }\r\n\r\n        if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n            return true;\r\n        }\r\n        try {\r\n            const customerInfo = await this.props.data.customerInformation;\r\n            return (\r\n                !!customerInfo &&\r\n                ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n                    (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n            );\r\n        } catch (error) {\r\n            this.props.telemetry.warning(error);\r\n            this.props.telemetry.debug('Unable to get customer info');\r\n            return false;\r\n        }\r\n    }\r\n\r\n    private async _validateCart(retry: boolean = true): Promise<void> {\r\n        if (!this.isQuantityLimitsFeatureEnabled) {\r\n            return AsyncResult.resolve();\r\n        }\r\n\r\n        const {\r\n            data: { cart: cart }\r\n        } = this.props;\r\n        let cartResult: ICartState;\r\n        try {\r\n            cartResult = await cart;\r\n        } catch (error) {\r\n            this.props.telemetry.warning(error);\r\n            this.props.telemetry.debug('Unable to get cart');\r\n            return AsyncResult.resolve();\r\n        }\r\n        const cartVersion = cartResult.cart?.Version;\r\n        if (cartVersion) {\r\n            try {\r\n                const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\r\n                this.setState({ cartlinesErrors: validationResult.ValidationFailuresByCartLines || [] });\r\n                return AsyncResult.resolve();\r\n            } catch (error) {\r\n                if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n                    try {\r\n                        await cartResult.refreshCart({});\r\n                    } catch (refreshError) {\r\n                        this.props.telemetry.warning(refreshError);\r\n                        this.props.telemetry.debug('Unable to refresh Cart');\r\n                        return AsyncResult.resolve();\r\n                    }\r\n                    try {\r\n                        await this._validateCart(false);\r\n                        return AsyncResult.resolve();\r\n                    } catch (validateError) {\r\n                        this.props.telemetry.warning(validateError);\r\n                        this.props.telemetry.debug('Unable to validate Cart');\r\n                        return AsyncResult.resolve();\r\n                    }\r\n                }\r\n\r\n                this.props.telemetry.warning(error);\r\n                this.props.telemetry.debug('Unable to validate Cart');\r\n                return AsyncResult.resolve();\r\n            }\r\n        } else {\r\n            this.props.telemetry.warning('Cart version not found for Cart validation request.');\r\n            return AsyncResult.resolve();\r\n        }\r\n    }\r\n\r\n    private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\r\n        return {\r\n            addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n            noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n            noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n            createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n            createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n            cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n            selectTemplatesText: resources.selectTemplatesText,\r\n            addToTemplateButtonText: resources.addToTemplateButtonText,\r\n            lineItemsText: resources.lineItemsText\r\n        };\r\n    }\r\n\r\n    private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\r\n        return {\r\n            viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n            continueShoppingButtonText: resources.continueShoppingButtonText,\r\n            itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n            itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n            itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n            freePriceText: resources.freePriceText,\r\n            originalPriceText: resources.originalPriceText,\r\n            currentPriceText: resources.currentPriceText\r\n        };\r\n    }\r\n\r\n    private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n        return {\r\n            duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n            duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n            updateQuantityButtonText: resources.updateQuantityButtonText,\r\n            cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n        };\r\n    }\r\n\r\n    private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\r\n        return {\r\n            orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n            orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n            orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n            orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n            defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n            orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n            orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n        };\r\n    }\r\n}\r\nexport default CartView;\r\n\r\nfunction _renderBackToShoppingButton(resources: ICartResources): JSX.Element | null {\r\n    return (\r\n        <Button\r\n            className={'msc-cart__btn-backtoshopping'}\r\n            onClick={_goToPreviousPage}\r\n        >\r\n            {resources.backToShoppingButtonTitle}\r\n        </Button>\r\n    );\r\n}\r\n\r\nfunction _goToPreviousPage(): void {\r\n    window.history.back();\r\n}\r\n\r\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined): JSX.Element | null => {\r\n    if (!cartLine.pickUpInStore || !storeSelector) {\r\n        return null;\r\n    }\r\n\r\n    const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\r\n\r\n    const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\r\n    const toggleBopis = (event: React.MouseEvent<HTMLElement>) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected); };\r\n    const changeStore = (event: React.MouseEvent<HTMLElement>) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true); };\r\n\r\n    return (\r\n        <Node {...cartLine.pickUpInStore.ContainerProps}>\r\n            <div className='msc-cart-line__bopis-method'>\r\n                {isBopisSelected ? <span className='pick-up'>{pickUpAtStoreWithLocationText}</span> : <span className='ship'>{shipToAddressDisplayText}</span>}\r\n            </div>\r\n            {\r\n                isBopisSelected &&\r\n                <div className='msc-cart-line__bopis-fullfilment'>\r\n                    <span className='msc-cart-line__bopis-fullfilment-store'>{cartLine.pickUpInStore.orgUnitName}</span>\r\n                    <Button className='msc-cart-line__bopis-changestore' onClick={changeStore}>{changeStoreDisplayText}</Button>\r\n                </div>\r\n            }\r\n            <Button className='msc-cart-line__bopis-btn' onClick={toggleBopis}>{isBopisSelected ? shipInsteadDisplayText : pickItUpDisplayText}</Button>\r\n        </Node>\r\n    );\r\n};\r\n\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n    if (!errorData || errorData.errors.length === 0) {\r\n        return null;\r\n    }\r\n\r\n    return (\r\n        <Node {...errorData.Wrapper}>\r\n           {\"Please review cart errors before proceeding to checkout\"}\r\n        </Node>\r\n    );\r\n};\r\n\r\nconst _renderGIftCardError = (props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n    function checkAvailability(arr:any, val:string) {\r\n        return arr.some(function(arrVal:any) {\r\n            return val === arrVal.data?.product?.ItemId;\r\n        });\r\n    }\r\n    let hasGiftCard = checkAvailability(props.cartlines, \"GiftCard\");\r\n    let cartlinesLength = props.cartlines?.length || 0;\r\n    if(hasGiftCard && cartlinesLength > 1) {\r\n        return (\r\n            <div className='giftCardError'>\r\n               {props.config.giftCardErrorMessage || \"At this stage, we cannot process gift cards with product. Please purchase gift cards in a separate transaction.\"}\r\n            </div>\r\n        );\r\n    } else {\r\n        return null\r\n    }\r\n};\r\n\r\nfunction _renderProgressBar(percentFilled: number): JSX.Element | null {\r\n    return <div className='cart-progress-bar'>\r\n        <div className=\"citta-progress-bar\" style={{marginTop: \"-10px\"}}>\r\n            <div className=\"citta-progress-bar__progress\" style={{width:`${percentFilled}%`}}></div>\r\n        </div>\r\n    </div>\r\n}\r\n\r\nfunction _renderGiftWithPurchasMessage(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n    const ogtyAmount = 50;\r\n    const perSpend = 200;\r\n    \r\n    const OrderSubTotal =  props.data.cart.result?.cart?.TotalAmount;\r\n    if (!props.config.ourGiftToYou || !OrderSubTotal || props.cartlines?.some(line => line.data?.cartline.ItemId === \"GiftCard\")) {\r\n        return null;\r\n    }\r\n    let amountOf50s = Math.floor(OrderSubTotal/perSpend);\r\n    if(amountOf50s > 0) {\r\n        return <div className='cart-bar'>\r\n            {_renderProgressBar((OrderSubTotal%perSpend) / perSpend * 100)}\r\n            <div className=\"shipping-to-free-message\" style={{marginBottom:\"30px\"}}>\r\n                You have qualified for <b>${ogtyAmount * amountOf50s}</b> in promotional vouchers. Spend another ${Math.ceil(perSpend - (OrderSubTotal%perSpend))} to receive an additional <b>${ogtyAmount}</b> voucher\r\n            </div>\r\n        </div>\r\n    } else {\r\n        return <div className='cart-bar'> \r\n            {_renderProgressBar(OrderSubTotal / perSpend * 100)}\r\n            <div className=\"shipping-to-free-message\" style={{marginBottom:\"30px\"}}>\r\n                Spend an additional ${Math.ceil(perSpend - (OrderSubTotal%perSpend))} to receive a <b>${ogtyAmount}</b> promotional voucher\r\n            </div>  \r\n        </div> \r\n    }\r\n}\r\n\r\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n    if (!orderSummaryLines) {\r\n        return null;\r\n    }\r\n    return (\r\n        <Node {...OrderSummaryItems}>\r\n            {_renderGiftWithPurchasMessage(props)}\r\n            {props.promoCode}\r\n            {_renderSubTotal(props)}\r\n            {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n            {orderSummaryLines.shipping}\r\n            {props.config.hideTaxLine ? null : orderSummaryLines.tax}\r\n            {_renderAmountDue(props)}\r\n            {/* {_renderTotalSavings(props)} */}\r\n        </Node>\r\n    );\r\n};\r\n\r\nfunction _renderSubTotal(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n    const OrderSubTotal =  props.data.cart.result?.cart?.NetPrice;\r\n    return (\r\n        <p className={`msc-order-summary__line-sub-total`}>\r\n           {OrderSubTotal && OrderSubTotal > 0 ? (\r\n            <>\r\n                    <span className='msc-order-summary__label'>{props.resources.subTotalHeadingLabel}</span>\r\n                    <PriceComponent\r\n                        data={{\r\n                            price: { CustomerContextualPrice: OrderSubTotal }\r\n                        }}\r\n                        freePriceText={undefined}\r\n                        context={props.context}\r\n                        id={props.id}\r\n                        typeName={props.typeName}\r\n                        className={'msc-order-summary__value'}\r\n                    />\r\n                </>\r\n            ) : null}\r\n        </p>\r\n    );\r\n}\r\n\r\n// function _renderTax(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n//     const discountAmount = props.cart && props.cart.cart.DiscountAmount || 0;\r\n//     const taxLabel = discountAmount > 0? props.resources.estimatedShippingLabel : props.resources.estimatedTaxLabel;\r\n//     return (\r\n//         <p className={`msc-order-summary__line-amount-tax`}>\r\n//             <span className='msc-order-summary__label'>{taxLabel}</span>\r\n//             {props.data.cart.result?.cart?.TaxAmount && props.data.cart.result?.cart?.TaxAmount > 0 ? (\r\n//                 <PriceComponent\r\n//                     data={{\r\n//                         price: { CustomerContextualPrice: props.data.cart.result?.cart?.TaxAmount }\r\n//                     }}\r\n//                     freePriceText={props.resources.priceFree}\r\n//                     context={props.context}\r\n//                     id={props.id}\r\n//                     typeName={props.typeName}\r\n//                     className={'msc-order-summary__value'}\r\n//                 />\r\n//             ) : (\r\n//                     <span className='msc-order-summary__value'>{props.resources.yetToBeCalculatedText}</span>\r\n//                 )}\r\n//         </p>\r\n//     );\r\n// }\r\n\r\nfunction _renderAmountDue(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n    return (\r\n        <p className={`msc-order-summary__line-amount-due`}>\r\n            <span className='msc-order-summary__label'>{props.resources.totalAmountLabel}</span>\r\n            {props.data.cart.result?.cart?.TotalAmount || props.data.cart.result?.cart?.TotalAmount === 0 ? (\r\n                <PriceComponent\r\n                    data={{\r\n                        price: { CustomerContextualPrice: props.data.cart.result?.cart?.TotalAmount }\r\n                    }}\r\n                    freePriceText={props.resources.priceFree}\r\n                    context={props.context}\r\n                    id={props.id}\r\n                    typeName={props.typeName}\r\n                    className={'msc-order-summary__value'}\r\n                />\r\n            ) : (\r\n                    <span className='msc-order-summary__value'>{props.resources.yetToBeCalculatedText}</span>\r\n                )}\r\n        </p>\r\n    );\r\n}\r\n\r\n// function _renderTotalSavings(props: ICartViewProps): JSX.Element | null {\r\n\r\n//     const DiscountAmountWithoutTax = props.data.cart.result?.cart?.DiscountAmountWithoutTax;\r\n//     return (\r\n//         <p className={`msc-order-summary__line-total-savings`}>\r\n//             {DiscountAmountWithoutTax && DiscountAmountWithoutTax > 0 ? (\r\n//                 <>\r\n//                     <span className='msc-order-summary__label'>{props.resources.totalSavings}</span>\r\n//                     <PriceComponent\r\n//                         data={{\r\n//                             price: { CustomerContextualPrice: DiscountAmountWithoutTax }\r\n//                         }}\r\n//                         freePriceText={props.resources.priceFree}\r\n//                         context={props.context}\r\n//                         id={props.id}\r\n//                         typeName={props.typeName}\r\n//                         className={'msc-order-summary__value'}\r\n//                     />\r\n//                 </>\r\n//             ) : null}\r\n//         </p>\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 msdyn365Commerce from '@msdyn365-commerce/core';\r\nimport { ICheckoutViewProps, IEmailDelivery, ILineItem, ILineItemDeliveryGroup, ILineItems, IPickUpAtStore } from '@msdyn365-commerce-modules/checkout';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ICheckoutProps } from '../definition-extensions/checkout.ext.props.autogenerated';\r\n\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 LineItemsComponent: React.FC<ILineItems> = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForEmail }) => (\r\n    <Node {...LineItems}>\r\n        <Node {...Header}>\r\n            {heading}\r\n            {editLink}\r\n        </Node>\r\n        {itemsForPickup && <LineItemGroupComponent {...itemsForPickup} />}\r\n        {itemsForEmail && <LineItemGroupComponent {...itemsForEmail} />}\r\n        {itemsForShip && <LineItemGroupComponent {...itemsForShip} />}\r\n    </Node>\r\n);\r\n\r\nfunction _renderOtherCharges(props: ICheckoutViewProps): React.ReactNode | null{\r\n    const chargeAmountInclTax = props.data.checkout.result?.checkoutCart.cart.ChargeAmount && props.data.checkout.result?.checkoutCart.cart.ChargeAmount || 0;\r\n    const shippingCharges = props.data.checkout.result?.checkoutCart.cart.ShippingChargeAmount && props.data.checkout.result?.checkoutCart.cart.ShippingChargeAmount || 0;\r\n    const chargeLines = props.data.checkout.result?.checkoutCart.cart.ChargeLines;\r\n\r\n    let otherChargesAmountFromLines = 0;\r\n    let totalChargeAmountFromLines = 0;\r\n    let chargesOverriden = false;\r\n    let displayOtherChargesAmount = 0;\r\n    let shippingChargesFromLines = 0;\r\n    const freightChargeCode = props.context.app.config.freightChargeCode;\r\n\r\n    if(chargeLines) {\r\n        chargeLines.forEach(chargeLine => {\r\n            const chargeAmountInclTaxLocal = chargeLine.CalculatedAmount ? chargeLine.CalculatedAmount : 0;\r\n            if (chargeLine.ChargeCode != freightChargeCode) {\r\n                otherChargesAmountFromLines += chargeAmountInclTaxLocal;\r\n            }\r\n            if (chargeLine.ChargeCode == freightChargeCode){\r\n                shippingChargesFromLines += chargeAmountInclTaxLocal;\r\n            }\r\n        });\r\n    }\r\n\r\n    if(shippingChargesFromLines == 0 &&  shippingCharges != shippingChargesFromLines)\r\n    {\r\n        totalChargeAmountFromLines = shippingCharges + otherChargesAmountFromLines;\r\n    }\r\n    else{\r\n        totalChargeAmountFromLines = shippingChargesFromLines + otherChargesAmountFromLines;\r\n    }\r\n    \r\n    chargesOverriden = totalChargeAmountFromLines != chargeAmountInclTax;\r\n    displayOtherChargesAmount = chargesOverriden ? 0 : otherChargesAmountFromLines;\r\n    if (displayOtherChargesAmount == 0) {\r\n        return null;\r\n    }\r\n\r\n    return (\r\n        <p className={`msc-order-summary__line_other-charges`}>\r\n           {displayOtherChargesAmount && displayOtherChargesAmount > 0 ? (\r\n            <>\r\n                    <span className='msc-order-summary__label'>Other charges</span>\r\n                    <PriceComponent\r\n                        data={{\r\n                            price: { CustomerContextualPrice: displayOtherChargesAmount }\r\n                        }}\r\n                        freePriceText={undefined}\r\n                        context={props.context}\r\n                        id={props.id}\r\n                        typeName={props.typeName}\r\n                        className={'msc-order-summary__value'}\r\n                    />\r\n                </>\r\n            ) : null}\r\n        </p>\r\n    );\r\n}\r\n\r\n\r\nfunction _renderShippingInclTaxes(props: ICheckoutViewProps): React.ReactNode | null{\r\n    const chargeLines = props.data.checkout.result?.checkoutCart.cart.ChargeLines;\r\n    let chargeAmountInclTax = 0;\r\n    if(chargeLines) {\r\n        chargeLines.forEach(chargeLine => {\r\n            if (chargeLine.IsShipping) {\r\n                const chargeAmountInclTaxLocal = chargeLine.GrossAmount ? chargeLine.GrossAmount : 0;\r\n                chargeAmountInclTax += chargeAmountInclTaxLocal;\r\n            }\r\n        });\r\n    }\r\n    if (chargeAmountInclTax == 0) {\r\n        return props.orderSummary?.lines?.shipping;\r\n    }\r\n\r\n    return (\r\n        <p className={`msc-order-summary__line-shipment`}>\r\n           {chargeAmountInclTax && chargeAmountInclTax > 0 ? (\r\n            <>\r\n                    <span className='msc-order-summary__label'>{props.resources.shippingLabel}</span>\r\n                    <PriceComponent\r\n                        data={{\r\n                            price: { CustomerContextualPrice: chargeAmountInclTax }\r\n                        }}\r\n                        freePriceText={undefined}\r\n                        context={props.context}\r\n                        id={props.id}\r\n                        typeName={props.typeName}\r\n                        className={'msc-order-summary__value'}\r\n                    />\r\n                </>\r\n            ) : null}\r\n        </p>\r\n    );\r\n}\r\n\r\nfunction _renderTotalSavings(props: ICheckoutViewProps): JSX.Element | null {\r\n\r\n    const DiscountAmount = props.data.checkout.result?.checkoutCart.cart.DiscountAmount;\r\n    return (\r\n        <p className={`msc-order-summary__line--discount-amount`}>\r\n            {DiscountAmount && DiscountAmount > 0 ? (\r\n            <>\r\n                    <span className='msc-order-summary__label'>{props.resources.totalSavingsLabel}</span>\r\n                    <PriceComponent\r\n                        data={{\r\n                            price: { CustomerContextualPrice: DiscountAmount }\r\n                        }}\r\n                        freePriceText={undefined}\r\n                        context={props.context}\r\n                        id={props.id}\r\n                        typeName={props.typeName}\r\n                        className={'msc-order-summary__value'}\r\n                    />\r\n                </>\r\n            ) : null}\r\n        </p>\r\n    );\r\n}\r\n\r\nconst _renderOrderSummarylines = (props: ICheckoutViewProps & ICheckoutProps<{}>): JSX.Element | null => {\r\n    const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n    const {orderSummary } = props;\r\n    if (!orderSummary) {\r\n        return null;\r\n    }\r\n    return (\r\n        <div className='msc-order-summary-wrapper'>\r\n        {orderSummary.heading}\r\n        <div className='msc-order-summary__items'>\r\n            {orderSummary.lines && (\r\n                <>\r\n                    {isB2B ? orderSummary.lines.subtotal : _renderSubTotal(props)}\r\n                    {isB2B ? null : orderSummary.lines.totalDiscounts}\r\n                    {_renderShippingInclTaxes(props)}\r\n                    {_renderOtherCharges(props)}\r\n                    {/*hide on us*/}\r\n                    {props.config.hideTaxLine ? null : orderSummary.lines.tax}\r\n                    {_renderTotalOrder(props)}\r\n                    {orderSummary.lines.loyalty}\r\n                    {orderSummary.lines.giftCard}\r\n                    {isB2B ? null : orderSummary.lines.orderTotal}\r\n                    {isB2B? null : _renderTotalSavings(props)}\r\n                </>\r\n            )}\r\n        </div>\r\n        {_renderFreeShippingMessage(props)}\r\n        {_getCheckoutSummaryText(props)}\r\n    </div>\r\n    );\r\n};\r\n\r\nfunction _renderFreeShippingMessage(props: ICheckoutViewProps & ICheckoutProps<{}>): JSX.Element | null {\r\n    const shippingAmount = props.data.checkout.result?.checkoutCart.cart.DeliveryModeChargeAmount || 0;\r\n    const OrderSubTotal = (props.data.checkout.result?.checkoutCart.cart.AmountDue || 0) - shippingAmount;\r\n    \r\n    const freeShippingAmount = props.config.freeShippingAmount;\r\n\r\n    if (!freeShippingAmount || !OrderSubTotal || OrderSubTotal >= freeShippingAmount) {\r\n        return null;\r\n    }\r\n    return <div className=\"shipping-to-free-message\">\r\n        Spend an additional ${Math.ceil(freeShippingAmount - OrderSubTotal)} to get <b>FREE SHIPPING</b>\r\n    </div>\r\n}\r\n\r\nfunction _renderSubTotal(props: ICheckoutViewProps): JSX.Element | null {\r\n   var subtotal=0;\r\n   props.data.checkout.result?.checkoutCart.cart.CartLines?.forEach((item)=>{\r\n    subtotal += item.Price! * item.Quantity!;\r\n   });\r\n    const OrderSubTotal = subtotal;//props.data.checkout.result?.checkoutCart.cart.NetPrice;\r\n    return (\r\n        <p className={`msc-order-summary__line-sub-total`}>\r\n           {OrderSubTotal && OrderSubTotal > 0 ? (\r\n            <>\r\n                    <span className='msc-order-summary__label'>{props.resources.subTotalLabel}</span>\r\n                    <PriceComponent\r\n                        data={{\r\n                            price: { CustomerContextualPrice: OrderSubTotal }\r\n                        }}\r\n                        freePriceText={undefined}\r\n                        context={props.context}\r\n                        id={props.id}\r\n                        typeName={props.typeName}\r\n                        className={'msc-order-summary__value'}\r\n                    />\r\n                </>\r\n            ) : null}\r\n        </p>\r\n    );\r\n}\r\nfunction _renderTotalOrder(props: ICheckoutViewProps): JSX.Element | null {\r\n\r\n    const OrderTotal = props.data.checkout.result?.checkoutCart.cart.TotalAmount;\r\n    return (\r\n        <p className={`msc-order-summary__line-order-total`}>\r\n           {OrderTotal && OrderTotal > 0 ? (\r\n            <>\r\n                    <span className='msc-order-summary__label'>{props.resources.totalAmountLabel}</span>\r\n                    <PriceComponent\r\n                        data={{\r\n                            price: { CustomerContextualPrice: OrderTotal }\r\n                        }}\r\n                        freePriceText={undefined}\r\n                        context={props.context}\r\n                        id={props.id}\r\n                        typeName={props.typeName}\r\n                        className={'msc-order-summary__value'}\r\n                    />\r\n                </>\r\n            ) : null}\r\n        </p>\r\n    );\r\n}\r\nconst _getCheckoutSummaryText = (props: ICheckoutViewProps & ICheckoutProps<{}>): React.ReactNode | undefined => {\r\n    const { paragraph } = props.config;\r\n\r\n    return (\r\n        paragraph && (\r\n            <MsDyn365.RichTextComponent\r\n                text={paragraph}\r\n                className='msc-order-summary__summary-text'\r\n            />\r\n        )\r\n    );\r\n};\r\nconst CheckoutView: React.FC<ICheckoutViewProps & ICheckoutProps<{}>> = 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        termsAndConditionsProps,\r\n        orderConfirmation,\r\n        loading,\r\n        alert,\r\n        title,\r\n        guidedForm,\r\n        lineItems,\r\n        placeOrderButton,\r\n        termsAndConditions,\r\n        keepShoppingButton\r\n    } = props;\r\n\r\n    let isBusy = false;\r\n    if(msdyn365Commerce.isBrowser) {\r\n        const url: string = decodeURI(window.location.search);\r\n        const urlParams: URLSearchParams = new URLSearchParams(url);\r\n        if (urlParams.get('paymentMethod') === 'AP' && urlParams.has('orderToken')) {\r\n            const orderToken = urlParams.get('orderToken');\r\n            const afterpayStatus = urlParams.get('status') || 'FAILURE';\r\n\r\n            if (afterpayStatus === 'SUCCESS' && orderToken) {\r\n                isBusy = true;\r\n            }\r\n        }\r\n    }\r\n\r\n    const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n    function _renderPlaceOrderCopy(): JSX.Element | null {\r\n        return (\r\n            <div className=\"place-order-copy\">\r\n                <span>By clicking Place order you agree to your signed terms of business, please contact your account manager for further information.</span>\r\n            </div>\r\n        )\r\n    }\r\n\r\n    return (\r\n        <Module {...checkoutProps}>\r\n            {!hasSalesOrder && <Node {...headerProps}>{title}</Node>}\r\n            {!hasSalesOrder &&\r\n                <Node {...bodyProps} className={`${bodyProps.className} ${isBusy ? \"checkout-isbusy\" : \"\" }` }>\r\n                    {loading}\r\n                    {\r\n                        isBusy ? (\r\n                            <div className=\"afterpay-loading-wrapper\">\r\n                                <div className='afterpay-loading-wrapper-spinner' />   \r\n                            </div> \r\n                        ) : null\r\n                    }\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                                {isB2B? _renderPlaceOrderCopy() : null}\r\n                            </Node>\r\n                            <Node {...sideProps}>\r\n                                {_renderOrderSummarylines(props)}\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            }\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. 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    ICartlinesViewProps,\r\n    ICartResources,\r\n    ICartViewProps,\r\n    IOrderSummaryErrors\r\n} from '@msdyn365-commerce-modules/cart';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n    IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources,\r\n    IOrderTemplateNameDialogResources, IWishlistActionSuccessResult, PriceComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport { CartLineItems } from '../../../components/citta-cart/cart-line-items';\r\nimport { ICartProps } from '../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nimport CittaTelemetry from '../../../common/telemetry/citta-telemetry';\r\n// import PriceComponent from '../../../components/price-component'\r\n\r\ninterface ICartViewState {\r\n    cartlinesErrors: LineDataValidationFailure[];\r\n}\r\n\r\n/**\r\n *\r\n * CartView\r\n * @extends {React.PureComponent<ICartViewProps>}\r\n */\r\nexport class CartView extends React.PureComponent<ICartViewProps & ICartProps<{}>, ICartViewState>  {\r\n    private cittaTelemetry: CittaTelemetry = new CittaTelemetry(this.props.context.app.config.cittaInstrumentationKey);\r\n\r\n    public state: ICartViewState = {\r\n        cartlinesErrors: []\r\n    };\r\n\r\n    private createLogMessage = (message: string): string => {\r\n        const url: string = decodeURI(window.location.search);\r\n        const origin = window.location.origin;\r\n        const logMessage = `${message} Url: - ${url} - Origin: ${origin}`;\r\n        return logMessage;\r\n    }\r\n\r\n    private logMessage = (message: string): void => {\r\n        this.cittaTelemetry.trace(this.createLogMessage(message));\r\n    }\r\n\r\n    // private isQuantityLimitsFeatureEnabled: boolean = true;\r\n    private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n\r\n    constructor(props: ICartViewProps & ICartProps<{}>) {\r\n        super(props);\r\n\r\n        this._renderCartlines = this._renderCartlines.bind(this);\r\n    }\r\n\r\n    public async componentDidMount(): Promise<void> {\r\n        // if (this.isQuantityLimitsFeatureEnabled) {\r\n        //     await this._validateCart();\r\n        // }\r\n        this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n        if (this.isQuantityLimitsFeatureEnabled) {\r\n            await this._validateCart();\r\n        }\r\n\r\n        this.logMessage('landed on cart page');\r\n    }\r\n\r\n    public render(): JSX.Element | null {\r\n        return (\r\n            <div className={this.props.className} id={this.props.id} {...this.props.renderModuleAttributes(this.props)}>\r\n                {this.props.title}\r\n                <Node {...this.props.CartlinesWrapper}>\r\n                    {this._renderCartlines()}\r\n                </Node>\r\n                {this.props.orderSummaryHeading &&\r\n                    < Node {...this.props.OrderSummaryWrapper}>\r\n                        {this.props.orderSummaryHeading}\r\n                        {_renderOrderSummarylines(this.props.orderSummaryLineitems, this.props.OrderSummaryItems, this.props)}\r\n                        {this.state.cartlinesErrors.length > 0 ? _renderErrorBlock(this.props.OrderSummaryErrors) : null}\r\n                        {_renderUnder200sError(this.props)}\r\n                        {this.props.config.freightCalculationText ? <div className='cart-freight-asterix'>{this.props.config.freightCalculationText}</div> : null}\r\n                        <div className={'cart-checkout-button'}>\r\n                            {this.props.checkoutAsSignInUserButton}\r\n                            {this.props.context.request && this.props.context.request.user && this.props.context.request.user.isAuthenticated ? null : <div className='cart-checkout-button-option'>{this.props.resources.orLabel}</div>}\r\n                            <div className={'cart-checkout-button-back-guest'}>\r\n                                {_renderBackToShoppingButton(this.props.resources)}\r\n                                {this.props.checkoutAsGuestButton}\r\n                            </div>\r\n                        </div>\r\n                    </Node>\r\n                }\r\n                {this.props.storeSelector}\r\n            </div>\r\n        );\r\n    }\r\n\r\n    private _renderCartlines(): JSX.Element[] | JSX.Element {\r\n        const { emptyCartText } = this.props.resources;\r\n\r\n        if (this.props.cartLoadingStatus) {\r\n            return <>{this.props.cartLoadingStatus}</>;\r\n        }\r\n        const cartLines = this._getCartLines();\r\n        if (cartLines) {\r\n            return cartLines.map((cartLine, index) => {\r\n                return (\r\n                    <div className='msc-cart-lines-item' key={index}>\r\n                        {cartLine.cartline}\r\n                        {_renderBOPISBlock(cartLine, this.props.resources, this.props.storeSelector)}\r\n                        <div className='msc-cart-lines-item-buttons'>\r\n                            {cartLine.addToWishlist}\r\n                            {cartLine.remove}\r\n                        </div>\r\n                    </div>\r\n                );\r\n            });\r\n        } else {\r\n            return (this.props.cartDataResult ?\r\n                (\r\n                    <div className='msc-cart__empty-cart'>\r\n                        <p className='msc-cart-line'>{emptyCartText}</p>\r\n                        {this.props.backToShoppingButton}\r\n                    </div>\r\n                ) : <>{this.props.waitingComponent}</>\r\n            );\r\n        }\r\n    }\r\n\r\n    private _getCartLines(): ICartlinesViewProps[] | null {\r\n        const {\r\n            data: {\r\n                cart: { result: cart },\r\n                wishlists: { result: wishlists },\r\n                orderTemplates: { result: orderTemplates },\r\n                customerInformation: { result: customerInformation }\r\n            },\r\n            context: {\r\n                request: {\r\n                    channel: {\r\n                        PickupDeliveryModeCode\r\n                    } = { PickupDeliveryModeCode: undefined }\r\n                }\r\n            },\r\n            config: config,\r\n            telemetry,\r\n            resources,\r\n            modules\r\n        } = this.props;\r\n\r\n        const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n        const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\r\n        let storeSelectorId: string = '';\r\n        if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n            storeSelectorId = modules.storeSelector[0].id;\r\n        }\r\n        return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ? (\r\n            CartLineItems({\r\n                cartlines: cart.cart.CartLines,\r\n                storeSelectorModuleId: storeSelectorId,\r\n                cartlinesErrors: cartlinesErrors,\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                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: \"Size:\" || resources.productDimensionTypeSize,\r\n                    colorString: \"Colour:\" || resources.productDimensionTypeColor,\r\n                    configString: resources.productDimensionTypeConfiguration,\r\n                    styleString: resources.productDimensionTypeStyle,\r\n                    quantityDisplayString: resources.quantityDisplayText,\r\n                    inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n                    decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n                    incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n                    discountStringText: resources.discountStringText,\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                outOfStockText: resources.outOfStockErrorMessage,\r\n                outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n                outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\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                locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n                wishlists: wishlists,\r\n                defaultWishlistName: resources.defaultWishlistName,\r\n                pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n                includeErrors: config.showOutOfStockErrors,\r\n                showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n                telemetryContent: this.props.telemetryContent,\r\n                isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n                addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n                createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n                itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n                duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\r\n\r\n                addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n                addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n                addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n                orderTemplates: orderTemplates,\r\n                customerInformation: customerInformation\r\n            })\r\n        ) : null;\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        if (this.props.data.cart.result) {\r\n            const input = {\r\n                cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n            };\r\n            this.props.data.cart.result.removeCartLines(input)\r\n                .then(() => {\r\n                    this._validateCart()\r\n                        .catch((error) => {\r\n                            this.props.telemetry.warning(error);\r\n                            this.props.telemetry.debug('Unable to validate Cart');\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    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): boolean => {\r\n        if (this.props.data.cart.result) {\r\n            const input = {\r\n                cartLineId: cartlineToUpdate.LineId!.toString(),\r\n                newQuantity: quantity,\r\n                additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\r\n            };\r\n            this.props.data.cart.result.updateCartLineQuantity(input)\r\n                .then((result: ICartActionResult) => {\r\n                    if (result.status === 'SUCCESS') {\r\n                        this._validateCart().catch((error) => {\r\n                            this.props.telemetry.warning(error);\r\n                            this.props.telemetry.debug('Unable to validate Cart');\r\n                        });\r\n                        return true;\r\n                    }\r\n                    return false;\r\n                })\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        return false;\r\n    }\r\n\r\n    private _fulfillmentStoreIdUpdated = () => {\r\n        this._validateCart().catch((error) => {\r\n            this.props.telemetry.warning(error);\r\n            this.props.telemetry.debug('Unable to validate Cart');\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Get order quantity limit feature flag.\r\n     * @returns True if flag is enabled, false otherwise.\r\n     */\r\n    private async getOrderQuantityLimitsFeatureFlag(): Promise<boolean> {\r\n        const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n        if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n            return false;\r\n        }\r\n\r\n        try {\r\n            const featureStatuses = await this.props.data.featureState;\r\n            const isQuantityLimitsFeatureEnabledInHq =\r\n                featureStatuses.find(\r\n                    featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n                )?.IsEnabled || false;\r\n            if (!isQuantityLimitsFeatureEnabledInHq) {\r\n                return false;\r\n            }\r\n        } catch (error) {\r\n            this.props.telemetry.warning(error);\r\n            this.props.telemetry.debug('Unable to get feature states');\r\n            return false;\r\n        }\r\n\r\n        if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n            return true;\r\n        }\r\n        try {\r\n            const customerInfo = await this.props.data.customerInformation;\r\n            return (\r\n                !!customerInfo &&\r\n                ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n                    (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n            );\r\n        } catch (error) {\r\n            this.props.telemetry.warning(error);\r\n            this.props.telemetry.debug('Unable to get customer info');\r\n            return false;\r\n        }\r\n    }\r\n\r\n    private async _validateCart(retry: boolean = true): Promise<void> {\r\n        if (!this.isQuantityLimitsFeatureEnabled) {\r\n            return AsyncResult.resolve();\r\n        }\r\n\r\n        const {\r\n            data: { cart: cart }\r\n        } = this.props;\r\n        let cartResult: ICartState;\r\n        try {\r\n            cartResult = await cart;\r\n        } catch (error) {\r\n            this.props.telemetry.warning(error);\r\n            this.props.telemetry.debug('Unable to get cart');\r\n            return AsyncResult.resolve();\r\n        }\r\n        const cartVersion = cartResult.cart?.Version;\r\n        if (cartVersion) {\r\n            try {\r\n                const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\r\n                this.setState({ cartlinesErrors: validationResult.ValidationFailuresByCartLines || [] });\r\n                return AsyncResult.resolve();\r\n            } catch (error) {\r\n                if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n                    try {\r\n                        await cartResult.refreshCart({});\r\n                    } catch (refreshError) {\r\n                        this.props.telemetry.warning(refreshError);\r\n                        this.props.telemetry.debug('Unable to refresh Cart');\r\n                        return AsyncResult.resolve();\r\n                    }\r\n                    try {\r\n                        await this._validateCart(false);\r\n                        return AsyncResult.resolve();\r\n                    } catch (validateError) {\r\n                        this.props.telemetry.warning(validateError);\r\n                        this.props.telemetry.debug('Unable to validate Cart');\r\n                        return AsyncResult.resolve();\r\n                    }\r\n                }\r\n\r\n                this.props.telemetry.warning(error);\r\n                this.props.telemetry.debug('Unable to validate Cart');\r\n                return AsyncResult.resolve();\r\n            }\r\n        } else {\r\n            this.props.telemetry.warning('Cart version not found for Cart validation request.');\r\n            return AsyncResult.resolve();\r\n        }\r\n    }\r\n\r\n    private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\r\n        return {\r\n            addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n            noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n            noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n            createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n            createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n            cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n            selectTemplatesText: resources.selectTemplatesText,\r\n            addToTemplateButtonText: resources.addToTemplateButtonText,\r\n            lineItemsText: resources.lineItemsText\r\n        };\r\n    }\r\n\r\n    private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\r\n        return {\r\n            viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n            continueShoppingButtonText: resources.continueShoppingButtonText,\r\n            itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n            itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n            itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n            freePriceText: resources.freePriceText,\r\n            originalPriceText: resources.originalPriceText,\r\n            currentPriceText: resources.currentPriceText\r\n        };\r\n    }\r\n\r\n    private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n        return {\r\n            duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n            duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n            updateQuantityButtonText: resources.updateQuantityButtonText,\r\n            cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n        };\r\n    }\r\n\r\n    private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\r\n        return {\r\n            orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n            orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n            orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n            orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n            defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n            orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n            orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n        };\r\n    }\r\n}\r\nexport default CartView;\r\n\r\nfunction _renderBackToShoppingButton(resources: ICartResources): JSX.Element | null {\r\n    return (\r\n        <Button\r\n            className={'msc-cart__btn-backtoshopping'}\r\n            onClick={_goToPreviousPage}\r\n        >\r\n            {resources.backToShoppingButtonTitle}\r\n        </Button>\r\n    );\r\n}\r\n\r\nfunction _goToPreviousPage(): void {\r\n    window.history.back();\r\n}\r\n\r\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined): JSX.Element | null => {\r\n    if (!cartLine.pickUpInStore || !storeSelector) {\r\n        return null;\r\n    }\r\n\r\n    const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\r\n\r\n    const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\r\n    const toggleBopis = (event: React.MouseEvent<HTMLElement>) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected); };\r\n    const changeStore = (event: React.MouseEvent<HTMLElement>) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true); };\r\n\r\n    return (\r\n        <Node {...cartLine.pickUpInStore.ContainerProps}>\r\n            <div className='msc-cart-line__bopis-method'>\r\n                {isBopisSelected ? <span className='pick-up'>{pickUpAtStoreWithLocationText}</span> : <span className='ship'>{shipToAddressDisplayText}</span>}\r\n            </div>\r\n            {\r\n                isBopisSelected &&\r\n                <div className='msc-cart-line__bopis-fullfilment'>\r\n                    <span className='msc-cart-line__bopis-fullfilment-store'>{cartLine.pickUpInStore.orgUnitName}</span>\r\n                    <Button className='msc-cart-line__bopis-changestore' onClick={changeStore}>{changeStoreDisplayText}</Button>\r\n                </div>\r\n            }\r\n            <Button className='msc-cart-line__bopis-btn' onClick={toggleBopis}>{isBopisSelected ? shipInsteadDisplayText : pickItUpDisplayText}</Button>\r\n        </Node>\r\n    );\r\n};\r\n\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n    if (!errorData || errorData.errors.length === 0) {\r\n        return null;\r\n    }\r\n    return (\r\n        <Node {...errorData.Wrapper}>\r\n            {\"Please review cart errors before proceeding to checkout\"}\r\n        </Node>\r\n    );\r\n};\r\n\r\nconst _renderUnder200sError = (props:any): JSX.Element | null => {\r\n    const OrderSubTotal =  props.data.cart.result?.cart?.SubtotalAmount;\r\n    const { request } = props.context;\r\n    const market = request && request.apiSettings && request.apiSettings.oun;\r\n    const isB2BI = market && market === \"B2BI\";\r\n    let minimumOrder = 200;\r\n    const discountLevel = props.data.customerInformation.result!.LineDiscountGroup;\r\n    if(isB2BI) {\r\n        switch(discountLevel){\r\n            case \"Level 1\":\r\n                minimumOrder = 1500;\r\n                break;\r\n            case \"Level 4\":\r\n                minimumOrder = 500;\r\n                break;\r\n            case \"Level 5\":\r\n                minimumOrder = 500;\r\n                break;\r\n            default:\r\n                minimumOrder = 200;\r\n        }\r\n    }\r\n    let isGiftCardOnly = props.data.cart.result?.cart && props.data.cart.result?.cart.CartLines && props.data.cart.result?.cart.CartLines.length === 1 && props.data.cart.result?.cart.CartLines[0].ItemId === \"GiftCard\";\r\n    if(!isGiftCardOnly && OrderSubTotal < minimumOrder) {\r\n        return (\r\n            <div className='msc-alert msc-alert msc-alert-danger'>\r\n                 <div>Your order must be a minimum of ${minimumOrder}. Please update your cart to place an order.</div>\r\n            </div>\r\n        );\r\n    }\r\n    return null\r\n};\r\n\r\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n    if (!orderSummaryLines) {\r\n        return null;\r\n    }\r\n    const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n    return (\r\n        <Node {...OrderSummaryItems}>\r\n            {isB2B? null : props.promoCode}\r\n            {isB2B? orderSummaryLines.subtotal : _renderSubTotal(props)}\r\n            {props.config.hideTaxLine ? null : _renderTax(props)}\r\n            {isB2B ? orderSummaryLines.subtotal : (orderSummaryLines.totalDiscounts ? orderSummaryLines.subtotal : null)}\r\n            {isB2B? null : _renderAmountDue(props)}\r\n            {isB2B? null : _renderTotalSavings(props)}\r\n        </Node>\r\n    );\r\n};\r\n\r\nfunction _renderSubTotal(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n    const OrderSubTotal =  props.data.cart.result?.cart?.NetPrice;\r\n    return (\r\n        <p className={`msc-order-summary__line-sub-total`}>\r\n           {OrderSubTotal && OrderSubTotal > 0 ? (\r\n            <>\r\n                    <span className='msc-order-summary__label'>{props.resources.subTotalHeadingLabel}</span>\r\n                    <PriceComponent\r\n                        data={{\r\n                            price: { CustomerContextualPrice: OrderSubTotal }\r\n                        }}\r\n                        freePriceText={undefined}\r\n                        context={props.context}\r\n                        id={props.id}\r\n                        typeName={props.typeName}\r\n                        className={'msc-order-summary__value'}\r\n                    />\r\n                </>\r\n            ) : null}\r\n        </p>\r\n    );\r\n}\r\n\r\nfunction _renderTax(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n    const discountAmount = props.cart && props.cart.cart.DiscountAmount || 0;\r\n    const taxLabel = discountAmount > 0? props.resources.estimatedShippingLabel : props.resources.estimatedTaxLabel;\r\n    return (\r\n        <p className={`msc-order-summary__line-amount-tax`}>\r\n            <span className='msc-order-summary__label'>{taxLabel}</span>\r\n            {props.data.cart.result?.cart?.TaxAmount && props.data.cart.result?.cart?.TaxAmount > 0 ? (\r\n                <PriceComponent\r\n                    data={{\r\n                        price: { CustomerContextualPrice: props.data.cart.result?.cart?.TaxAmount }\r\n                    }}\r\n                    freePriceText={props.resources.priceFree}\r\n                    context={props.context}\r\n                    id={props.id}\r\n                    typeName={props.typeName}\r\n                    className={'msc-order-summary__value'}\r\n                />\r\n            ) : (\r\n                    <span className='msc-order-summary__value'>{props.resources.yetToBeCalculatedText}</span>\r\n                )}\r\n        </p>\r\n    );\r\n}\r\n\r\nfunction _renderAmountDue(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n    return (\r\n        <p className={`msc-order-summary__line-amount-due`}>\r\n            <span className='msc-order-summary__label'>{props.resources.amountDueLabel}</span>\r\n            {props.data.cart.result?.cart?.TotalAmount || props.data.cart.result?.cart?.TotalAmount === 0 ? (\r\n                <PriceComponent\r\n                    data={{\r\n                        price: { CustomerContextualPrice: props.data.cart.result?.cart?.TotalAmount }\r\n                    }}\r\n                    freePriceText={props.resources.priceFree}\r\n                    context={props.context}\r\n                    id={props.id}\r\n                    typeName={props.typeName}\r\n                    className={'msc-order-summary__value'}\r\n                />\r\n            ) : (\r\n                    <span className='msc-order-summary__value'>{props.resources.yetToBeCalculatedText}</span>\r\n                )}\r\n        </p>\r\n    );\r\n}\r\n\r\nfunction _renderTotalSavings(props: ICartViewProps): JSX.Element | null {\r\n\r\n    const DiscountAmountWithoutTax = props.data.cart.result?.cart?.DiscountAmountWithoutTax;\r\n    return (\r\n        <p className={`msc-order-summary__line-total-savings`}>\r\n            {DiscountAmountWithoutTax && DiscountAmountWithoutTax > 0 ? (\r\n                <>\r\n                    <span className='msc-order-summary__label'>{props.resources.totalSavings}</span>\r\n                    <PriceComponent\r\n                        data={{\r\n                            price: { CustomerContextualPrice: DiscountAmountWithoutTax }\r\n                        }}\r\n                        freePriceText={props.resources.priceFree}\r\n                        context={props.context}\r\n                        id={props.id}\r\n                        typeName={props.typeName}\r\n                        className={'msc-order-summary__value'}\r\n                    />\r\n                </>\r\n            ) : null}\r\n        </p>\r\n    );\r\n}","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartIconViewProps } from './cart-icon';\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\n\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n    if (!cartLines) {\n        props.context.telemetry.error('Cartlines content is empty, module wont render');\n        return null;\n    }\n    return cartLines.map((cartLine, index) => {\n        return (\n            <Node {...props.miniCartItemWrapper} key={index}>\n                {cartLine.cartline}\n                {cartLine.storeLocation}\n                {cartLine.remove}\n            </Node>\n        );\n    });\n};\n\nconst CartIconView: React.FC<ICartIconViewProps> = (props: ICartIconViewProps) => (\n    <Node {...props.miniCartWrapper} {...props.renderModuleAttributes(props)}>\n        {props.cartIcon}\n        {props.FlyoutContainer ? (\n            <Node {...props.FlyoutContainer}>\n                {props.flyoutTitle}\n                {props.checkoutBlockedDueToUnavailableFunds}\n                <Node {...props.CartlinesWrapper}>{_renderCartlines(props.cartlines, props)}</Node>\n                {props.totalPrice}\n                {props.checkoutAsSignInUserButton}\n                {props.checkoutAsGuestButton}\n                {props.goToCartButton}\n            </Node>\n        ) : (\n            false\n        )}\n    </Node>\n);\n\nexport default CartIconView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC<IPromoBannerViewProps> = props => {\n    const {\n        promoBannerProps,\n        contentProps,\n        closeButton,\n        bannerMessages,\n        promoBannerTextProps,\n        promoBannerLinksProps,\n        carouselProps,\n        promoBannerText,\n        handleLinks,\n        handleText\n    } = props;\n\n    const slides =\n        bannerMessages &&\n        bannerMessages.map((message, index) => {\n            return (\n                <Node {...contentProps} key={index} aria-live='off' role='marquee'>\n                    <span className='sr-only'>{promoBannerText}</span>\n                    {message.text && <Node {...promoBannerTextProps} text={message.text} onClick={handleText} />}\n                    {message.links && message.links.length > 0 && (\n                        <Node {...promoBannerLinksProps} links={message.links} onClick={handleLinks} />\n                    )}\n                </Node>\n            );\n        });\n\n    return (\n        <Module {...promoBannerProps}>\n            <Node {...carouselProps} items={slides} />\n            {closeButton}\n        </Module>\n    );\n};\nexport default PromoBannerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionConfigureDropdownViewProps, IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridViewProps, IQuickOrderGridFormViewProps } from './index';\n\n/**\n * Render product dimension/configure dropdown.\n * @param dropdown -- Product dimension drop down.\n * @returns Dropdown.\n */\nconst renderConfigureDropdown = (dropdown: IProductDimensionConfigureDropdownViewProps): JSX.Element => {\n    const { containerProps, labelContainerProps, heading, errors, select } = dropdown;\n\n    return (\n        <Node {...containerProps}>\n            <Node {...labelContainerProps}>{heading}</Node>\n            {errors}\n            {select}\n        </Node>\n    );\n};\n\n/**\n * Render product dimension/configure container.\n * @param configure -- Product dimension configuration.\n * @returns Container to have dimension dropdown.\n */\nconst renderConfigure = (configure?: IProductDimensionConfigureViewProps): JSX.Element | null => {\n    if (configure !== undefined) {\n        const { containerProps, dropdowns } = configure;\n\n        return <Node {...containerProps}>{dropdowns.map(renderConfigureDropdown)}</Node>;\n    }\n    return null;\n};\n\n/**\n * Render product dimension/configure container.\n * @param form -- Form props.\n * @param isMobileView -- Flag to check mobile view.\n * @param quickOrderForm - Form component container.\n * @param quickOrderProductContent - Form product component.\n * @param quickOrderMessageContent - Form user message component.\n * @param configure - Product Dimension component.\n * @returns Jsx element of quick order form component.\n */\nconst renderForm = (\n    form: IQuickOrderGridFormViewProps,\n    isMobileView: boolean,\n    quickOrderForm: INodeProps,\n    quickOrderProductContent: INodeProps,\n    quickOrderMessageContent: INodeProps,\n    configure?: IProductDimensionConfigureViewProps\n) => {\n    return isMobileView ? (\n        <Node {...quickOrderForm}>\n            <Node {...quickOrderProductContent}>\n                {form.product}\n                {renderConfigure(configure)}\n                {form.quantity}\n                <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n                {form.addToListBtn}\n            </Node>\n        </Node>\n    ) : (\n        <Node {...quickOrderForm}>\n            <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n            <Node {...quickOrderProductContent}>\n                {form.product}\n                {renderConfigure(configure)}\n                {form.quantity}\n                {form.addToListBtn}\n            </Node>\n        </Node>\n    );\n};\n\n/**\n * Retrieves current sort criteria.\n * @param props - QuickOrder Grid view props.\n * @returns - Render View.\n */\nconst quickOrderGridView: React.FC<IQuickOrderGridViewProps> = props => {\n    const {\n        quickOrderGridProps,\n        contentProps,\n        form,\n        quickOrderGridForm,\n        drawer,\n        configure,\n        quickOrderGridFormProductContent,\n        quickOrderGridFormMsgContent,\n        isMobileView,\n        header,\n        container,\n        actions,\n        orderActions\n    } = props;\n\n    return (\n        <Module {...quickOrderGridProps}>\n            {header}\n            {actions && (\n                <Node {...actions}>\n                    {orderActions?.userMessage}\n                    {orderActions?.addProductListToBag}\n                    {orderActions?.removeProductList}\n                </Node>\n            )}\n            <Node {...drawer}>\n                <Node {...contentProps}>\n                    {renderForm(\n                        form as IQuickOrderGridFormViewProps,\n                        isMobileView,\n                        quickOrderGridForm,\n                        quickOrderGridFormProductContent,\n                        quickOrderGridFormMsgContent,\n                        configure\n                    )}\n                    {props.bulkPurchase}\n                </Node>\n            </Node>\n            {container}\n        </Module>\n    );\n};\n\nexport default quickOrderGridView;\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 { IComponentProps } 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\nimport {SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getCartState } from '@msdyn365-commerce/global-state';\r\nimport { getByIdAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n    cart: ICartState | undefined;\r\n    promoCodeHeadingText: string;\r\n    appliedPromoCodeHeadingText: 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\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.Component<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 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                    this._addProductToCart(appliedPromo);\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 async _addProductToCart(appliedPromo: string): Promise<void> {\r\n        let productRecId = '';\r\n        if(appliedPromo === 'GIFTSPRING') {\r\n            productRecId = '5637359181';\r\n        }\r\n        const product: SimpleProduct|null =  await getByIdAsync(\r\n            { callerContext: this.props.context.actionContext },\r\n            parseInt(productRecId, 10),\r\n            this.props.context.request.apiSettings.channelId).catch(error => {\r\n                return null\r\n            }) ||{ RecordId: 0, ProductTypeValue: 0, BasePrice: 0, Price: 0, AdjustedPrice: 0 }; \r\n\r\n        const cartState = await getCartState(this.props.context.actionContext);\r\n\r\n        if (cartState && cartState.cart && cartState.cart.CartLines) {\r\n                const addProductsToCartInput = {\r\n                    product: product,\r\n                    count: 1,\r\n                    // availableQuantity: 10,\r\n                    enableStockCheck: this.props.context.app.config.enableStockCheck,\r\n                    // isAddEmailDeliveryItemToCart: true,\r\n                    // customPrice: 100,\r\n                    // deliveryMode: emailDeliveryModeCode\r\n                };\r\n                let isAddedToCart:boolean = false;\r\n                await cartState.addProductToCart(addProductsToCartInput)\r\n                    .then(async result => {\r\n                        if (result.status === 'SUCCESS') {\r\n                            isAddedToCart = true;\r\n                            window.location.reload();\r\n                        }\r\n                    })\r\n                    .catch(error => {\r\n                        console.log(error,'this is an error');\r\n                    });\r\n                console.log(isAddedToCart)\r\n            } \r\n    }\r\n\r\n    private _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n        const _onSubmit = (event: React.FormEvent<HTMLFormElement>) => {event.preventDefault(); this._applyPromotion(cartState);};\r\n        const _applyPromotion = (event: React.MouseEvent<HTMLElement>) => {this._applyPromotion(cartState);};\r\n\r\n        return (\r\n            <form onSubmit={_onSubmit} 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                        onClick={_applyPromotion}\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\r\n        const _removePromotion = (event: React.MouseEvent<HTMLElement>) => {this._removePromotion(props.cart, event);};\r\n\r\n        return (\r\n            <>\r\n                <div className='msc-promo-code__discount'>\r\n                    <div className='msc-promo-code__discount-heading'>{this.props.appliedPromoCodeHeadingText}</div>\r\n                    <PriceComponent\r\n                        data={{\r\n                            price: {\r\n                                CustomerContextualPrice: props.cart.cart.DiscountAmount\r\n\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__discount-value'}\r\n                    />\r\n                </div>\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\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                                    {coupon.Code} (\r\n                                        <PriceComponent\r\n                                            data={{\r\n                                                price: {\r\n                                                    CustomerContextualPrice: this._calculateDiscount(coupon.Code || '', props.cart)\r\n\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                                </div>\r\n                                <Button\r\n                                    title={props.removePromoText}\r\n                                    className={'msc-promo-code__line__btn-remove'}\r\n                                    onClick={_removePromotion}\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            </>\r\n        );\r\n    }\r\n}\r\n\r\nexport default PromoCode;","/*!\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","/*!\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 { 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 {\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 { 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 { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\n\nexport enum MediaType {\n    /**\n     * The None.\n     */\n    None = 0,\n    /**\n     * The Image type.\n     */\n    Image = 1,\n    /**\n     * The video type.\n     */\n    Video = 2,\n    /**\n     * The file type.\n     */\n    File = 3\n}\n\nexport interface IMediaData extends IImageData {\n    mediaTypeValue?: MediaType;\n    displayOrder?: number;\n    videoData?: IVideoData;\n}\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n    context: IRequestContext,\n    shouldUseCmsAltText: boolean,\n    productName?: string,\n    imageAltText?: string\n): string | undefined {\n    if (!context?.app?.config?.OmniChannelMedia) {\n        return productName;\n    }\n    if (shouldUseCmsAltText) {\n        return imageAltText;\n    }\n    return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n    commerceApiRequest,\n    commerceVideoMetadataRequest,\n    getCatalogId,\n    IActionContext,\n    IImageData,\n    IImageSettings,\n    IVideoData\n} from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n    ArrayExtensions,\n    getMediaLocationsForSelectedVariant,\n    MediaLocationsForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n    const imageData: IImageData = {\n        src: mediaLocation.Uri || '',\n        altText: mediaLocation.AltText || ''\n    };\n    if (mediaLocation.IsApplicableForChildEntities) {\n        imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n    }\n\n    if (imageData.src === '') {\n        return [imageData, false];\n    }\n\n    return new Promise<[IImageData, boolean]>(resolve => {\n        try {\n            const http = new XMLHttpRequest();\n            http.open('HEAD', imageData.src!, true);\n\n            http.addEventListener('load', () => {\n                resolve([imageData, http.status === 200 || http.status === 201]);\n            });\n\n            http.addEventListener('error', () => {\n                resolve([imageData, false]);\n            });\n\n            http.send();\n        } catch {\n            resolve([imageData, false]);\n        }\n    });\n}\n\nexport async function getValidProductImages(\n    productId: number,\n    channelId: number,\n    actionContext: IActionContext,\n    imageSettings: IImageSettings,\n    selectedProduct?: SimpleProduct\n): Promise<IImageData[]> {\n    const catalogId = getCatalogId(actionContext.requestContext);\n    const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n    return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n        .then(mediaLocations => {\n            if (mediaLocations) {\n                return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n                    return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n                });\n            }\n\n            return [];\n        })\n        .catch(error => {\n            actionContext.telemetry.exception(error);\n            actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n            return [];\n        });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n    productId: number,\n    shouldUseCmsAltText: boolean,\n    channelId: number,\n    actionContext: IActionContext,\n    productName?: string,\n    selectedProduct?: SimpleProduct\n): Promise<IImageData[]> {\n    const catalogId = getCatalogId(actionContext.requestContext);\n    if (actionContext.requestContext?.params?.isPreview) {\n        const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n            productId: productId,\n            channelId: channelId,\n            catalogId: catalogId\n        });\n        if (response.status !== 200) {\n            actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n            return [];\n        }\n        const previewImageData = response?.data as MediaLocation[];\n        if (previewImageData) {\n            return previewImageData.map(mediaLocation => {\n                return {\n                    src: mediaLocation.Uri ?? '',\n                    altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n                    displayOrder: mediaLocation.DisplayOrder,\n                    mediaTypeValue: mediaLocation.MediaTypeValue,\n                    additionalProperties: mediaLocation.IsApplicableForChildEntities\n                        ? {\n                              isApplicableForChildEntities: 'true'\n                          }\n                        : undefined\n                };\n            });\n        }\n        return [];\n    }\n    const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n    return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n        .then(mediaLocations => {\n            if (mediaLocations) {\n                return mediaLocations.map(mediaLocation => {\n                    return {\n                        src: mediaLocation.Uri ?? '',\n                        altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n                        displayOrder: mediaLocation.DisplayOrder,\n                        mediaTypeValue: mediaLocation.MediaTypeValue,\n                        additionalProperties: mediaLocation.IsApplicableForChildEntities\n                            ? {\n                                  isApplicableForChildEntities: 'true'\n                              }\n                            : undefined\n                    };\n                });\n            }\n            return [];\n        })\n        .catch(error => {\n            actionContext.telemetry.exception(error);\n            actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n            return [];\n        });\n}\n\nexport async function validateProductImages(\n    mediaLocations: MediaLocation[],\n    actionContext: IActionContext,\n    imageSettings: IImageSettings\n): Promise<IImageData[]> {\n    return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n        .then(pairs => {\n            return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n        })\n        .catch(error => {\n            actionContext.telemetry.exception(error);\n            actionContext.telemetry.debug('Unable to validate product images');\n            return [];\n        });\n}\n\n/**\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\n * @param videoId: Video Id\n * @param actionContext: Action context\n * @returns: Returns the meta data of the video.\n */\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise<IVideoData | undefined> {\n    let videoPlayerData: IVideoData | undefined;\n    if (videoId) {\n        const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\n\n        if (response.status !== 200) {\n            actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\n            return;\n        }\n\n        const videoData = response.data as [];\n        if (videoData && ArrayExtensions.hasElements(videoData)) {\n            videoPlayerData = videoData[0];\n        }\n    }\n    return videoPlayerData;\n}\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 { IPickUpInStoreViewProps, PickUpInStore } from '@msdyn365-commerce-modules/cart';\r\nimport { getProductUrlSync, IProductInventoryInformation, OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n    AddToOrderTemplateComponent, AddToWishlistComponent, CartLineItemComponent,\r\n    IAddToOrderTemplateDialogResources, ICartlineResourceString, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n    IItemAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources, IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, CommerceList, Customer, LineDataValidationFailure, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n// import { PropertyUserActionClass } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport * as React from 'react';\r\n\r\nexport interface ICartLineItemsProps {\r\n    cartlines: CartLine[];\r\n    cartlinesErrors: LineDataValidationFailure[];\r\n    cartState: ICartState | undefined;\r\n    orgUnitLocations: OrgUnitLocation[] | undefined;\r\n    resources: ICartlineResourceString;\r\n    productAvailabilites: IProductInventoryInformation[] | 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    outOfStockText: string;\r\n    outOfRangeOneText: string;\r\n    outOfRangeFormatText: string;\r\n    storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n    isStockCheckEnabled: boolean;\r\n    wishlists: CommerceList[] | undefined;\r\n    defaultWishlistName: string;\r\n    maxCartlineQuantity: number;\r\n    includeErrors?: boolean;\r\n    showShippingChargesForLineItems?: boolean;\r\n    telemetryContent?: ITelemetryContent;\r\n    isQuantityLimitsFeatureEnabled: boolean;\r\n    storeSelectorModuleId?: string;\r\n\r\n    addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n    createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n    itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n    duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n    addToOrderTemplateButtonText: string;\r\n    addToOrderTemplateMessage: string;\r\n    addItemToOrderTemplateError: string;\r\n    orderTemplates: OrderTemplate[] | undefined;\r\n    customerInformation: Customer | undefined;\r\n\r\n    removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n    moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n    updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number): boolean;\r\n    locationChangedHandler(): 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    addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n    error?: string;\r\n\r\n    data?: {\r\n        product: SimpleProduct;\r\n        cartline: CartLine;\r\n    };\r\n}\r\n\r\nconst _getProduct = (productId: number | undefined, products: SimpleProduct[]): 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 = (maxCartlineQuantity: number, isStockCheckEnabled: boolean, productAvailability?: IProductInventoryInformation, productMaxQuantity?: number) => {\r\n    const lineMaxQuantity = productMaxQuantity ? productMaxQuantity : maxCartlineQuantity;\r\n\r\n    if (isStockCheckEnabled) {\r\n        if (!productAvailability || !productAvailability.ProductAvailableQuantity || !productAvailability.IsProductAvailable || !productAvailability.ProductAvailableQuantity.AvailableQuantity) {\r\n            return 0;\r\n        }\r\n        return productAvailability.ProductAvailableQuantity.AvailableQuantity ? productAvailability.ProductAvailableQuantity.AvailableQuantity : lineMaxQuantity;\r\n    }\r\n\r\n    return lineMaxQuantity;\r\n};\r\n\r\nconst _getErrorMessage = (maxQuantity: number, currentQuantity: number, props: ICartLineItemsProps, lineIndex: number, isServiceItem: boolean, eoqQuantity:number): string | undefined => {\r\n    \r\n    const finalErrorMessage: string[] = [];\r\n    if (props.includeErrors) {\r\n        if (props.isStockCheckEnabled && !isServiceItem) {\r\n            if (maxQuantity <= 0) {\r\n                finalErrorMessage.push(props.outOfStockText);\r\n            } else if (maxQuantity < currentQuantity) {\r\n                if (maxQuantity === 1) {\r\n                    finalErrorMessage.push(props.outOfRangeOneText);\r\n                } else {\r\n                    finalErrorMessage.push(props.outOfRangeFormatText.replace('{numLeft}', maxQuantity.toString()));\r\n                }\r\n            }\r\n        }\r\n    }\r\n    const eoqErrorMessage = `Must be purchased in multiples of ${eoqQuantity}`;\r\n\r\n    // server-side validation\r\n    props.cartlinesErrors\r\n        .filter(i => i.LineIndex === lineIndex)\r\n        .forEach(i => {\r\n            if (\r\n                i.DataValidationFailure?.ErrorResourceId === \"Microsoft_Dynamics_Commerce_Runtime_ItemQuantityViolatesMultiplicityOfConfiguredNumber\" ||\r\n                i.DataValidationFailure?.ErrorResourceId === \"Microsoft_Dynamics_Commerce_Runtime_ItemQuantityLessThanMinimumAndViolatesMultiplicityOfConfiguredNumber\") {\r\n                    finalErrorMessage.push(eoqErrorMessage);\r\n            } else if (i.DataValidationFailure?.ErrorContext) {\r\n                finalErrorMessage.push(i.DataValidationFailure.ErrorContext);\r\n            }\r\n        });\r\n\r\n    if (finalErrorMessage.length > 0) {\r\n        return finalErrorMessage.join(' ');\r\n    }\r\n\r\n    return undefined;\r\n};\r\n\r\n// tslint:disable-next-line: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    foundProductAvailability?: IProductInventoryInformation,\r\n    foundProductDeliveryOptions?: ProductDeliveryOptions)\r\n    : ICartlinesViewProps => {\r\n    const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText,\r\n        removeItemClickHandler, moveToWishlistSuccessHandler, addToOrderTemplateButtonText,\r\n        addToOrderTemplateDialogResources, createOrderTemplateDialogResources,\r\n        itemAddedToOrderTemplateDialogResources, duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n        addToWishlistButtonText, removeFromWishlistButtonText, orderTemplates, customerInformation,\r\n        wishlists, defaultWishlistName, storeSelectorModuleId } = props;\r\n\r\n    const isAuthenticated = context.request.user.isAuthenticated;\r\n    const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n    const maxQuantity = _getCartItemMaxQuantity(\r\n        props.maxCartlineQuantity,\r\n        props.isStockCheckEnabled,\r\n        foundProductAvailability,\r\n        props.isQuantityLimitsFeatureEnabled ? product.Behavior?.MaximumQuantity : undefined);\r\n\r\n    // check if the product is service or not by product type\r\n    const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\r\n    const isServiceItem = product.ItemTypeValue === PRODUCTASSERVICE;\r\n\r\n    const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n    const eoqQuantity:number =isB2B? product.Behavior?.MultipleOfQuantity || 1 : 1;\r\n    const errorMessage = _getErrorMessage(maxQuantity, cartline.Quantity!, props, index, isServiceItem, eoqQuantity);\r\n\r\n    const onRemoveClickHandler = (event: React.MouseEvent<HTMLElement>) => { removeItemClickHandler(cartline);};\r\n    const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n    const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n    const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n    const inventoryCode = foundProductAvailability ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}` : undefined;\r\n    return {\r\n        data: {\r\n            product: product,\r\n            cartline: cartline\r\n        },\r\n        error: errorMessage,\r\n        cartline: (\r\n            <CartLineItemComponent\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={(!isServiceItem && props.isStockCheckEnabled) ? (maxQuantity <= 0 ? true : false) : false}\r\n                gridSettings={gridSettings}\r\n                imageSettings={imageSettings}\r\n                id={id}\r\n                typeName={typeName}\r\n                productUrl={getProductUrlSync(product, props.context.actionContext, undefined)}\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                errorMessage={errorMessage}\r\n                inventoryInformationLabel={inventoryLbl}\r\n                inventoryLabelClassName={inventoryCode}\r\n                isCartStateReady={props.cartState?.status === 'READY'}\r\n                showShippingChargesForLineItems={props.showShippingChargesForLineItems}\r\n                telemetryContent={props.telemetryContent}\r\n            />),\r\n        pickUpInStore: (\r\n            PickUpInStore({\r\n                storeSelectorModuleId: storeSelectorModuleId,\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                locationChangedHandler: props.locationChangedHandler\r\n            })\r\n        ),\r\n        remove: (\r\n            <Button\r\n                className='msc-cart-line__remove-item'\r\n                onClick={onRemoveClickHandler}\r\n                title={removeButtonText}\r\n                {...attributes}\r\n            >\r\n                {removeButtonText}\r\n            </Button>\r\n        ),\r\n        addToWishlist: (\r\n            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        addToOrderTemplate: (\r\n\r\n            isAuthenticated && orderTemplates ? (\r\n                //@ts-ignore\r\n                <AddToOrderTemplateComponent\r\n                    className={'msc-cart-line__add-to-order-template'}\r\n                    addToOrderTemplateButtonText={addToOrderTemplateButtonText}\r\n                    addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\r\n                    createOrderTemplateDialogResources={createOrderTemplateDialogResources}\r\n                    itemAddedToOrderTemplateDialogResources={itemAddedToOrderTemplateDialogResources}\r\n                    duplicateItemsWhenAddingToOrderTemplateDialogResources={duplicateItemsWhenAddingToOrderTemplateDialogResources}\r\n                    data={{ product: product, quantity: cartline.Quantity || 1, orderTemplates: orderTemplates, customerInformation: customerInformation }}\r\n                    context={context}\r\n                    showButtonText={true}\r\n                    showButtonTooltip={false}\r\n                    id={id}\r\n                    typeName={typeName}\r\n                />\r\n            ) :\r\n                undefined\r\n        )\r\n    };\r\n};\r\n\r\nconst _assembleCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): ICartlinesViewProps[] | null => {\r\n    const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n    if (!products || products.length === 0) {\r\n        props.context.telemetry.error('Products content is empty, module wont render');\r\n        return null;\r\n    }\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((productAvailability) => {\r\n                return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n            });\r\n        }\r\n        let foundProductDeliveryOption;\r\n        if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n            foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\r\n                return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n            });\r\n        }\r\n        if (product) {\r\n            reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\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 } = props;\r\n    return (\r\n        _assembleCartlines(cartlines, products, props)\r\n    );\r\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 { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n    CartLine,\n    ChannelDeliveryOptionConfiguration,\n    OrgUnitLocation,\n    ProductAvailableQuantity,\n    ProductDeliveryOptions,\n    SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n    Button,\n    getPayloadObject,\n    getTelemetryAttributes,\n    ITelemetryContent,\n    TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\n\nexport interface IFlyoutCartLineItemsProps {\n    cartlines: CartLine[];\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\n    /**\n     * GridSettings for the product image in cartline\n     */\n    gridSettings: IGridSettings;\n\n    /**\n     * ImageSettings for the product image in cartline\n     */\n    imageSettings: IImageSettings;\n    id: string;\n    typeName: string;\n    context: ICoreContext;\n    telemetry: ITelemetry;\n    removeButtonText: string;\n    outOfStockText: string;\n    outOfRangeOneText: string;\n    outOfRangeFormatText: string;\n    maxCartlineQuantity: number;\n    channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n    isQuantityLimitsFeatureEnabled: boolean;\n\n    outOfStockThreshold: number;\n    isStockCheckEnabled: boolean;\n    telemetryContent?: ITelemetryContent;\n    removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n    cartline: React.ReactNode;\n    remove: React.ReactNode;\n    storeLocation: React.ReactNode;\n    hasError: boolean;\n\n    data: {\n        product: SimpleProduct;\n        cartline: CartLine;\n    };\n}\n\nconst _getCartItemAvailableQuantity = (\n    isStockCheckEnabled: boolean,\n    outOfStockThreshold: number,\n    productAvailability?: ProductAvailableQuantity\n): number => {\n    if (isStockCheckEnabled) {\n        if (\n            !productAvailability ||\n            !productAvailability.AvailableQuantity ||\n            productAvailability.AvailableQuantity <= 0 ||\n            productAvailability.AvailableQuantity <= outOfStockThreshold\n        ) {\n            return 0;\n        }\n        return productAvailability.AvailableQuantity - outOfStockThreshold;\n    }\n\n    return 0;\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 is 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\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};\nconst _assembleNode = (\n    cartline: CartLine,\n    product: SimpleProduct,\n    props: IFlyoutCartLineItemsProps,\n    index: number,\n    foundProductAvailability?: ProductAvailableQuantity,\n    foundProductDeliveryOptions?: ProductDeliveryOptions\n): IFlyoutCartLineItemViewProps => {\n    const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText, removeItemClickHandler } = props;\n\n    const availableQuantityInStock = _getCartItemAvailableQuantity(\n        props.isStockCheckEnabled,\n        props.outOfStockThreshold,\n        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    // Check if the product is service or not by product type\n    const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\n\n    const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n    const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n    const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n    let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\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\n    return {\n        data: {\n            product,\n            cartline\n        },\n        hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\n        cartline: (\n            <CartLineItemComponent\n                data={{\n                    cartLine: cartline,\n                    product,\n                    catalogs: props.catalogs\n                }}\n                currentQuantity={cartline.Quantity}\n                maxQuantity={maxQuantity}\n                isOutOfStock={!isServiceItem && 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                isQuantityEditable={false}\n                primaryImageUrl={product.PrimaryImageUrl}\n                displayMode='COMPACT'\n                telemetryContent={props.telemetryContent}\n                channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\n                deliveryLocation={_renderDeliveryLocation(cartline, props)}\n            />\n        ),\n        remove: (\n            <Button\n                className='msc-cart-line__remove-item'\n                onClick={onRemoveClickHandler}\n                title={removeButtonText}\n                {...removeCartItemAttribute}\n            >\n                {removeButtonText}\n            </Button>\n        ),\n        storeLocation: _renderStoreLocation(cartline, props)\n    };\n};\n\nconst _renderDeliveryLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): string | undefined => {\n    let deliverylocation;\n    if (cartLine && cartLine.FulfillmentStoreId) {\n        const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n        let foundProductDeliveryOption;\n        if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n            foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n                return deliveryOption && deliveryOption.ProductId === cartLine.ProductId;\n            });\n        }\n        const delivery = foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === cartLine.DeliveryMode);\n        const location = delivery?.Description;\n\n        // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n        if (location) {\n            deliverylocation = `${location}, ${orgUnitName}`;\n        } else {\n            deliverylocation = `${orgUnitName}`;\n        }\n    } else {\n        deliverylocation = props.resources.shippingText;\n    }\n    return deliverylocation;\n};\n\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\n    if (cartLine && cartLine.FulfillmentStoreId) {\n        const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n        if (orgUnitName) {\n            return (\n                <div className='msc-cart-line__bopis-method'>\n                    <span className='pick-up'>{orgUnitName}</span>\n                </div>\n            );\n        }\n    }\n\n    return null;\n};\n\nconst _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\nconst _assembleCartlines = (\n    cartlines: CartLine[],\n    products: SimpleProduct[] | undefined,\n    props: IFlyoutCartLineItemsProps\n): IFlyoutCartLineItemViewProps[] | null => {\n    const reactNodes: IFlyoutCartLineItemViewProps[] = [];\n\n    if (!products || products.length === 0) {\n        props.context.telemetry.error('Cartlines content is empty, module wont render');\n        return null;\n    }\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        if (props.productAvailabilites && props.productAvailabilites.length > 0) {\n            foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n                return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n            });\n        }\n        let foundProductDeliveryOption;\n        if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n            foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n                return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n            });\n        }\n        if (product) {\n            reactNodes.push(\n                _assembleNode(\n                    cartline,\n                    product,\n                    props,\n                    index,\n                    foundProductAvailability?.ProductAvailableQuantity,\n                    foundProductDeliveryOption\n                )\n            );\n        }\n    });\n\n    return reactNodes;\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\n    const { products, cartlines } = props;\n    return _assembleCartlines(cartlines, products, props);\n};\n"],"names":["ProductPickUpOptionsForCartLineItems","constructor","apiSettings","getCacheKey","buildCacheKey","this","getCacheObjectType","dataCacheType","async","getPickUpOptionsForCartLineItems","input","context","channelId","Error","cart","getCartState","products","getActiveCartProductsAction","ActiveCartProductsInput","response","undefined","ArrayExtensions","hasElements","Promise","resolve","ProductsDataActions","callerContext","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","map","product","RecordId","createObservableDataAction","id","action","inputData","requestContext","CartLineGroupItems","props","cartlines","hasInvoiceLine","_assembleGroupInvoiceCartlines","cartLines","reactNodes","length","carLineViewProps","assembleCartlines","push","_assembleGroupCartlines","telemetry","error","getGroupByStorePickup","items","groupBy","item","FulfillmentStoreId","groupDelivery","DeliveryMode","cartLinesGroup","Object","entries","forEach","_ref","deliveryType","groupByDeliveryType","keys","key","index","cartLine","getPromotionData","ctx","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","then","promotionOptions","catch","exception","Cart","React","super","isQuantityLimitsFeatureEnabled","_isMounted","promotionPopupId","promotionLinkClick","event","setState","showPromotionDialog","state","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","imageSettings","viewports","xs","q","w","h","sm","lg","lazyload","removeItemFromCartHandler","cartlineToRemove","data","result","cartLineIds","LineId","toString","removeCartLines","validateCart","warning","debug","moveToWishlistSuccessHandler","cartline","status","updateCartlineQuantity","cartlineToUpdate","quantity","lineIndex","cartLineQuantityUpdatedAsync","cartActionResult","message","cartlinesErrors","ObjectExtensions","isNullOrUndefined","_cartActionResult$err","lineUpdateFailure","ValidationFailures","ErrorContext","validationResults","LocalizedMessage","errorDetails","ValidationResultsPairs","fulfillmentStoreIdUpdated","actionContext","telemetryContent","getTelemetryObject","request","telemetryPageName","friendlyName","payLoad","getPayloadObject","bind","isCartValid","productPickUpOptions","config","_this$props$data$cart","getOrderQuantityLimitsFeatureFlag","_isChannelLimitsFeatureEnabled","showAvailablePromotions","CartLines","reaction","_this$props$data$cart2","_this$props$data$cart3","componentWillUnmount","shouldComponentUpdate","nextProps","nextState","render","_this$props$context$r","_cart$cart$CartLines","_this$props$data$prod","_this$props$data$feat","_featureState$result","user","isAuthenticated","signInUrl","resources","guestCheckoutUrl","getUrlSync","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","emailDeliveryModeCode","channel","EmailDeliveryModeCode","validInventoryAcrossCartLines","validateCartLinesInventory","productAvailabilites","hasError","isValid","some","RetailMultiplePickupFeatureState","featureState","find","Name","multiplePickUpEnabled","IsEnabled","isMultipleCatalogsFeatureEnabled","currentCatalogId","getCatalogId","validateCatalogId","getCartLinesGroup","contentAction","etext","TelemetryConstant","Checkout","checkoutBySignInAttributes","getTelemetryAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","viewProps","_objectSpread","className","classnames","title","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","promoCode","_getPromoCode","_getPromotions","typeName","removePromoAriaLabelFormat","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","Button","assign","disabled","href","checkoutButtonTitle","checkoutAsGuestButton","showGuestCheckoutButton","guestCheckoutButtonTitle","expressCheckoutButton","slots","paymentExpress","ExpressCheckoutSectionWrapper","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","addToOrderTemplateDialogResources","_generateAddToOrderTemplateDialogResources","createOrderTemplateDialogResources","_generateOrderTemplateNameDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","isMultipleCatalogFeatureEnabledInHq","catalogId","orderTemplates","customerInformation","checkoutBlockedDueToUnavailableFunds","storeSelector","removeItemClickHandler","waitingComponent","Waiting","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","renderView","_this$props$data$cart4","_cart$cart","isChannelTypeB2B","cartPromotions","showPromotionPopup","onSeeAllClick","onCloseButtonClick","promotions","promotionStringHeading","promotionLinkText","promotionPopupHeading","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","element","_element$data","ProductId","outOfStockErrorMessage","allErrors","_cartline$data","ItemTypeValue","ReleasedProductType","Service","_cartline$data$produc","fullError","filter","line","Wrapper","tag","Alert","isOpen","color","assertive","outOfStockErrorMessageHeader","header","errors","InvoiceSummary","orderTotalLabel","totalAmountLabel","invoiceLabel","_this$props","_featureState$result2","_this$props$context$r2","channelDeliveryOptionConfig","channelConfiguration","retailMultiplePickUpOptionEnabled","isShowOrHideTaxEnabled","app","isEnableShowOrHideSalesTaxECommerceEnabled","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","otherChargeLabel","otherCharges","taxLabel","estimatedTaxLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","priceFree","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","freePriceText","originalPriceText","currentPriceText","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","wishlists","PickupDeliveryModeCode","modules","storeSelectorId","CartLineItems","storeSelectorModuleId","productDeliveryOptions","deliveryOptions","catalogs","isStockCheckEnabled","enableStockCheck","maxCartlineQuantity","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","shouldIgnoreWarehouse","warehouseAggregation","gridSettings","retailMulitplePickupFeatureState","sizeString","productDimensionTypeSize","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","amountString","productDimensionTypeAmount","quantityDisplayString","quantityDisplayText","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","discountStringText","shippingChargesText","shippingCharges","salesAgreementPricePrompt","priceEditorResources","addToWishlistButtonText","removeFromWishlistButtonText","removeButtonText","removeCartButtonText","shipItText","shipInsteadDisplayText","pickitUpText","pickItUpDisplayText","changeStoreText","changeStoreDisplayText","storeSelectorStateManager","outOfStockText","outOfRangeOneText","errorMessageOutOfRangeOneLeft","outOfRangeFormatText","errorMessageOutOfRangeFormat","cartState","orgUnitLocations","updateCartLinesQuantitySuccessHandler","locationChangedHandler","defaultWishlistName","pickupDeliveryModeCode","includeErrors","showOutOfStockErrors","showShippingChargesForLineItems","itemAddedToOrderTemplateDialogResources","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateMessage","addItemToOrderTemplateError","productAvailability","isAbsoluteUrl","urlCheck","returnURL","MsDyn365","isBrowser","window","location","origin","includes","AsyncResult","validateCartAsync","_featureStatuses$find2","featureStatuses","_featureStatuses$find","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_this$props$context","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","IsB2b","_featureStatuses$find3","isChannelLimitsFeatureEnabledInHq","_this$props$data$feat4","_featureState$result3","_this$props$data$chan","_this$props$data$cata2","_this$props$data$chan2","_this$props$data$cart5","cartLinesPickUpOptions","__decorate","observer","MediaGallery","_this","_props$config$zoomedI","_inlineZoomDivRef","Map","fullScreenOverlayButtonRef","player","defaultGalleryImageSettings","md","cropFocalRegion","defaultThumbnailImageSettings","onExiting","animating","onExited","next","removeInlineZoomStyle","isLastItem","nextIndex","activeIndex","goToIndex","updateZoomedInImage","previous","images","mediaGalleryItems","isFirstItem","autoplay","currentIndex","mediaItems","_mediaItems","_this$player$current","mediaTypeValue","MediaType","Video","current","play","_this$player$current2","pause","getImagesData","skipImageValidation","OmniChannelMedia","_this$props$config$im","_this$props$config$im2","source","imageSource","mediaLocations","mediaLocationsForSelectedVariant","mediaLocation","_mediaLocation$Uri","src","Uri","altText","getAltText","shouldUseCmsAltText","AltText","additionalProperties","IsApplicableForChildEntities","isApplicableForChildEntities","curatedImages","_filterMasterImageFromVariant","_renderCarouselItemVideo","mediaData","videoData","_videoData$_links","options","playerResources","videoMetaData","videoId","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","attributes","editProps","Player","ref","playerData","isEditor","params","_renderEmptyImage","_getCarouselItem","image","isInPopup","arguments","Image","fallBackSrc","fallbackImage","loadFailureBehavior","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","role","tabIndex","onClick","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","getVideoThumbNailItem","classes","_refHandler","divRef","set","which","KeyCodes","Enter","Space","preventDefault","_renderVideoThumbnail","fullScreenTitleText","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_mapProductToImageData","carouselprops","Carousel","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","classNames","ImagefullView","altTextSource","mediaGalleryImages","isImageZoomed","isInitialLoad","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","isMobile","variant","VariantType","Viewport","_this$props$config$im3","_this$props$context$r3","shouldUpdateOnPartialDimensionSelection","_setRenderType","_this$props$config$th","validateProductImages","thumbnailImageSettings","_setImages","_this$props$config$th2","getValidProductImages","productVariant","_product$productVaria","_this$props$context$a","_this$props$config$th3","getProductImages","fireImmediately","_this$props$config$th4","_this$props$context$a2","isVertical","thumbnailsOrientation","isFullscreenAllowed","allowFullScreen","zoomViewMode","imageZoom","emptyPlaceHolderImage","placeholderImageName","_this$props$context$r4","getFallbackImageUrl","ItemId","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","moduleProps","Modal","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","JSON","stringify","lastUpdate","defaultKey","_getEmptyThumbnailItem","zoomView","curatedImage","mediaToSet","all","URL","searchParams","get","getVideoMetadataFromApi","Date","now","media","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","MasterProductId","itemId","_item$additionalPrope","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","String","_handleMobileViewZoomedImageClick","target","currentTarget","mobileZoomedInImageClassName","style","transform","classList","remove","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","Number","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","add","scrollTo","_this$props$config$da4","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","_product$PrimaryImage","PrimaryImageUrl","_this$fullScreenOverl","focus","parentDiv","children","querySelector","removeAttribute","removeContainerZoomStyle","_renderCartlines","cartEmptyText","_cartLine$cartlineId","cartlineId","pickUpInStore","Node","ContainerProps","defaultComponent","addToOrderTemplate","addToWishlist","renderCartLinesGroupHeader","pickUpText","shippingText","emailShippingText","titleSeparate","_cartLine$pickUpInSto4","groupTitle","isBopisSelected","StringExtensions","isNullOrEmpty","toLowerCase","renderCartLinesGroupTitle","_cartLine$pickUpInSto","_cartLine$pickUpInSto2","_cartLine$pickUpInSto3","deliveryOption","orgUnitName","_props$cart","_props$cart2","errorData","renderModuleAttributes","promotionMessageWrapper","promotionMessage","promotionSeeAllLink","promotionDialog","_props$context$action","emailshippingText","emptyCartText","renderCartLinesGroup","_renderInvoiceSummarylines","invoiceSummaryLines","invoices","giftCard","loyalty","_renderOrderSummarylines","orderSummaryLines","subtotal","shipping","otherCharge","tax","totalDiscounts","getMiniCartData","miniCartData","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","availableQuantity","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","CartIcon","getSortedCartLines","sortOrder","lines","sort","item1","item2","_item2$LineNumber","_item1$LineNumber","LineNumber","_item1$LineNumber2","_item2$LineNumber2","_getImageSettings","_removeItemFromCartHandler","payload","TelemetryEvent","CheckOut","ViewShoppingBag","viewShoppingBagAttributes","_this$props$data$orgU","_setQuantityLimitsFeatureFlag","_validateCart","componentDidUpdate","prevProps","_this$state$miniCartD","_this$state$miniCartD2","enableHoverCart","isAnonymousCheckout","cartUrl","_getCheckoutURL","shouldShowMiniCart","isProductAddedToCart","addToCartBehavior","AddToCartBehavior","showMiniCart","includeFlyout","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","replace","flyoutTitle","flyoutTooltip","UncontrolledTooltip","placement","hideArrow","trigger","displayMode","shouldShowCloseButton","cartPageUrl","hideAriaHidden","price","TotalAmount","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","feature","cartIcon","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","miniCartWrapper","miniCartItemWrapper","goToCartButton","totalPrice","_cart$result$cart$Ver","_cart$result","cartVersion","Version","lastValidatedCartVersion","msdyn365Commerce","FlyoutCartLineItems","cartLinesSortOrder","outOfStockThreshold","_renderThumbnails","thumbnails","_renderThumbnailItem","Module","PromoBannerCloseButton","closeButtonAriaLabel","label","onClose","PromoBannerClose","PromoBannerLinks","links","onTextChange","editableLinks","_mapEditableLinks","Msdyn365","linkdata","link","linkText","editableLink","ariaLabel","linkUrl","destinationUrl","openInNewTab","onTelemetryClick","PromoBannerText","text","onEdit","PromoBanner","isVisible","handleTextChange","bannerMessages","value","handleLinkTextChange","linkIndex","_next","_isLastItem","_goToIndex","_previous","_isFirstItem","_onDismiss","dismissEnabled","hideFlipper","closeButtonLabel","bannerText","bannerAriaLabel","onDismiss","handleLinks","handleText","promoBannerProps","promoBannerTextProps","promoBannerLinksProps","contentProps","promoBannerText","carouselProps","closeButton","AddToCartProductListComponent","_quickOrderTemplate$q","_quickOrderTemplate$q2","quickOrderTemplate","quickOrderTemplateLines","fullProduct","ProductDetails","productListLine","Quantity","buttonLabel","quickOrderGridBuySelectedButtonText","buttonAriaLabel","quickOrderGridBuySelectedButtonAriaLabel","dialogStrings","_props$resources$quic","_props$resources$quic2","_props$resources$quic3","_props$resources$quic4","_props$resources$quic5","_props$resources$quic6","_props$resources$quic7","_props$resources$free","_props$resources$orig","_props$resources$curr","_props$resources$adde","_props$resources$quic8","_props$resources$quic9","goToCartText","quickOrderGridGoToCartText","continueShoppingText","quickOrderGridDialogCloseText","closeNotificationLabel","quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel","headerItemOneText","quickOrderGridSingleItemText","headerItemFormatText","quickOrderGridMultiLineItemFormatText","headerLinesFormatText","quickOrderGridMultiLinesFormatText","headerMessageText","quickOrderGridHeaderMessageText","addedQuantityText","buyAgainNotificationTitle","quickOrderGridBuySelectedAddingToCartErrorNotificationTitle","buyAgainNotificationCloseAriaLabel","getDialogStrings","orderDetailProducts","quickOrder","orderDetails","quickLine","_quickLine$fullProduc","salesLine","OrderDetailsProduct","getOrderDetails","AddToCartComponent","addToCartText","addToCartArialLabel","navigationUrl","shouldSkipSiteSettings","orderDetailsProducts","onError","getQuickOrderGridAddToCartDialog","moduleClassName","_result$cartActionRes","handlers","onErrorMessage","removeActionHandler","removeProductList","productList","Id","removeQuickOrderList","QuickOrderGridDrawer","_props$collapseProps$","_props$collapseProps","toggle","_isManuallyToggled","onToggle","previousState","collapseProps","_drawerGlyphClass","toggleGlyphClassName","closeGlyph","isAnimateGlyph","_drawerOpenGlyph","openGlyph","_drawerCloseGlyph","drawerClass","drawerButtonClassName","toggleButtonProps","block","isDisabled","_generateDrawerButtonInnerMarkup","Collapse","isCollapseState","drawerButtonTextClass","toggleButtonClassName","headingDrawerClass","descriptionDrawerClass","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","QuickOrderGridFormComponent","productTextInput","quantityTextInput","quickOrderGridState","maxChars","minQuantity","maxQuantity","isAddtoListDisabled","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","handleQuantityChange","handleInputChange","handleAddProductListClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","type","onChange","quantityNode","pattern","maxLength","addToListBtn","userMessage","stateMessage","statusCssString","messageGlyph","messageText","QuickOrderGridProduct","productLine","isSelected","observable","QuickOrderGridDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderGridProductNumberText","quickOrderGridProductText","quickOrderGridUnitPriceText","quickOrderGridUnitOfMeasureText","quickOrderGridQuantityText","quickOrderGridActionsText","QuickOrderGridMobileHeaderCellsComponent","QuickOrderGridTableHeaderComponent","rowClassName","headerCells","defaultImageSettings","QuickOrderGridTableRowProductImageComponent","_props$data$product$p","_props$context$reques","_props$imageSettings","fallbackImageUrl","containerClassName","setShowPreviousActions","onChangeHandler","onChangeQuantity","itemKey","newValue","onRemoveHandler","onRemoveItem","quickOrderGridProductKey","QuickOrderGridExtraActionsPopupComponent","_props$data$product$p2","quickOrderGridViewDetailsButtonAriaLabel","quickOrderGridViewDetailsButtonText","shouldShowActions","setShowActions","useState","productUrl","isNullOrWhitespace","getProductPageUrlSync","onClickViewDetails","shouldShowActionsNewValue","actionsContainerClassName","quickOrderGridRemoveItemButtonAriaLabel","QuickOrderGridDesktopTableRowCellComponent","_props$data$product$p3","min","max","_product$Dimensions","_productListLine$Line","Dimensions","dimension","_dimension$DimensionV","DimensionValue","Value","dimensionValue","join","quickOrderGridProductDimensionsSeparator","moduleId","moduleTypeName","PriceComponent","renderProductPrice","UnitOfMeasure","renderUnitOfMeasure","IncrementalQuantity","currentCount","quickOrderGridInputQuantityAriaLabel","quickOrderGridDecrementButtonAriaLabel","quickOrderGridIncrementButtonAriaLabel","isGiftCard","IsGiftCard","callbacks","QuickOrderGridMobileTableRowCellComponent","_props$data$product$p4","_productListLine$Line2","QuickOrderGridTableRowComponent","QuickOrderGridTableComponent","setIsMobile","isMobileView","quickOrderGridProducts","isOrderQuantityLimitsFeatureEnabled","updateViewport","addEventListener","headerClassName","quickOrderProduct","_product$ProductDetai","_quickOrderProduct$pr","_quickOrderProduct$pr2","behavior","Behavior","MinimumQuantity","MaximumQuantity","Math","ProductPrice","callBacks","QuickOrderGrid","_this$props$data$feat5","_cartConfiguration$re","_cartConfiguration$re2","_waitTime","_dimensionUpdateQueueMaxLength","_errorCssClass","_errorCssGlyphClass","_dimensionUpdateQueue","FinitePromiseQueue","_dimensions","_initializedDimensions","Set","_cssClassNameConfigure","_className","_isOrderQuantityLimitsFeatureEnabled","_applyDefaultOrderSettingsForCartLine","_quickOrderGridCallbacks","initializeDimension","initializedDimension","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","_this$state$productDi","size","productDimensions","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_quickOrderGridRowCallbacks","_removeItemRowFromTable","productListLineId","_changeRowQuantity","_removeProductList","token","ProductListsDataActions","reload","_updateStatusState","quickOrderGridDeleteProductListFailedText","_handleInputChange","query","productResponse","_cancellabelDebounce","cancel","isQuickOrderGridFormExpanded","_debounce","getScanResult","GetScanResultInput","results","Product","ProductDimensionFull","_updateQuantitiesInState","setTimeout","_handleQuantityChange","_this$state$productRe","currentValue","parseInt","inputElement","_quantityInput","HTMLInputElement","minimumQuantity","needToUpdateUIValue","_behavior$MinimumQuan","newCurrentValue","isNaN","setAttribute","_this$state$productRe2","ProductDimensionType","Color","Configuration","Size","Style","hasProductDimensions","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","dimensionKey","configureErrors","errorState","mappedDimensions","_this$_updateDimensio","DimensionTypeValue","_updateDimensionValue","ExtensionProperties","selectedProduct","newProduct","getSelectedVariant","SelectedVariantInput","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","productDimensionFull","newValueId","DimensionValues","_getDimensionErrorString","dimensionTypeValue","amountErrorMessage","quickOrderGridproductDimensionTypeAmountErrorMessage","quickOrderGridproductDimensionTypeColorErrorMessage","quickOrderGridproductDimensionTypeConfigurationErrorMessage","quickOrderGridproductDimensionTypeSizeErrorMessage","quickOrderGridproductDimensionTypeStyleErrorMessage","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderGridWrongQuantityErrorMsg","quickOrderTemplateLinesData","orderLineIndex","findIndex","newProductListLine","previousQuantity","_objectWithoutProperties","_excluded","list","newLine","updatedLines","updatedProductList","ProductListLines","update","ActiveProductListInput","ProductListId","_isChannelMultipleCatalogsFeatureEnabled","_addItemToProductListLine","quickOrderGridAddedToGridSuccessMessage","quickOrderGridAddedToGridFailureMessage","quickOrderGridAddedToGridDuplicateError","productListId","_productResponse$Defa","_createProductList","AddItemToProductListInput","DefaultUnitOfMeasure","addItemToProductListAction","name","CreateProductListInput","ProductListType","QuickOrder","createProductList","_productTextInput","_telemetryContent","_quickOrderGridFormClass","_quickOrderGridFormProductContent","_quickOrderGridFormMsgContent","ValidateDefaultOrderSettingsPerLine","_this$state$min","_this$state$max","quickOrderGridModuleHeading","quickOrderGridModuleDescription","quickOrderGridAddtogrid","quickOrderGridProductQuantityInputLabel","quickOrderGridProductInputLabel","quickOrderGridProductDimensionTypeColor","quickOrderGridProductDimensionTypeConfiguration","quickOrderGridSelectDimensionFormatString","quickOrderGridProductDimensionTypeSize","quickOrderGridProductDimensionTypeStyle","quickOrderGridProductDimensionTypeAmount","quickOrderGridModulePageHeading","productConfigureResources","selectDimensionFormatString","Heading","quickOrderGridProps","isB2bCustomer","actions","drawer","bulkPurchase","_renderBulkPurchase","quickOrderGridForm","quickOrderGridFormProductContent","quickOrderGridFormMsgContent","form","configure","getProductConfigure","container","_renderListContainer","orderActions","_renderQuickOrderGridActions","quickOrderGridDeleteButtonText","userMessageNode","topStateMessage","addProductListToBag","QuickOrderGridActionsView","isBulkPurchaseEnabled","bulkPurchaseSlots","containerClass","_renderQuickOrderTable","_initQuickOrderGridProducts","quickOrderGridProduct","validValues","tableClassName","_getMinQuantityForCartLineItem","_getMaxQuantityForCartLineItem","_getQuantity","_product$Behavior","_getIgnoreOrderSettings","_product$Behavior2","_cartConfiguration$re3","_cartConfiguration$re4","applyDefaultOrderSettingsForCartLine","_product$Behavior3","defaultQuantity","DefaultQuantity","dimensions","computed","PickUpInStore","_toggleBOPIS","openDialog","alreadySelectedLocation","OrgUnitNumber","onLocationSelected","orgUnitLocation","deliveryMode","updateCartLinePickupLocation","cartLineId","_onLocationChangedCallback","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","foundLocation","OrgUnitName","DeliveryOptions","_props$channelDeliver","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","delivery","pickup","deliveryCode","Code","PickupDeliveryModeCodes","option","toggleBopis","_renderShippingMethod","pickupInStoretext","bopisSelected","toggleBOPIS","checked","shipitText","pickUpInStoreText","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","Description","_assembleNode","foundProductAvailability","_foundProductAvailabi","_props$cartState","hsoConfig","nameOfWishlist","availableQuantityInStock","ProductAvailableQuantity","IsProductAvailable","AvailableQuantity","_getCartItemAvailableQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","shouldSkipStockCheck","IsInvoiceLine","estimatedDateProperty","property","Key","estimatedDateValue","StringValue","estimatedDate","StockThresholdprop","StockThresholdpropval","IntegerValue","StockThreshold","onhand","errorMessage","_getErrorMessage","currentQuantity","lineId","_props$productAvailab","finalErrorMessages","InventLocationId","WarehouseId","checkForErrors","errorsFoundByLineId","i","validation","onRemoveClickHandler","onRemoveClickFunction","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","isCustomPriceSelected","getProductUrlSync","_cartline$CatalogId","fullUrl","CatalogId","getInvoiceDetailsPageUrlSync","CartLineItemComponent","isOutOfStock","isQuantityEditable","quantityOnChange","primaryImageUrl","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","getProductByProductIdAndWarehouse","getProductByProductId","_productAvailability$2","_productAvailability$3","_cartline$WarehouseId","_productAvailability$","toUpperCase","HSOConfigprop","HSOConfig","productAvailabilities","cartLineMap","IsGiftCardLine","has","_cartLineMap$get","_cartLine$Quantity2","cartLineTotal","delete","_cartLine$Quantity","productAvailabilityMap","productId","Array","from","_cartLineMap$get2","cartLineQty","cartLineProduct","isStockedItem","_cartLineProduct$Beha","IsStockedProduct","isEmailDelivery","shouldSkipInventoryCheck","_isCheckoutBlockedDueToUnavailableFunds","checkoutBlockedDueToUnavailableFundsTitle","checkoutBlockedDueToUnavailableFundsMessage","titleId","ModalHeader","ModalBody","_promotion","_promotion$Promotion","Promotion","OfferName","ModalFooter","isOboRequest","_this$props$data$cust","AllowOnAccountPayment","CreditLimit","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","validateMediaLocaionAsync","pairs","pair","_imageSettings$viewpo","imageData","imageSettingsVal","imageConcatVal","http","XMLHttpRequest","open","onload","onerror","send","e","pageContext","allowFullscreen","inline","inlineZoomInit","productName","imageAltText","_context$app","validateMediaLocationAsync","_unused","_actionContext$reques","isPreview","commerceApiRequest","previewImageData","displayOrder","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","_this$state$mediaGall","_this$state$mediaGall2","commerceVideoMetadataRequest","renderThumbnailItem","GetThumbnailItemComponent","imageId","_props$config$thumbna","_props$callbackToggle","_props$callbackThumbn","keyCode","call","fetchpriority","GetEmptyThumbnailItemComponent","_props$config$thumbna2","xl","renderThumbnails","getMediaGalleryItems","CartView","cittaTelemetry","CittaTelemetry","cittaInstrumentationKey","createLogMessage","decodeURI","search","logMessage","trace","_moveToWishlistSuccessHandler","_updateCartlineQuantity","newQuantity","orderQuantityLimitsFeatureIsEnabled","updateCartLineQuantity","_fulfillmentStoreIdUpdated","_renderErrorBlock","_renderGIftCardError","freightCalculationText","orLabel","_goToPreviousPage","_renderBOPISBlock","_cartResult$cart","retry","cartResult","_cartResult","validationResult","validateForCheckoutAsync","ValidationFailuresByCartLines","refreshCart","refreshError","validateError","history","back","shipToAddressDisplayText","pickUpAtStoreWithLocationText","_props$cartlines","hasGiftCard","arr","val","arrVal","_arrVal$data","cartlinesLength","giftCardErrorMessage","_renderProgressBar","percentFilled","marginTop","width","_props$data$cart$resu","_props$cartlines2","perSpend","OrderSubTotal","ourGiftToYou","_line$data","amountOf50s","floor","marginBottom","ceil","_renderGiftWithPurchasMessage","_props$data$cart$resu2","NetPrice","subTotalHeadingLabel","CustomerContextualPrice","_renderSubTotal","hideTaxLine","_props$data$cart$resu3","_props$data$cart$resu4","_props$data$cart$resu5","_renderAmountDue","PickUpAtStoreComponent","PickUpAtStore","EmailDeliveryComponent","_ref2","EmailDelivery","LineItemComponent","_ref3","LineItem","pickUpAtStore","emailDelivery","LineItemGroupComponent","_ref4","LineItemDeliveryGroup","LineItemList","heading","lineItems","lineItem","LineItemsComponent","_ref5","LineItems","Header","editLink","itemsForPickup","itemsForShip","itemsForEmail","_props$context","isB2B","orderSummary","_props$data$checkout$10","checkout","checkoutCart","Price","_props$data$checkout$6","chargeLines","ChargeLines","chargeAmountInclTax","_props$orderSummary","chargeLine","IsShipping","chargeAmountInclTaxLocal","GrossAmount","_renderShippingInclTaxes","_props$data$checkout$","_props$data$checkout$2","_props$data$checkout$3","_props$data$checkout$4","_props$data$checkout$5","ChargeAmount","ShippingChargeAmount","otherChargesAmountFromLines","totalChargeAmountFromLines","chargesOverriden","displayOtherChargesAmount","shippingChargesFromLines","freightChargeCode","CalculatedAmount","ChargeCode","_renderOtherCharges","_props$data$checkout$11","OrderTotal","_renderTotalOrder","_props$data$checkout$7","DiscountAmount","totalSavingsLabel","_renderTotalSavings","_props$data$checkout$8","_props$data$checkout$9","shippingAmount","DeliveryModeChargeAmount","AmountDue","freeShippingAmount","_renderFreeShippingMessage","_getCheckoutSummaryText","paragraph","_props$context2","canShow","checkoutProps","headerProps","hasSalesOrder","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","termsAndConditionsProps","orderConfirmation","loading","alert","guidedForm","placeOrderButton","termsAndConditions","keepShoppingButton","isBusy","url","urlParams","URLSearchParams","orderToken","_renderUnder200sError","SubtotalAmount","market","oun","isB2BI","minimumOrder","discountLevel","LineDiscountGroup","_props$data$cart$resu6","_props$data$cart$resu7","_props$data$cart$resu8","_props$data$cart$resu9","TaxAmount","_renderTax","_props$data$cart$resu10","_props$data$cart$resu11","_props$data$cart$resu12","amountDueLabel","_props$data$cart$resu13","DiscountAmountWithoutTax","totalSavings","storeLocation","slides","renderConfigureDropdown","dropdown","containerProps","labelContainerProps","select","renderConfigure","dropdowns","renderForm","quickOrderForm","quickOrderProductContent","quickOrderMessageContent","PromoCode","_onInputChange","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","_addProductToCart","substatus","_renderForm","onSubmit","placeholder","_removePromotion","code","getAttribute","removePromoCodes","promoCodes","_calculateDiscount","discountAmount","DiscountLines","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","coupon","format","isCollapseOpen","productRecId","getByIdAsync","ProductTypeValue","BasePrice","AdjustedPrice","addProductsToCartInput","count","isAddedToCart","addProductToCart","console","log","InvoiceSummaryLine","cssLabel","_buildPaymentSummarySection","_computedLoyaltyAmount","checkoutState","loyaltyAmount","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardExtends","reduce","giftCardCounter","Balance","amount","totalAmountAfterGiftCard","loyaltyLabel","giftcardLabel","OrderSummaryLine","priceCurrency","currencyCode","_buildOrderSummarySection","Currency","getDeliveryMode","_channelDeliveryOptio","featureSate","pickupDeliveryMode","dM","SubtotalAmountWithoutTax","TaxOnNonShippingCharges","OtherChargeAmount","canShip","hasDeliveryMethod","hasShippingMethod","freightFee","getDeliveryConfiguration","deliveryModes","taxOnShippingCharge","TaxOnShippingCharge","shippingChargeAmount","otherChargeAmount","taxOnNonShippingCharges","isTaxGreaterThanZero","otherChargeAmountTotal","subtotalAmountActual","customerAccountAmount","customerAccount","customerAccountLabel","warehouseId","targetWarehouseValue","InventoryLocationId","propsContext","shouldRetry","_validationResult$Val","CartsDataActions","bypassCache","ValidationResultsByLineId","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","updateLineResult","_context$request$chan","isPickUpItem","isCartLineItemPickUpType","_assembleCartlines","_getProduct","foundProductDeliveryOption","foundProductDeliveryOptions","productMaxQuantity","lineMaxQuantity","isServiceItem","eoqQuantity","MultipleOfQuantity","finalErrorMessage","eoqErrorMessage","LineIndex","_i$DataValidationFail","_i$DataValidationFail2","_i$DataValidationFail3","DataValidationFailure","ErrorResourceId","_renderDeliveryLocation","deliverylocation","_foundProductDelivery","_renderStoreLocation","RemoveCartItem","removeCartItemAttribute","deliveryLocation"],"sourceRoot":""}