{"version":3,"sources":["webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.description.tsx?8620","webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.error-message.tsx?8f25","webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.error-title.tsx?e220","webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.radio-button.tsx?f1bb","webpack:///src/modules/checkout-delivery-options/checkout-delivery-options.tsx?d83e","webpack:///src/modules/checkout/components/get-line-items.tsx?5207","webpack:///src/common/get-order-information.tsx?d70b","webpack:///src/modules/checkout/methods/empty-active-cart.ts?524e","webpack:///src/modules/checkout/components/index.ts?5ba9","webpack:///src/modules/checkout/methods/checkout.ts?3b66","webpack:///src/modules/header/components/logo.tsx?be23","webpack:///src/modules/header/components/nav-icon.tsx?49a1","webpack:///src/modules/header/components/header-preferred-store.tsx?9138","webpack:///src/modules/header/header.tsx?4703","webpack:///src/modules/order-confirmation/components/get-help.tsx?58bd","webpack:///src/modules/order-confirmation/order-confirmation.tsx?67f9","webpack:///src/common/get-groups.tsx?8b6a","webpack:///src/order-summary-lineitem.tsx?86d9","webpack:///../../src/checkout-state.ts?acd8","webpack:///../../src/checkout-state-data-action.ts?8344","webpack:///../../../src/module-state-manager/module-state.ts?7579","webpack:///../../../src/module-state-manager/with-module-state.tsx?61ca","webpack:///src/modules/media-gallery/utils/get-valid-product-images.ts?4e26","webpack:///src/modules/media-gallery/media-gallery.tsx?3b46","webpack:///src/modules/cart/components/cart-pick-up-in-store.tsx?f7bf","webpack:///src/modules/cart/components/cart-line-items.tsx?a1e3","webpack:///src/modules/cart/components/cart-line-groups.tsx?b88f","webpack:///src/modules/cart/utils/get-promotion-in-cart.ts?1379","webpack:///src/modules/cart/cart.tsx?f1c3","webpack:///src/modules/cart/components/cart-line-items-promotion.tsx?6882","webpack:///src/modules/buybox/utilities/error-utilities.ts?63c8","webpack:///src/modules/buybox/components/buybox-small-components.tsx?5a8f","webpack:///src/modules/buybox/components/buybox-find-in-store.tsx?24db","webpack:///src/modules/buybox/components/dropdown/dropdown.tsx?2922","webpack:///src/modules/buybox/components/buybox-product-configure.tsx?7d15","webpack:///src/modules/buybox/buybox.tsx?8cd9","webpack:///src/modules/checkout-order-confirmation/checkout-order-confirmation.tsx?1533","webpack:///src/modules/order-confirmation/components/get-payment-methods.tsx?0bc9","webpack:///src/modules/order-details/components/get-help.tsx?85e2","webpack:///src/modules/order-details/components/get-order-summary.tsx?eb46","webpack:///src/modules/order-details/components/get-payment-methods.tsx?aeee","webpack:///src/modules/order-details/order-details.tsx?673a","webpack:///src/modules/checkout-gift-card/components/get-form.tsx?9f59","webpack:///src/modules/checkout-gift-card/components/get-item.tsx?ec46","webpack:///src/modules/checkout-gift-card/components/get-list.tsx?9723","webpack:///src/modules/checkout-gift-card/components/title.tsx?6d07","webpack:///src/modules/checkout-gift-card/checkout-gift-card.tsx?e6b8","webpack:///src/modules/checkout/index.ts?1106","webpack:///src/common/get-sales-lines.tsx?a840","webpack:///src/modules/checkout/checkout.view.tsx?e9a7","webpack:///src/modules/checkout/checkout.tsx?baa3","webpack:///src/common/address.tsx?6c70","webpack:///src/common/get-sales-line.tsx?39dd","webpack:///src/modules/gift-card-balance-check/components/get-form.tsx?f122","webpack:///src/modules/gift-card-balance-check/components/get-item.tsx?d7f7","webpack:///src/modules/gift-card-balance-check/gift-card-balance-check.tsx?6bc9","webpack:///src/common/label.tsx?223a","webpack:///src/modules/order-confirmation/components/get-order-summary.tsx?fa69","webpack:///src/modules/checkout/components/alert.tsx?5f0c","webpack:///src/modules/checkout/components/place-order-button.tsx?c8b4","webpack:///src/modules/checkout/components/get-order-summary.tsx?6f62","webpack:///src/modules/checkout/methods/index.ts?4c8b","webpack:///src/modules/checkout-loyalty/components/checkout-loyalty-input.tsx?d04f","webpack:///src/modules/checkout-loyalty/components/checkout-loyalty-label.tsx?3110","webpack:///src/modules/checkout-loyalty/components/checkout-loyalty-text.tsx?0080","webpack:///src/modules/checkout-loyalty/checkout-loyalty.tsx?c94a","webpack:///src/common/utilities.ts?0d8b","webpack:///src/modules/checkout/components/guided-card.tsx?5a55","webpack:///src/search-state.ts?b5d7","webpack:///src/modules/search/actions/get-auto-suggest-suggestions.ts?6ade","webpack:///src/modules/search/components/search.keywordsuggest.tsx?59ca","webpack:///src/modules/search/components/search.productsuggest.tsx?d6fa","webpack:///src/modules/search/components/search.categorysuggest.tsx?3bc4","webpack:///src/modules/search/components/search.form.tsx?3c4b","webpack:///src/modules/search/components/search.label.tsx?91cb","webpack:///src/modules/search/search.tsx?3f45","webpack:///src/modules/checkout/components/guided-form.tsx?7fad","webpack:///src/modules/order-history/components/order-history-filter.tsx?ac38","webpack:///src/modules/order-history/actions/get-order-shipment-history.ts?2cf8","webpack:///src/modules/order-history/components/get-sales-order.tsx?ac68","webpack:///src/modules/order-history/order-history.tsx?33c9","webpack:///src/modules/checkout/methods/place-order.ts?6d11"],"names":["description","className","message","title","isChecked","value","ariaSetSize","ariaPosInSet","ariaLabel","telemetryContent","onChange","payLoad","DeliveryOptions","attributes","checked","type","name","props","super","selectedItemId","deliveryOptions","isLoading","retailMultiplePickUpOptionEnabled","init","async","this","moduleState","onEdit","onCancel","onSubmit","status","canShip","cartDeliveryMode","getSavedDeliveryOption","loadDeliveryOptions","data","checkout","result","checkoutCart","hasInvoiceLine","getCartLinesForShipping","length","isDeliveryModeExists","deliveryMode","find","deliveryOption","Code","getDeliveryOptionSelected","selectedItem","context","telemetry","error","id","typeName","priceFree","resources","price","DeliveryOption","Description","CustomerContextualPrice","freePriceText","getErrorMessage","errorMessageTitle","CheckoutDeliveryOptionsError","tag","role","errorMessage","getDeliveryOptionList","count","map","index","code","radioButton","onDeliveryOptionChange","getSaveButton","saveBtnLabel","color","disabled","onClick","onSave","getEditButton","editBtnLabel","getCancelButton","cancelBtnLabel","setError","setHasError","onUpdating","clearError","undefined","updateCartDeliverySpecification","savedDeliveryOption","onReady","cartLinesForShipping","DeliveryMode","deliveryModeId","trim","checkoutState","updateCartDeliverySpecificationInput","shippingAddress","channelDeliveryOptionConfig","onPending","then","response","genericErrorMessage","setIsCancellable","catch","request","pickupDeliveryModeCode","channel","PickupDeliveryModeCode","emailDeliveryModeCode","EmailDeliveryModeCode","cart","CartLines","filter","cartLine","PickupDeliveryModeCodes","getDeliveryOptions","config","cartState","cartId","Id","originalDeliveryMode","shippingCartLines","hasShippingDeliveryLines","clearCartLinesDeliveryInformation","deliveryOptionFilter","filterDeliveryModeOption","callerContext","actionContext","queryResultSettings","deliveryOptionsNotFound","ShippingAddress","event","currentTarget","telemetryPageName","friendlyName","isReady","isUpdating","hasError","isError","isShowList","isShowSelected","featureState","feature","Name","IsEnabled","viewProps","deliveryOptionsData","errorMessageData","viewState","isShowSaveButton","hasExternalSubmitGroup","isShowEditButton","isShowCancelButton","CheckoutDeliveryOptions","moduleProps","DeliveryOptionsList","list","deliveryOptionSelected","waiting","saveButton","editButton","cancelButton","renderView","getLineItems","input","_getDeliveryLocation","orgUnitLocations","FulfillmentStoreId","locationMatch","location","OrgUnitNumber","OrgUnitName","_getLineItemComponent","product","ProductId","productId","_product","RecordId","imageSettings","showShippingChargesForLineItems","quantityDisplayString","productDimensionTypeColor","productDimensionTypeSize","productDimensionTypeStyle","productDimensionTypeAmount","configString","inputQuantityAriaLabel","discountStringText","shippingCharges","gridSettings","sizeString","colorString","styleString","amountString","originalPriceText","currentPriceText","shippingChargesText","isQuantityEditable","productUrl","primaryImageUrl","PrimaryImageUrl","_getPickUpAtStoreComponents","pickupDeliveryLocation","pickUpAtStoreWithLocationText","PickUpAtStore","label","_getEmailDeliveryComponents","emailDeliveryText","EmailDelivery","_getLineItemsComponents","items","isPickUp","_getCartPickDeliveryMode","isEmailDelivery","LineId","LineItem","item","pickUpAtStore","emailDelivery","cartLineItem","isNullOrWhitespace","_countItems","reduce","Quantity","_filterItemsByDiliveryType","_getLineItemsByDeliveryType","itemLabel","itemsLabel","inStorePickUpLabel","shippingCountCheckoutLineItem","emailDeliveryModeDesc","productDeliveryOptions","suffix","replace","toString","_getGroupTitleComponent","LineItemDeliveryGroup","LineItemList","heading","lineItems","handleLineItemHeadingChange","lineItemsHeading","text","target","_getLineItemsByDeliveryTypeWithMulitplePickupMode","multiplePickUpLabel","shippingLable","getGroupByStorePickup","groupDelivery","cartLinesGroup","cartLinesGrp","Object","entries","forEach","groupByDeliveryType","push","keys","key","cartLines","_filterItemsByMultiplePickupMode","lineItemDeliveryGroup","fulFillmentStoreId","pickupDeliveryModeDesc","_getGroupTitleComponentWithMultiplePickUp","groupTitle","iconClass","lineItemWraperIcon","lineItemWraper","products","editCartText","EditCart","attribute","groupClass","LineItems","Header","editProps","requestContext","editLink","href","itemsForPickup","itemsForShip","itemsForEmail","itemsGroupWithMulitplePickupMode","_getLineItems","getOrderInformation","moduleName","channelReferenceId","channelName","channelAddress","showChannelInfo","receiptEmail","createdDate","amount","priceContext","salesId","receiptId","receiptEmailMessage","orderItemLabel","orderItemsLabel","orderIdLabel","receiptIdLabel","confirmationIdLabel","posChannelNameText","onlineStoreChannelNameText","orderPlacedOnLabel","isSalesInvoice","orderInformationProps","getOrderInfomationInput","order","channelIdentities","apiSettings","channelId","locale","ChannelId","SalesLines","orderChannel","orderOrgUnitLocation","CreatedDateTime","Date","toLocaleDateString","SalesId","ReceiptId","ReceiptEmail","ChannelReferenceId","Address","TotalAmount","ctx","lineItemIdsToRemove","e","Error","activeCart","activeCartLine","checkoutCartLine","removeCartLines","cartLineIds","removeAllPromoCodes","removeCheckoutCartId","OPERATIONS","PayCard","PayGiftCertificate","PayLoyalty","PayCustomerAccount","getCardTypeId","cardPrefix","TypeId","findTenderIdTypeByOperationId","tenderTypes","operationId","matchedTenderType","tenderType","OperationId","TenderTypeId","roundNumber","Number","toFixed","updatedCartVersion","channelConfiguration","giftCardExtends","tokenizedPaymentCard","guestCheckoutEmail","billingAddress","loyaltyAmount","Currency","cartTenderLines","amountDue","AmountDue","getTenderLinePromises","loyaltyCardNumber","LoyaltyCardId","chargedAmount","Math","min","loyaltyTenderLinePromise","Amount","getLoyaltyTenderLine","some","giftCardExtend","Balance","tenderTypeId","giftCardPin","Pin","giftCardExpirationYear","ExpirationDate","parseInt","split","giftCardExpirationMonth","creditCardTenderLinePromise","GiftCardId","GiftCardPin","GiftCardExpirationYear","GiftCardExpirationMonth","getGiftCardTenderLine","customerAccountAmount","customerAccountTenderLinePromise","CustomerId","user","isAuthenticated","createCustomerAccountTenderLine","cartTypeId","CardTypeId","TenderType","cardTenderLine","TokenizedPaymentCard","House","CardTokenInfo","Phone","Country","ThreeLetterISORegionName","Address1","Street","City","State","Zip","ZipCode","getCreditCardTenderLine","Promise","all","cartVersion","Version","salesOrder","bypassCache","Logo","_renderLogo","link","linkUrl","destinationUrl","openInNewTab","_renderImage","defaultImageSettings","viewports","xs","q","w","h","lg","lazyload","image","loadFailureBehavior","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","isExpanded","targetId","handleClick","_findPreferreStoreOnClick","storeSelectorStateManager","slots","storeSelector","storeName","preferredStore","StoreName","headerPreferredStoreText","headerPreferredStoreAriaLabel","modules","storeSelectorId","openDialog","showMapViewLink","onLocationSelected","orgUnitLocation","resolve","debug","handleLinkTextChange","linkIndex","myAccountLinks","linkText","popOverRef","_toggleNavbar","bind","_togglePopover","_keydown","state","mobileMenuCollapsed","signinPopoverOpen","customer","accountInformation","FirstName","isBrowser","window","addEventListener","removeEventListener","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","isOpen","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","contentAction","etext","editableLink","additionalProperties","onTextChange","setState","keyCode","getOrderConfirmationHelp","needHelpLabel","helpLineNumberLabel","contactNumber","helpLineContactAriaLabel","helpProps","OrderConfirmation","handleOrderConfirmationHeadingChange","getDeliveryMode","salesLine","featureSate","pickupDeliveryMode","BackToShopping","backToShoppingAttributes","loyaltyCard","RewardPoints","pointPrograms","point","RewardPointId","rewardLines","LoyaltyRewardPointLines","total","line","RewardPointAmountQuantity","indexOf","orderDetailsLines","orderDetailsLine","orderSummaryHeading","orderSummaryItemsTotalLabel","orderSummaryShippingFeeLabel","orderSummaryTaxLabel","orderSummaryGrandTotalLabel","pointsEarnedLabel","earnedPoints","resource","TenderLines","paymentMethodsTitle","creditCardEndingLabel","giftCardEndingLabel","amountCoveredLabel","cashUsedLabel","loyaltyCardUsedLabel","customerAccountUsedLabel","tenderLines","tenderIdOperationIdMap","noSalesOrderText","loadingLabel","backToShopping","pickupItemsHeader","pickingItemsLabel","shippingAddressTitle","shippingItemToYouLabel","emailItemsHeader","emailingItemsLabel","showTimeslot","backToShoppingUrl","backToShoppingLink","footerProps","alert","isDataReady","loading","TransactionTypeValue","salesLinesInput","salesLines","orderInfomationInput","orderInfomation","groups","isConfirmationView","orderSummary","orderSummaryProps","payment","paymentMethodsProps","help","getGroups","showAddress","group","deliveryType","salesStatus","_salesLines","pickingItemsLabelText","shippingItemsToYouText","emailingItemsLabelText","groupProps","salesLinesProps","address","trackingInfo","isProcessing","pickDateTimeslot","pickupDateTimeslot","shippedStatusCheck","delivery","deliveryProps","pickupProps","processing","shippingItemsToYou","groupsProps","OrderSummaryLine","toBeCalculatedText","freeText","cssLabel","_computedLoyaltyAmount","dM","OrderSummary","SubtotalAmount","TaxAmount","DiscountAmountWithoutTax","OtherChargeAmount","hasDeliveryMethod","hasShippingMethod","freightFee","deliveryModes","ShippingChargeAmount","getDeliveryConfiguration","reactNodes","subtotal","subTotalLabel","tax","taxLabel","orderTotal","orderTotalLabel","otherCharge","otherChargeLabel","shipping","shippingLabel","giftCardAmount","giftCardTotalValue","giftCard","_computeGiftCardAmount","totalAmountAfterGiftCard","loyalty","loyaltyLabel","giftcardLabel","totalDiscounts","totalDiscountsLabel","_giftCards","_giftCardExtends","_loyaltyAmount","_guestCheckoutEmail","_isTermsAndConditionAccepted","_customerAccountAmount","_tokenizedPaymentCard","_tenderLine","_billingAddress","_shippingAddress","_cardPrefix","_loyaltyCardNumber","updateTokenizedPaymentCard","newTokenizedPaymentCard","updateTenderLine","newTenderLine","updateShippingAddress","newShippingAddress","updateBillingAddress","newBillingAddress","updateCardPrefix","newCardPrefix","removeGiftCard","giftCardNumber","removeGiftCardExtend","addGiftCard","addGiftCardExtend","updateLoyaltyCardNumber","newLoyaltyCardNumber","updateLoyaltyAmount","newAmount","updateGuestCheckoutEmail","newGuestCheckoutEmail","updateTermsAndConditionsAcceptance","newIsTermsAndConditionAccepted","updateCustomerAccountAmount","getCacheKey","getCacheObjectType","dataCacheType","action","inputData","getModuleStates","cacheKey","ModuleStatesCacheKey","moduleStates","get","update","WrappedComponent","initializeState","states","hasInitialized","isRequired","isCancellable","isSubmitContainer","childIds","getModuleStateManager","validate","isPending","isSkipped","isDisabled","isCancelAllowed","shouldSubmitContainer","hasModuleState","setIsRequired","setIsSubmitContainer","onSkip","onDisable","getModule","moduleId","getModuleByTypeName","getModuleStateManagerByTypeName","options","values","_moduleState","_validateLeaf","source","module","_validateContainer","allMatched","skipSkippableItem","method","childId","enableControl","render","ModuleState","getValidProductImages","actionInput","mediaLocations","mediaLocation","validateMediaLocaionAsync","pairs","pair","exception","imageData","src","Uri","altText","AltText","imageSettingsVal","imageConcatVal","http","XMLHttpRequest","open","onload","onerror","send","_inlineZoomDivRef","Map","defaultGalleryImageSettings","sm","md","cropFocalRegion","defaultThumbnailImageSettings","onExiting","animating","onExited","next","isLastItem","nextIndex","activeIndex","goToIndex","previous","isFirstItem","mediaGalleryItems","_getCarouselItem","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","tabIndex","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","which","preventDefault","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_mapProductToImageData","galleryImageSettings","carouselprops","_renderCarouselItemImageView","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","handleOnExited","handleOnExiting","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","isImageZoomed","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","imageSource","curatedImage","images","thumbnailImageSettings","lastUpdate","now","validateProductImages","isVertical","thumbnailsOrientation","allowFullscreen","allowFullScreen","zoomViewMode","imageZoom","zoomView","MediaGallery","Modal","CarouselProps","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","_renderImageInContainerOnZoom","_renderImageInlineOnZoom","_renderImageFullScreenOnZoom","ref","divRef","set","dataScale","onMouseOver","onMouseMove","innerWidth","onMouseOut","fullScreenTitleText","parentDiv","children","querySelector","removeAttribute","PickUpInStore","_toggleBOPIS","isBopisSelected","cartline","storeSelectorModuleId","alreadySelectedLocation","updateCartLinePickupLocation","cartLineId","locationChangedHandler","_onLocationChangedCallback","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","foundLocation","option","callbacks","toggleBopis","defaultComponent","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","toggleBOPIS","_renderShippingMethod","shipitText","pickUpInStoreText","pickupStore","_getDeliveryOption","ContainerProps","assembleCartlines","cartlines","_getProduct","foundProductAvailability","foundProductDeliveryOption","productAvailabilites","productAvailability","ProductAvailableQuantity","InventLocationId","WarehouseId","foundProductDeliveryOptions","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","customerInformation","wishlists","defaultWishlistName","nameOfWishlist","maxQuantity","maxCartlineQuantity","isStockCheckEnabled","productMaxQuantity","lineMaxQuantity","IsProductAvailable","AvailableQuantity","_getCartItemMaxQuantity","isQuantityLimitsFeatureEnabled","Behavior","MaximumQuantity","isServiceItem","ItemTypeValue","isNullOrUndefined","currentQuantity","lineIndex","finalErrorMessage","includeErrors","outOfStockText","outOfRangeOneText","outOfRangeFormatText","cartlinesErrors","i","LineIndex","DataValidationFailure","ErrorContext","join","_getErrorMessage","payload","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","toLowerCase","isCustomPriceSelected","Dimensions","dimension","DimensionTypeValue","DimensionValue","Value","isOutOfStock","quantityOnChange","updateCartLinesQuantitySuccessHandler","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","pickUpInStore","pickitUpText","remove","addToWishlist","showButtonText","showStatusMessage","showRemoveButton","onSuccess","addToOrderTemplate","quantity","_assembleNode","CartLineGroupItems","carLineViewProps","_assembleGroupCartlines","getPromotionData","promotionData","promotionOptions","Component","showPromotionDialog","promotionPopupId","promotionLinkClick","promotionCloseButtonclick","_hidePromotionDialog","_getImageSettings","_removeItemFromCartHandler","cartlineToRemove","_validateCart","warning","_moveToWishlistSuccessHandler","_updateCartlineQuantity","cartlineToUpdate","newQuantity","orderQuantityLimitsFeatureIsEnabled","updateCartLineQuantity","_fulfillmentStoreIdUpdated","_getOrderQuantityLimitsFeatureFlag","showAvailablePromotions","guestCheckoutUrl","checkoutURL","_getCheckoutURL","isCartEmpty","_getCartLines","RetailMulitplePickupFeatureState","_getCartLinesGroup","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","backtoShoppingAttributes","hasErrors","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","promoCode","_getPromoCode","_getPromotions","mulitplePickUpEnabled","removePromoAriaLabelFormat","hasElements","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","checkoutAsSignInUserButton","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","_generateAddToOrderTemplateDialogResources","_generateOrderTemplateNameDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","createOrderTemplateFromCartButton","waitingComponent","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","RetailB2BEcommerceFeatureState","IsB2b","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","Fragment","promotionStringHeading","promotionSeeAllLink","promotionDialog","_promotion","Promotion","OfferName","cartPromotions","promotionCloseButtonAriaLabel","allErrors","fullError","Wrapper","assertive","outOfStockErrorMessageHeader","header","errors","itemsWithCountLabel","estimatedShippingLabel","otherCharges","estimatedTaxLabel","yetToBeCalculatedText","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","CartLineItems","app","enableStockCheck","maxQuantityForCartLineItem","productDimensionTypeConfiguration","quantityDisplayText","decrementButtonAriaLabel","incrementButtonAriaLabel","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","outOfStockErrorMessage","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","_generateItemAddedToOrderTemplateDialogResources","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","RegExp","test","returnURL","origin","retry","cartResult","validationResult","ValidationFailuresByCartLines","refreshCart","refreshError","validateError","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","featureStatuses","customerInfo","getGenericError","failureReason","addedToCartFailureMessage","cartActionResult","substatus","elementFoundAt","productIdToFind","curQuantity","availableQty","quantityLimit","maxQuantityLimitText","errorDetails","LocalizedMessage","getConfigureErrors","isGiftCard","dimensions","dimensionTypeValue","productDimensionTypeColorErrorMessage","productDimensionTypeConfigurationErrorMessage","productDimensionTypeSizeErrorMessage","productDimensionTypeAmountErrorMessage","productDimensionTypeStyleErrorMessage","getDimensionErrorString","getBuyBoxInventoryLabel","productAvailableQuantity","inventoryClassName","getBuyboxProductTitle","titleHeadingTag","headingTag","getBuyboxProductDescription","getBuyboxAddToCart","defaultMinimumKeyInPrice","defaultMaximumKeyInPrice","minimumKeyInPrice","maximumKeyInPrice","errorState","configureErrors","quantityError","customAmountError","otherError","errorHost","selectedProduct","isUpdatingDimension","isUpdatingDeliveryOptions","keyInPriceAmount","dialogStrings","goToCartText","buyBoxGoToCartText","continueShoppingText","buyBoxContinueShoppingText","headerItemOneText","buyBoxSingleItemText","headerItemFormatText","buyBoxMultiLineItemFormatText","headerMessageText","buyBoxHeaderMessageText","xl","changeUpdatingDimension","isLoadingDeliveryOptions","changeUpdatingDeliveryOptions","button","addToCartText","navigationUrl","productPrice","onError","quantityErrorForState","customAmountErrorForState","otherErrorForState","stockLeft","errorMessageOutOfStock","getQuantityError","formatedAmountLimit","cultureFormatter","formatCurrency","invalidSmallCustomAmountText","invalidLargeCustomAmountText","updateErrorState","missingDimensions","IsGiftCard","getSelectedProduct","isAddServiceItemToCart","isPriceKeyedIn","customPriceAmount","isOrderQuantityLimitsFeatureEnabled","_isOrderQuantityLimitsFeatureEnabled","isAddEmailDeliveryItemToCart","errorBlock","BuyboxErrorBlock","showError","getBuyboxProductPrice","getBuyboxProductRating","ratingsSummary","ratingComponent","averageRating","avgRating","readOnly","averageRatingAriaLabel","ratingCount","reviewsCount","generateAddToOrderTemplateDialogResources","generateOrderTemplateNameDialogResources","generateItemAddedToOrderTemplateDialogResources","generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","getBuyboxProductAddToOrderTemplate","getBuyboxProductAddToWishlist","addToWishlistMessage","removedFromWishlistMessage","addItemToWishlistError","removeItemFromWishlistError","getBuyboxProductQuantity","max","LabelContainerProps","htmlFor","productQuantityHeading","currentCount","newValue","updateQuantity","getBuyboxShopSimilarLook","ShopSimliarLooks","shopSimilarLooksText","searchURL","separator","includes","document","getBuyboxKeyInPrice","buyboxKeyInPriceLabelHeading","updateKeyInPrice","parseFloat","errorMessages","buyboxErrorMessageHeader","getQuantityLimitsMessages","_renderMaxLabel","maxQuantityText","_renderMinLabel","minQuantityText","MAX_VALUE","getBuyboxFindInStore","findInStoreHeaderText","findInStoreDescriptionText","findInStoreLinkText","descriptionTextToShowAllPickupOptions","retailMulitplePickupMFeatureState","modalOpen","dataProduct","behavior","addToCartBehavior","addProductToCart","changeModalOpen","failureResult","assign","findInStoreOnClick","priceComponent","popupProps","productQuantity","setModalOpen","renderModalPopup","openFindInStoreDialog","productPickupOptionList","modal","selectMenu","_onChanged","selectedIndex","dropdownId","selectId","selectedValue","innerText","dropdownName","current","dropdownList","dropdownToggleName","selected","hidden","getBuyboxProductConfigure","productDimensions","getDropdownName","onChanged","notification","dimensionSelectedAsync","dropdowns","productDimensionFull","_mapProductDimensionFullToDropdownViewProps","dimensionChanged","dropdownCallback","selectDimensionFormatString","toLocaleLowerCase","DimensionValues","dimensionValue","select","dimensionUpdateQueue","buyboxCallbacks","newErrorState","updateSelectedProduct","newSelectedProduct","newInventory","newPrice","newDeliveryOptions","_updatePrice","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","reason","ProcessWasDiscardedFromTheQueue","dimensionType","_getDropdownName","isModalOpen","customPrice","dimensionsToUpdate","clearOtherErrorState","mappedDimensions","_updateDimensionValue","ExtensionProperties","reject","newProduct","MasterProductId","variantProduct","newAvailableQuantity","RetailMulitplePickupMFeatureState","_updateQuantitiesInState","newValueId","PRODUCTASSERVICE","mediaGallery","ModuleProps","ProductInfoContainerProps","MediaGalleryContainerProps","configure","findInStore","addToCart","rating","hideRating","inventoryLabel","shopSimilarLook","enableShopSimilarLooks","keyInPrice","enableKeyInPrice","quantityLimitsMessages","DefaultQuantity","MinimumQuantity","information","handleCheckoutOrderConfirmationHeadingChange","getOrderConfirmationPaymentMethods","getLastFourDigit","digits","substr","methods","lines","tenderLine","showAmount","cardLastFourDigit","MaskedCardNumber","isValidCardNumber","isNaN","AuthorizedAmount","showAmountCovered","getCard","getGiftCertificate","getLoyalty","getCash","getOrderDetailsHelp","ContactNumber","getOrderDetailsOrderSummary","ChargeAmount","totalAmount","getOrderDetailsPaymentMethods","getCustomerAccountPayment","handleOrderDetailsHeadingChange","noSalesOrderDetailsText","addressOptions","showFullAddress","channels","salesLInput","getForm","inputRef","inputPinRef","inputExpRef","giftCardExp","onEnterGiftCardNumber","onEnterGiftCardPin","onEnterGiftCardExp","onApplyGiftCard","supportExternalGiftCard","additionalFields","applyGiftCardButton","giftCardFormLabel","giftCardNumberLabel","giftCardPinLabel","giftCardExpLabel","giftCardAlertLabel","giftCardPinPlaceholderText","giftCardExpPlaceholderText","onApply","formProps","inputPinLabel","inputExpLabel","alertFieldLabel","fade","includeAlertClass","inputNumber","inputPin","placeholder","inputExp","applyButton","showGiftCardPinInput","showGiftCardExpInput","inputProps","inputNumProps","inputPinProps","inputExpProps","getItem","getFormattedPrice","canRemove","onRemoveGiftCard","enteredGiftCardLabel","giftCardAvailableBalanceLabel","removeGiftCardButton","balance","CardCurrencyCode","giftCardLast4Digit","selectedGiftCard","removeButton","itemProps","getList","giftCards","listProps","isFetchingGiftCard","isEnabled","isPaymentVerificationRedirection","couldPaidByGiftCard","giftCardSupported","handleCancelOrSubmit","hasSelectedItem","currencyCode","enterGiftCardNumber","enterGiftCardPin","enterGiftCardExp","applyGiftCard","giftCardTypes","getGiftCardTypes","giftCardType","isPinRequired","IsPinRequired","isExpRequired","IsExpirationDateRequired","PaymentMethodId","getGiftCard","focus","findGiftcardTenderTypes","giftcardType","matchedTenderTypes","ConnectorId","noBalanceError","invalidCardInfoError","invalidCardTypeError","noCardPinError","noCardExpError","supportedGiftCardType","internalGiftcardTenderTypes","externalGiftcardTenderTypes","month","year","activeGiftCard","emptyInputError","duplicatedCodeError","invalidCodeError","card","getLoyaltyAmount","requestFormData","query","pv","showAdditionalFields","shouldPayGiftCard","moduleClassName","checkoutGiftCardProps","showGiftCard","form","getSalesLines","moduleComponentProps","shipments","isCurrentChannel","imageOnly","showCompleteAddress","shipment","_shipment","ShipmentLines","_shipmentLine","ItemId","getSalesLinesInput","Shipments","PickUpAtStoreComponent","EmailDeliveryComponent","LineItemComponent","LineItemGroupComponent","lineItem","LineItemGroupComponentWithMultiplePickUp","LineItemComponentWithMultiplePickUp","PickUpAtStoreComponentWithMultiplePickUp","LineItemsComponent","OrderSummaryComponent","canShow","checkoutProps","headerProps","hasSalesOrder","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","termsAndConditionsProps","orderConfirmation","guidedForm","placeOrderButton","termsAndConditions","keepShoppingButton","isValidationPassed","handleCheckoutHeadingChange","checkoutHeading","cartStatus","isEmptyCart","getSlotItems","onPlaceOrder","checkoutOutOfStockErrorMessage","invalidCartVersionErrorMessage","isOverMaxQuantity","hasOrderConfirmation","updateCartLineEmailAddress","emailDeliveryCartLines","lineDeliverySpecifications","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","ElectronicDeliveryEmailAddress","updatedCart","productInventoryInformation","productInventory","getActiveChildModuleStates","onContainerReady","redirectToCartPage","notFoundEditCartLinkMessage","editCartLink","validateForCheckout","isOrderQuantityLimitsFeatureEnabledInHq","isOrderQuantityLimitsFeatureEnabledInSiteSettings","isEditorialMode","params","isEditor","isTermsAndConditionAccepted","isCartReady","disableGuidedCheckoutFlow","placeOrderText","confirmPaymentText","cookieConsentRequiredMessage","checkoutClass","checkoutInformation","isConsentGiven","cookies","isMobile","device","Type","checkoutBtnText","renderMsdyn365Text","placeOrder","canPlaceOrder","shipToLabel","storeLabel","phoneLabel","County","FullAddress","getSalesLine","salesLineQuantityText","phoneAriaLabel","buyItAgainLabel","buyItAgainAriaLabel","orderStatusReadyForPickup","orderStatusProcessing","orderStatusShipped","orderStatusPickedUp","orderStatusCanceled","orderStatusEmailed","pickedUpSalesLines","deliveredSalesLines","carryOutSalesLines","emailSalesLines","trackingLabel","trackingAriaLabel","trackingComingSoonLabel","pickupDateTimeslotText","pickupTimeslotPlaceHolder","salesStatusStringMap","canceled","readyForPickup","pickedUp","shipped","unknown","emailed","deliveryTypeStringMap","pickUp","ship","carryOut","email","pickupMode","getPickupModeDesc","getPickupDeliveryMode","SalesStatusValue","salesStatusString","salesStatusComp","deliveryTypeString","getdeliveryTypeString","deliveryTypeClass","getdeliveryTypeClassName","storePickUp","getStoreName","deliveryTypeComp","TrackingUrl","TrackingNumber","BuyItAgain","buyItAgainAttributes","fallbackImageUrl","canShowTimeslot","PickupTimeslotStartDateTime","PickupTimeslotEndDateTime","pickupDateTimeslotInfo","salesLineProps","fallBackSrc","isSalesLine","buyAgainButton","salesLineDeliveryMode","retailMultiplePickupOption","deliveryO","deliveryDesc","balanceCheckButton","_isEnabled","_getFormattedPrice","_enterGiftCardNumber","_clearError","_enterGiftCardPin","_enterGiftCardExp","_setError","_applyGiftCard","_getGiftCardTypes","_getGiftCard","_findGiftcardTenderTypes","giftCardBalanceCheckProps","getOrderConfirmationOrderSummary","isBusy","setIsBusy","Purchase","getOrderSummary","showLineItems","step","ariaValueMax","ariaValueMin","ariaValueNow","onBlur","CardNumber","updateLoyaltyCardId","shouldPayLoyalty","_dialogToggleRef","_applyLoyaltyPoints","_removeLoyaltyPoints","_onInputChange","_onBlur","dollarsApplied","maxDollars","isFetchingLoyaltyCard","loyaltyTransactionEstimation","MaxCurrencyValueOfLoyaltyPoints","_updateEstimate","_updateLoyalty","isShowLoyalty","isShowAddLoyalty","checkoutLoyalty","showLoyalty","loyaltyHeadingText","coveredAmountText","loyaltyCoveredAmountText","addLoyalty","drawer","toggleButtonText","_drawerHeader","openGlyph","closeGlyph","glyphPlacement","cardNumber","rewardPoints","points","_renderPointSection","availablePointsLabel","expiringLoyaltyPointsLabel","loyaltyAmountContainer","appliedLoyaltyAmountContainer","loyaltyAmountLabel","payWithLoyaltyAmountLabel","loyaltyAmountInput","loyaltyAmountApplyButton","applyCheckoutLoyaltyPaymentText","showAppliedAmount","loyaltyAmountAppliedText","loyaltyAmountAppliedPrice","loyaltyAmountRemoveButton","removeCheckoutLoyaltyPaymentText","checkoutLoyaltyRewardPoint","availablePointsText","activePoints","ActivePoints","expiringPointsText","expiringPoints","PointsExpiringSoon","num","element","getElementById","channelConfig","loyalPointsRequest","_query","newMaxPoints","getTenderIdOperationIdMap","countItems","getSalesLinesByDelivery","getSalesStatusCode","statusValue","groupSalesLines","flatGroup","getGroupBySalesStatusCode","groupBySalesStatusCode","getGroupByAddressId","addressId","groupByAddressId","TrackingId","getGroupByTrackingId","trackingId","groupByTrackingId","getDateTimeslot","placeHolder","startDate","endDate","date","Intl","DateTimeFormat","timeZone","format","timeslotformatter","hour","minute","hour12","CheckoutGuidedCard","editButtonRef","formCardRef","renderFooder","isVisted","isSubmitting","hasControlGroup","saveAndContinueBtnLabel","canSubmit","canCancel","Save","SaveContinue","saveBtnAttributes","Cancel","cancelBtnAttributes","focusOnFirstFocusableElement","node","findDOMNode","child","focusOnEditButton","scrollToTitle","formCard","scrollIntoView","getTitle","Tag","prevProps","isActive","onNext","changeBtnLabel","CheckoutChange","changeBtnAttributes","canEdit","active","expanded","closed","visted","initialized","ready","pending","updating","SearchState","AutoSuggestInput","searchText","top","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","searchCriteria","ProductSearchCriteria","SearchCondition","Context","CatalogId","catalogId","HitPrefix","HitSuffix","SuggestionType","searchSuggestions","Paging","Top","ImageUrl","AllSearchResults","autoSuggestPromises","KeywordSuggestionsComponent","suggestions","_generateLink","_getHighlightedText","suggestion","searchPageURL","searchQsp","formattedLink","route","formattedText","dangerouslySetInnerHTML","ProductSuggestionsComponent","autoSuggestProps","productSuggestionHeading","moduleType","_renderTitle","productAutoSuggestionHeading","thumbnail","_renderThumbnail","Value3","DecimalValue","_renderPrice","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","adjustedPrice","basePrice","BasePrice","CategorySuggestionsComponent","categorySuggestionHeading","categoryAutoSuggestionHeading","splitValue","pop","_getCategoryLink","searchRefiners","urlPath","categoryRefiners","refiners","KeyName","refiner","Values","RefinerRecordId","encodedRefiner","encodeURIComponent","JSON","stringify","compressRefiners","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","isSearchFormExpanded","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","inputNode","maxLength","submitBtnNode","cancelBtn","submitBtn","LabelComponent","searchLabelClass","searchLabelArialLabel","searchtext","searchCollapsedLabel","waitTime","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","formReference","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","_handleInputChange","cancellabelDebounce","cancel","_getSuggestionType","inputSuggestionType","results","_getSearchRefiners","autoSuggestAriaLabel","_setAutoSuggestResultCount","setTimeout","suggestionTypes","distinctSuggestionTypes","suggestionTypeItem","charAt","toUpperCase","slice","_handleSubmit","_appendQueryParams","_handleCancelSearchChange","isInitialState","qsp","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","setAttribute","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","searchInputMaxLength","suggestionTypeCriterion","searchFormClass","body","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","keywordSuggestions","productSuggestions","categorySuggestions","Search","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","autoComplete","UlKeyword","UlProduct","UlCategory","autosuggestKeyword","autosuggestProduct","autosuggestCategory","CheckoutGuidedForm","currentStep","getEnabledModules","getStep","getId","getHeading","OrderHistoryFilterState","getOrderHistoryFilterStateResources","filterState","CurrentUser","orderHistoryFilterYourOrderHistory","OrganizationWide","orderHistoryFilterOrganizationWide","OrderHistoryFilterComponent","createComponent","component","IsB2bAdmin","popoverRef","createRef","popoverState","setPopoverState","useState","togglePopover","setFilterState","currentState","onFilterStateClick","clickedState","onFilterStateChanged","getEnumValues","onStateClick","stateStringRepresentation","renderFilterStateItem","paging","getSalesOrderHistoryWithHydrationsAction","salesOrders","Skip","skip","queryResultSetting","getOrganizationWideOrderShipmentHistory","productIdsByChannelId","currentChannelId","productIdsByChannel","orderProductId","orderChannelId","splitProductsByChannelId","getProductsPromise","entryChannelId","entryProductIdsList","productIds","productInputs","getProductsCall","productList","memo","getSalesOrder","detailsAriaLabel","detailsLabel","salesOrderProps","TransactionId","OrderDetails","orderDetailsAttributes","orderDetailsLink","url","_getorderDetailsPageUrl","handleOrderHistoryHeadingChange","onMoreButtonClick","getOrderHistory","renderExtraActions","initState","orderHistory","isShowMoreButton","pageSize","ex","noOrderHistoryLable","moreButtonText","orderCountLabel","ordersCountLabel","orderHistoryProps","emptyMessage","_orderCountLabel","ViewMore","viewMoreAttributes","extraActions","moreButton","orderedProducts","redirect","orderConfirmationUrl","updateSalesOrder","newSalesOrder","newOrderedProducts"],"mappings":"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","file":"static/js/7.794f0c18a90e7128.chunk.js","sourcesContent":["\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsDescriptionProps {\n description?: string;\n}\n\n/**\n *\n * AddPaymentForm SFC\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsDescription: React.FC = ({\n description\n}) => {\n if (!description) {\n return null;\n }\n\n return {description};\n};\n\nexport default CheckoutDeliveryOptionsDescription;","\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsErrorMessageProps {\n message?: string;\n}\n\n/**\n *\n * AddPaymentForm SFC\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsErrorMessage: React.FC = ({\n message\n}) => {\n if (!message) {\n return null;\n }\n\n return (\n

{message}

\n );\n\n};\n\nexport default CheckoutDeliveryOptionsErrorMessage;","\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsErrorTitleProps {\n title?: string;\n}\n\n/**\n *\n * AddPaymentForm SFC\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsErrorTitle: React.FC = ({\n title\n}) => {\n if (!title) {\n return null;\n }\n\n return (\n

{title}

\n );\n\n};\n\nexport default CheckoutDeliveryOptionsErrorTitle;","\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nexport interface ICheckoutDeliveryOptionsRadioButtonProps {\n isChecked: boolean;\n value?: string;\n ariaSetSize: number;\n ariaPosInSet: number;\n ariaLabel?: string;\n telemetryContent?: ITelemetryContent;\n onChange(event: React.ChangeEvent): void;\n}\n\n/**\n *\n * AddPaymentForm SFC\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsRadioButton: React.FC = ({\n isChecked,\n value,\n ariaSetSize,\n ariaPosInSet,\n ariaLabel,\n telemetryContent,\n onChange\n}) => {\n if (!value) {\n return null;\n }\n\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.DeliveryOptions);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n return (\n \n );\n};\n\nexport default CheckoutDeliveryOptionsRadioButton;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { action, observable, reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { Button, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelDeliveryOptionConfiguration,FilterDeliveryModeOption } from '@msdyn365-commerce/retail-proxy';\nimport {\n getDeliveryOptionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n Address, CartLine, DeliveryOption\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICheckoutDeliveryOptionsData } from './checkout-delivery-options.data';\nimport { filterDeliveryModeOption, ICheckoutDeliveryOptionsProps } from './checkout-delivery-options.props.autogenerated';\nimport DescriptionComponent from './components/checkout-delivery-options.description';\nimport ErrorMessageComponent from './components/checkout-delivery-options.error-message';\nimport ErrorTitleComponent from './components/checkout-delivery-options.error-title';\nimport RadioButtonComponent from './components/checkout-delivery-options.radio-button';\n\nexport interface ICheckoutDeliveryOptionsModuleProps extends ICheckoutDeliveryOptionsProps, IModuleStateProps { }\n\nexport interface ICheckoutDeliveryOption {\n DeliveryOption: INodeProps;\n description?: React.ReactNode;\n price?: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionEdit extends ICheckoutDeliveryOption {\n code: string;\n radioButton?: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionsList {\n DeliveryOptionsList: INodeProps;\n list: ICheckoutDeliveryOptionEdit[];\n}\n\nexport interface ICheckoutDeliveryOptionsError {\n Error: INodeProps;\n title: React.ReactNode;\n message: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionsViewState {\n isLoading: boolean;\n isError: boolean;\n isShowList: boolean;\n isShowSelected: boolean;\n isShowSaveButton: boolean;\n isShowEditButton: boolean;\n isShowCancelButton: boolean;\n}\n\nexport interface ICheckoutDeliveryOptionsViewProps extends ICheckoutDeliveryOptionsProps<{}> {\n CheckoutDeliveryOptions: IModuleProps;\n selectedItemId: string;\n deliveryOptionsData: DeliveryOption[];\n isLoading: boolean;\n errorMessageData: string;\n viewState: ICheckoutDeliveryOptionsViewState;\n deliveryOptions?: ICheckoutDeliveryOptionsList;\n deliveryOptionSelected?: ICheckoutDeliveryOption;\n errorMessage?: ICheckoutDeliveryOptionsError;\n waiting?: React.ReactNode;\n saveButton?: React.ReactNode;\n editButton?: React.ReactNode;\n cancelButton?: React.ReactNode;\n onDeliveryOptionChange(event: React.ChangeEvent): void;\n onSave(): void;\n onEdit(): void;\n onCancel(): void;\n}\n\n/**\n *\n * CheckoutDeliveryOptions component\n * @extends {React.Component>}\n */\n// @ts-ignore\n@withModuleState\n@observer\nclass CheckoutDeliveryOptions extends React.Component {\n @observable private selectedItemId: string = '';\n @observable private deliveryOptions: DeliveryOption[] = [];\n @observable private isLoading: boolean = false;\n @observable private errorMessage?: string;\n private cartDeliveryMode?: string;\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n private telemetryContent?: ITelemetryContent;\n\n constructor(props: ICheckoutDeliveryOptionsModuleProps) {\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.props.data.checkout.then(async () => {\n await this.init();\n });\n\n // @ts-ignore: Compiler not reconizing condition check for function params\n reaction(\n () => this.props.data.checkout.result && this.props.data.checkout.result.shippingAddress,\n async () => {\n await this.loadDeliveryOptions();\n this.props.moduleState.setIsCancellable(false);\n }\n );\n }\n\n public render(): JSX.Element | null {\n if (!this.canShip()) {\n this.props.context.telemetry.error('Checkout delivery options content is empty, module wont render');\n return null;\n }\n\n const {\n moduleState: { isReady, isUpdating, hasError }\n } = this.props;\n const isError = !this.isLoading && hasError;\n const isShowList = !this.isLoading && !hasError && isUpdating;\n const isShowSelected = !this.isLoading && !hasError && isReady;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.\n find(feature => feature.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n const viewProps = {\n ...this.props,\n onDeliveryOptionChange: this.onDeliveryOptionChange,\n selectedItemId: this.selectedItemId,\n deliveryOptionsData: this.deliveryOptions,\n isLoading: this.isLoading,\n errorMessageData: this.errorMessage,\n viewState: {\n isLoading: this.isLoading,\n isError: isError,\n isShowList: isShowList,\n isShowSelected: isShowSelected,\n isShowSaveButton: isShowList && !this.props.moduleState.hasExternalSubmitGroup,\n isShowEditButton: isShowSelected && !this.props.moduleState.hasExternalSubmitGroup,\n isShowCancelButton: isShowList && !this.props.moduleState.hasExternalSubmitGroup && !!this.getSavedDeliveryOption()\n },\n CheckoutDeliveryOptions: {\n moduleProps: this.props,\n className: classname('ms-checkout-delivery-options', this.props.config.className)\n },\n deliveryOptions: {\n // @ts-ignore\n DeliveryOptionsList: { className: 'ms-checkout-delivery-options__list' },\n list: this.getDeliveryOptionList()\n },\n deliveryOptionSelected: this.getDeliveryOptionSelected(),\n errorMessage: this.getErrorMessage(),\n waiting: ,\n saveButton: this.getSaveButton(),\n editButton: this.getEditButton(),\n cancelButton: this.getCancelButton(),\n onSave: this.onSave,\n onEdit: this.onEdit,\n onCancel: this.onCancel\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n @action\n private init = async (): Promise => {\n this.props.moduleState.init({\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit,\n status: this.canShip() ? 'updating' : 'disabled'\n });\n\n this.cartDeliveryMode = this.getSavedDeliveryOption();\n\n await this.loadDeliveryOptions();\n };\n\n private canShip = (): boolean => {\n const hasInvoice = this.props.data.checkout.result?.checkoutCart.hasInvoiceLine;\n return !hasInvoice && this.getCartLinesForShipping().length > 0;\n };\n\n private isDeliveryModeExists = (deliveryMode: string | undefined): boolean => {\n if (deliveryMode) {\n if (this.deliveryOptions.find(deliveryOption => deliveryOption.Code === deliveryMode)) {\n return true;\n }\n }\n return false;\n };\n\n private getDeliveryOptionSelected = (): ICheckoutDeliveryOption | null => {\n const selectedItem = this.deliveryOptions.find(deliveryOption => deliveryOption.Code === this.selectedItemId);\n if (!selectedItem) {\n this.props.context.telemetry.error('Checkout delivery options content is empty, module wont render');\n return null;\n }\n\n const { id, typeName, context } = this.props;\n const { priceFree } = this.props.resources;\n const price = get(selectedItem, 'ShippingChargeAmount', 0);\n\n // @ts-ignore\n return {\n // @ts-ignore\n DeliveryOption: { className: 'ms-checkout-delivery-options__option-selected' },\n description: ,\n price: \n };\n };\n\n private getErrorMessage = (): ICheckoutDeliveryOptionsError => {\n const { errorMessageTitle } = this.props.resources;\n return {\n // @ts-ignore\n CheckoutDeliveryOptionsError: { tag: 'span', className: 'ms-address-form__error', role: 'alert', 'aria-live': 'assertive' },\n title: ,\n message: \n };\n };\n\n private getDeliveryOptionList = (): ICheckoutDeliveryOptionEdit[] => {\n const count = this.deliveryOptions.length;\n const { priceFree } = this.props.resources;\n const { id, typeName, context } = this.props;\n\n // @ts-ignore\n return this.deliveryOptions.map((deliveryOption: DeliveryOption, index: number) => {\n return {\n // @ts-ignore\n DeliveryOption: { className: 'ms-checkout-delivery-options__option' },\n code: deliveryOption.Code || '',\n radioButton: (\n \n ),\n description: (\n \n ),\n price: (\n \n )\n };\n });\n };\n\n private getSaveButton = (): React.ReactNode => {\n const { saveBtnLabel = 'Save' } = this.props.resources;\n return (\n \n {saveBtnLabel}\n \n );\n };\n\n private getEditButton = (): React.ReactNode => {\n const { editBtnLabel = 'Change' } = this.props.resources;\n return (\n \n {editBtnLabel}\n \n );\n };\n\n private getCancelButton = (): React.ReactNode => {\n const { cancelBtnLabel = 'Cancel' } = this.props.resources;\n return (\n \n {cancelBtnLabel}\n \n );\n };\n\n private setError = (errorMessage: string): void => {\n this.props.telemetry.error(errorMessage);\n this.props.moduleState.setHasError(true);\n this.props.moduleState.onUpdating();\n this.errorMessage = errorMessage;\n };\n\n private clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.errorMessage = undefined;\n };\n\n private onSave = (): void => {\n this.onSubmit();\n };\n\n private onEdit = (): void => {\n this.onUpdating();\n };\n\n private onSubmit = (): void => {\n // tslint:disable-next-line:no-floating-promises\n this.updateCartDeliverySpecification(this.selectedItemId);\n };\n\n private onCancel = (): void => {\n // Reset to the saved value\n const savedDeliveryOption = this.getSavedDeliveryOption();\n if (savedDeliveryOption) {\n this.selectedItemId = savedDeliveryOption;\n this.onReady();\n } else {\n this.onUpdating();\n }\n };\n\n private getSavedDeliveryOption = (): string | undefined => {\n const cartLinesForShipping = this.getCartLinesForShipping();\n return cartLinesForShipping[0] && cartLinesForShipping[0].DeliveryMode;\n };\n\n private updateCartDeliverySpecification = async (deliveryModeId: string): Promise => {\n if (deliveryModeId.trim() === '') {\n return;\n }\n\n const { resources } = this.props;\n const checkoutState = this.props.data.checkout.result as ICheckoutState;\n const updateCartDeliverySpecificationInput = {\n deliveryModeId: deliveryModeId,\n shippingAddress: checkoutState.shippingAddress,\n channelDeliveryOptionConfig : this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined\n };\n\n this.clearError();\n this.onPending();\n\n await checkoutState.checkoutCart.updateCartDeliverySpecification(updateCartDeliverySpecificationInput)\n .then((response) => {\n if (response.status === 'FAILED') {\n this.setError(resources.genericErrorMessage);\n } else {\n this.onReady();\n this.props.moduleState.setIsCancellable(true);\n }\n })\n .catch(\n () => {\n this.setError(resources.genericErrorMessage);\n }\n );\n };\n\n private getCartLinesForShipping = (): CartLine[] => {\n const { request } = this.props.context;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\n\n return this.retailMultiplePickUpOptionEnabled ?\n ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(\n cartLine => (cartLine.DeliveryMode && cartLine.DeliveryMode !== '')\n ? (cartLine.DeliveryMode !== this.channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLine.DeliveryMode) && cartLine.DeliveryMode !== emailDeliveryModeCode)\n : cartLine\n )\n : ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(\n cartLine => (cartLine.DeliveryMode && cartLine.DeliveryMode !== '')\n ? (cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode)\n : cartLine\n );\n };\n\n // tslint:disable-next-line:cyclomatic-complexity\n private getDeliveryOptions = async (shippingAddress: Address): Promise => {\n if (!this.props.data.checkout.result) {\n return;\n }\n\n const { context, resources, config } = this.props;\n const cartState = this.props.data.checkout.result?.checkoutCart;\n const cartId = (cartState.cart as Cart).Id;\n\n if (context) {\n this.isLoading = true;\n this.deliveryOptions = [];\n this.selectedItemId = '';\n this.clearError();\n\n try {\n\n let originalDeliveryMode: string = '';\n const shippingCartLines = this.getCartLinesForShipping();\n const hasShippingDeliveryLines = (shippingCartLines && shippingCartLines.length > 0 && shippingCartLines[0].DeliveryMode);\n if (hasShippingDeliveryLines) {\n\n // first store the delivery mode, so that we can restore the shipping information.\n originalDeliveryMode = shippingCartLines[0].DeliveryMode || '';\n\n // clear the delivery information on retail server, so GetDeliveryOptions charge calculation works correctly\n const cart = cartState.cart;\n await cartState.clearCartLinesDeliveryInformation({ cart });\n }\n\n // TODO: Check if we can move this getDeliveryOptions to checkout state\n let deliveryOptionFilter: FilterDeliveryModeOption;\n switch (config.filterDeliveryModeOption) {\n case filterDeliveryModeOption.none:\n deliveryOptionFilter = FilterDeliveryModeOption.None;\n break;\n case filterDeliveryModeOption.filterOutNonCarrierDeliveryMode:\n deliveryOptionFilter = FilterDeliveryModeOption.FilterOutNonCarrierDeliveryMode;\n break;\n default:\n deliveryOptionFilter = FilterDeliveryModeOption.FilterOutNonCarrierDeliveryMode;\n }\n const response = await getDeliveryOptionsAsync({ callerContext: context.actionContext, queryResultSettings: {} }, cartId, shippingAddress, [], deliveryOptionFilter, true);\n\n if (hasShippingDeliveryLines) {\n await this.updateCartDeliverySpecification(originalDeliveryMode);\n }\n\n if (response && response.length) {\n this.deliveryOptions = response;\n }\n } catch (error) {\n this.setError(resources.genericErrorMessage);\n }\n\n if (this.deliveryOptions.length === 0) {\n this.setError(resources.deliveryOptionsNotFound);\n } else {\n if (this.cartDeliveryMode && this.isDeliveryModeExists(this.cartDeliveryMode) && !this.props.data.checkout.result?.checkoutCart.cart.ShippingAddress) {\n this.selectedItemId = this.cartDeliveryMode;\n this.cartDeliveryMode = undefined;\n this.onReady();\n } else {\n this.onUpdating();\n this.selectedItemId = this.deliveryOptions.length > 0 ? this.deliveryOptions[0].Code || '' : ''; // By default, select first delivery\n }\n }\n\n this.isLoading = false;\n }\n };\n\n private loadDeliveryOptions = async (): Promise => {\n const shippingAddress = this.props.data.checkout.result && this.props.data.checkout.result.shippingAddress;\n\n if (this.canShip() && shippingAddress) {\n await this.getDeliveryOptions(shippingAddress);\n }\n };\n\n private onDeliveryOptionChange = (event: React.ChangeEvent) => {\n const deliveryModeId = event.currentTarget.value;\n this.selectedItemId = deliveryModeId;\n };\n\n private onReady = () => {\n this.props.moduleState.onReady();\n };\n\n private onUpdating = () => {\n this.props.moduleState.onUpdating();\n };\n\n private onPending = () => {\n this.props.moduleState.onPending();\n };\n}\n\nexport default CheckoutDeliveryOptions;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getProductUrlSync, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { CartLineItemComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { CartLine, OrgUnitLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classnames from 'classnames';\nimport get from 'lodash/get';\nimport groupBy from 'lodash/groupBy';\nimport * as React from 'react';\nimport { ICheckoutData } from '../checkout.data';\nimport { ICheckoutProps } from '../checkout.props.autogenerated';\n\ntype deliveryType = 'pickup' | 'ship' | 'email';\n\nexport interface IPickUpAtStore {\n PickUpAtStore: INodeProps;\n label: React.ReactNode;\n location: React.ReactNode;\n}\n\nexport interface IEmailDelivery {\n EmailDelivery: INodeProps;\n label: React.ReactNode;\n}\n\nexport interface ILineItem {\n LineId: string;\n LineItem: INodeProps;\n item?: React.ReactNode;\n pickUpAtStore?: IPickUpAtStore;\n emailDelivery?: IEmailDelivery;\n}\n\nexport interface ILineItemDeliveryGroup {\n LineItemDeliveryGroup: INodeProps;\n LineItemList: INodeProps;\n heading: React.ReactNode;\n lineItemWraper?: React.ReactNode;\n lineItemWraperIcon?: React.ReactNode;\n lineItems: ILineItem[];\n}\n\nexport interface ILineItems {\n LineItems: INodeProps;\n Header: INodeProps;\n heading: React.ReactNode;\n editLink: React.ReactNode;\n itemsForPickup?: ILineItemDeliveryGroup;\n itemsForShip?: ILineItemDeliveryGroup;\n itemsForEmail?: ILineItemDeliveryGroup;\n itemsGroupWithMulitplePickupMode?: ILineItemDeliveryGroup[];\n}\n\n// tslint:disable-next-line:max-func-body-length\nexport const getLineItems = (input: ICheckoutProps, telemetryContent?: ITelemetryContent): ILineItems | undefined => {\n const pickupDeliveryModeCode = get(input, 'context.request.channel.PickupDeliveryModeCode');\n const emailDeliveryModeCode = get(input, 'context.request.channel.EmailDeliveryModeCode');\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = input.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n const _getDeliveryLocation = (cartLine: CartLine): string => {\n const orgUnitLocations = get(input, 'data.orgUnitLocations.result');\n if (!cartLine.FulfillmentStoreId || !orgUnitLocations) {\n return '';\n }\n\n const locationMatch = (orgUnitLocations || []).find((location: OrgUnitLocation): boolean => {\n return location.OrgUnitNumber === cartLine.FulfillmentStoreId;\n });\n\n return locationMatch && locationMatch.OrgUnitName;\n };\n\n const _getProduct = (productId: number): SimpleProduct | undefined => {\n const products = get(input, 'data.products.result') || [];\n return products.find((_product: SimpleProduct) => {\n return productId === _product.RecordId;\n });\n };\n\n const _getLineItemComponent = (cartLine: CartLine): JSX.Element | undefined => {\n const product = cartLine.ProductId && _getProduct(cartLine.ProductId);\n const {\n id,\n typeName,\n context,\n config: { imageSettings, showShippingChargesForLineItems },\n resources: {\n quantityDisplayString,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n productDimensionTypeAmount,\n configString,\n inputQuantityAriaLabel,\n discountStringText,\n shippingCharges,\n },\n context: {\n request: { gridSettings }\n }\n } = input;\n\n if (!product) {\n return;\n }\n\n return (\n \n );\n };\n\n const _getPickUpAtStoreComponents = (pickupDeliveryLocation: string): IPickUpAtStore => {\n const {\n resources: { pickUpAtStoreWithLocationText }\n } = input;\n\n return {\n PickUpAtStore: { className: 'ms-checkout__pick-up-at-store' },\n label: {pickUpAtStoreWithLocationText},\n location:
{pickupDeliveryLocation}
\n };\n };\n\n const _getEmailDeliveryComponents = (): IEmailDelivery => {\n const {\n resources: { emailDeliveryText }\n } = input;\n\n return {\n EmailDelivery: { className: 'ms-checkout__email-delivery' },\n label: {emailDeliveryText},\n };\n };\n\n const _getLineItemsComponents = (items: CartLine[]): ILineItem[] => {\n return items.map(cartLine => {\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\n const isPickUp = _getCartPickDeliveryMode(cartLine);\n const isEmailDelivery = (cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\n return {\n LineId: cartLine.LineId || '',\n LineItem: { className: 'ms-checkout__line-item' },\n item: _getLineItemComponent(cartLine),\n pickUpAtStore: isPickUp ? _getPickUpAtStoreComponents(pickupDeliveryLocation) : undefined,\n emailDelivery: isEmailDelivery ? _getEmailDeliveryComponents() : undefined\n };\n });\n };\n\n const _getCartPickDeliveryMode = (cartLineItem: CartLine): boolean => {\n return (!StringExtensions.isNullOrWhitespace(cartLineItem.DeliveryMode)) ? retailMultiplePickUpOptionEnabled ?\n cartLineItem.DeliveryMode === channelDeliveryOptionConfig?.result?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLineItem.DeliveryMode) : (cartLineItem.DeliveryMode === pickupDeliveryModeCode): false ;\n };\n\n const _getCartShipDeliveryMode = (cartLineItem: CartLine): boolean => {\n return (!StringExtensions.isNullOrWhitespace(cartLineItem.DeliveryMode)) ? retailMultiplePickUpOptionEnabled ?\n cartLineItem.DeliveryMode !== channelDeliveryOptionConfig?.result?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLineItem.DeliveryMode) : (cartLineItem.DeliveryMode !== pickupDeliveryModeCode): false ;\n };\n\n const _getGroupTitleComponent = (count: number, type: deliveryType): string => {\n const {\n resources: {\n itemLabel,\n itemsLabel,\n inStorePickUpLabel,\n shippingCountCheckoutLineItem\n }\n } = input;\n\n let emailDeliveryModeDesc: string = '';\n\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\n emailDeliveryModeDesc = emailDeliveryModeDesc ? emailDeliveryModeDesc : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === emailDeliveryModeCode)?.Description!;\n });\n\n const suffix = count > 1 ? itemsLabel : itemLabel;\n const title = type === 'ship' ? shippingCountCheckoutLineItem : type === 'pickup' ? inStorePickUpLabel : `${emailDeliveryModeDesc} (${count} ${suffix})`;\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\n };\n\n const _countItems = (items: CartLine[]): number => {\n return items.reduce((count, item) => {\n return count + (item.Quantity || 0);\n // tslint:disable-next-line:align\n }, 0);\n };\n\n const _filterItemsByDiliveryType = (type: deliveryType): CartLine[] => {\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\n if (type === 'ship') {\n return cart.CartLines.filter((\n cartLine: CartLine) => (cartLine.DeliveryMode && cartLine.DeliveryMode !== '')\n ? (_getCartShipDeliveryMode(cartLine) && cartLine.DeliveryMode !== emailDeliveryModeCode)\n : cartLine\n );\n } else if (type === 'pickup') {\n return cart.CartLines.filter((cartLine: CartLine) => (cartLine.DeliveryMode && cartLine.DeliveryMode !== '')\n ? (_getCartPickDeliveryMode(cartLine)) : null\n );\n } else {\n return cart.CartLines.filter((cartLine: CartLine) => cartLine.DeliveryMode === emailDeliveryModeCode);\n }\n };\n\n const _getLineItemsByDeliveryType = (type: deliveryType): ILineItemDeliveryGroup | undefined => {\n if ((pickupDeliveryModeCode === '' || pickupDeliveryModeCode === undefined) && (type === 'pickup' || type === 'email')) {\n return;\n }\n\n const items = _filterItemsByDiliveryType(type);\n\n if (items.length === 0) {\n return undefined;\n }\n\n const count = _countItems(items);\n const title = _getGroupTitleComponent(count, type);\n\n return {\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group', type) },\n LineItemList: { className: 'ms-checkout__line-items-list' },\n heading:
{title}
,\n lineItems: _getLineItemsComponents(items)\n };\n };\n\n const _getLineItems = (): ILineItems | undefined => {\n const {\n context,\n config: { lineItemsHeading },\n data: { products },\n resources: { editCartText }\n } = input;\n\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.EditCart);\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\n const groupClass = retailMultiplePickUpOptionEnabled ? ' multiple-pickup-enabled': '';\n if (!cart || !cart.CartLines || !cart.CartLines.length || !products) {\n return undefined;\n }\n\n return {\n LineItems: { className: `ms-checkout__line-items${groupClass}` },\n Header: { className: 'ms-checkout__line-items-header' },\n heading: lineItemsHeading && lineItemsHeading.text && (\n \n ),\n editLink: (\n \n {editCartText}\n \n ),\n itemsForPickup: _getLineItemsByDeliveryType('pickup'),\n itemsForShip: _getLineItemsByDeliveryType('ship'),\n itemsForEmail: _getLineItemsByDeliveryType('email'),\n itemsGroupWithMulitplePickupMode : retailMultiplePickUpOptionEnabled? _getLineItemsByDeliveryTypeWithMulitplePickupMode() : undefined\n };\n };\n\n const handleLineItemHeadingChange = (event: Msdyn365.ContentEditableEvent) => {\n const {\n config: { lineItemsHeading }\n } = input;\n lineItemsHeading!.text = event.target.value;\n };\n\n const _getGroupTitleComponentWithMultiplePickUp = (count: number, type: deliveryType, deliveryMode?: string, fulFillmentStoreId?: string): string => {\n const {\n resources: {\n itemLabel,\n itemsLabel\n }\n } = input;\n\n let emailDeliveryModeDesc: string = '';\n let pickupDeliveryModeDesc: string = '';\n\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\n emailDeliveryModeDesc = emailDeliveryModeDesc ? emailDeliveryModeDesc : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === emailDeliveryModeCode)?.Description!;\n });\n\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\n pickupDeliveryModeDesc = pickupDeliveryModeDesc ? pickupDeliveryModeDesc : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === deliveryMode)?.Description!;\n });\n\n const pickupTitle:string = `${pickupDeliveryModeDesc}, ${fulFillmentStoreId}`;\n const suffix = count > 1 ? itemsLabel : itemLabel;\n const title = type === 'ship' ? `(${count} ${suffix})` : type === 'pickup' ? `${pickupTitle} (${count} ${suffix})` : `${emailDeliveryModeDesc} (${count} ${suffix})`;\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\n };\n\n const _filterItemsByMultiplePickupMode = (): CartLine[][] => {\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => (item.DeliveryMode));\n const groupDelivery = getGroupByDelivery(cart.CartLines);\n const cartLinesGroup: CartLine[] = [];\n const cartLinesGrp: CartLine[][] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryMode, groupByDeliveryType]) => {\n // @ts-ignore\n groupDelivery[deliveryMode] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n cartLinesGrp.push(cartLine);\n });\n });\n\n return cartLinesGrp;\n };\n\n const _getLineItemsByDeliveryTypeWithMulitplePickupMode = (): ILineItemDeliveryGroup[] | undefined => {\n if (pickupDeliveryModeCode === '' || pickupDeliveryModeCode === undefined) {\n return;\n }\n\n const {\n resources: {\n multiplePickUpLabel,\n shippingLable\n }\n } = input;\n\n const items = _filterItemsByMultiplePickupMode();\n\n if (items.length === 0) {\n return undefined;\n }\n\n const lineItemDeliveryGroup:ILineItemDeliveryGroup[] = [];\n items.map(item => {\n const count = _countItems(item);\n const cartLine = item[0];\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\n const type: deliveryType = cartLine.FulfillmentStoreId && cartLine.DeliveryMode ? 'pickup' : cartLine.FulfillmentStoreId === '' && cartLine.DeliveryMode === emailDeliveryModeCode ? 'email': 'ship';\n const title = _getGroupTitleComponentWithMultiplePickUp(count, type, cartLine.DeliveryMode, pickupDeliveryLocation);\n const groupTitle = type === 'pickup' ? multiplePickUpLabel : type === 'ship' ? shippingLable : 'email';\n const iconClass = `ms-checkout__line-items-group-title-multiple-pickup-${type}icon`;\n lineItemDeliveryGroup.push ({\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group multiple-pickup', type) },\n LineItemList: { className: 'ms-checkout__line-items-list' },\n lineItemWraperIcon:
,\n lineItemWraper:
{groupTitle}
,\n heading:
{title}
,\n lineItems: _getLineItemsComponents(item)\n });\n });\n\n return lineItemDeliveryGroup;\n };\n\n return _getLineItems();\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ChannelIdentity, OrderShipments, OrgUnitLocation, SalesOrder } from '@msdyn365-commerce/retail-proxy';\nimport get from 'lodash/get';\nimport * as React from 'react';\nimport { countItems, IModuleComponentProps, IPriceContext } from './utilities';\n\nexport interface IOrderInformationInputResources {\n receiptEmailMessage?: string;\n orderItemLabel: string;\n orderItemsLabel: string;\n processingLabel: string;\n orderIdLabel: string;\n receiptIdLabel: string;\n confirmationIdLabel: string;\n trackingLabel: string;\n trackingAriaLabel: string;\n trackingComingSoonLabel: string;\n posChannelNameText?: string;\n onlineStoreChannelNameText?: string;\n orderPlacedOnLabel?: string;\n}\nexport interface IOrderInformationInput {\n moduleName: string;\n channelReferenceId?: string;\n channelName?: string;\n channelAddress?: string;\n showChannelInfo?: boolean;\n receiptEmail?: string;\n createdDate?: string;\n amount?: number;\n priceContext: IPriceContext;\n salesId?: string;\n receiptId?: string;\n hasTrackingInfo?: boolean;\n count?: number;\n resources: IOrderInformationInputResources;\n isSalesInvoice?: boolean;\n}\n\nexport interface IOrderInformation {\n orderInformationProps: INodeProps;\n channelName: React.ReactNode;\n channelAddress: React.ReactNode;\n salesId: React.ReactNode;\n receiptId: React.ReactNode;\n receiptEmail: React.ReactNode;\n createdDate: React.ReactNode;\n count: React.ReactNode;\n amount: React.ReactNode;\n channelReferenceId: React.ReactNode;\n}\n\nexport const getOrderInformation = ({\n moduleName,\n channelReferenceId,\n channelName,\n channelAddress,\n showChannelInfo,\n receiptEmail,\n createdDate,\n amount,\n priceContext,\n salesId,\n receiptId,\n count,\n resources: { receiptEmailMessage, orderItemLabel, orderItemsLabel, orderIdLabel, receiptIdLabel, confirmationIdLabel, posChannelNameText, onlineStoreChannelNameText, orderPlacedOnLabel },\n isSalesInvoice\n}: IOrderInformationInput): IOrderInformation => ({\n orderInformationProps: { className: `${moduleName}__order-information` },\n channelName: showChannelInfo && channelName && (\n channelAddress ? {`${posChannelNameText} ${channelName}`}\n : {onlineStoreChannelNameText}),\n channelAddress: showChannelInfo && channelAddress && {channelAddress},\n salesId: salesId ? {`${orderIdLabel} ${salesId}`} : '',\n receiptId: receiptId ? {`${receiptIdLabel} ${receiptId}`} : '',\n receiptEmail: receiptEmail && (\n \n {receiptEmailMessage}\n {receiptEmail}\n \n ),\n createdDate: !isSalesInvoice && createdDate && {orderPlacedOnLabel} {createdDate},\n count: !isSalesInvoice && count !== undefined && count > 0 && (\n \n {count === 1 ? `${count} ${orderItemLabel}` : `${count} ${orderItemsLabel}`}\n \n ),\n amount: !isSalesInvoice && (amount || amount === 0) && (\n \n ),\n channelReferenceId: channelReferenceId && (\n {`${confirmationIdLabel} `}{channelReferenceId}\n )\n});\n\ninterface IProps extends IModuleComponentProps {\n resources: IOrderInformationInputResources;\n}\n\nexport const getOrderInfomationInput = (\n props: IProps,\n moduleName: string,\n order: SalesOrder | OrderShipments,\n priceContext: IPriceContext,\n channelIdentities?: ChannelIdentity[],\n orgUnitLocations?: OrgUnitLocation[],\n showChannelInfo?: boolean,\n isSalesInvoice?: boolean\n): IOrderInformationInput => {\n const {\n resources,\n context: {\n request: {\n apiSettings: { channelId }\n }\n }\n } = props;\n\n // @ts-ignore OrderShipments doesnt has ChannelId\n const showTrackingInfo = !!order.ChannelId && order.ChannelId === channelId;\n\n const locale = get(props, 'context.request.locale') || 'en-US';\n const count = order.SalesLines && order.SalesLines.length ? countItems(order.SalesLines) : 0;\n\n const orderChannel = channelIdentities ? channelIdentities.filter(channel => { return channel.RecordId === order.ChannelId; }) : '';\n const orderOrgUnitLocation = orgUnitLocations ? orgUnitLocations.filter(location => { return location.ChannelId === order.ChannelId; }) : '';\n\n return {\n moduleName: moduleName,\n createdDate: (order.CreatedDateTime && new Date(order.CreatedDateTime).toLocaleDateString(locale)) || '',\n salesId: order.SalesId,\n receiptId: order.ReceiptId,\n showChannelInfo: showChannelInfo,\n // @ts-ignore OrderShipments doesnt has ReceiptEmail\n receiptEmail: order.ReceiptEmail,\n channelReferenceId: order.ChannelReferenceId,\n channelName: orderChannel && orderChannel.length > 0 ? orderChannel[0].Name : '',\n channelAddress: orderOrgUnitLocation && orderOrgUnitLocation.length > 0 ? orderOrgUnitLocation[0].Address : '',\n amount: order.TotalAmount || 0,\n priceContext: priceContext,\n count,\n resources,\n isSalesInvoice\n };\n};\n","import { IActionContext } from '@msdyn365-commerce/core';\nimport { getCartState, getCheckoutState } from '@msdyn365-commerce/global-state';\n\nasync function emptyActiveCart(ctx: IActionContext): Promise {\n let cartState;\n let checkoutState;\n const lineItemIdsToRemove = [];\n\n try {\n cartState = await getCartState(ctx);\n checkoutState = await getCheckoutState(ctx);\n } catch (e) {\n throw e;\n }\n\n if (!cartState || !cartState.cart) {\n throw new Error('Fail to fetch active cart');\n }\n\n if (!checkoutState || !checkoutState.checkoutCart) {\n throw new Error('Fail to fetch checkoutCart cart');\n }\n\n const activeCart = cartState.cart;\n const checkoutCart = checkoutState.checkoutCart.cart;\n\n for (const activeCartLine of activeCart.CartLines || []) {\n for (const checkoutCartLine of checkoutCart.CartLines || []) {\n if (activeCartLine.LineId && activeCartLine.LineId === checkoutCartLine.LineId) {\n lineItemIdsToRemove.push(activeCartLine.LineId);\n }\n }\n }\n\n try {\n await cartState.removeCartLines({ cartLineIds: lineItemIdsToRemove });\n await cartState.removeAllPromoCodes({});\n await checkoutState.removeCheckoutCartId({});\n } catch (e) {\n throw e;\n }\n}\n\nexport default emptyActiveCart;\n","export * from './alert';\nexport * from './get-line-items';\nexport * from './get-order-summary';\nexport * from './guided-card';\nexport * from './guided-form';\nexport * from './place-order-button';","import { IActionContext } from '@msdyn365-commerce/core';\nimport { getCheckoutState } from '@msdyn365-commerce/global-state';\nimport { checkoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n getTenderTypesAsync, resolveCardTypesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport {\n Address, CardType, CartTenderLine, RetailOperation, SalesOrder, TenderType, TokenizedPaymentCard\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nexport const OPERATIONS = {\n PayCard: 201,\n PayGiftCertificate: 214,\n PayLoyalty: 207,\n PayCustomerAccount: 202\n};\n\nconst getCardTypeId = async (ctx: IActionContext, cardPrefix: string = ''): Promise => {\n try {\n const response = await resolveCardTypesAsync({ callerContext: ctx }, cardPrefix, CardType.Unknown);\n if (response && response.length > 0) {\n return response[0].TypeId;\n }\n } catch (error) {\n ctx.telemetry.error('Call to resolveCardTypesAsync failed.', error);\n }\n return undefined;\n};\n\nconst findTenderIdTypeByOperationId = (tenderTypes: TenderType[], operationId: RetailOperation): string | undefined => {\n const matchedTenderType = tenderTypes.find(tenderType => tenderType.OperationId === operationId);\n if (matchedTenderType) {\n return matchedTenderType.TenderTypeId;\n }\n return;\n};\n\nconst roundNumber = (value: number) => Number(value.toFixed(2));\n\nasync function getLoyaltyTenderLine(\n ctx: IActionContext,\n LoyaltyCardId: string,\n Amount: number = 0,\n Currency: string = 'USD'\n): Promise {\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n if (!tenderTypes) {\n throw new Error('Fail to get gift card tender line');\n }\n\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayLoyalty);\n return {\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n 'Amount@odata.type': '#Decimal',\n Currency,\n TenderTypeId,\n Amount,\n LoyaltyCardId\n };\n}\n\nasync function getGiftCardTenderLine(\n ctx: IActionContext,\n GiftCardId: string = '',\n Amount: number = 0,\n Currency: string = 'USD',\n tenderTypeId?: string,\n giftCardPin?: string,\n giftCardExpirationYear?: number,\n giftCardExpirationMonth?: number\n): Promise {\n let TenderTypeId = tenderTypeId;\n\n if (!TenderTypeId) {\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n if (!tenderTypes) {\n throw new Error('Fail to get gift card tender line');\n }\n TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayGiftCertificate);\n }\n\n const GiftCardPin = giftCardPin;\n const GiftCardExpirationYear = giftCardExpirationYear;\n const GiftCardExpirationMonth = giftCardExpirationMonth;\n return {\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n 'Amount@odata.type': '#Decimal',\n Currency,\n TenderTypeId,\n Amount,\n GiftCardId,\n GiftCardPin,\n GiftCardExpirationYear,\n GiftCardExpirationMonth\n };\n}\n\nasync function getCreditCardTenderLine(\n ctx: IActionContext,\n tokenizedPaymentCard: TokenizedPaymentCard,\n cardPrefix: string = '',\n Amount: number = 0,\n Currency: string = 'USD',\n billingAddress?: Address\n): Promise {\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n let cartTypeId = tokenizedPaymentCard.CardTypeId;\n\n if (!cartTypeId) {\n cartTypeId = await getCardTypeId(ctx, cardPrefix);\n }\n\n if (!tenderTypes) {\n throw new Error('Fail to get card tender type');\n }\n\n if (!cartTypeId) {\n throw new Error('Fail to get card type id');\n }\n\n const TenderTypeId = tokenizedPaymentCard.TenderType ?? findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\n const cardTenderLine: CartTenderLine = {\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n 'Amount@odata.type': '#Decimal',\n Currency,\n Amount,\n TenderTypeId,\n CardTypeId: cartTypeId\n };\n cardTenderLine.TokenizedPaymentCard = {\n ...tokenizedPaymentCard,\n CardTypeId: cartTypeId,\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.TokenizedPaymentCard',\n House: tokenizedPaymentCard.House || 'N/A',\n ...(tokenizedPaymentCard.CardTokenInfo && {\n CardTokenInfo: {\n ...tokenizedPaymentCard.CardTokenInfo,\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CardTokenInfo'\n }\n }),\n ...(billingAddress && {\n Phone: billingAddress.Phone,\n Country: billingAddress.ThreeLetterISORegionName,\n Address1: billingAddress.Street,\n City: billingAddress.City,\n State: billingAddress.State,\n Zip: billingAddress.ZipCode\n })\n };\n\n return cardTenderLine;\n}\n\nasync function createCustomerAccountTenderLine(\n ctx: IActionContext,\n Amount: number,\n Currency: string = 'USD',\n): Promise {\n const CustomerId = null;\n if (!ctx.requestContext.user.isAuthenticated) {\n ctx.telemetry.error('A customer id is required to pay with customer account');\n }\n\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n if (!tenderTypes) {\n ctx.telemetry.error('No tender types found for this channel');\n }\n\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCustomerAccount);\n if (!TenderTypeId) {\n ctx.telemetry.error('No customer account tender type');\n }\n return {\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n 'Amount@odata.type': '#Decimal',\n Currency,\n TenderTypeId,\n Amount,\n // @ts-ignore\n CustomerId\n };\n}\n\n// tslint:disable-next-line:max-func-body-length\nexport default async (ctx: IActionContext, updatedCartVersion?: number): Promise => {\n const checkoutState = await getCheckoutState(ctx).catch(error => {\n throw error;\n });\n\n const cartState = checkoutState.checkoutCart;\n\n const channelConfiguration = ctx.requestContext.channel;\n\n if (!cartState || !Object.keys(cartState).length || !checkoutState || !channelConfiguration) {\n throw new Error('Fail to placeOrder');\n }\n\n const {\n giftCardExtends,\n tokenizedPaymentCard,\n cardPrefix,\n guestCheckoutEmail,\n billingAddress,\n loyaltyAmount\n } = checkoutState;\n const { Currency } = channelConfiguration;\n\n let amountDue = cartState.cart.AmountDue || 0;\n let cartTenderLines;\n const getTenderLinePromises = [];\n const loyaltyCardNumber = cartState.cart.LoyaltyCardId;\n\n // Pay by loyalty first\n if (loyaltyAmount && loyaltyCardNumber) {\n const chargedAmount = roundNumber(Math.min(loyaltyAmount, amountDue));\n const loyaltyTenderLinePromise = getLoyaltyTenderLine(ctx, loyaltyCardNumber, chargedAmount, Currency);\n getTenderLinePromises.push(loyaltyTenderLinePromise);\n amountDue = roundNumber(amountDue - chargedAmount);\n }\n\n // Then by gift card\n if (giftCardExtends && giftCardExtends.length) {\n giftCardExtends.some(giftCardExtend => {\n if (giftCardExtend.Balance && amountDue > 0) {\n const chargedAmount = roundNumber(Math.min(giftCardExtend.Balance, amountDue));\n const tenderTypeId = giftCardExtend.TenderTypeId;\n const giftCardPin = giftCardExtend.Pin;\n const giftCardExpirationYear = giftCardExtend.ExpirationDate ? parseInt(giftCardExtend.ExpirationDate?.split('/')[1], 10) : undefined;\n const giftCardExpirationMonth = giftCardExtend.ExpirationDate ? parseInt(giftCardExtend.ExpirationDate?.split('/')[0], 10) : undefined;\n const creditCardTenderLinePromise = getGiftCardTenderLine(ctx, giftCardExtend.Id, chargedAmount, Currency, tenderTypeId, giftCardPin, giftCardExpirationYear, giftCardExpirationMonth);\n getTenderLinePromises.push(creditCardTenderLinePromise);\n amountDue = roundNumber(amountDue - chargedAmount);\n }\n return amountDue === 0;\n });\n }\n\n // Then by customer account\n if (checkoutState.customerAccountAmount > 0) {\n const chargedAmount = roundNumber(Math.min(checkoutState.customerAccountAmount, amountDue));\n const customerAccountTenderLinePromise = createCustomerAccountTenderLine(ctx, chargedAmount, Currency);\n getTenderLinePromises.push(customerAccountTenderLinePromise);\n amountDue = roundNumber(amountDue - chargedAmount);\n }\n\n // Pay the rest by credit card\n if (amountDue > 0) {\n if (!tokenizedPaymentCard) {\n throw new Error('Fail to placeOrder: no token found');\n }\n const creditCardTenderLinePromise = getCreditCardTenderLine(\n ctx,\n tokenizedPaymentCard,\n cardPrefix,\n amountDue,\n Currency,\n billingAddress\n );\n getTenderLinePromises.push(creditCardTenderLinePromise);\n }\n\n if (getTenderLinePromises.length > 0) {\n // When payment methods is required\n cartTenderLines = await Promise.all(getTenderLinePromises).catch(error => {\n throw error;\n });\n\n if (!cartTenderLines || !cartTenderLines.length) {\n throw new Error('Fail to placeOrder: fail to get cart tender lines');\n }\n }\n\n const cartVersion = updatedCartVersion || cartState.cart.Version;\n // Proceed checkout\n const salesOrder = await checkoutAsync(\n { callerContext: ctx, bypassCache: 'get' },\n cartState.cart.Id,\n guestCheckoutEmail,\n // @ts-ignore fields tokenizedPaymentCard and receiptNumberSequence are optional\n undefined,\n undefined,\n cartTenderLines || null,\n cartVersion\n // @ts-ignore\n ).catch(error => {\n throw error;\n });\n\n if (!salesOrder) {\n throw new Error('Fail to placeOrder: fail to checkout');\n }\n\n return salesOrder;\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\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}\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 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 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 * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\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 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}","import { observer } from 'mobx-react';\nimport * as React from 'react';\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 = () => { return this._findPreferreStoreOnClick(this.props); };\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) {\n const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName ?\n storeSelectorStateManager!.preferredStore.StoreName :\n resources.headerPreferredStoreText;\n\n return (\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 * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport {\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\n ModalBody, ModalHeader, onTelemetryClick, Popover, TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\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 classnames from 'classnames';\nimport { computed, reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\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 popOverRef: React.RefObject;\n private telemetryContent: ITelemetryContent;\n private cart: ICartState | undefined;\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 // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\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)\n ? cartIconSlot[0]\n : ,\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 {resources.signInLinkText}\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 {resources.signOutLinkText}\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 {this.displayName}\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) {\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 * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getPayloadObject, getTelemetryAttributes } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IGetHelpInput, IHelp } from '../../../';\n\nexport const getOrderConfirmationHelp = ({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel, telemetryContent }: IGetHelpInput): IHelp => {\n const payLoad = getPayloadObject('click', telemetryContent!, '');\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return ({\n helpProps: { className: 'ms-order-confirmation__help' },\n needHelpLabel:

{needHelpLabel}

,\n helpLineNumberLabel: {helpLineNumberLabel},\n contactNumber: (\n \n {contactNumber}\n \n )\n });\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, ProductDeliveryOptions, SalesLine, SalesOrder, SimpleProduct, TransactionType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { computed } from 'mobx';\nimport * as React from 'react';\nimport { IGetOrderSummaryInput, IHelp, IOrderSummary, IPaymentMethods, IPaymentMethodsInput } from '../../common';\nimport { getGroups, IGroups } from '../../common/get-groups';\nimport { getOrderInfomationInput, getOrderInformation, IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { getSalesLines, getSalesLinesInput } from '../../common/get-sales-lines';\nimport LabelComponent from '../../common/label';\nimport { getTenderIdOperationIdMap, IPriceContext } from '../../common/utilities';\nimport { getOrderConfirmationHelp } from './components/get-help';\nimport { getOrderConfirmationOrderSummary } from './components/get-order-summary';\nimport { getOrderConfirmationPaymentMethods } from './components/get-payment-methods';\nimport { IOrderConfirmationData } from './order-confirmation.data';\nimport { IOrderConfirmationProps } from './order-confirmation.props.autogenerated';\n\nexport * from '../../common/get-groups';\nexport * from '../../common/get-order-information';\nexport * from '../../common/get-sales-line';\nexport * from '../../common/get-sales-lines';\nexport * from '../../common/utilities';\nexport * from './components/get-help';\nexport * from './components/get-order-summary';\nexport * from './components/get-payment-methods';\n\nexport interface IOrderConfirmationViewProps extends IOrderConfirmationProps {\n moduleProps: IModuleProps;\n salesOrder?: SalesOrder;\n footerProps?: INodeProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n heading: React.ReactNode;\n backToShoppingLink?: React.ReactNode;\n orderInfomation?: IOrderInformation;\n salesLines?: ISalesLine[];\n groups?: IGroups;\n orderSummary?: IOrderSummary;\n payment?: IPaymentMethods;\n help?: IHelp;\n}\n\n/**\n *\n * OrderConfirmation component\n * @extends {React.PureComponent>}\n */\nclass OrderConfirmation extends React.PureComponent> {\n private moduleName: string = 'ms-order-confirmation';\n private telemetryContent?: ITelemetryContent;\n private backToShoppingAttributes?: Msdyn365.IDictionary;\n\n constructor(props: IOrderConfirmationProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\n this.backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n }\n\n @computed get isCurrentChannel(): boolean {\n if (!this.order) {\n return false;\n }\n return this.order.ChannelId === get(this.props, 'context.request.apiSettings.channelId');\n }\n\n @computed get isDataReady(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'SUCCESS';\n }\n\n @computed get hasError(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'FAILED';\n }\n\n @computed get order(): SalesOrder | undefined {\n return get(this.props, 'data.orderHydration.result.salesOrder');\n }\n\n @computed get products(): SimpleProduct[] {\n return get(this.props, 'data.orderHydration.result.products') || [];\n }\n\n @computed get deliveryOptions(): ProductDeliveryOptions[] {\n return get(this.props, 'data.orderHydration.result.deliveryOptions') || [];\n }\n\n @computed get priceContext(): IPriceContext {\n const {\n id,\n typeName,\n context,\n telemetry,\n resources: { freePriceText }\n } = this.props;\n return {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n }\n\n @computed get earnedPoints(): number {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n if (loyaltyCard && loyaltyCard.RewardPoints && this.order) {\n const pointPrograms = loyaltyCard.RewardPoints.map(point => point.RewardPointId);\n const rewardLines = this.order.LoyaltyRewardPointLines || [];\n let total = 0;\n rewardLines.forEach(line => {\n if ((line.RewardPointAmountQuantity || 0) > 0 && pointPrograms.indexOf(line.RewardPointId) > -1) {\n total += line.RewardPointAmountQuantity!;\n }\n });\n return total;\n }\n return 0;\n }\n\n @computed get orderSummaryProps(): IGetOrderSummaryInput | undefined {\n if (!this.order) {\n return;\n }\n const { request } = this.props.context;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\n const orderDetailsLines = this.order?.SalesLines;\n const canShip = orderDetailsLines?.some(orderDetailsLine => (orderDetailsLine.DeliveryMode && orderDetailsLine.DeliveryMode !== '')\n ? (orderDetailsLine.DeliveryMode !== this.getDeliveryMode(orderDetailsLine, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig?.result, pickupDeliveryModeCode) && orderDetailsLine.DeliveryMode !== emailDeliveryModeCode)\n : orderDetailsLine);\n\n const {\n resources: { orderSummaryHeading, orderSummaryItemsTotalLabel, orderSummaryShippingFeeLabel, orderSummaryTaxLabel, orderSummaryGrandTotalLabel, pointsEarnedLabel }\n } = this.props;\n return {\n order: this.order,\n earnedPoints: this.earnedPoints,\n priceContext: this.priceContext,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n pointsEarnedLabel,\n orderSummaryGrandTotalLabel\n },\n canShip: canShip\n };\n }\n\n @computed get paymentMethodsProps(): IPaymentMethodsInput | undefined {\n const tenderTypes = this.props.data.tenderTypes.result;\n if (!this.order || !this.order.TenderLines || !tenderTypes) {\n return;\n }\n\n const locale = get(this.props, 'context.request.locale') || 'en-US';\n\n const {\n resources: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n } = this.props;\n\n return {\n priceContext: this.priceContext,\n tenderLines: this.order.TenderLines,\n tenderIdOperationIdMap: getTenderIdOperationIdMap(tenderTypes),\n locale,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n };\n }\n\n // tslint:disable-next-line:max-func-body-length\n public render(): JSX.Element {\n const {\n resources: {\n noSalesOrderText,\n genericErrorMessage,\n needHelpLabel,\n helpLineNumberLabel,\n loadingLabel,\n backToShopping,\n orderItemLabel,\n orderItemsLabel,\n pickupItemsHeader,\n pickingItemsLabel,\n shippingAddressTitle,\n shippingItemToYouLabel,\n helpLineContactAriaLabel,\n emailItemsHeader,\n emailingItemsLabel\n },\n config: { heading, contactNumber, showTimeslot }\n } = this.props;\n\n const moduleProps = { moduleProps: this.props, className: classname('ms-order-confirmation', this.props.config.className) };\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n let viewProps: IOrderConfirmationViewProps = {\n ...this.props,\n moduleProps,\n heading: heading && heading.text && (\n \n ),\n backToShoppingLink: backToShoppingUrl && (\n \n ),\n footerProps: { className: 'ms-order-confirmation__footer' }\n };\n\n if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.isDataReady) {\n viewProps = {\n ...viewProps,\n loading: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.order) {\n viewProps = {\n ...viewProps,\n alert: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const isSalesInvoice = this.order.TransactionTypeValue === 15 as TransactionType.SalesInvoice;\n\n const salesLinesInput = getSalesLinesInput(this.props, this.moduleName, this.order, this.products, this.priceContext, true, showTimeslot, undefined,\n retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig?.result, this.deliveryOptions);\n const salesLines = salesLinesInput && getSalesLines(salesLinesInput);\n const orderInfomationInput = this.order && getOrderInfomationInput(this.props, this.moduleName, this.order, this.priceContext, undefined, undefined, undefined, isSalesInvoice);\n const orderInfomation = orderInfomationInput && getOrderInformation(orderInfomationInput);\n\n viewProps = {\n ...viewProps,\n salesOrder: this.order,\n orderInfomation,\n salesLines,\n groups: !isSalesInvoice && salesLines\n ? getGroups({\n moduleName: this.moduleName,\n salesLines,\n resources: {\n orderItemLabel, orderItemsLabel, pickupItemsHeader, pickingItemsLabel, shippingAddressTitle, shippingItemToYouLabel,\n emailItemsHeader, emailingItemsLabel\n },\n showTimeslot: showTimeslot,\n isConfirmationView: true,\n retailMultiplePickUpOptionEnabled\n })\n : undefined,\n orderSummary: !isSalesInvoice && this.orderSummaryProps ? getOrderConfirmationOrderSummary(this.orderSummaryProps) : undefined,\n payment: !isSalesInvoice && this.paymentMethodsProps ? getOrderConfirmationPaymentMethods(this.paymentMethodsProps) : undefined,\n help: !isSalesInvoice && contactNumber ? getOrderConfirmationHelp({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel, telemetryContent: this.telemetryContent }) : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleOrderConfirmationHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private getDeliveryMode = (salesLine: SalesLine, featureSate: boolean = false, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, pickupDeliveryMode?: string) => {\n if(!featureSate) {\n return pickupDeliveryMode;\n } else {\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === salesLine.DeliveryMode);\n }\n };\n\n}\n\nexport default OrderConfirmation;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { format, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { ISalesLine } from './get-sales-line';\nimport { groupSalesLines, IDeliveryType, ISalesStatusCode } from './utilities';\n\nexport interface IGroupDelivery {\n deliveryProps: INodeProps;\n pickupProps: INodeProps;\n showTimeslot: boolean;\n heading: React.ReactNode;\n count: React.ReactNode;\n processing: React.ReactNode;\n trackingInfo: React.ReactNode;\n address: React.ReactNode;\n shippingItemsToYou?: React.ReactNode;\n pickupDateTimeslot?: React.ReactNode;\n shippedStatusCheck?: React.ReactNode;\n}\n\nexport interface IGroup {\n groupProps: INodeProps;\n salesLinesProps: INodeProps;\n delivery: IGroupDelivery;\n salesLines: ISalesLine[];\n address: React.ReactNode;\n // row data\n data: {\n count: number;\n deliveryType: IDeliveryType;\n salesStatus: ISalesStatusCode;\n };\n}\n\nexport interface IGroupsInput {\n moduleName: string;\n salesLines: ISalesLine[];\n resources: {\n orderItemLabel: string;\n orderItemsLabel: string;\n pickupItemsHeader?: string;\n pickingItemsLabel?: string;\n shippingAddressTitle?: string;\n shippingItemToYouLabel?: string;\n emailItemsHeader?: string;\n emailingItemsLabel?: string;\n };\n showAddress?: boolean;\n isConfirmationView?: boolean;\n showTimeslot?: boolean;\n retailMultiplePickUpOptionEnabled?: boolean;\n}\n\nexport interface IGroups {\n groupsProps: INodeProps;\n groups: IGroup[];\n}\n\nexport const getGroups = ({ moduleName, salesLines, showAddress, showTimeslot, isConfirmationView, retailMultiplePickUpOptionEnabled,\n resources: {\n orderItemLabel,\n orderItemsLabel,\n pickupItemsHeader,\n pickingItemsLabel,\n shippingAddressTitle,\n shippingItemToYouLabel,\n emailItemsHeader,\n emailingItemsLabel }\n}: IGroupsInput): IGroups => {\n // tslint:disable-next-line:cyclomatic-complexity\n const groups = groupSalesLines(salesLines).map(group => {\n const { deliveryType, salesStatus, count, salesLines: _salesLines } = group;\n const itemLabel = count === 1 ? orderItemLabel : orderItemsLabel;\n const pickingItemsLabelText = pickingItemsLabel && format(pickingItemsLabel, count, itemLabel);\n const shippingItemsToYouText = shippingItemToYouLabel && format(shippingItemToYouLabel, count, itemLabel);\n const emailingItemsLabelText = emailingItemsLabel && format(emailingItemsLabel, count, itemLabel);\n const multiplePickup = deliveryType === 'ship' ? 'ship' : deliveryType === 'email' ? 'email' : 'pickup';\n const groupProps = { className: `${moduleName}__group-deliveryType-${multiplePickup} salesStatus-${salesStatus}` };\n const salesLinesProps = { className: `${moduleName}__sales-lines` };\n const address = _salesLines[0].address;\n const trackingInfo = _salesLines[0].trackingInfo;\n const isProcessing = _salesLines[0].data.salesStatus === 'processing';\n const pickDateTimeslot = _salesLines[0].pickupDateTimeslot;\n const shippedStatusCheck = _salesLines[0].data.salesStatus;\n const multiplePickUp = retailMultiplePickUpOptionEnabled ? 'multiple-pickUp' : '';\n const delivery: IGroupDelivery = {\n deliveryProps: { className: `${moduleName}__group-delivery ${multiplePickUp}` },\n pickupProps: { className: `${moduleName}__delivery-container` },\n heading: (\n \n {isProcessing\n ? isConfirmationView\n ? deliveryType === 'pickUp' ? pickupItemsHeader : deliveryType === 'ship' ? shippingAddressTitle : deliveryType === 'email' ? emailItemsHeader : deliveryType\n : _salesLines[0].deliveryType\n : _salesLines[0].salesStatus}\n \n ),\n processing: isProcessing ? (\n {_salesLines[0].salesStatus}\n ) : (\n undefined\n ),\n count: !isConfirmationView && {`(${count} ${itemLabel})`},\n shippingItemsToYou: isConfirmationView && deliveryType === 'ship'\n ? {shippingItemsToYouText}\n : deliveryType === 'pickUp'\n ? {pickingItemsLabelText}\n : deliveryType === 'email' ? {emailingItemsLabelText}\n : {pickingItemsLabelText},\n trackingInfo,\n address,\n pickupDateTimeslot: pickDateTimeslot,\n showTimeslot: showTimeslot || false,\n shippedStatusCheck:shippedStatusCheck\n };\n return {\n groupProps,\n salesLinesProps,\n delivery,\n salesLines: _salesLines,\n address: (showAddress) && address,\n data: {\n count,\n deliveryType,\n salesStatus\n }\n };\n });\n\n return {\n groupsProps: { className: `${moduleName}__groups` },\n groups\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. 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 {label}\n {price || price === 0 ? (\n \n ) : (\n {toBeCalculatedText}\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)) ? false : true);\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 } else {\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};","import { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Address, GiftCard, TenderLine, TokenizedPaymentCard } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { action, computed, observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a checkout\n */\nexport class CheckoutState {\n @observable private _tokenizedPaymentCard?: TokenizedPaymentCard;\n @computed public get tokenizedPaymentCard(): Readonly {\n return this._tokenizedPaymentCard;\n }\n\n @observable private _tenderLine?: TenderLine;\n @computed public get tenderLine(): Readonly {\n return this._tenderLine;\n }\n\n @observable private _billingAddress?: Address;\n @computed public get billingAddress(): Readonly
{\n return this._billingAddress;\n }\n\n @observable private _shippingAddress?: Address;\n @computed public get shippingAddress(): Readonly
{\n return this._shippingAddress;\n }\n\n @observable private _cardPrefix?: string;\n @computed public get cardPrefix(): Readonly {\n return this._cardPrefix;\n }\n\n @observable private _giftCards: GiftCard[] = [];\n @computed public get giftCards(): Readonly {\n return this._giftCards;\n }\n\n @observable private _giftCardExtends: IGiftCardExtend[] = [];\n @computed public get giftCardExtends(): Readonly {\n return this._giftCardExtends;\n }\n\n @observable private _loyaltyCardNumber?: string;\n @computed public get loyaltyCardNumber(): Readonly {\n return this._loyaltyCardNumber;\n }\n\n @observable private _loyaltyAmount: number = 0;\n @computed public get loyaltyAmount(): Readonly {\n return this._loyaltyAmount;\n }\n\n @observable private _guestCheckoutEmail: string = '';\n @computed public get guestCheckoutEmail(): Readonly {\n return this._guestCheckoutEmail;\n }\n\n @observable private _isTermsAndConditionAccepted: boolean = false;\n @computed public get isTermsAndConditionAccepted(): Readonly {\n return this._isTermsAndConditionAccepted;\n }\n\n @observable private _customerAccountAmount: number = 0;\n @computed public get customerAccountAmount(): Readonly {\n return this._customerAccountAmount;\n }\n\n @action\n public updateTokenizedPaymentCard(newTokenizedPaymentCard: TokenizedPaymentCard): void {\n this._tokenizedPaymentCard = newTokenizedPaymentCard;\n }\n\n @action\n public updateTenderLine(newTenderLine?: TenderLine): void {\n this._tenderLine = newTenderLine;\n }\n\n @action\n public updateShippingAddress(newShippingAddress: Address): void {\n this._shippingAddress = newShippingAddress;\n }\n\n @action\n public updateBillingAddress(newBillingAddress: Address): void {\n this._billingAddress = newBillingAddress;\n }\n\n @action\n public updateCardPrefix(newCardPrefix: string): void {\n this._cardPrefix = newCardPrefix;\n }\n\n @action\n public removeGiftCard(giftCardNumber: string): void {\n this._giftCards = this._giftCards.filter(giftCard => giftCard.Id !== giftCardNumber);\n }\n\n @action\n public removeGiftCardExtend(giftCardNumber: string): void {\n this._giftCardExtends = this._giftCardExtends.filter(giftCard => giftCard.Id !== giftCardNumber);\n }\n\n @action\n public addGiftCard(giftCard: GiftCard): void {\n this._giftCards = [giftCard, ...this._giftCards];\n }\n\n @action\n public addGiftCardExtend(giftCard: IGiftCardExtend): void {\n this._giftCardExtends = [giftCard, ...this._giftCards];\n }\n\n @action\n public updateLoyaltyCardNumber(newLoyaltyCardNumber: string): void {\n this._loyaltyCardNumber = newLoyaltyCardNumber;\n }\n\n @action\n public updateLoyaltyAmount(newAmount: number): void {\n this._loyaltyAmount = newAmount;\n }\n\n @action\n public updateGuestCheckoutEmail(newGuestCheckoutEmail: string): void {\n this._guestCheckoutEmail = newGuestCheckoutEmail;\n }\n\n @action\n public updateTermsAndConditionsAcceptance(newIsTermsAndConditionAccepted: boolean): void {\n this._isTermsAndConditionAccepted = newIsTermsAndConditionAccepted;\n }\n\n @action\n public updateCustomerAccountAmount(newAmount: number): void {\n this._customerAccountAmount = newAmount;\n }\n}\n","import { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { CheckoutState } from './checkout-state';\n\n/**\n * CheckoutState - action input\n */\nexport class CheckoutStateInput implements IActionInput {\n private apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey(`CheckoutState`, this.apiSettings);\n public getCacheObjectType = () => 'CheckoutState';\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CheckoutState - action\n */\nexport async function checkoutStateAction(input: CheckoutStateInput, ctx: IActionContext): Promise {\n return new CheckoutState();\n}\n\n/**\n * CheckoutState - create new input for create action\n */\nconst createInput = (inputData: ICreateActionContext>): IActionInput => {\n return new CheckoutStateInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * CheckoutState - create action\n */\nexport default createObservableDataAction({\n action: >checkoutStateAction,\n input: createInput\n});\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { CacheType, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { IModuleStates } from './module-state.data';\n\n/**\n * GetModulesInput\n */\nexport class ModuleStatesCacheKey implements IActionInput {\n public getCacheKey = () => 'ModuleState';\n public getCacheObjectType = () => 'ModuleState';\n public dataCacheType = (): CacheType => 'none';\n}\n\nexport function getModuleStates(ctx: IActionContext): IModuleStates {\n const cacheKey = new ModuleStatesCacheKey();\n\n // @ts-ignore\n let moduleStates = ctx.get(cacheKey.getCacheObjectType(), cacheKey.getCacheKey());\n if (moduleStates) {\n return moduleStates;\n }\n ctx.update(cacheKey, {});\n moduleStates = ctx.get(cacheKey.getCacheObjectType(), cacheKey.getCacheKey());\n return moduleStates;\n}\n\nexport function updateModuleStates(value: IModuleStates, ctx: IActionContext): void {\n const cacheKey = new ModuleStatesCacheKey();\n ctx.update(cacheKey, value);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IModule } from '@msdyn365-commerce/core';\nimport isMatch from 'lodash/isMatch';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { getModuleStates, updateModuleStates } from './module-state';\nimport { IModuleState, IModuleStateManager, IModuleStateProps, IModuleStates } from './module-state.data';\n\nexport interface IProps extends IModule, IModuleStateProps {\n enableControl?: boolean;\n}\n\nconst withModuleState =

(WrappedComponent: React.ComponentType

): React.ComponentType

=> {\n /**\n *\n * ModuleState component\n * @extends {React.Component

}\n */\n @observer\n class ModuleState extends React.Component

{\n constructor(props: P) {\n super(props);\n this.initializeState();\n }\n\n public render(): JSX.Element | null {\n const { id } = this.props;\n return ;\n }\n\n private initializeState = (): void => {\n const { id, typeName, context } = this.props;\n const states = getModuleStates(context.actionContext);\n if (!states) {\n this.props.telemetry.error('withModuleState initializeState() - states not found');\n return;\n }\n\n if (states[id]) {\n // state has been initialized\n return;\n }\n\n updateModuleStates(\n {\n ...states,\n [id]: {\n id,\n typeName,\n hasInitialized: false,\n hasError: false,\n isRequired: true,\n isCancellable: true,\n isSubmitContainer: false,\n status: undefined,\n childIds: []\n }\n },\n context.actionContext\n );\n };\n\n /**\n * GetModuleStateManager\n * Get module state manager by id\n */\n private getModuleStateManager = (id: string): IModuleStateManager => {\n const moduleState = this.get()[id];\n return {\n ...moduleState,\n hasInitialized: this.validate(id, { hasInitialized: true }, true), // All has initialized is initialized\n hasError: this.validate(id, { hasError: true }), // Partial has error is error\n isReady: this.validate(id, { status: 'ready' }, true, true), // All ready is ready (exclued disabled and skipped)\n isUpdating: this.validate(id, { status: 'updating' }), // Partial updating is updating\n isPending: this.validate(id, { status: 'pending' }), // Partial pending is pending\n isSkipped: this.validate(id, { status: 'skipped' }, true, true), // All skipped is skipped (exclued disabled)\n isDisabled: this.validate(id, { status: 'disabled' }, true), // All disabled is disabled\n isCancelAllowed: this.validate(id, { isCancellable: true }, true, true), // Partial not allowed is not allowed\n shouldSubmitContainer: this.validate(id, { isSubmitContainer: true }), // Partial submit is submit.\n hasExternalSubmitGroup: this.hasExternalSubmitGroup(),\n hasModuleState: this.hasModuleState(id),\n setIsRequired: (value: boolean): void => this.update(id, { isRequired: value }),\n setIsCancellable: (value: boolean): void => this.update(id, { isCancellable: value }),\n setIsSubmitContainer: (value: boolean): void => this.update(id, { isSubmitContainer: value }),\n setHasError: (value: boolean): void => this.update(id, { hasError: value }),\n onReady: (): void => this.update(id, { status: 'ready' }),\n onUpdating: (): void => this.update(id, { status: 'updating' }),\n onPending: (): void => this.update(id, { status: 'pending' }),\n onSkip: (): void => this.update(id, { status: 'skipped' }),\n onDisable: (): void => this.update(id, { status: 'disabled' }),\n getModule: (moduleId: string): IModuleStateManager => this.getModuleStateManager(moduleId),\n getModuleByTypeName: (typeName: string): IModuleStateManager => this.getModuleStateManagerByTypeName(typeName),\n init: (options?: Partial): void => {\n if (moduleState.hasInitialized) {\n // state has been initialized\n return;\n }\n this.update(id, {\n hasInitialized: true,\n ...options\n });\n }\n };\n };\n\n /**\n * GetModuleStateManagerByTypeName\n * Get module state manager by type name\n */\n private getModuleStateManagerByTypeName = (typeName: string): IModuleStateManager => {\n const moduleStates = getModuleStates(this.props.context.actionContext);\n const moduleState = Object.values(moduleStates).find(_moduleState => _moduleState.typeName === typeName);\n return this.getModuleStateManager((moduleState && moduleState.id) || '');\n };\n\n /**\n * Get\n * Get all module states\n */\n private get = (): IModuleStates => {\n return getModuleStates(this.props.context.actionContext);\n };\n\n /**\n * Update\n * Update module state\n */\n private update = (id: string, value: Partial): void => {\n // console.log('withModuleState - update', id, value);\n const modules = this.get();\n if (!modules[id]) {\n this.props.telemetry.error(`withModuleState update() - Module state with id ${id} is not found.`);\n return;\n }\n modules[id] = {\n ...modules[id],\n ...value\n };\n };\n\n private _validateLeaf = (id: string, source: Partial): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n return false;\n }\n return isMatch(module, source);\n };\n\n private _validateContainer = (\n id: string,\n source: Partial,\n allMatched?: boolean,\n skipSkippableItem?: boolean\n ): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n // module doesn't has module state\n return !!allMatched;\n }\n\n if (skipSkippableItem && (module.status === 'disabled' || module.status === 'skipped')) {\n // Skip disabled or skipped modules\n return !!allMatched;\n }\n\n // It is leaf module\n if (!module.childIds || !module.childIds.length) {\n return this._validateLeaf(id, source);\n }\n\n // It is container module\n const method = allMatched ? 'every' : 'some';\n return module.childIds[method](childId => this._validateContainer(childId, source, allMatched, skipSkippableItem));\n };\n\n /**\n * Validate\n * Validate current module and all its child module match the provided condition\n */\n private validate = (id: string, source: Partial, allMatched?: boolean, skipSkippableItem?: boolean): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n return false;\n }\n\n // It is leaf module\n if (!module.childIds || !module.childIds.length) {\n return this._validateLeaf(id, source);\n }\n\n // It is container module\n return this._validateContainer(id, source, allMatched, skipSkippableItem);\n };\n\n /**\n * hasExternalSubmitGroup\n * Module will use external submit group\n */\n private hasExternalSubmitGroup = (): boolean => {\n return !!this.props.enableControl;\n };\n\n /**\n * hasModuleState\n * Module is using module state manager\n */\n private hasModuleState = (id: string): boolean => {\n const modules = this.get();\n const module = modules[id];\n return !!module;\n };\n }\n\n return ModuleState;\n};\n\nexport default withModuleState;","import { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy';\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.onload = () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n };\n\n http.onerror = () => {\n resolve([imageData, false]);\n };\n\n http.send();\n } catch (e) {\n resolve([imageData, false]);\n }\n });\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\n\nimport {\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInit,\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 { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { imageSource, imageZoom, IMediaGalleryData, IMediaGalleryProps, thumbnailsOrientation } from '../..';\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 _inlineZoomDivRef: Map = new Map();\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 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 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 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\n ? imageZoom.inline\n : config.imageZoom === imageZoom.container\n ? imageZoom.container\n : '';\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 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: 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 mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) => this._getThumbnailItem(item, thumbnailImageSettings || this.defaultThumbnailImageSettings, index, this.state.activeIndex))\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private onExiting = () => {\n this.setState({ animating: true });\n };\n\n private onExited = () => {\n this.setState({ animating: false });\n };\n\n private 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 previous = (): void => {\n const nextIndex = this.isFirstItem()\n ? this.state.mediaGalleryItems\n ? this.state.mediaGalleryItems.length - 1\n : 0\n : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n };\n\n private 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 } else {\n return {this._getCarouselItem(image, imageSettings, index)};\n }\n }\n\n private _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\n \n );\n\n private _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 _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 _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 // tslint:disable-next-line: react-this-binding-issue\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 inlineZoomInit(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 isFirstItem = () => this.state.activeIndex === 0;\n\n private isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\n\n private 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 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","import { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n locationChangedHandler(): void;\n}\n\n// tslint:disable-next-line:max-func-body-length\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = (orgUnitLocation: OrgUnitLocation, cartState: ICartState | undefined, cartline: CartLine, deliveryMode?: string) => {\n if(!cartState) {\n return Promise.resolve();\n }\n return cartState.updateCartLinePickupLocation({cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode})\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {\n return;\n });\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if(isBopisSelected) {\n if(!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager.openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {\n return;\n });\n } else {\n if(!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState.clearCartLinePickupLocation({cartLineId: cartline.LineId!})\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {\n return;\n });\n }\n };\n\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if(!orgUnitLocations || !fulfillmentStoreId || !(orgUnitLocations.length > 0)) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if(foundLocation) {\n return foundLocation.OrgUnitName;\n } else {\n return fulfillmentStoreId;\n }\n };\n\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText:string,\n orgUnitLocations: OrgUnitLocation[] | undefined):JSX.Element => {\n\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = cartLine.FulfillmentStoreId ? true : false;\n\n const toggleBOPIS = (isBopisSelected: boolean) => { return () => _toggleBOPIS(isBopisSelected); };\n\n return (\n <>\n \n \n {\n cartLine.FulfillmentStoreId ? (\n
\n {orgUnitName}\n \n
\n ) : null\n }\n \n );\n };\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions ||\n !props.deliveryOptions.DeliveryOptions ||\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(props.cartline, props.shipitText, props.pickUpInStoreText, props.changeStoreText, props.orgUnitLocations),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: props.cartline.FulfillmentStoreId ? true : false,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\n }\n };\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { getProductUrlSync, IProductInventoryInformation, ObjectExtensions, OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport {\n AddToOrderTemplateComponent, AddToWishlistComponent, CartLineItemComponent,\n IAddToOrderTemplateDialogResources, ICartlineResourceString, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources, IWishlistActionSuccessResult } from '@msdyn365-commerce/components';\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, ChannelDeliveryOptionConfiguration, CommerceList,Customer, LineDataValidationFailure, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: LineDataValidationFailure[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n /** GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n /** ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName:string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getProduct = (productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined => {\n if (productId !== undefined && products) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n return undefined;\n};\n\nconst _getCartItemMaxQuantity = (maxCartlineQuantity: number, isStockCheckEnabled: boolean, productAvailability?: IProductInventoryInformation, productMaxQuantity?: number) => {\n const lineMaxQuantity = productMaxQuantity ? productMaxQuantity: maxCartlineQuantity;\n\n if(isStockCheckEnabled) {\n if(!productAvailability || !productAvailability.ProductAvailableQuantity || !productAvailability.IsProductAvailable || !productAvailability.ProductAvailableQuantity.AvailableQuantity) {\n return 0;\n }\n return productAvailability.ProductAvailableQuantity.AvailableQuantity >= lineMaxQuantity\n ? lineMaxQuantity\n : productAvailability.ProductAvailableQuantity.AvailableQuantity;\n }\n\n return lineMaxQuantity;\n};\n\nconst _getErrorMessage = (maxQuantity: number, currentQuantity: number, props: ICartLineItemsProps, lineIndex: number, isServiceItem: boolean): string | undefined => {\n const finalErrorMessage: string[] = [];\n if (props.includeErrors) {\n if (props.isStockCheckEnabled && !isServiceItem) {\n if (maxQuantity <= 0) {\n finalErrorMessage.push(props.outOfStockText);\n } else if (maxQuantity < currentQuantity) {\n if (maxQuantity === 1) {\n finalErrorMessage.push(props.outOfRangeOneText);\n } else {\n finalErrorMessage.push(props.outOfRangeFormatText.replace('{numLeft}', maxQuantity.toString()));\n }\n }\n }\n }\n\n // server-side validation\n props.cartlinesErrors\n .filter(i => i.LineIndex === lineIndex)\n .forEach(i => {\n if (i.DataValidationFailure?.ErrorContext) {\n finalErrorMessage.push(i.DataValidationFailure.ErrorContext);\n }\n });\n\n if(finalErrorMessage.length > 0) {\n return finalErrorMessage.join(' ');\n }\n\n return undefined;\n};\n\n// tslint:disable:max-func-body-length\n// tslint:disable-next-line:cyclomatic-complexity\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n foundProductDeliveryOptions?: ProductDeliveryOptions)\n : ICartlinesViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText,\n removeItemClickHandler, moveToWishlistSuccessHandler, addToOrderTemplateButtonText,\n addToOrderTemplateDialogResources, createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources, duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText, removeFromWishlistButtonText, orderTemplates, customerInformation,\n wishlists, defaultWishlistName, storeSelectorModuleId } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName ;\n const maxQuantity = product && _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n foundProductAvailability,\n props.isQuantityLimitsFeatureEnabled ? product.Behavior?.MaximumQuantity : undefined);\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 const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity) ? undefined : _getErrorMessage(maxQuantity, cartline.Quantity!, props, index, isServiceItem);\n\n const onRemoveClickHandler = (event: React.MouseEvent) => { removeItemClickHandler(cartline); };\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`:undefined;\n\n const isCustomPriceSelected = product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === ProductDimensionType.Style)?.DimensionValue?.Value === 'Custom';\n\n return {\n data: {\n product: product,\n cartline: cartline\n },\n error: errorMessage,\n cartline: (\n ),\n pickUpInStore: product ? (\n PickUpInStore({\n storeSelectorModuleId: storeSelectorModuleId,\n cartState: props.cartState,\n cartline: cartline,\n product: product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: foundProductDeliveryOptions,\n pickupDeliveryModeCode: cartline.DeliveryMode !== (undefined || '')? cartline.DeliveryMode: props.pickupDeliveryModeCode,\n locationChangedHandler: props.locationChangedHandler\n })\n ) : undefined,\n remove: (\n \n {removeButtonText}\n \n ),\n addToWishlist: (\n isAuthenticated && product && !isCustomPriceSelected ? (\n \n ) :\n undefined\n ),\n addToOrderTemplate: (\n isAuthenticated && orderTemplates && product && !isCustomPriceSelected ? (\n \n ) :\n undefined\n )\n };\n};\n\nexport const assembleCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): ICartlinesViewProps[] | null => {\n const reactNodes:ICartlinesViewProps[] = [];\n\n cartlines.map((cartline, index) => {\n const product = _getProduct(cartline.ProductId, products);\n let foundProductAvailability;\n if(props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId && productAvailability.InventLocationId === cartline.WarehouseId;\n });\n }\n let foundProductDeliveryOption;\n if(props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return (\n assembleCartlines(cartlines, products, props)\n );\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\nimport {assembleCartlines, ICartLineItemsProps, ICartlinesViewProps} from './cart-line-items';\n\nconst _assembleGroupCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if(!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => (item.DeliveryMode));\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-ignore\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if(carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n\n });\n\n return reactNodes;\n};\n\n/**\n * CartLine Group component\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return (\n _assembleGroupCartlines(cartlines, products, props)\n );\n};","import { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data\n */\nexport async function getPromotionData(ctx: IActionContext): Promise {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(\n new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings),\n ctx\n ) .then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, INodeProps, IPayLoad, ITelemetryContent, TelemetryConstant, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport {\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources, ILinesAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult, PromoCodeComponent, SaveCartToOrderTemplateComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\nexport interface ICartViewProps extends ICartProps {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?:ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n mulitplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: LineDataValidationFailure[];\n promotionData: IPromotionData;\n}\n\n/**\n *\n * Cart component\n * @extends {React.PureComponent>}\n */\n@observer\nclass Cart extends React.Component> {\n\n public state: ICartComponentState = {\n cartlinesErrors: [],\n showPromotionDialog: false,\n promotionData: {}\n };\n\n private telemetryContent: ITelemetryContent;\n private payLoad: IPayLoad;\n private isQuantityLimitsFeatureEnabled: boolean = false;\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n constructor(props: ICartProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n }\n\n public async componentDidMount(): Promise {\n const {\n config: config,\n context: {\n actionContext: actionContext\n },\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled = await this._getOrderQuantityLimitsFeatureFlag();\n if (this.isQuantityLimitsFeatureEnabled) {\n await this._validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n );\n }\n }\n\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products },\n },\n context: {\n request: {\n user: {\n isAuthenticated,\n signInUrl\n }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const cartLines = this._getCartLines();\n const RetailMulitplePickupFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature');\n const cartLinesGroup = RetailMulitplePickupFeatureState?.IsEnabled? this._getCartLinesGroup(): null;\n\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n const hasErrors = cartLines ? cartLines.some(cartline => cartline.error !== undefined) : false;\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title:

{resources.cartTitle}

,\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\n OrderSummaryWrapper: { className: 'msc-order-summary-wrapper' },\n OrderSummaryItems: { className: 'msc-order-summary__items' },\n cartlines: cartLines,\n cartLinesGroup:cartLinesGroup,\n promoCode: this._getPromoCode(),\n promotionOptions: this._getPromotions(),\n cart: this.props.data.cart.result,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry: this.props.telemetry,\n id: this.props.id,\n mulitplePickUpEnabled: RetailMulitplePickupFeatureState?.IsEnabled,\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ?\n (\n

{resources.orderSummaryTitle}

\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n checkoutAsSignInUserButton: (!isCartEmpty) ?\n (\n \n ) : null,\n checkoutAsGuestButton: (!isCartEmpty && !isAuthenticated) ?\n (\n \n ) : null,\n backToShoppingButton: ,\n createTemplateFromCartButton: (this._displayAddCartToTemplate() && products) ?\n (\n \n ) : null,\n storeSelector: this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this._removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\n waitingComponent: ,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private promotionLinkClick = (event: React.MouseEvent) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n private promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n private _displayAddCartToTemplate(): boolean {\n const RetailB2BEcommerceFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailB2BEcommerceFeature');\n if (RetailB2BEcommerceFeatureState?.IsEnabled && this.props.data.customerInformation.result?.IsB2b && this.props.data.orderTemplates.result &&\n this.props.data.cart.result?.cart?.CartLines?.length && this.props.data.cart.result.cart.CartLines.length > 0 &&\n this.props.data.customerInformation.result) {\n return true;\n }\n\n return false;\n }\n\n private _getPromotions(): React.ReactNode {\n return(\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors = cartLines && cartLines.map(cartline => {\n\n // check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n const isServiceItem = cartline.data?.product?.ItemTypeValue === PRODUCTASSERVICE;\n\n if (!isServiceItem && cartline.error) {\n const fullError = (cartline.data && cartline.data.product?.Name) ? `${cartline.data.product.Name}: ${cartline.error}` : cartline.error;\n\n return (\n
{fullError}
\n );\n }\n\n return null;\n }).filter((line): line is JSX.Element => !!line) || [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n \n ),\n errors: allErrors\n };\n }\n\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) ?\n (\n OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration: channelConfiguration,\n retailMultiplePickUpOptionEnabled: retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry: telemetry\n })\n ) : undefined;\n }\n\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return cart && (\n \n );\n }\n\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText\n };\n }\n\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config: config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors ;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n return ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n CartLineItems({\n cartlines: cart!.cart.CartLines!,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors: cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n imageSettings: imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges\n },\n telemetry: telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this._removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\n wishlists: wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates: orderTemplates,\n customerInformation: customerInformation\n })\n ) : null;\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${signInUrl.indexOf('?') === -1 ? '?' : '&'}ru=${returnURL}`;\n }\n\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return imageSettings || {\n viewports: {\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n }\n\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input)\n .then(() => {\n this._validateCart()\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n }\n\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this._removeItemFromCartHandler(cartline);\n }\n }\n\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number): boolean => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineId: cartlineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\n };\n this.props.data.cart.result.updateCartLineQuantity(input)\n .then((result: ICartActionResult) => {\n if(result.status === 'SUCCESS') {\n this._validateCart().catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n return true;\n }\n return false;\n })\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to update Cart Line quantity');\n });\n }\n\n return false;\n }\n\n private _fulfillmentStoreIdUpdated = () => {\n this._validateCart().catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n\n private async _validateCart(retry: boolean = true): Promise {\n if (!this.isQuantityLimitsFeatureEnabled) {\n return AsyncResult.resolve();\n }\n\n const {\n data: { cart: cart }\n } = this.props;\n let cartResult: ICartState;\n try {\n cartResult = await cart;\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get cart');\n return AsyncResult.resolve();\n }\n const cartVersion = cartResult.cart?.Version;\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\n this.setState({cartlinesErrors: validationResult.ValidationFailuresByCartLines || []});\n return AsyncResult.resolve();\n } catch (error) {\n if(retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n this.props.telemetry.warning(refreshError);\n this.props.telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await this._validateCart(false);\n return AsyncResult.resolve();\n } catch (validateError) {\n this.props.telemetry.warning(validateError);\n this.props.telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n this.props.telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n }\n\n private async _getOrderQuantityLimitsFeatureFlag(): Promise {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq = featureStatuses\n .find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n try {\n const customerInfo = await this.props.data.customerInformation;\n return !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n } catch(error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n }\n\n private _getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config: config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const isQuantityLimitsFeatureEnabled = this.props.data.featureState.result?.\n find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors ;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 && this.props.data.channelDeliveryOptionConfig?.result ? (\n CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors: cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n imageSettings: imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges\n },\n telemetry: telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this._removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\n wishlists: wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates: orderTemplates,\n customerInformation: customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result\n })\n ) : null;\n }\n\n}\n\nexport default Cart;\n","import { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n\n const {\n id,\n showPromotionPopup,\n promotions,\n resources : {\n promotionLinkText,\n promotionPopupHeading\n },\n onCloseButtonClick,\n onSeeAllClick,\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n \n \n {props.resources.promotionStringHeading}\n \n ),\n promotionSeeAllLink: (
{promotionLinkText} ),\n promotionDialog: (\n \n \n
{promotionPopupHeading}
\n
\n \n
    \n {promotions!.map(_promotion => {\n return (\n
  • {_promotion.Promotion?.OfferName}
  • \n );\n }\n )}\n
\n
\n \n
\n )\n };\n};","import { IAddToCartFailureResult } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { OrgUnitLocation, ProductAvailableQuantity , ProductDimension, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { IBuyboxResources } from '../buybox.props.autogenerated';\n\nexport function getQuantityError(stockLeft: number | undefined, resources: IBuyboxResources): string | undefined {\n if (!stockLeft || stockLeft <= 0) {\n return resources.errorMessageOutOfStock;\n } else if (stockLeft === 1) {\n return resources.errorMessageOutOfRangeOneLeft;\n } else {\n return resources.errorMessageOutOfRangeFormat.replace('{numLeft}', stockLeft.toString());\n }\n}\n\n// tslint:disable-next-line:cyclomatic-complexity\nexport function getGenericError(\n result: IAddToCartFailureResult,\n cart: ICartState | undefined,\n resources: IBuyboxResources,\n context: ICoreContext>,\n product: SimpleProduct | undefined,\n productAvailability: ProductAvailableQuantity | undefined,\n location: OrgUnitLocation | undefined)\n : string | undefined {\n if (result.failureReason === 'EMPTYINPUT') {\n return resources.addedToCartFailureMessage;\n } else if (result.failureReason === 'CARTACTIONFAILED') {\n if (result.cartActionResult && result.cartActionResult.substatus === 'MAXQUANTITY') {\n // get the quantity of the product in cart\n let elementFoundAt:number = -1;\n const productIdToFind = product?.RecordId;\n\n for (let i = 0; i < cart!.cart.CartLines!.length; i++) {\n if (cart!.cart.CartLines![i].ProductId === productIdToFind &&\n (cart!.cart.CartLines![i].DeliveryMode || '') === (location && context.actionContext.requestContext.channel?.PickupDeliveryModeCode || '') &&\n (cart!.cart.CartLines![i].FulfillmentStoreId || '') === (location?.OrgUnitNumber || '')) {\n elementFoundAt = i;\n\n break;\n }\n }\n\n let curQuantity: number = 0;\n\n if (elementFoundAt !== -1) {\n const cartLineToUpdate = {...cart!.cart.CartLines![elementFoundAt]};\n curQuantity = cartLineToUpdate.Quantity || 0;\n }\n\n // get the quantity limit for the product\n const maxQuantityForCartLineItem = context.app.config.maxQuantityForCartLineItem;\n const availableQty = productAvailability?.AvailableQuantity;\n\n let quantityLimit: number;\n\n if (maxQuantityForCartLineItem === undefined && availableQty === undefined) {\n quantityLimit = 10;\n } else if (availableQty === undefined) {\n quantityLimit = maxQuantityForCartLineItem;\n } else if (maxQuantityForCartLineItem === undefined) {\n quantityLimit = availableQty;\n } else {\n quantityLimit = Math.min(maxQuantityForCartLineItem, availableQty);\n }\n\n return resources.maxQuantityLimitText.replace('{curQuantity}', curQuantity.toString()).replace('{maxQuantity}', quantityLimit.toString());\n } else if (result.cartActionResult && result.cartActionResult.substatus === 'QUANTITYLIMITS') {\n return result.cartActionResult?.errorDetails?.LocalizedMessage;\n }\n\n return resources.addedToCartFailureMessage;\n }\n\n return undefined;\n}\n\nexport function getConfigureErrors(result: ProductDimension[] | undefined, resources: IBuyboxResources, isGiftCard?: Boolean): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n\n const dimensions: { [configureId: string]: string | undefined } = {};\n\n result.forEach(dimension => {\n dimensions[dimension.DimensionTypeValue] = getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n });\n\n return dimensions;\n}\n\nexport function getDimensionErrorString(dimensionTypeValue: number, resources: IBuyboxResources, isGiftCard?: Boolean): string {\n switch (dimensionTypeValue) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColorErrorMessage;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfigurationErrorMessage;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSizeErrorMessage;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmountErrorMessage : resources.productDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n}","import * as React from 'react';\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, format, getPayloadObject, getTelemetryAttributes, getTelemetryObject, Heading, INodeProps, ITelemetryContent, Node, Quantity, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport {\n AddToCartComponent,\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n IAddToCartFailureResult,\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateActionErrorResult,\n IOrderTemplateNameDialogResources,\n IWishlistActionErrorResult,\n PriceComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\nimport { IBuyboxCallbacks, IBuyboxData, IBuyboxProps, IBuyboxResources, IBuyboxState } from '../../../index';\nimport { getConfigureErrors, getGenericError, getQuantityError } from '../utilities/error-utilities';\n\nexport function getBuyBoxInventoryLabel(props: IBuyboxProps): React.ReactElement | undefined {\n const {\n data: { productAvailableQuantity: { result: productAvailableQuantity } },\n } = props;\n if (!productAvailableQuantity || !productAvailableQuantity.length) {\n return undefined;\n }\n if (productAvailableQuantity &&\n productAvailableQuantity.length &&\n productAvailableQuantity[0].StockLevelLabel) {\n const inventoryClassName = productAvailableQuantity[0].StockLevelCode ?\n `ms-buybox__inventory-label ms-buybox__inventory-code-${productAvailableQuantity[0].StockLevelCode.toLowerCase()}` :\n 'ms-buybox__inventory-label';\n return (
{productAvailableQuantity[0].StockLevelLabel}
);\n }\n\n return undefined;\n\n}\nexport function getBuyboxProductTitle(props: IBuyboxProps): React.ReactElement | undefined {\n const {\n data: { product: { result: product } },\n config: { titleHeadingTag = 'h1' }\n } = props;\n\n return product && (\n \n );\n}\n\nexport function getBuyboxProductDescription(props: IBuyboxProps): React.ReactElement | undefined {\n const {\n data: { product: { result: product } }\n } = props;\n\n return product && (\n

{product.Description}

\n );\n}\n\nexport interface IBuyboxAddToCartViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\n\nlet telemetryContent: ITelemetryContent;\n\n// tslint:disable-next-line:max-func-body-length\nexport function getBuyboxAddToCart(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks,\n defaultMinimumKeyInPrice: number, defaultMaximumKeyInPrice: number): IBuyboxAddToCartViewProps {\n const {\n id,\n typeName,\n context,\n data: { cart: { result: cart }, product: { result: product }, productAvailableQuantity: { result: productAvailableQuantity } },\n resources,\n config: { minimumKeyInPrice, maximumKeyInPrice }\n } = props;\n\n const {\n quantity,\n errorState: {\n configureErrors,\n quantityError,\n customAmountError,\n otherError,\n errorHost\n },\n selectedProduct,\n isUpdatingDimension,\n isUpdatingDeliveryOptions,\n isServiceItem,\n keyInPriceAmount\n } = state;\n\n const productAvailability = state.productAvailableQuantity ?\n state.productAvailableQuantity.ProductAvailableQuantity :\n productAvailableQuantity && productAvailableQuantity.length ?\n productAvailableQuantity[0].ProductAvailableQuantity : undefined;\n\n const onAddToCartFailed = (result: IAddToCartFailureResult) => {\n let quantityErrorForState: string | undefined;\n let customAmountErrorForState: string | undefined;\n let otherErrorForState: string | undefined = getGenericError(result, cart, resources, context, product, productAvailability, undefined);\n\n if(result.failureReason === 'OUTOFSTOCK') {\n quantityErrorForState = result.failureReason === 'OUTOFSTOCK' ? getQuantityError(result.stockLeft, resources) : undefined;\n } else if(result.failureReason === 'CARTACTIONFAILED'\n && result.cartActionResult\n && (result.cartActionResult.substatus === 'MAXQUANTITY' || result.cartActionResult.substatus === 'QUANTITYLIMITS')) {\n quantityErrorForState = getGenericError(result, cart, resources, context, product, productAvailability, undefined);\n otherErrorForState = undefined; // prevent error duplication in otherError and quantityError\n }\n\n if(result.failureReason === 'INVALIDCUSTOMAMOUNT') {\n if (keyInPriceAmount === undefined || keyInPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice)) {\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(minimumKeyInPrice || defaultMinimumKeyInPrice);\n customAmountErrorForState = resources.invalidSmallCustomAmountText.replace('{minAmount}', formatedAmountLimit);\n } else if (keyInPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice)) {\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(maximumKeyInPrice || defaultMaximumKeyInPrice);\n customAmountErrorForState = resources.invalidLargeCustomAmountText.replace('{maxAmount}', formatedAmountLimit);\n }\n }\n\n callbacks.updateErrorState({\n errorHost: 'ADDTOCART',\n quantityError: quantityErrorForState,\n configureErrors: result.failureReason === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {},\n customAmountError: customAmountErrorForState,\n otherError: otherErrorForState\n });\n };\n\n const dialogStrings = {\n goToCartText: resources.buyBoxGoToCartText,\n continueShoppingText: resources.buyBoxContinueShoppingText,\n headerItemOneText: resources.buyBoxSingleItemText,\n headerItemFormatText: resources.buyBoxMultiLineItemFormatText,\n headerMessageText: resources.buyBoxHeaderMessageText,\n freePriceText: resources.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=240&h=240&m=6`, w: 0, h: 0 },\n lg: { q: `w=240&h=240&m=6`, w: 0, h: 0 },\n xl: { q: `w=240&h=240&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const isLoading = props.data.productAvailableQuantity.status === 'LOADING';\n if (isLoading) {\n callbacks.changeUpdatingDimension(false);\n }\n\n const isLoadingDeliveryOptions = typeName !== 'quickview' && props.data.deliveryOptions?.status === 'LOADING';\n if (isLoadingDeliveryOptions && callbacks.changeUpdatingDeliveryOptions) {\n callbacks.changeUpdatingDeliveryOptions(false);\n }\n\n telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!,\n props.friendlyName,\n props.telemetry);\n\n // check if the product delivery mode is electronic\n const emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n const deliveryOptions = props.data.deliveryOptions?.result;\n const isEmailDelivery = deliveryOptions && deliveryOptions.DeliveryOptions && ArrayExtensions.hasElements(deliveryOptions.DeliveryOptions) && deliveryOptions.DeliveryOptions[0].Code === emailDeliveryModeCode;\n\n return {\n ContainerProps: {\n className: 'ms-buybox__add-to-cart-container'\n },\n button: product && (\n \n ),\n errorBlock: (\n \n )\n };\n}\n\nexport function getBuyboxProductPrice(props: IBuyboxProps, state: IBuyboxState): React.ReactElement | undefined {\n const {\n id,\n typeName,\n context,\n resources\n } = props;\n\n return state.productPrice && (\n \n );\n}\n\nexport function getBuyboxProductRating(props: IBuyboxProps): React.ReactElement | undefined {\n const {\n id,\n typeName,\n context,\n data: { ratingsSummary: { result: ratingsSummary } },\n resources\n } = props;\n\n const ratingComponent = ratingsSummary && ratingsSummary.averageRating && (\n \n ) || undefined;\n\n return ratingsSummary && ratingComponent && (\n ratingComponent\n );\n}\n\nexport interface IBuyboxAddToOrderTemplateViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\n\nfunction generateAddToOrderTemplateDialogResources(resources: IBuyboxResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n}\n\nfunction generateOrderTemplateNameDialogResources(resources: IBuyboxResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n}\n\nfunction generateItemAddedToOrderTemplateDialogResources(resources: IBuyboxResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n}\n\nfunction generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: IBuyboxResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n}\n\nexport function getBuyboxProductAddToOrderTemplate(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxAddToOrderTemplateViewProps | undefined {\n const {\n id,\n typeName,\n context,\n data: {\n product: { result: product },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n resources\n } = props;\n\n const\n {\n errorState: {\n configureErrors,\n quantityError,\n customAmountError,\n otherError,\n errorHost\n },\n quantity\n } = state;\n\n // If custom amount is selected, add-to-orderTemplate is disabled\n if (state.isCustomPriceSelected) {\n return undefined;\n }\n\n const onAddToOrderTemplateFailed = (result: IOrderTemplateActionErrorResult) => {\n callbacks.updateErrorState({\n errorHost: 'ORDER_TEMPLATE',\n configureErrors: result.status === 'MISSING_DIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {},\n });\n };\n\n return {\n ContainerProps: {\n className: 'ms-buybox__add-to-order-template-container'\n },\n button: product && orderTemplates && (\n \n ),\n errorBlock: (\n \n )\n };\n}\n\nexport interface IBuyboxAddToWishlistViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\nexport function getBuyboxProductAddToWishlist(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxAddToWishlistViewProps | undefined {\n const {\n id,\n typeName,\n context,\n data: {\n product: { result: product },\n wishlists: { result: wishlists }\n },\n resources\n } = props;\n\n const\n {\n errorState: {\n configureErrors,\n quantityError,\n customAmountError,\n otherError,\n errorHost\n },\n selectedProduct\n } = state;\n\n // If custom amount is selected, add-to-wishlist is disabled\n if (state.isCustomPriceSelected) {\n return undefined;\n }\n\n const onAddToWishlistFailed = (result: IWishlistActionErrorResult) => {\n callbacks.updateErrorState({\n errorHost: 'WISHLIST',\n configureErrors: result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {},\n });\n };\n\n return {\n ContainerProps: {\n className: 'ms-buybox__add-to-wishlist-container'\n },\n button: product && (\n \n ),\n errorBlock: (\n \n )\n };\n}\n\nexport interface IBuyboxProductQuantityViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n\n heading: React.ReactNode;\n errors?: React.ReactNode;\n\n input: React.ReactNode;\n}\nexport function getBuyboxProductQuantity(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxProductQuantityViewProps {\n const {\n resources,\n } = props;\n\n const\n {\n quantity,\n max,\n errorState: {\n quantityError,\n }\n } = state;\n\n const onChange = (newValue: number) => {\n if (callbacks.updateQuantity) {\n callbacks.updateQuantity(newValue);\n }\n };\n\n return {\n ContainerProps: {\n className: 'ms-buybox__quantity'\n },\n LabelContainerProps: {\n tag: 'label',\n className: 'ms-buybox__product-quantity-label',\n htmlFor: 'ms-buybox__product-quantity-input'\n },\n heading: (\n
{resources.productQuantityHeading}
\n ),\n errors: quantityError && (\n \n \n ),\n input: (\n \n )\n };\n}\n\nexport interface IBuyboxShopSimilarLookViewProps {\n ContainerProps: INodeProps;\n errors?: React.ReactNode;\n input: React.ReactNode;\n}\n\nexport function getBuyboxShopSimilarLook(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxShopSimilarLookViewProps {\n const {\n resources,\n context,\n data: {\n product: { result: product }\n },\n } = props;\n\n const\n {\n errorState: { }\n } = state;\n\n const navigationUrl = () => {\n const searchURL = getUrlSync('search', context && context.actionContext);\n const separator = searchURL!.includes('?') ? '&' : '?';\n document.location.href = `${searchURL}${separator}productId=${product && product.RecordId}`;\n };\n const payLoad = getPayloadObject('click', telemetryContent, TelemetryConstant.ShopSimliarLooks);\n const attribute = getTelemetryAttributes(telemetryContent, payLoad);\n\n return {\n ContainerProps: {\n className: 'ms-buybox__shopsimilarlooks'\n },\n input: (\n \n {resources.shopSimilarLooksText}\n \n )\n };\n}\n\nexport interface IBuyboxKeyInPriceViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n heading: React.ReactNode;\n input: React.ReactNode;\n}\n\nexport function getBuyboxKeyInPrice(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxKeyInPriceViewProps {\n const {\n config,\n resources\n } = props;\n\n const\n {\n errorState: { }\n } = state;\n\n const onChange = (e: React.ChangeEvent) => {\n const value = e.currentTarget.value;\n callbacks.updateKeyInPrice(value.length ? Number(value) : parseFloat(value));\n };\n\n return {\n ContainerProps: {\n className: 'ms-buybox__key_in_price'\n },\n LabelContainerProps: {\n tag: 'label',\n className: 'ms-buybox__key_in_price-label',\n htmlFor: 'ms-buybox__key_in_price'\n },\n heading: (\n
{resources.buyboxKeyInPriceLabelHeading}
\n ),\n input: (\n \n )\n };\n\n}\n\nexport interface IBuyboxErrorBlockProps {\n configureErrors: { [configureId: string]: string | undefined };\n quantityError?: string;\n customAmountError?: string;\n otherError?: string;\n resources: IBuyboxResources;\n showError: boolean;\n}\nexport const BuyboxErrorBlock: React.FC = ({ showError, configureErrors, quantityError, customAmountError, otherError, resources }) => {\n let errorMessages: (string | undefined)[] = [];\n\n errorMessages = Object.values(configureErrors).filter(message => message !== undefined);\n\n if (quantityError) {\n errorMessages.push(quantityError);\n }\n\n if (customAmountError) {\n errorMessages.push(customAmountError);\n }\n\n if (otherError) {\n errorMessages.push(otherError);\n }\n\n return (\n 0} color='danger' assertive={true} aria-label={resources.buyboxErrorMessageHeader} >\n \n {errorMessages.map((message, index) => {\n return (\n
{message}
\n );\n })}\n
\n );\n};\n\nexport function getQuantityLimitsMessages(props: IBuyboxProps, state: IBuyboxState): React.ReactElement | undefined {\n const {\n resources\n } = props;\n\n const\n {\n min,\n max,\n } = state;\n\n if (!_isOrderQuantityLimitsFeatureEnabled(props)) {\n return undefined;\n }\n\n return (\n \n {_renderMaxLabel(max, resources.maxQuantityText)}\n {_renderMinLabel(min, resources.minQuantityText)}\n \n );\n}\n\nexport const RetailDefaultOrderQuantityLimitsFeatureName: string = 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature';\n\nconst _renderMaxLabel = (max: number | undefined, maxQuantityText: string): React.ReactElement | undefined => {\n if(max && max !== 0 && max !== Number.MAX_VALUE) {\n return(\n

\n {maxQuantityText.replace('{max}', max.toString())}\n

\n );\n } else {\n return undefined;\n }\n};\n\nconst _renderMinLabel = (min: number | undefined, minQuantityText: string): JSX.Element | undefined => {\n if(min && min > 1) {\n return(\n

\n {minQuantityText.replace('{min}', min.toString())}\n

\n );\n } else {\n return undefined;\n }\n};\n\nconst _isOrderQuantityLimitsFeatureEnabled = (props: IBuyboxProps): boolean | undefined => {\n const isFeatureEnabledInHq = props.data.featureState.result\n ?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)?.IsEnabled;\n if (!isFeatureEnabledInHq) {\n return false;\n }\n const defaultOrderQuantityLimitsFeatureConfig = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n\n const customerInfo = props.data.customerInformation.result;\n return customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n};\n","import * as React from 'react';\n\nimport { Heading, INodeProps, IPopupProps, Popup } from '@msdyn365-commerce-modules/utilities';\nimport { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\nimport { DeliveryOption, ProductDimension } from '@msdyn365-commerce/retail-proxy';\n\nimport { IAddToCartFailureResult, PriceComponent } from '@msdyn365-commerce/components';\nimport { IBuyboxCallbacks, IBuyboxData, IBuyboxProps, IBuyboxState } from '../../../index';\nimport { getConfigureErrors, getGenericError } from '../utilities/error-utilities';\nimport { BuyboxErrorBlock } from './index';\n\nexport interface IFindInStoreFailureResult {\n missingDimensions?: ProductDimension[];\n}\n\nexport interface IBuyboxFindInStoreViewProps {\n storeSelector?: React.ReactNode;\n heading?: React.ReactNode;\n description?: React.ReactNode;\n errors?: React.ReactNode;\n button?: React.ReactNode;\n productPickupOptionList?: React.ReactNode;\n\n modal?: React.ReactNode;\n\n ContainerProps: INodeProps;\n\n openFindInStoreDialog(): Promise;\n}\n\n// tslint:disable-next-line:max-func-body-length\nexport function getBuyboxFindInStore(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxFindInStoreViewProps | undefined {\n const {\n data,\n slots: {\n storeSelector\n },\n resources : {\n priceFree,\n originalPriceText,\n currentPriceText,\n findInStoreHeaderText,\n findInStoreDescriptionText,\n findInStoreLinkText,\n buyBoxGoToCartText,\n buyBoxContinueShoppingText,\n buyBoxSingleItemText,\n buyBoxMultiLineItemFormatText,\n buyBoxHeaderMessageText,\n descriptionTextToShowAllPickupOptions\n },\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n }\n } = props;\n\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const product = data?.product?.result;\n const price = data?.productPrice?.result;\n const storeSelectorStateManager = data?.storeSelectorStateManager?.result;\n const cart = data?.cart?.result;\n const deliveryOptions = data?.deliveryOptions?.result;\n const retailMulitplePickupMFeatureState = data?.featureState?.result?.\n find(featureState => featureState.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n const\n {\n errorState: {\n configureErrors,\n quantityError,\n otherError,\n errorHost\n },\n modalOpen,\n quantity\n } = state;\n\n const onClick = () => findInStoreOnClick(props, state, callbacks);\n\n if (!product || !storeSelectorStateManager || storeSelector.length === 0) {\n return undefined;\n }\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!deliveryOptions ||\n !deliveryOptions.DeliveryOptions ||\n !PickupDeliveryModeCode ||\n !deliveryOptions.DeliveryOptions.find(option => option.Code === PickupDeliveryModeCode)) {\n return undefined;\n }\n\n const dialogStrings = {\n goToCartText: buyBoxGoToCartText,\n continueShoppingText: buyBoxContinueShoppingText,\n headerItemOneText: buyBoxSingleItemText,\n headerItemFormatText: buyBoxMultiLineItemFormatText,\n headerMessageText: buyBoxHeaderMessageText,\n freePriceText: priceFree,\n originalPriceText: originalPriceText,\n currentPriceText: currentPriceText\n };\n\n const priceComponent = price ? (\n ) : '';\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=240&h=240&m=6`, w: 0, h: 0 },\n lg: { q: `w=240&h=240&m=6`, w: 0, h: 0 },\n xl: { q: `w=240&h=240&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const popupProps: IPopupProps = {\n context: props.context,\n className: 'ms-buybox',\n id: props.id,\n typeName: props.typeName,\n data: {product: props.data.product?.result, price: props.data.productPrice?.result},\n dialogStrings: dialogStrings,\n imageSettings: defaultImageSettings,\n gridSettings: props.context.request.gridSettings,\n productQuantity: quantity,\n priceComponent: priceComponent,\n navigationUrl: getUrlSync('cart', props.context.actionContext),\n modalOpen: modalOpen,\n setModalOpen: callbacks.changeModalOpen\n };\n const renderModalPopup = ;\n\n return {\n ContainerProps: {\n className: 'ms-buybox__find-in-store'\n },\n\n storeSelector: storeSelector[0],\n\n openFindInStoreDialog: onClick,\n\n heading: (\n \n ),\n\n description: (\n

\n {findInStoreDescriptionText}\n

\n ),\n productPickupOptionList: retailMulitplePickupMFeatureState ? (\n \n

\n {descriptionTextToShowAllPickupOptions}\n

\n
    \n {deliveryOptions.DeliveryOptions.map((item:DeliveryOption) => {\n return
  • {item.Description}
  • ;\n })\n }\n
\n
\n ): null,\n errors: (\n \n ),\n\n button: (\n \n {findInStoreLinkText}\n \n ),\n\n modal: renderModalPopup\n };\n}\n\n// tslint:disable-next-line: max-func-body-length\nasync function findInStoreOnClick(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): Promise {\n const {\n data: {\n storeSelectorStateManager: {result: storeSelectorStateManager },\n cart: {result: cart },\n productAvailableQuantity: { result: productAvailableQuantity}\n },\n resources,\n context,\n modules,\n } = props;\n\n const {\n selectedProduct,\n quantity\n } = state;\n\n let dataProduct = props.data.product.result;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const retailMulitplePickupMFeatureState = props.data?.featureState?.result?.\n find(featureState => featureState.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n if (selectedProduct) {\n dataProduct = (await selectedProduct) || dataProduct;\n }\n\n if (!dataProduct || !storeSelectorStateManager) {\n return;\n }\n\n const product = dataProduct;\n\n const missingDimensions = product.Dimensions && product.Dimensions.filter(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value));\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\n if (missingDimensions && missingDimensions.length > 0) {\n if (callbacks.updateErrorState) {\n callbacks.updateErrorState(\n {\n errorHost: 'FINDINSTORE',\n configureErrors: getConfigureErrors(missingDimensions, resources),\n }\n );\n }\n } else {\n storeSelectorStateManager.openDialog({\n product,\n id : storeSelectorId,\n deliveryOptions: retailMulitplePickupMFeatureState ? props.data.deliveryOptions.result: undefined,\n onLocationSelected: (orgUnitLocation, deliveryMode) => {\n if (!cart) {\n return Promise.resolve();\n }\n\n const behavior = props.context?.app?.config?.addToCartBehavior;\n\n return cart.addProductToCart({product: product, count: quantity, location: orgUnitLocation, deliveryMode: deliveryMode})\n .then(result => {\n if (result.status === 'FAILED' && result.substatus === 'MAXQUANTITY') {\n callbacks.changeModalOpen(false);\n\n const productAvailability = state.productAvailableQuantity ?\n state.productAvailableQuantity.ProductAvailableQuantity :\n productAvailableQuantity && productAvailableQuantity.length?\n productAvailableQuantity[0].ProductAvailableQuantity: undefined;\n\n const failureResult: IAddToCartFailureResult = {failureReason: 'CARTACTIONFAILED', cartActionResult: {status: result.status, substatus: result.substatus}};\n callbacks.updateErrorState({\n errorHost: 'ADDTOCART',\n configureErrors: {},\n otherError: getGenericError(failureResult, cart, resources, context, product, productAvailability, orgUnitLocation)\n });\n } else {\n if((behavior === undefined || behavior === 'goToCart')) {\n const navigationUrl = getUrlSync('cart', context.actionContext);\n\n if (result.status === 'SUCCESS' && navigationUrl) {\n window.location.assign(navigationUrl);\n }\n } else if (behavior === 'showModal') {\n callbacks.updateErrorState({\n configureErrors: {}\n });\n callbacks.changeModalOpen(true);\n }\n }\n }).catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.exception(error);\n props.telemetry.debug('Unable to add product to cart');\n }\n return;\n });\n }\n }).catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to find in store');\n }\n return;\n });\n }\n\n return;\n}","/**\n * Copyright (c) 2018 Microsoft Corporation\n */\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IDropdownProps } from './';\nimport { IDropdownItemProps } from './dropdown.props';\n\ntype IDropdownState = {\n /**\n * @friendlyName selectedIndex\n * @description selected index\n */\n selectedIndex: string;\n};\n\n/**\n *\n * DropDown component\n * @extends {React.PureComponent}\n */\nexport class Dropdown extends React.PureComponent {\n private selectMenu: React.RefObject = React.createRef();\n private payLoad: IPayLoad;\n\n constructor(props: IDropdownProps, state: IDropdownState) {\n super(props);\n this.state = {\n selectedIndex: ''\n };\n this.payLoad = getPayloadObject('click', props.telemetryContent!, this.props.dropdownName);\n }\n\n public componentDidMount(): void {\n if (this.selectMenu.current) {\n this.selectMenu.current.selectedIndex = 0;\n }\n }\n\n public render(): JSX.Element {\n const {dropdownId, dropdownList, dropdownName, dropdownToggleName} = this.props;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n \n \n {dropdownList.map(\n (item: IDropdownItemProps) => item && \n )}\n \n );\n }\n\n private _onChanged = async (event: React.ChangeEvent) => {\n this.setState({selectedIndex: event.target.value});\n\n if (this.props.onChange) {\n await this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: event.target.value,\n selectedValue: event.target.innerText\n });\n }\n };\n}","import * as React from 'react';\n\nimport { getTelemetryObject, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\nimport { IBuyboxCallbacks, IBuyboxData, IBuyboxProps, IBuyboxResources, IBuyboxState } from '../../../index';\nimport { Dropdown, IDropdownItemProps, IDropdownOnSelectionChangeNotification } from './dropdown';\n\nexport interface IBuyboxProductConfigureProps {\n product: SimpleProduct;\n productDimensions: ProductDimensionFull[];\n resources: IBuyboxResources;\n channelId: number;\n actionContext: IActionContext;\n errors: { [configureId: string]: string | undefined };\n\n dimensionChanged?(newValue: number): void;\n}\n\nexport interface IBuyboxProductConfigureDropdownViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n\n heading: React.ReactNode;\n errors?: React.ReactNode;\n\n select: React.ReactNode;\n}\n\nexport interface IBuyboxProductConfigureViewProps {\n ContainerProps: INodeProps;\n\n dropdowns: IBuyboxProductConfigureDropdownViewProps[];\n}\n\nlet telemetryContent: ITelemetryContent;\n\nexport function getBuyboxProductConfigure(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxProductConfigureViewProps | undefined {\n const {\n data: {\n product: {result: product },\n productDimensions: {result: productDimensions },\n },\n resources\n } = props;\n\n const\n {\n errorState: {\n configureErrors,\n }\n } = state;\n\n const\n {\n getDropdownName\n } = callbacks;\n\n if (!product || !productDimensions) {\n return undefined;\n }\n\n const onChanged = async (notification: IDropdownOnSelectionChangeNotification) =>\n _onChanged(notification, callbacks.dimensionSelectedAsync);\n\n telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n const dropdowns = productDimensions.map(productDimensionFull => _mapProductDimensionFullToDropdownViewProps(productDimensionFull, resources, configureErrors, getDropdownName, onChanged));\n\n if (!dropdowns || dropdowns.length === 0) {\n return undefined;\n }\n\n return {\n ContainerProps: {\n className: 'ms-buybox__configure'\n },\n dropdowns: dropdowns\n };\n}\n\nconst _onChanged = async (\n notification: IDropdownOnSelectionChangeNotification,\n dimensionChanged: (newValue: number, selectedDimensionValue: string) => Promise,\n ): Promise => {\n await dimensionChanged(+notification.dropdownId, notification.selectId);\n};\n\nconst _mapProductDimensionFullToDropdownViewProps =\n (\n productDimensionFull: ProductDimensionFull,\n resources: IBuyboxResources,\n configureErrors: {[configureId: string]: string | undefined},\n getDropdownName: (dimensionType: number, resources: IBuyboxResources) => string,\n dropdownCallback: (notification: IDropdownOnSelectionChangeNotification) => Promise\n ): IBuyboxProductConfigureDropdownViewProps => {\n const dropdownName = getDropdownName(productDimensionFull.DimensionTypeValue, resources);\n const dropdownId = productDimensionFull.DimensionTypeValue.toString();\n const dropdownToggleName = resources.selectDimensionFormatString.replace('{0}', dropdownName.toLocaleLowerCase());\n const dropdownList: IDropdownItemProps[] = productDimensionFull.DimensionValues\n ? productDimensionFull.DimensionValues.map(dimensionValue => {\n return {\n value: dimensionValue.Value || '',\n id: dimensionValue.RecordId.toString()\n };\n })\n : [];\n const errorMessage = configureErrors[dropdownId];\n\n return {\n ContainerProps: {\n className: 'ms-buybox__dropdown'\n },\n LabelContainerProps: {\n tag: 'label',\n className: 'ms-buybox__dropdown-quantity-label',\n htmlFor: `ms-buybox__dropown-quantity-input-${dropdownId}`\n },\n errors: errorMessage && (\n \n \n ),\n heading: (\n
{dropdownName}
\n ),\n select: (\n \n )\n };\n};","import {\n getDeliveryOptionsForSelectedVariant,\n GetDeliveryOptionsForSelectedVariantInput,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getSelectedVariant,\n IProductInventoryInformation,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\n// tslint:disable-next-line:no-duplicate-imports\nimport {\n FinitePromiseQueue, FinitePromiseQueueError, IPromiseQueue\n} from '@msdyn365-commerce-modules/retail-actions';\n\nimport {\n getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent\n} from '@msdyn365-commerce-modules/utilities';\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport {\n ProductDeliveryOptions, ProductDimensionValue, ProductPrice, SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { IBuyboxData, IBuyboxProps } from '../..';\nimport { IBuyboxResources } from './buybox.props.autogenerated';\nimport {\n getBuyboxAddToCart,\n getBuyboxFindInStore,\n getBuyBoxInventoryLabel,\n getBuyboxKeyInPrice,\n getBuyboxProductAddToOrderTemplate,\n getBuyboxProductAddToWishlist,\n getBuyboxProductConfigure,\n getBuyboxProductDescription,\n getBuyboxProductPrice,\n getBuyboxProductQuantity,\n getBuyboxProductRating,\n getBuyboxProductTitle,\n getBuyboxShopSimilarLook,\n getQuantityLimitsMessages,\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxFindInStoreViewProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxShopSimilarLookViewProps,\n RetailDefaultOrderQuantityLimitsFeatureName\n} from './components';\n\nexport declare type IBuyboxErrorHost = 'ADDTOCART' | 'FINDINSTORE' | 'WISHLIST' | 'SHOPSIMILARITEM' | 'ORDER_TEMPLATE';\n\nexport interface IErrorState {\n errorHost?: IBuyboxErrorHost;\n\n configureErrors: { [configureId: string]: string | undefined };\n quantityError?: string;\n customAmountError?: string;\n otherError?: string;\n}\n\nexport interface IBuyboxCallbacks {\n updateQuantity(newQuantity: number): boolean;\n updateKeyInPrice(keyInPrice: number): void;\n updateErrorState(newErrorState: IErrorState): void;\n updateSelectedProduct(\n selectedProduct: Promise,\n newInventory: IProductInventoryInformation | undefined,\n newPrice: ProductPrice | undefined,\n newDeliveryOptions: ProductDeliveryOptions | undefined): void;\n getDropdownName(dimensionType: number, resources: IBuyboxResources): string;\n dimensionSelectedAsync(selectedDimensionId: number, selectedDimensionValueId: string): Promise;\n changeModalOpen(isModalOpen: boolean): void;\n changeUpdatingDimension(isUpdatingDimension: boolean): void;\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\n}\n\nexport interface IBuyboxState {\n quantity: number;\n min: number | undefined;\n max: number | undefined;\n errorState: IErrorState;\n selectedProduct?: Promise;\n productAvailableQuantity?: IProductInventoryInformation;\n productPrice?: ProductPrice;\n productDeliveryOptions?: ProductDeliveryOptions;\n modalOpen?: boolean;\n isUpdatingDimension?: boolean;\n isUpdatingDeliveryOptions?: boolean;\n isServiceItem?: boolean;\n isPriceKeyedIn?: boolean;\n keyInPriceAmount?: number;\n isCustomPriceSelected?: boolean;\n}\n\nexport interface IBuyboxViewProps extends IBuyboxProps {\n state: IBuyboxState;\n\n ModuleProps: IModuleProps;\n ProductInfoContainerProps: INodeProps;\n MediaGalleryContainerProps: INodeProps;\n\n callbacks: IBuyboxCallbacks;\n\n mediaGallery?: React.ReactNode;\n\n title?: React.ReactNode;\n description?: React.ReactNode;\n rating?: React.ReactNode;\n price?: React.ReactNode;\n addToOrderTemplate?: IBuyboxAddToOrderTemplateViewProps;\n addToWishlist?: IBuyboxAddToWishlistViewProps;\n max: number | undefined;\n\n addToCart: IBuyboxAddToCartViewProps;\n findInStore?: IBuyboxFindInStoreViewProps;\n quantity?: IBuyboxProductQuantityViewProps;\n configure?: IBuyboxProductConfigureViewProps;\n inventoryLabel?: React.ReactNode;\n shopSimilarLook?: IBuyboxShopSimilarLookViewProps;\n quantityLimitsMessages: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n keyInPrice?: IBuyboxKeyInPriceViewProps;\n}\n\n/**\n * Buybox Module\n */\nclass Buybox extends React.PureComponent, IBuyboxState> {\n /**\n * A queue of tasks of processing the changes in the dimensions.\n * Limit to two processes:\n * 1 - for the current process, which is under execution at the moment.\n * 2 - next process, which will process the latest version of data.\n * @remark Enqueueing new promises will discard the previous ones (except the one which is under processing).\n */\n private dimensionUpdateQueue: IPromiseQueue = new FinitePromiseQueue(2);\n private dimensions: { [id: number]: string } = {};\n\n private buyboxCallbacks: IBuyboxCallbacks = {\n updateQuantity: (newQuantity: number): boolean => {\n const errorState = {...this.state.errorState};\n errorState.quantityError = undefined;\n errorState.otherError = undefined;\n\n this.setState({quantity: newQuantity, errorState: errorState});\n return true;\n },\n updateErrorState: (newErrorState: IErrorState): void => {\n this.setState({errorState: newErrorState});\n },\n updateSelectedProduct: (\n newSelectedProduct: Promise,\n newInventory: IProductInventoryInformation | undefined,\n newPrice: ProductPrice | undefined,\n newDeliveryOptions: ProductDeliveryOptions | undefined\n ): void => {\n this.setState({\n selectedProduct: newSelectedProduct,\n productAvailableQuantity: newInventory,\n productDeliveryOptions: newDeliveryOptions});\n this._updatePrice(newPrice);\n },\n dimensionSelectedAsync: (selectedDimensionId: number, selectedDimensionValueId: string): Promise => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n return this.dimensionUpdateQueue.enqueue(() => {\n return this._updateDimensions();\n }).catch((reason: any) => { // tslint:disable-line:no-any\n // Ignore discarded processes.\n if (reason !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw reason;\n }\n });\n },\n getDropdownName: (dimensionType: number, resources: IBuyboxResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n changeModalOpen: (isModalOpen: boolean): void => {\n this.setState({modalOpen: isModalOpen});\n },\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({isUpdatingDimension: isUpdatingDimension});\n },\n /**\n * Update isUpdatingDeliveryOptions state.\n *\n * @param isUpdatingDeliveryOptions - The status of updating delivery options.\n */\n changeUpdatingDeliveryOptions: (isUpdatingDeliveryOptions: boolean): void => {\n this.setState({ isUpdatingDeliveryOptions });\n },\n updateKeyInPrice: (customPrice: number): void => {\n // Remove custom amount error when updating the custom price\n const errorState = {...this.state.errorState};\n errorState.customAmountError = undefined;\n\n this.setState({isPriceKeyedIn: true, keyInPriceAmount: customPrice, errorState: errorState});\n this._updatePrice(this.state.productPrice, customPrice);\n }\n };\n\n private telemetryContent: ITelemetryContent;\n\n constructor(props: IBuyboxProps, state: IBuyboxState) {\n super(props);\n this.state = {\n errorState: {\n configureErrors: {}\n },\n quantity: 1,\n min: undefined,\n max: undefined,\n selectedProduct: undefined,\n productPrice: undefined,\n productDeliveryOptions: undefined,\n\n modalOpen: false,\n isUpdatingDimension: false,\n isUpdatingDeliveryOptions: false\n };\n this.telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n }\n\n public async componentDidMount(): Promise {\n const {\n data: {\n product: { result: product },\n productPrice\n },\n } = this.props;\n\n productPrice.then(async (result) => {\n this._updatePrice(result);\n });\n\n if(product) {\n // check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n\n if (product.ItemTypeValue === PRODUCTASSERVICE) {\n this.setState({isServiceItem: true});\n }\n await this._updateQuantitiesInState(product);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n slots: {\n mediaGallery,\n },\n data: {\n product: { result: product }\n },\n config: { className = '' }\n } = this.props;\n\n const\n {\n max\n } = this.state;\n\n if (!product) {\n this.props.context.telemetry.error('Product content is empty, module wont render');\n return null;\n }\n\n const defaultMinimumKeyInPrice = 10;\n const defaultMaximumKeyInPrice = 100;\n\n const viewProps: IBuyboxViewProps = {\n ...(this.props as IBuyboxProps),\n state: this.state,\n mediaGallery: mediaGallery && mediaGallery.length > 0 ? mediaGallery[0] : undefined,\n ModuleProps: {\n moduleProps: this.props,\n className: classnames('ms-buybox', className)\n },\n ProductInfoContainerProps: {\n className: 'ms-buybox__content'\n },\n MediaGalleryContainerProps: {\n className: 'ms-buybox__media-gallery'\n },\n telemetryContent: this.telemetryContent,\n callbacks: this.buyboxCallbacks,\n title: getBuyboxProductTitle(this.props),\n description: getBuyboxProductDescription(this.props),\n configure: getBuyboxProductConfigure(this.props, this.state, this.buyboxCallbacks),\n findInStore: getBuyboxFindInStore(this.props, this.state, this.buyboxCallbacks),\n price: getBuyboxProductPrice(this.props, this.state),\n addToCart: getBuyboxAddToCart(this.props, this.state, this.buyboxCallbacks, defaultMinimumKeyInPrice, defaultMaximumKeyInPrice),\n addToOrderTemplate: getBuyboxProductAddToOrderTemplate(this.props, this.state, this.buyboxCallbacks),\n addToWishlist: getBuyboxProductAddToWishlist(this.props, this.state, this.buyboxCallbacks),\n rating: !this.props.context.app.config.hideRating && getBuyboxProductRating(this.props),\n quantity: product.IsGiftCard ? undefined : getBuyboxProductQuantity(this.props, this.state, this.buyboxCallbacks),\n inventoryLabel: getBuyBoxInventoryLabel(this.props),\n shopSimilarLook: this.props.config.enableShopSimilarLooks && !product.IsGiftCard ? getBuyboxShopSimilarLook(this.props, this.state, this.buyboxCallbacks) : undefined,\n keyInPrice: this.props.config.enableKeyInPrice && this.state.isCustomPriceSelected?getBuyboxKeyInPrice(this.props, this.state, this.buyboxCallbacks):undefined,\n quantityLimitsMessages: getQuantityLimitsMessages(this.props, this.state),\n max: max\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _updatePrice(\n newPrice: ProductPrice | undefined,\n customPrice: number | undefined = this.state.keyInPriceAmount): void {\n\n if (this.state.isCustomPriceSelected && newPrice) {\n newPrice.CustomerContextualPrice = customPrice;\n }\n this.setState({productPrice: newPrice});\n }\n\n // tslint:disable-next-line:max-func-body-length\n private _updateDimensions = async (): Promise => {\n const {\n data: {\n product: {result: product },\n productDimensions: {result: productDimensions },\n },\n context: {\n actionContext,\n request: {\n apiSettings: {\n channelId\n }\n }\n }\n } = this.props;\n\n if (!product || !productDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = {...this.dimensions};\n this.setState({isUpdatingDimension: true, isUpdatingDeliveryOptions: true });\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.errorState.otherError) {\n const clearOtherErrorState = {...this.state.errorState};\n clearOtherErrorState.otherError = undefined;\n this.setState({errorState: 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.errorState.configureErrors[key]) {\n const errorState = {...this.state.errorState};\n errorState.configureErrors[key] = undefined;\n\n this.setState({errorState: 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 // 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 product.MasterProductId ? product.MasterProductId : product.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 this.setState({selectedProduct: selectedProduct});\n const variantProduct = await selectedProduct;\n\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 const isCustompriceSelected = variantProduct && variantProduct.Dimensions && variantProduct.Dimensions.find(dimension => dimension.DimensionTypeValue === 4 && dimension.DimensionValue && dimension.DimensionValue.Value === 'Custom');\n if (isCustompriceSelected) {\n this.setState({isCustomPriceSelected: true});\n } else {\n // Remove custom amount error when unselect the custom amount\n const errorState = {...this.state.errorState};\n errorState.customAmountError = undefined;\n\n this.setState({isCustomPriceSelected: false, isPriceKeyedIn: false, errorState: errorState});\n }\n\n if(newAvailableQuantity && newAvailableQuantity.length) {\n this.setState({productAvailableQuantity: newAvailableQuantity[0]});\n } else {\n this.setState({productAvailableQuantity: undefined});\n }\n\n // Step 6. Use these dimensions hydrate the product price.\n const newPrice = await getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(\n variantProduct.RecordId,\n channelId\n ),\n actionContext\n );\n\n if (newPrice) {\n this._updatePrice(newPrice);\n }\n\n const RetailMulitplePickupMFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature');\n // Step 7. Use these dimensions hydrate the product delivery options.\n const newDeliveryOptions = await getDeliveryOptionsForSelectedVariant(\n new GetDeliveryOptionsForSelectedVariantInput(\n variantProduct.RecordId,\n channelId,\n undefined,\n undefined,\n RetailMulitplePickupMFeatureState?.IsEnabled\n ),\n actionContext\n );\n\n if(newDeliveryOptions) {\n this.setState({productDeliveryOptions: newDeliveryOptions});\n }\n\n await this._updateQuantitiesInState(variantProduct);\n }\n }\n\n private async _updateQuantitiesInState(product: SimpleProduct): Promise {\n const isOrderQuantityLimitsFeatureEnabled = await this._isOrderQuantityLimitsFeatureEnabled();\n if (isOrderQuantityLimitsFeatureEnabled && product) {\n this.setState({\n quantity: product.Behavior?.DefaultQuantity || 1,\n min: product.Behavior?.MinimumQuantity || 1,\n max: (product.Behavior?.MaximumQuantity && product.Behavior?.MaximumQuantity > 0)\n ? product.Behavior?.MaximumQuantity\n : Number.MAX_VALUE,\n });\n } else {\n this.setState({\n min: 1,\n max: this.props.context.app.config.maxQuantityForCartLineItem || 10,\n });\n }\n }\n\n private _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 _getDropdownName = (dimensionType: number, resources: IBuyboxResources): string => {\n const isGiftCard = this.props.data.product.result?.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 async _isOrderQuantityLimitsFeatureEnabled(): Promise {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n const featureStatuses = await this.props.data.featureState;\n const isFeatureEnabledInHq = featureStatuses?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)?.IsEnabled;\n if (!isFeatureEnabledInHq) {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n let customerInfo;\n try {\n customerInfo = await this.props.data.customerInformation;\n } catch(error) {\n this.props.telemetry.information(error);\n this.props.telemetry.debug('Unable to receive Customer Information. May be user is not authorized');\n return false;\n }\n\n return customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n }\n}\n\nexport default Buybox;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { computed } from 'mobx';\nimport * as React from 'react';\nimport { IGetOrderSummaryInput, IHelp, IOrderSummary, IPaymentMethods, IPaymentMethodsInput } from '../../common';\nimport { getGroups, IGroups } from '../../common/get-groups';\nimport { getOrderInfomationInput, getOrderInformation, IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { getSalesLines, getSalesLinesInput } from '../../common/get-sales-lines';\nimport LabelComponent from '../../common/label';\nimport { getTenderIdOperationIdMap, IPriceContext } from '../../common/utilities';\nimport { getOrderConfirmationHelp } from '../order-confirmation/components/get-help';\nimport { getOrderConfirmationOrderSummary } from '../order-confirmation/components/get-order-summary';\nimport { getOrderConfirmationPaymentMethods } from '../order-confirmation/components/get-payment-methods';\nimport { ICheckoutOrderConfirmationData } from './checkout-order-confirmation.data';\nimport { ICheckoutOrderConfirmationProps } from './checkout-order-confirmation.props.autogenerated';\n\nexport * from '../../common/get-groups';\nexport * from '../../common/get-order-information';\nexport * from '../../common/get-sales-line';\nexport * from '../../common/get-sales-lines';\nexport * from '../../common/utilities';\nexport * from '../order-confirmation/components/get-help';\nexport * from '../order-confirmation/components/get-order-summary';\nexport * from '../order-confirmation/components/get-payment-methods';\n\nexport interface ICheckoutOrderConfirmationViewProps extends ICheckoutOrderConfirmationProps {\n moduleProps: IModuleProps;\n salesOrder?: SalesOrder;\n footerProps?: INodeProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n heading: React.ReactNode;\n backToShoppingLink?: React.ReactNode;\n orderInfomation?: IOrderInformation;\n salesLines?: ISalesLine[];\n groups?: IGroups;\n orderSummary?: IOrderSummary;\n payment?: IPaymentMethods;\n help?: IHelp;\n}\n\n/**\n *\n * OrderConfirmation component\n * @extends {React.PureComponent>}\n */\nclass OrderConfirmation extends React.PureComponent> {\n private moduleName: string = 'ms-order-confirmation';\n private telemetryContent?: ITelemetryContent;\n private backToShoppingAttributes?: Msdyn365.IDictionary;\n\n constructor(props: ICheckoutOrderConfirmationProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\n this.backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n }\n\n @computed get isCurrentChannel(): boolean {\n if (!this.order) {\n return false;\n }\n return this.order.ChannelId === get(this.props, 'context.request.apiSettings.channelId');\n }\n\n @computed get isDataReady(): boolean {\n return get(this.props, 'data.checkout.status') === 'SUCCESS';\n }\n\n @computed get hasError(): boolean {\n return get(this.props, 'data.checkout.status') === 'FAILED';\n }\n\n @computed get order(): SalesOrder | undefined {\n return get(this.props, 'data.checkout.result.salesOrder');\n }\n\n @computed get products(): SimpleProduct[] {\n return get(this.props, 'data.checkout.result.orderedProducts') || [];\n }\n\n @computed get priceContext(): IPriceContext {\n const {\n id,\n typeName,\n context,\n telemetry,\n resources: { freePriceText }\n } = this.props;\n return {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n }\n\n @computed get earnedPoints(): number {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n if (loyaltyCard && loyaltyCard.RewardPoints && this.order) {\n const pointPrograms = loyaltyCard.RewardPoints.map(point => point.RewardPointId);\n const rewardLines = this.order.LoyaltyRewardPointLines || [];\n let total = 0;\n rewardLines.forEach(line => {\n if ((line.RewardPointAmountQuantity || 0) > 0 && pointPrograms.indexOf(line.RewardPointId) > -1) {\n total += line.RewardPointAmountQuantity!;\n }\n });\n return total;\n }\n return 0;\n }\n\n @computed get orderSummaryProps(): IGetOrderSummaryInput | undefined {\n if (!this.order) {\n return;\n }\n\n const {\n resources: { orderSummaryHeading, orderSummaryItemsTotalLabel, orderSummaryShippingFeeLabel, orderSummaryTaxLabel, orderSummaryGrandTotalLabel, pointsEarnedLabel }\n } = this.props;\n return {\n order: this.order,\n earnedPoints: this.earnedPoints,\n priceContext: this.priceContext,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n pointsEarnedLabel,\n orderSummaryGrandTotalLabel\n }\n };\n }\n\n @computed get paymentMethodsProps(): IPaymentMethodsInput | undefined {\n const tenderTypes = this.props.data.tenderTypes.result;\n if (!this.order || !this.order.TenderLines || !tenderTypes) {\n return;\n }\n\n const locale = get(this.props, 'context.request.locale') || 'en-US';\n\n const {\n resources: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n } = this.props;\n\n return {\n priceContext: this.priceContext,\n tenderLines: this.order.TenderLines,\n tenderIdOperationIdMap: getTenderIdOperationIdMap(tenderTypes),\n locale,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n };\n }\n\n public render(): JSX.Element {\n const {\n resources: {\n noSalesOrderText,\n genericErrorMessage,\n needHelpLabel,\n helpLineNumberLabel,\n loadingLabel,\n backToShopping,\n orderItemLabel,\n orderItemsLabel,\n helpLineContactAriaLabel,\n },\n config: { heading, contactNumber, showTimeslot }\n } = this.props;\n\n const moduleProps = { moduleProps: this.props, className: classname('ms-order-confirmation', this.props.config.className) };\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n let viewProps: ICheckoutOrderConfirmationViewProps = {\n ...this.props,\n moduleProps,\n heading: heading && heading.text && (\n \n ),\n backToShoppingLink: backToShoppingUrl && (\n \n ),\n footerProps: { className: 'ms-order-confirmation__footer' }\n };\n\n if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.isDataReady) {\n viewProps = {\n ...viewProps,\n loading: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.order) {\n viewProps = {\n ...viewProps,\n alert: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const salesLinesInput = getSalesLinesInput(this.props, this.moduleName, this.order, this.products, this.priceContext, false, showTimeslot, undefined, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig?.result);\n const salesLines = salesLinesInput && getSalesLines(salesLinesInput);\n\n const orderInfomationInput = this.order && getOrderInfomationInput(this.props, this.moduleName, this.order, this.priceContext);\n const orderInfomation = orderInfomationInput && getOrderInformation(orderInfomationInput);\n\n viewProps = {\n ...viewProps,\n salesOrder: this.order,\n orderInfomation,\n salesLines,\n groups: salesLines\n ? getGroups({\n moduleName: this.moduleName,\n salesLines,\n resources: { orderItemLabel, orderItemsLabel },\n showTimeslot: showTimeslot,\n retailMultiplePickUpOptionEnabled\n })\n : undefined,\n orderSummary: this.orderSummaryProps ? getOrderConfirmationOrderSummary(this.orderSummaryProps) : undefined,\n payment: this.paymentMethodsProps ? getOrderConfirmationPaymentMethods(this.paymentMethodsProps) : undefined,\n help: contactNumber ? getOrderConfirmationHelp({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel, telemetryContent: this.telemetryContent }) : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleCheckoutOrderConfirmationHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n}\n\nexport default OrderConfirmation;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { TenderLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\nimport { IPaymentMethods, IPaymentMethodsInput } from '../../../common';\n\nexport const getOrderConfirmationPaymentMethods = ({\n priceContext,\n tenderLines,\n tenderIdOperationIdMap,\n resource: { paymentMethodsTitle, creditCardEndingLabel, giftCardEndingLabel, amountCoveredLabel, loyaltyCardUsedLabel, cashUsedLabel }\n}: IPaymentMethodsInput): IPaymentMethods => {\n const getLastFourDigit = (digits = '') => digits.substr(-4);\n\n const getCard = (tenderLine: TenderLine, showAmount: boolean = false) => {\n const cardLastFourDigit = getLastFourDigit(tenderLine.MaskedCardNumber);\n // @ts-ignore\n const isValidCardNumber = cardLastFourDigit && !isNaN(cardLastFourDigit);\n const amount = (tenderLine.AuthorizedAmount || 0) > 0 ? tenderLine.AuthorizedAmount : tenderLine.Amount;\n const showAmountCovered = showAmount && amount && amount > 0 ? true : false;\n\n return (\n
\n

\n {`${tenderLine.CardTypeId} ${isValidCardNumber ? `${creditCardEndingLabel} ${cardLastFourDigit}` : ``}`}\n

\n {showAmountCovered &&

\n {amountCoveredLabel}\n \n

}\n
\n );\n };\n\n const getGiftCertificate = (tenderLine: TenderLine) => (\n
\n

\n {giftCardEndingLabel} {getLastFourDigit(tenderLine.GiftCardId)}\n

\n

\n {amountCoveredLabel}\n \n

\n
\n );\n\n const getLoyalty = (tenderLine: TenderLine) => (\n
\n

\n {loyaltyCardUsedLabel} {tenderLine.LoyaltyCardId}\n

\n

\n {amountCoveredLabel}\n \n

\n
\n );\n\n const getCash = (tenderLine: TenderLine) => (\n
\n

{cashUsedLabel}

\n

\n {amountCoveredLabel}\n \n

\n
\n );\n\n return {\n paymentMethodsProps: { className: 'ms-order-confirmation__payment-methods' },\n title:
{paymentMethodsTitle}
,\n methods: tenderLines.reduce((lines: React.ReactNode[], tenderLine) => {\n if (!tenderLine.TenderTypeId) {\n return lines;\n }\n switch (tenderIdOperationIdMap[tenderLine.TenderTypeId]) {\n case 201:\n lines.push(getCard(tenderLine, tenderLines.length > 1));\n break;\n case 214:\n lines.push(getGiftCertificate(tenderLine));\n break;\n case 207:\n lines.push(getLoyalty(tenderLine));\n break;\n case 200:\n lines.push(getCash(tenderLine));\n break;\n default:\n // do nothing\n }\n return lines;\n }, [])\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IGetHelpInput, IHelp } from '../../../';\n\nexport const getOrderDetailsHelp = ({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel, telemetryContent }: IGetHelpInput): IHelp => {\n const payLoad: IPayLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.ContactNumber);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return ({\n helpProps: { className: 'ms-order-details__help' },\n needHelpLabel:

{needHelpLabel}

,\n helpLineNumberLabel: {helpLineNumberLabel},\n contactNumber: (\n \n {contactNumber}\n \n )}\n );\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { PriceComponent } from '@msdyn365-commerce/components';\n\nimport * as React from 'react';\nimport { IGetOrderSummaryInput, IOrderSummary, IPriceContext } from '../../../common/';\n\ninterface ISummaryLineProps {\n priceContext?: IPriceContext;\n name: string;\n label: string;\n value?: number;\n}\n\nconst OrderSummaryLine: React.SFC = ({ name, label, value = 0, priceContext }) => (\n

\n {label}\n {priceContext ? (\n \n ) : (\n {value}\n )}\n

\n);\n\nexport const getOrderDetailsOrderSummary = ({\n order,\n priceContext,\n earnedPoints,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n orderSummaryGrandTotalLabel,\n pointsEarnedLabel\n },\n canShip\n}: IGetOrderSummaryInput): IOrderSummary => {\n return {\n orderSummaryProps: { className: 'ms-order-details__order-summary' },\n heading:

{orderSummaryHeading}

,\n subtotal: (\n \n ),\n shipping: canShip ? (\n \n ) : '',\n tax: ,\n totalAmount: (\n \n ),\n earnedPoints: earnedPoints ? : undefined\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { TenderLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\nimport { IPaymentMethods, IPaymentMethodsInput } from '../../../common';\n\n// tslint:disable-next-line:max-func-body-length\nexport const getOrderDetailsPaymentMethods = ({\n priceContext,\n tenderLines,\n tenderIdOperationIdMap,\n resource: { paymentMethodsTitle, creditCardEndingLabel, giftCardEndingLabel, amountCoveredLabel, loyaltyCardUsedLabel, cashUsedLabel, customerAccountUsedLabel }\n}: IPaymentMethodsInput): IPaymentMethods => {\n\n const OPERATIONS = {\n PayCard: 201,\n PayGiftCertificate: 214,\n PayLoyalty: 207,\n PayCash: 200,\n PayCustomerAccount: 202,\n };\n\n const getLastFourDigit = (digits = '') => digits.substr(-4);\n\n const getCard = (tenderLine: TenderLine, showAmount: boolean = false) => {\n const cardLastFourDigit = getLastFourDigit(tenderLine.MaskedCardNumber);\n // @ts-ignore\n const isValidCardNumber = cardLastFourDigit && !isNaN(cardLastFourDigit);\n const amount = (tenderLine.AuthorizedAmount || 0) > 0 ? tenderLine.AuthorizedAmount : tenderLine.Amount;\n const showAmountCovered = showAmount && amount && amount > 0 ? true : false;\n\n return (\n
\n

\n {`${tenderLine.CardTypeId} ${isValidCardNumber ? `${creditCardEndingLabel} ${cardLastFourDigit}` : ``}`}\n

\n {showAmountCovered &&

\n {amountCoveredLabel}\n \n

}\n
\n );\n };\n\n const getCustomerAccountPayment = (tenderLine: TenderLine) => (\n
\n

\n {customerAccountUsedLabel} {tenderLine.CustomerId}\n

\n

\n {amountCoveredLabel}\n \n

\n
\n );\n\n const getGiftCertificate = (tenderLine: TenderLine) => (\n
\n

\n {giftCardEndingLabel} {getLastFourDigit(tenderLine.GiftCardId)}\n

\n

\n {amountCoveredLabel}\n \n

\n
\n );\n\n const getLoyalty = (tenderLine: TenderLine) => (\n
\n

\n {loyaltyCardUsedLabel} {tenderLine.LoyaltyCardId}\n

\n

\n {amountCoveredLabel}\n \n

\n
\n );\n\n const getCash = (tenderLine: TenderLine) => (\n
\n

{cashUsedLabel}

\n

\n {amountCoveredLabel}\n \n

\n
\n );\n\n return {\n paymentMethodsProps: { className: 'ms-order-details__payment-methods' },\n title:
{paymentMethodsTitle}
,\n methods: tenderLines.reduce((lines: React.ReactNode[], tenderLine) => {\n if (!tenderLine.TenderTypeId) {\n return lines;\n }\n switch (tenderIdOperationIdMap[tenderLine.TenderTypeId]) {\n case OPERATIONS.PayCard:\n lines.push(getCard(tenderLine, tenderLines.length > 1));\n break;\n case OPERATIONS.PayGiftCertificate:\n lines.push(getGiftCertificate(tenderLine));\n break;\n case OPERATIONS.PayLoyalty:\n lines.push(getLoyalty(tenderLine));\n break;\n case OPERATIONS.PayCash:\n lines.push(getCash(tenderLine));\n break;\n case OPERATIONS.PayCustomerAccount:\n lines.push(getCustomerAccountPayment(tenderLine));\n break;\n default:\n // do nothing\n }\n return lines;\n }, [])\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, FeatureState, LoyaltyRewardPoint, ProductDeliveryOptions,SalesLine, SalesOrder,SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { computed } from 'mobx';\nimport * as React from 'react';\nimport { IGetOrderSummaryInput, IHelp, IOrderSummary, IPaymentMethods, IPaymentMethodsInput } from '../../common';\nimport { getGroups, IGroups } from '../../common/get-groups';\nimport { getOrderInfomationInput, getOrderInformation, IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { getSalesLines, getSalesLinesInput } from '../../common/get-sales-lines';\nimport LabelComponent from '../../common/label';\nimport { getTenderIdOperationIdMap, IPriceContext } from '../../common/utilities';\nimport { IOrderDetailsData, IOrderDetailsProps } from './../..';\nimport { getOrderDetailsHelp } from './components/get-help';\nimport { getOrderDetailsOrderSummary } from './components/get-order-summary';\nimport { getOrderDetailsPaymentMethods } from './components/get-payment-methods';\nimport { addressOptions } from './order-details.props.autogenerated';\n\nexport * from '../../common/get-groups';\nexport * from '../../common/get-order-information';\nexport * from '../../common/get-sales-line';\nexport * from '../../common/get-sales-lines';\nexport * from '../../common/utilities';\nexport * from './components/get-help';\nexport * from './components/get-order-summary';\nexport * from './components/get-payment-methods';\n\nexport interface IOrderDetailsViewProps extends IOrderDetailsProps {\n moduleProps: IModuleProps;\n salesOrder?: SalesOrder;\n footerProps?: INodeProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n heading: React.ReactNode;\n backToShoppingLink?: React.ReactNode;\n orderInfomation?: IOrderInformation;\n salesLines?: ISalesLine[];\n groups?: IGroups;\n orderSummary?: IOrderSummary;\n payment?: IPaymentMethods;\n help?: IHelp;\n}\n\n/**\n *\n * OrderDetails component\n * @extends {React.PureComponent>}\n */\nclass OrderDetails extends React.PureComponent> {\n private moduleName: string = 'ms-order-details';\n private telemetryContent: ITelemetryContent;\n\n @computed get isCurrentChannel(): boolean {\n if (!this.order) {\n return false;\n }\n return this.order.ChannelId === get(this.props, 'context.request.apiSettings.channelId');\n }\n\n @computed get isDataReady(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'SUCCESS';\n }\n\n @computed get hasError(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'FAILED';\n }\n\n @computed get order(): SalesOrder | undefined {\n return get(this.props, 'data.orderHydration.result.salesOrder');\n }\n\n @computed get products(): SimpleProduct[] {\n return get(this.props, 'data.orderHydration.result.products') || [];\n }\n\n @computed get deliveryOptions(): ProductDeliveryOptions[] {\n return get(this.props, 'data.orderHydration.result.deliveryOptions') || [];\n }\n\n @computed get priceContext(): IPriceContext {\n const {\n id,\n typeName,\n context,\n telemetry,\n resources: { freePriceText }\n } = this.props;\n return {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n }\n\n @computed get earnedPoints(): number {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n if (loyaltyCard && loyaltyCard.RewardPoints && this.order) {\n const pointPrograms = loyaltyCard.RewardPoints.map((point:LoyaltyRewardPoint) => point.RewardPointId);\n const rewardLines = this.order.LoyaltyRewardPointLines || [];\n let total = 0;\n rewardLines.forEach(line => {\n if ((line.RewardPointAmountQuantity || 0) > 0 && pointPrograms.indexOf(line.RewardPointId) > -1) {\n total += line.RewardPointAmountQuantity!;\n }\n });\n return total;\n }\n return 0;\n }\n\n @computed get orderSummaryProps(): IGetOrderSummaryInput | undefined {\n if (!this.order) {\n return;\n }\n const { request } = this.props.context;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find((item:FeatureState) => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\n const orderDetailsLines = this.order?.SalesLines;\n const canShip = orderDetailsLines?.some(orderDetailsLine => (orderDetailsLine.DeliveryMode && orderDetailsLine.DeliveryMode !== '')\n ? (orderDetailsLine.DeliveryMode !== this.getDeliveryMode(orderDetailsLine, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig?.result, pickupDeliveryModeCode) && orderDetailsLine.DeliveryMode !== emailDeliveryModeCode)\n : orderDetailsLine);\n\n const {\n resources: { orderSummaryHeading, orderSummaryItemsTotalLabel, orderSummaryShippingFeeLabel, orderSummaryTaxLabel, orderSummaryGrandTotalLabel, pointsEarnedLabel }\n } = this.props;\n return {\n order: this.order,\n earnedPoints: this.earnedPoints,\n priceContext: this.priceContext,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n pointsEarnedLabel,\n orderSummaryGrandTotalLabel\n },\n canShip: canShip\n };\n }\n\n @computed get paymentMethodsProps(): IPaymentMethodsInput | undefined {\n const tenderTypes = this.props.data.tenderTypes.result;\n if (!this.order || !this.order.TenderLines || !tenderTypes) {\n return;\n }\n\n const locale = get(this.props, 'context.request.locale') || 'en-US';\n\n const {\n resources: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n } = this.props;\n\n return {\n priceContext: this.priceContext,\n tenderLines: this.order.TenderLines,\n tenderIdOperationIdMap: getTenderIdOperationIdMap(tenderTypes),\n locale,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n };\n }\n\n constructor(props: IOrderDetailsProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public render(): JSX.Element {\n const {\n resources: {\n noSalesOrderDetailsText,\n genericErrorMessage,\n needHelpLabel,\n helpLineNumberLabel,\n loadingLabel,\n backToShopping,\n orderItemLabel,\n orderItemsLabel,\n helpLineContactAriaLabel,\n },\n config: { heading, contactNumber, showChannelInfo, showTimeslot }\n } = this.props;\n\n const showAddress = this.props.config.addressOptions !== undefined && this.props.config.addressOptions === addressOptions.showAddressWithSingleLine || this.props.config.addressOptions === addressOptions.showAddressWithMultiplelines;\n const showFullAddress = this.props.config.addressOptions !== undefined && this.props.config.addressOptions === addressOptions.showAddressWithMultiplelines;\n const moduleProps = { moduleProps: this.props, className: classname('ms-order-details', this.props.config.className) };\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const channelIdentities = this.props.data.channels.result && this.props.data.channels.result.channelIdentities;\n const orgUnitLocations = this.props.data.orgUnitLocations.result && this.props.data.orgUnitLocations.result.orgUnitLocations;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n let viewProps: IOrderDetailsViewProps = {\n ...this.props,\n moduleProps,\n heading: heading && (\n \n ),\n backToShoppingLink: backToShoppingUrl && (\n \n ),\n footerProps: { className: 'ms-order-details__footer' }\n };\n\n if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.isDataReady) {\n viewProps = {\n ...viewProps,\n loading: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.order) {\n viewProps = {\n ...viewProps,\n alert: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const salesLInput = getSalesLinesInput(this.props, this.moduleName, this.order, this.products,\n this.priceContext, showFullAddress, showTimeslot, this.telemetryContent, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig?.result, this.deliveryOptions);\n const salesLines = salesLInput && getSalesLines(salesLInput);\n\n const orderInfomationInput = this.order && getOrderInfomationInput(this.props, this.moduleName, this.order, this.priceContext, channelIdentities, orgUnitLocations, showChannelInfo);\n const orderInfomation = orderInfomationInput && getOrderInformation(orderInfomationInput);\n\n viewProps = {\n ...viewProps,\n salesOrder: this.order,\n orderInfomation,\n salesLines,\n groups: salesLines\n ? getGroups({\n moduleName: this.moduleName,\n salesLines,\n resources: { orderItemLabel, orderItemsLabel },\n showAddress: showAddress,\n showTimeslot: showTimeslot,\n retailMultiplePickUpOptionEnabled: retailMultiplePickUpOptionEnabled\n })\n : undefined,\n orderSummary: this.orderSummaryProps ? getOrderDetailsOrderSummary(this.orderSummaryProps) : undefined,\n payment: this.paymentMethodsProps ? getOrderDetailsPaymentMethods(this.paymentMethodsProps) : undefined,\n help: contactNumber ? getOrderDetailsHelp({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel, telemetryContent: this.telemetryContent }) : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleOrderDetailsHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private getDeliveryMode = (salesLine: SalesLine, featureSate: boolean = false, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, pickupDeliveryMode?: string) => {\n if(!featureSate) {\n return pickupDeliveryMode;\n } else {\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === salesLine.DeliveryMode);\n }\n };\n}\n\nexport default OrderDetails;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Alert, Button, INodeProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { showAdditionalFields } from '../checkout-gift-card.props.autogenerated';\n\nexport interface IGetFormInput {\n errorMessage: string;\n giftCardNumber: string;\n giftCardPin: string;\n giftCardExp: string;\n inputRef?: React.RefObject;\n inputPinRef?: React.RefObject;\n inputExpRef?: React.RefObject;\n supportExternalGiftCard?: boolean;\n additionalFields?: showAdditionalFields;\n resources: {\n applyGiftCardButton: string;\n giftCardFormLabel: string;\n giftCardNumberLabel: string;\n giftCardPinLabel: string;\n giftCardExpLabel: string;\n giftCardAlertLabel: string;\n giftCardPinPlaceholderText: string;\n giftCardExpPlaceholderText: string;\n };\n onEnterGiftCardNumber(giftCardNumber: string): void;\n onEnterGiftCardPin(giftCardPin: string): void;\n onEnterGiftCardExp(giftCardExp: string): void;\n onApplyGiftCard(): Promise;\n}\n\nexport interface IForm {\n formProps: INodeProps;\n label: React.ReactNode;\n inputPinLabel: React.ReactNode;\n inputExpLabel: React.ReactNode;\n alert: React.ReactNode;\n inputProps: INodeProps;\n inputNumProps: INodeProps;\n inputPinProps: INodeProps;\n inputExpProps: INodeProps;\n inputNumber: React.ReactNode;\n inputPin: React.ReactNode;\n inputExp: React.ReactNode;\n applyButton: React.ReactNode;\n supportExternalGiftCard: boolean | undefined;\n showGiftCardPinInput: boolean | undefined;\n showGiftCardExpInput: boolean | undefined;\n alertFieldLabel: React.ReactNode;\n}\n\n// tslint:disable-next-line:max-func-body-length\nexport const getForm = (options: IGetFormInput): IForm => {\n const {\n errorMessage,\n inputRef,\n inputPinRef,\n inputExpRef,\n giftCardNumber,\n giftCardPin,\n giftCardExp,\n onEnterGiftCardNumber,\n onEnterGiftCardPin,\n onEnterGiftCardExp,\n onApplyGiftCard,\n supportExternalGiftCard,\n additionalFields,\n resources: { applyGiftCardButton, giftCardFormLabel, giftCardNumberLabel, giftCardPinLabel, giftCardExpLabel,\n giftCardAlertLabel, giftCardPinPlaceholderText, giftCardExpPlaceholderText }\n } = options;\n\n const onApply = async (e: React.SyntheticEvent): Promise => {\n e.preventDefault();\n await onApplyGiftCard();\n };\n\n const onChangeNumber = (e: React.ChangeEvent) => {\n const value = (e.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardNumber(value);\n };\n\n const onChangePin = (e: React.ChangeEvent) => {\n const value = (e.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardPin(value);\n };\n\n // need to filter out the month and year\n const onChangeExp = (e: React.ChangeEvent) => {\n const value = (e.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardExp(value);\n };\n\n const formProps = {\n className: classnames('ms-checkout-gift-card__form', { 'is-invalid': !!errorMessage }),\n onSubmit: onApply,\n tag: 'form' as NodeTag\n };\n\n const label = (\n \n );\n\n const inputPinLabel = (\n \n );\n\n const inputExpLabel = (\n \n );\n\n const alertFieldLabel = (\n \n );\n\n const alert = (\n \n {errorMessage}\n \n );\n\n const inputProps = {\n className: 'ms-checkout-gift-card__input-fields'\n };\n\n const inputNumProps = {\n className: 'ms-checkout-gift-card__input-num-fields'\n };\n\n const inputPinProps = {\n className: 'ms-checkout-gift-card__input-pin-fields'\n };\n\n const inputExpProps = {\n className: 'ms-checkout-gift-card__input-exp-fields'\n };\n\n const inputNumber = (\n \n );\n\n const inputPin = (\n \n );\n\n const inputExp = (\n \n );\n\n const applyButton = (\n \n {applyGiftCardButton}\n \n );\n\n let showGiftCardPinInput = false;\n let showGiftCardExpInput = false;\n\n switch(additionalFields) {\n case showAdditionalFields.pin:\n showGiftCardPinInput = true;\n break;\n case showAdditionalFields.expirationDate:\n showGiftCardExpInput = true;\n break;\n case showAdditionalFields.pinAndExpirationDate:\n showGiftCardPinInput = true;\n showGiftCardExpInput = true;\n break;\n default:\n }\n\n return {\n formProps,\n label,\n inputPinLabel,\n inputExpLabel,\n alert,\n inputProps,\n inputNumProps,\n inputPinProps,\n inputExpProps,\n inputNumber,\n inputPin,\n inputExp,\n applyButton,\n supportExternalGiftCard,\n showGiftCardPinInput,\n showGiftCardExpInput,\n alertFieldLabel\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport * as React from 'react';\n\nexport interface IGetItemInput {\n giftCard: IGiftCardExtend;\n canRemove: boolean;\n resources: {\n enteredGiftCardLabel: string;\n giftCardAvailableBalanceLabel: string;\n removeGiftCardButton: string;\n };\n getFormattedPrice(price?: number, currencyCode?: string): string;\n onRemoveGiftCard(giftCardNumber: string): void;\n}\n\nexport interface IItem {\n itemProps: INodeProps;\n id?: string;\n selectedGiftCard: React.ReactNode;\n removeButton?: React.ReactNode;\n}\n\n/**\n *\n * GiftCardItem component\n * @extends {React.PureComponent}\n */\nexport const getItem = ({\n giftCard,\n getFormattedPrice,\n canRemove,\n onRemoveGiftCard,\n resources: { enteredGiftCardLabel, giftCardAvailableBalanceLabel, removeGiftCardButton }\n}: IGetItemInput): IItem => {\n const balance = getFormattedPrice(giftCard.Balance, giftCard.CardCurrencyCode);\n const giftCardLast4Digit = (giftCard.Id || '').substr(-4);\n const onRemove = (): void => onRemoveGiftCard(giftCard.Id || '');\n\n const itemProps = {\n className: 'ms-checkout-gift-card__item'\n };\n\n const selectedGiftCard = (\n \n {enteredGiftCardLabel} {giftCardLast4Digit} ({giftCardAvailableBalanceLabel}{' '}\n {balance})\n \n );\n\n const removeButton = canRemove && (\n \n );\n\n return {\n itemProps,\n id: giftCard.Id,\n selectedGiftCard,\n removeButton\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { getItem, IItem } from './get-item';\n\ninterface IGetListInput {\n giftCards?: IGiftCardExtend[];\n canRemove: boolean;\n resources: {\n enteredGiftCardLabel: string;\n giftCardAvailableBalanceLabel: string;\n removeGiftCardButton: string;\n };\n getFormattedPrice(price?: number, currencyCode?: string): string;\n onRemoveGiftCard(giftCardNumber: string): void;\n}\n\nexport interface IList {\n listProps: INodeProps;\n list: IItem[];\n}\n\nexport const getList = ({ giftCards, canRemove, resources, getFormattedPrice, onRemoveGiftCard }: IGetListInput): IList | undefined => {\n if (!giftCards || !giftCards.length) {\n return undefined;\n }\n\n const listProps = {\n className: 'ms-checkout-gift-card__list'\n };\n\n const list = giftCards.map(giftCard =>\n getItem({\n canRemove,\n getFormattedPrice,\n giftCard,\n onRemoveGiftCard,\n resources\n })\n );\n\n return {\n listProps,\n list\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\ninterface IGiftCardTitleProps {\n title: string;\n}\n\nconst GiftCardTitle: React.FC = ({ title }) => ;\n\nexport default GiftCardTitle;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport {\n getGiftCardAsync, getTenderTypesAsync, resolveCardTypesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport {\n CardType, CardTypeInfo, GiftCard, RetailOperation, TenderType\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classname from 'classnames';\nimport { computed, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { OPERATIONS } from '../checkout';\nimport { ICheckoutGiftCardData } from './checkout-gift-card.data';\nimport { ICheckoutGiftCardProps } from './checkout-gift-card.props.autogenerated';\nimport { getForm, IForm } from './components/get-form';\nimport { getList, IList } from './components/get-list';\nimport TitleCompoent from './components/title';\n\nexport * from './components/get-form';\nexport * from './components/get-item';\nexport * from './components/get-list';\n\ninterface ICheckoutGiftCardState {\n isFetchingGiftCard: boolean;\n errorMessage: string;\n giftCardNumber: string;\n giftCardPin: string;\n giftCardExp: string;\n}\n\nconst enum SupportedGiftCardType {\n Internal = 'internal',\n External = 'external',\n Both = 'both'\n}\n\nexport interface ICheckoutGiftCardModuleProps extends ICheckoutGiftCardProps, IModuleStateProps { }\n\nexport interface IShowResource {\n title: React.ReactNode;\n list?: IList;\n}\n\nexport interface IAddResource {\n form: IForm;\n list?: IList;\n}\n\nexport interface ICheckoutGiftCardViewProps extends ICheckoutGiftCardProps<{}>, ICheckoutGiftCardState {\n className?: string;\n\n showGiftCard?: IShowResource;\n addGiftCard?: IAddResource;\n\n checkoutGiftCardProps: IModuleProps;\n couldPaidByGiftCard?: boolean;\n isEnabled?: boolean;\n onEdit?(): void;\n onCancel?(): void;\n onSubmit?(): void;\n enterGiftCardNumber?(giftCardNumber: string): void;\n enterGiftCardPin?(giftCardNumber: string): void;\n enterGiftCardExp?(giftCardNumber: string): void;\n removeGiftCard?(giftCardNumber: string): void;\n applyGiftCard?(): void;\n}\n\n/**\n *\n * CheckoutGiftCard component\n * @extends {React.Component, ICheckoutGiftCardState>}\n */\n@observer\nexport class CheckoutGiftCard extends React.Component {\n public state: ICheckoutGiftCardState = {\n isFetchingGiftCard: false,\n errorMessage: '',\n giftCardNumber: '',\n giftCardPin: '',\n giftCardExp: ''\n };\n\n private inputRef: React.RefObject = React.createRef();\n\n private inputPinRef: React.RefObject = React.createRef();\n\n private inputExpRef: React.RefObject = React.createRef();\n\n @computed get isDataReady(): boolean {\n return (this.props.data.checkout.result && this.props.data.checkout.status) === 'SUCCESS';\n }\n\n @computed get getLoyaltyAmount(): number {\n const checkoutState = this.props.data.checkout.result;\n if (!checkoutState || !checkoutState.loyaltyAmount) {\n return 0;\n }\n return checkoutState.loyaltyAmount;\n }\n\n @computed get shouldPayGiftCard(): boolean {\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n if (!cart) {\n return false;\n }\n // Use gift card card when loyalty points do not cover the total amount\n const amountDue = (cart.TotalAmount || 0) - this.getLoyaltyAmount;\n return amountDue > 0;\n }\n\n @computed get hasSelectedItem(): boolean {\n const {\n data: { checkout }\n } = this.props;\n const giftCards = checkout.result && checkout.result.giftCardExtends;\n return !!giftCards && giftCards.length > 0;\n }\n\n @computed get isPaymentVerificationRedirection(): boolean {\n const { requestFormData, query } = this.props.context.request;\n return (requestFormData && query && query.pv === '1') ? true : false;\n }\n\n public componentDidMount(): void {\n // @ts-ignore: Compiler not reconizing condition check for function params\n when(\n () => this.isDataReady,\n () => {\n this.init();\n }\n );\n }\n\n public render(): JSX.Element | null {\n const {\n moduleState: { isReady },\n data: { checkout },\n config: { className, showAdditionalFields },\n resources\n } = this.props;\n const { errorMessage, giftCardNumber, giftCardPin, giftCardExp } = this.state;\n const giftCards = checkout.result && checkout.result.giftCardExtends;\n const additionalFields = showAdditionalFields;\n const supportedGiftCardType = this.props.context.app.config.giftCardSupported;\n\n if (!this.isEnabled() || (!this.shouldPayGiftCard && !isReady)) {\n this.props.context.telemetry.error('Checkout giftcard content is empty, module wont render');\n return null;\n }\n\n const supportExternalGiftCard = supportedGiftCardType === SupportedGiftCardType.Internal ? false : true;\n\n const moduleClassName = classname('ms-checkout-gift-card', className, isReady ? 'show' : 'add');\n\n const viewProps: ICheckoutGiftCardViewProps = {\n ...this.props,\n ...this.state,\n className: moduleClassName,\n\n checkoutGiftCardProps: { moduleProps: this.props, className: moduleClassName },\n couldPaidByGiftCard: this.couldPaidByGiftCard(),\n isEnabled: this.isEnabled(),\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit,\n enterGiftCardNumber: this.enterGiftCardNumber,\n enterGiftCardPin: this.enterGiftCardPin,\n enterGiftCardExp: this.enterGiftCardExp,\n removeGiftCard: this.removeGiftCard,\n applyGiftCard: this.applyGiftCard,\n showGiftCard: isReady\n ? {\n title: ,\n list: getList({\n canRemove: false,\n getFormattedPrice: this.getFormattedPrice,\n giftCards: giftCards && [...giftCards], // Note: ReadOnly Checkout State GiftCard[] is not assignable to GiftCard[] type\n onRemoveGiftCard: this.removeGiftCard,\n resources\n })\n }\n : undefined,\n addGiftCard: !isReady\n ? {\n form: getForm({\n errorMessage,\n giftCardNumber,\n giftCardPin,\n giftCardExp,\n inputRef: this.inputRef,\n inputPinRef: this.inputPinRef,\n inputExpRef: this.inputExpRef,\n resources,\n onEnterGiftCardNumber: this.enterGiftCardNumber,\n onEnterGiftCardPin: this.enterGiftCardPin,\n onEnterGiftCardExp: this.enterGiftCardExp,\n onApplyGiftCard: this.applyGiftCard,\n supportExternalGiftCard,\n additionalFields\n }),\n list: getList({\n canRemove: true,\n getFormattedPrice: this.getFormattedPrice,\n giftCards: giftCards && [...giftCards], // Note: ReadOnly Checkout State GiftCard[] is not assignable to GiftCard[] type\n onRemoveGiftCard: this.removeGiftCard,\n resources\n })\n }\n : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private init = (): void => {\n this.props.moduleState.init({\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit,\n isRequired: false,\n ...(!this.isEnabled() && { status: 'disabled' })\n });\n\n const giftCards = this.props.data.checkout.result?.giftCardExtends;\n if (giftCards && giftCards.length > 0) {\n this.props.moduleState.onReady();\n } else if (this.isPaymentVerificationRedirection) {\n this.props.moduleState.onSkip();\n }\n\n };\n\n private couldPaidByGiftCard = (): boolean => {\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n if (!cart) {\n return false;\n }\n // Use gift card when it is not free\n return (cart.TotalAmount || 0) > 0;\n };\n\n private isEnabled = (): boolean => {\n if (!this.props.context.request.user.isAuthenticated && this.props.context.app.config.giftCardSupported !== 'external') {\n return false;\n }\n return this.couldPaidByGiftCard();\n };\n\n private onEdit = (): void => {\n // Show add gift card form\n this.props.moduleState.onUpdating();\n };\n\n private onCancel = (): void => {\n this.handleCancelOrSubmit();\n };\n\n private onSubmit = (): void => {\n this.handleCancelOrSubmit();\n };\n\n private handleCancelOrSubmit = () => {\n if (this.hasSelectedItem) {\n // Show summary screen\n this.props.moduleState.onReady();\n } else {\n // Skip the module\n this.props.moduleState.onSkip();\n }\n };\n\n private getFormattedPrice = (price: number = 0, currencyCode: string = 'USD'): string => {\n return this.props.context.cultureFormatter.formatCurrency(price, currencyCode);\n };\n\n private enterGiftCardNumber = (giftCardNumber: string): void => {\n this.setState({\n giftCardNumber\n });\n this.clearError();\n };\n\n private enterGiftCardPin = (giftCardPin: string): void => {\n this.setState({\n giftCardPin\n });\n this.clearError();\n };\n\n private enterGiftCardExp = (giftCardExp: string): void => {\n this.setState({\n giftCardExp\n });\n this.clearError();\n };\n\n private setError = (errorMessage: string): void => {\n this.props.telemetry.error('Error', errorMessage);\n this.props.telemetry.debug('Error', errorMessage);\n this.props.moduleState.setHasError(true);\n this.setState({\n errorMessage\n });\n };\n\n private clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.setState({\n errorMessage: ''\n });\n };\n\n private removeGiftCard = async (giftCardNumber: string): Promise => {\n const checkoutState = this.props.data.checkout.result;\n if (!checkoutState) {\n return;\n }\n\n await checkoutState.removeGiftCard({ giftCardNumber });\n };\n\n private applyGiftCard = async (): Promise => {\n if (this.state.isFetchingGiftCard) {\n return;\n }\n this.setState({\n isFetchingGiftCard: true\n });\n\n const checkoutState = this.props.data.checkout.result;\n const giftCardNumber = this.state.giftCardNumber.trim();\n const giftCardPin = this.state.giftCardPin.trim();\n const giftCardExp = this.state.giftCardExp.trim();\n\n const giftCardTypes = await this.getGiftCardTypes(giftCardNumber);\n const giftCardType = giftCardTypes && giftCardTypes[0];\n const isPinRequired = giftCardType && giftCardType.IsPinRequired;\n const isExpRequired = giftCardType && giftCardType.IsExpirationDateRequired;\n const tenderTypeId = giftCardType && giftCardType.PaymentMethodId;\n const giftCard = await this.getGiftCard(giftCardNumber, giftCardPin, giftCardExp, isPinRequired, isExpRequired, tenderTypeId);\n\n if (checkoutState && giftCard) {\n await checkoutState.addGiftCard({ giftCard: giftCard, additionalProperties: { Pin: giftCardPin, ExpirationDate: giftCardExp, TenderTypeId: tenderTypeId } });\n this.clearError();\n this.setState({\n giftCardNumber: '',\n giftCardPin: '',\n giftCardExp: '',\n isFetchingGiftCard: false\n });\n return Promise.resolve();\n } else {\n const input =\n this.inputRef && this.inputRef.current && this.inputRef.current.focus && (this.inputRef.current as HTMLElement);\n input && input.focus();\n this.setState({\n isFetchingGiftCard: false\n });\n }\n };\n\n private findGiftcardTenderTypes = (tenderTypes: TenderType[], operationId: RetailOperation, giftcardType: string): string[] | undefined => {\n let matchedTenderTypes: TenderType[] | undefined;\n\n switch (giftcardType) {\n case SupportedGiftCardType.Internal:\n matchedTenderTypes = tenderTypes.filter(tenderType => (tenderType.OperationId === operationId && tenderType.ConnectorId === ''));\n break;\n case SupportedGiftCardType.External:\n matchedTenderTypes = tenderTypes.filter(tenderType => (tenderType.OperationId === operationId && tenderType.ConnectorId !== ''));\n break;\n default:\n throw new Error('Invalid gift card type');\n }\n\n if (matchedTenderTypes) {\n return matchedTenderTypes.map(tenderType => tenderType.TenderTypeId || '');\n }\n return;\n };\n\n private getGiftCard = async (giftCardNumber: string, giftCardPin: string, giftCardExp: string, isPinRequired: boolean | undefined, isExpRequired: boolean | undefined, tenderTypeId: string | undefined): Promise => {\n const {\n resources: { noBalanceError, invalidCardInfoError, invalidCardTypeError, noCardPinError, noCardExpError }\n } = this.props;\n\n const supportedGiftCardType = this.props.context.app.config.giftCardSupported;\n\n if (!tenderTypeId) {\n return undefined;\n }\n\n const tenderTypes = await getTenderTypesAsync({ callerContext: this.props.context.actionContext, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n if (!tenderTypes) {\n throw new Error('Fail to get gift card tender line');\n }\n const internalGiftcardTenderTypes = this.findGiftcardTenderTypes(tenderTypes, OPERATIONS.PayGiftCertificate, SupportedGiftCardType.Internal);\n const externalGiftcardTenderTypes = this.findGiftcardTenderTypes(tenderTypes, OPERATIONS.PayGiftCertificate, SupportedGiftCardType.External);\n\n switch (supportedGiftCardType) {\n case undefined:\n case SupportedGiftCardType.Internal:\n if (!internalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this.setError(invalidCardTypeError);\n return undefined;\n }\n break;\n case SupportedGiftCardType.External:\n if (!externalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this.setError(invalidCardTypeError);\n return undefined;\n }\n break;\n case SupportedGiftCardType.Both:\n if (!internalGiftcardTenderTypes?.includes(tenderTypeId) && !externalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this.setError(invalidCardTypeError);\n return undefined;\n }\n break;\n default:\n throw new Error('Unsupported gift card type');\n }\n\n if (isPinRequired && giftCardPin === '') {\n this.setError(noCardPinError);\n return undefined;\n }\n\n if (isExpRequired && giftCardExp === '') {\n this.setError(noCardExpError);\n return undefined;\n }\n\n const month = parseInt(giftCardExp.split('/')[0], 10);\n const year = parseInt(giftCardExp.split('/')[1], 10);\n\n return getGiftCardAsync({ callerContext: this.props.context.actionContext }, giftCardNumber, tenderTypeId, giftCardPin, month, year)\n .then(activeGiftCard => {\n if (!activeGiftCard.Balance || activeGiftCard.Balance === 0) {\n this.setError(noBalanceError);\n return;\n }\n return activeGiftCard;\n })\n .catch(error => {\n this.setError(invalidCardInfoError);\n return undefined;\n });\n };\n\n private getGiftCardTypes = async (giftCardNumber: string): Promise => {\n const {\n resources: { emptyInputError, duplicatedCodeError, invalidCodeError },\n data: { checkout }\n } = this.props;\n\n if (!giftCardNumber) {\n this.setError(emptyInputError);\n return undefined;\n }\n\n const isDuplicated = checkout.result && checkout.result.giftCardExtends.some((card: GiftCard) => card.Id === giftCardNumber);\n if (isDuplicated) {\n this.setError(duplicatedCodeError);\n return undefined;\n }\n\n const GIFTCARDTYPE = 7 as CardType.GiftCard; // This is a workaround. ts-jest doesn't support 'const enum'\n\n return resolveCardTypesAsync({ callerContext: this.props.context.actionContext }, giftCardNumber, GIFTCARDTYPE)\n .then(giftCardTypes => {\n if (!giftCardTypes || giftCardTypes.length === 0 || giftCardTypes[0] === undefined) {\n this.setError(invalidCodeError);\n return;\n }\n return giftCardTypes;\n })\n .catch(error => {\n this.setError(invalidCodeError);\n return undefined;\n });\n };\n}\n\nexport default withModuleState(CheckoutGiftCard);","import Checkout from './checkout';\nimport CheckoutView from './checkout.view';\n\nexport * from './checkout';\nexport * from './checkout.view';\nexport * from './actions/get-products-in-active-checkout-cart';\nexport * from './components';\nexport * from './methods';\nexport * from './checkout.data';\nexport * from './checkout.props.autogenerated';\n\nexport {\n Checkout,\n CheckoutView\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { IActionContext, IGridSettings, IImageSettings } from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration , OrderShipments, ProductDeliveryOptions, SalesLine, SalesOrder, Shipment, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getSalesLine, ISalesLine, ISalesLineResources } from './get-sales-line';\nimport { IModuleComponentProps, IPriceContext } from './utilities';\n\nexport interface IGetSalesLinesInput {\n moduleName: string;\n moduleComponentProps: IModuleComponentProps;\n isCurrentChannel: boolean;\n\n salesLines: SalesLine[];\n products: SimpleProduct[];\n shipments?: Shipment[];\n priceContext: IPriceContext;\n resources: ISalesLineResources;\n actionContext: IActionContext;\n gridSettings: IGridSettings;\n imageSettings?: IImageSettings;\n imageOnly?: boolean;\n showCompleteAddress?: boolean;\n showTimeslot: boolean;\n telemetryContent?: ITelemetryContent;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n productDeliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const getSalesLines = ({\n moduleName,\n moduleComponentProps,\n salesLines,\n products,\n shipments,\n resources,\n isCurrentChannel,\n imageOnly,\n showCompleteAddress,\n showTimeslot,\n telemetryContent,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig,\n productDeliveryOptions\n}: IGetSalesLinesInput): ISalesLine[] => {\n return salesLines.map(salesLine => {\n const product = products.find(_product => _product.RecordId === salesLine.ProductId) || ({} as SimpleProduct);\n const shipment = shipments && shipments.find(_shipment => _shipment.ShipmentLines?.find(_shipmentLine => _shipmentLine.ItemId === product.ItemId));\n return getSalesLine({\n moduleName,\n moduleComponentProps,\n product,\n shipment,\n salesLine,\n isCurrentChannel,\n resources,\n imageOnly,\n showCompleteAddress,\n showTimeslot,\n telemetryContent,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig,\n productDeliveryOptions\n });\n });\n};\n\ninterface IProps extends IModuleComponentProps {\n resources: ISalesLineResources;\n}\n\nexport const getSalesLinesInput = (\n props: IProps,\n moduleName: string,\n order: SalesOrder | OrderShipments,\n products: SimpleProduct[],\n priceContext: IPriceContext,\n showCompleteAddress?: boolean,\n showTimeslot?: boolean,\n telemetryContent?: ITelemetryContent,\n retailMultiplePickUpOptionEnabled?: boolean,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n productDeliveryOptions?: ProductDeliveryOptions[] | undefined\n): IGetSalesLinesInput | undefined => {\n if (!order || !order.SalesLines || !order.SalesLines.length) {\n return;\n }\n\n const {\n resources,\n config: { imageSettings },\n context: {\n actionContext,\n request: {\n gridSettings,\n apiSettings: { channelId }\n }\n }\n } = props;\n\n const isCurrentChannel = !order.ChannelId || order.ChannelId === channelId;\n\n return {\n moduleName,\n moduleComponentProps: props,\n isCurrentChannel,\n salesLines: order.SalesLines,\n products,\n shipments: order.Shipments,\n priceContext: priceContext,\n resources,\n actionContext: actionContext,\n gridSettings: gridSettings!,\n imageSettings: imageSettings,\n showCompleteAddress: showCompleteAddress,\n showTimeslot: showTimeslot || false,\n telemetryContent: telemetryContent,\n retailMultiplePickUpOptionEnabled: retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig,\n productDeliveryOptions: productDeliveryOptions\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore } from './checkout';\nimport { IEmailDelivery } from './components';\n\nexport const PickUpAtStoreComponent: React.FC = ({ PickUpAtStore, label, location }) => (\n \n {label}\n {location}\n \n);\n\nexport const EmailDeliveryComponent: React.FC = ({ EmailDelivery, label }) => (\n \n {label}\n \n);\n\nexport const LineItemComponent: React.FC = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\n \n {item}\n {pickUpAtStore && }\n {emailDelivery && }\n \n);\n\nexport const LineItemGroupComponent: React.FC = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\n \n {heading}\n \n {lineItems.map(lineItem => (\n \n ))}\n \n \n);\n\nexport const LineItemGroupComponentWithMultiplePickUp: React.FC = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems, lineItemWraper, lineItemWraperIcon }) => (\n \n {lineItemWraperIcon}\n {lineItemWraper}\n {heading}\n \n {lineItems.map(lineItem => (\n \n ))}\n \n \n);\n\nexport const LineItemComponentWithMultiplePickUp: React.FC = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\n \n {item}\n {emailDelivery && }\n \n);\n\nexport const PickUpAtStoreComponentWithMultiplePickUp: React.FC = ({ PickUpAtStore, label, location }) => (\n \n {label}\n {location}\n \n);\n\nexport const LineItemsComponent: React.FC = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForEmail, itemsGroupWithMulitplePickupMode }) => (\n \n \n {heading}\n {editLink}\n \n {itemsGroupWithMulitplePickupMode === undefined && itemsForPickup && }\n {itemsGroupWithMulitplePickupMode === undefined && itemsForEmail && }\n {itemsGroupWithMulitplePickupMode === undefined && itemsForShip && }\n {itemsGroupWithMulitplePickupMode !== undefined ? itemsGroupWithMulitplePickupMode.map((item, index) => {\n return ;\n }) : null\n }\n \n);\n\nconst OrderSummaryComponent: React.FC = ({ heading, lines }) => (\n
\n {heading}\n
\n {lines && (\n <>\n {lines.subtotal}\n {lines.shipping}\n {lines.otherCharge}\n {lines.tax}\n {lines.totalDiscounts}\n {lines.loyalty}\n {lines.giftCard}\n {lines.orderTotal}\n \n )}\n
\n
\n);\n\nconst CheckoutView: React.FC = props => {\n const {\n canShow,\n checkoutProps,\n headerProps,\n hasSalesOrder,\n bodyProps,\n mainProps,\n mainControlProps,\n sideProps,\n sideControlFirstProps,\n sideControlSecondProps,\n termsAndConditionsProps,\n orderConfirmation,\n loading,\n alert,\n title,\n guidedForm,\n orderSummary,\n lineItems,\n placeOrderButton,\n termsAndConditions,\n keepShoppingButton\n } = props;\n\n return (\n \n {!hasSalesOrder && {title}}\n {!hasSalesOrder &&\n \n {loading}\n {alert}\n {canShow && (\n <>\n \n {guidedForm}\n \n {termsAndConditions}\n \n \n {placeOrderButton}\n {keepShoppingButton}\n \n \n \n {orderSummary && }\n \n \n {termsAndConditions}\n \n {placeOrderButton}\n {keepShoppingButton}\n \n {lineItems && }\n \n \n {termsAndConditions}\n \n {placeOrderButton}\n {keepShoppingButton}\n \n \n \n )}\n \n }\n {hasSalesOrder && orderConfirmation}\n \n );\n};\n\nexport default CheckoutView;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/ //\nimport { IModuleStateManager, IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { getAvailabilitiesForCartLineItems, ProductAvailabilitiesForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, TelemetryConstant, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { Cart, CartLineValidationResults } from '@msdyn365-commerce/retail-proxy';\nimport { updateLineDeliverySpecificationsAsync, validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { DeliveryPreferenceType, LineDeliverySpecification } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classnames from 'classnames';\nimport isEmpty from 'lodash/isEmpty';\nimport { computed, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { ICheckoutData } from './checkout.data';\nimport { ICheckoutHeadingData, ICheckoutProps } from './checkout.props.autogenerated';\nimport AlertComponent from './components/alert';\nimport { getLineItems, ILineItems } from './components/get-line-items';\nimport { getOrderSummary, IOrderSummary } from './components/get-order-summary';\nimport GuidedFormComponent from './components/guided-form';\nimport PlaceOrderButtonComponent from './components/place-order-button';\nimport placeOrder from './methods/place-order';\n\nexport * from './components/get-line-items';\nexport * from './components/get-order-summary';\n\ntype DeviceType = 'Mobile';\n\ninterface ICheckoutState {\n errorMessage: string;\n isValidationPassed: boolean;\n}\n\nexport interface ICheckoutViewProps extends ICheckoutProps {\n className: string;\n canShow?: boolean;\n isEmptyCart?: boolean;\n isConsentGiven?: boolean;\n hasError?: boolean;\n cartStatus?: string;\n isMobile?: boolean;\n isEditorialMode?: boolean;\n backToShoppingUrl?: string;\n editCartLink?: string;\n hasSalesOrder: boolean;\n\n checkoutProps: IModuleProps;\n headerProps: INodeProps;\n bodyProps: INodeProps;\n mainProps: INodeProps;\n mainControlProps: INodeProps;\n sideProps: INodeProps;\n sideControlFirstProps: INodeProps;\n sideControlSecondProps: INodeProps;\n termsAndConditionsProps: INodeProps;\n\n guidedForm?: React.ReactNode;\n title?: React.ReactNode;\n loading?: React.ReactNode;\n alert?: React.ReactNode;\n orderSummary?: IOrderSummary;\n lineItems?: ILineItems;\n placeOrderButton?: React.ReactNode;\n termsAndConditions?: React.ReactNode;\n keepShoppingButton?: React.ReactNode;\n orderConfirmation?: React.ReactNode;\n}\n\nexport interface ICheckoutModuleProps extends ICheckoutProps, IModuleStateProps { }\n\n/**\n *\n * CheckoutContainer component\n * @extends {React.Component}\n */\n// @ts-ignore\n@withModuleState\n@observer\nclass Checkout extends React.Component {\n\n @computed get cartStatus(): Msdyn365.AsyncResultStatus {\n return this.props.data.checkout.status;\n }\n\n @computed get isEmptyCart(): boolean {\n if (this.isEditorialMode) {\n // Editorial mode: Ignore empty cart\n return false;\n }\n const cart = this.props.data.checkout.result?.checkoutCart?.cart;\n return this.cartStatus === 'SUCCESS' && !!cart && !isEmpty(cart) && (!cart.CartLines || cart.CartLines.length === 0);\n }\n\n @computed get hasError(): boolean {\n const cart = this.props.data.checkout.result?.checkoutCart?.cart;\n return this.cartStatus === 'FAILED' || (this.cartStatus === 'SUCCESS' && (!cart || isEmpty(cart)));\n }\n\n @computed get isEditorialMode(): boolean {\n return this.props.context.request.params.isEditor;\n }\n\n @computed get canPlaceOrder(): boolean {\n const isTermsAndConditionAccepted = this.props.data.checkout.result && this.props.data.checkout.result?.isTermsAndConditionAccepted;\n // if isTermsAndConditionAccepted is undefined means TermsAndCondition module is not added to page and we should able to place order.\n return this.props.moduleState.isReady && (isTermsAndConditionAccepted === undefined || isTermsAndConditionAccepted) && this.state.errorMessage === '';\n }\n\n @computed get isCartReady(): boolean {\n return !!this.props.data.checkout.result?.checkoutCart?.cart\n && this.props.data.customerInformation.status !== 'LOADING'\n && this.props.data.featureState.status !== 'LOADING';\n }\n\n public state: ICheckoutState = {\n errorMessage: '',\n isValidationPassed: false\n };\n private telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n public componentDidMount(): void {\n const {\n resources: { genericErrorMessage }\n } = this.props;\n // @ts-ignore: Compiler not reconizing condition check for function params\n when(\n () => this.hasError,\n () => {\n this.setState({\n errorMessage: genericErrorMessage\n });\n this.props.context.telemetry.error('Failed to get cart');\n }\n );\n\n // @ts-ignore: Compiler not reconizing condition check for function params\n when(\n () => {\n return this.isEmptyCart;\n },\n () => {\n this.redirectToCartPage('Cart is empty, but no editCartLink found');\n }\n );\n\n when(\n () => this.isCartReady,\n () => {\n this.validateForCheckout();\n }\n );\n\n reaction(\n () => this.props.moduleState.isReady,\n () => {\n this.onContainerReady();\n }\n );\n }\n\n // tslint:disable:max-func-body-length\n // tslint:disable-next-line:cyclomatic-complexity\n public render(): JSX.Element {\n const {\n moduleState,\n config: { className, checkoutHeading, disableGuidedCheckoutFlow },\n resources\n } = this.props;\n const { errorMessage } = this.state;\n const { backToShopping, placeOrderText, confirmPaymentText, cookieConsentRequiredMessage, genericErrorMessage } = resources;\n const checkoutClass = classnames('ms-checkout', className);\n const checkoutInformation = this.getSlotItems('checkoutInformation');\n\n const isConsentGiven =\n this.props.context.request &&\n this.props.context.request.cookies &&\n this.props.context.request.cookies.isConsentGiven &&\n this.props.context.request.cookies.isConsentGiven();\n\n const isMobile =\n this.props.context.request &&\n this.props.context.request.device &&\n (this.props.context.request.device.Type as DeviceType) === 'Mobile';\n\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const editCartLink = Msdyn365.getUrlSync('cart', this.props.context.actionContext) || '';\n\n const termsAndConditions =\n this.props.slots.termsAndConditions &&\n this.props.slots.termsAndConditions.length > 0 &&\n this.props.slots.termsAndConditions[0];\n\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\n const backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n\n const hasInvoiceLine = this.props.data.checkout && this.props.data.checkout.result?.checkoutCart.hasInvoiceLine;\n const checkoutBtnText = hasInvoiceLine ? confirmPaymentText : placeOrderText;\n\n let viewProps: ICheckoutViewProps = {\n ...this.props,\n className: checkoutClass,\n isEmptyCart: this.isEmptyCart,\n isConsentGiven,\n hasError: this.hasError,\n hasSalesOrder: this.props.data.checkout && this.props.data.checkout.result !== undefined && this.props.data.checkout.result.salesOrder !== undefined,\n cartStatus: this.cartStatus,\n isMobile,\n backToShoppingUrl,\n editCartLink,\n isEditorialMode: this.isEditorialMode,\n orderConfirmation: this.props.slots.orderConfirmation && this.props.slots.orderConfirmation.length > 0 ? this.props.slots.orderConfirmation[0] : undefined,\n checkoutProps: { moduleProps: this.props, className: checkoutClass },\n headerProps: { className: 'ms-checkout__head' },\n bodyProps: { className: 'ms-checkout__body' },\n mainProps: { className: 'ms-checkout__main' },\n mainControlProps: { className: 'ms-checkout__main-control' },\n sideProps: { className: 'ms-checkout__side' },\n sideControlFirstProps: { className: 'ms-checkout__side-control-first' },\n sideControlSecondProps: { className: 'ms-checkout__side-control-second' },\n termsAndConditionsProps: { className: 'ms-checkout__terms-and-conditions' },\n title: checkoutHeading && (\n this.renderMsdyn365Text(checkoutHeading)\n )\n };\n\n if (isConsentGiven === false) {\n viewProps = {\n ...viewProps,\n alert: \n };\n } else if (this.isLoading()) {\n viewProps = {\n ...viewProps,\n loading: \n };\n } else if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: \n };\n } else {\n viewProps = {\n ...viewProps,\n alert: errorMessage && ,\n canShow: true,\n guidedForm: checkoutInformation ? (\n \n ) : (\n undefined\n ),\n orderSummary: getOrderSummary(this.props),\n lineItems: hasInvoiceLine ? undefined : getLineItems(this.props, this.telemetryContent),\n placeOrderButton: (\n \n ),\n termsAndConditions: termsAndConditions,\n keepShoppingButton: backToShoppingUrl && (\n \n {backToShopping}\n \n )\n };\n }\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public renderMsdyn365Text(checkoutHeading: ICheckoutHeadingData): React.ReactNode {\n return (\n \n );\n }\n\n public handleCheckoutHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.checkoutHeading!.text = event.target.value;\n\n private isLoading = (): boolean => {\n return !this.cartStatus || this.cartStatus === 'LOADING' || this.isEmptyCart || !this.state.isValidationPassed;\n }\n\n private getSlotItems = (key: string): React.ReactNode[] | undefined => {\n const { slots } = this.props;\n return slots && slots[key] && slots[key].length ? slots[key] : undefined;\n };\n\n private onPlaceOrder = async (): Promise => {\n const {\n resources: { checkoutOutOfStockErrorMessage, genericErrorMessage, invalidCartVersionErrorMessage },\n context: { actionContext, app: { config: { enableStockCheck = false } } },\n slots: { orderConfirmation },\n data: { checkout }\n } = this.props;\n\n // if hasInvoiceLine is true, no inventory check\n if (!this.props.data.checkout.result?.checkoutCart.hasInvoiceLine && enableStockCheck && await this.isOverMaxQuantity((await checkout).checkoutCart.cart)) {\n this.setState({\n errorMessage: checkoutOutOfStockErrorMessage\n });\n this.props.context.telemetry.error(checkoutOutOfStockErrorMessage);\n } else {\n const hasOrderConfirmation = orderConfirmation && orderConfirmation.length > 0;\n\n const updatedCartVersion = await this.updateCartLineEmailAddress(this.props.data.checkout.result?.guestCheckoutEmail || '');\n await placeOrder(actionContext, this.props.data.checkout.result, this.props.data.products.result, !hasOrderConfirmation, updatedCartVersion).catch(error => {\n let errorMessage = genericErrorMessage;\n\n if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n errorMessage = invalidCartVersionErrorMessage;\n }\n\n this.setState({\n errorMessage: errorMessage\n });\n this.props.telemetry.exception(error);\n });\n }\n };\n\n // update receipt email address for electronic cart line\n // return the updated cart version\n private updateCartLineEmailAddress = async (newGuestCheckoutEmail: string): Promise => {\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n\n const emailDeliveryCartLines = this.props.data.checkout.result?.checkoutCart.cart.CartLines?.filter(\n cartLine => (cartLine.DeliveryMode && cartLine.DeliveryMode !== '' && cartLine.DeliveryMode === emailDeliveryModeCode)\n );\n\n let updatedCartVersion: number | undefined;\n if (emailDeliveryCartLines && emailDeliveryCartLines.length > 0) {\n const lineDeliverySpecifications: LineDeliverySpecification[] = emailDeliveryCartLines.map(line => {\n return {LineId: line.LineId,\n DeliverySpecification: {\n DeliveryModeId: emailDeliveryModeCode,\n DeliveryPreferenceTypeValue: DeliveryPreferenceType.ElectronicDelivery,\n ElectronicDeliveryEmailAddress: newGuestCheckoutEmail\n }\n };\n });\n\n await updateLineDeliverySpecificationsAsync(\n {callerContext: this.props.context.actionContext},\n (await this.props.data.checkout).checkoutCart.cart.Id,\n lineDeliverySpecifications\n ).then(updatedCart => {\n updatedCartVersion = updatedCart.Version;\n }).catch(error => {\n this.props.context.actionContext.telemetry.exception(error);\n throw new Error('[updateLineDeliverySpecificationsAsync] Unable to update electronic delivery email address in cart');\n });\n }\n\n return updatedCartVersion;\n }\n\n // return true if any product in the cart is over its max quantity\n private isOverMaxQuantity = async (cart: Cart): Promise => {\n let isOverMaxQuantity = false;\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n\n await getAvailabilitiesForCartLineItems(\n new ProductAvailabilitiesForCartLineItems(this.props.context.actionContext.requestContext.apiSettings),\n this.props.context.actionContext\n ).then(productInventoryInformation => {\n cart.CartLines?.map((cartline) => {\n // if cartline is electronic delivery, then no inventory check\n if (cartline.DeliveryMode !== emailDeliveryModeCode && productInventoryInformation && productInventoryInformation.length > 0) {\n const foundProductAvailability = productInventoryInformation.find((productInventory) => {\n return productInventory.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n\n if (!(foundProductAvailability?.IsProductAvailable && foundProductAvailability.ProductAvailableQuantity.AvailableQuantity !== undefined\n && cartline.Quantity && cartline.Quantity <= foundProductAvailability.ProductAvailableQuantity.AvailableQuantity)) {\n isOverMaxQuantity = true;\n }\n }\n });\n })\n .catch(error => {\n this.props.context.actionContext.telemetry.exception(error);\n throw new Error('[getAvailabilitiesForCartLineItems] Unable to get availabilities for products in checkout cart');\n });\n\n return isOverMaxQuantity;\n }\n\n private getActiveChildModuleStates = (): IModuleStateManager[] => {\n const { childIds, getModule } = this.props.moduleState;\n return childIds\n .map(getModule)\n .filter((state): state is IModuleStateManager => !!state && !state.isDisabled && state.hasModuleState);\n };\n\n private onContainerReady = (): void => {\n this.getActiveChildModuleStates().forEach(state => {\n state.isReady && state.onContainerReady && state.onContainerReady();\n });\n };\n\n private redirectToCartPage = (notFoundEditCartLinkMessage: string): void => {\n const editCartLink = Msdyn365.getUrlSync('cart', this.props.context.actionContext) || '';\n if (window && editCartLink) {\n window.location.assign(editCartLink);\n } else {\n this.setState({\n errorMessage: this.props.resources.genericErrorMessage\n });\n this.props.context.telemetry.error(notFoundEditCartLinkMessage);\n }\n };\n\n private validateForCheckout = (retry: boolean = true): void => {\n const notFoundEditCartLinkMessage = 'Cart doesn\\'t pass validation, but no editCartLink found';\n const cart = this.props.data.checkout.result!.checkoutCart.cart;\n const {Id, Version} = cart;\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 if (isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings) {\n if (Version && Id) {\n validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, Id, Version)\n .then((result: CartLineValidationResults) => {\n if (result.ValidationFailuresByCartLines?.length !== 0) {\n this.redirectToCartPage(notFoundEditCartLinkMessage);\n } else {\n this.setState({isValidationPassed: true});\n }\n })\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n if(retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n const cartState = this.props.data.checkout.result?.checkoutCart;\n cartState?.refreshCart({})\n .then(() => this.validateForCheckout(false))\n .catch((refreshError: Error) => {\n this.props.telemetry.warning(refreshError.message);\n this.props.telemetry.debug('Unable to refresh Cart');\n });\n } else {\n this.redirectToCartPage(notFoundEditCartLinkMessage);\n }\n });\n } else {\n this.redirectToCartPage(notFoundEditCartLinkMessage);\n }\n } else {\n this.setState({isValidationPassed: true});\n }\n }\n}\n\nexport default Checkout;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Address } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport type addressType = 'store' | 'ship';\n\nexport interface IShippingAddressProps {\n moduleName: string;\n address: Address;\n deliveryType: string;\n showCompleteAddress?: boolean;\n resource: {\n shipToLabel: string;\n storeLabel: string;\n phoneLabel: string;\n phoneAriaLabel: string;\n };\n}\n\nconst Address: React.SFC = ({\n moduleName,\n address,\n deliveryType,\n showCompleteAddress,\n resource: { shipToLabel, storeLabel, phoneLabel }\n}) => (\n
\n
{deliveryType !== 'ship' ? storeLabel : shipToLabel}
\n {address.Name && {address.Name}}\n {showCompleteAddress ?\n (<>\n {address.Street && {address.Street} }\n {address.City && {address.City}}\n {address.State && {`, ${address.State}`}}\n {address.County && {`, ${address.County}`}}\n {address.ZipCode && {` ${address.ZipCode}`}}\n {address.ThreeLetterISORegionName && {` ${address.ThreeLetterISORegionName}`}}\n {address.Phone && (\n \n {phoneLabel}\n \n )}\n ) : address.FullAddress && {address.FullAddress}}\n
\n );\n\nexport default React.memo(Address);\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { ArrayExtensions, getFallbackImageUrl, getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { CartLineItemComponent } from '@msdyn365-commerce/components';\nimport { Image } from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, ProductDeliveryOptions, SalesLine, Shipment, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\nimport Address from './address';\nimport LabelComponent from './label';\nimport { defaultImageSettings, getDateTimeslot, getSalesStatusCode, IDeliveryType, IModuleComponentProps, ISalesStatusCode } from './utilities';\n\nexport type ISalesStatusStringMap = {\n [x in ISalesStatusCode]: string | undefined;\n};\n\nexport type IDeliveryTypeStringMap = {\n [x in IDeliveryType]: string | undefined;\n};\n\nexport interface ISalesLineResources {\n productDimensionTypeSize: string;\n productDimensionTypeColor: string;\n productDimensionTypeStyle: string;\n salesLineQuantityText: string;\n configString: string;\n shipToLabel: string;\n storeLabel: string;\n phoneLabel: string;\n phoneAriaLabel: string;\n buyItAgainAriaLabel: string;\n buyItAgainLabel: string;\n orderStatusReadyForPickup: string;\n orderStatusPickedUp: string;\n orderStatusShipped: string;\n orderStatusCanceled: string;\n orderStatusProcessing: string;\n pickedUpSalesLines: string;\n deliveredSalesLines: string;\n carryOutSalesLines: string;\n trackingLabel: string;\n trackingAriaLabel: string;\n trackingComingSoonLabel: string;\n discountStringText: string;\n orderStatusEmailed: string;\n emailSalesLines: string;\n pickupDateTimeslotText: string;\n pickupTimeslotPlaceHolder: string;\n shippingCharges?: string;\n}\n\nexport interface IGetSalesLineInput {\n moduleName: string;\n moduleComponentProps: IModuleComponentProps;\n product: SimpleProduct;\n shipment?: Shipment;\n salesLine: SalesLine;\n isCurrentChannel: boolean;\n resources: ISalesLineResources;\n imageOnly?: boolean;\n showCompleteAddress?: boolean;\n showTimeslot: boolean;\n telemetryContent?: ITelemetryContent;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n productDeliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport interface ISalesLine {\n salesLineProps: INodeProps;\n salesLine: React.ReactNode;\n address?: React.ReactNode;\n buyAgainButton?: React.ReactNode;\n salesStatus: React.ReactNode;\n deliveryType: React.ReactNode;\n trackingInfo: React.ReactNode;\n pickupDateTimeslot: React.ReactNode;\n\n // row data\n data: {\n salesLine: SalesLine;\n product: SimpleProduct;\n shipment?: Shipment;\n deliveryType: string;\n productUrl: string;\n salesStatus: ISalesStatusCode;\n };\n}\n\n// tslint:disable:max-func-body-length\n// tslint:disable-next-line:cyclomatic-complexity\nexport const getSalesLine = ({\n moduleName,\n moduleComponentProps: {\n id,\n typeName,\n context,\n telemetry,\n config: { imageSettings, showShippingChargesForLineItems }\n },\n showCompleteAddress,\n product,\n shipment,\n salesLine,\n isCurrentChannel,\n imageOnly,\n showTimeslot,\n resources: {\n productDimensionTypeSize: sizeString,\n productDimensionTypeColor: colorString,\n productDimensionTypeStyle: styleString,\n salesLineQuantityText: quantityDisplayString,\n configString,\n shipToLabel,\n storeLabel,\n phoneLabel,\n phoneAriaLabel,\n buyItAgainLabel,\n buyItAgainAriaLabel,\n orderStatusReadyForPickup,\n orderStatusProcessing,\n orderStatusShipped,\n orderStatusPickedUp,\n orderStatusCanceled,\n orderStatusEmailed,\n pickedUpSalesLines,\n deliveredSalesLines,\n carryOutSalesLines,\n emailSalesLines,\n trackingLabel,\n trackingAriaLabel,\n trackingComingSoonLabel,\n discountStringText,\n pickupDateTimeslotText,\n pickupTimeslotPlaceHolder,\n shippingCharges\n },\n telemetryContent,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig,\n productDeliveryOptions\n}: IGetSalesLineInput): ISalesLine => {\n const salesStatusStringMap: ISalesStatusStringMap = {\n canceled: orderStatusCanceled,\n readyForPickup: orderStatusReadyForPickup,\n pickedUp: orderStatusPickedUp,\n processing: orderStatusProcessing,\n shipped: orderStatusShipped,\n unknown: undefined,\n emailed: orderStatusEmailed\n };\n\n const deliveryTypeStringMap: IDeliveryTypeStringMap = {\n pickUp: pickedUpSalesLines,\n ship: deliveredSalesLines,\n carryOut: carryOutSalesLines,\n email: emailSalesLines\n };\n\n const gridSettings = context.request.gridSettings;\n const pickupDeliveryModeCode = context.request.channel && context.request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = context.request.channel && context.request.channel.EmailDeliveryModeCode;\n const productUrl = getProductUrlSync(product, context.actionContext, undefined);\n const pickupMode = getPickupModeDesc(product, salesLine.DeliveryMode, productDeliveryOptions, retailMultiplePickUpOptionEnabled);\n const deliveryType =\n getPickupDeliveryMode(salesLine.DeliveryMode, pickupDeliveryModeCode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig)\n ? pickupMode\n : !!emailDeliveryModeCode && emailDeliveryModeCode !== '' && emailDeliveryModeCode === salesLine.DeliveryMode\n ? 'email'\n : !!salesLine.DeliveryMode\n ? 'ship'\n : 'carryOut';\n const salesStatus = getSalesStatusCode(deliveryType, salesLine.SalesStatusValue, pickupMode);\n const salesStatusString = salesStatusStringMap[salesStatus];\n const salesStatusComp = salesStatusString && ;\n const deliveryTypeString = getdeliveryTypeString(deliveryType, deliveryTypeStringMap, retailMultiplePickUpOptionEnabled);\n const deliveryTypeClass = getdeliveryTypeClassName(deliveryType, deliveryTypeStringMap);\n const storePickUp = retailMultiplePickUpOptionEnabled ? getStoreName(salesLine, deliveryType) : null;\n const deliveryTypeComp = retailMultiplePickUpOptionEnabled ? deliveryTypeString && \n : deliveryTypeString && ;\n const trackingInfo = isCurrentChannel && deliveryType === 'ship' && (\n \n {trackingLabel}\n {shipment ? (\n \n {shipment.TrackingNumber}\n \n ) : (\n <>{trackingComingSoonLabel}\n )}\n \n );\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.BuyItAgain);\n const buyItAgainAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n const fallbackImageUrl = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n\n const canShowTimeslot: boolean = showTimeslot\n && deliveryType === pickupMode\n && salesLine.PickupTimeslotStartDateTime !== undefined\n && salesLine.PickupTimeslotEndDateTime !== undefined;\n\n const pickupDateTimeslot = canShowTimeslot ? getDateTimeslot(pickupTimeslotPlaceHolder, salesLine.PickupTimeslotStartDateTime, salesLine.PickupTimeslotEndDateTime, context.request.locale) : '';\n const pickupDateTimeslotInfo = canShowTimeslot && (\n
\n
{pickupDateTimeslotText}
\n
{pickupDateTimeslot}
\n
\n );\n if(imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n return {\n data: {\n salesLine,\n productUrl,\n deliveryType,\n salesStatus,\n product,\n shipment\n },\n salesLineProps: { className: `${moduleName}__sales-line` },\n salesLine: imageOnly ? (\n
\n \n
\n ) : (\n \n ),\n address: salesLine.ShippingAddress && (\n \n ),\n deliveryType: deliveryTypeComp,\n salesStatus: salesStatusComp,\n trackingInfo,\n buyAgainButton: retailMultiplePickUpOptionEnabled ? isCurrentChannel && (\n \n {buyItAgainLabel}\n \n ) :\n isCurrentChannel && (\n \n {buyItAgainLabel}\n \n ),\n pickupDateTimeslot: pickupDateTimeslotInfo\n };\n};\n\nexport const getPickupDeliveryMode = (salesLineDeliveryMode?: string, pickupDeliveryModeCode?: string, retailMultiplePickupOption?: boolean,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, productDeliveryOptions?: ProductDeliveryOptions[]): boolean => {\n if (retailMultiplePickupOption) {\n return salesLineDeliveryMode === channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === salesLineDeliveryMode);\n } else {\n return !!pickupDeliveryModeCode && pickupDeliveryModeCode !== '' && pickupDeliveryModeCode === salesLineDeliveryMode;\n }\n};\n\nexport const getdeliveryTypeString = (deliveryType: string, deliveryTypeStringMap: IDeliveryTypeStringMap , retailMultiplePickupOption?: boolean): string | undefined=> {\n if(retailMultiplePickupOption) {\n switch (deliveryType) {\n case 'ship':\n case 'carryout':\n case 'email':\n return deliveryTypeStringMap[deliveryType];\n default:\n return deliveryType;\n }\n } else {\n return deliveryTypeStringMap[deliveryType];\n }\n};\n\nexport const getdeliveryTypeClassName = (deliveryType: string, deliveryTypeStringMap: IDeliveryTypeStringMap , retailMultiplePickupOption?: boolean): string | undefined=> {\n switch (deliveryType) {\n case 'ship':\n case 'carryout':\n case 'email':\n return deliveryType;\n default:\n return 'pickUp';\n }\n};\n\nexport const getPickupModeDesc = (product: SimpleProduct, salesLineDeliveryMode?: string, productDeliveryOptions?: ProductDeliveryOptions[], retailMultiplePickupOption?: boolean): string => {\n let deliveryOption: string = 'pickup';\n if (ArrayExtensions.hasElements(productDeliveryOptions) && product !== undefined) {\n let foundProductDeliveryOption;\n foundProductDeliveryOption = productDeliveryOptions?.find((deliveryO) => {\n return deliveryO && deliveryO.ProductId === product.RecordId;\n });\n const deliveryDesc = foundProductDeliveryOption?.DeliveryOptions ? foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === salesLineDeliveryMode)?.Description: deliveryOption;\n if (deliveryDesc !== undefined) {\n deliveryOption = deliveryDesc;\n }\n }\n return deliveryOption;\n};\n\nexport const getStoreName = (salesLine: SalesLine, deliveryType?: string): string | undefined => {\n switch (deliveryType) {\n case 'ship':\n case 'email':\n case 'carryout':\n return '';\n default:\n return `, ${salesLine.ShippingAddress?.Name}`;\n }\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Alert, Button, INodeProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { showAdditionalFields } from '../gift-card-balance-check.props.autogenerated';\n\nexport interface IGetFormInput {\n errorMessage: string;\n giftCardNumber: string;\n giftCardPin: string;\n giftCardExp: string;\n inputRef?: React.RefObject;\n inputPinRef?: React.RefObject;\n inputExpRef?: React.RefObject;\n supportExternalGiftCard?: boolean;\n additionalFields?: showAdditionalFields;\n resources: {\n balanceCheckButton: string;\n giftCardFormLabel: string;\n giftCardNumberLabel: string;\n giftCardPinLabel: string;\n giftCardExpLabel: string;\n giftCardAlertLabel: string;\n giftCardPinPlaceholderText: string;\n giftCardExpPlaceholderText: string;\n };\n onEnterGiftCardNumber(giftCardNumber: string): void;\n onEnterGiftCardPin(giftCardPin: string): void;\n onEnterGiftCardExp(giftCardExp: string): void;\n onApplyGiftCard(): Promise;\n}\n\nexport interface IForm {\n formProps: INodeProps;\n label: React.ReactNode;\n inputPinLabel: React.ReactNode;\n inputExpLabel: React.ReactNode;\n alert: React.ReactNode;\n inputProps: INodeProps;\n inputNumProps: INodeProps;\n inputPinProps: INodeProps;\n inputExpProps: INodeProps;\n inputNumber: React.ReactNode;\n inputPin: React.ReactNode;\n inputExp: React.ReactNode;\n applyButton: React.ReactNode;\n supportExternalGiftCard: boolean | undefined;\n showGiftCardPinInput: boolean | undefined;\n showGiftCardExpInput: boolean | undefined;\n alertFieldLabel: React.ReactNode;\n}\n\n// tslint:disable-next-line:max-func-body-length\nexport const getForm = (options: IGetFormInput): IForm => {\n const {\n errorMessage,\n inputRef,\n inputPinRef,\n inputExpRef,\n giftCardNumber,\n giftCardPin,\n giftCardExp,\n onEnterGiftCardNumber,\n onEnterGiftCardPin,\n onEnterGiftCardExp,\n onApplyGiftCard,\n supportExternalGiftCard,\n additionalFields,\n resources: { balanceCheckButton, giftCardFormLabel, giftCardNumberLabel, giftCardPinLabel, giftCardExpLabel,\n giftCardAlertLabel, giftCardPinPlaceholderText, giftCardExpPlaceholderText }\n } = options;\n\n const onApply = async (e: React.SyntheticEvent): Promise => {\n e.preventDefault();\n await onApplyGiftCard();\n };\n\n const onChangeNumber = (e: React.ChangeEvent) => {\n const value = (e.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardNumber(value);\n };\n\n const onChangePin = (e: React.ChangeEvent) => {\n const value = (e.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardPin(value);\n };\n\n const onChangeExp = (e: React.ChangeEvent) => {\n const value = (e.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardExp(value);\n };\n\n const formProps = {\n className: classnames('ms-gift-card-balance-check__form', { 'is-invalid': !!errorMessage }),\n onSubmit: onApply,\n tag: 'form' as NodeTag\n };\n\n const label = (\n \n );\n\n const inputPinLabel = (\n \n );\n\n const inputExpLabel = (\n \n );\n\n const alertFieldLabel = (\n \n );\n\n const alert = (\n \n {errorMessage}\n \n );\n\n const inputProps = {\n className: 'ms-gift-card-balance-check__input-fields'\n };\n\n const inputNumProps = {\n className: 'ms-gift-card-balance-check__input-num-fields'\n };\n\n const inputPinProps = {\n className: 'ms-gift-card-balance-check__input-pin-fields'\n };\n\n const inputExpProps = {\n className: 'ms-gift-card-balance-check__input-exp-fields'\n };\n\n const inputNumber = (\n \n );\n\n const inputPin = (\n \n );\n\n const inputExp = (\n \n );\n\n const applyButton = (\n \n {balanceCheckButton}\n \n );\n\n let showGiftCardPinInput = false;\n let showGiftCardExpInput = false;\n\n switch(additionalFields) {\n case showAdditionalFields.pin:\n showGiftCardPinInput = true;\n break;\n case showAdditionalFields.expirationDate:\n showGiftCardExpInput = true;\n break;\n case showAdditionalFields.pinAndExpirationDate:\n showGiftCardPinInput = true;\n showGiftCardExpInput = true;\n break;\n default:\n }\n\n return {\n formProps,\n label,\n inputPinLabel,\n inputExpLabel,\n alert,\n inputProps,\n inputNumProps,\n inputPinProps,\n inputExpProps,\n inputNumber,\n inputPin,\n inputExp,\n applyButton,\n supportExternalGiftCard,\n showGiftCardPinInput,\n showGiftCardExpInput,\n alertFieldLabel\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { GiftCard } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\n\nexport interface IGetItemInput {\n giftCard: GiftCard;\n resources: {\n enteredGiftCardLabel: string;\n giftCardAvailableBalanceLabel: string;\n };\n getFormattedPrice(price?: number, currencyCode?: string): string;\n}\n\nexport interface IItem {\n itemProps: INodeProps;\n id?: string;\n selectedGiftCard: React.ReactNode;\n removeButton?: React.ReactNode;\n}\n\n/**\n *\n * GiftCardItem component\n * @extends {React.PureComponent}\n */\nexport const getItem = ({\n giftCard,\n getFormattedPrice,\n resources: { enteredGiftCardLabel, giftCardAvailableBalanceLabel }\n}: IGetItemInput): IItem => {\n const balance = getFormattedPrice(giftCard.Balance, giftCard.CardCurrencyCode);\n const giftCardLast4Digit = (giftCard.Id || '').substr(-4);\n\n const itemProps = {\n className: 'ms-gift-card-balance-check__item'\n };\n\n const selectedGiftCard = (\n \n {enteredGiftCardLabel} {giftCardLast4Digit} ({giftCardAvailableBalanceLabel}{' '}\n {balance})\n \n );\n\n return {\n itemProps,\n id: giftCard && giftCard.Id,\n selectedGiftCard\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport { getGiftCardAsync, getTenderTypesAsync, resolveCardTypesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport {\n CardType, CardTypeInfo, GiftCard, RetailOperation, TenderType\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classname from 'classnames';\nimport { OPERATIONS } from '../checkout';\nimport { getForm, IForm } from './components/get-form';\nimport { getItem, IItem } from './components/get-item';\nimport { IGiftCardBalanceCheckProps } from './gift-card-balance-check.props.autogenerated';\n\ninterface IGiftCardBalanceCheckState {\n isFetchingGiftCard: boolean;\n errorMessage: string;\n giftCardNumber: string;\n giftCardPin: string;\n giftCardExp: string;\n giftCard?: GiftCard;\n}\n\nconst enum SupportedGiftCardType {\n Internal = 'internal',\n External = 'external',\n Both = 'both'\n}\n\nexport interface IGiftCardBalanceCheckModuleProps extends IGiftCardBalanceCheckProps<{}> { }\n\nexport interface IGiftCardBalanceCheckViewProps extends IGiftCardBalanceCheckProps<{}>, IGiftCardBalanceCheckState {\n className?: string;\n\n form: IForm;\n item?: IItem;\n\n giftCardBalanceCheckProps: IModuleProps;\n\n enterGiftCardNumber?(giftCardNumber: string): void;\n enterGiftCardPin?(giftCardPin: string): void;\n enterGiftCardExp?(giftCardExp: string): void;\n applyGiftCard?(): void;\n}\n\n/**\n *\n * GiftCardBalanceCheck component\n * @extends {React.Component}\n */\nexport class GiftCardBalanceCheck extends React.Component {\n public state: IGiftCardBalanceCheckState = {\n isFetchingGiftCard: false,\n errorMessage: '',\n giftCardNumber: '',\n giftCardPin: '',\n giftCardExp: ''\n };\n\n private inputRef: React.RefObject = React.createRef();\n\n private inputPinRef: React.RefObject = React.createRef();\n\n private inputExpRef: React.RefObject = React.createRef();\n\n public render(): JSX.Element | null {\n const {\n config: { className, showAdditionalFields },\n resources\n } = this.props;\n const { errorMessage, giftCardNumber, giftCardPin, giftCardExp } = this.state;\n\n const supportedGiftCardType = this.props.context.app.config.giftCardSupported;\n\n if (!this._isEnabled()) {\n this.props.context.telemetry.error('Gift card balance check is not supported, module wont render');\n return null;\n }\n\n const supportExternalGiftCard = supportedGiftCardType === SupportedGiftCardType.Internal ? false : true;\n\n const moduleClassName = classname('ms-gift-card-balance-check', className);\n\n const viewProps: IGiftCardBalanceCheckViewProps = {\n ...this.props,\n ...this.state,\n className: moduleClassName,\n giftCardBalanceCheckProps: { moduleProps: this.props, className: moduleClassName },\n\n enterGiftCardNumber: this._enterGiftCardNumber,\n enterGiftCardPin: this._enterGiftCardPin,\n enterGiftCardExp: this._enterGiftCardExp,\n applyGiftCard: this._applyGiftCard,\n\n form: getForm({\n errorMessage,\n giftCardNumber,\n giftCardPin,\n giftCardExp,\n inputRef: this.inputRef,\n inputPinRef: this.inputPinRef,\n inputExpRef: this.inputExpRef,\n resources,\n supportExternalGiftCard,\n additionalFields: showAdditionalFields,\n onEnterGiftCardNumber: this._enterGiftCardNumber,\n onEnterGiftCardPin: this._enterGiftCardPin,\n onEnterGiftCardExp: this._enterGiftCardExp,\n onApplyGiftCard: this._applyGiftCard\n }),\n item: this.state.giftCard && getItem({\n giftCard: this.state.giftCard,\n getFormattedPrice: this._getFormattedPrice,\n resources\n })\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _isEnabled = (): boolean => {\n if (!this.props.context.request.user.isAuthenticated && this.props.context.app.config.giftCardSupported !== SupportedGiftCardType.External) {\n return false;\n }\n return true;\n };\n\n private _getFormattedPrice = (price: number = 0, currencyCode: string = 'USD'): string => {\n return this.props.context.cultureFormatter.formatCurrency(price, currencyCode);\n };\n\n private _enterGiftCardNumber = (giftCardNumber: string): void => {\n this.setState({\n giftCardNumber\n });\n this._clearError();\n }\n\n private _enterGiftCardPin = (giftCardPin: string): void => {\n this.setState({\n giftCardPin\n });\n this._clearError();\n };\n\n private _enterGiftCardExp = (giftCardExp: string): void => {\n this.setState({\n giftCardExp\n });\n this._clearError();\n };\n\n private _clearError = (): void => {\n this.setState({\n errorMessage: ''\n });\n };\n\n private _setError = (errorMessage: string): void => {\n this.props.telemetry.error('Error', errorMessage);\n this.props.telemetry.debug('Error', errorMessage);\n this.setState({\n errorMessage\n });\n };\n\n private _applyGiftCard = async (): Promise => {\n if (this.state.isFetchingGiftCard) {\n return;\n }\n this.setState({\n isFetchingGiftCard: true\n });\n\n const giftCardNumber = this.state.giftCardNumber.trim();\n const giftCardPin = this.state.giftCardPin.trim();\n const giftCardExp = this.state.giftCardExp.trim();\n\n const giftCardTypes = await this._getGiftCardTypes(giftCardNumber);\n const giftCardType = giftCardTypes && giftCardTypes[0];\n const isPinRequired = giftCardType && giftCardType.IsPinRequired;\n const isExpRequired = giftCardType && giftCardType.IsExpirationDateRequired;\n const tenderTypeId = giftCardType && giftCardType.PaymentMethodId;\n const giftCard = await this._getGiftCard(giftCardNumber, giftCardPin, giftCardExp, isPinRequired, isExpRequired, tenderTypeId);\n\n if (giftCard) {\n this._clearError();\n this.setState({\n giftCardNumber: '',\n giftCardPin: '',\n giftCardExp: '',\n isFetchingGiftCard: false,\n giftCard: giftCard\n });\n return Promise.resolve();\n } else {\n const input =\n this.inputRef && this.inputRef.current && this.inputRef.current.focus && (this.inputRef.current as HTMLElement);\n input && input.focus();\n this.setState({\n isFetchingGiftCard: false,\n giftCard: undefined\n });\n }\n };\n\n private _findGiftcardTenderTypes = (tenderTypes: TenderType[], operationId: RetailOperation, giftcardType: string): string[] | undefined => {\n let matchedTenderTypes: TenderType[] | undefined;\n\n switch (giftcardType) {\n case SupportedGiftCardType.Internal:\n matchedTenderTypes = tenderTypes.filter(tenderType => (tenderType.OperationId === operationId && tenderType.ConnectorId === ''));\n break;\n case SupportedGiftCardType.External:\n matchedTenderTypes = tenderTypes.filter(tenderType => (tenderType.OperationId === operationId && tenderType.ConnectorId !== ''));\n break;\n default:\n throw new Error('Invalid gift card type');\n }\n\n if (matchedTenderTypes) {\n return matchedTenderTypes.map(tenderType => tenderType.TenderTypeId || '');\n }\n return;\n };\n\n private _getGiftCard = async (giftCardNumber: string, giftCardPin: string, giftCardExp: string, isPinRequired: boolean | undefined, isExpRequired: boolean | undefined, tenderTypeId: string | undefined): Promise => {\n const {\n resources: { invalidCardTypeError, noBalanceError, invalidCardInfoError, noCardPinError, noCardExpError }\n } = this.props;\n\n const supportedGiftCardType = this.props.context.app.config.giftCardSupported;\n\n if (!tenderTypeId) {\n return undefined;\n }\n\n const tenderTypes = await getTenderTypesAsync({ callerContext: this.props.context.actionContext, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n if (!tenderTypes) {\n throw new Error('Fail to get gift card tender line');\n }\n\n const internalGiftcardTenderTypes = this._findGiftcardTenderTypes(tenderTypes, OPERATIONS.PayGiftCertificate, SupportedGiftCardType.Internal);\n const externalGiftcardTenderTypes = this._findGiftcardTenderTypes(tenderTypes, OPERATIONS.PayGiftCertificate, SupportedGiftCardType.External);\n\n switch (supportedGiftCardType) {\n case undefined:\n case SupportedGiftCardType.Internal:\n if (!internalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this._setError(invalidCardTypeError);\n return undefined;\n }\n break;\n case SupportedGiftCardType.External:\n if (!externalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this._setError(invalidCardTypeError);\n return undefined;\n }\n break;\n case SupportedGiftCardType.Both:\n if (!internalGiftcardTenderTypes?.includes(tenderTypeId) && !externalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this._setError(invalidCardTypeError);\n return undefined;\n }\n break;\n default:\n throw new Error('Unsupported gift card type');\n }\n\n if (!this.props.context.request.user.isAuthenticated && internalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this._setError(invalidCardTypeError);\n return undefined;\n }\n\n if (isPinRequired && giftCardPin === '') {\n this._setError(noCardPinError);\n return undefined;\n }\n\n if (isExpRequired && giftCardExp === '') {\n this._setError(noCardExpError);\n return undefined;\n }\n\n const month = parseInt(giftCardExp.split('/')[0], 10);\n const year = parseInt(giftCardExp.split('/')[1], 10);\n\n return getGiftCardAsync({ callerContext: this.props.context.actionContext }, giftCardNumber, tenderTypeId, giftCardPin, month, year)\n .then(activeGiftCard => {\n if (!activeGiftCard.Balance || activeGiftCard.Balance === 0) {\n this._setError(noBalanceError);\n return;\n }\n return activeGiftCard;\n })\n .catch(error => {\n this._setError(invalidCardInfoError);\n return undefined;\n });\n };\n\n private _getGiftCardTypes = async (giftCardNumber: string): Promise => {\n const {\n resources: { emptyInputError, invalidCodeError },\n } = this.props;\n\n if (!giftCardNumber) {\n this._setError(emptyInputError);\n return undefined;\n }\n\n const GIFTCARDTYPE = 7 as CardType.GiftCard; // This is a workaround. ts-jest doesn't support 'const enum'\n return resolveCardTypesAsync({ callerContext: this.props.context.actionContext }, giftCardNumber, GIFTCARDTYPE)\n .then(giftCardTypes => {\n if (!giftCardTypes || giftCardTypes.length === 0 || giftCardTypes[0] === undefined) {\n this._setError(invalidCodeError);\n return;\n }\n return giftCardTypes;\n })\n .catch(error => {\n this._setError(invalidCodeError);\n return undefined;\n });\n };\n}\n\nexport default GiftCardBalanceCheck;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\ninterface ILabelProps {\n className: string;\n label: string;\n}\n\nconst Label: React.FC = ({ className, label }) => {label};\n\nexport default Label;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { PriceComponent } from '@msdyn365-commerce/components';\n\nimport * as React from 'react';\nimport { IGetOrderSummaryInput, IOrderSummary, IPriceContext } from '../../../common/';\n\ninterface ISummaryLineProps {\n priceContext?: IPriceContext;\n name: string;\n label: string;\n value?: number;\n}\n\nconst OrderSummaryLine: React.SFC = ({ name, label, value = 0, priceContext }) => (\n

\n {label}\n {priceContext ? (\n \n ) : (\n {value}\n )}\n

\n);\n\nexport const getOrderConfirmationOrderSummary = ({\n order,\n priceContext,\n earnedPoints,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n orderSummaryGrandTotalLabel,\n pointsEarnedLabel\n },\n canShip\n}: IGetOrderSummaryInput): IOrderSummary => {\n return {\n orderSummaryProps: { className: 'ms-order-confirmation__order-summary' },\n heading:

{orderSummaryHeading}

,\n subtotal: (\n \n ),\n shipping: canShip ? (\n \n ): '',\n tax: ,\n totalAmount: (\n \n ),\n earnedPoints: earnedPoints ? : undefined\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\ninterface IAlertProps {\n message: string;\n}\n\nconst CheckoutAlert: React.FC = ({ message }) => (\n

\n {message}\n

\n);\n\nexport default CheckoutAlert;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/ //\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { TelemetryEvent } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\ninterface ICheckoutPlaceOrderButtonProps {\n canPlaceOrder: boolean;\n checkoutBtnText: string;\n telemetryContent?: ITelemetryContent;\n placeOrder(): Promise;\n}\n\nconst CheckoutPlaceOrderButton: React.FC = ({ checkoutBtnText, canPlaceOrder, placeOrder, telemetryContent }) => {\n const [isBusy, setIsBusy] = useState(false);\n const payload = getPayloadObject(TelemetryEvent.Purchase, telemetryContent!, checkoutBtnText, '');\n const attributes = getTelemetryAttributes(telemetryContent!, payload);\n const onPlaceOrder = async () => {\n if (isBusy || !canPlaceOrder) {\n return;\n }\n setIsBusy(true);\n await placeOrder();\n setIsBusy(false);\n };\n return (\n \n {checkoutBtnText}\n \n );\n};\n\nexport default CheckoutPlaceOrderButton;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport get from 'lodash/get';\nimport * as React from 'react';\nimport { ICheckoutData } from '../checkout.data';\nimport { ICheckoutProps } from '../checkout.props.autogenerated';\n\nexport interface IOrderSummary {\n orderSummaryProps: INodeProps;\n heading?: React.ReactNode;\n lines?: IOrderSummaryLines;\n}\nexport const getOrderSummary = (input: ICheckoutProps): IOrderSummary => {\n const {\n config: { orderSummaryHeading },\n data: { checkout },\n resources: {\n subTotalLabel,\n shippingLabel,\n taxLabel,\n orderTotalLabel,\n loyaltyLabel,\n giftcardLabel,\n totalDiscountsLabel,\n freeText,\n toBeCalculatedText,\n otherCharges\n },\n context,\n typeName,\n id,\n telemetry\n } = input;\n\n const checkoutState = get(checkout, 'result');\n const cart = get(checkout, 'result.checkoutCart.cart');\n const showLineItems = cart.CartLines && cart.CartLines.length > 0;\n const channelConfiguration = context.request.channel!;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = input.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n const handleOrderSummaryHeadingChange = (event: Msdyn365.ContentEditableEvent) => {\n const {\n // tslint:disable-next-line: no-shadowed-variable\n config: { orderSummaryHeading }\n } = input;\n orderSummaryHeading!.text = event.target.value;\n };\n\n return {\n orderSummaryProps: { className: 'ms-checkout-guest-profile__selected-item' },\n heading: orderSummaryHeading && orderSummaryHeading.text && (\n \n ),\n lines: showLineItems\n ? OrderSummary({\n checkoutState,\n cart,\n subTotalLabel,\n shippingLabel,\n taxLabel,\n orderTotalLabel,\n loyaltyLabel,\n giftcardLabel,\n totalDiscountsLabel,\n freeText,\n toBeCalculatedText,\n context,\n typeName,\n id,\n channelConfiguration,\n telemetry,\n otherChargeLabel: otherCharges,\n retailMultiplePickUpOptionEnabled: retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result\n })\n : undefined\n };\n\n};\n","export * from './checkout';\nexport * from './empty-active-cart';\nexport * from './place-order';","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyInput {\n className: string;\n type: string;\n value: string | number;\n min: number;\n max: number;\n ariaValueMax: number;\n ariaValueMin: number;\n ariaValueNow: number;\n id: string;\n step: string;\n onChange(event: React.ChangeEvent): void;\n onBlur(event: React.FocusEvent): void;\n}\n\nconst AdressInput: React.FC = ({\n className,\n type,\n value,\n min,\n max,\n step,\n ariaValueMax,\n ariaValueMin,\n ariaValueNow,\n onChange,\n onBlur,\n id\n}) => (\n // tslint:disable-next-line:react-a11y-role-supports-aria-props\n \n );\n\nexport default AdressInput;\n","\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyLabelProps {\n className: string;\n text: string;\n htmlFor: string;\n}\n\n/**\n *\n * AddPaymentForm SFC\n * @extends {React.FC}\n */\nconst CheckoutLoyaltyLabel: React.FC = ({\n className,\n text,\n htmlFor\n}) => {\n\n return ;\n};\n\nexport default CheckoutLoyaltyLabel;","\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyTextProps {\n className: string;\n text?: string;\n}\n\n/**\n *\n * AddPaymentForm SFC\n * @extends {React.FC}\n */\nconst CheckoutLoyaltyText: React.FC = ({\n className,\n text,\n}) => {\n if(!text) {\n return null;\n }\n\n return {text};\n};\n\nexport default CheckoutLoyaltyText;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport classnames from 'classnames';\nimport { computed, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { GetLoyaltyTransactionEstimationInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Drawer, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { callActionOrExecute } from '@msdyn365-commerce/retail-proxy';\nimport { createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { LoyaltyPointRedemptionEstimate, LoyaltyRewardPoint } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICheckoutLoyaltyData } from './checkout-loyalty.data';\nimport { ICheckoutLoyaltyProps } from './checkout-loyalty.props.autogenerated';\nimport InputComponent from './components/checkout-loyalty-input';\nimport LabelComponent from './components/checkout-loyalty-label';\nimport TextComponent from './components/checkout-loyalty-text';\n\nexport interface ICheckoutLoyaltyState {\n dollarsApplied: number;\n isFetchingLoyaltyCard: boolean;\n}\n\nexport interface ICheckoutLoyaltyModuleProps extends ICheckoutLoyaltyProps, IModuleStateProps {}\n\nexport interface ICheckoutLoyaltyViewState {\n isShowLoyalty: boolean;\n isShowAddLoyalty: boolean;\n}\n\nexport interface ICheckoutLoyaltyShow {\n heading: React.ReactNode;\n coveredAmountText: React.ReactNode;\n amount: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyRewardPoint {\n checkoutLoyaltyRewardPoint: INodeProps;\n key: string;\n title: React.ReactNode;\n availablePointsText: React.ReactNode;\n activePoints: React.ReactNode;\n expiringPointsText: React.ReactNode;\n expiringPoints: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyAdd {\n heading: React.ReactNode;\n cardNumber: React.ReactNode;\n drawer: INodeProps;\n rewardPoints: ICheckoutLoyaltyRewardPoint[];\n loyaltyAmountContainer: INodeProps;\n appliedLoyaltyAmountContainer: INodeProps;\n loyaltyAmountLabel: React.ReactNode;\n loyaltyAmountInput: React.ReactNode;\n loyaltyAmountApplyButton: React.ReactNode;\n showAppliedAmount: boolean;\n loyaltyAmountAppliedText: React.ReactNode;\n loyaltyAmountAppliedPrice: React.ReactNode;\n loyaltyAmountRemoveButton: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyViewProps extends ICheckoutLoyaltyModuleProps {\n checkoutLoyalty: IModuleProps;\n viewState: ICheckoutLoyaltyViewState;\n showLoyalty: ICheckoutLoyaltyShow;\n addLoyalty: ICheckoutLoyaltyAdd;\n}\n\n/**\n *\n * CheckoutLoyalty component\n * @extends {React.Component>}\n */\n// @ts-ignore\n@withModuleState\n@observer\nclass CheckoutLoyalty extends React.Component {\n private _dialogToggleRef: React.RefObject | undefined;\n private moduleClassName: string = 'ms-checkout-loyalty';\n\n constructor(props: ICheckoutLoyaltyModuleProps) {\n super(props);\n this._dialogToggleRef = React.createRef();\n this._applyLoyaltyPoints = this._applyLoyaltyPoints.bind(this);\n this._removeLoyaltyPoints = this._removeLoyaltyPoints.bind(this);\n this._onInputChange = this._onInputChange.bind(this);\n this._onBlur = this._onBlur.bind(this);\n this.state = { dollarsApplied: this.maxDollars, isFetchingLoyaltyCard: false };\n }\n\n @computed get shouldPayLoyalty(): boolean {\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n if (!cart) {\n return false;\n }\n // Use loyalty when cart is not full of free items\n const amountDue = cart.TotalAmount || 0;\n return amountDue > 0;\n }\n\n @computed get isDataReady(): boolean {\n return (\n (this.props.data.checkout.result && this.props.data.checkout.status) === 'SUCCESS' &&\n (this.props.data.loyaltyCard && this.props.data.loyaltyCard.status) !== 'LOADING' &&\n (this.props.data.loyaltyTransactionEstimation && this.props.data.loyaltyTransactionEstimation.status) !== 'LOADING'\n );\n }\n\n @computed get maxDollars(): number {\n return this.props.data.loyaltyTransactionEstimation.result &&\n this.props.data.loyaltyTransactionEstimation.result.MaxCurrencyValueOfLoyaltyPoints\n ? this.props.data.loyaltyTransactionEstimation.result.MaxCurrencyValueOfLoyaltyPoints\n : 0;\n }\n\n @computed get isPaymentVerificationRedirection(): boolean {\n const { requestFormData, query } = this.props.context.request;\n return requestFormData && query && query.pv === '1' ? true : false;\n }\n\n public async componentDidMount(): Promise {\n when(\n () => this.isDataReady,\n async () => {\n await this.init();\n }\n );\n\n reaction(\n () => this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart,\n async () => {\n this._updateEstimate();\n }\n );\n\n reaction(\n () => this.props.data.loyaltyCard.result,\n async () => {\n this._updateLoyalty();\n }\n );\n }\n\n // tslint:disable-next-line:max-func-body-length\n public render(): JSX.Element | null {\n const {\n resources,\n renderView,\n moduleState: { isReady }\n } = this.props;\n\n if (\n this.props.data.loyaltyCard &&\n this.props.data.loyaltyCard.result &&\n this.props.data.loyaltyCard.result.CardNumber &&\n this.shouldPayLoyalty\n ) {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n const checkoutState = this.props.data.checkout.result;\n let isShowLoyalty = false;\n\n if (isReady) {\n if (!checkoutState || checkoutState.loyaltyAmount === 0) {\n return null;\n } else {\n isShowLoyalty = true;\n }\n }\n\n const viewProps = {\n ...this.props,\n viewState: {\n isShowLoyalty: isShowLoyalty,\n isShowAddLoyalty: !isReady\n },\n checkoutLoyalty: {\n moduleProps: this.props,\n className: classnames(\n this.moduleClassName,\n { [`${this.moduleClassName}__applied`]: isShowLoyalty },\n this.props.config.className\n )\n },\n showLoyalty: {\n heading: ,\n coveredAmountText: (\n \n ),\n amount: (\n \n )\n },\n addLoyalty: {\n heading: ,\n drawer: {\n tag: Drawer,\n className: `${this.moduleClassName}__drawer`,\n toggleButtonText: this._drawerHeader(),\n openGlyph: `${this.moduleClassName}__drawer-open`,\n closeGlyph: `${this.moduleClassName}__drawer-close`,\n glyphPlacement: 'end'\n },\n cardNumber: ,\n rewardPoints:\n loyaltyCard.RewardPoints &&\n loyaltyCard.RewardPoints.map((points, index) => {\n return this._renderPointSection(points, resources.availablePointsLabel, resources.expiringLoyaltyPointsLabel);\n }),\n loyaltyAmountContainer: {\n className: `${this.moduleClassName}__amount`\n },\n appliedLoyaltyAmountContainer: {\n className: `${this.moduleClassName}__applied-amount`\n },\n loyaltyAmountLabel: (\n \n ),\n loyaltyAmountInput: (\n \n ),\n loyaltyAmountApplyButton: (\n this.maxDollars ||\n this.state.dollarsApplied <= 0 ||\n this.state.isFetchingLoyaltyCard\n }\n >\n {this.props.resources.applyCheckoutLoyaltyPaymentText}\n \n ),\n showAppliedAmount: checkoutState && checkoutState.loyaltyAmount > 0,\n loyaltyAmountAppliedText: (\n \n ),\n loyaltyAmountAppliedPrice: (\n \n ),\n loyaltyAmountRemoveButton: (\n \n {this.props.resources.removeCheckoutLoyaltyPaymentText}\n \n )\n }\n };\n\n return renderView(viewProps) as React.ReactElement;\n }\n this.props.context.telemetry.error('Checkout loyalty content is empty, module wont render');\n return null;\n }\n\n private _drawerHeader(): JSX.Element {\n return (\n \n

{this.props.resources.loyaltyCoveredAmountText}

\n \n
\n );\n }\n\n private _renderPointSection(\n point: LoyaltyRewardPoint,\n loyaltyCoveredAmountText: string,\n expiringLoyaltyPointsLabel: string\n ): ICheckoutLoyaltyRewardPoint {\n return {\n key: point.RewardPointId || '',\n checkoutLoyaltyRewardPoint: {\n className: `${this.moduleClassName}__program`\n },\n title: ,\n availablePointsText: ,\n activePoints: (\n \n ),\n expiringPointsText: ,\n expiringPoints: (\n \n )\n };\n }\n\n private init = async (): Promise => {\n this.props.moduleState.init({\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit,\n isRequired: false,\n ...(!this.isEnabled() && { status: 'disabled' })\n });\n\n const savedLoyaltyAmount = this.props.data.checkout.result?.loyaltyAmount;\n if (savedLoyaltyAmount) {\n this.props.moduleState.onReady();\n } else if (this.isPaymentVerificationRedirection) {\n this.props.moduleState.onSkip();\n } else if (\n this.props.data.loyaltyCard.result &&\n this.props.data.checkout.result &&\n this.props.data.loyaltyCard.result.CardNumber !== this.props.data.checkout.result.checkoutCart.cart.LoyaltyCardId\n ) {\n this.props.data.checkout.result.checkoutCart\n .updateLoyaltyCardId({ loyaltyCardNumber: this.props.data.loyaltyCard.result.CardNumber })\n .catch(error => {\n if (this.context.telemetry) {\n this.context.telemetry.warning(error);\n this.context.telemetry.debug('Unable to update the loyalty card');\n }\n });\n }\n };\n\n private onEdit = () => {\n this.props.moduleState.onUpdating();\n };\n\n private onCancel = () => {\n this.handleCancelOrSubmit();\n };\n\n private onSubmit = () => {\n this.handleCancelOrSubmit();\n };\n\n private handleCancelOrSubmit = () => {\n const checkoutState = this.props.data.checkout.result;\n if (checkoutState && checkoutState.loyaltyAmount > 0) {\n // Show summary screen\n this.props.moduleState.onReady();\n } else {\n // Skip the module\n this.props.moduleState.onSkip();\n }\n };\n\n private isEnabled = () => {\n return (\n this.props.context.request.user.isAuthenticated &&\n this.props.data.loyaltyCard.result &&\n this.props.data.loyaltyCard.result.CardNumber &&\n this.shouldPayLoyalty\n );\n };\n\n private async _applyLoyaltyPoints(): Promise {\n const checkoutState = this.props.data.checkout.result;\n\n if (!checkoutState) {\n return;\n }\n\n await checkoutState.updateLoyaltyAmount({ newAmount: parseFloat(this.state.dollarsApplied.toString()) });\n this.setState({\n isFetchingLoyaltyCard: true\n });\n }\n\n private async _removeLoyaltyPoints(): Promise {\n const checkoutState = this.props.data.checkout.result;\n\n if (!checkoutState) {\n return;\n }\n\n await checkoutState.updateLoyaltyAmount({ newAmount: 0 });\n this.setState({\n dollarsApplied: 0\n });\n }\n\n private _onInputChange(event: React.ChangeEvent): void {\n const value = event.currentTarget.value;\n this.setState({ dollarsApplied: value.length ? Number(value) : parseFloat(value), isFetchingLoyaltyCard: false });\n }\n\n private _onBlur(event: React.FocusEvent): void {\n const num = parseFloat(event.currentTarget.value).toFixed(2);\n const element = document.getElementById(`${this.props.id}-label`) as HTMLInputElement;\n if (element && num) {\n element.value = num;\n this.setState({ dollarsApplied: parseFloat(num) });\n }\n }\n\n private _updateLoyalty(): void {\n if (this.props.moduleState.isDisabled && this.isEnabled()) {\n this._updateEstimate();\n this.props.moduleState.onUpdating();\n }\n }\n\n private _updateEstimate(): void {\n const card = this.props.data.loyaltyCard.result;\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n const channelConfig = this.props.context.request.channel;\n if (card && card.CardNumber && cart && channelConfig) {\n const currencyCode = channelConfig.Currency || '';\n const loyalPointsRequest = createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput(cart.Id, card.CardNumber, currencyCode);\n\n // @ts-ignore\n // Due to bug 23214358, this is getting improperly cached. Need to turn on cache bypass for now to work around issue\n loyalPointsRequest._query.options.bypassCache = 'get';\n\n callActionOrExecute(loyalPointsRequest, this.props.context.actionContext)\n .then(async points => {\n this.props.context.actionContext.update(\n new GetLoyaltyTransactionEstimationInput(this.props.context.request.apiSettings),\n points\n );\n const newMaxPoints = (points && points.MaxCurrencyValueOfLoyaltyPoints) || 0;\n\n // If points are already applied, ensure you don't apply more points than max\n if (this.props.data.checkout.result && this.props.data.checkout.result.loyaltyAmount > newMaxPoints) {\n await this.props.data.checkout.result.updateLoyaltyAmount({ newAmount: newMaxPoints });\n }\n\n // If input amount is already equal to max, keep it at new max. Also if input amount would be more than new max, set it to new max\n if (this.state.dollarsApplied > newMaxPoints) {\n this.setState({ dollarsApplied: newMaxPoints });\n }\n })\n .catch(error => {\n this.props.context.actionContext.telemetry.exception(error);\n this.props.context.actionContext.telemetry.debug('Error getting Loyalty Point Redemption Estimate');\n });\n }\n }\n}\n\nexport default CheckoutLoyalty;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport { IAny, ICoreContext, IGeneric, IImageSettings, IModule, ITelemetry } from '@msdyn365-commerce/core';\nimport { SalesLine, TenderType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport groupBy from 'lodash/groupBy';\nimport { ISalesLine } from './get-sales-line';\n\nexport interface IModuleComponentProps extends IModule {\n config: {\n imageSettings?: IImageSettings;\n showShippingChargesForLineItems?: boolean;\n };\n}\n\nexport interface IPriceContext {\n id: string;\n typeName: string;\n context: ICoreContext>;\n telemetry: ITelemetry;\n freePriceText: string;\n}\n\nexport const getTenderIdOperationIdMap = (tenderTypes: TenderType[]): object => {\n return tenderTypes.reduce((map, tenderType) => {\n if (tenderType.TenderTypeId) {\n map[tenderType.TenderTypeId] = tenderType.OperationId;\n }\n return map;\n }, {});\n};\n\nexport const countItems = (salesLines: SalesLine[]) => {\n return salesLines.reduce((count, salesLine) => {\n return count + (salesLine.Quantity || 0);\n }, 0);\n};\n\nexport const getSalesLinesByDelivery = (salesLines?: SalesLine[], pickupDeliveryModeCode?: string): SalesLine[] => {\n if (!salesLines || !salesLines.length) {\n return [];\n }\n return salesLines.filter(salesLine =>\n // isPickUp ? getPickUp : getOthers\n (pickupDeliveryModeCode && pickupDeliveryModeCode !== '') ? salesLine.DeliveryMode === pickupDeliveryModeCode : salesLine.DeliveryMode !== pickupDeliveryModeCode\n );\n};\n\nexport const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=80&h=80&m=6`, w: 0, h: 0 },\n lg: { q: `w=147&h=147&m=6`, w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\nexport type IDeliveryType = 'pickUp' | 'ship' | 'carryOut' | 'email';\n\nexport type ISalesStatusCode = 'canceled' | 'readyForPickup' | 'pickedUp' | 'processing' | 'shipped' | 'unknown' | 'emailed';\n\nexport const getSalesStatusCode = (deliveryType: string, statusValue?: number, pickupMode?: string): ISalesStatusCode => {\n if (statusValue === 7) {\n return 'canceled';\n }\n\n if (pickupMode !== undefined) {\n switch (statusValue) {\n case 3:\n return 'readyForPickup';\n case 4:\n return 'pickedUp';\n default:\n return 'processing';\n }\n }\n if (deliveryType === 'pickUp') {\n switch (statusValue) {\n case 3:\n return 'readyForPickup';\n case 4:\n return 'pickedUp';\n default:\n return 'processing';\n }\n } else if (deliveryType === 'ship') {\n switch (statusValue) {\n case 3:\n return 'processing';\n case 4:\n return 'shipped';\n default:\n return 'processing';\n }\n } else if (deliveryType === 'email') {\n switch (statusValue) {\n case 3:\n return 'processing';\n case 4:\n return 'emailed';\n default:\n return 'processing';\n }\n } else if (deliveryType === 'carryOut') {\n return 'processing';\n } else {\n return 'unknown';\n }\n};\n\nexport type ITrackingId = string | 'unknown';\nexport type IAddressId = string | 'unknown';\n\nexport interface IGroupData {\n deliveryType: IDeliveryType;\n salesStatus: ISalesStatusCode;\n addressId: IAddressId | 'unknown';\n trackingId: ITrackingId | 'unknown';\n count: number;\n salesLines: ISalesLine[];\n}\n\nexport const groupSalesLines = (salesLines: ISalesLine[]): IGroupData[] => {\n const getGroupByDeliveryType = (items: ISalesLine[]) => groupBy(items, item => item.data.deliveryType);\n const getGroupBySalesStatusCode = (items: ISalesLine[]) => groupBy(items, item => item.data.salesStatus);\n const getGroupByTrackingId = (items: ISalesLine[]) => groupBy(items, item => item.data.salesLine.TrackingId || 'unknown');\n const getGroupByAddressId = (items: ISalesLine[]) =>\n groupBy(items, item => (item.data.salesLine.ShippingAddress && item.data.salesLine.ShippingAddress.RecordId) || 'unknown');\n\n const flatGroup: IGroupData[] = [];\n\n // 1) Group by delivery type\n // @ts-ignore\n const group = getGroupByDeliveryType(salesLines);\n\n // 2) Group by sales status code\n Object.entries(group).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-ignore\n group[deliveryType] = getGroupBySalesStatusCode(groupByDeliveryType);\n\n Object.entries(group[deliveryType]).forEach(([salesStatus, groupBySalesStatusCode]) => {\n // @ts-ignore 3) Group by address id\n groupBySalesStatusCode[salesStatus] = getGroupByAddressId(groupBySalesStatusCode);\n\n // @ts-ignore\n Object.entries(groupBySalesStatusCode[salesStatus]).forEach(([addressId, groupByAddressId]) => {\n // @ts-ignore 4) Group by address id\n groupByAddressId[addressId] = getGroupByTrackingId(groupByAddressId);\n\n // @ts-ignore\n Object.entries(groupByAddressId[addressId]).forEach(([trackingId, groupByTrackingId]) => {\n flatGroup.push({\n // @ts-ignore\n deliveryType,\n // @ts-ignore\n salesStatus,\n addressId,\n trackingId,\n // @ts-ignore\n count: countItems(groupByTrackingId.map(item => item.data.salesLine)),\n // @ts-ignore\n salesLines: groupByTrackingId\n });\n });\n });\n });\n });\n\n return flatGroup;\n};\n\nexport const getDateTimeslot = (placeHolder: string, startDate: Date | undefined, endDate: Date | undefined, locale: string): string => {\n if (!startDate || !endDate) {\n return '';\n }\n\n const dateOptions: Intl.DateTimeFormatOptions = {\n timeZone: 'UTC'\n };\n const dateformatter = new Intl.DateTimeFormat(locale, dateOptions);\n const date = dateformatter.format(new Date(startDate));\n\n const timeslotOptions: Intl.DateTimeFormatOptions = {\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n timeZone: 'UTC'\n };\n const timeslotformatter = new Intl.DateTimeFormat(locale, timeslotOptions);\n const timeslot = format(placeHolder, timeslotformatter.format(new Date(startDate)), timeslotformatter.format(new Date(endDate)));\n return `${date} ${timeslot}`;\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/ //\nimport { Heading as HeadingType } from '@msdyn365-commerce-modules/data-types';\nimport { Button, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport * as React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport interface ICheckoutGuidedCardProps {\n step: number;\n title?: HeadingType;\n disabled?: boolean; // module is not available\n isActive?: boolean; // step === currentStep\n isVisted?: boolean; // step < currentStep\n isExpanded?: boolean;\n isReady?: boolean;\n isPending?: boolean;\n isUpdating?: boolean;\n isSubmitting?: boolean;\n isCancelAllowed?: boolean;\n isMobile?: boolean;\n hasInitialized?: boolean;\n hasControlGroup?: boolean;\n children: React.ReactNode;\n resource: {\n checkoutStepTitleFormat: string;\n saveBtnLabel: string;\n changeBtnLabel: string;\n cancelBtnLabel: string;\n saveAndContinueBtnLabel: string;\n };\n telemetryContent?: ITelemetryContent;\n onEdit?(): void;\n onCancel?(): void;\n onSubmit?(): void;\n onNext(): void;\n}\n\n/**\n *\n * CheckoutGuidedCard component\n * @extends {React.Component}\n */\nclass CheckoutGuidedCard extends React.PureComponent {\n private editButtonRef: React.RefObject = React.createRef();\n private formCardRef: React.RefObject = React.createRef();\n private payLoad: IPayLoad;\n\n constructor(props: ICheckoutGuidedCardProps) {\n super(props);\n this.payLoad = getPayloadObject('click', props.telemetryContent!, '');\n }\n\n public componentDidUpdate(prevProps: ICheckoutGuidedCardProps): void {\n /**\n * Move to next step when current step is ready\n */\n const { isActive, isReady, onNext, isVisted, onEdit } = this.props;\n\n // Move to next step after completing the current step\n if (isActive && isReady) {\n onNext();\n }\n\n // Set the focus to Edit button once edit button appear\n // (It happens when current step switch to isReady status)\n const prevCanEdit = prevProps.isReady && prevProps.isVisted && !!prevProps.onEdit;\n const canEdit = isReady && isVisted && !!onEdit;\n if (!prevCanEdit && canEdit) {\n this.focusOnEditButton();\n this.scrollToTitle();\n }\n\n // Set the focus to the first focusable element\n // (It happens when current step switch to isUpdating status)\n if (prevProps.isReady && !isReady) {\n this.focusOnFirstFocusableElement();\n }\n }\n\n public render(): JSX.Element | null {\n const {\n title,\n disabled,\n isExpanded,\n isActive,\n isVisted,\n children,\n isReady,\n isPending,\n isUpdating,\n hasInitialized,\n hasControlGroup,\n onEdit,\n resource\n } = this.props;\n const { changeBtnLabel } = resource;\n\n this.payLoad.contentAction.etext = TelemetryConstant.CheckoutChange;\n const changeBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n const canEdit = hasControlGroup && isReady && isVisted && onEdit;\n\n return (\n \n
\n {this.getTitle()}\n\n {canEdit && (\n \n {changeBtnLabel}\n \n )}\n
\n\n \n
{children}
\n\n {this.renderFooder()}\n
\n
\n );\n }\n\n private renderFooder = (): JSX.Element | null => {\n const { isVisted, isReady, isSubmitting, isCancelAllowed, hasControlGroup, onCancel, onSubmit, resource } = this.props;\n const { saveBtnLabel, cancelBtnLabel, saveAndContinueBtnLabel } = resource;\n\n const canSubmit = !isReady && onSubmit;\n const canCancel = !isReady && isVisted && isCancelAllowed && onCancel;\n\n if (!hasControlGroup || (!canSubmit && !canCancel)) {\n return null;\n }\n\n this.payLoad.contentAction.etext = isVisted ? TelemetryConstant.Save : TelemetryConstant.SaveContinue;\n const saveBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n
\n {canSubmit && (\n \n {isVisted && isCancelAllowed ? saveBtnLabel : saveAndContinueBtnLabel}\n \n )}\n {canCancel && (\n \n {cancelBtnLabel}\n \n )}\n
\n );\n };\n\n private focusOnFirstFocusableElement = (): void => {\n const node = ReactDOM.findDOMNode(this) as HTMLElement;\n const focussableElements = `\n a:not([disabled]),\n button:not([disabled]),\n input[type=submit]:not([disabled]),\n input[type=checkbox]:not([disabled]),\n input[type=text]:not([disabled]),\n input[type=radio]:not([disabled]),\n input[type=password]:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n [tabindex]:not([disabled]):not([tabindex=\"-1\"])\n `;\n\n const child = node && node.querySelector && (node.querySelector(focussableElements) as HTMLElement);\n child && child.focus && child.focus();\n };\n\n private focusOnEditButton = (): void => {\n // Focus on edit button\n const editButton =\n this.editButtonRef &&\n this.editButtonRef.current &&\n this.editButtonRef.current.focus &&\n (this.editButtonRef.current as HTMLElement);\n editButton && editButton.focus();\n };\n\n private scrollToTitle = (): void => {\n // scroll window to the title of the step that was just completed only in mobile viewport\n const formCard = this.props.isMobile && this.formCardRef && this.formCardRef.current && (this.formCardRef.current as HTMLElement);\n formCard && formCard.scrollIntoView();\n };\n\n private getTitle = (): JSX.Element => {\n const { step, title } = this.props;\n const { headingTag: Tag = 'h2', text = '' } = title || {};\n return (\n \n {step + 1}. \n {text && {text}}\n \n );\n };\n}\n\nexport default CheckoutGuidedCard;\n","import { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest\n */\nexport class SearchState {\n @observable public searchText?: string;\n @observable public defaultBasicSearchUrl?: string;\n @observable public searchQueryStringParameter?: string;\n}\n","import { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType, createObservableDataAction, IAction, IActionContext, IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\nimport {\n getSearchSuggestionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\n// @ts-ignore\nexport const enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * Input class for auto suggest search input\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n public topResultsCount?: number;\n public suggestionType?: string;\n public hitPrefix?: string;\n public hitSuffix?: string;\n\n constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => `AutoSuggestSearchSuggestions`;\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [\n _getAutoSuggest(input, autosuggest, ctx),\n ];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\nasync function _getAutoSuggest(\n input: AutoSuggestInput,\n autosuggest: Autosuggestions,\n ctx: IActionContext\n): Promise {\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: +ctx.requestContext.apiSettings.catalogId\n }\n },\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) =>\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\n );\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(`[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`);\n }\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: >getSearchSuggestionsAction,\n input: createInput\n});\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchKeywordSuggestProps {\n searchKeywordSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchKeywordViewProps {\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n *\n * KeywordSuggestionsComponent\n */\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\n const {\n suggestions,\n hitPrefix,\n hitSuffix\n } = props;\n\n if (!suggestions) {\n return undefined;\n }\n\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n const reactNodes: React.ReactNode[] = [];\n\n suggestions.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\n });\n\n return { text: reactNodes };\n};\n\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\n const ariaLabel = item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = ariaLabel;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n
  • \n \n {_generateLink(item, hitPrefix, hitSuffix, props) &&\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\n \n
  • \n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\n const { searchPageURL, searchQsp } = props;\n\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n const route = searchPageURL || '';\n return formattedLink && formattedLink.length > 0\n ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${formattedLink}`\n : route;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n // tslint:disable:react-no-dangerous-html\n return ;\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\n\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, INodeProps, IPayLoad, ITelemetryContent, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n *\n * ProductSuggestionsComponent\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n if (!suggestions) {\n return undefined;\n }\n\n suggestions.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return
  • {productAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps,\n moduleType: string,\n moduleId: string\n): ISearchProductItemViewProps => {\n const altText =\n item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price:\n item.Id &&\n item.Value3 &&\n item.Value3.Value &&\n item.Value3.Value.DecimalValue &&\n _renderPrice(item.Value3.Value.DecimalValue, item.Value3.Value.DecimalValue, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const ariaLabel = item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n payLoad.contentAction.recid = item.Id;\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'a' as NodeTag,\n 'aria-label': ariaLabel,\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\n ...attribute\n };\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const formattedLink = (suggestion.Value as string).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id ?\n getProductPageUrlSync(formattedLink,suggestion.Id as unknown as number, actionContext, undefined) : '';\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n // tslint:disable:react-no-dangerous-html\n return ;\n};\n\nconst _renderPrice = (adjustedPrice: number, basePrice: number, moduleId: string, moduleType: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n \n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if(imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=40&h=40&m=6`, w: 0, h: 0 },\n lg: { q: `w=40&h=40&m=6`, w: 0, h: 0 },\n xl: { q: `w=40&h=40&m=6`, w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\n \n );\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\n\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n *\n * CategorySuggestionsComponent\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n if (!suggestions) {\n return undefined;\n }\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading\n ? format(categorySuggestionHeading, searchText)\n : `Search \"${searchText}\" in categories`;\n\n return
  • {categoryAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix } = props;\n\n const splitValue = item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n
  • \n \n {_generateLink(item, searchText, props) && _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\n \n
  • \n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n const route = searchPageURL || '';\n const urlPath = `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${searchText}`;\n const categoryRefiners =\n searchRefiners &&\n searchRefiners.find(refiners => {\n return refiners.KeyName === 'Category';\n });\n const refiner =\n categoryRefiners &&\n categoryRefiners.Values &&\n categoryRefiners.Values.find(item => {\n return item.RefinerRecordId === parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && encodeURIComponent(JSON.stringify(compressRefiners([refiner])));\n\n return encodedRefiner ? `${urlPath}&refiners=${encodedRefiner}` : urlPath;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n let formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n formattedText = formattedText.split('|').pop() || '';\n\n // tslint:disable:react-no-dangerous-html\n return ;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\n\n/**\n * Compressed a list of refiners for use in URLs\n * @param refiners The uncompressed refiners\n */\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach((refiner) => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach((refinerKey) => {\n // @ts-ignore: This line is intentionally not typesafe\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchFormProps {\n hideSearchLabel: boolean | undefined;\n isSearchFormExpanded: boolean | undefined;\n disableSubmitSearch: boolean | undefined;\n searchTextInput: React.RefObject;\n maxChars: number;\n searchQsp: string;\n searchPlaceholder: string;\n query: string;\n ariaLabelCancel: string;\n ariaLabelSearch: string;\n ariaLabelSubmit: string;\n handleCancelSearchChange(): void;\n handleInputChange(query: string): void;\n}\n\nexport interface ISearchFormViewProps {\n input: React.ReactNode;\n submitBtn: React.ReactNode;\n cancelBtn: React.ReactNode;\n\n}\n\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\n const {\n searchQsp,\n searchPlaceholder,\n hideSearchLabel,\n isSearchFormExpanded,\n searchTextInput,\n handleInputChange,\n maxChars,\n disableSubmitSearch,\n handleCancelSearchChange,\n query,\n ariaLabelCancel,\n ariaLabelSearch,\n ariaLabelSubmit\n } = props;\n\n const onInputChange = (e: React.ChangeEvent): void => {\n handleInputChange(e.target.value || '');\n };\n\n const inputNode = !hideSearchLabel ? (\n \n ) : (\n \n );\n\n const submitBtnNode = !disableSubmitSearch && (\n \n \n );\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport { getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n };\n isSearchFormExpanded: boolean;\n}\n\n/**\n *\n * Search module\n * @extends {React.Component, ISearchState>}\n */\nclass Search extends React.Component, ISearchState> {\n private searchTextInput: React.RefObject;\n private searchCollapsedLabel: React.RefObject;\n private formReference: React.RefObject;\n private maxChars: number;\n private inputSuggestionType?: ISuggestionTypeCriterionData[];\n private topResultsCount?: number;\n private hitPrefix: string = '{';\n private hitSuffix: string = '}';\n private waitTime: number = 500;\n private autoSuggestResultScreenReaderDiv: React.RefObject;\n private autoSuggestResultDiv: React.RefObject;\n private searchFormClass: string;\n private searchLabelClass: string;\n private telemetryContent: ITelemetryContent;\n // @ts-ignore\n private cancellabelDebounce: debounce;\n\n constructor(props: ISearchProps) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public async componentDidMount(): Promise {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\n public render(): JSX.Element {\n const {\n context,\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel},\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, className = '' }\n } = this.props;\n\n const {\n isSearchFormExpanded,\n searchText,\n searchKeywordSuggestClass,\n searchProductSuggestClass,\n searchCategorySuggestClass,\n suggestions,\n searchRefiners\n } = this.state;\n\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\n\n const keywordSuggestions =\n suggestions &&\n suggestions.AllSearchResults &&\n suggestions.AllSearchResults.filter(\n i => i.SuggestionType === SuggestionType.Keyword || i.SuggestionType === SuggestionType.None\n );\n const productSuggestions =\n suggestions &&\n suggestions.AllSearchResults &&\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Product);\n const categorySuggestions =\n suggestions &&\n suggestions.AllSearchResults &&\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Category);\n\n const viewProps: ISearchViewProps = {\n ...(this.props as ISearchProps),\n\n Search: {\n moduleProps: this.props,\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`,\n },\n AutoSuggestAriaLabel: {\n tag: 'div',\n className: 'msc-autoSuggest__screen-reader',\n 'aria-live': 'assertive',\n ref: this.autoSuggestResultScreenReaderDiv\n },\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\n searchText: this.state.searchText,\n AutoSuggest: {\n ref: this.autoSuggestResultDiv,\n className: 'ms-search__autoSuggest'\n },\n KeywordSuggest: {\n className: searchKeywordSuggestClass\n },\n ProductSuggest: {\n className: searchProductSuggestClass\n },\n CategorySuggest: {\n className: searchCategorySuggestClass\n },\n SearchForm: {\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\n },\n FormWrapper: {\n tag: 'form',\n ref: this.formReference,\n className: 'ms-search__searchForm',\n 'aria-label': 'Search',\n name: 'searchForm',\n role: 'Search',\n action: searchURL,\n autoComplete: 'off',\n onSubmit: this._handleSubmit\n },\n UlKeyword: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__keywordResults-items', className)\n },\n UlProduct: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__productResults-items', className)\n },\n UlCategory: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__categoryResults-items', className)\n },\n label:LabelComponent({\n isSearchFormExpanded: isSearchFormExpanded,\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\n searchtext: searchtext,\n searchLabelArialLabel: searchLabelArialLabel,\n searchCollapsedLabel: this.searchCollapsedLabel,\n hideSearchLabel: hideSearchLabel,\n handleCancelSearchChange: this._handleCancelSearchChange,\n telemetryContent: this.telemetryContent\n }),\n form: FormComponent({\n ariaLabelCancel: cancelBtnAriaLabel,\n ariaLabelSearch: searchBtnAriaLabel,\n ariaLabelSubmit: submitBtnAriaLabel,\n hideSearchLabel: hideSearchLabel,\n searchTextInput: this.searchTextInput,\n isSearchFormExpanded: isSearchFormExpanded,\n disableSubmitSearch: disableSubmitSearch,\n handleInputChange: this._handleInputChange,\n handleCancelSearchChange: this._handleCancelSearchChange,\n maxChars: this.maxChars,\n searchQsp: searchQsp,\n searchPlaceholder: searchPlaceholder,\n query: searchText\n }),\n autosuggestKeyword:\n searchText && searchText.length > 0 && keywordSuggestions && keywordSuggestions.length > 0\n ? KeywordSuggestionsComponent({\n searchKeywordSuggestClass: searchKeywordSuggestClass,\n searchPageURL: searchPageURL,\n searchQsp: searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText: searchText,\n suggestions: keywordSuggestions,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n autosuggestProduct:\n searchText && searchText.length > 0 && productSuggestions && productSuggestions.length > 0\n ? ProductSuggestionsComponent({\n searchProductSuggestClass: searchProductSuggestClass,\n searchPageURL: searchPageURL,\n searchQsp: searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText: searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n autosuggestCategory:\n searchText && searchText.length > 0 && categorySuggestions && categorySuggestions.length > 0\n ? CategorySuggestionsComponent({\n searchCategorySuggestClass: searchCategorySuggestClass,\n searchPageURL: searchPageURL,\n searchQsp: searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText: searchText,\n suggestions: categorySuggestions,\n searchRefiners: searchRefiners,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n // tslint:disable-next-line:no-any\n private _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (\n suggestions &&\n suggestions.AllSearchResults &&\n e.target.closest('.ms-search') === null\n ) {\n this._clearAutoSuggestState();\n }\n };\n\n private _keyup = (e: KeyboardEvent): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\n this._clearAutoSuggestState();\n } else if(this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\n if(this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n\n if (!((this.formReference.current && this.formReference.current.contains(e.target as unknown as Node)) ||\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains(e.target as unknown as Node)))) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if(this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private _handleInputChange = (query: string): void => {\n if (!query || query.length < this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n telemetry,\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n this.cancellabelDebounce = debounce(() => {\n getSearchSuggestionsAction(\n new AutoSuggestInput(\n query,\n this.topResultsCount,\n this._getSuggestionType(this.inputSuggestionType),\n this.hitPrefix,\n this.hitSuffix\n ),\n context.actionContext\n )\n .then(results => {\n this._getSearchRefiners(query)\n .then(refiners => {\n this.setState({ suggestions: results, searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results) });\n })\n .catch(error => {\n this.setState({ suggestions: results, searchRefiners: undefined,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results) });\n telemetry.exception(error);\n telemetry.debug('Unable to get refiners results');\n });\n })\n .catch(error => {\n this.setState({ suggestions: undefined, searchRefiners: undefined,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n telemetry.exception(error);\n telemetry.debug('Unable to get auto suggest results');\n });\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\n if (suggestionTypes && suggestionTypes.length > 0) {\n const distinctSuggestionTypes: string[] = [];\n suggestionTypes && suggestionTypes.forEach((suggestionTypeItem, index) => {\n suggestionTypeItem.SuggestionType && distinctSuggestionTypes.push(suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType.slice(1));\n });\n return distinctSuggestionTypes.join(',');\n }\n return 'Keyword, Product, ScopedCategory';\n };\n\n private async _getSearchRefiners(searchText: string): Promise {\n const { actionContext: ctx } = this.props.context;\n return getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: +ctx.requestContext.apiSettings.catalogId\n }\n }\n );\n }\n\n private _handleSubmit = (\n e: React.MouseEvent | React.KeyboardEvent | React.FormEvent\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private _appendQueryParams = (route: string, query: string, qsp: string): string => {\n if (route && route.length > 0) {\n return query && query.length > 0 ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${qsp}=${query}` : route;\n }\n return '';\n };\n\n private _setAutoSuggestResultCount = (result?: Autosuggestions) => {\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\n ariaLiveRegion.innerText = result && (result.AllSearchResults && result.AllSearchResults.length > 0) ? suggestResultString : emptyResultString;\n ariaLiveRegion.setAttribute('aria-live','assertive');\n return ariaLiveRegion.innerText;\n } else {\n return '';\n }\n };\n}\n\nexport default Search;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/ //\nimport { IModuleStateManager } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { Heading } from '@msdyn365-commerce-modules/data-types';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport get from 'lodash/get';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport GuidedCard from '../components/guided-card';\n\nexport interface ICheckoutGuidedFormProps {\n items: React.ReactNode[];\n moduleState: IModuleStateManager;\n disableGuidedCheckoutFlow?: boolean;\n isMobile?: boolean;\n isEditor?: boolean;\n resource: {\n checkoutStepTitleFormat: string;\n saveBtnLabel: string;\n changeBtnLabel: string;\n cancelBtnLabel: string;\n saveAndContinueBtnLabel: string;\n };\n telemetryContent?: ITelemetryContent;\n}\n\ninterface ICheckoutGuidedFormState {\n currentStep: number;\n}\n\n/**\n *\n * CheckoutGuidedForm component\n * @extends {React.Component}\n */\n@observer\nclass CheckoutGuidedForm extends React.Component {\n public state: ICheckoutGuidedFormState = {\n currentStep: 0\n };\n\n public componentDidMount(): void {\n /**\n * Append child modules\n */\n const childIds = this.props.items.map((item: React.ReactNode) => get(item, 'props.id'));\n this.props.moduleState.init({ childIds });\n }\n\n public render(): JSX.Element | null {\n const { moduleState, items, resource } = this.props;\n if (!items || !moduleState) {\n return null;\n }\n\n return (\n
    \n {items.map((item: React.ReactNode) => {\n const childId = this.getId(item);\n const step = this.getStep(childId);\n const title = this.getHeading(item);\n const state = this.props.moduleState.getModule(childId);\n const { isReady, isPending, isUpdating, isDisabled, isCancelAllowed, onEdit, onCancel, onSubmit, hasModuleState, hasInitialized } =\n state || ({} as IModuleStateManager);\n return (\n\n \n {React.cloneElement(item as React.ReactElement, { enableControl: true })}\n \n );\n })}\n
    \n );\n }\n\n private getEnabledModules = (): string[] => {\n const {\n moduleState: { childIds, getModule }\n } = this.props;\n return childIds.filter((childId: string) => {\n const state = getModule(childId);\n return !!state && !state.isDisabled;\n });\n };\n\n private getStep = (id: string): number => {\n return this.getEnabledModules().indexOf(id);\n };\n\n private getId = (item: React.ReactNode): string => {\n return get(item, 'props.id') || '';\n };\n\n private getHeading = (item: React.ReactNode): Heading => {\n return get(item, 'props.config.heading') || '';\n };\n\n private isExpanded = (step: number): boolean => {\n if (this.props.isEditor) {\n // Editorial mode: Expand all the drawers\n return true;\n }\n return step > -1 && step <= this.state.currentStep;\n };\n\n private isActive = (step: number): boolean => {\n return step === this.state.currentStep;\n };\n\n private isVisted = (step: number): boolean => {\n return step > -1 && step < this.state.currentStep;\n };\n\n private onNext = (): void => {\n this.setState({\n currentStep: this.state.currentStep + 1\n });\n };\n}\n\nexport default CheckoutGuidedForm;\n","import React from 'react';\n\nimport { EnumExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Popover } from '@msdyn365-commerce-modules/utilities';\nimport { IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\n\nexport interface IOrderHistoryFilterResources {\n orderHistoryFilterYourOrderHistory: string;\n orderHistoryFilterOrganizationWide: string;\n}\n\nexport interface IOrderHistoryFilterData {\n customerInformation: Customer;\n}\n\nexport interface IOrderHistoryFilterProps extends IComponentProps {\n className: string;\n\n resources: IOrderHistoryFilterResources;\n\n currentState: OrderHistoryFilterState;\n onFilterStateChanged(state: OrderHistoryFilterState): void;\n}\n\nexport enum OrderHistoryFilterState {\n CurrentUser,\n OrganizationWide\n}\n\nconst getOrderHistoryFilterStateResources = (filterState: OrderHistoryFilterState, resources: IOrderHistoryFilterResources): string => {\n switch (filterState) {\n case OrderHistoryFilterState.CurrentUser:\n return resources.orderHistoryFilterYourOrderHistory;\n case OrderHistoryFilterState.OrganizationWide:\n return resources.orderHistoryFilterOrganizationWide;\n default:\n throw new Error('Failed to retrieve resource description for unknown order history filter state.');\n }\n};\n\nconst renderFilterStateItem = (\n filterState: OrderHistoryFilterState,\n resources: IOrderHistoryFilterResources,\n className: string,\n onStateClick: (filterState: OrderHistoryFilterState) => void): React.ReactNode => {\n\n const stateStringRepresentation = OrderHistoryFilterState[filterState];\n\n const onClick = () => {\n return onStateClick(filterState);\n };\n\n return (\n \n {getOrderHistoryFilterStateResources(filterState, resources)}\n \n );\n};\n\nconst OrderHistoryFilter: React.FC = (props: IOrderHistoryFilterProps) => {\n // Current version of filter doesn't include functionality for non b2b admins.\n if (!props.data.customerInformation.IsB2bAdmin) {\n return null;\n }\n\n const popoverRef = React.createRef();\n const [popoverState, setPopoverState] = React.useState(false);\n const togglePopover = () => {\n setPopoverState(!popoverState);\n };\n\n const [filterState, setFilterState] = React.useState(props.currentState);\n\n const onFilterStateClick = (clickedState: OrderHistoryFilterState) => {\n setFilterState(clickedState);\n setPopoverState(false);\n props.onFilterStateChanged(clickedState);\n };\n\n return (\n
    \n \n {getOrderHistoryFilterStateResources(filterState, props.resources)}\n \n \n {\n EnumExtensions.getEnumValues(OrderHistoryFilterState).map(state => {\n return renderFilterStateItem(state, props.resources, props.className, onFilterStateClick);\n })\n }\n \n
    \n );\n};\n\n// @ts-ignore\nexport const OrderHistoryFilterComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\n 'OrderHistoryFilterComponent',\n { component: OrderHistoryFilter }\n);","import { buildCacheKey, getOrganizationWideOrderHistory, GetOrganizationWideOrderHistoryInput, getSimpleProducts, ProductInput } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings\n} from '@msdyn365-commerce/core';\nimport { IQueryResultSettings } from '@msdyn365-commerce/retail-proxy';\nimport { getOrderShipmentsHistoryAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CustomersDataActions.g';\nimport { OrderShipments, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { OrderHistoryFilterState } from '../components/order-history-filter';\n\nexport interface IPaging {\n top: number;\n skip: number;\n}\n\nexport interface IOrderHistory {\n salesOrders: OrderShipments[];\n products: SimpleProduct[];\n}\n\n/**\n * Calls the Retail API and returns the products\n */\nconst getOrderShipmentHistory = (paging: IPaging) => async (ctx: IActionContext): Promise => {\n return getOrderShipmentsHistoryAsync(\n {\n callerContext: ctx,\n queryResultSettings: {\n Paging: {\n Top: paging.top,\n Skip: paging.skip\n }\n }\n },\n ''\n );\n};\n\n/**\n * Calls the Retail API and returns the products\n */\nconst getOrganizationWideOrderShipmentHistory = (paging: IPaging) => async (context: IActionContext): Promise => {\n const queryResultSetting: IQueryResultSettings = {\n Paging: {\n Top: paging.top,\n Skip: paging.skip\n }\n };\n\n return getOrganizationWideOrderHistory(new GetOrganizationWideOrderHistoryInput(queryResultSetting), context);\n};\n\n/**\n * Calls the Retail API and returns the products\n */\nconst getProducts = (productIds: number[] = [], channelId?: number) => (ctx: IActionContext): Promise => {\n const productInputs = productIds.map(productId => new ProductInput(productId, ctx.requestContext.apiSettings, channelId));\n return getSimpleProducts(productInputs, ctx);\n};\n\n/**\n * Action input\n */\nexport class GetSalesOrderHistoryWithHydrationsInput implements IActionInput {\n public paging: IPaging;\n public filterState: OrderHistoryFilterState;\n private apiSettings: ICommerceApiSettings;\n\n constructor(paging: IPaging, apiSettings: ICommerceApiSettings, filterState?: OrderHistoryFilterState) {\n this.apiSettings = apiSettings;\n this.paging = paging;\n this.filterState = filterState || OrderHistoryFilterState.CurrentUser;\n }\n\n public getCacheKey = () => buildCacheKey(`OrderHistory`, this.apiSettings);\n public getCacheObjectType = () => `OrderHistory`;\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * Splits product ids from the given orders into lists by their channel id.\n * @param {OrderShipments[]} salesOrders Orders with the products.\n * @param {number} currentChannelId Channel id to use by default if no channel id is provided for a product.\n * @returns {{ [x: number]: number[] }} A dictionary where the key is a channel id,\n * and the value is a list of product ids in which all items correspond to the key channel id.\n * @remark The list of product ids is always non-empty.\n */\nconst splitProductsByChannelId = (\n salesOrders: OrderShipments[],\n currentChannelId: number): { [x: number]: number[] } => {\n\n const productIdsByChannel: { [x: number]: number[] } = {};\n\n salesOrders.forEach(salesOrder => salesOrder?.SalesLines?.forEach(line => {\n const orderProductId = line.ProductId || 0;\n const orderChannelId = salesOrder.ChannelId || currentChannelId;\n if (!productIdsByChannel[orderChannelId]) {\n productIdsByChannel[orderChannelId] = [];\n }\n productIdsByChannel[orderChannelId].push(orderProductId);\n }));\n\n return productIdsByChannel;\n};\n\n/**\n * Get sales order with hydrations action\n */\nexport async function getSalesOrderHistoryWithHydrationsAction(\n input: GetSalesOrderHistoryWithHydrationsInput,\n context: IActionContext\n): Promise {\n if (!context) {\n throw new Error('getSalesOrderWithHydrationsAction - Action context cannot be null/undefined');\n }\n const channelId = context.requestContext.apiSettings.channelId;\n let salesOrders: OrderShipments[] = [];\n\n switch (input.filterState) {\n case OrderHistoryFilterState.CurrentUser:\n salesOrders = await getOrderShipmentHistory(input.paging)(context);\n break;\n case OrderHistoryFilterState.OrganizationWide:\n salesOrders = await getOrganizationWideOrderShipmentHistory(input.paging)(context);\n break;\n default:\n throw new Error('getSalesOrderWithHydrationsAction - Invalid OrderHistoryFilterState passed');\n }\n\n if (!salesOrders || !salesOrders.length) {\n return {\n salesOrders: [],\n products: []\n };\n }\n\n // Splits the data by channel ids so that the products from different channels can be processed separately.\n const productIdsByChannelId = splitProductsByChannelId(salesOrders, channelId);\n\n // Promise that retrieves information about the products for each channel id.\n // Note, the list of product ids should not be empty\n // as it will generate an empty request which will force the promise to fail.\n const getProductsPromise = Object.entries(productIdsByChannelId).map(\n ([entryChannelId, entryProductIdsList]) => {\n const getProductsCall = getProducts(entryProductIdsList, Number(entryChannelId));\n return getProductsCall(context);\n });\n\n return Promise.all(getProductsPromise).then(\n (productList): IOrderHistory => {\n const products = productList.reduce((memo, list) => {\n return [...memo, ...list];\n }, []); // tslint:disable-line:align\n\n return {\n salesOrders,\n products\n };\n }).catch(error => {\n context.telemetry.exception(error);\n context.telemetry.debug('Failed to get products');\n throw error;\n });\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/order-management/order-history/get-order-shipment-history',\n action: >getSalesOrderHistoryWithHydrationsAction\n});","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { getUrlSync } from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, ChannelIdentity, OrderShipments, OrgUnitLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\nimport { getGroups, IGroups } from '../../../common/get-groups';\nimport { getOrderInfomationInput, getOrderInformation, IOrderInformation } from '../../../common/get-order-information';\nimport { getSalesLines, getSalesLinesInput } from '../../../common/get-sales-lines';\nimport { IOrderHistoryData } from '../order-history.data';\nimport { IOrderHistoryProps } from '../order-history.props.autogenerated';\n\nexport interface ISalesOrderProps extends IOrderHistoryProps {\n salesOrder: OrderShipments;\n products: SimpleProduct[];\n channelIdentities?: ChannelIdentity[];\n orgUnitLocations?: OrgUnitLocation[];\n showChannelInfo?: boolean;\n telemetryContent?: ITelemetryContent;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n}\n\nexport interface ISalesOrder {\n salesOrderProps: INodeProps;\n orderInfomation: IOrderInformation;\n groups?: IGroups;\n orderDetailsLink: React.ReactNode;\n}\n\nexport const getSalesOrder = (input: ISalesOrderProps): ISalesOrder => {\n const {\n id,\n typeName,\n context,\n telemetry,\n products,\n salesOrder,\n showChannelInfo,\n channelIdentities,\n orgUnitLocations,\n telemetryContent,\n resources: { freePriceText, detailsAriaLabel, detailsLabel, orderItemLabel, orderItemsLabel },\n context: { actionContext },\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig\n } = input;\n\n const moduleName = 'ms-order-history';\n\n const priceContext = {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n\n const _getorderDetailsPageUrl = (): string => {\n const url = getUrlSync('orderDetails', actionContext) || '';\n const separator = url.includes('?') ? '&' : '?';\n if (salesOrder.SalesId) {\n // Redirect with sales order sales id\n return `${url}${separator}salesId=${salesOrder.SalesId}`;\n } else {\n // Redirect with sales order transaction id\n return `${url}${separator}transactionId=${salesOrder.TransactionId}`;\n }\n };\n\n const salesOrderProps = { className: 'ms-order-history__sales-order', key: salesOrder.SalesId || salesOrder.TransactionId };\n\n const orderInfomationInput = getOrderInfomationInput(input, moduleName, salesOrder, priceContext, channelIdentities, orgUnitLocations, showChannelInfo);\n const orderInfomation = getOrderInformation(orderInfomationInput);\n\n const salesLinesInput = products && getSalesLinesInput(input, moduleName, salesOrder, products, priceContext, undefined, undefined, undefined, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig);\n const salesLines = salesLinesInput && getSalesLines({ ...salesLinesInput, imageOnly: true });\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.OrderDetails);\n const orderDetailsAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n const groups =\n salesLines &&\n getGroups({\n moduleName,\n salesLines,\n resources: { orderItemLabel, orderItemsLabel },\n retailMultiplePickUpOptionEnabled: retailMultiplePickUpOptionEnabled\n });\n\n const orderDetailsLink = (\n \n {detailsLabel}\n \n );\n\n return {\n salesOrderProps,\n orderInfomation,\n groups,\n orderDetailsLink\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport classname from 'classnames';\nimport { observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\n\nimport LabelComponent from '../../common/label';\nimport {\n getSalesOrderHistoryWithHydrationsAction, GetSalesOrderHistoryWithHydrationsInput,\n IOrderHistory, IPaging\n} from './actions/get-order-shipment-history';\nimport { getSalesOrder, ISalesOrder } from './components/get-sales-order';\nimport { OrderHistoryFilterComponent, OrderHistoryFilterState } from './components/order-history-filter';\nimport { IOrderHistoryData } from './order-history.data';\nimport { IOrderHistoryProps } from './order-history.props.autogenerated';\n\nexport * from '../../common/get-groups';\nexport * from '../../common/get-order-information';\nexport * from '../../common/get-sales-line';\nexport * from '../../common/get-sales-lines';\nexport * from '../../common/utilities';\nexport * from './components/get-sales-order';\n\nexport * from '../../common/get-order-information';\nexport * from './components/get-sales-order';\n\nexport interface IHeader {\n headerProps: INodeProps;\n heading: React.ReactNode;\n orderCountLabel?: React.ReactNode;\n extraActions?: React.ReactNode;\n}\n\nexport interface IList {\n listProps: INodeProps;\n salesOrders: ISalesOrder[];\n}\n\nexport interface IOrderHistoryViewState {\n isDataReady: boolean;\n hasError: boolean;\n isLoading: boolean;\n isShowMoreButton: boolean;\n}\n\nexport interface IOrderHistoryViewProps extends IOrderHistoryProps {\n orderHistory: IOrderHistory;\n orderHistoryProps: IModuleProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n emptyMessage?: React.ReactNode;\n header: IHeader;\n backToShoppingLink?: React.ReactNode;\n list?: IList;\n moreButton?: React.ReactNode;\n viewState: IOrderHistoryViewState;\n}\n\n/**\n *\n * OrderHistory component\n * @extends {React.Component>}\n */\n@observer\nclass OrderHistory extends React.Component> {\n @observable private orderHistory!: IOrderHistory;\n @observable private viewState!: IOrderHistoryViewState;\n private filterState: OrderHistoryFilterState;\n private pageSize!: number;\n private paging!: IPaging;\n private telemetryContent?: ITelemetryContent;\n private payLoad: IPayLoad;\n\n constructor(props: IOrderHistoryProps) {\n super(props);\n this.initState();\n this.filterState = OrderHistoryFilterState.CurrentUser;\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n }\n\n public componentDidMount(): void {\n if(this.props.context.actionContext.requestContext.user.isAuthenticated) {\n this.getOrderHistory()\n .then(() => {\n this.viewState.isDataReady = true;\n })\n .catch(ex => {\n this.viewState.hasError = true;\n });\n } else {\n this.viewState.isDataReady = true;\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { heading, className, showChannelInfo },\n resources: { genericErrorMessage, noOrderHistoryLable, moreButtonText, backToShopping, orderCountLabel, ordersCountLabel, loadingLabel }\n } = this.props;\n const { salesOrders, products } = this.orderHistory;\n const { isDataReady, hasError, isShowMoreButton, isLoading } = this.viewState;\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const channelIdentities = this.props.data.channels.result && this.props.data.channels.result.channelIdentities;\n const orgUnitLocations = this.props.data.orgUnitLocations.result && this.props.data.orgUnitLocations.result.orgUnitLocations;\n\n let viewProps: IOrderHistoryViewProps = {\n ...this.props,\n orderHistory: this.orderHistory,\n viewState: this.viewState,\n orderHistoryProps: {\n moduleProps: this.props,\n className: classname('ms-order-history', className)\n },\n header: {\n headerProps: { className: 'ms-order-history__header' },\n heading: heading && heading.text && (\n \n )\n },\n backToShoppingLink: backToShoppingUrl && (\n \n )\n };\n\n if (hasError) {\n viewProps = {\n ...viewProps,\n alert: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!isDataReady) {\n viewProps = {\n ...viewProps,\n loading: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!salesOrders || salesOrders.length === 0) {\n viewProps = {\n ...viewProps,\n emptyMessage:

    {noOrderHistoryLable}

    \n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const _orderCountLabel = salesOrders.length === 1 ? orderCountLabel : ordersCountLabel;\n this.payLoad.contentAction.etext = TelemetryConstant.ViewMore;\n const viewMoreAttributes = getTelemetryAttributes(this.telemetryContent!,this.payLoad);\n\n viewProps = {\n ...viewProps,\n header: {\n ...viewProps.header,\n orderCountLabel: {`(${salesOrders.length} ${_orderCountLabel})`},\n extraActions: this.renderExtraActions()\n },\n list: {\n listProps: { className: 'ms-order-history__sales-order-list' },\n salesOrders: salesOrders.map(salesOrder =>\n getSalesOrder({\n ...this.props,\n products,\n salesOrder,\n channelIdentities,\n orgUnitLocations,\n showChannelInfo,\n telemetryContent: this.telemetryContent\n })\n )\n },\n moreButton: isShowMoreButton && (\n \n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleOrderHistoryHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private onMoreButtonClick = () => {\n // tslint:disable-next-line:no-floating-promises\n this.getOrderHistory();\n }\n\n private renderExtraActions = () => {\n return this.props.data.customerInformation && this.props.data.customerInformation.result && (\n \n );\n }\n\n private initState = () => {\n this.orderHistory = {\n salesOrders: [],\n products: []\n };\n this.viewState = {\n isDataReady: false,\n hasError: false,\n isShowMoreButton: (this.props.config.pageSize || 0) > 0,\n isLoading: false\n };\n this.pageSize = this.props.config.pageSize || 10;\n this.paging = {\n top: this.pageSize,\n skip: 0\n };\n }\n\n private onFilterStateChanged = (state: OrderHistoryFilterState) => {\n this.initState();\n this.filterState = state;\n this.getOrderHistory()\n .then(() => {\n this.viewState.isDataReady = true;\n })\n .catch(ex => {\n this.viewState.hasError = true;\n });\n }\n\n private getOrderHistory = async (): Promise => {\n const actionContext = this.props.context.actionContext;\n const input = new GetSalesOrderHistoryWithHydrationsInput(this.paging, this.props.context.request.apiSettings, this.filterState);\n\n try {\n this.viewState.isLoading = true;\n const response = await getSalesOrderHistoryWithHydrationsAction(input, actionContext);\n if (response) {\n const { products, salesOrders } = response;\n this.orderHistory.products.push(...products);\n this.orderHistory.salesOrders.push(...salesOrders);\n this.viewState.isShowMoreButton = this.viewState.isShowMoreButton && response.salesOrders.length > 0 && response.salesOrders.length === this.pageSize;\n this.paging.skip += this.pageSize;\n }\n this.viewState.isLoading = false;\n return Promise.resolve();\n } catch (error) {\n return Promise.reject();\n }\n }\n}\n\nexport default OrderHistory;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\nimport { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport checkout from './checkout';\nimport emptyActiveCart from './empty-active-cart';\n\nexport default async (ctx: IActionContext, checkoutState: ICheckoutState | undefined, orderedProducts: SimpleProduct[] | undefined, redirect: boolean, updatedCartVersion?: number) => {\n let salesOrder: SalesOrder;\n\n // Proceed checkout\n try {\n salesOrder = await checkout(ctx, updatedCartVersion);\n } catch (error) {\n throw error;\n }\n\n // Remove purchased items from the active cart\n try {\n await emptyActiveCart(ctx);\n } catch (error) {\n throw error;\n }\n\n if (redirect) {\n // Redirect to the order confirmation page\n const orderConfirmationUrl = getUrlSync('orderConfirmation', ctx) || '';\n if (!orderConfirmationUrl) {\n throw new Error('Error: No orderConfirmationUrl');\n }\n\n const separator = orderConfirmationUrl.includes('?') ? '&' : '?';\n const url = `${orderConfirmationUrl}${separator}transactionId=${salesOrder.Id}`;\n window.location.assign(url);\n } else {\n if (checkoutState) {\n const result = await checkoutState.updateSalesOrder({ newSalesOrder: salesOrder, newOrderedProducts: orderedProducts || [] });\n\n if (result.status === 'FAILED') {\n throw new Error('Error: Updating error state failed');\n }\n } else {\n throw new Error('Error: No checkout state');\n }\n }\n};\n"],"sourceRoot":""}