{"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/modules/checkout/methods/empty-active-cart.ts?524e","webpack:///src/modules/checkout/components/index.ts?5ba9","webpack:///./src/modules/smwe-minicart/smwe-minicart.view.tsx?51ef","webpack:///src/modules/checkout/methods/checkout.ts?3b66","webpack:///./src/components/cartlineitem.component.tsx?cc0d","webpack:///./src/common/subscription-commerce.values.tsx?6426","webpack:///./src/modules/smwe-cart/components/smwe-cart-pick-up-in-store.tsx?f762","webpack:///./src/modules/smwe-cart/components/smwe-cart-line-items.tsx?a034","webpack:///./src/modules/smwe-cart/components/smwe-promo-code.tsx?bdb8","webpack:///./src/modules/smwe-cart/smwe-cart.tsx?d071","webpack:///../../../src/module-state-manager/module-state.ts?7579","webpack:///../../../src/module-state-manager/with-module-state.tsx?61ca","webpack:///./src/modules/smwe-minicart/components/flyout-cart-line-items.tsx?d03a","webpack:///./src/modules/smwe-minicart/utils/get-products-in-mini-cart.ts?a109","webpack:///./src/modules/smwe-minicart/smwe-minicart.tsx?767a","webpack:///./src/Utilities/brand-code-parser.tsx?0b81","webpack:///./src/themes/emp/views/smwe-cart.view.tsx?6a82","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/smwe-checkout/smwe-checkout.view.tsx?d94c","webpack:///./src/Utilities/productType.tsx?e262","webpack:///src/modules/checkout/index.ts?1106","webpack:///src/modules/checkout-loyalty/checkout-loyalty.view.tsx?876d","webpack:///src/modules/checkout/checkout.view.tsx?e9a7","webpack:///src/modules/checkout/checkout.tsx?baa3","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/modules/smwe-checkout/components/alert.tsx?4758","webpack:///./src/modules/smwe-checkout/components/get-line-items.tsx?0ecf","webpack:///./src/modules/smwe-checkout/components/get-order-summary.tsx?5fbd","webpack:///./src/modules/smwe-checkout/components/guided-card.tsx?1842","webpack:///./src/modules/smwe-checkout/components/guided-form.tsx?6cb7","webpack:///./src/modules/smwe-checkout/components/place-order-button.tsx?7b2b","webpack:///./src/modules/smwe-checkout/methods/empty-active-cart.ts?8bcc","webpack:///./src/modules/smwe-checkout/methods/smwe-checkout.ts?afa1","webpack:///./src/modules/smwe-checkout/smwe-checkout.tsx?6493","webpack:///./src/modules/smwe-checkout/methods/place-order.ts?f3e4","webpack:///./src/themes/elicit/views/smwe-checkout.view.tsx?d2f8","webpack:///src/modules/checkout/components/alert.tsx?5f0c","webpack:///src/modules/checkout-gift-card/checkout-gift-card.view.tsx?3424","webpack:///./src/modules/smwe-cart/smwe-cart.view.tsx?c9ac","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/gift-card-balance-check/gift-card-balance-check.view.tsx?ce1c","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/Utilities/subscription-manager.tsx?8de0","webpack:///src/modules/checkout-delivery-options/checkout-delivery-options.view.tsx?d64d","webpack:///src/modules/checkout/components/guided-card.tsx?5a55","webpack:///src/modules/checkout/components/guided-form.tsx?7fad","webpack:///./src/components/master-prod-display-name.tsx?07d9","webpack:///src/modules/checkout/methods/place-order.ts?6d11"],"names":["CheckoutDeliveryOptionsDescription","description","React","className","CheckoutDeliveryOptionsErrorMessage","message","CheckoutDeliveryOptionsErrorTitle","title","CheckoutDeliveryOptionsRadioButton","isChecked","value","ariaSetSize","ariaPosInSet","ariaLabel","telemetryContent","onChange","payLoad","getPayloadObject","TelemetryConstant","DeliveryOptions","attributes","getTelemetryAttributes","checked","type","name","CheckoutDeliveryOptions","constructor","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","get","DeliveryOption","DescriptionComponent","Object","Description","PriceComponent","CustomerContextualPrice","freePriceText","getErrorMessage","errorMessageTitle","CheckoutDeliveryOptionsError","tag","role","ErrorTitleComponent","ErrorMessageComponent","errorMessage","getDeliveryOptionList","count","map","index","code","radioButton","RadioButtonComponent","onDeliveryOptionChange","getSaveButton","saveBtnLabel","Button","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","getDeliveryOptionsAsync","callerContext","actionContext","queryResultSettings","deliveryOptionsNotFound","ShippingAddress","event","currentTarget","getTelemetryObject","telemetryPageName","friendlyName","reaction","render","isReady","isUpdating","hasError","isError","isShowList","isShowSelected","featureState","feature","Name","IsEnabled","viewProps","deliveryOptionsData","errorMessageData","viewState","isShowSaveButton","hasExternalSubmitGroup","isShowEditButton","isShowCancelButton","moduleProps","classname","DeliveryOptionsList","list","deliveryOptionSelected","waiting","Waiting","saveButton","editButton","cancelButton","renderView","__decorate","observable","action","withModuleState","observer","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","CartLineItemComponent","sizeString","colorString","styleString","amountString","originalPriceText","currentPriceText","shippingChargesText","isQuantityEditable","productUrl","getProductUrlSync","primaryImageUrl","PrimaryImageUrl","_getPickUpAtStoreComponents","pickupDeliveryLocation","pickUpAtStoreWithLocationText","PickUpAtStore","label","_getEmailDeliveryComponents","emailDeliveryText","EmailDelivery","_getLineItemsComponents","items","isPickUp","_getCartPickDeliveryMode","isEmailDelivery","LineId","LineItem","item","pickUpAtStore","emailDelivery","cartLineItem","StringExtensions","isNullOrWhitespace","_countItems","reduce","Quantity","_filterItemsByDiliveryType","_getLineItemsByDeliveryType","itemLabel","itemsLabel","inStorePickUpLabel","shippingCountCheckoutLineItem","emailDeliveryModeDesc","productDeliveryOptions","suffix","replace","toString","_getGroupTitleComponent","LineItemDeliveryGroup","classnames","LineItemList","heading","lineItems","handleLineItemHeadingChange","lineItemsHeading","text","target","_getLineItemsByDeliveryTypeWithMulitplePickupMode","multiplePickUpLabel","shippingLable","getGroupByStorePickup","groupBy","groupDelivery","cartLinesGroup","cartLinesGrp","entries","forEach","groupByDeliveryType","push","keys","key","cartLines","_filterItemsByMultiplePickupMode","lineItemDeliveryGroup","fulFillmentStoreId","pickupDeliveryModeDesc","pickupTitle","_getGroupTitleComponentWithMultiplePickUp","groupTitle","iconClass","lineItemWraperIcon","lineItemWraper","products","editCartText","EditCart","attribute","groupClass","LineItems","Header","Msdyn365","editProps","requestContext","editLink","href","itemsForPickup","itemsForShip","itemsForEmail","itemsGroupWithMulitplePickupMode","_getLineItems","emptyActiveCart","ctx","lineItemIdsToRemove","getCartState","getCheckoutState","e","Error","activeCart","activeCartLine","checkoutCartLine","removeCartLines","cartLineIds","removeAllPromoCodes","removeCheckoutCartId","CartIconView","Node","miniCartWrapper","renderModuleAttributes","cartIcon","FlyoutContainer","flyoutTitle","CartlinesWrapper","miniCartItemWrapper","cartline","storeLocation","remove","_renderCartlines","cartlines","totalPrice","checkoutAsSignInUserButton","goToCartButton","OPERATIONS","PayCard","PayGiftCertificate","PayLoyalty","PayCustomerAccount","getCardTypeId","cardPrefix","resolveCardTypesAsync","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","getTenderTypesAsync","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","checkoutAsync","bypassCache","SmweCartLine","isSalesLine","showImages","zeroAvailabilityError","intlFormatter","cultureFormatter","_updateQuantity","quantityOnChange","_generateSelectMenu","quantity","currentQuantity","shouldDisableQty","ItemId","toLowerCase","GiftCardItemId","nodes","i","_generateMenu","_getPriceAdjustmentPercent","Price","_getPriceDiscount","DiscountAmountWithoutTax","DiscountLines","showDiscountPercent","NetPrice","_doubleDiscounts","DiscountCode","GiftCardFieldType","giftCardFormObj","FirstName","Key","Type","Extension","StringValue","Required","isValid","LastName","ElectronicDeliveryEmail","Attribute","ElectronicDeliveryEmailContent","_getPriceAdjustmentSavings","brandCode","brandCodeParser","appContext","jsxName","Fragment","MasterProductId","MasterProdDisplay","masterProdId","variantName","Image","src","altText","priceAdjustmentSavings","productType","ProductType","check","isWineProduct","isOutOfStock","maxQuantity","tabIndex","formatCurrency","_generateQuantityAndPrice","Comment","_getCartLineComment","IsGiftCardLine","giftCardFormField","setGiftCardFormField","useState","formFieldsDebounce","setFormFieldsDebounce","useEffect","unhydratedCartLineLoad","field","fieldState","ExtensionProperties","property","extension","prevState","Value","setFormFieldState","giftCardFormIsValid","RegExp","test","cartLineErrors","giftCardValidation","delayDebounceFn","setTimeout","ItemTaxGroupId","cartLineOnChange","updateFormFieldToCartLine","clearTimeout","handleChange","_renderGiftCardPrompt","SubscriptionCommerceValues","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","openDialog","alreadySelectedLocation","InventoryLocationId","onLocationSelected","orgUnitLocation","updateCartLinePickupLocation","cartLineId","resolve","_onLocationChangedCallback","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","foundLocation","option","callbacks","toggleBopis","defaultComponent","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","_renderShippingMethod","shipitText","pickUpInStoreText","ContainerProps","_getCartItemMaxQuantity","maxCartlineQuantity","isStockCheckEnabled","productAvailability","AvailableQuantity","_updateCartLine","updateCartLinesAsync","cartInput","GlobalStateInput","BaseCartState","apiSettings","newCart","update","refreshCart","exception","_assembleCartlines","reactNodes","productTypeInit","mixedCart","isMixedCart","isMixedProduct","_getProduct","foundProductAvailability","foundProductDeliveryOption","productAvailabilites","format","outOfStockError","foundProductDeliveryOptions","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToWishlistButtonText","removeFromWishlistButtonText","wishlists","defaultWishlistName","nameOfWishlist","onRemoveClickHandler","updateCartLinesQuantitySuccessHandler","pickUpInStore","pickitUpText","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","onSuccess","_assembleNode","CartLineItems","PromoCode","state","_onInputChange","setState","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","promoCode","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","preventDefault","placeholder","_removePromotion","getAttribute","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_calculateDiscount","discountAmount","line","discountLine","DiscountCost","_renderAppliedPromoCode","Coupons","appliedPromoCodeHeadingText","appliedPromoCodeSubheadingText","coupon","removePromoAriaLabelFormat","removePromoText","isCollapseOpen","promoCodeHeadingText","PromoCodeComponent","msdyn365Commerce","createComponent","component","Cart","Component","cartLinesInvalid","parsedProductAttributes","_getImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","_removeItemFromCartHandler","cartlineToRemove","_generateRemovalAnalyticsEvent","warning","debug","_moveToWishlistSuccessHandler","_updateCartlineQuantity","cartlineToUpdate","newQuantity","updateCartLineQuantity","componentDidMount","_setProductAttributes","_generateCheckoutAnalyticsEvent","signInUrl","app","routes","guestCheckoutUrl","getUrlSync","backToShoppingUrl","backToShoppingOverride","destinationUrl","backToShopping","checkoutURL","_getCheckoutURL","isCartEmpty","cartTitle","OrderSummaryWrapper","OrderSummaryItems","outOfStockThreshold","enableStockCheck","maxQuantityForCartLineItem","quantityDisplayText","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","invalidProductError","collapseTimeOut","duplicatePromotionErrorText","orderSummaryHeading","orderSummaryTitle","orderSummaryLineitems","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","taxLabel","estimatedTaxLabel","orderTotalLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","backToShoppingButton","backToShoppingButtonTitle","storeSelector","slots","waitingComponent","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","checkoutButtonDisabled","cartLineStatus","isAbsoluteUrl","returnURL","window","origin","indexOf","productID","entry","publish","subscription","isLineSubscriptionLine","mappedProducts","discounts","step","join","getAttributesForCart","getCacheKey","getCacheObjectType","dataCacheType","getModuleStates","cacheKey","ModuleStatesCacheKey","moduleStates","WrappedComponent","_super","_this","states","_a","hasInitialized","isRequired","isCancellable","isSubmitContainer","childIds","validate","isPending","isSkipped","isDisabled","isCancelAllowed","shouldSubmitContainer","hasModuleState","setIsRequired","setIsSubmitContainer","onSkip","onDisable","getModule","moduleId","getModuleStateManager","getModuleByTypeName","getModuleStateManagerByTypeName","options","__assign","values","_moduleState","modules","source","module","isMatch","allMatched","skipSkippableItem","_validateLeaf","method","childId","_validateContainer","enableControl","initializeState","__extends","ModuleState","_renderStoreLocation","updateItemClickHandler","displayMode","getMiniCartData","miniCartData","getOrgUnitConfigurationAsync","productItems","getActiveCartProductsAction","ActiveCartProductsInput","getEstimatedAvailabilityAsync","ProductIds","x","DefaultWarehouseOnly","ProductWarehouseInventoryAvailabilities","PhysicalAvailable","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","MiniCart","_updateItemFromCartHandler","enableHoverCart","cartUrl","_getCartLines","hasErrors","includeFlyout","cartSize","TotalItems","goToCartButtonText","goToCartButtonTitle","TotalAmount","priceString","totalPriceFormatString","CartIconComponent","cartLabel","cartQtyLabel","UncontrolledTooltip","placement","hideArrow","trigger","FlyoutCartLineItems","productDimensionTypeConfiguration","outOfStockText","outOfRangeOneText","outOfRangeFormatText","brandCodeTable","currentBrandCode","slice","brandFound","brand","brandName","CartView","preventCheckout","lineId","_isInvalidCart","cartEmptyText","emptyCartText","itemsTitle","qtyTitle","unitPriceTitle","totalTitle","orderSummaryLines","subtotal","shipping","tax","totalDiscounts","conditionsText","_renderOrderSummarylines","getForm","inputRef","inputPinRef","inputExpRef","giftCardNumber","giftCardExp","onEnterGiftCardNumber","onEnterGiftCardPin","onEnterGiftCardExp","onApplyGiftCard","supportExternalGiftCard","additionalFields","applyGiftCardButton","giftCardFormLabel","giftCardNumberLabel","giftCardPinLabel","giftCardExpLabel","giftCardAlertLabel","giftCardPinPlaceholderText","giftCardExpPlaceholderText","onApply","formProps","inputPinLabel","inputExpLabel","alertFieldLabel","alert","Alert","assertive","fade","includeAlertClass","isOpen","inputNumber","ref","inputPin","inputExp","applyButton","showGiftCardPinInput","showGiftCardExpInput","inputProps","inputNumProps","inputPinProps","inputExpProps","getItem","giftCard","getFormattedPrice","canRemove","onRemoveGiftCard","enteredGiftCardLabel","giftCardAvailableBalanceLabel","removeGiftCardButton","balance","CardCurrencyCode","giftCardLast4Digit","substr","selectedGiftCard","removeButton","itemProps","getList","giftCards","listProps","GiftCardTitle","CheckoutGiftCard","isFetchingGiftCard","isEnabled","isPaymentVerificationRedirection","couldPaidByGiftCard","giftCardSupported","handleCancelOrSubmit","hasSelectedItem","currencyCode","enterGiftCardNumber","enterGiftCardPin","enterGiftCardExp","removeGiftCard","applyGiftCard","giftCardTypes","getGiftCardTypes","giftCardType","isPinRequired","IsPinRequired","isExpRequired","IsExpirationDateRequired","PaymentMethodId","getGiftCard","addGiftCard","additionalProperties","current","focus","findGiftcardTenderTypes","giftcardType","matchedTenderTypes","ConnectorId","noBalanceError","invalidCardInfoError","invalidCardTypeError","noCardPinError","noCardExpError","supportedGiftCardType","internalGiftcardTenderTypes","externalGiftcardTenderTypes","includes","month","year","getGiftCardAsync","activeGiftCard","emptyInputError","duplicatedCodeError","invalidCodeError","card","getLoyaltyAmount","requestFormData","query","pv","when","isDataReady","showAdditionalFields","shouldPayGiftCard","moduleClassName","checkoutGiftCardProps","showGiftCard","TitleCompoent","form","computed","PickUpAtStoreComponent","LineItemComponent","LineItemGroupComponent","lineItem","LineItemsComponent","itemsForSubscription","subscriptionHeader","OrderSummaryComponent","lines","loyalty","CheckoutView","canShow","checkoutProps","headerProps","hasSalesOrder","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","orderConfirmation","loading","guidedForm","orderSummary","placeOrderButton","keepShoppingButton","Module","isWine","isEvent","isGiftCard","EventDeliveryMode","AddCheckoutLoyalty","cardNumber","drawer","rewardPoints","loyaltyAmountContainer","appliedLoyaltyAmountContainer","loyaltyAmountLabel","loyaltyAmountInput","loyaltyAmountApplyButton","showAppliedAmount","loyaltyAmountAppliedText","loyaltyAmountAppliedPrice","loyaltyAmountRemoveButton","rewardPoint","checkoutLoyaltyRewardPoint","availablePointsText","activePoints","expiringPointsText","expiringPoints","ShowCheckoutLoyalty","coveredAmountText","amount","CheckoutLoyaltyView","checkoutLoyalty","showLoyalty","addLoyalty","isShowLoyalty","isShowAddLoyalty","EmailDeliveryComponent","LineItemGroupComponentWithMultiplePickUp","LineItemComponentWithMultiplePickUp","PickUpAtStoreComponentWithMultiplePickUp","otherCharge","termsAndConditionsProps","termsAndConditions","Checkout","isValidationPassed","handleCheckoutHeadingChange","checkoutHeading","cartStatus","isEmptyCart","getSlotItems","onPlaceOrder","checkoutOutOfStockErrorMessage","invalidCartVersionErrorMessage","isOverMaxQuantity","hasOrderConfirmation","updateCartLineEmailAddress","placeOrder","emailDeliveryCartLines","lineDeliverySpecifications","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","ElectronicDeliveryEmailAddress","newGuestCheckoutEmail","updateLineDeliverySpecificationsAsync","updatedCart","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","productInventoryInformation","productInventory","ProductAvailableQuantity","IsProductAvailable","getActiveChildModuleStates","onContainerReady","redirectToCartPage","notFoundEditCartLinkMessage","editCartLink","assign","validateForCheckout","retry","isOrderQuantityLimitsFeatureEnabledInHq","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","validateForCheckoutAsync","ValidationFailuresByCartLines","refreshError","isEditorialMode","params","isEditor","isTermsAndConditionAccepted","isCartReady","disableGuidedCheckoutFlow","placeOrderText","confirmPaymentText","cookieConsentRequiredMessage","checkoutClass","checkoutInformation","isConsentGiven","cookies","isMobile","device","BackToShopping","backToShoppingAttributes","checkoutBtnText","renderMsdyn365Text","AlertComponent","GuidedFormComponent","resource","getOrderSummary","PlaceOrderButtonComponent","canPlaceOrder","balanceCheckButton","GiftCardBalanceCheck","_isEnabled","_getFormattedPrice","_enterGiftCardNumber","_clearError","_enterGiftCardPin","_enterGiftCardExp","_setError","_applyGiftCard","_getGiftCardTypes","_getGiftCard","_findGiftcardTenderTypes","giftCardBalanceCheckProps","CheckoutAlert","subscriptionLineItems","subscriptions","nonSubscriptionItems","subscriptionItems","subLine","SUBCRIPTION_LINE","Heading","loyaltyLabel","giftcardLabel","showLineItems","orderSummaryProps","CheckoutGuidedCard","editButtonRef","formCardRef","renderFooder","isVisted","isSubmitting","hasControlGroup","saveAndContinueBtnLabel","canSubmit","canCancel","focusOnFirstFocusableElement","node","ReactDOM","findDOMNode","child","querySelector","focusOnEditButton","scrollToTitle","formCard","scrollIntoView","getTitle","headingTag","Tag","componentDidUpdate","prevProps","isActive","onNext","isExpanded","children","changeBtnLabel","canEdit","active","expanded","closed","visted","hidden","initialized","ready","pending","updating","innerRef","CheckoutGuidedForm","currentStep","getEnabledModules","getStep","getId","getHeading","_emitAnalyticsEvent","GuidedCard","subFrequency","getSubscriptionValues","frequency","isSubscription","CheckoutPlaceOrderButton","isBusy","setIsBusy","findCreditCardType","cardTypes","cardType","CardTypeValue","maskNumFrom","NumberFrom","maskNumTo","NumberTo","maskLength","cardSubStr","getCardTypesAsync","isWineClubCheckout","_setWineClubDeliveryOption","orderConfirmationLinkOverride","orderConfirmationOverride","orderedProducts","redirect","overrideConfirmationLink","orderConfirmationUrl","separator","url","updateSalesOrder","newSalesOrder","newOrderedProducts","_setDefaultSubscriptionFields","wineClub","wineClubSetup","ids","club","variants","variant","itemId","_navigateToCart","_isCartValidAsClub","lineFind","_clubItemIds","clubItemId","deliveryOptionInput","wineClubDeliveryOption","cartChanges","SUBSCRIPTION_NAME","SUBSCRIPTION_DEFAULT_NAME","SUBSCRIPTION_FREQUENCY","defaultSubscriptionFrequencyId","updateSubscription","cartItem","group","nonSubscriptionHeader","From","SelectedGiftCard","GiftCardList","AddResource","ShowResource","CheckoutGiftCardView","mixModeCartError","payload","TelemetryEvent","Purchase","otherCharges","otherChargeLabel","Form","Item","GiftCardBalanceCheckView","AdressInput","max","ariaValueMax","ariaValueMin","ariaValueNow","onBlur","CheckoutLoyaltyLabel","htmlFor","CheckoutLoyaltyText","CheckoutLoyalty","loyaltyCard","CardNumber","updateLoyaltyCardId","shouldPayLoyalty","_dialogToggleRef","_applyLoyaltyPoints","bind","_removeLoyaltyPoints","_onBlur","dollarsApplied","maxDollars","isFetchingLoyaltyCard","loyaltyTransactionEstimation","MaxCurrencyValueOfLoyaltyPoints","_updateEstimate","_updateLoyalty","loyaltyHeadingText","TextComponent","loyaltyCoveredAmountText","Drawer","toggleButtonText","_drawerHeader","openGlyph","closeGlyph","glyphPlacement","RewardPoints","points","_renderPointSection","availablePointsLabel","expiringLoyaltyPointsLabel","LabelComponent","payWithLoyaltyAmountLabel","InputComponent","applyCheckoutLoyaltyPaymentText","removeCheckoutLoyaltyPaymentText","point","RewardPointId","ActivePoints","PointsExpiringSoon","updateLoyaltyAmount","newAmount","parseFloat","num","element","document","getElementById","channelConfig","loyalPointsRequest","createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput","_query","callActionOrExecute","GetLoyaltyTransactionEstimationInput","newMaxPoints","commerceValues","newValue","changedProperty","findAndUpdateLine","updateAsync","GetCheckoutCartInput","isProductSubscribable","productAttributes","attr","SUBSCRIPTION_PRODUCT","BooleanValue","freq","ext","filterCartLines","output","subscriptionLines","clearSubscription","editObj","DeliveryOptionList","DeliveryOptionSelected","ErrorMessage","CheckoutDeliveryOptionsView","contentAction","etext","Save","SaveContinue","saveBtnAttributes","Cancel","cancelBtnAttributes","CheckoutChange","changeBtnAttributes","prodName","masterProductInput","SelectedVariantInput","channelId","getSelectedVariant","masterProduct","console"],"mappings":"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","file":"static/js/13.0c5306b97f6f108ab82c.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","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';","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\r\nimport { ICartIconViewProps } from './smwe-minicart';\r\n\r\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\r\n if (cartLines) {\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n \r\n {cartLine.cartline}\r\n {cartLine.storeLocation}\r\n {cartLine.remove}\r\n \r\n );\r\n });\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst CartIconView: React.FC = (props: ICartIconViewProps) => (\r\n \r\n {props.cartIcon}\r\n {props.FlyoutContainer ? (\r\n \r\n {props.flyoutTitle}\r\n \r\n {_renderCartlines(props.cartlines, props)}\r\n \r\n {props.totalPrice}\r\n {props.checkoutAsSignInUserButton}\r\n {props.goToCartButton}\r\n \r\n ) : false }\r\n \r\n);\r\n\r\nexport default CartIconView;","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","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport {\r\n IActionContext,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n Image,\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n CartLine,\r\n SalesLine\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { brandCodeParser } from '../Utilities/brand-code-parser';\r\nimport ProductType from '../Utilities/productType';\r\nimport { MasterProdDisplay } from './master-prod-display-name';\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs\r\n */\r\nexport interface ICartlineResourceString {\r\n /** Display string for discount label */\r\n discountStringText: string;\r\n /** String for size key */\r\n sizeString: string;\r\n /** String for color key */\r\n colorString: string;\r\n /** String associated with the configuration product dimension */\r\n configString: string;\r\n /** String for style key */\r\n styleString: string;\r\n /** Display string for quantity label */\r\n quantityDisplayString: string;\r\n /** Display string for quantity label */\r\n inputQuantityAriaLabel: string;\r\n}\r\n\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n product: SimpleProduct;\r\n}\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem\r\n */\r\nexport interface ICartLineProps extends IComponentProps {\r\n /** The flag to change the quantity component from interactible to static */\r\n disableQuantityInteractivity?: boolean;\r\n /** The primary image url */\r\n primaryImageUrl?: string;\r\n /** The product url */\r\n productUrl?: string;\r\n /** GridSettings for the product image in cartLine */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartLine */\r\n imageSettings: IImageSettings;\r\n /** Boolean flag to indicate if the item is out of stock */\r\n isOutOfStock?: boolean;\r\n /** Flag to make quantity section editable */\r\n isQuantityEditable?: boolean;\r\n /** Max quantity for line item */\r\n maxQuantity?: number;\r\n /** Current quantity for line item */\r\n currentQuantity?: number;\r\n /** Resource string for the component */\r\n resources: ICartlineResourceString;\r\n /** SalesLine flag */\r\n isSalesLine?: boolean;\r\n // Remove button coming from smwe-cartline\r\n // remove:string;\r\n remove?: React.ReactNode;\r\n /** Display images for on cart lines */\r\n showImages?: boolean;\r\n /** Has zero availability error? */\r\n zeroAvailabilityError?: boolean;\r\n cartState?: ICartState;\r\n cartLineErrors?: { [index: string]: boolean };\r\n /** Replaces discount code name with percent */\r\n showDiscountPercent?: boolean;\r\n /** Quantity onChange callback */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): void;\r\n cartLineOnChange?(ctx: IActionContext, cartState: ICartState | undefined, cartLine: CartLine): void;\r\n}\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nconst SmweCartLine: React.FC = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources, primaryImageUrl, showImages, gridSettings, imageSettings, zeroAvailabilityError } = props;\r\n const intlFormatter = props.context.cultureFormatter;\r\n const { product, cartLine } = props.data;\r\n const { inputQuantityAriaLabel } = props.resources;\r\n const _updateQuantity = (event: React.ChangeEvent) => {\r\n if (props.quantityOnChange) {\r\n props.quantityOnChange(\r\n props.data.cartLine,\r\n parseInt(event.target.value, 10)\r\n );\r\n }\r\n };\r\n\r\n const _generateMenu = (quantity: number) => {\r\n const nodes = [];\r\n\r\n for (let i = 1; i <= quantity; i++) {\r\n // tslint:disable-next-line:react-a11y-role-has-required-aria-props\r\n nodes.push(\r\n \r\n {i}\r\n \r\n );\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n const _generateSelectMenu = (\r\n quantity: number,\r\n currentQuantity: number | undefined\r\n ): JSX.Element => {\r\n const shouldDisableQty = props.data.product && props.data.product.ItemId?.toLowerCase() === props.context.request.channel?.GiftCardItemId?.toLowerCase();\r\n return (\r\n
\r\n \r\n {_generateMenu(quantity)}\r\n \r\n {props.remove}\r\n
\r\n );\r\n };\r\n\r\n const _generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n const priceAdjustmentSavings = _getPriceAdjustmentSavings();\r\n const productType = new ProductType();\r\n productType.check(cartLine.DeliveryMode, props.context);\r\n\r\n const isWineProduct = productType.isWineProduct();\r\n if (isWineProduct && props.isOutOfStock && !zeroAvailabilityError) {\r\n return null;\r\n }\r\n\r\n if (props.isQuantityEditable) {\r\n nodes.push(\r\n _generateSelectMenu(props.maxQuantity || 10, props.currentQuantity)\r\n );\r\n } else {\r\n nodes.push(\r\n
\r\n \r\n \r\n {props.data.cartLine.Quantity} {props.remove}\r\n \r\n
\r\n );\r\n }\r\n nodes.push(\r\n
\r\n
\r\n {props.data.cartLine.Price !== undefined\r\n ? intlFormatter.formatCurrency(props.data.cartLine.Price)\r\n : ''}\r\n {_getPriceAdjustmentPercent()}\r\n
\r\n {_getPriceDiscount()}\r\n
\r\n );\r\n nodes.push(\r\n
\r\n
\r\n \r\n
\r\n {isSalesLine\r\n ? props.data.cartLine.Price &&\r\n intlFormatter.formatCurrency(props.data.cartLine.Price)\r\n : props.data.cartLine.NetPrice === 0 ? intlFormatter.formatCurrency(0)\r\n : props.data.cartLine.NetPrice &&\r\n intlFormatter.formatCurrency(props.data.cartLine.NetPrice)}\r\n
\r\n {(props.data.cartLine.DiscountAmountWithoutTax &&\r\n props.data.cartLine.DiscountAmountWithoutTax > 0) ||\r\n (priceAdjustmentSavings &&\r\n priceAdjustmentSavings > 0)\r\n ? `Savings ${intlFormatter.formatCurrency(\r\n (props.data.cartLine.DiscountAmountWithoutTax || 0) + _getPriceAdjustmentSavings()\r\n )}`\r\n : null}\r\n
\r\n
\r\n
\r\n );\r\n return nodes;\r\n };\r\n\r\n const _getCartLineImage = (): JSX.Element | null => {\r\n if (showImages && primaryImageUrl) {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceAdjustmentPercent = (): JSX.Element | null => {\r\n if (props.data.product.Price && props.data.cartLine.Price && (props.data.cartLine.Price < props.data.product.Price)) {\r\n return {` (${(100 - ((props.data.cartLine.Price / props.data.product.Price) * 100)).toFixed(0)}% Off)`};\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceDiscount = (): string | null => {\r\n if (\r\n props.data.cartLine.DiscountAmountWithoutTax !== undefined &&\r\n props.data.cartLine.DiscountAmountWithoutTax !== 0 &&\r\n props.data.cartLine.Quantity &&\r\n props.data.cartLine.DiscountLines\r\n ) {\r\n if (props.showDiscountPercent && props.data.cartLine.NetPrice) {\r\n return `${((props.data.cartLine.DiscountAmountWithoutTax / props.data.cartLine.NetPrice) * 100).toFixed(0)}% off`;\r\n }\r\n return `${_doubleDiscounts()} ${props.data.cartLine.DiscountLines[0].DiscountCode}`;\r\n\r\n }\r\n return null;\r\n };\r\n\r\n enum GiftCardFieldType {\r\n Extension, Attribute\r\n }\r\n\r\n interface IGiftCardFields {\r\n Key: string;\r\n Type: GiftCardFieldType;\r\n StringValue: string;\r\n Required: boolean;\r\n isValid?: boolean;\r\n }\r\n\r\n interface IGiftCardFormObj {\r\n FirstName: IGiftCardFields;\r\n LastName: IGiftCardFields;\r\n ElectronicDeliveryEmail: IGiftCardFields;\r\n ElectronicDeliveryEmailContent: IGiftCardFields;\r\n }\r\n\r\n const giftCardFormObj: IGiftCardFormObj = {\r\n FirstName: {\r\n Key: 'FirstName',\r\n Type: GiftCardFieldType.Extension,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n LastName: {\r\n Key: 'LastName',\r\n Type: GiftCardFieldType.Extension,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n ElectronicDeliveryEmail: {\r\n Key: 'ElectronicDeliveryEmail',\r\n Type: GiftCardFieldType.Attribute,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n ElectronicDeliveryEmailContent: {\r\n Key: 'ElectronicDeliveryEmailContent',\r\n Type: GiftCardFieldType.Attribute,\r\n StringValue: '',\r\n Required: false\r\n },\r\n };\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n const _renderGiftCardPrompt = (): JSX.Element | null => {\r\n\r\n if (!props.data.cartLine.IsGiftCardLine) {\r\n return null;\r\n }\r\n\r\n const [giftCardFormField, setGiftCardFormField] = useState(giftCardFormObj);\r\n const [formFieldsDebounce, setFormFieldsDebounce] = useState('');\r\n\r\n const setFormFieldState = () => {\r\n const unhydratedCartLineLoad = { ...props.data.cartLine };\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Type === GiftCardFieldType.Extension) {\r\n unhydratedCartLineLoad.ExtensionProperties = unhydratedCartLineLoad.ExtensionProperties || [];\r\n const property = unhydratedCartLineLoad.ExtensionProperties.find((extension) => {\r\n return extension.Key?.toLowerCase() === fieldState.Key?.toLowerCase();\r\n });\r\n if (property) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [field]: {\r\n ...prevState[field],\r\n StringValue: property.Value?.StringValue\r\n }\r\n }));\r\n }\r\n } else if (fieldState.Type === GiftCardFieldType.Attribute) {\r\n const property = unhydratedCartLineLoad[fieldState.Key];\r\n if (property) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [fieldState.Key]: {\r\n ...prevState[fieldState.Key],\r\n StringValue: unhydratedCartLineLoad[fieldState.Key]\r\n }\r\n }));\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFormFieldToCartLine = () => {\r\n const unhydratedCartLineLoad = { ...props.data.cartLine };\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Type === GiftCardFieldType.Extension) {\r\n unhydratedCartLineLoad.ExtensionProperties = unhydratedCartLineLoad.ExtensionProperties || [];\r\n unhydratedCartLineLoad.ExtensionProperties.push({\r\n Key: fieldState.Key,\r\n Value: {\r\n StringValue: fieldState.StringValue\r\n }\r\n });\r\n } else if (fieldState.Type === GiftCardFieldType.Attribute) {\r\n unhydratedCartLineLoad[fieldState.Key] = giftCardFormField[fieldState.Key].StringValue;\r\n }\r\n });\r\n // Removing 'ItemTaxGroupId' from the object because now in new SSK its READONLY Attribute, can't be updated.\r\n delete (unhydratedCartLineLoad.ItemTaxGroupId);\r\n props.cartLineOnChange && props.cartLineOnChange(props.context.actionContext, props.cartState, unhydratedCartLineLoad);\r\n };\r\n\r\n const giftCardValidation = () => {\r\n let giftCardFormIsValid = true;\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Required) {\r\n if (fieldState.StringValue.trim() === '') {\r\n giftCardFormIsValid = false;\r\n fieldState.isValid = false;\r\n } else {\r\n fieldState.isValid = true;\r\n }\r\n\r\n if (fieldState.Key === 'ElectronicDeliveryEmail') {\r\n const validEmailRegex =\r\n RegExp(/^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i);\r\n if (!validEmailRegex.test(fieldState.StringValue)) {\r\n giftCardFormIsValid = false;\r\n fieldState.isValid = false;\r\n } else {\r\n fieldState.isValid = true;\r\n }\r\n }\r\n }\r\n });\r\n if (props.cartLineErrors) {\r\n if (giftCardFormIsValid) {\r\n props.cartLineErrors[props.data.cartLine.LineId!] = false;\r\n } else {\r\n props.cartLineErrors[props.data.cartLine.LineId!] = true;\r\n }\r\n }\r\n };\r\n\r\n // Setting the data from the cartline to State on load\r\n useEffect(() => {\r\n setFormFieldState();\r\n }, []);\r\n\r\n //Checking giftCard form validation\r\n useEffect(() => {\r\n giftCardValidation();\r\n }, [giftCardFormField]);\r\n\r\n // Updating formfield to cardLine\r\n useEffect(() => {\r\n const delayDebounceFn = setTimeout(() => {\r\n updateFormFieldToCartLine();\r\n }, 600);\r\n\r\n return () => clearTimeout(delayDebounceFn);\r\n }, [formFieldsDebounce]);\r\n\r\n const handleChange = (name: string) => (event: React.ChangeEvent) => {\r\n const value = event?.target.value;\r\n if (name) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [name]: {\r\n ...prevState[name],\r\n StringValue: value,\r\n },\r\n }));\r\n setFormFieldsDebounce(value);\r\n }\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n

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

