{"version":3,"sources":["webpack:///src/modules/quick-order/components/quick-order-drawer.tsx?25f0","webpack:///src/modules/quick-order/components/quick-order-form.tsx?61bd","webpack:///src/modules/quick-order/quick-order.tsx?7aab","webpack:///src/modules/social-share-item/social-share-item.tsx?e01b","webpack:///src/modules/video-player/video-player.tsx?cfb9","webpack:///src/modules/header/components/header-preferred-store.tsx?9138","webpack:///src/modules/header/components/logo.tsx?be23","webpack:///src/modules/header/components/nav-icon.tsx?49a1","webpack:///src/modules/header/header.tsx?4703","webpack:///src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?671e","webpack:///src/modules/wishlist-items/components/wishlist-item.tsx?1fe2","webpack:///src/modules/wishlist-items/components/wishlist-items-status-message.tsx?7062","webpack:///src/modules/wishlist-items/wishlist-items.tsx?3721","webpack:///src/order-summary-lineitem.tsx?86d9","webpack:///src/modules/media-gallery/utils/get-valid-product-images.ts?4e26","webpack:///src/modules/media-gallery/media-gallery.tsx?3b46","webpack:///src/modules/carousel/carousel.view.tsx?b19a","webpack:///src/modules/product-collection/product-collection.tsx?b9b8","webpack:///src/modules/promo-banner/components/close-button.tsx?939d","webpack:///src/modules/promo-banner/components/links.tsx?3133","webpack:///src/modules/promo-banner/components/text.tsx?834e","webpack:///src/modules/promo-banner/promo-banner.tsx?958e"],"names":["props","super","this","_toggle","bind","isManuallyToggled","state","isOpen","collapseProps","drawerGlyphClass","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","undefined","children","drawerClass","className","toggleButtonProps","onClick","block","disabled","color","_generateDrawerButtonInnerMarkup","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","location","glyphClass","e","preventDefault","setState","onToggle","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxChars","maxQuantity","disableAddtoCart","isQuickOrderFormExpanded","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","handleQuantityChange","handleInputChange","handleAddToCartClick","productNode","type","ref","onChange","target","value","quantityNode","pattern","maxLength","quantity","product","addToCartBtn","userMessage","stateMessage","statusCssString","messageGlyph","messageText","waitTime","dimensionUpdateQueue","dimensions","cssClassNameConfigure","quickOrderCallbacks","dimensionSelectedAsync","async","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","catch","error","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","resources","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","query","length","productText","cancellabelDebounce","cancel","telemetry","context","actionContext","requestContext","apiSettings","channelId","then","results","productResponse","Product","productDimensions","ProductDimensionFull","exception","debug","setTimeout","_addItemToCart","data","cart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","productAvailableQuantity","_validateCart","result","isOrderQuantityLimitsFeatureEnabledInHq","featureState","find","Name","IsEnabled","defaultOrderQuantityLimitsFeatureConfig","request","app","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","deliveryOptions","callerContext","queryResultSettings","RecordId","emailDeliveryModeCode","channel","EmailDeliveryModeCode","defaultDeliveryOption","hasElements","DeliveryOptions","Code","isOrderQuantityLimitsFeatureEnabled","addProductToCartInput","count","enableStockCheck","config","availableQuantity","ProductAvailableQuantity","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","deliveryMode","addProductToCart","status","substatus","maxQtyLimitReachedMessage","_getMaxQtyMessage","errorDetails","LocalizedMessage","warning","_handleQuantityChange","currentValue","Number","parseInt","inputElement","quantityInput","current","HTMLInputElement","isNaN","setAttribute","toString","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","dimension","isGiftCard","IsGiftCard","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeSize","productDimensionTypeAmount","productDimensionTypeStyle","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","key","Object","keys","configureErrors","errorState","mappedDimensions","map","DimensionTypeValue","DimensionValue","ExtensionProperties","filter","selectedProduct","Promise","resolve","reject","newProduct","MasterProductId","variantProduct","newAvailableQuantity","_getDimensionErrorString","dimensionTypeValue","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","missingDimensions","Dimensions","Value","userMsg","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","viewport","device","Type","telemetryContent","telemetryPageName","friendlyName","isInitialState","isMobile","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","productConfigureResources","selectDimensionFormatString","viewProps","quickOrderProps","moduleProps","contentProps","isB2B","drawer","tag","quickOrderForm","form","configure","isMobileView","renderView","productInventoryInfo","curQuantity","quickOrderMaxQuantityLimitText","maxQuantityForLineItem","maxQuantityForCartLineItem","replace","minInventory","Math","min","forEach","_getSocialShareItem","viewprops","SocialShareItem","SocialShareItemElement","src","icon","isBrowser","socialMedia","Facebook","postUrl","document","URL","id","typeName","Twitter","Pinterest","Linkedin","Mail","options","video","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","videoId","title","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","player","editProps","playerData","isEditor","params","handleClick","_findPreferreStoreOnClick","storeSelectorStateManager","slots","storeSelector","storeName","preferredStore","StoreName","headerPreferredStoreText","headerPreferredStoreAriaLabel","modules","storeSelectorId","openDialog","showMapViewLink","onLocationSelected","orgUnitLocation","message","payLoad","Logo","attributes","_renderLogo","link","linkUrl","destinationUrl","href","ariaLabel","openInNewTab","_renderImage","image","gridSettings","imageSettings","viewports","xs","q","w","h","lg","lazyload","loadFailureBehavior","moduleType","imagePropertyName","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","isExpanded","targetId","handleLinkTextChange","linkIndex","event","myAccountLinks","linkText","popOverRef","_toggleNavbar","_togglePopover","_keydown","mobileMenuCollapsed","signinPopoverOpen","customer","accountInformation","FirstName","window","addEventListener","removeEventListener","user","cartLabel","cartQtyLabel","logoLink","logoImage","headerClassName","cartIconSlot","_getSlot","menuBarSlot","searchSlot","siteOptionsSlot","preferredStoreSlot","logo","wishListIconDesktop","showButtonTooltip","wishlistTooltipText","wishListIconMobile","cartIcon","navIcon","menuBar","search","siteOptions","HeaderTag","HeaderContainer","HeaderTopBarContainer","Divider","MobileMenuContainer","wrapClassName","toggle","MobileMenuHeader","MobileMenuBodyContainer","MobileMenuLinksContainer","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","displayName","placement","signInLink","_getSigninButton","signOutLink","_getSignOutButton","accountInfoDropdownButton","_getAccountInfoDropdownButton","accountLinks","_getAccountLinks","slotName","SignIn","signInLinkText","signInUrl","signInLinkAriaText","SignOut","signOutLinkText","signOutUrl","signOutLinkAriaText","MyProfile","innerRef","cta","index","contentAction","etext","editableLink","role","onTextChange","keyCode","WishlistItemDimension","dimensionValue","WishListItemActions","itemKey","handlers","onAddToCart","onRemoveItem","_renderProductImage","heading","fallbackImage","defaultImageSettings","xl","cropFocalRegion","altText","fallBackSrc","_renderPrice","price","moduleId","moduleTypeName","freePriceText","originalPriceText","currentPriceText","_renderProductDimensions","_renderAriaLabel","formattedPrice","BasePrice","cultureFormatter","formatCurrency","CurrencyCode","productDimension","join","WishlistItemsStatusMessage","errorType","text","handleHeadingChange","_onDismiss","_renderHeading","onEdit","productAvailability","addedToCartSuccessMessage","addedToCartFailureMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","ProductDetails","productId","CartLines","item","ProductId","Quantity","_getInventoryValueMessage","_removeItemFromWishlist","wishlists","userToken","isAuthenticated","token","wishlistLineId","_getWishlistLineIdFromProductId","Id","LineId","commerceList","castCommerceList","update","products","castSimpleProducts","_inventoryLabel","StockLevelLabel","_inventoryClassName","StockLevelCode","toLowerCase","_isProductInStock","productResult","IsProductAvailable","CommerceListLines","foundWishlistItem","commerceListLine","emptyWishlistText","wishlistErrorGettingWishlist","errorProps","WishlistItems","statusMessage","productsList","emptyViewProps","Products","ProductDimensions","_renderProductList","priceFree","addToCartButtonText","outOfStockText","removeButtonText","enableImageProductLink","input","productUrl","isInStock","removeFromWishlistText","addToCartText","wishlistState","inventoryInformationLabel","inventoryLabelClassName","PrimaryImageUrl","onDismiss","inventoryCssName","ItemId","productAttributes","isServiceItem","ItemTypeValue","productImage","productLink","productPrice","entireProductLink","productAriaLabel","productName","addToCartButton","inventoryInformation","removeButton","productStatusMessage","WishlistItem","ProductPrice","maxQuantityLimitText","productInventoryCollection","OrderSummaryLine","label","toBeCalculatedText","freeText","cssLabel","CustomerContextualPrice","_computedLoyaltyAmount","checkoutState","loyaltyAmount","getDeliveryMode","featureSate","channelDeliveryOptionConfig","pickupDeliveryMode","PickupDeliveryModeCodes","dM","OrderSummary","SubtotalAmount","TaxAmount","DiscountAmountWithoutTax","TotalAmount","OtherChargeAmount","canShip","hasDeliveryMethod","hasShippingMethod","freightFee","channelConfiguration","retailMultiplePickUpOptionEnabled","pickupDeliveryModeCode","PickupDeliveryModeCode","deliveryModes","cartLine","DeliveryMode","ShippingChargeAmount","some","getDeliveryConfiguration","reactNodes","subtotal","subTotalLabel","tax","taxLabel","orderTotal","orderTotalLabel","otherCharge","otherChargeLabel","shipping","shippingLabel","giftCardAmount","giftCardTotalValue","giftCardExtends","reduce","giftCard","Balance","amount","_computeGiftCardAmount","totalAmountAfterGiftCard","loyalty","loyaltyLabel","giftcardLabel","totalDiscounts","totalDiscountsLabel","getValidProductImages","actionInput","mediaLocations","all","mediaLocation","validateMediaLocaionAsync","pairs","pair","imageData","Uri","AltText","imageSettingsVal","imageConcatVal","http","XMLHttpRequest","open","send","_inlineZoomDivRef","Map","defaultGalleryImageSettings","sm","md","defaultThumbnailImageSettings","onExiting","animating","onExited","next","isLastItem","nextIndex","activeIndex","goToIndex","previous","isFirstItem","mediaGalleryItems","_getCarouselItem","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","tabIndex","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","which","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_mapProductToImageData","galleryImageSettings","carouselprops","items","_renderCarouselItemImageView","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","handleOnExited","handleOnExiting","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","isImageZoomed","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","source","imageSource","curatedImage","images","thumbnailImageSettings","incrementedIndex","imageIndex","includes","lastUpdate","Date","now","validateProductImages","isVertical","thumbnailsOrientation","allowFullscreen","allowFullScreen","zoomViewMode","imageZoom","zoomView","MediaGallery","Modal","CarouselProps","_renderEmptyImage","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","_getEmptyThumbnailItem","_renderImageInContainerOnZoom","_renderImageInlineOnZoom","_renderImageFullScreenOnZoom","divRef","set","dataScale","onMouseOver","shouldSkipToMainImage","onMouseMove","innerWidth","onMouseOut","fullScreenTitleText","parentDiv","get","querySelector","removeAttribute","carouselContainer","renderModuleAttributes","closeAnimation","pause","pauseOnHover","ride","autoplay","transitionType","content","hideFlipper","dismissEnabled","handleDismissCarousel","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","flipperPrevious","flipperNext","_getProduct","trace","allowBackNavigation","breaCrumbType","breadcrumbType","allowBack","quickviewSlot","quickview","ProductContainer","productComponent","ratingAriaLabel","quickViewButton","_getActivePrice","productRecIds","prod","projectDomain","ChannelId","CatalogId","catalogId","affliations","customerInput","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","CustomerId","AccountNumber","push","activePricesResponse","productPrices","activePrice","Price","max","TradeAgreementPrice","AdjustedPrice","Error","productCollection","enableAffiliationBasedPricing","isCarousel","layout","headingComponent","productCollectionViewProps","ProductCollectionContainer","GridComponentProps","PromoBannerCloseButton","closeButtonAriaLabel","onClose","PromoBannerClose","PromoBannerLinks","links","editableLinks","_mapEditableLinks","linkdata","PromoBannerText","isVisible","handleTextChange","bannerMessages","_next","_isLastItem","_goToIndex","_previous","_isFirstItem","closeButtonLabel","handleLinks","handleText","promoBannerProps","PromoBannerTextProps","PromoBannerLinksProps","closeButton"],"mappings":"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","file":"static/js/17.80b08b85721f4b62.chunk.js","sourcesContent":["/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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 { IQuickOrderDrawerProps } from './quick-order-drawer-props';\n\nexport interface IQuickOrderDrawerState {\n isOpen: boolean;\n}\n\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\n\nexport default class QuickOrderDrawer extends React.Component {\n public state: IQuickOrderDrawerState;\n\n private readonly drawerOpenGlyph: string;\n\n private readonly drawerCloseGlyph: string;\n\n private readonly drawerGlyphClass: string;\n\n private isManuallyToggled: boolean;\n\n constructor(props: IQuickOrderDrawerProps) {\n super(props);\n this._toggle = this._toggle.bind(this);\n this.isManuallyToggled = false;\n this.state = { isOpen: (props.collapseProps && props.collapseProps.isOpen) || false };\n this.drawerGlyphClass = classnames('drawer__glyph',\n this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n\n if (this.props.animateGlyph) {\n this.drawerOpenGlyph = classnames(this.drawerGlyphClass,\n this.props.openGlyph ? this.props.openGlyph : (this.props.closeGlyph ? this.props.closeGlyph : ''));\n this.drawerCloseGlyph = this.drawerOpenGlyph;\n } else {\n this.drawerOpenGlyph = classnames(this.drawerGlyphClass,\n this.props.openGlyph ? this.props.openGlyph : '');\n this.drawerCloseGlyph = classnames(this.drawerGlyphClass,\n this.props.closeGlyph ? this.props.closeGlyph : '');\n }\n }\n\n public render(): JSX.Element {\n const collapseProps = { ...this.props.collapseProps } as ICollapseProps;\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 } else {\n this.state.isOpen = collapseProps.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className ? this.props.className : '');\n this.isManuallyToggled = false;\n return (\n
\n \n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\n \n \n
\n );\n }\n\n private _generateDrawerButtonInnerMarkup(collapseState: boolean): JSX.Element {\n const drawerButtonTextClass = classnames('drawer__buttontext', this.props.toggleButtonClassName ? this.props.toggleButtonClassName : '');\n return (\n <>\n

\n {this.props.moduleHeadingText}\n

\n \n {this.props.moduleDescriptionText}\n \n {this._generateGlyphMarkup('drawer__glyph__end', collapseState)}\n \n );\n }\n\n private _generateGlyphMarkup(location: string, collapseState: boolean): JSX.Element {\n let glyphClass = collapseState ? this.drawerOpenGlyph : this.drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return (\n \n );\n }\n\n private _toggle(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n this.setState({ isOpen: !this.state.isOpen });\n this.isManuallyToggled = true;\n if (this.props.onToggle) {\n this.props.onToggle(this.state);\n }\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderState } from '../quick-order';\n\nexport interface IQuickOrderFormProps {\n disableAddtoCart: boolean | undefined;\n isQuickOrderFormExpanded: boolean | undefined;\n productTextInput: React.RefObject;\n quantityTextInput: React.RefObject;\n maxChars: number;\n maxQuantity?: number;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n quickOrderState: IQuickOrderState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddToCartClick(): Promise;\n}\n\nexport interface IQuickOrderFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToCartBtn: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\nexport const QuickOrderFormComponent = (props: IQuickOrderFormProps): IQuickOrderFormViewProps => {\n const {\n productTextInput,\n quantityTextInput,\n quickOrderState,\n maxChars,\n maxQuantity,\n disableAddtoCart,\n isQuickOrderFormExpanded,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n handleQuantityChange,\n handleInputChange,\n handleAddToCartClick\n } = props;\n\n const onInputChange = (e: React.ChangeEvent): void => {\n handleInputChange(e.target.value || '');\n };\n\n const onQuantityInputChange = (e: React.ChangeEvent): void => {\n handleQuantityChange(e.target.value || '');\n };\n\n const productNode = (\n
\n

\n {ariaLabelProduct}\n

\n \n
\n );\n\n const quantityNode = (\n
\n

\n {ariaLabelQuantity}\n

\n \n
\n );\n\n const addtoCartNode = (\n
\n \n {ariaLabelAddtoCart}\n \n
\n );\n\n const userMessageNode = quickOrderState && quickOrderState.stateMessage ? (\n \n \n \n {quickOrderState.stateMessage.messageText}\n \n \n ) : undefined;\n\n return {\n product: productNode,\n addToCartBtn: addtoCartNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { getProductConfigure, IErrorState, IProductDimensionCallbacks, IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { ProductDimension, ProductDimensionValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ArrayExtensions, FinitePromiseQueue, FinitePromiseQueueError,\n getDimensionsForSelectedVariant, GetDimensionsForSelectedVariantInput,\n getProductAvailabilitiesForSelectedVariant, getScanResult, GetScanResultInput,\n getSelectedVariant, IProductInventoryInformation, IPromiseQueue, ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed, observable } from 'mobx';\nimport * as React from 'react';\n\nimport { QuickOrderDrawer, QuickOrderFormComponent } from './components';\nimport { IQuickOrderData } from './quick-order.data';\nimport { IQuickOrderProps, IQuickOrderResources } from './quick-order.props.autogenerated';\n\nexport interface IQuickOrderViewProps extends IQuickOrderProps {\n isB2B?: boolean;\n productText: string;\n isQuickOrderFormExpanded: boolean;\n contentProps: INodeProps ;\n drawer: INodeProps;\n quickOrderForm: INodeProps;\n quickOrderFormProductContent: INodeProps;\n quickOrderFormMsgContent: INodeProps;\n quickOrderProps: IModuleProps;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n}\n\nexport interface IQuickOrderStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface IQuickOrderState {\n isInitialState: boolean;\n isQuickOrderFormExpanded: boolean;\n isUpdatingDimension?: boolean;\n productAvailableQuantity: IProductInventoryInformation | undefined;\n productResponse: SimpleProduct | undefined;\n productDimensions: ProductDimensionFull[] | undefined;\n productText: string;\n quantity: number;\n stateMessage?: IQuickOrderStateMessage;\n productDimensionErrorState: IErrorState;\n isMobile: boolean;\n}\n\n/**\n *\n * QuickOrder component.\n * @extends {React.PureComponent, IQuickOrderState>}\n */\nclass QuickOrder extends React.PureComponent, IQuickOrderState> {\n private readonly productTextInput: React.RefObject;\n\n private readonly quantityInput: React.RefObject;\n\n private readonly waitTime: number = 500;\n\n private readonly quickOrderFormClass: string;\n\n private readonly quickOrderFormProductContent: string;\n\n private readonly quickOrderFormMsgContent: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly dimensionUpdateQueue: IPromiseQueue = new FinitePromiseQueue(2);\n\n private dimensions: { [id: number]: string } = {};\n\n private readonly cssClassNameConfigure: string = 'ms-quick-order__content-form-main';\n\n @observable\n private readonly viewport: GridSize;\n\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n private readonly quickOrderCallbacks: IProductDimensionCallbacks = {\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n return this.dimensionUpdateQueue.enqueue(async () => {\n return this._updateDimensions();\n }).catch((error: any) => { // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw error;\n }\n });\n },\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n public constructor(props: IQuickOrderProps) {\n super(props);\n this.productTextInput = React.createRef();\n this.quantityInput = React.createRef();\n this.viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n\n this.telemetryContent = getTelemetryObject(this.props.context?.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.state = {\n productText: '',\n isInitialState: true,\n isQuickOrderFormExpanded: false,\n productAvailableQuantity: undefined,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile\n };\n this._handleInputChange = this._handleInputChange.bind(this);\n this._handleQuantityChange = this._handleQuantityChange.bind(this);\n this.quickOrderFormClass = 'ms-quick-order__content-form';\n this.quickOrderFormProductContent = 'ms-quick-order__content-form-main';\n this.quickOrderFormMsgContent = 'ms-quick-order__content-form-msg';\n }\n\n @computed get isMobile(): boolean {\n return (this.viewport === 'xs' || this.viewport === 'sm');\n }\n\n public render(): JSX.Element | null {\n\n const { data } = this.props;\n if (!data.customerInformation?.result) {\n return null;\n }\n\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const { quickOrderModuleHeading, quickOrderModuleDescription,\n quickOrderAddtobag, quickOrderProductQuantityInputLabel,\n quickOrderProductInputLabel, quickOrderProductDimensionTypeColor,\n quickOrderProductDimensionTypeConfiguration, quickOrderSelectDimensionFormatString,\n quickOrderProductDimensionTypeSize, quickOrderProductDimensionTypeStyle,\n quickOrderProductDimensionTypeAmount\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderProductDimensionTypeAmount\n };\n\n const {\n isQuickOrderFormExpanded,\n productText,\n productDimensionErrorState,\n productResponse,\n productDimensions\n } = this.state;\n\n const moduleClassName: string = 'ms-quick-order';\n\n const viewProps: IQuickOrderViewProps = {\n ...(this.props as IQuickOrderProps),\n\n quickOrderProps: { className: classnames('ms-quick-order', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order__content' },\n isB2B: customerInfo && customerInfo.IsB2b,\n drawer: {\n tag: QuickOrderDrawer,\n className: `${moduleClassName}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderFormExpanded },\n moduleHeadingText: quickOrderModuleHeading,\n moduleDescriptionText: quickOrderModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this.telemetryContent\n },\n quickOrderForm: {\n className: `${this.quickOrderFormClass} ${isQuickOrderFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderFormProductContent: {\n className: this.quickOrderFormProductContent\n },\n quickOrderFormMsgContent: {\n className: this.quickOrderFormMsgContent\n },\n productText,\n form: QuickOrderFormComponent({\n productTextInput: this.productTextInput,\n quantityTextInput: this.quantityInput,\n disableAddtoCart: !productResponse,\n ariaLabelAddtoCart: quickOrderAddtobag,\n ariaLabelProduct: quickOrderProductInputLabel,\n ariaLabelQuantity: quickOrderProductQuantityInputLabel,\n maxChars: 50,\n maxQuantity,\n isQuickOrderFormExpanded,\n quickOrderState: this.state,\n handleInputChange: this._handleInputChange,\n handleAddToCartClick: this._addItemToCart,\n handleQuantityChange: this._handleQuantityChange\n }),\n configure: productResponse && productDimensions ? getProductConfigure(this.cssClassNameConfigure, this.props.context, this.props.friendlyName,\n this.props.telemetry, quickOrderSelectDimensionFormatString,\n productConfigureResources, this.quickOrderCallbacks, productResponse,\n productDimensions, productDimensionErrorState) : undefined,\n isQuickOrderFormExpanded: this.state.isQuickOrderFormExpanded,\n isMobileView: this.state.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length > 4) {\n this.setState({ productText: query, quantity: 0 });\n this.setState({ stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n } });\n } else {\n return;\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n telemetry,\n context\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > 50) {\n return;\n }\n\n // TODO: need set productAvailability in state.\n this.cancellabelDebounce = debounce(() => {\n getScanResult(\n new GetScanResultInput(context.actionContext.requestContext.apiSettings, query, context.actionContext.requestContext.apiSettings.channelId),\n this.props.context.actionContext)\n .then(results => {\n this.setState({ productResponse: results?.Product, productDimensions: results?.ProductDimensionFull, isQuickOrderFormExpanded: true });\n })\n .catch(error => {\n this.setState({ productText: '' });\n telemetry.exception(error);\n telemetry.debug('Unable to get scan results');\n });\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n this.setState({ productText: query, isQuickOrderFormExpanded: true });\n } else {\n this.setState({ productText: '', productResponse: undefined, isQuickOrderFormExpanded: true });\n }\n }\n };\n\n private readonly _addItemToCart = async (): Promise => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { quickOrderAddedToCartSuccessMessage, quickOrderAddedToCartFailureMessage } = resources;\n const { productAvailableQuantity, productResponse, quantity } = this.state;\n this.setState({ stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n } });\n\n if (context && productResponse !== undefined && this._validateCart(productResponse, quantity)) {\n if (cart.result) {\n const isOrderQuantityLimitsFeatureEnabledInHq = this.props.data.featureState.result\n ?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context.request.app.platform?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings = defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n\n // Get product delivery mode info\n const deliveryOptions = await getDeliveryOptionsAsync(\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\n [productResponse.RecordId]);\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n const defaultDeliveryOption = ArrayExtensions.hasElements(deliveryOptions) && ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) ? deliveryOptions[0].DeliveryOptions[0].Code : undefined;\n\n const isOrderQuantityLimitsFeatureEnabled = isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n const addProductToCartInput = {\n product: productResponse,\n count: quantity,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productAvailableQuantity ? productAvailableQuantity.ProductAvailableQuantity.AvailableQuantity : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: isOrderQuantityLimitsFeatureEnabled },\n isAddEmailDeliveryItemToCart: defaultDeliveryOption !== undefined && defaultDeliveryOption === emailDeliveryModeCode,\n deliveryMode: defaultDeliveryOption\n };\n\n cart.result.addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.props.telemetry.debug('[quick-order] Cart Updated');\n\n this.setState({ stateMessage: {\n messageText: quickOrderAddedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n } });\n } else if (result.substatus === 'MAXQUANTITY') {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order', quantity);\n const maxQtyLimitReachedMessage = this._getMaxQtyMessage(productAvailableQuantity, quantity);\n\n this.setState({ stateMessage: {\n messageText: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n } else if (result.substatus === 'QUANTITYLIMITS' && isOrderQuantityLimitsFeatureEnabled) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order', maxQtyLimitReachedMessage);\n\n this.setState({ stateMessage: {\n messageText: maxQtyLimitReachedMessage || quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n } else {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order');\n\n this.setState({ stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[quick-order] Error trying to Update Cart Line from the quick order');\n\n this.setState({ stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n });\n }\n }\n };\n\n private _getMaxQtyMessage(productInventoryInfo: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { quickOrderMaxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\n\n if (!productInventoryInfo || !productInventoryInfo.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return quickOrderMaxQuantityLimitText.replace('{maxQuantity}', maxQuantityForLineItem.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, productInventoryInfo.ProductAvailableQuantity.AvailableQuantity);\n\n return quickOrderMaxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private readonly _handleQuantityChange = (value: string): void => {\n const currentValue = Number.parseInt((value), 10);\n const inputElement = this.quantityInput && this.quantityInput.current && this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n\n this.setState(\n { quantity: currentValue },\n () => {\n debounce(\n () => {\n if (!isNaN(this.state.quantity) && !(this.state.quantity < 0)) {\n if (inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }\n },\n 200)();\n }\n );\n };\n\n private readonly _updateDimensionValue = (productDimensionFull: ProductDimensionFull, newValueId: string | undefined): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private readonly _updateDimensions = async (): Promise => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: {\n channelId\n }\n }\n }\n } = this.props;\n const { productDimensions, productResponse } = this.state;\n if (!productResponse || !productDimensions) {\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 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 key of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[key]) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[key] = 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.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue: this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) || dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n }).filter(dimension => {\n return dimension && 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 const selectedProduct = new Promise(async (resolve, reject) => {\n const newProduct = (await getSelectedVariant(\n new SelectedVariantInput(\n productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n channelId,\n mappedDimensions\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 ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n const variantProduct = await selectedProduct;\n this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n if (variantProduct) {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(\n variantProduct.RecordId,\n channelId\n ),\n actionContext\n );\n\n if (newAvailableQuantity && newAvailableQuantity.length > 0) {\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n }\n };\n\n private readonly _getDimensionErrorString = (dimensionTypeValue: number, resources: IQuickOrderResources, isGiftCard?: boolean): string => {\n switch (dimensionTypeValue) {\n case 1: // ProductDimensionType.Color\n return resources.quickOrderproductDimensionTypeColorErrorMessage;\n case 2: // ProductDimensionType.Configuration\n return resources.quickOrderproductDimensionTypeConfigurationErrorMessage;\n case 3: // ProductDimensionType.Size\n return resources.quickOrderproductDimensionTypeSizeErrorMessage;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.quickOrderproductDimensionTypeAmountErrorMessage : resources.quickOrderproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n const missingDimensions = productResponse?.Dimensions && productResponse.Dimensions.filter((dimension: ProductDimension) => !(dimension.DimensionValue && dimension.DimensionValue.Value));\n if (missingDimensions && missingDimensions.length > 0) {\n const userMsg = this._getConfigureErrors(missingDimensions, false);\n if (this.state.productDimensionErrorState.configureErrors) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors = userMsg;\n\n this.setState({ productDimensionErrorState: errorState });\n return false;\n }\n }\n\n if (quantity <= 0) {\n const resources = this.props.resources;\n this.setState({ stateMessage: {\n messageText: resources.quickOrderWrongQuantityErrorMsg,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n return false;\n }\n return true;\n };\n\n private _getConfigureErrors(result: ProductDimension[] | undefined, isGiftCard?: boolean): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n const dimensions: { [configureId: string]: string | undefined } = {};\n const resources = this.props.resources;\n result.forEach(dimension => {\n dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n });\n return dimensions;\n }\n}\n\nexport default QuickOrder;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { SocialMedia, SocialMediaComponent } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISocialShareItemConfig, ISocialShareItemProps, socialMedia } from './social-share-item.props.autogenerated';\n\nexport interface ISocialShareItemViewProps extends ISocialShareItemProps {\n SocialShareItemElement: React.ReactNode | null;\n SocialShareItem: IModuleProps;\n}\n\n/**\n *\n * SocialShareItem component.\n * @extends {React.PureComponent>}\n */\nclass SocialShareItem extends React.PureComponent> {\n constructor(props: ISocialShareItemProps) {\n super(props);\n\n this._getSocialShareItem = this._getSocialShareItem.bind(this);\n }\n\n public render(): JSX.Element | null {\n const viewprops = {\n ...this.props,\n SocialShareItem: {\n moduleProps: this.props,\n className: 'ms-social-share-item'\n },\n SocialShareItemElement: this._getSocialShareItem()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n private _getSocialShareItem(): React.ReactNode | null {\n const src = this.props.config.icon;\n if (MsDyn365.isBrowser) {\n switch (this.props.config.socialMedia) {\n case socialMedia.facebook:\n return ();\n case socialMedia.twitter:\n return ();\n case socialMedia.pinterest:\n return ();\n case socialMedia.linkedin:\n return ();\n case socialMedia.mail:\n return ();\n default:\n return null;\n }\n }\n return null;\n }\n}\n\nexport default SocialShareItem;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IVideoMetadata, Player } from '@msdyn365-commerce/components';\nimport { IPlayerOptions } from '@msdyn365-commerce/components/dist/types/videoplayer/components/data/player-options';\nimport { IPlayerResources } from '@msdyn365-commerce/components/dist/types/videoplayer/components/data/player-resources';\nimport { IPlayerData } from '@msdyn365-commerce/components/dist/types/videoplayer/players/player/Player.props';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerConfig, IVideoPlayerProps } from './video-player.props.autogenerated';\n\nexport interface IVideoPlayerViewProps extends IVideoPlayerProps<{}> {\n player: React.ReactNode;\n}\n\n/**\n *\n * VideoPlayer component.\n * @extends {React.PureComponent>}\n */\nclass VideoPlayer extends React.PureComponent> {\n private readonly telemetryContent: ITelemetryContent;\n\n constructor(props: IVideoPlayerProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n }\n\n public render(): JSX.Element {\n const options: IPlayerOptions = this.props.config;\n const video: MsDyn365.IVideoData = this.props.config.video;\n const playerResources: IPlayerResources = {\n playAriaLabel: this.props.resources.playLabel,\n pauseAriaLabel: this.props.resources.pauseLabel,\n playingAriaLabel: this.props.resources.playingLabel,\n pausedAriaLabel: this.props.resources.pausedLabel,\n muteAriaLabel: this.props.resources.muteLabel,\n unMuteAriaLabel: this.props.resources.unMuteLabel,\n fullScreenAriaLabel: this.props.resources.fullScreenLabel,\n exitFullScreenAriaLabel: this.props.resources.exitFullScreenLabel,\n seekBarLabel: this.props.resources.seekBarLabel,\n videoTimeDurationLabel: this.props.resources.videoTimeDurationLabel,\n closedCaptionLabel: this.props.resources.closedCaptionLabel\n };\n const videoMetaData: IVideoMetadata = {};\n\n if (video) {\n videoMetaData.videoId = video.id;\n videoMetaData.title = video.title;\n videoMetaData.duration = video.playTime;\n\n if (video.thumbnail) {\n videoMetaData.posterframeUrl = video.thumbnail.src;\n }\n\n if (video._links &&\n video._links.binaryReferences) {\n videoMetaData.videoBinaryReferences = video._links.binaryReferences;\n }\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\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\n player: \n \n \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n}\n\nexport default VideoPlayer;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderData } from '../header.data';\nimport { IHeaderProps } from '../header.props.autogenerated';\n\n/**\n * The header preferred store component.\n */\n@observer\nexport class HeaderPreferredStore extends React.PureComponent> {\n\n public handleClick = () => {\n return this._findPreferreStoreOnClick(this.props);\n };\n\n public render(): JSX.Element | undefined {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n slots,\n resources\n } = this.props;\n if (slots && slots.storeSelector && slots.storeSelector.length > 0) {\n const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName ? storeSelectorStateManager!.preferredStore.StoreName : resources.headerPreferredStoreText;\n\n return (\n
\n \n \n {storeName}\n \n \n {slots.storeSelector}\n
\n );\n }\n\n return undefined;\n }\n\n private async _findPreferreStoreOnClick(props: IHeaderProps): Promise {\n const { data: { storeSelectorStateManager: { result: storeSelectorStateManager } }, modules } = props;\n if (!storeSelectorStateManager) {\n return;\n }\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 storeSelectorStateManager.openDialog({\n id: storeSelectorId,\n showMapViewLink: false,\n onLocationSelected: orgUnitLocation => {\n return Promise.resolve();\n }\n }).catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to set preferred store');\n }\n return;\n });\n }\n}\n\nexport default HeaderPreferredStore;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ILogoProps {\n image: Msdyn365.IImageData;\n gridSettings?: Msdyn365.IGridSettings;\n link?: ILinkData;\n className?: string;\n telemetryContent?: ITelemetryContent;\n requestContext: Msdyn365.IRequestContext;\n typeName?: string;\n}\n\nexport interface ILinkData {\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n openInNewTab?: boolean;\n linkText?: string;\n}\n\n/**\n *\n * Logo component.\n * @extends {React.PureComponent}\n */\nexport class Logo extends React.PureComponent {\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n constructor(props: ILogoProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return (\n
\n {this._renderLogo(this.props)}\n
\n );\n }\n\n private _renderLogo(config: ILogoProps): JSX.Element {\n if (config.link && config.link.linkUrl.destinationUrl) {\n return (\n \n {this._renderImage(config)}\n \n );\n }\n return (\n this._renderImage(config)\n );\n }\n\n private _renderImage(config: ILogoProps): JSX.Element {\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=132&h=28&m=6', w: 0, h: 0 },\n lg: { q: 'w=160&h=48&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n \n );\n }\n}\n\nexport default Logo;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderResources } from '../header.props.autogenerated';\n\nexport interface INavIconProps {\n resources: IHeaderResources;\n isExpanded: boolean;\n targetId: string;\n telemetryContent?: ITelemetryContent;\n toggleNavBar(): void;\n}\n\n/**\n *\n * NavIcon component.\n * @extends {React.PureComponent}\n */\n\n@observer\nexport class NavIcon extends React.Component {\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n constructor(props: INavIconProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return (\n \n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport {\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\n ModalBody, ModalHeader, onTelemetryClick, Popover, TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\nimport { IHeaderData } from './header.data';\nimport { IHeaderProps, IHeaderResources, IMyAccountLinksData } from './header.props.autogenerated';\n\nexport interface IHeaderState {\n mobileMenuCollapsed: boolean;\n signinPopoverOpen: boolean;\n}\n\nexport interface IHeaderViewProps extends IHeaderProps, IHeaderState {\n logo: React.ReactNode;\n wishListIconDesktop: React.ReactNode;\n wishListIconMobile: React.ReactNode;\n cartIcon: React.ReactNode;\n navIcon: React.ReactNode;\n className: string;\n menuBar: React.ReactNode[];\n search: React.ReactNode[];\n siteOptions: React.ReactNode[];\n HeaderTag: IModuleProps;\n HeaderContainer: INodeProps;\n MobileMenuContainer: INodeProps;\n MobileMenuHeader: React.ReactNode;\n MobileMenuBodyContainer: INodeProps;\n MobileMenuLinksContainer: INodeProps;\n HeaderTopBarContainer: INodeProps;\n Divider: INodeProps;\n\n AccountInfoDropdownParentContainer?: INodeProps;\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\n accountInfoDropdownButton?: React.ReactNode;\n\n signOutLink?: React.ReactNode;\n signInLink?: React.ReactNode;\n accountLinks?: React.ReactNode[];\n preferredStore?: React.ReactNode;\n}\n\n/**\n *\n * Header component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass Header extends React.PureComponent, IHeaderState> {\n private readonly popOverRef: React.RefObject;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private cart: ICartState | undefined;\n\n @computed public get displayName(): Readonly {\n const customer = this.props.data.accountInformation?.result;\n return customer ? customer.FirstName || customer.Name : undefined;\n }\n\n constructor(props: IHeaderProps) {\n super(props);\n this.popOverRef = React.createRef();\n this._toggleNavbar = this._toggleNavbar.bind(this);\n this._togglePopover = this._togglePopover.bind(this);\n this._keydown = this._keydown.bind(this);\n this.state = {\n mobileMenuCollapsed: true,\n signinPopoverOpen: false\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('keydown', this._keydown);\n }\n reaction(\n () => this.props.data.cart.result,\n () => {\n this.cart = this.props.data.cart.result;\n }\n );\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('keydown', this._keydown, false);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n data: { accountInformation,\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n context: {\n request: {\n user\n }\n },\n context,\n resources: {\n cartLabel,\n cartQtyLabel\n }\n } = this.props;\n const { logoLink, logoImage } = this.props.config;\n const headerClassName = classnames('ms-header', this.props.config.className);\n const navbarKey = 'header-nav-mobile';\n const customer = accountInformation && accountInformation.result;\n const cartIconSlot = this._getSlot('cartIcon');\n const menuBarSlot = this._getSlot('menuBar');\n const searchSlot = this._getSlot('search');\n const siteOptionsSlot = this._getSlot('siteOptions');\n const preferredStoreSlot = this._getSlot('storeSelector');\n const viewProps: IHeaderViewProps = {\n ...(this.props as IHeaderProps),\n ...(this.state),\n logo: ,\n wishListIconDesktop: (\n \n ),\n wishListIconMobile: (\n \n ),\n cartIcon: (cartIconSlot && cartIconSlot.length > 0) ? cartIconSlot[0] : ,\n navIcon: ,\n menuBar: menuBarSlot && menuBarSlot.length && menuBarSlot || [],\n search: searchSlot && searchSlot.length && searchSlot || [],\n siteOptions: siteOptionsSlot && siteOptionsSlot.length && siteOptionsSlot || [],\n className: headerClassName,\n HeaderTag: {\n moduleProps: this.props,\n className: classnames(headerClassName),\n tag: 'header'\n },\n HeaderContainer: {\n className: classnames('ms-header__container')\n },\n HeaderTopBarContainer: {\n className: classnames('ms-header__topbar')\n },\n Divider: {\n className: classnames('ms-header__divider')\n },\n MobileMenuContainer: {\n tag: Modal,\n id: navbarKey,\n className: 'ms-header__mobile-hamburger',\n isOpen: !this.state.mobileMenuCollapsed,\n wrapClassName: 'ms-header__modal',\n toggle: this._toggleNavbar\n },\n MobileMenuHeader: (\n \n ),\n MobileMenuBodyContainer: {\n tag: ModalBody,\n className: 'ms-header__mobile-hamburger-menu-body'\n },\n MobileMenuLinksContainer: {\n className: 'ms-header__mobile-hamburger-menu-links'\n },\n AccountInfoDropdownParentContainer: {\n className: 'ms-header__account-info'\n },\n AccountInfoDropdownPopoverConentContainer: customer && this.displayName && {\n tag: Popover,\n id: 'myprofilePopover',\n className: 'ms-header__account-info-content',\n placement: 'bottom',\n isOpen: this.state.signinPopoverOpen,\n target: this.popOverRef,\n toggle: this._togglePopover\n } || undefined,\n signInLink: this._getSigninButton(customer, user, this.props.resources),\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\n accountLinks: this._getAccountLinks(customer),\n preferredStore: preferredStoreSlot &&\n preferredStoreSlot.length &&\n storeSelectorStateManager &&\n ()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /* Handle link text change*/\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent) => {\n if (this.props.config.myAccountLinks && this.props.config.myAccountLinks[linkIndex]) {\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\n }\n };\n\n private _getSlot(slotName: string): React.ReactNode[] | null {\n const { slots } = this.props;\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\n }\n\n private _getSigninButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return !customer && (\n \n \n {resources.signInLinkText}\n \n \n );\n }\n\n private _getSignOutButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return customer && this.displayName && (\n \n \n {resources.signOutLinkText}\n \n \n );\n }\n\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return customer && this.displayName && (\n \n \n {this.displayName}\n \n \n );\n }\n\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\n const { myAccountLinks } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n if (!customer || !this.displayName || !myAccountLinks || myAccountLinks.length === 0) {\n return undefined;\n }\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\n payLoad.contentAction.etext = cta.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: cta.ariaLabel,\n className: 'ms-signin-info__account-link-button',\n linkText: cta.linkText,\n linkUrl: cta.linkUrl.destinationUrl,\n openInNewTab: cta.openInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n \n );\n });\n }\n\n private _toggleNavbar(): void {\n this.setState({\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\n });\n }\n\n private _togglePopover(): void {\n this.setState({\n signinPopoverOpen: !this.state.signinPopoverOpen\n });\n }\n\n private _keydown(e: KeyboardEvent): void {\n if (e.keyCode === KeyCodes.Escape) {\n this.setState({ mobileMenuCollapsed: true });\n }\n }\n}\n\nexport default Header;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC = ({ key, className, dimensionType, dimensionValue }) => (\n
\n \n {dimensionType}\n :\n \n \n {dimensionValue}\n \n
\n);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { CommerceListLine, ProductPrice, ReleasedProductType, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const { product, productUrl, price, context, imageSettings, isInStock, removeFromWishlistText,\n addToCartText, outOfStockText, wishlistState, itemKey, handlers, enableImageProductLink, inventoryInformationLabel, inventoryLabelClassName, telemetryContent } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n\n const addItemAction = (event: React.MouseEvent) => {\n WishListItemActions.addToCart(input);\n };\n const removeItemAction = (event: React.MouseEvent) => {\n WishListItemActions.removeItem(input);\n };\n const { onDismiss } = handlers;\n const inventoryCssName = inventoryLabelClassName ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}` : 'ms-wishlist-items__inventory-label';\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n const payLoad = getPayloadObject('click', telemetryContent!, '', RecordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // Check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n const isServiceItem = product.ItemTypeValue === PRODUCTASSERVICE;\n\n return {\n key: `${RecordId}-item`,\n productImage: PrimaryImageUrl && Name && _renderProductImage(context, product.Name!, PrimaryImageUrl, fallbackImage, imageSettings),\n productLink: productUrl &&\n (\n \n {Name}\n \n ),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink &&\n (\n
\n {Name}\n
\n ),\n\n addToCartButton:\n (\n \n { (isServiceItem || isInStock) && addToCartText || outOfStockText }\n \n ),\n inventoryInformation: inventoryInformationLabel && (\n \n {inventoryInformationLabel}\n \n ),\n removeButton:\n (\n \n ),\n productStatusMessage: wishlistState && wishlistState.isOpen &&\n wishlistState.productId === RecordId && wishlistState.itemKey === itemKey &&\n (\n
\n \n \n {wishlistState.userMessage}\n \n \n
\n )\n\n };\n\n};\n\nconst _renderProductImage = (context: ICoreContext, heading: string, image?: string, fallbackImage?: string, imageSettings?: IImageSettings): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n \n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n \n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch (dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n \n );\n });\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice = price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return (`${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`);\n case 3:\n return (`${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`);\n case 4:\n return (`${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`);\n default:\n return '';\n }\n });\n }\n\n return (`${Name} ${formattedPrice} ${dimensions && dimensions.join('') || ''}`);\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return (\n

\n { text }\n

\n );\n case 'FAILED':\n return (\n

\n { text }\n

\n );\n case 'LOADING':\n default:\n return (\n

\n { text }\n

\n );\n }\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ArrayExtensions, getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n}\n\n/**\n *\n * WishlistItems component.\n * @extends {React.PureComponent, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component, IWishlistItemActionMessageState> {\n\n private readonly telemetryContent: ITelemetryContent;\n\n constructor(props: IWishlistItemsProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public async componentDidMount(): Promise {\n this.setState({});\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'LOADING',\n\n // StatusMessage: \n statusMessage: ,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'FAILED',\n statusMessage: ,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult).result;\n\n if (productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'EMPTY',\n statusMessage: ,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul'\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li'\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a'\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions'\n },\n products: productsList && this._renderProductList(productsList)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n\n const { priceFree, originalPriceText, currentPriceText, addToCartButtonText, outOfStockText, removeButtonText, productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle, productDimensionTypeAmount } = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText,\n index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n }\n };\n\n return (\n WishlistItem(currentProductProps)!\n );\n });\n }\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if (!heading) {\n return undefined;\n }\n return (\n \n );\n };\n\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n const isOrderQuantityLimitsFeatureEnabledInHq = this.props.data.featureState.result\n ?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings = defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\n [product.RecordId]);\n\n const isOrderQuantityLimitsFeatureEnabled = isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n const addProductToCartInput = {\n product,\n quantity: 1,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: isOrderQuantityLimitsFeatureEnabled },\n isAddEmailDeliveryItemToCart: ArrayExtensions.hasElements(deliveryOptions) && ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) && deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\n };\n\n cart.result.addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity = (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && isOrderQuantityLimitsFeatureEnabled) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'INVOICEINCART') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private readonly _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as (CommerceList | null);\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then((products) => {\n const castSimpleProducts: FullProduct[] | null = products as (FullProduct[] | null);\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn\\'t found');\n }\n }\n };\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\n\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText.replace('{maxQuantity}', maxQuantityForLineItem.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(product: FullProduct, productInventoryCollection: IProductInventoryInformation[] | undefined): IProductInventoryInformation | undefined {\n if (productInventoryCollection && productInventoryCollection.length > 0) {\n for (const productResult of productInventoryCollection) {\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n };\n\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n };\n\n private readonly _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n };\n\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (!wishlists.result || wishlists.result.length === 0 || !wishlists.result[0].CommerceListLines || wishlists.result[0].CommerceListLines.length === 0) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter((commerceListLine) => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n }\n return null;\n\n };\n}\n\nexport default WishlistItems;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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}\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}\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}\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 = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n

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

\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = ''\n): React.ReactNode => {\n return (\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\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 = (cart: Cart, channelConfiguration: ChannelConfiguration, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, retailMultiplePickUpOptionEnabled?: boolean): IShippingOrderLine => {\n\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\n const freightFee = cart.ShippingChargeAmount;\n const canShip = deliveryModes.some(deliveryMode => (!((deliveryMode !== '' && (deliveryMode === getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) || deliveryMode === emailDeliveryModeCode)))));\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) && deliveryMode !== emailDeliveryModeCode);\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (deliveryMode?: string, featureSate: boolean = false, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, pickupDeliveryMode?: string) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n\n};\n\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const { SubtotalAmount, TaxAmount, DiscountAmountWithoutTax = 0, TotalAmount, OtherChargeAmount } = props.cart;\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(props.cart, props.channelConfiguration, props.channelDeliveryOptionConfig, props.retailMultiplePickUpOptionEnabled);\n const reactNodes: IOrderSummaryLines = {\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: OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount, 'other-charges', props.otherChargeLabel) || 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 totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\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 reactNodes.orderTotal = _buildOrderSummarySection({ ...props, freeText: undefined }, totalAmountAfterGiftCard, 'total', props.orderTotalLabel);\n }\n\n if (DiscountAmountWithoutTax > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmountWithoutTax, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy';\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\n\nexport async function getValidProductImages(productId: number, channelId: number, actionContext: IActionContext, imageSettings: IImageSettings): Promise {\n const actionInput = new MediaLocationsForSelectedVariantInput(\n productId,\n channelId\n );\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\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(mediaLocations: MediaLocation[], actionContext: IActionContext, imageSettings: IImageSettings): Promise {\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n }).catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate prodcut images');\n return [];\n });\n}\n\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings: IImageSettings): Promise<[IImageData, boolean]> {\n const imageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n\n const imageSettingsVal = ((imageSettings.viewports?.lg!.q!).replace(/[\"']+/g, ''));\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n const imageConcatVal = `${imageData.src}` + '&' + `${imageSettingsVal}`;\n\n return new Promise<[IImageData, boolean]>((resolve) => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageConcatVal, 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","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeInlineZoomStyle,\n SingleSlideCarousel\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 { getValidProductImages, validateProductImages } from './utils';\n\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n mediaGalleryItems: IImageData[] | undefined;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n}\n\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement|null;\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\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 constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = { activeIndex: 0, animating: false, mediaGalleryItems: undefined, isImageZoomed: false, modalIsOpen: false };\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 async componentDidMount(): Promise {\n const source = this.props.config.imageSource || imageSource.pageContext;\n const curatedImage = this.props.config.images || [];\n\n if (source === imageSource.pageContext) {\n reaction(\n () => (this.props.data.product.result ? this.props.data.product.result.RecordId : null),\n async () => {\n if (this.props.data.product.result) {\n let images = await getValidProductImages(\n this.props.data.product.result.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\n );\n\n // Currently returned image response is having duplicate image\n // along with non-selected variant and previous selection is not getting cleared. With the help of index we\n // select item from 0 index till it is having non repeating image source name ending with index number.\n // Here we are keeping '.' to make sure that we are considering any digit just before '.' in image source path\n images = images.filter((item, index) => {\n let incrementedIndex = index;\n const imageIndex = `${++incrementedIndex}.`;\n return item.src?.includes(imageIndex);\n });\n this.setState({\n mediaGalleryItems: [...images, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n } else {\n this.setState({\n mediaGalleryItems: [...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n }\n }\n );\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 this.setState({\n mediaGalleryItems: [...images, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n } else if (source === imageSource.pageContext && this.props.data.product.result) {\n const images = await getValidProductImages(\n this.props.data.product.result.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\n );\n\n this.setState({\n mediaGalleryItems: [...images, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n } else {\n this.setState({\n mediaGalleryItems: [...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n }\n }\n\n public render(): JSX.Element {\n const {\n id,\n config,\n resources\n } = this.props;\n\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const { className, showPaginationTooltip } = config;\n const galleryImageSettings = config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const thumbnailImageSettings = config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n const allowFullscreen: boolean = config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : (config.imageZoom === imageZoom.container ? imageZoom.container : '');\n const zoomView = allowFullscreen ? 'fullscreen' : zoomViewMode;\n\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: allowFullscreen ? this.imageModalSlider(zoomViewMode) : null,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\n (this.state.lastUpdate && !ArrayExtensions.hasElements(mediaGalleryItems)) ? [this._renderEmptyImage(galleryImageSettings)] :\n mediaGalleryItems?.map((item: IImageData, index: number) => this._renderCarouselItemImageView(\n zoomView, item, galleryImageSettings ?? this.defaultGalleryImageSettings, index)),\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 handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: this.state.lastUpdate\n } as IComponentNodeProps,\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: this.state.lastUpdate\n } as IComponentNodeProps,\n items:\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\n this.state.lastUpdate && !ArrayExtensions.hasElements(mediaGalleryItems) ? [this._getEmptyThumbnailItem(thumbnailImageSettings)] :\n mediaGalleryItems?.map((item: IImageData, index: number) => this._getThumbnailItem(\n item, thumbnailImageSettings || this.defaultThumbnailImageSettings, index, this.state.activeIndex))\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\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 private readonly next = (): void => {\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\n private readonly previous = (): void => {\n const nextIndex = this.isFirstItem() ? (this.state.mediaGalleryItems ? this.state.mediaGalleryItems.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n };\n\n private readonly goToIndex = (index: number): void => {\n this.setState({ activeIndex: index });\n };\n\n private _renderCarouselItemImageView(zoomView: string, image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n if (zoomView === 'container') {\n return this._renderImageInContainerOnZoom(image, imageSettings, index);\n } else if (zoomView === 'inline') {\n return this._renderImageInlineOnZoom(image, imageSettings, index);\n } else if (zoomView === 'fullscreen') {\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n }\n return (<>\n {this._getCarouselItem(image, imageSettings, index)}\n );\n\n }\n\n private readonly _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (image: IImageData, imageSettings: IImageSettings, index: number, modifiedActiveIndex: number): 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 'aria-controls': `${this.props.id}__carousel-item__${index}`,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\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) => {\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\n
this._inlineZoomDivRef.set(index, divRef!)} data-scale={this.props.config.dataScale}>\n \n \n
\n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale);\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\n return;\n }\n\n inlineZoomInitClick(event, this.props.config.dataScale);\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): 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
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n \n
\n
\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
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(imageSettings: IImageSettings | undefined): IMediaGalleryThumbnailItemViewProps {\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: 'ms-media-gallery__thumbnail-item',\n role: 'tab',\n tabIndex: 0,\n key: 0,\n 'aria-label': '',\n 'aria-selected': true\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\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 }\n\n private readonly imageModalSlider=(ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources,\n config\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n\n const galleryImageSettings = config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(ZoomView, item, galleryImageSettings ?? this.defaultGalleryImageSettings, index)),\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: true,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting\n } as IComponentNodeProps;\n\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n}\n\nexport default MediaGallery;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselViewProps } from './carousel';\n\nconst CarouselView: React.FC = props => (\n \n 0 ? props.slots.content : []}\n hideFlipper={props.config.hideFlipper}\n dismissEnabled={props.config.dismissEnabled}\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\n handleDismissCarousel={props.handleDismissCarousel}\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\n directionTextPrev={props.resources && props.resources.flipperPrevious}\n directionTextNext={props.resources && props.resources.flipperNext}\n handleOnExited={props.handleOnExited}\n handleOnExiting={props.handleOnExiting}\n telemetryContent={props.telemetryContent}\n />\n \n);\n\nexport default CarouselView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ProductComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult, ProjectionDomain } from '@msdyn365-commerce/retail-proxy';\nimport {\n getActivePricesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { AffiliationLoyaltyTier, CustomerAffiliation } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IComponentNodeProps, IModuleProps, INodeProps, ISingleSlideCarouselProps, ITelemetryContent, NodeTag, SingleSlideCarousel } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductCollectionProps, layout } from './product-collection.props.autogenerated';\n\nexport interface IProductCollectionViewProps extends IProductCollectionProps<{}> {\n heading?: React.ReactNode;\n ProductCollectionContainer: IModuleProps;\n SingleSlideCarouselComponentProps: INodeProps;\n GridComponentProps: INodeProps;\n products: IProductComponentViewProps[];\n isCarousel: boolean;\n productPrices?: ProductPrice[];\n}\n\nexport interface IProductComponentViewProps {\n ProductContainer: INodeProps;\n productComponent: React.ReactNode;\n}\nexport interface IProductComponentState {\n products: ProductSearchResult[];\n}\n\n/**\n * ProductCollection component.\n */\nclass ProductCollection extends React.PureComponent, IProductComponentState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private productPrices: ProductPrice[];\n\n constructor(props: IProductCollectionProps<{}>) {\n super(props);\n this.productPrices = [];\n this.state = {\n products: this.props.config.productCollection && this.props.config.productCollection.products\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n }\n\n public componentDidMount(): void {\n if (this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\n this._getActivePrice();\n }\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { resources } = this.props;\n const products = this.state.products;\n const isCarousel = this.props.config.layout === layout.carousel;\n const headingComponent = heading && (\n \n );\n\n const productCollectionViewProps = {\n ...this.props,\n heading: headingComponent,\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: '',\n flipperPrevLabel: resources.flipperPrevious,\n flipperNextLabel: resources.flipperNext,\n parentId: this.props.id,\n telemetryContent: this.telemetryContent\n } as IComponentNodeProps,\n ProductCollectionContainer: {\n moduleProps: this.props,\n className: classnames('ms-product-collection', className)\n },\n GridComponentProps: {\n tag: 'ul' as NodeTag,\n className: 'ms-product-collection__items'\n },\n isCarousel,\n products: products && products.length > 0 && products.map((item: ProductSearchResult, index: number) => this._getProduct(item, index)),\n productPrices: this.productPrices\n };\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private readonly _getProduct = (product: ProductSearchResult, index: number): IProductComponentViewProps | null => {\n if (!product || !product.Name) {\n this.props.telemetry.trace('[product-collection] Product or product name is null');\n return null;\n }\n const telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n const { imageSettings, allowBackNavigation } = this.props.config;\n const resources = this.props.resources;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n const quickviewSlot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\n return {\n ProductContainer: {\n tag: 'li' as NodeTag,\n className: 'ms-product-collection__item',\n role: 'listitem',\n key: index\n },\n productComponent: (\n \n )\n };\n };\n\n private readonly _getActivePrice = async (): Promise => {\n let products = (this.state.products) || [];\n const productRecIds = (products && products.length > 0) ? products.map(prod => prod.RecordId) : [];\n const projectDomain: ProjectionDomain = { ChannelId: this.props.context.request.apiSettings.channelId, CatalogId: this.props.context.request.apiSettings.catalogId };\n const affliations: AffiliationLoyaltyTier[] = [];\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\n\n if (customer && customer.CustomerAffiliations) {\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\n const aff: AffiliationLoyaltyTier = { AffiliationId: affliation.RetailAffiliationId, CustomerId: customer.AccountNumber };\n affliations.push(aff);\n });\n }\n\n await getActivePricesAsync(\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\n projectDomain,\n productRecIds,\n new Date(),\n null,\n affliations,\n true\n ).then((activePricesResponse: ProductPrice[]) => {\n this.productPrices = activePricesResponse;\n products = products.map(prod => {\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\n if (activePrice) {\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\n prod.BasePrice = Math.max(activePrice.BasePrice || 0, activePrice.TradeAgreementPrice || 0, activePrice.AdjustedPrice || 0);\n }\n return prod;\n });\n this.setState({\n products\n });\n })\n .catch((error: Error) => {\n this.props.context.actionContext.trace(error.message);\n this.props.context.actionContext.telemetry.exception(error);\n this.props.context.actionContext.telemetry.debug('[get Affiliation based price on Product Collection]Error executing action');\n throw new Error('[get Affiliation based price on Product Collection]Error executing action');\n });\n };\n}\n\nexport default ProductCollection;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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}\n\nexport const PromoBannerCloseButton: React.FC = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n \n \n {label}\n \n \n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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 = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n \n {editableLinks && editableLinks.length > 0 ? : null}\n \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: 'button',\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. All rights reserved.\n * See License.txt 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 = ({ text, onTextChange, requestContext }) => {\n return (\n \n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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 } 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 onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent>}\n */\nclass PromoBanner extends React.PureComponent, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel } = 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: { className: classnames('ms-promo-banner', className), moduleProps: this.props, role: 'banner' },\n PromoBannerTextProps: {\n tag: PromoBannerText\n },\n PromoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\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 };\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() ? (this.props.config.bannerMessages ? this.props.config.bannerMessages.length - 1 : 0) : 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 = () => 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"],"sourceRoot":""}