\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n };\r\n\r\n const _getCartLineComment = (): JSX.Element | null => {\r\n const productType = new ProductType();\r\n productType.check(cartLine.DeliveryMode, props.context);\r\n if (productType.isWineProduct() && props.data.cartLine.Comment) {\r\n return (\r\n
\r\n {props.data.cartLine.Comment}\r\n
);\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceAdjustmentSavings = (): number => {\r\n if (props.data.product.Price && props.data.cartLine.Price && props.data.cartLine.NetPrice) {\r\n const priceUnadjusted = (props.data.cartLine.NetPrice / (props.data.cartLine.Price / props.data.product.Price));\r\n return (priceUnadjusted - props.data.cartLine.NetPrice);\r\n } else {\r\n return 0;\r\n }\r\n };\r\n\r\n const _doubleDiscounts = (): string => {\r\n if (_getPriceAdjustmentPercent()) {\r\n return '+ ';\r\n } else {\r\n return '';\r\n }\r\n };\r\n\r\n const brandCode = brandCodeParser({ description: product.Description, appContext: props.context });\r\n\r\n let jsxName = {product.Name};\r\n if (product.MasterProductId) {\r\n jsxName = ;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n {_getCartLineComment()}\r\n {_renderGiftCardPrompt()}\r\n
\r\n
\r\n );\r\n};\r\n\r\n// @ts-ignore\r\nexport default SmweCartLine;\r\n","\r\n/**\r\n * internal subscription name values to be used\r\n *\r\n * authors should not be exposed to these values\r\n */\r\nexport enum SubscriptionCommerceValues {\r\n\r\n /**\r\n * commerce attribute name\r\n */\r\n SUBSCRIPTION_NAME = 'Subscription Name',\r\n\r\n /**\r\n * commerce attribute name\r\n */\r\n SUBSCRIPTION_FREQUENCY = 'Frequency',\r\n\r\n /**\r\n * commerce line attribute for identifying is subscription\r\n */\r\n SUBCRIPTION_LINE = 'IsSubscription',\r\n\r\n SUBSCRIPTION_PRODUCT = 'Add to Subscription',\r\n\r\n SUBSCRIPTION_DEFAULT_NAME = 'My Wine Box'\r\n}","import { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\n\r\nexport interface IPickUpInStoreViewProps {\r\n callbacks: {\r\n toggleBopis(isBopisSelected: boolean): void;\r\n };\r\n defaultComponent?: React.ReactNode;\r\n orgUnitName?: string;\r\n isBopisSelected: boolean;\r\n ContainerProps: INodeProps;\r\n}\r\n\r\nexport interface IPickUpInStoreProps {\r\n cartline: CartLine;\r\n product: SimpleProduct;\r\n shipitText: string;\r\n pickUpInStoreText: string;\r\n changeStoreText: string;\r\n cartState: ICartState | undefined;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n orgUnitLocations?: OrgUnitLocation[] | undefined;\r\n deliveryOptions?: ProductDeliveryOptions;\r\n pickupDeliveryModeCode?: string;\r\n}\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\r\n const _onLocationChangedCallback = (orgUnitLocation: OrgUnitLocation, cartState: ICartState | undefined, cartline: CartLine) => {\r\n if(!cartState) {\r\n return Promise.resolve();\r\n }\r\n return cartState.updateCartLinePickupLocation({cartLineId: cartline.LineId!, location: orgUnitLocation})\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // do something\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n };\r\n\r\n const _toggleBOPIS = (isBopisSelected: boolean) => {\r\n const { storeSelectorStateManager, product, cartline, cartState } = props;\r\n\r\n if(isBopisSelected) {\r\n if(!storeSelectorStateManager) {\r\n return;\r\n }\r\n storeSelectorStateManager.openDialog({\r\n product,\r\n alreadySelectedLocation: {\r\n InventoryLocationId: cartline.FulfillmentStoreId\r\n },\r\n onLocationSelected: (orgUnitLocation) => {\r\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline);\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n } else {\r\n if(!cartState) {\r\n return;\r\n }\r\n cartline.DeliveryMode = '';\r\n cartline.FulfillmentStoreId = '';\r\n cartline.ShippingAddress = {};\r\n cartState.clearCartLinePickupLocation({cartLineId: cartline.LineId!})\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // do something\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n }\r\n };\r\n\r\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if(!orgUnitLocations || !fulfillmentStoreId || !(orgUnitLocations.length > 0)) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.InventoryLocationId === fulfillmentStoreId;\r\n });\r\n\r\n if(foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n } else {\r\n return fulfillmentStoreId;\r\n }\r\n };\r\n\r\n const _renderShippingMethod = (\r\n cartLine: CartLine,\r\n shipItText: string,\r\n pickupInStoretext: string,\r\n changeStoreText:string,\r\n orgUnitLocations: OrgUnitLocation[] | undefined):JSX.Element => {\r\n\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\r\n const bopisSelected = cartLine.FulfillmentStoreId ? true : false;\r\n\r\n return (\r\n // tslint:disable:react-this-binding-issue react-a11y-role-has-required-aria-props jsx-no-lambda\r\n <>\r\n \r\n \r\n {\r\n cartLine.FulfillmentStoreId ? (\r\n
\r\n {orgUnitName}\r\n \r\n
\r\n ) : null\r\n }\r\n \r\n );\r\n };\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (!props.deliveryOptions ||\r\n !props.deliveryOptions.DeliveryOptions ||\r\n !props.pickupDeliveryModeCode ||\r\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n callbacks: {\r\n toggleBopis: _toggleBOPIS\r\n },\r\n defaultComponent: _renderShippingMethod(props.cartline, props.shipitText, props.pickUpInStoreText, props.changeStoreText, props.orgUnitLocations),\r\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\r\n isBopisSelected: props.cartline.FulfillmentStoreId ? true : false,\r\n ContainerProps: {\r\n className: 'msc-cart-line__bopis-container'\r\n }\r\n };\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, format } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n AddToWishlistComponent,\r\n ICartlineResourceString,\r\n IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport {\r\n IActionContext,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageSettings,\r\n ITelemetry\r\n} from '@msdyn365-commerce/core';\r\nimport { BaseCartState, getCartState, GlobalStateInput, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n CommerceList,\r\n OrgUnitLocation,\r\n ProductAvailableQuantity,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport SmweCartLine from '../../../components/cartlineitem.component';\r\nimport ProductType from '../../../Utilities/productType';\r\nimport {\r\n IPickUpInStoreViewProps,\r\n PickUpInStore\r\n} from './smwe-cart-pick-up-in-store';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n mixedCart: { [index: string]: boolean };\r\n cartLineErrors: { [index: string]: boolean };\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: ProductAvailableQuantity[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n /** GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n outOfStockThreshold: number;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n showImages: boolean | undefined;\r\n invalidProductError: string;\r\n outOfStockError: string;\r\n zeroAvailabilityError: string;\r\n showDiscountPercent?: boolean;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(\r\n result: IWishlistActionSuccessResult,\r\n cartlineId: CartLine\r\n ): void;\r\n updateCartLinesQuantitySuccessHandler(\r\n cartline: CartLine,\r\n quantity: number\r\n ): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n}\r\n\r\nconst _getProduct = (\r\n productId: number | undefined,\r\n products: SimpleProduct[]\r\n): SimpleProduct | undefined => {\r\n if (productId !== undefined && products) {\r\n return products.find(product => {\r\n return productId === product.RecordId;\r\n });\r\n }\r\n return undefined;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxCartlineQuantity: number,\r\n isStockCheckEnabled: boolean,\r\n productAvailability?: ProductAvailableQuantity\r\n) => {\r\n if (isStockCheckEnabled) {\r\n if (\r\n !productAvailability ||\r\n !productAvailability.AvailableQuantity ||\r\n productAvailability.AvailableQuantity <= 0\r\n ) {\r\n return 0;\r\n }\r\n return productAvailability.AvailableQuantity;\r\n }\r\n\r\n return maxCartlineQuantity;\r\n};\r\n\r\nconst _updateCartLine = (ctx: IActionContext, cartState: ICartState, cartLine: CartLine): void => {\r\n if (ctx && cartState) {\r\n updateCartLinesAsync({ callerContext: ctx }, cartState.cart.Id, [cartLine])\r\n .then(cart => {\r\n const cartInput = new GlobalStateInput(\r\n 'CARTSTATE',\r\n BaseCartState,\r\n ctx.requestContext.apiSettings);\r\n getCartState(ctx).then(newCart => {\r\n ctx.update(cartInput, newCart);\r\n // tslint:disable-next-line: no-floating-promises\r\n void newCart.refreshCart({});\r\n }).catch(e => ctx.telemetry.exception(e));\r\n }).catch(e => ctx.telemetry.exception(e));\r\n }\r\n};\r\n\r\n// tslint:disable:max-func-body-length\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n zeroAvailabilityError: boolean,\r\n cartState: ICartState | undefined,\r\n foundProductAvailability?: ProductAvailableQuantity,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions,\r\n): ICartlinesViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n moveToWishlistSuccessHandler,\r\n addToWishlistButtonText,\r\n removeFromWishlistButtonText,\r\n wishlists,\r\n defaultWishlistName,\r\n cartLineErrors,\r\n showDiscountPercent\r\n } = props;\r\n\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n foundProductAvailability\r\n );\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist =\r\n wishlists && wishlists.length > 0 && wishlists[0].Name\r\n ? wishlists[0].Name\r\n : defaultWishlistName;\r\n\r\n const onRemoveClickHandler = (event: React.MouseEvent) => {\r\n removeItemClickHandler(cartline);\r\n };\r\n\r\n return {\r\n cartline: (\r\n \r\n }\r\n showImages={props.showImages}\r\n zeroAvailabilityError={zeroAvailabilityError}\r\n cartLineOnChange={_updateCartLine}\r\n cartState={cartState}\r\n cartLineErrors={cartLineErrors}\r\n showDiscountPercent={showDiscountPercent}\r\n />\r\n ),\r\n pickUpInStore: PickUpInStore({\r\n cartState: props.cartState,\r\n cartline: cartline,\r\n product: product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: foundProductDeliveryOptions,\r\n pickupDeliveryModeCode: props.pickupDeliveryModeCode\r\n }),\r\n remove: (\r\n \r\n {removeButtonText}\r\n \r\n ),\r\n addToWishlist: isAuthenticated ? (\r\n \r\n ) : (\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nconst _assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps,\r\n cartState: ICartState | undefined\r\n): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n return null;\r\n }\r\n\r\n const productTypeInit = new ProductType();\r\n\r\n cartlines.map(cartLine => {\r\n productTypeInit.check(cartLine?.DeliveryMode, props.context);\r\n });\r\n props.mixedCart.isMixedCart = productTypeInit.isMixedProduct();\r\n\r\n cartlines.map((cartline, index) => {\r\n const product = _getProduct(cartline.ProductId, products);\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find(\r\n productAvailability => {\r\n return productAvailability.ProductId! === cartline.ProductId;\r\n }\r\n );\r\n }\r\n let foundProductDeliveryOption;\r\n if (\r\n props.productDeliveryOptions &&\r\n props.productDeliveryOptions.length > 0\r\n ) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find(\r\n deliveryOption => {\r\n return (\r\n deliveryOption && deliveryOption.ProductId === cartline.ProductId\r\n );\r\n }\r\n );\r\n }\r\n\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n foundProductAvailability\r\n );\r\n\r\n let zeroAvailabilityError: boolean = false;\r\n const productType = new ProductType();\r\n productType.check(cartline?.DeliveryMode, props.context);\r\n\r\n // Check for zero availability\r\n if (productType.isWineProduct() && cartline.Quantity && (maxQuantity <= 0)) {\r\n cartline.Comment = props.zeroAvailabilityError;\r\n props.cartLineErrors[cartline.LineId!] = true;\r\n zeroAvailabilityError = true;\r\n\r\n // Check for insufficient availability\r\n } else if (productType.isWineProduct() && cartline.Quantity && (maxQuantity < cartline.Quantity)) {\r\n cartline.Comment = format(props.outOfStockError, maxQuantity);\r\n props.cartLineErrors[cartline.LineId!] = true;\r\n\r\n // Clear errors (except for gift cards -- gift cards must use the comment line for something else)\r\n } else if (cartline.ItemId?.toLowerCase() !== props.context.request.channel?.GiftCardItemId?.toLowerCase()) {\r\n cartline.Comment = '';\r\n props.cartLineErrors[cartline.LineId!] = false;\r\n }\r\n\r\n if (product) {\r\n reactNodes.push(\r\n _assembleNode(\r\n cartline,\r\n product,\r\n props,\r\n index,\r\n zeroAvailabilityError,\r\n cartState,\r\n foundProductAvailability,\r\n foundProductDeliveryOption\r\n )\r\n );\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component\r\n */\r\n\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines, cartState } = props;\r\n return _assembleCartlines(cartlines, products, props, cartState);\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { Button, format } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n appliedPromoCodeSubheadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\nexport interface IPromoCodeComponent extends IComponent { }\r\n\r\nconst PromoCodeComponentActions = {\r\n};\r\n\r\ninterface IPromoCodeState {\r\n isCollapseOpen: boolean;\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent}\r\n */\r\nclass PromoCode extends React.PureComponent {\r\n\r\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\r\n super(props);\r\n this.state = {\r\n isCollapseOpen: false,\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n
\r\n
{this.props.promoCodeHeadingText}
\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n

{this.state.error}

\r\n {this._renderAppliedPromoCode(this.props)}\r\n
\r\n );\r\n }\r\n\r\n private _onInputChange = (e: React.ChangeEvent) => {\r\n const error = e.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: e.target.value, error: error,\r\n canApply: e.target.value ? true : false\r\n });\r\n };\r\n\r\n private _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart) {\r\n return;\r\n }\r\n const appliedPromo = this.state.promoCodeInputValue;\r\n\r\n cartState.addPromoCode({ promoCode: appliedPromo })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // show success text\r\n this.setState({ promoCodeInputValue: '', error: '', canApply: false});\r\n } else if (result.substatus === 'ALREADYADDED') {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n } else {\r\n this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n };\r\n\r\n private _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n return (\r\n // tslint:disable-next-line:react-this-binding-issue jsx-no-lambda\r\n
{e.preventDefault(); this._applyPromotion(cartState); }} className='msc-promo-code__form-container'>\r\n
\r\n \r\n { this._applyPromotion(cartState); }}\r\n disabled={!this.state.canApply}\r\n >\r\n {promoCodeApplyButtonText}\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n private _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const code = event.currentTarget.getAttribute('data-value') || '';\r\n cartState.removePromoCodes({\r\n promoCodes: [\r\n code\r\n ]\r\n })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n this.setState({ error: ''});\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText});\r\n });\r\n\r\n };\r\n private _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\r\n return;\r\n }\r\n let discountAmount = 0;\r\n for (const line of cartState.cart.CartLines) {\r\n if (line.DiscountLines) {\r\n for (const discountLine of line.DiscountLines) {\r\n if (discountLine.DiscountCode === code) {\r\n discountAmount += discountLine.DiscountCost!;\r\n }\r\n }\r\n }\r\n }\r\n return discountAmount * -1;\r\n };\r\n\r\n private _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\r\n return;\r\n }\r\n return (\r\n
\r\n
{this.props.appliedPromoCodeHeadingText}
\r\n
{this.props.appliedPromoCodeSubheadingText}
\r\n
\r\n {\r\n props.cart.cart.Coupons.map((coupon: Coupon) => {\r\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\r\n return (\r\n
\r\n
\r\n {coupon.Code}\r\n \r\n {this._calculateDiscount(coupon.Code || '', props.cart) === 0\r\n ? null\r\n : <>\r\n (\r\n \r\n )\r\n \r\n }\r\n \r\n
\r\n {this._removePromotion(props.cart, event);}}\r\n data-value={coupon.Code}\r\n aria-label={ariaLabel}\r\n >\r\n {props.removePromoText}\r\n \r\n
\r\n );\r\n })\r\n }\r\n
\r\n
\r\n );\r\n };\r\n}\r\n\r\n// @ts-ignore\r\nexport const PromoCodeComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\r\n 'PromoCode',\r\n { component: PromoCode, ...PromoCodeComponentActions }\r\n);","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport classnames from 'classnames';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\n\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Waiting } from '@msdyn365-commerce-modules/utilities';\r\nimport { IWishlistActionSuccessResult } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IDictionary, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { publish } from '../../Utilities/analytics/analytics-dispatcher';\r\nimport { getAttributesForCart, IAttributeBank } from '../../Utilities/get-product-attributes';\r\nimport { isLineSubscriptionLine } from '../../Utilities/subscription-manager';\r\n\r\nimport { CartLineItems, ICartlinesViewProps } from './components/smwe-cart-line-items';\r\nimport { PromoCodeComponent } from './components/smwe-promo-code';\r\nimport { ISmweCartData } from './smwe-cart.data';\r\nimport { ISmweCartProps } from './smwe-cart.props.autogenerated';\r\n\r\nexport interface ICartViewProps extends ISmweCartProps {\r\n className: string;\r\n title?: React.ReactNode;\r\n CartlinesWrapper: INodeProps;\r\n cartlines?: ICartlinesViewProps[];\r\n cart: ICartState | undefined;\r\n orderSummaryHeading: React.ReactNode;\r\n orderSummaryLineitems?: IOrderSummaryLines;\r\n OrderSummaryWrapper: INodeProps;\r\n OrderSummaryItems: INodeProps;\r\n checkoutAsGuestButton: React.ReactNode;\r\n checkoutAsSignInUserButton: React.ReactNode;\r\n storeSelector?: React.ReactNode;\r\n backToShoppingButton: React.ReactNode;\r\n waitingComponent: React.ReactNode;\r\n promoCode: React.ReactNode;\r\n cartLoadingStatus: string;\r\n cartDataResult: boolean;\r\n\r\n checkoutButtonDisabled: React.ReactNode;\r\n cartLineStatus: IDictionary;\r\n mixedCart: IDictionary;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n}\r\n\r\n/**\r\n *\r\n * Cart component\r\n * @extends {React.Component>}\r\n */\r\n@observer\r\nclass Cart extends React.Component> {\r\n\r\n private cartLinesInvalid: IDictionary = {};\r\n private mixedCart: IDictionary = {};\r\n\r\n private parsedProductAttributes: IAttributeBank = {};\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n public componentDidMount(): void {\r\n const { cart, products } = this.props.data;\r\n\r\n // Wait for all data to load (except attributes, which rely on product IDs)\r\n Promise.all([cart, products]).then(() => {\r\n\r\n // Fetch attributes, then generate the checkout event\r\n this._setProductAttributes().then(() => {\r\n this._generateCheckoutAnalyticsEvent(cart.result!, products.result!);\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n // tslint:disable-next-line:cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists }\r\n },\r\n context: {\r\n request: {\r\n user: {\r\n isAuthenticated,\r\n signInUrl\r\n },\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n },\r\n app: {\r\n routes\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n // Routes link is unable to choose a non-static page, so override is needed for now\r\n const backToShoppingUrlOverride = this.props.config.backToShoppingOverride?.destinationUrl;\r\n const backToShoppingUrl = backToShoppingUrlOverride || routes.backToShopping?.destinationUrl || getUrlSync('home', this.props.context.actionContext) || '';\r\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n\r\n const viewProps = {\r\n ...this.props,\r\n className: classnames('ms-cart'),\r\n title:

{resources.cartTitle}

,\r\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\r\n OrderSummaryWrapper: { className: 'msc-order-summary-wrapper' },\r\n OrderSummaryItems: { className: 'msc-order-summary__items' },\r\n cartlines: this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\r\n (\r\n CartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n cartLineErrors: this.cartLinesInvalid,\r\n mixedCart: this.mixedCart,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\r\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 10,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: 'asd',\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges,\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n showImages: this.props.config.showImages,\r\n invalidProductError: this.props.resources.invalidProductError,\r\n outOfStockError: this.props.resources.outOfStockError,\r\n zeroAvailabilityError: this.props.resources.zeroAvailabilityError,\r\n showDiscountPercent: this.props.config.showDiscountPercent\r\n })\r\n ) : undefined,\r\n promoCode: cart && (\r\n \r\n ),\r\n\r\n cart: this.props.data.cart.result,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry: this.props.telemetry,\r\n id: this.props.id,\r\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\r\n orderSummaryHeading: this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\r\n (\r\n

{resources.orderSummaryTitle}

\r\n ) : null,\r\n orderSummaryLineitems: cart && cart.cart && channelConfiguration && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\r\n (\r\n OrderSummary({\r\n cart: cart.cart,\r\n subTotalLabel: resources.itemsWithCountLabel,\r\n shippingLabel: resources.estimatedShippingLabel,\r\n taxLabel: resources.estimatedTaxLabel,\r\n orderTotalLabel: resources.orderTotal,\r\n totalDiscountsLabel: resources.totalDiscountsLabel,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n toBeCalculatedText: resources.yetToBeCalculatedText,\r\n freeText: resources.priceFree,\r\n channelConfiguration: channelConfiguration,\r\n telemetry: telemetry\r\n })\r\n ) :\r\n (\r\n undefined\r\n ),\r\n checkoutAsSignInUserButton: (!isCartEmpty) ?\r\n (\r\n \r\n ) : null,\r\n checkoutAsGuestButton: (!isCartEmpty && !isAuthenticated) ?\r\n (\r\n \r\n ) : null,\r\n backToShoppingButton: ,\r\n storeSelector: this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n waitingComponent: ,\r\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\r\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\r\n\r\n // DG: Additions to disable checkout button if an error is detected\r\n checkoutButtonDisabled: (\r\n \r\n ),\r\n cartLineStatus: this.cartLinesInvalid,\r\n mixedCart: this.mixedCart\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\r\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n // tslint:disable-next-line: no-typeof-undefined\r\n if ((typeof window !== 'undefined') && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${signInUrl.indexOf('?') === -1 ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n };\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n\r\n if (this.props.data.cart.result) {\r\n this._generateRemovalAnalyticsEvent(cartlineToRemove);\r\n\r\n delete this.cartLinesInvalid[cartlineToRemove.LineId!.toString()];\r\n\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input)\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _generateRemovalAnalyticsEvent(cartlineToRemove: CartLine): void {\r\n const productID = cartlineToRemove.ProductId;\r\n if (!productID) {\r\n return;\r\n }\r\n\r\n const product = this.props.data.products.result?.find(entry => entry.RecordId === productID);\r\n const attributes = this.parsedProductAttributes[productID];\r\n\r\n publish('removeFromCart', {\r\n product,\r\n quantity: cartlineToRemove.Quantity,\r\n attributes,\r\n subscription: isLineSubscriptionLine(cartlineToRemove),\r\n context: this.props.context\r\n });\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _generateCheckoutAnalyticsEvent(cart: ICartState, products: SimpleProduct[]): void {\r\n\r\n // Convert to the format the analytics module requires\r\n const mappedProducts = cart.cart.CartLines?.map(line => {\r\n const product = products.find(entry => entry.RecordId === line.ProductId);\r\n\r\n return {\r\n product,\r\n quantity: line.Quantity,\r\n attributes: this.parsedProductAttributes[line.ProductId!],\r\n subscription: isLineSubscriptionLine(line),\r\n discounts: line.DiscountLines,\r\n context: this.props.context,\r\n };\r\n });\r\n\r\n publish('checkout', {\r\n step: 0, // We're counting the cart page as step 0\r\n products: mappedProducts,\r\n coupon: cart.cart.Coupons?.map(coupon => coupon.Code).join(','),\r\n });\r\n }\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n };\r\n\r\n private async _setProductAttributes(): Promise {\r\n const cart = this.props.data.cart?.result?.cart;\r\n if (cart && cart.CartLines) {\r\n this.parsedProductAttributes = await getAttributesForCart(cart?.CartLines, this.props.context.actionContext);\r\n }\r\n }\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number) => {\r\n if (this.props.data.cart.result) {\r\n delete this.cartLinesInvalid[cartlineToUpdate.LineId!.toString()];\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n };\r\n}\r\n\r\nexport default Cart;\r\n","/*---------------------------------------------------------------------------------------------\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;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, OrgUnitLocation, ProductAvailableQuantity, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\n\r\nexport interface IFlyoutCartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: ProductAvailableQuantity[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n /** GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName:string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n maxCartlineQuantity: number;\r\n\r\n outOfStockThreshold: number;\r\n isStockCheckEnabled: boolean;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n updateItemClickHandler(cartlineToUpdate: CartLine, newQuantity: number): void;\r\n}\r\n\r\nexport interface IFlyoutCartLineItemViewProps {\r\n cartline: React.ReactNode;\r\n remove: React.ReactNode;\r\n storeLocation: React.ReactNode;\r\n hasError: boolean;\r\n\r\n data: {\r\n product: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getProduct = (productId: number | undefined, products: SimpleProduct[]): SimpleProduct | undefined => {\r\n if (productId !== undefined && products) {\r\n return products.find(product => {\r\n return productId === product.RecordId;\r\n });\r\n }\r\n return undefined;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (outOfStockThreshold: number, maxCartlineQuantity: number, isStockCheckEnabled: boolean, productAvailability?: ProductAvailableQuantity) => {\r\n if(isStockCheckEnabled) {\r\n if(!productAvailability || !productAvailability.AvailableQuantity || productAvailability.AvailableQuantity <= 0 || productAvailability.AvailableQuantity <= outOfStockThreshold) {\r\n return 0;\r\n }\r\n return productAvailability.AvailableQuantity - outOfStockThreshold;\r\n }\r\n\r\n return maxCartlineQuantity;\r\n};\r\n\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props:IFlyoutCartLineItemsProps,\r\n index:number,\r\n foundProductAvailability?:ProductAvailableQuantity,\r\n foundProductDeliveryOptions?:ProductDeliveryOptions):IFlyoutCartLineItemViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n updateItemClickHandler,\r\n } = props;\r\n\r\n const maxQuantity = _getCartItemMaxQuantity(props.outOfStockThreshold, props.maxCartlineQuantity, props.isStockCheckEnabled, foundProductAvailability);\r\n\r\n const onRemoveClickHandler = (event: React.MouseEvent) => { removeItemClickHandler(cartline); };\r\n\r\n return {\r\n data: {\r\n product: product,\r\n cartline: cartline\r\n },\r\n hasError: props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\r\n cartline: (\r\n ),\r\n remove: (\r\n \r\n {removeButtonText}\r\n \r\n ),\r\n storeLocation: (\r\n _renderStoreLocation(cartline, props)\r\n )\r\n };\r\n};\r\n\r\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\r\n if(cartLine && cartLine.FulfillmentStoreId) {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\r\n\r\n if(orgUnitName) {\r\n return (\r\n

\r\n {orgUnitName}\r\n
\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if(!orgUnitLocations || !fulfillmentStoreId || !(orgUnitLocations.length > 0)) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if(foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n } else {\r\n return fulfillmentStoreId;\r\n }\r\n};\r\n\r\nconst _assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: IFlyoutCartLineItemsProps):IFlyoutCartLineItemViewProps[] | null => {\r\n const reactNodes:IFlyoutCartLineItemViewProps[] = [];\r\n\r\n if(!products || products.length === 0) {\r\n return null;\r\n }\r\n\r\n cartlines.map((cartline, index) => {\r\n const product = _getProduct(cartline.ProductId, products);\r\n let foundProductAvailability;\r\n if(props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\r\n return productAvailability.ProductId! === cartline.ProductId;\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if(props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n if(product) {\r\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component\r\n */\r\n\r\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return (\r\n _assembleCartlines(cartlines, products, props)\r\n );\r\n};","/* tslint:disable: no-duplicate-imports */\r\nimport { ActiveCartProductsInput, getActiveCartProductsAction, getDeliveryOptionsForCartLineItems, ProductDeliveryOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { getCartState } from '@msdyn365-commerce/global-state';\r\nimport { ProductAvailableQuantity, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getOrgUnitConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/OrgUnitsDataActions.g';\r\nimport { getEstimatedAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n/**\r\n * IMiniCartData entity interface.\r\n */\r\nexport interface IMiniCartData {\r\n products?: SimpleProduct[];\r\n productAvailabilites?: ProductAvailableQuantity[];\r\n deliveryOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\nexport const createInput = () => {\r\n return new ActiveCartProductsInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a mini cart data\r\n */\r\nexport async function getMiniCartData(ctx: IActionContext): Promise {\r\n const miniCartData: IMiniCartData = {};\r\n\r\n const cartState = await getCartState(ctx);\r\n const cart = cartState.cart;\r\n const channelConfiguration = await getOrgUnitConfigurationAsync({ callerContext: ctx });\r\n const productItems = [];\r\n\r\n // If there are cart lines, make call to get products\r\n if (cart && cart.CartLines && cart.CartLines.length) {\r\n await getActiveCartProductsAction(\r\n new ActiveCartProductsInput(),\r\n ctx\r\n )\r\n .then(products => {\r\n if (products) {\r\n miniCartData.products = products;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n\r\n if (cart.Id && channelConfiguration) {\r\n for (const cartLine of cart.CartLines) {\r\n if (cartLine.DeliveryMode !== channelConfiguration.PickupDeliveryModeCode) {\r\n productItems.push(cartLine);\r\n }\r\n }\r\n }\r\n if (productItems && productItems.length > 0) {\r\n const productAvailabilites = await getEstimatedAvailabilityAsync({ callerContext: ctx }, { ProductIds: productItems.map(x => x.ProductId || 0), DefaultWarehouseOnly: true });\r\n miniCartData.productAvailabilites = productAvailabilites.ProductWarehouseInventoryAvailabilities?.map((product) => { return { ProductId: product.ProductId, AvailableQuantity: product.PhysicalAvailable }; });\r\n } else {\r\n miniCartData.productAvailabilites = [];\r\n }\r\n\r\n await getDeliveryOptionsForCartLineItems(\r\n new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings),\r\n ctx\r\n )\r\n .then(deliveryOptions => {\r\n if (deliveryOptions) {\r\n miniCartData.deliveryOptions = deliveryOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n }\r\n\r\n return miniCartData;\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { Button, INodeProps, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\r\nimport { CartIconComponent } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { CartLine, OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport {reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\r\nimport { ISmweMinicartData } from './smwe-minicart.data';\r\nimport { ISmweMinicartProps } from './smwe-minicart.props.autogenerated';\r\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\r\n\r\nexport interface IMiniCartState {\r\n miniCartData: IMiniCartData;\r\n orgUnitLocations?: OrgUnitLocation[];\r\n}\r\n\r\nexport interface ICartIconViewProps extends ISmweMinicartProps {\r\n className: string;\r\n cartIcon: React.ReactNode;\r\n\r\n FlyoutContainer?: INodeProps;\r\n\r\n CartlinesWrapper: INodeProps;\r\n miniCartWrapper: INodeProps;\r\n miniCartItemWrapper: INodeProps;\r\n cartlines?: IFlyoutCartLineItemViewProps[];\r\n flyoutTitle: React.ReactNode;\r\n totalPrice: React.ReactNode;\r\n\r\n checkoutAsGuestButton?: React.ReactNode;\r\n checkoutAsSignInUserButton?: React.ReactNode;\r\n goToCartButton?: React.ReactNode;\r\n waitingComponent?: React.ReactNode;\r\n\r\n isCartLoading: boolean;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n updateItemClickHandler(cartlineToUpdate: CartLine, newQuantity: number): void;\r\n}\r\n\r\n/**\r\n *\r\n * Cart component\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass MiniCart extends React.Component, IMiniCartState> {\r\n constructor(props: ISmweMinicartProps) {\r\n super(props);\r\n this.state = { miniCartData: {} };\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n const context = this.props.context.actionContext;\r\n this.setState({\r\n miniCartData: await getMiniCartData(context)\r\n });\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n this.setState({\r\n miniCartData: await getMiniCartData(context)\r\n });\r\n }\r\n );\r\n\r\n this.setState({\r\n orgUnitLocations: this.props.data.orgUnitLocations.result\r\n });\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n config: {\r\n enableHoverCart\r\n },\r\n context: {\r\n request: {\r\n user: {\r\n isAuthenticated,\r\n signInUrl\r\n }\r\n }\r\n },\r\n context,\r\n resources\r\n } = this.props;\r\n const cart = this.props.data?.cart?.result || undefined;\r\n\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\r\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n const cartLines = this._getCartLines();\r\n const hasErrors = cartLines ? cartLines.some(cartline => cartline.hasError) : false;\r\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\r\n const cartSize = cart && cart.cart.TotalItems || 0;\r\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', cartSize.toString());\r\n const flyoutTitle = resources.flyoutTitle;\r\n const price = cart && cart.cart.TotalAmount || undefined;\r\n const priceString = price ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price)) : '';\r\n\r\n const viewProps = {\r\n ...this.props,\r\n cartIcon: cart && (\r\n \r\n ),\r\n cartlines: cartLines,\r\n FlyoutContainer: includeFlyout ? {\r\n tag: UncontrolledTooltip,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__flyout-container',\r\n trigger: 'hover focus',\r\n displayMode: 'FLYOUT',\r\n target: id\r\n } : undefined,\r\n CartlinesWrapper: {\r\n className: 'ms-cart-icon__cart-lines'\r\n },\r\n miniCartWrapper: {\r\n className: classnames('ms-cart-icon'),\r\n id: this.props.id\r\n },\r\n miniCartItemWrapper: {\r\n className: classnames('msc-cart-lines-item')\r\n },\r\n checkoutAsSignInUserButton: (!isCartEmpty) ?\r\n (\r\n \r\n ) : null,\r\n checkoutAsGuestButton: (!isCartEmpty && !isAuthenticated) ?\r\n (\r\n \r\n ) : null,\r\n goToCartButton:\r\n (\r\n \r\n ),\r\n flyoutTitle:\r\n (\r\n {flyoutTitle}\r\n ),\r\n totalPrice:\r\n (\r\n
{priceString}
\r\n )\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\r\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n\r\n // tslint:disable-next-line:no-typeof-undefined\r\n if (typeof window !== 'undefined' && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${signInUrl.indexOf('?') === -1 ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\r\n const {\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources\r\n } = this.props;\r\n const cart = this.props.data?.cart?.result || undefined;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\r\n (\r\n FlyoutCartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n products: this.state.miniCartData.products,\r\n productAvailabilites: this.state.miniCartData.productAvailabilites,\r\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\r\n imageSettings: imageSettings,\r\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 10,\r\n isStockCheckEnabled: true,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: '', // not used\r\n discountStringText: '', // not used\r\n\r\n originalPriceText: '',\r\n currentPriceText: '',\r\n shippingChargesText: ''\r\n },\r\n telemetry: telemetry,\r\n removeButtonText: resources.removeCartButtonText,\r\n outOfStockText: '', // not used\r\n outOfRangeOneText: '', // not used\r\n outOfRangeFormatText: '', // not used\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.state.orgUnitLocations,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n updateItemClickHandler: this._updateItemFromCartHandler,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n })\r\n ) : null;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n };\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input)\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n private _updateItemFromCartHandler = (cartlineToUpdate: CartLine, newQuantity: number) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: newQuantity\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line');\r\n });\r\n }\r\n };\r\n}\r\n\r\nexport default MiniCart;\r\n","import { ICoreContext } from '@msdyn365-commerce/core-internal';\r\ninterface IBrandCodeProps {\r\n description?: string;\r\n appContext: ICoreContext<{\r\n // any is just matching the types here.\r\n // tslint:disable-next-line: no-any\r\n [x: string]: any;\r\n }>;\r\n}\r\n\r\ntype BrandCodeTable = {\r\n brandName: string;\r\n brandCode: string;\r\n}[];\r\n\r\n/**\r\n * for converting a brand code to a brand name\r\n *\r\n */\r\nexport function brandCodeParser({ description, appContext }: IBrandCodeProps): string {\r\n\r\n // for mocking\r\n // const brandCodeTable: BrandCodeTable = [{ brandName: '14Hands', brandCode: 'FTH' }];\r\n\r\n const brandCodeTable = appContext.app.config.brandCodeTable as BrandCodeTable;\r\n\r\n // this is a safety check to ensure that brand code table does NOT crash in local or\r\n // if brand code table is somehow not connecting right to the global config. it will\r\n // essentially act as if there are no brand codes declared - keeping how everything\r\n // looks originally\r\n if (!brandCodeTable) { return ''; }\r\n\r\n // a brand code may and may only appear in the first three characters of a string\r\n // we are lowercasing in the off-chance that the authors type them differently between\r\n // the sources\r\n const currentBrandCode = description && description.slice(0, 3).toLowerCase();\r\n const brandFound = brandCodeTable.find(brand => brand.brandCode.toLowerCase() === currentBrandCode);\r\n if (brandFound) { return brandFound.brandName; }\r\n return '';\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IDictionary } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ICartlinesViewProps } from '../../../modules/smwe-cart/components/smwe-cart-line-items';\r\nimport { ICartViewProps } from '../../../modules/smwe-cart/smwe-cart';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean,\r\n itemsTitle: string,\r\n qtyTitle: string,\r\n unitPriceTitle: string,\r\n totalTitle: string\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus};\r\n }\r\n if (cartLines) {\r\n return (\r\n
\r\n
\r\n
{itemsTitle}
\r\n
{qtyTitle}
\r\n
{unitPriceTitle}
\r\n
{totalTitle}
\r\n
\r\n\r\n
    \r\n {cartLines.map((cartLine, index) => {\r\n return (\r\n
  • \r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n \r\n {cartLine.pickUpInStore.defaultComponent}\r\n \r\n ) : null}\r\n {cartLine.addToWishlist}\r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n );\r\n } else {\r\n return cartDataResult ? (\r\n
\r\n

{cartEmptyText}

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

{props.resources.conditionsText}

\r\n
\r\n );\r\n};\r\n\r\n// Detect invalid items in the cart. Items are flagged externally via the Comment field\r\nconst _isInvalidCart = (cartLinesInvalid: IDictionary): boolean => {\r\n\r\n for (const lineId of Object.keys(cartLinesInvalid)) {\r\n if (cartLinesInvalid[lineId]) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n//==================================================\r\n//==================================================\r\nconst CartView: React.FC = (props: ICartViewProps) => {\r\n const preventCheckout = _isInvalidCart(props.cartLineStatus);\r\n\r\n return (\r\n \r\n {props.title}\r\n \r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult,\r\n props.resources.itemsTitle,\r\n props.resources.qtyTitle,\r\n props.resources.unitPriceTitle,\r\n props.resources.totalTitle\r\n )}\r\n \r\n {props.orderSummaryHeading && (\r\n \r\n {props.orderSummaryHeading}\r\n {_renderOrderSummarylines(\r\n props.orderSummaryLineitems,\r\n props.OrderSummaryItems,\r\n props\r\n )}\r\n \r\n {props.backToShoppingButton}\r\n {preventCheckout ? props.checkoutButtonDisabled : props.checkoutAsSignInUserButton}\r\n \r\n
\r\n {props.promoCode}\r\n
\r\n
\r\n )}\r\n {props.storeSelector}\r\n
\r\n);};\r\n\r\nexport default CartView;","/*---------------------------------------------------------------------------------------------\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);","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore } from './smwe-checkout';\r\n\r\nexport const PickUpAtStoreComponent: React.FC = ({ PickUpAtStore, label, location }) => (\r\n \r\n {label}\r\n {location}\r\n \r\n);\r\n\r\nexport const LineItemComponent: React.FC = ({ LineItem, item, pickUpAtStore }) => (\r\n \r\n {item}\r\n {pickUpAtStore && }\r\n \r\n);\r\n\r\nexport const LineItemGroupComponent: React.FC = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\r\n \r\n {heading}\r\n \r\n {lineItems.map(lineItem => (\r\n \r\n ))}\r\n \r\n \r\n);\r\n\r\nexport const LineItemsComponent: React.FC = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForSubscription, subscriptionHeader }) => (\r\n \r\n \r\n {heading}\r\n {editLink}\r\n \r\n {itemsForPickup && }\r\n {itemsForShip && }\r\n {itemsForSubscription && itemsForSubscription.length > 0 &&\r\n \r\n
{subscriptionHeader}
\r\n {itemsForSubscription.map(lineItem => (\r\n \r\n ))}\r\n
\r\n }\r\n
\r\n);\r\n\r\nconst OrderSummaryComponent: React.FC = ({ heading, lines }) => (\r\n
\r\n {heading}\r\n
\r\n {lines && (\r\n <>\r\n {lines.subtotal}\r\n {lines.shipping}\r\n {lines.tax}\r\n {lines.totalDiscounts}\r\n {lines.loyalty}\r\n {lines.giftCard}\r\n {lines.orderTotal}\r\n \r\n )}\r\n
\r\n
\r\n);\r\n\r\nconst CheckoutView: React.FC = props => {\r\n const {\r\n canShow,\r\n checkoutProps,\r\n headerProps,\r\n hasSalesOrder,\r\n bodyProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n sideControlFirstProps,\r\n sideControlSecondProps,\r\n orderConfirmation,\r\n loading,\r\n alert,\r\n title,\r\n guidedForm,\r\n orderSummary,\r\n lineItems,\r\n placeOrderButton,\r\n keepShoppingButton\r\n } = props;\r\n\r\n return (\r\n \r\n {!hasSalesOrder && {title} }\r\n {!hasSalesOrder &&\r\n \r\n {loading}\r\n {alert}\r\n {canShow && (\r\n <>\r\n \r\n {guidedForm}\r\n \r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n \r\n \r\n {orderSummary && }\r\n \r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n {lineItems && }\r\n \r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n \r\n \r\n )}\r\n \r\n }\r\n {hasSalesOrder && orderConfirmation}\r\n \r\n );\r\n};\r\n\r\nexport default CheckoutView;\r\n","import { ICoreContext } from '@msdyn365-commerce/core';\r\n\r\n/**\r\n * ProductType for checking product Type\r\n */\r\n// tslint:disable-next-line: no-unnecessary-class\r\nexport default class ProductType {\r\n public static EventDeliveryMode:string = '40.5';\r\n private isWine:boolean = false;\r\n private isEvent:boolean = false;\r\n private isGiftCard:boolean = false;\r\n\r\n // TODO: Temporary solution till we get better solution in checking product type in Cart\r\n public check(DeliveryMode: string | undefined | null, context?: ICoreContext):void {\r\n if (DeliveryMode && DeliveryMode === (context?.request.channel?.EmailDeliveryModeCode || '40')) {\r\n this.isGiftCard = true;\r\n } else if (DeliveryMode && DeliveryMode === ProductType.EventDeliveryMode) {\r\n this.isEvent = true;\r\n } else {\r\n this.isWine = true;\r\n }\r\n }\r\n\r\n public isWineProduct(): boolean {\r\n return this.isWine && !this.isEvent && !this.isGiftCard;\r\n }\r\n\r\n public isMixedProduct(): boolean {\r\n return Number(this.isWine) + Number(this.isEvent) + Number(this.isGiftCard) >= 2;\r\n }\r\n}\r\n","import 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 * as React from 'react';\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\n\nimport {\n ICheckoutLoyaltyAdd, ICheckoutLoyaltyRewardPoint, ICheckoutLoyaltyShow,\n ICheckoutLoyaltyViewProps\n} from './checkout-loyalty';\n\nconst AddCheckoutLoyalty: React.FC = ({\n heading,\n cardNumber,\n drawer,\n rewardPoints,\n loyaltyAmountContainer,\n appliedLoyaltyAmountContainer,\n loyaltyAmountLabel,\n loyaltyAmountInput,\n loyaltyAmountApplyButton,\n showAppliedAmount,\n loyaltyAmountAppliedText,\n loyaltyAmountAppliedPrice,\n loyaltyAmountRemoveButton,\n}) => {\n\n return (\n <>\n {heading}\n {cardNumber}\n \n {rewardPoints.map((rewardPoint: ICheckoutLoyaltyRewardPoint) => {\n return (\n \n {rewardPoint.title}\n {rewardPoint.availablePointsText}\n {rewardPoint.activePoints}\n {rewardPoint.expiringPointsText}\n {rewardPoint.expiringPoints}\n \n );\n })}\n \n \n {loyaltyAmountLabel}\n {loyaltyAmountInput}\n {loyaltyAmountApplyButton}\n {\n showAppliedAmount &&\n \n {loyaltyAmountAppliedText}\n {loyaltyAmountAppliedPrice}\n {loyaltyAmountRemoveButton}\n \n }\n \n \n );\n};\n\nconst ShowCheckoutLoyalty: React.FC = ({\n heading,\n coveredAmountText,\n amount,\n}) => {\n\n return (\n <>\n {heading}\n {coveredAmountText}\n {amount}\n \n );\n};\n\nconst CheckoutLoyaltyView: React.FC = props => {\n const { checkoutLoyalty,\n viewState,\n showLoyalty,\n addLoyalty } = props;\n\n return (\n \n {viewState.isShowLoyalty && }\n {viewState.isShowAddLoyalty && }\n \n );\n};\n\nexport default CheckoutLoyaltyView;","/*---------------------------------------------------------------------------------------------\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 { 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","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\ninterface IAlertProps {\r\n message: string;\r\n}\r\n\r\nconst CheckoutAlert: React.FC = ({ message }) => (\r\n

\r\n {message}\r\n

\r\n);\r\n\r\nexport default CheckoutAlert;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, Heading, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { CartLineItemComponent } from '../../../components/cartlineitem-variant.component';\r\nimport { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { CartLine, OrgUnitLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classnames from 'classnames';\r\nimport get from 'lodash/get';\r\nimport * as React from 'react';\r\nimport { SubscriptionCommerceValues } from '../../../common/subscription-commerce.values';\r\nimport { ISmweCheckoutData } from '../smwe-checkout.data';\r\nimport { ISmweCheckoutProps } from '../smwe-checkout.props.autogenerated';\r\n\r\ntype deliveryType = 'pickup' | 'ship';\r\n\r\nexport interface IPickUpAtStore {\r\n PickUpAtStore: INodeProps;\r\n label: React.ReactNode;\r\n location: React.ReactNode;\r\n}\r\n\r\nexport interface ILineItem {\r\n LineId: string;\r\n LineItem: INodeProps;\r\n item?: React.ReactNode;\r\n pickUpAtStore?: IPickUpAtStore;\r\n}\r\n\r\nexport interface ILineItemDeliveryGroup {\r\n LineItemDeliveryGroup: INodeProps;\r\n LineItemList: INodeProps;\r\n heading: React.ReactNode;\r\n lineItems: ILineItem[];\r\n}\r\n\r\nexport interface ILineItems {\r\n LineItems: INodeProps;\r\n Header: INodeProps;\r\n heading: React.ReactNode;\r\n editLink: React.ReactNode;\r\n itemsForPickup?: ILineItemDeliveryGroup;\r\n itemsForShip?: ILineItemDeliveryGroup;\r\n itemsForSubscription?: ILineItem[];\r\n subscriptionHeader?: string;\r\n}\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nexport const getLineItems = (input: ISmweCheckoutProps): ILineItems | undefined => {\r\n let subscriptionLineItems: ILineItem[] = [];\r\n\r\n const _getDeliveryLocation = (cartLine: CartLine): string => {\r\n const orgUnitLocations = get(input, 'data.orgUnitLocations.result');\r\n if (!cartLine.FulfillmentStoreId || !orgUnitLocations) {\r\n return '';\r\n }\r\n\r\n const locationMatch = (orgUnitLocations || []).find((location: OrgUnitLocation): boolean => {\r\n return location.OrgUnitNumber === cartLine.FulfillmentStoreId;\r\n });\r\n\r\n return locationMatch && locationMatch.OrgUnitName;\r\n };\r\n\r\n const _getProduct = (productId: number): SimpleProduct | undefined => {\r\n const products = get(input, 'data.products.result') || [];\r\n return products.find((_product: SimpleProduct) => {\r\n return productId === _product.RecordId;\r\n });\r\n };\r\n\r\n const _getLineItemComponent = (cartLine: CartLine): JSX.Element | undefined => {\r\n const product = cartLine.ProductId && _getProduct(cartLine.ProductId);\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n config: { imageSettings },\r\n resources: {\r\n quantityDisplayString,\r\n productDimensionTypeColor,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle,\r\n configString,\r\n inputQuantityAriaLabel,\r\n discountStringText,\r\n shippingCharges,\r\n },\r\n context: {\r\n request: { gridSettings }\r\n }\r\n } = input;\r\n\r\n if (!product) {\r\n return;\r\n }\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n const _getPickUpAtStoreComponents = (pickupDeliveryLocation: string): IPickUpAtStore => {\r\n const {\r\n resources: { pickUpAtStoreWithLocationText }\r\n } = input;\r\n\r\n return {\r\n PickUpAtStore: { className: 'ms-checkout__pick-up-at-store' },\r\n label: {pickUpAtStoreWithLocationText},\r\n location:
{pickupDeliveryLocation}
\r\n };\r\n };\r\n\r\n const _getLineItemsComponents = (items: CartLine[]): ILineItem[] => {\r\n const pickupDeliveryModeCode = get(input, 'context.request.channel.PickupDeliveryModeCode');\r\n return items.map(cartLine => {\r\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\r\n const isPickUp = cartLine.DeliveryMode === pickupDeliveryModeCode;\r\n return {\r\n LineId: cartLine.LineId || '',\r\n LineItem: { className: 'ms-checkout__line-item' },\r\n item: _getLineItemComponent(cartLine),\r\n pickUpAtStore: isPickUp ? _getPickUpAtStoreComponents(pickupDeliveryLocation) : undefined\r\n };\r\n });\r\n };\r\n\r\n const _getGroupTitleComponent = (count: number, type: deliveryType): string => {\r\n const {\r\n resources: {\r\n itemLabel,\r\n itemsLabel,\r\n inStorePickUpLabel,\r\n shippingCountCheckoutLineItem\r\n }\r\n } = input;\r\n\r\n const suffix = count > 1 ? itemsLabel : itemLabel;\r\n const title = type === 'ship' ? shippingCountCheckoutLineItem : inStorePickUpLabel;\r\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\r\n };\r\n\r\n const _countItems = (items: CartLine[]): number => {\r\n return items.reduce((count, item) => {\r\n return count + (item.Quantity || 0);\r\n // tslint:disable-next-line:align\r\n }, 0);\r\n };\r\n\r\n const _filterItemsByDiliveryType = (type: deliveryType): CartLine[] => {\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n const pickupDeliveryModeCode = get(input, 'context.request.channel.PickupDeliveryModeCode');\r\n return type === 'ship'\r\n ? cart.CartLines.filter((cartLine: CartLine) => cartLine.DeliveryMode !== pickupDeliveryModeCode)\r\n : cart.CartLines.filter((cartLine: CartLine) => cartLine.DeliveryMode === pickupDeliveryModeCode);\r\n };\r\n\r\n const _getLineItemsByDeliveryType = (type: deliveryType, subscriptions?: boolean): ILineItemDeliveryGroup | undefined => {\r\n const items = _filterItemsByDiliveryType(type);\r\n\r\n if (items.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const count = _countItems(items);\r\n const title = _getGroupTitleComponent(count, type);\r\n\r\n // separate out subscriptions from nonsubscriptions on checkout summary\r\n let nonSubscriptionItems: CartLine[] = [];\r\n const subscriptionItems: CartLine[] = [];\r\n const subLine = SubscriptionCommerceValues.SUBCRIPTION_LINE;\r\n items.forEach((item) => {\r\n const isSubscription = item.ExtensionProperties?.find(attribute => attribute.Key === subLine);\r\n if (isSubscription) {\r\n subscriptionItems.push(item);\r\n } else {\r\n nonSubscriptionItems.push(item);\r\n }\r\n });\r\n\r\n // fallback to complete list if no subscriptions found\r\n if (subscriptionItems.length === 0) {\r\n nonSubscriptionItems = items;\r\n } else {\r\n subscriptionLineItems =_getLineItemsComponents(subscriptionItems);\r\n }\r\n\r\n return {\r\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group', type) },\r\n LineItemList: { className: 'ms-checkout__line-items-list' },\r\n heading:
{title}
,\r\n lineItems: _getLineItemsComponents(nonSubscriptionItems)\r\n };\r\n };\r\n\r\n const _getLineItems = (): ILineItems | undefined => {\r\n const {\r\n context,\r\n config: { lineItemsHeading },\r\n data: { products },\r\n resources: { editCartText, subscriptionHeader }\r\n } = input;\r\n\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n\r\n if (!cart || !cart.CartLines || !cart.CartLines.length || !products) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n LineItems: { className: 'ms-checkout__line-items' },\r\n Header: { className: 'ms-checkout__line-items-header' },\r\n heading: lineItemsHeading && ,\r\n editLink: (\r\n \r\n {editCartText}\r\n \r\n ),\r\n itemsForPickup: _getLineItemsByDeliveryType('pickup'),\r\n itemsForShip: _getLineItemsByDeliveryType('ship'),\r\n itemsForSubscription: subscriptionLineItems,\r\n subscriptionHeader: subscriptionHeader\r\n };\r\n };\r\n\r\n return _getLineItems();\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Heading,INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport get from 'lodash/get';\r\nimport * as React from 'react';\r\nimport { ISmweCheckoutData } from '../smwe-checkout.data';\r\nimport { ISmweCheckoutProps } from '../smwe-checkout.props.autogenerated';\r\n\r\nexport interface IOrderSummary {\r\n orderSummaryProps: INodeProps;\r\n heading?: React.ReactNode;\r\n lines?: IOrderSummaryLines;\r\n}\r\nexport const getOrderSummary = (input: ISmweCheckoutProps): IOrderSummary => {\r\n const {\r\n config: { orderSummaryHeading },\r\n data: { checkout },\r\n resources: {\r\n subTotalLabel,\r\n shippingLabel,\r\n taxLabel,\r\n orderTotalLabel,\r\n loyaltyLabel,\r\n giftcardLabel,\r\n totalDiscountsLabel,\r\n freeText,\r\n toBeCalculatedText\r\n },\r\n context,\r\n typeName,\r\n id,\r\n telemetry\r\n } = input;\r\n\r\n const checkoutState = get(checkout, 'result');\r\n const cart = get(checkout, 'result.checkoutCart.cart');\r\n const showLineItems = cart.CartLines && cart.CartLines.length > 0;\r\n const channelConfiguration = context.request.channel!;\r\n\r\n return {\r\n orderSummaryProps: { className: 'ms-checkout-guest-profile__selected-item' },\r\n heading: orderSummaryHeading && ,\r\n lines: showLineItems\r\n ? OrderSummary({\r\n checkoutState,\r\n cart,\r\n subTotalLabel,\r\n shippingLabel,\r\n taxLabel,\r\n orderTotalLabel,\r\n loyaltyLabel,\r\n giftcardLabel,\r\n totalDiscountsLabel,\r\n freeText,\r\n toBeCalculatedText,\r\n context,\r\n typeName,\r\n id,\r\n channelConfiguration,\r\n telemetry\r\n })\r\n : undefined\r\n };\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/ //\r\nimport { Heading as HeadingType } from '@msdyn365-commerce-modules/data-types';\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport classname from 'classnames';\r\nimport * as React from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\nexport interface ICheckoutGuidedCardProps {\r\n step: number;\r\n title?: HeadingType;\r\n disabled?: boolean; // module is not available\r\n isActive?: boolean; // step === currentStep\r\n isVisted?: boolean; // step < currentStep\r\n isExpanded?: boolean;\r\n isReady?: boolean;\r\n isPending?: boolean;\r\n isUpdating?: boolean;\r\n isSubmitting?: boolean;\r\n isMobile?: boolean;\r\n hasInitialized?: boolean;\r\n hasControlGroup?: boolean;\r\n children: React.ReactNode;\r\n resource: {\r\n checkoutStepTitleFormat: string;\r\n saveBtnLabel: string;\r\n changeBtnLabel: string;\r\n cancelBtnLabel: string;\r\n saveAndContinueBtnLabel: string;\r\n };\r\n onEdit?(): void;\r\n onCancel?(): void;\r\n onSubmit?(): void;\r\n onNext(): void;\r\n}\r\n\r\n/**\r\n *\r\n * CheckoutGuidedCard component\r\n * @extends {React.PureComponent}\r\n */\r\nclass CheckoutGuidedCard extends React.PureComponent {\r\n private editButtonRef: React.RefObject = React.createRef();\r\n private formCardRef: React.RefObject = React.createRef();\r\n\r\n public componentDidUpdate(prevProps: ICheckoutGuidedCardProps): void {\r\n /**\r\n * Move to next step when current step is ready\r\n */\r\n const { isActive, isReady, onNext, isVisted, onEdit } = this.props;\r\n\r\n // Move to next step after completing the current step\r\n if (isActive && isReady) {\r\n onNext();\r\n }\r\n\r\n // Set the focus to Edit button once edit button appear\r\n // (It happens when current step switch to isReady status)\r\n const prevCanEdit = prevProps.isReady && prevProps.isVisted && !!prevProps.onEdit;\r\n const canEdit = isReady && isVisted && !!onEdit;\r\n if (!prevCanEdit && canEdit) {\r\n this.focusOnEditButton();\r\n this.scrollToTitle();\r\n }\r\n\r\n // Set the focus to the first focusable element\r\n // (It happens when current step switch to isUpdating status)\r\n if (prevProps.isReady && !isReady) {\r\n this.focusOnFirstFocusableElement();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n title,\r\n disabled,\r\n isExpanded,\r\n isActive,\r\n isVisted,\r\n children,\r\n isReady,\r\n isPending,\r\n isUpdating,\r\n hasInitialized,\r\n hasControlGroup,\r\n onEdit,\r\n resource\r\n } = this.props;\r\n const { changeBtnLabel } = resource;\r\n\r\n const canEdit = hasControlGroup && isReady && isVisted && onEdit;\r\n\r\n return (\r\n \r\n
\r\n {this.getTitle()}\r\n\r\n {canEdit && (\r\n \r\n {changeBtnLabel}\r\n \r\n )}\r\n
\r\n\r\n \r\n
{children}
\r\n\r\n {this.renderFooder()}\r\n
\r\n \r\n );\r\n }\r\n\r\n private renderFooder = (): JSX.Element | null => {\r\n const { isVisted, isReady, isSubmitting, hasControlGroup, onCancel, onSubmit, resource } = this.props;\r\n const { saveBtnLabel, cancelBtnLabel, saveAndContinueBtnLabel } = resource;\r\n\r\n const canSubmit = !isReady && onSubmit;\r\n const canCancel = !isReady && isVisted && onCancel;\r\n\r\n if (!hasControlGroup || (!canSubmit && !canCancel)) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {canSubmit && (\r\n \r\n {isVisted ? saveBtnLabel : saveAndContinueBtnLabel}\r\n \r\n )}\r\n {canCancel && (\r\n \r\n {cancelBtnLabel}\r\n \r\n )}\r\n
\r\n );\r\n };\r\n\r\n private focusOnFirstFocusableElement = (): void => {\r\n // eslint-disable-next-line react/no-find-dom-node\r\n const node = ReactDOM.findDOMNode(this) as HTMLElement;\r\n const focussableElements = `\r\n a:not([disabled]),\r\n button:not([disabled]),\r\n input[type=submit]:not([disabled]),\r\n input[type=checkbox]:not([disabled]),\r\n input[type=text]:not([disabled]),\r\n input[type=radio]:not([disabled]),\r\n input[type=password]:not([disabled]),\r\n select:not([disabled]),\r\n textarea:not([disabled]),\r\n [tabindex]:not([disabled]):not([tabindex=\"-1\"])\r\n `;\r\n\r\n const child = node && node.querySelector && (node.querySelector(focussableElements) as HTMLElement);\r\n child && child.focus && child.focus();\r\n };\r\n\r\n private focusOnEditButton = (): void => {\r\n // Focus on edit button\r\n const editButton =\r\n this.editButtonRef &&\r\n this.editButtonRef.current &&\r\n this.editButtonRef.current.focus &&\r\n (this.editButtonRef.current as HTMLElement);\r\n editButton && editButton.focus();\r\n };\r\n\r\n private scrollToTitle = (): void => {\r\n // scroll window to the title of the step that was just completed only in mobile viewport\r\n const formCard = this.props.isMobile && this.formCardRef && this.formCardRef.current && (this.formCardRef.current as HTMLElement);\r\n formCard && formCard.scrollIntoView();\r\n };\r\n\r\n private getTitle = (): JSX.Element => {\r\n const { step, title } = this.props;\r\n const { headingTag: Tag = 'h2', text = '' } = title || {};\r\n return (\r\n \r\n {step + 1}. \r\n {text && {text}}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport default CheckoutGuidedCard;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/ //\r\nimport get from 'lodash/get';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IModuleStateManager } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport { Heading } from '@msdyn365-commerce-modules/data-types';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { publish } from '../../../Utilities/analytics/analytics-dispatcher';\r\nimport { getAttributesForCart } from '../../../Utilities/get-product-attributes';\r\nimport { getSubscriptionValues, isLineSubscriptionLine } from '../../../Utilities/subscription-manager';\r\n\r\nimport GuidedCard from '../components/guided-card';\r\n\r\nexport interface ICheckoutGuidedFormProps {\r\n items: React.ReactNode[];\r\n moduleState: IModuleStateManager;\r\n disableGuidedCheckoutFlow?: boolean;\r\n isMobile?: boolean;\r\n isEditor?: boolean;\r\n resource: {\r\n checkoutStepTitleFormat: string;\r\n saveBtnLabel: string;\r\n changeBtnLabel: string;\r\n cancelBtnLabel: string;\r\n saveAndContinueBtnLabel: string;\r\n };\r\n\r\n products: AsyncResult;\r\n cart: AsyncResult;\r\n context: ICoreContext>;\r\n}\r\n\r\ninterface ICheckoutGuidedFormState {\r\n currentStep: number;\r\n}\r\n\r\n/**\r\n *\r\n * CheckoutGuidedForm component\r\n * @extends {React.Component}\r\n */\r\n@observer\r\nclass CheckoutGuidedForm extends React.Component {\r\n public state: ICheckoutGuidedFormState = {\r\n currentStep: 0\r\n };\r\n\r\n public componentDidMount(): void {\r\n /**\r\n * Append child modules\r\n */\r\n const childIds = this.props.items.map((item: React.ReactNode) => get(item, 'props.id'));\r\n this.props.moduleState.init({ childIds });\r\n\r\n void this._emitAnalyticsEvent(this.state.currentStep);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { moduleState, items, resource } = this.props;\r\n\r\n if (!items || !moduleState) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {items.map((item: React.ReactNode) => {\r\n const childId = this.getId(item);\r\n const step = this.getStep(childId);\r\n const title = this.getHeading(item);\r\n const state = this.props.moduleState.getModule(childId);\r\n const { isReady, isPending, isUpdating, isDisabled, onEdit, onCancel, onSubmit, hasModuleState, hasInitialized } =\r\n state || ({} as IModuleStateManager);\r\n return (\r\n \r\n {React.cloneElement(item as React.ReactElement, { enableControl: true })}\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n\r\n private getEnabledModules = (): string[] => {\r\n const {\r\n moduleState: { childIds, getModule }\r\n } = this.props;\r\n return childIds.filter((childId: string) => {\r\n const state = getModule(childId);\r\n return !!state && !state.isDisabled;\r\n });\r\n };\r\n\r\n private getStep = (id: string): number => {\r\n return this.getEnabledModules().indexOf(id);\r\n };\r\n\r\n private getId = (item: React.ReactNode): string => {\r\n return get(item, 'props.id') || '';\r\n };\r\n\r\n private getHeading = (item: React.ReactNode): Heading => {\r\n return get(item, 'props.config.heading') || '';\r\n };\r\n\r\n private isExpanded = (step: number): boolean => {\r\n if (this.props.isEditor) {\r\n // Editorial mode: Expand all the drawers\r\n return true;\r\n }\r\n return step > -1 && step <= this.state.currentStep;\r\n };\r\n\r\n private isActive = (step: number): boolean => {\r\n return step === this.state.currentStep;\r\n };\r\n\r\n private isVisted = (step: number): boolean => {\r\n return step > -1 && step < this.state.currentStep;\r\n };\r\n\r\n private onNext = (): void => {\r\n void this._emitAnalyticsEvent(this.state.currentStep + 1);\r\n\r\n this.setState({\r\n currentStep: this.state.currentStep + 1\r\n });\r\n };\r\n\r\n //----------------------------------------------------------\r\n // Emit a Checkout Step event\r\n //----------------------------------------------------------\r\n private async _emitAnalyticsEvent(step: number): Promise {\r\n\r\n // Wait for the cart to load -- we need it before we can request attributes\r\n const cart = (await this.props.cart).cart;\r\n if (cart.CartLines && cart.CartLines.length) {\r\n\r\n // Wait for products and attributes to be loaded\r\n // Everything has been requested as early as possible, so these aren't linear events\r\n const attributes = await getAttributesForCart(cart.CartLines, this.props.context.actionContext);\r\n const products = await this.props.products;\r\n const subFrequency = getSubscriptionValues(cart).frequency;\r\n\r\n // Convert to the format the analytics module requires\r\n const mappedProducts = cart.CartLines.map(line => {\r\n const isSubscription = isLineSubscriptionLine(line);\r\n\r\n return {\r\n product: products.find(product => product.RecordId === line.ProductId),\r\n quantity: line.Quantity,\r\n attributes: line.ProductId ? attributes[line.ProductId] : [],\r\n subscription: isSubscription,\r\n frequency: isSubscription && subFrequency,\r\n discounts: line.DiscountLines,\r\n context: this.props.context,\r\n };\r\n });\r\n\r\n publish('checkout', {\r\n step: step + 1, // The cart page is step 0, so start from 1 here\r\n products: mappedProducts,\r\n coupon: cart.Coupons?.map(coupon => coupon.Code).join(','),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport default CheckoutGuidedForm;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/ //\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\ninterface ICheckoutPlaceOrderButtonProps {\r\n canPlaceOrder: boolean;\r\n placeOrderText: string;\r\n placeOrder(): Promise;\r\n}\r\n\r\nconst CheckoutPlaceOrderButton: React.FC = ({ placeOrderText, canPlaceOrder, placeOrder }) => {\r\n const [isBusy, setIsBusy] = useState(false);\r\n const onPlaceOrder = async () => {\r\n if (isBusy || !canPlaceOrder) {\r\n return;\r\n }\r\n setIsBusy(true);\r\n await placeOrder();\r\n setIsBusy(false);\r\n };\r\n return (\r\n \r\n {placeOrderText}\r\n \r\n );\r\n};\r\n\r\nexport default CheckoutPlaceOrderButton;\r\n","import { IActionContext } from '@msdyn365-commerce/core';\r\nimport { getCartState, getCheckoutState } from '@msdyn365-commerce/global-state';\r\n\r\nasync function emptyActiveCart(ctx: IActionContext): Promise {\r\n let cartState;\r\n let checkoutState;\r\n const lineItemIdsToRemove = [];\r\n\r\n try {\r\n cartState = await getCartState(ctx);\r\n checkoutState = await getCheckoutState(ctx);\r\n } catch (e) {\r\n throw e;\r\n }\r\n\r\n if (!cartState || !cartState.cart) {\r\n throw new Error('Fail to fetch active cart');\r\n }\r\n\r\n if (!checkoutState || !checkoutState.checkoutCart) {\r\n throw new Error('Fail to fetch checkoutCart cart');\r\n }\r\n\r\n const activeCart = cartState.cart;\r\n const checkoutCart = checkoutState.checkoutCart.cart;\r\n\r\n for (const activeCartLine of activeCart.CartLines || []) {\r\n for (const checkoutCartLine of checkoutCart.CartLines || []) {\r\n if (activeCartLine.LineId && activeCartLine.LineId === checkoutCartLine.LineId) {\r\n lineItemIdsToRemove.push(activeCartLine.LineId);\r\n }\r\n }\r\n }\r\n\r\n try {\r\n await cartState.removeCartLines({ cartLineIds: lineItemIdsToRemove });\r\n await cartState.removeAllPromoCodes({});\r\n } catch (e) {\r\n throw e;\r\n }\r\n}\r\n\r\nexport default emptyActiveCart;\r\n","import { IActionContext } from '@msdyn365-commerce/core';\r\nimport { getCheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { checkoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { getCardTypesAsync, getTenderTypesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport {\r\n Address,\r\n CardTypeInfo,\r\n CartTenderLine,\r\n RetailOperation,\r\n SalesOrder,\r\n TenderType,\r\n TokenizedPaymentCard\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nconst OPERATIONS = {\r\n PayCard: 201,\r\n PayGiftCertificate: 214,\r\n PayLoyalty: 207\r\n};\r\n\r\nconst findCreditCardType = (cardTypes: CardTypeInfo[] = [], cardPrefix: string = ''): CardTypeInfo | undefined => {\r\n return cardTypes.find(cardType => {\r\n // Check that the card type is credit card ( InternationalCreditCard (0) or CorporateCard (3))\r\n if (cardType.CardTypeValue !== 0 && cardType.CardTypeValue !== 3) {\r\n return false;\r\n }\r\n const maskNumFrom: number = parseInt(cardType.NumberFrom || '0', 10);\r\n const maskNumTo: number = parseInt(cardType.NumberTo || '0', 10);\r\n const maskLength: number = cardType.NumberFrom ? cardType.NumberFrom.length : 0;\r\n const cardSubStr: number =\r\n cardPrefix.length > maskLength ? parseInt(cardPrefix.substr(0, maskLength), 10) : parseInt(cardPrefix, 10);\r\n return maskNumFrom <= cardSubStr && cardSubStr <= maskNumTo;\r\n });\r\n};\r\n\r\nconst findTenderIdTypeByOperationId = (tenderTypes: TenderType[], operationId: RetailOperation): string | undefined => {\r\n const matchedTenderType = tenderTypes.find(tenderType => tenderType.OperationId === operationId);\r\n if (matchedTenderType) {\r\n return matchedTenderType.TenderTypeId;\r\n }\r\n return;\r\n};\r\n\r\nconst roundNumber = (value: number) => Number(value.toFixed(2));\r\n\r\nasync function getLoyaltyTenderLine(\r\n ctx: IActionContext,\r\n LoyaltyCardId: string,\r\n Amount: number = 0,\r\n Currency: string = 'USD'\r\n): Promise {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n\r\n if (!tenderTypes) {\r\n throw new Error('Fail to get gift card tender line');\r\n }\r\n\r\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayLoyalty);\r\n return {\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n TenderTypeId,\r\n Amount,\r\n LoyaltyCardId\r\n };\r\n}\r\n\r\nasync function getGiftCardTenderLine(\r\n ctx: IActionContext,\r\n GiftCardId: string = '',\r\n Amount: number = 0,\r\n Currency: string = 'USD',\r\n tenderTypeId?: string,\r\n giftCardPin?: string,\r\n giftCardExpirationYear?: number,\r\n giftCardExpirationMonth?: number\r\n): Promise {\r\n let TenderTypeId = tenderTypeId;\r\n\r\n if (!TenderTypeId) {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n if (!tenderTypes) {\r\n throw new Error('Fail to get gift card tender line');\r\n }\r\n TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayGiftCertificate);\r\n }\r\n\r\n const GiftCardPin = giftCardPin;\r\n const GiftCardExpirationYear = giftCardExpirationYear;\r\n const GiftCardExpirationMonth = giftCardExpirationMonth;\r\n return {\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n TenderTypeId,\r\n Amount,\r\n GiftCardId,\r\n GiftCardPin,\r\n GiftCardExpirationYear,\r\n GiftCardExpirationMonth\r\n };\r\n}\r\n\r\nasync function getCreditCardTenderLine(\r\n ctx: IActionContext,\r\n tokenizedPaymentCard: TokenizedPaymentCard,\r\n cardPrefix: string = '',\r\n Amount: number = 0,\r\n Currency: string = 'USD',\r\n billingAddress?: Address\r\n): Promise {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n const cardTypes = await getCardTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n if (!tenderTypes || !cardTypes) {\r\n throw new Error('Fail to get credit card tender line');\r\n }\r\n const cardType = findCreditCardType(cardTypes, cardPrefix);\r\n const cartTypeId = cardType && cardType.TypeId;\r\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\r\n const cardTenderLine: CartTenderLine = {\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n Amount,\r\n TenderTypeId,\r\n CardTypeId: cartTypeId\r\n };\r\n cardTenderLine.TokenizedPaymentCard = {\r\n ...tokenizedPaymentCard,\r\n CardTypeId: cartTypeId,\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.TokenizedPaymentCard',\r\n House: tokenizedPaymentCard.House || 'N/A',\r\n ...(tokenizedPaymentCard.CardTokenInfo && {\r\n CardTokenInfo: {\r\n ...tokenizedPaymentCard.CardTokenInfo,\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CardTokenInfo'\r\n }\r\n }),\r\n ...(billingAddress && {\r\n Phone: billingAddress.Phone,\r\n Country: billingAddress.ThreeLetterISORegionName,\r\n Address1: billingAddress.Street,\r\n City: billingAddress.City,\r\n State: billingAddress.State,\r\n Zip: billingAddress.ZipCode\r\n })\r\n };\r\n\r\n return cardTenderLine;\r\n}\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nexport default async (ctx: IActionContext): Promise => {\r\n const checkoutState = await getCheckoutState(ctx).catch(error => {\r\n throw error;\r\n });\r\n\r\n const cartState = checkoutState.checkoutCart;\r\n\r\n const channelConfiguration = ctx.requestContext.channel;\r\n\r\n if (!cartState || !Object.keys(cartState).length || !checkoutState || !channelConfiguration) {\r\n throw new Error('Fail to placeOrder');\r\n }\r\n\r\n const {\r\n giftCardExtends,\r\n tokenizedPaymentCard,\r\n cardPrefix,\r\n guestCheckoutEmail,\r\n billingAddress,\r\n loyaltyAmount\r\n } = checkoutState;\r\n const { Currency } = channelConfiguration;\r\n\r\n let amountDue = cartState.cart.AmountDue || 0;\r\n let cartTenderLines;\r\n const getTenderLinePromises = [];\r\n const loyaltyCardNumber = cartState.cart.LoyaltyCardId;\r\n\r\n // Pay by loyalty first\r\n if (loyaltyAmount && loyaltyCardNumber) {\r\n const chargedAmount = roundNumber(Math.min(loyaltyAmount, amountDue));\r\n const loyaltyTenderLinePromise = getLoyaltyTenderLine(ctx, loyaltyCardNumber, chargedAmount, Currency);\r\n getTenderLinePromises.push(loyaltyTenderLinePromise);\r\n amountDue = roundNumber(amountDue - chargedAmount);\r\n }\r\n\r\n // Then by gift card\r\n if (giftCardExtends && giftCardExtends.length) {\r\n giftCardExtends.some(giftCardExtend => {\r\n if (giftCardExtend.Balance && amountDue > 0) {\r\n const chargedAmount = roundNumber(Math.min(giftCardExtend.Balance, amountDue));\r\n const tenderTypeId = giftCardExtend.TenderTypeId;\r\n const giftCardPin = giftCardExtend.Pin;\r\n const giftCardExpirationYear = giftCardExtend.ExpirationDate ? parseInt(giftCardExtend.ExpirationDate?.split('/')[1], 10) : undefined;\r\n const giftCardExpirationMonth = giftCardExtend.ExpirationDate ? parseInt(giftCardExtend.ExpirationDate?.split('/')[0], 10) : undefined;\r\n const creditCardTenderLinePromise = getGiftCardTenderLine(ctx, giftCardExtend.Id, chargedAmount, Currency, tenderTypeId, giftCardPin, giftCardExpirationYear, giftCardExpirationMonth);\r\n getTenderLinePromises.push(creditCardTenderLinePromise);\r\n amountDue = roundNumber(amountDue - chargedAmount);\r\n }\r\n return amountDue === 0;\r\n });\r\n }\r\n\r\n // Pay the rest by credit card\r\n if (amountDue > 0) {\r\n if (!tokenizedPaymentCard) {\r\n throw new Error('Fail to placeOrder: no token found');\r\n }\r\n const creditCardTenderLinePromise = getCreditCardTenderLine(\r\n ctx,\r\n tokenizedPaymentCard,\r\n cardPrefix,\r\n amountDue,\r\n Currency,\r\n billingAddress\r\n );\r\n getTenderLinePromises.push(creditCardTenderLinePromise);\r\n }\r\n\r\n if (getTenderLinePromises.length > 0) {\r\n // When payment methods is required\r\n cartTenderLines = await Promise.all(getTenderLinePromises).catch(error => {\r\n throw error;\r\n });\r\n\r\n if (!cartTenderLines || !cartTenderLines.length) {\r\n throw new Error('Fail to placeOrder: fail to get cart tender lines');\r\n }\r\n }\r\n\r\n // Proceed checkout\r\n const salesOrder = await checkoutAsync(\r\n { callerContext: ctx, bypassCache: 'get' },\r\n cartState.cart.Id,\r\n guestCheckoutEmail,\r\n // @ts-ignore fields tokenizedPaymentCard and receiptNumberSequence are optional\r\n undefined,\r\n undefined,\r\n cartTenderLines || null,\r\n cartState.cart.Version\r\n // @ts-ignore\r\n ).catch(error => {\r\n throw error;\r\n });\r\n\r\n if (!salesOrder) {\r\n throw new Error('Fail to placeOrder: fail to checkout');\r\n }\r\n\r\n return salesOrder;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/ //\r\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport { Button, Heading, IModuleProps, INodeProps, Waiting } from '@msdyn365-commerce-modules/utilities';\r\nimport { AsyncResultStatus, getUrlSync } from '@msdyn365-commerce/core';\r\nimport { CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport get from 'lodash/get';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport { computed, when } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { SubscriptionCommerceValues } from '../../common/subscription-commerce.values';\r\nimport { wineClubSetup } from '../../settings/app.settings';\r\nimport { getSubscriptionValues, updateSubscription } from '../../Utilities/subscription-manager';\r\nimport AlertComponent from './components/alert';\r\nimport { getLineItems, ILineItems } from './components/get-line-items';\r\nimport { getOrderSummary, IOrderSummary } from './components/get-order-summary';\r\nimport GuidedFormComponent from './components/guided-form';\r\nimport PlaceOrderButtonComponent from './components/place-order-button';\r\nimport placeOrder from './methods/place-order';\r\nimport { ISmweCheckoutData } from './smwe-checkout.data';\r\nimport { ISmweCheckoutProps } from './smwe-checkout.props.autogenerated';\r\n\r\nexport * from './components/get-line-items';\r\nexport * from './components/get-order-summary';\r\n\r\ntype DeviceType = 'Mobile';\r\n\r\ninterface ICheckoutState {\r\n errorMessage: string;\r\n}\r\n\r\nexport interface ICheckoutViewProps extends ISmweCheckoutProps {\r\n className: string;\r\n canShow?: boolean;\r\n isEmptyCart?: boolean;\r\n isConsentGiven?: boolean;\r\n hasError?: boolean;\r\n cartStatus?: string;\r\n isMobile?: boolean;\r\n isEditorialMode?: boolean;\r\n backToShoppingUrl?: string;\r\n editCartLink?: string;\r\n hasSalesOrder: boolean;\r\n\r\n checkoutProps: IModuleProps;\r\n headerProps: INodeProps;\r\n bodyProps: INodeProps;\r\n mainProps: INodeProps;\r\n mainControlProps: INodeProps;\r\n sideProps: INodeProps;\r\n sideControlFirstProps: INodeProps;\r\n sideControlSecondProps: INodeProps;\r\n\r\n guidedForm?: React.ReactNode;\r\n title?: React.ReactNode;\r\n loading?: React.ReactNode;\r\n alert?: React.ReactNode;\r\n orderSummary?: IOrderSummary;\r\n lineItems?: ILineItems;\r\n placeOrderButton?: React.ReactNode;\r\n keepShoppingButton?: React.ReactNode;\r\n orderConfirmation?: React.ReactNode;\r\n}\r\n\r\nexport interface ICheckoutModuleProps extends ISmweCheckoutProps, IModuleStateProps { }\r\n\r\n/**\r\n *\r\n * CheckoutContainer component\r\n * @extends {React.Component}\r\n */\r\n// @ts-ignore\r\n@withModuleState\r\n@observer\r\nclass Checkout extends React.Component {\r\n public state: ICheckoutState = {\r\n errorMessage: ''\r\n };\r\n\r\n @computed get cartStatus(): AsyncResultStatus {\r\n return get(this.props, 'data.checkout.status');\r\n }\r\n\r\n @computed get isEmptyCart(): boolean {\r\n if (this.isEditorialMode) {\r\n // Editorial mode: Ignore empty cart\r\n return false;\r\n }\r\n const cart = get(this.props, 'data.checkout.result.checkoutCart.cart');\r\n return this.cartStatus === 'SUCCESS' && !!cart && !isEmpty(cart) && (!cart.CartLines || cart.CartLines.length === 0);\r\n }\r\n\r\n @computed get hasError(): boolean {\r\n const cart = get(this.props, 'data.checkout.result.checkoutCart.cart');\r\n return this.cartStatus === 'FAILED' || (this.cartStatus === 'SUCCESS' && (!cart || isEmpty(cart)));\r\n }\r\n\r\n @computed get isEditorialMode(): boolean {\r\n return get(this.props, 'context.request.params.isEditor');\r\n }\r\n\r\n @computed get canPlaceOrder(): boolean {\r\n return this.props.moduleState.isReady;\r\n }\r\n\r\n @computed private get _clubItemIds(): string[] {\r\n const wineClub = this.props.app.config.wineClubSetup as wineClubSetup;\r\n const ids: string[] = [];\r\n wineClub.forEach(club => club.variants.forEach(variant => ids.push(variant.itemId)));\r\n return ids;\r\n }\r\n\r\n constructor(props: ICheckoutModuleProps) {\r\n super(props);\r\n if (props.config.subscriptions) {\r\n props.data.cart.then(() => {\r\n this._setDefaultSubscriptionFields().then(() => {\r\n this.props.telemetry.debug('Successfully set default subscription fields');\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.debug(`[_setDefaultSubscriptionFields] ${error}`);\r\n });\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }\r\n }\r\n\r\n public componentDidMount(): void {\r\n const {\r\n resources: { genericErrorMessage }\r\n } = this.props;\r\n // @ts-ignore: Compiler not reconizing condition check for function params\r\n when(\r\n () => this.hasError,\r\n () => {\r\n this.setState({\r\n errorMessage: genericErrorMessage\r\n });\r\n this.props.context.telemetry.error('Failed to get cart');\r\n }\r\n );\r\n\r\n // @ts-ignore: Compiler not reconizing condition check for function params\r\n when(\r\n () => {\r\n return this.isEmptyCart;\r\n },\r\n () => {\r\n this._navigateToCart();\r\n }\r\n );\r\n\r\n if (this.props.config.isWineClubCheckout) {\r\n this._isCartValidAsClub()\r\n .then(isValid => {\r\n if (!isValid) { this._navigateToCart(); }\r\n }).catch(e => this.props.telemetry.exception(e));\r\n }\r\n }\r\n\r\n // tslint:disable-next-line:max-func-body-length\r\n public render(): JSX.Element {\r\n const {\r\n moduleState,\r\n config: { className, checkoutHeading, disableGuidedCheckoutFlow },\r\n resources\r\n } = this.props;\r\n const { errorMessage } = this.state;\r\n const { backToShopping, placeOrderText, cookieConsentRequiredMessage, genericErrorMessage } = resources;\r\n const checkoutClass = classnames('ms-checkout', className);\r\n const checkoutInformation = this.getSlotItems('checkoutInformation');\r\n\r\n const isConsentGiven =\r\n this.props.context.request &&\r\n this.props.context.request.cookies &&\r\n this.props.context.request.cookies.isConsentGiven &&\r\n this.props.context.request.cookies.isConsentGiven();\r\n\r\n const isMobile =\r\n this.props.context.request &&\r\n this.props.context.request.device &&\r\n (this.props.context.request.device.Type as DeviceType) === 'Mobile';\r\n\r\n const backToShoppingUrlOverride = this.props.config.backToShoppingOverride?.destinationUrl;\r\n const backToShoppingUrl = backToShoppingUrlOverride || getUrlSync('home', this.props.context.actionContext) || '';\r\n const editCartLink = getUrlSync('cart', this.props.context.actionContext) || '';\r\n\r\n let viewProps: ICheckoutViewProps = {\r\n ...this.props,\r\n className: checkoutClass,\r\n isEmptyCart: this.isEmptyCart,\r\n isConsentGiven,\r\n hasError: this.hasError,\r\n hasSalesOrder: this.props.data.checkout.result !== undefined && this.props.data.checkout.result.salesOrder !== undefined,\r\n cartStatus: this.cartStatus,\r\n isMobile,\r\n backToShoppingUrl,\r\n editCartLink,\r\n isEditorialMode: this.isEditorialMode,\r\n orderConfirmation: this.props.slots.orderConfirmation && this.props.slots.orderConfirmation.length > 0 ? this.props.slots.orderConfirmation[0] : undefined,\r\n checkoutProps: { moduleProps: this.props, className: checkoutClass },\r\n headerProps: { className: 'ms-checkout__head' },\r\n bodyProps: { className: 'ms-checkout__body' },\r\n mainProps: { className: 'ms-checkout__main' },\r\n mainControlProps: { className: 'ms-checkout__main-control' },\r\n sideProps: { className: 'ms-checkout__side' },\r\n sideControlFirstProps: { className: 'ms-checkout__side-control-first' },\r\n sideControlSecondProps: { className: 'ms-checkout__side-control-second' },\r\n title: checkoutHeading && \r\n };\r\n\r\n if (isConsentGiven === false) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: \r\n };\r\n } else if (!this.cartStatus || this.cartStatus === 'LOADING' || this.isEmptyCart) {\r\n viewProps = {\r\n ...viewProps,\r\n loading: \r\n };\r\n } else if (this.hasError) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: \r\n };\r\n } else {\r\n viewProps = {\r\n ...viewProps,\r\n alert: errorMessage && ,\r\n canShow: true,\r\n guidedForm: checkoutInformation ? (\r\n \r\n ) : (\r\n undefined\r\n ),\r\n orderSummary: getOrderSummary(this.props),\r\n lineItems: getLineItems(this.props),\r\n placeOrderButton: (\r\n \r\n ),\r\n keepShoppingButton: backToShoppingUrl && (\r\n \r\n {backToShopping}\r\n \r\n )\r\n };\r\n }\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private getSlotItems = (key: string): React.ReactNode[] | undefined => {\r\n const { slots } = this.props;\r\n return slots && slots[key] && slots[key].length ? slots[key] : undefined;\r\n };\r\n\r\n private _navigateToCart(): void {\r\n const {\r\n resources: { genericErrorMessage }\r\n } = this.props;\r\n const editCartLink = getUrlSync('cart', this.props.context.actionContext) || '';\r\n if (window && editCartLink) {\r\n window.location.assign(editCartLink);\r\n } else {\r\n this.setState({\r\n errorMessage: genericErrorMessage\r\n });\r\n this.props.context.telemetry.error('Cart is invalid, but no editCartLink found');\r\n }\r\n }\r\n\r\n private async _isCartValidAsClub(): Promise {\r\n const checkoutState = await this.props.data.checkout;\r\n const lines = checkoutState.checkoutCart.cart.CartLines || [];\r\n if (lines.length !== 1) { return false; } // you can only checkout with one item\r\n // find the first existing line\r\n const line = lines.find(lineFind => !!lineFind)!;\r\n const isClubItem = this._clubItemIds.find(clubItemId => line.ProductId === +clubItemId);\r\n if (!isClubItem) { return false; }\r\n\r\n return true;\r\n }\r\n\r\n private onPlaceOrder = async (): Promise => {\r\n const {\r\n resources: { genericErrorMessage },\r\n context: { actionContext },\r\n slots: { orderConfirmation }\r\n } = this.props;\r\n\r\n if (this.props.config.isWineClubCheckout) {\r\n await this._setWineClubDeliveryOption();\r\n }\r\n\r\n const hasOrderConfirmation = orderConfirmation && orderConfirmation.length > 0;\r\n const orderConfirmationLinkOverride = this.props.config.orderConfirmationOverride?.destinationUrl;\r\n await placeOrder(actionContext, this.props.data.checkout.result, this.props.data.products.result, !hasOrderConfirmation, orderConfirmationLinkOverride).catch(error => {\r\n this.setState({\r\n errorMessage: genericErrorMessage\r\n });\r\n this.props.telemetry.exception(error);\r\n });\r\n };\r\n\r\n private async _setWineClubDeliveryOption(): Promise {\r\n const checkoutState = await this.props.data.checkout;\r\n const deliveryOptionInput = {\r\n deliveryModeId: this.props.app.config.wineClubDeliveryOption,\r\n shippingAddress: checkoutState.shippingAddress || {}\r\n };\r\n\r\n await checkoutState.checkoutCart.updateCartDeliverySpecification(\r\n deliveryOptionInput\r\n )\r\n .then((response) => {\r\n if (response.status === 'FAILED') {\r\n this.props.moduleState.setHasError(true);\r\n this.props.moduleState.onUpdating();\r\n }\r\n })\r\n .catch(() => {\r\n this.props.moduleState.setHasError(true);\r\n this.props.moduleState.onUpdating();\r\n });\r\n }\r\n\r\n private async _setDefaultSubscriptionFields(): Promise {\r\n const values = getSubscriptionValues(this.props.data.cart.result?.cart);\r\n const cartChanges: CommerceProperty[] = [];\r\n if (!values.name) {\r\n cartChanges.push({\r\n Key: SubscriptionCommerceValues.SUBSCRIPTION_NAME,\r\n Value: {\r\n StringValue: SubscriptionCommerceValues.SUBSCRIPTION_DEFAULT_NAME\r\n }\r\n });\r\n }\r\n if (!values.frequency) {\r\n cartChanges.push({\r\n Key: SubscriptionCommerceValues.SUBSCRIPTION_FREQUENCY,\r\n Value: {\r\n StringValue: this.props.context.app.config.defaultSubscriptionFrequencyId\r\n }\r\n });\r\n }\r\n if (cartChanges.length > 0) {\r\n await updateSubscription(this.props.data.cart, cartChanges, this.props.context);\r\n }\r\n }\r\n}\r\n\r\nexport default Checkout;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\r\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport emptyActiveCart from './empty-active-cart';\r\nimport checkout from './smwe-checkout';\r\n\r\nexport default async (ctx: IActionContext, checkoutState: ICheckoutState | undefined, orderedProducts: SimpleProduct[] | undefined, redirect: boolean, overrideConfirmationLink?: string) => {\r\n let salesOrder: SalesOrder;\r\n\r\n // Proceed checkout\r\n try {\r\n salesOrder = await checkout(ctx);\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n // Remove purchased items from the active cart\r\n try {\r\n await emptyActiveCart(ctx);\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n if (redirect) {\r\n // Redirec to the order confirmation page\r\n let orderConfirmationUrl: string = getUrlSync('orderConfirmation', ctx) || '';\r\n\r\n if (overrideConfirmationLink) {\r\n orderConfirmationUrl = overrideConfirmationLink;\r\n }\r\n\r\n if (!orderConfirmationUrl) {\r\n throw new Error('Error: No orderConfirmationUrl');\r\n }\r\n\r\n const separator = orderConfirmationUrl.includes('?') ? '&' : '?';\r\n const url = `${orderConfirmationUrl}${separator}transactionId=${salesOrder.Id}`;\r\n window.location.assign(url);\r\n } else {\r\n if (checkoutState) {\r\n const result = await checkoutState.updateSalesOrder({newSalesOrder: salesOrder, newOrderedProducts: orderedProducts || []});\r\n\r\n if (result.status === 'FAILED') {\r\n throw new Error('Error: Updating error state failed');\r\n }\r\n } else {\r\n throw new Error('Error: No checkout state');\r\n }\r\n }\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\r\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore, ISmweCheckoutData } from '../../../modules/smwe-checkout';\r\nimport { brandCodeParser } from '../../../Utilities/brand-code-parser';\r\nimport { ISmweCheckoutProps } from '../definition-extensions/smwe-checkout.ext.props.autogenerated';\r\n\r\nexport const PickUpAtStoreComponent: React.FC = ({ PickUpAtStore, label, location }) => (\r\n \r\n {label}\r\n {location}\r\n \r\n);\r\n\r\nexport const LineItemComponent: React.FC<{ line: ILineItem; cartItem?: CartLine; context: ICoreContext }> = ({ line: { LineItem, item, pickUpAtStore }, cartItem, context }) => {\r\n let brandCode: string = '';\r\n if (cartItem) {\r\n brandCode = brandCodeParser({ description: cartItem.Description, appContext: context });\r\n }\r\n return (\r\n \r\n {brandCode &&
{brandCode}
}\r\n {item}\r\n {pickUpAtStore && }\r\n
\r\n );\r\n};\r\n\r\nexport const LineItemGroupComponent: React.FC<{ group: ILineItemDeliveryGroup; props: ISmweCheckoutProps<{}>; data: ISmweCheckoutData; context: ICoreContext }> = (\r\n { group: { LineItemDeliveryGroup, LineItemList, heading, lineItems }, props, data, context }\r\n) => {\r\n const { nonSubscriptionHeader } = props.resources;\r\n return (\r\n \r\n {heading}\r\n {lineItems.length > 0 &&\r\n \r\n
{nonSubscriptionHeader}
\r\n {lineItems.map(lineItem => {\r\n // get the item and send it to the component\r\n const item = data.checkout.result?.checkoutCart.cart.CartLines?.find(cartItem => cartItem.LineId === lineItem.LineId);\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n }\r\n
\r\n );\r\n};\r\n\r\nexport const LineItemsComponent: React.FC<{ lineItems: ILineItems; props: ISmweCheckoutProps<{}>; data: ISmweCheckoutData; context: ICoreContext }> = (\r\n { lineItems: { LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForSubscription, subscriptionHeader },\r\n props,\r\n data,\r\n context }\r\n) => (\r\n \r\n \r\n {heading}\r\n {editLink}\r\n \r\n {itemsForPickup && }\r\n {itemsForShip && }\r\n {itemsForSubscription && itemsForSubscription.length > 0 &&\r\n \r\n
{subscriptionHeader}
\r\n {itemsForSubscription.map((lineItem: ILineItem) => {\r\n // get the item and send it to the component\r\n const item = data.checkout.result?.checkoutCart.cart.CartLines?.find(cartItem => cartItem.LineId === lineItem.LineId);\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n }\r\n
\r\n);\r\n\r\nconst OrderSummaryComponent: React.FC = ({ heading, lines }) => (\r\n
\r\n {heading}\r\n
\r\n {lines && (\r\n <>\r\n {lines.subtotal}\r\n {lines.shipping}\r\n {lines.tax}\r\n {lines.totalDiscounts}\r\n {lines.loyalty}\r\n {lines.giftCard}\r\n {lines.orderTotal}\r\n \r\n )}\r\n
\r\n
\r\n);\r\n\r\nconst CheckoutView: React.FC> = props => {\r\n const {\r\n canShow,\r\n checkoutProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n loading,\r\n alert,\r\n guidedForm,\r\n orderSummary,\r\n lineItems,\r\n placeOrderButton,\r\n data,\r\n context\r\n } = props;\r\n return (\r\n \r\n {loading}\r\n {alert}\r\n {canShow && (\r\n <>\r\n \r\n {guidedForm}\r\n \r\n {placeOrderButton}\r\n \r\n \r\n \r\n {orderSummary && }\r\n {lineItems && }\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default CheckoutView;\r\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IAddResource, ICheckoutGiftCardViewProps, IForm, IItem, IList, IShowResource } from './checkout-gift-card';\n\nexport const From: React.FC = ({ formProps, label, inputPinLabel, inputExpLabel, alert, inputProps, inputNumProps,\n inputPinProps, inputExpProps, inputNumber, inputPin, inputExp, applyButton, supportExternalGiftCard, showGiftCardPinInput, showGiftCardExpInput, alertFieldLabel }) => (\n \n {alert}\n {supportExternalGiftCard ?\n \n \n {label}\n {inputNumber}\n \n {showGiftCardPinInput &&\n \n {inputPinLabel}\n {inputPin}\n \n }\n {showGiftCardExpInput &&\n \n {inputExpLabel}\n {inputExp}\n \n }\n {(showGiftCardPinInput || showGiftCardExpInput) && alertFieldLabel}\n \n : <>{label}{inputNumber}\n }\n {applyButton}\n \n);\n\nexport const SelectedGiftCard: React.FC = ({ itemProps, selectedGiftCard, removeButton }) => (\n \n {selectedGiftCard}\n {removeButton}\n \n);\n\nexport const GiftCardList: React.FC = ({ listProps, list }) => (\n \n {list.map(({ id, ...item }) => (\n \n ))}\n \n);\n\nexport const AddResource: React.FC = ({ form, list }) => (\n <>\n {form && }\n {list && }\n \n);\n\nexport const ShowResource: React.FC = ({ title, list }) => (\n <>\n {title}\n {list && }\n \n);\n\nconst CheckoutGiftCardView: React.FC = props => {\n const { checkoutGiftCardProps, showGiftCard, addGiftCard } = props;\n return (\n \n {showGiftCard && }\n {addGiftCard && }\n \n );\n};\n\nexport default CheckoutGiftCardView;\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Alert, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IDictionary } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ICartlinesViewProps } from './components/smwe-cart-line-items';\r\nimport { ICartViewProps } from './smwe-cart';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean,\r\n itemsTitle: string,\r\n qtyTitle: string,\r\n unitPriceTitle: string,\r\n totalTitle: string\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus};\r\n }\r\n if (cartLines) {\r\n return (\r\n
\r\n
\r\n
{itemsTitle}
\r\n
{qtyTitle}
\r\n
{unitPriceTitle}
\r\n
{totalTitle}
\r\n
\r\n\r\n
    \r\n {cartLines.map((cartLine, index) => {\r\n return (\r\n
  • \r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n \r\n {cartLine.pickUpInStore.defaultComponent}\r\n \r\n ) : null}\r\n {cartLine.addToWishlist}\r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n );\r\n } else {\r\n return cartDataResult ? (\r\n
\r\n

{cartEmptyText}

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

{props.resources.conditionsText}

\r\n
\r\n );\r\n};\r\n\r\n// Detect invalid items in the cart. Items are flagged externally via the Comment field\r\nconst _isInvalidCart = (cartLinesInvalid: IDictionary): boolean => {\r\n\r\n for (const lineId of Object.keys(cartLinesInvalid)) {\r\n if (cartLinesInvalid[lineId]) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n//==================================================\r\n//==================================================\r\nconst CartView: React.FC = (props: ICartViewProps) => {\r\n const preventCheckout = _isInvalidCart(props.cartLineStatus) || props.mixedCart.isMixedCart;\r\n\r\n return (\r\n \r\n {props.title}\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult,\r\n props.resources.itemsTitle,\r\n props.resources.qtyTitle,\r\n props.resources.unitPriceTitle,\r\n props.resources.totalTitle\r\n )}\r\n \r\n {props.orderSummaryHeading && (\r\n \r\n {_renderOrderSummarylines(\r\n props.orderSummaryLineitems,\r\n props.OrderSummaryItems,\r\n props\r\n )}\r\n \r\n {props.backToShoppingButton}\r\n {preventCheckout ? props.checkoutButtonDisabled : props.checkoutAsSignInUserButton}\r\n \r\n
\r\n {props.promoCode}\r\n
\r\n
\r\n )}\r\n {props.storeSelector}\r\n \r\n);};\r\n\r\nexport default CartView;","/*---------------------------------------------------------------------------------------------\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.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IForm, IItem } from './components';\nimport { IGiftCardBalanceCheckViewProps } from './gift-card-balance-check';\n\nexport const Form: React.FC = ({ formProps, label, inputPinLabel, inputExpLabel, alert, inputProps, inputNumProps,\n inputPinProps, inputExpProps, inputNumber, inputPin, inputExp, applyButton, supportExternalGiftCard, showGiftCardPinInput, showGiftCardExpInput, alertFieldLabel }) => (\n \n {alert}\n {supportExternalGiftCard ?\n \n \n {label}\n {inputNumber}\n \n {showGiftCardPinInput &&\n \n {inputPinLabel}\n {inputPin}\n \n }\n {showGiftCardExpInput &&\n \n {inputExpLabel}\n {inputExp}\n \n }\n {(showGiftCardPinInput || showGiftCardExpInput) && alertFieldLabel}\n \n : <>{label}{inputNumber}\n }\n {applyButton}\n \n);\n\nexport const Item: React.FC = ({ itemProps, selectedGiftCard }) => (\n \n {selectedGiftCard}\n \n);\n\nconst GiftCardBalanceCheckView: React.FC = props => {\n const { giftCardBalanceCheckProps, form, item } = props;\n return (\n \n {form &&
}\n {item && }\n \n );\n};\n\nexport default GiftCardBalanceCheckView;\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 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","import { GetCheckoutCartInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, AttributeValue, Cart, CartLine, CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { SubscriptionCommerceValues } from '../common/subscription-commerce.values';\r\n\r\nexport async function updateSubscription(cart: AsyncResult, commerceValues: CommerceProperty[], context: ICoreContext): Promise {\r\n const cartState = cart && cart.status === 'SUCCESS' && cart.result;\r\n if (\r\n !cartState ||\r\n !cartState.cart\r\n ) {\r\n context.telemetry.error('Failed to add subscription properties to Cart. Unable to load Cart');\r\n } else {\r\n commerceValues.forEach(newValue => { findAndUpdateLine(newValue, cartState.cart); });\r\n\r\n const updatedCart = await updateAsync({ callerContext: context.actionContext }, cartState.cart);\r\n context.actionContext.update(new GetCheckoutCartInput(context.request.apiSettings), updatedCart);\r\n\r\n await (await cart).refreshCart({});\r\n }\r\n}\r\n\r\nexport function isProductSubscribable(productAttributes?: AttributeValue[]): boolean {\r\n return !!productAttributes?.find(attr => attr.Name === SubscriptionCommerceValues.SUBSCRIPTION_PRODUCT)?.BooleanValue;\r\n}\r\n\r\nexport function getSubscriptionValues(cart?: Cart): { frequency: string | undefined; name: string | undefined } {\r\n const freq = cart?.ExtensionProperties?.find(ext => ext.Key === SubscriptionCommerceValues.SUBSCRIPTION_FREQUENCY);\r\n const name = cart?.ExtensionProperties?.find(ext => ext.Key === SubscriptionCommerceValues.SUBSCRIPTION_NAME);\r\n\r\n return { frequency: freq?.Value?.StringValue, name: name?.Value?.StringValue };\r\n}\r\n\r\nexport function isLineSubscriptionLine(line?: CartLine): boolean {\r\n return !!line?.ExtensionProperties?.find(ext => ext.Key === SubscriptionCommerceValues.SUBCRIPTION_LINE);\r\n}\r\n\r\ninterface ICategorizedLines {\r\n subscriptionLines: CartLine[];\r\n lines: CartLine[];\r\n}\r\nexport function filterCartLines(cart?: Cart): ICategorizedLines {\r\n const output: ICategorizedLines = {\r\n subscriptionLines: [],\r\n lines: [],\r\n };\r\n\r\n cart?.CartLines?.forEach(line => {\r\n const isSubscriptionLine = isLineSubscriptionLine(line);\r\n if (isSubscriptionLine) {\r\n output.subscriptionLines.push(line);\r\n } else {\r\n output.lines.push(line);\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n\r\n/**\r\n * NOTE: WILL ONLY CLEAR TOP LEVEL NOT ITEMS\r\n */\r\nexport async function clearSubscription(cartState?: ICartState, context?: ICoreContext): Promise {\r\n if (!cartState || !context) { return; }\r\n\r\n const cart: Cart = cartState.cart;\r\n\r\n // add keys here to erase their string values\r\n const editObj = {\r\n [SubscriptionCommerceValues.SUBSCRIPTION_NAME]: true,\r\n [SubscriptionCommerceValues.SUBSCRIPTION_FREQUENCY]: true\r\n };\r\n\r\n // ensure extprops exists\r\n cart.ExtensionProperties = cart.ExtensionProperties || [];\r\n cart.ExtensionProperties.forEach(extension => {\r\n if (editObj[extension.Key!] && extension.Value) {\r\n extension.Value.StringValue = '';\r\n }\r\n });\r\n const updatedCart = await updateAsync({ callerContext: context.actionContext }, cart);\r\n context.actionContext.update(new GetCheckoutCartInput(context.request.apiSettings), updatedCart);\r\n}\r\n\r\n// im expecting to eventually turn this into a namespace class with a bunch of commerce attribute transformations\r\n// but its only one now so no point\r\nfunction findAndUpdateLine(changedProperty: CommerceProperty, cart: Cart): void {\r\n cart.ExtensionProperties = cart.ExtensionProperties || [];\r\n const property = cart.ExtensionProperties.find(extension => extension.Key === changedProperty.Key);\r\n if (property) {\r\n property.Value = changedProperty.Value;\r\n } else {\r\n cart.ExtensionProperties.push(changedProperty);\r\n }\r\n}\r\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 { ICheckoutDeliveryOption, ICheckoutDeliveryOptionEdit, ICheckoutDeliveryOptionsError, ICheckoutDeliveryOptionsList, ICheckoutDeliveryOptionsViewProps } from './checkout-delivery-options';\n\nconst DeliveryOptionList: React.FC = ({\n DeliveryOptionsList,\n list\n}) => {\n if (!list || list.length === 0) {\n return null;\n }\n\n return (\n \n {list.map((deliveryOption: ICheckoutDeliveryOptionEdit) => {\n return (\n {deliveryOption.radioButton}\n {deliveryOption.description}\n {deliveryOption.price}\n );\n })}\n \n );\n};\n\nconst DeliveryOptionSelected: React.FC = ({\n DeliveryOption,\n description,\n price,\n}) => {\n\n return (\n \n {description}\n {price}\n \n );\n};\n\nconst ErrorMessage: React.FC = ({\n Error,\n title,\n message,\n}) => {\n\n return (\n \n {title}\n {message}\n \n );\n};\n\nconst CheckoutDeliveryOptionsView: React.FC = props => {\n const { CheckoutDeliveryOptions,\n viewState,\n deliveryOptions,\n deliveryOptionSelected,\n errorMessage,\n waiting,\n saveButton,\n editButton,\n cancelButton } = props;\n\n return (\n // TODO: All wrapper div should be provided by viewProps. Once SDK provide the sln, update markup.\n \n {viewState.isLoading && waiting}\n {viewState.isError && errorMessage && }\n {viewState.isShowList && deliveryOptions && }\n {viewState.isShowSelected && deliveryOptionSelected && }\n {viewState.isShowSaveButton && saveButton}\n {viewState.isShowEditButton && editButton}\n {viewState.isShowCancelButton && cancelButton}\n \n );\n};\n\nexport default CheckoutDeliveryOptionsView;","/*---------------------------------------------------------------------------------------------\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","/*---------------------------------------------------------------------------------------------\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';\r\nimport { ICartLineProps } from './cartlineitem.component';\r\nimport { ICartLineProps as ICheckoutCartLineProps } from './cartlineitem-variant.component';\r\nimport { getSelectedVariant, SelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\n\r\ninterface IMasterProdDisplay {\r\n masterProdId: number,\r\n variantName: string,\r\n props: ICartLineProps | ICheckoutCartLineProps\r\n}\r\nexport class MasterProdDisplay extends React.Component {\r\n constructor(props: IMasterProdDisplay) {\r\n super(props);\r\n this.state = {\r\n prodName: ''\r\n };\r\n }\r\n public componentDidMount() {\r\n const masterProductInput = new SelectedVariantInput(this.props.masterProdId, this.props.props.context.request.apiSettings.channelId);\r\n getSelectedVariant(masterProductInput, this.props.props.context.actionContext).then(masterProduct => {\r\n this.setState({ prodName: masterProduct?.Name || '' });\r\n }).catch(e => console.error(e));\r\n }\r\n\r\n public render(): JSX.Element {\r\n let name = {this.props.variantName};\r\n if (this.state.prodName !== '') {\r\n name = {this.state.prodName} - {this.props.variantName};\r\n }\r\n return name;\r\n }\r\n}\r\n\r\nexport async function getMasterProduct(masterId: number, ctx: IActionContext): Promise {\r\n const masterProductInput = new SelectedVariantInput(masterId, ctx.requestContext.apiSettings.channelId);\r\n return getSelectedVariant(masterProductInput, ctx);\r\n}","/*---------------------------------------------------------------------------------------------\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":""}