{"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/smwe-order-details/components/wine-club-details.tsx?7a40","webpack:///./src/modules/smwe-order-details/smwe-order-details.view.tsx?23fb","webpack:///src/modules/order-details/components/get-order-summary.tsx?eb46","webpack:///src/common/get-order-information.tsx?d70b","webpack:///src/modules/order-confirmation/components/index.ts?2e1f","webpack:///src/modules/checkout/methods/empty-active-cart.ts?524e","webpack:///src/modules/checkout/components/index.ts?5ba9","webpack:///./src/themes/elicit/views/smwe-order-details.view.tsx?b6af","webpack:///./src/modules/smwe-minicart/smwe-minicart.view.tsx?51ef","webpack:///./src/components/cartlineitem-variant.component.tsx?dd0c","webpack:///./src/modules/wine-club-signup/wine-club-data.ts?aeec","webpack:///src/modules/checkout/methods/checkout.ts?3b66","webpack:///src/modules/order-details/components/get-payment-methods.tsx?aeee","webpack:///./src/Utilities/analytics/google-analytics.ts?df4a","webpack:///./src/Utilities/analytics/analytics-dispatcher.ts?9802","webpack:///./src/themes/fth/views/carousel.view.tsx?f466","webpack:///src/common/address.tsx?6c70","webpack:///./src/components/cartlineitem.component.tsx?cc0d","webpack:///src/modules/order-confirmation/index.ts?bf5f","webpack:///./src/models/notification-message-type.ts?e64a","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/themes/emp/views/carousel.view.tsx?ae1e","webpack:///src/modules/order-confirmation/components/get-help.tsx?58bd","webpack:///src/modules/order-confirmation/order-confirmation.tsx?67f9","webpack:///src/common/get-groups.tsx?8b6a","webpack:///./src/modules/smwe-media-gallery/utils/get-valid-product-images.ts?1984","webpack:///./src/modules/smwe-media-gallery/smwe-media-gallery.tsx?f7aa","webpack:///src/modules/search-result-container/components/link.tsx?d3ce","webpack:///src/modules/search-result-container/components/product-search-result-items.tsx?1766","webpack:///src/modules/search-result-container/components/feature-search-result-item.tsx?98c1","webpack:///src/modules/search-result-container/components/title.tsx?365d","webpack:///src/modules/search-result-container/components/separator.tsx?7b76","webpack:///src/modules/search-result-container/components/utilities.ts?41e3","webpack:///src/modules/search-result-container/components/range-refine-item.tsx?6e24","webpack:///src/modules/search-result-container/components/refine-item.tsx?b232","webpack:///src/modules/search-result-container/components/choice-summary.tsx?f4a7","webpack:///src/modules/search-result-container/components/modal.tsx?afdd","webpack:///src/modules/search-result-container/components/refine-submenu.tsx?1e62","webpack:///src/modules/search-result-container/components/error-message.tsx?c0c2","webpack:///src/modules/search-result-container/search-result-container.tsx?97e0","webpack:///src/order-summary-lineitem.tsx?86d9","webpack:///src/modules/order-details/components/get-help.tsx?85e2","webpack:///../../../src/module-state-manager/module-state.ts?7579","webpack:///../../../src/module-state-manager/with-module-state.tsx?61ca","webpack:///src/modules/media-gallery/utils/get-valid-product-images.ts?4e26","webpack:///src/modules/media-gallery/media-gallery.tsx?3b46","webpack:///src/modules/checkout-order-confirmation/checkout-order-confirmation.tsx?1533","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/modules/order-confirmation/components/get-payment-methods.tsx?0bc9","webpack:///src/modules/carousel/carousel.view.tsx?b19a","webpack:///src/modules/order-history/index.ts?9849","webpack:///./src/modules/smwe-media-gallery/smwe-media-gallery.view.tsx?a42e","webpack:///src/modules/order-details/order-details.tsx?673a","webpack:///src/modules/cart-icon/components/flyout-cart-line-items.tsx?a0df","webpack:///src/modules/cart-icon/utils/get-products-in-mini-cart.ts?f52c","webpack:///src/modules/cart-icon/cart-icon.tsx?5b5f","webpack:///src/modules/order-history/actions/get-order-shipment-history.ts?2cf8","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/modules/search-result-container/search-result-container.view.tsx?3d61","webpack:///./src/Utilities/productType.tsx?e262","webpack:///src/common/index.ts?ee63","webpack:///src/modules/promo-banner/promo-banner.view.tsx?d069","webpack:///src/modules/checkout/index.ts?1106","webpack:///src/common/get-sales-lines.tsx?a840","webpack:///src/modules/order-history/components/get-sales-order.tsx?ac68","webpack:///src/index.ts?c6ae","webpack:///src/modules/checkout-loyalty/checkout-loyalty.view.tsx?876d","webpack:///src/modules/cart-icon/cart-icon.view.tsx?d63a","webpack:///src/modules/checkout/checkout.view.tsx?e9a7","webpack:///src/modules/checkout/checkout.tsx?baa3","webpack:///src/modules/order-details/order-details.view.tsx?018c","webpack:///src/modules/order-history/components/order-history-filter.tsx?ac38","webpack:///src/common/get-sales-line.tsx?39dd","webpack:///src/modules/gift-card-balance-check/components/get-form.tsx?f122","webpack:///src/modules/gift-card-balance-check/components/get-item.tsx?d7f7","webpack:///src/modules/gift-card-balance-check/gift-card-balance-check.tsx?6bc9","webpack:///./src/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/common/label.tsx?223a","webpack:///src/modules/media-gallery/media-gallery.view.tsx?6e14","webpack:///src/modules/promo-banner/components/close-button.tsx?939d","webpack:///src/modules/promo-banner/components/links.tsx?3133","webpack:///src/modules/promo-banner/components/text.tsx?834e","webpack:///src/modules/promo-banner/promo-banner.tsx?958e","webpack:///src/modules/order-confirmation/components/get-order-summary.tsx?fa69","webpack:///./src/Utilities/get-product-attributes.tsx?b745","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/order-confirmation/order-confirmation.view.tsx?8166","webpack:///./src/modules/smwe-cart/smwe-cart.view.tsx?c9ac","webpack:///src/modules/checkout/components/place-order-button.tsx?c8b4","webpack:///src/modules/order-history/order-history.view.tsx?251d","webpack:///./src/themes/stemichelle-new/views/carousel.view.tsx?1429","webpack:///src/modules/carousel/carousel.tsx?bfbb","webpack:///src/modules/checkout/components/get-order-summary.tsx?6f62","webpack:///./src/modules/smwe-order-details/components/get-help.tsx?adc0","webpack:///./src/modules/smwe-order-details/components/get-order-summary.tsx?fa70","webpack:///./src/modules/smwe-order-details/components/get-payment-methods.tsx?5f0e","webpack:///./src/modules/smwe-order-details/components/address.tsx?da2b","webpack:///./src/modules/smwe-order-details/components/label.tsx?8767","webpack:///./src/modules/smwe-order-details/components/utilities.ts?88d4","webpack:///./src/modules/smwe-order-details/components/get-sales-line.tsx?b41d","webpack:///./src/modules/smwe-order-details/smwe-order-details.tsx?99d9","webpack:///./src/modules/smwe-order-details/components/get-sales-lines.tsx?52b5","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-order-confirmation/checkout-order-confirmation.view.tsx?504a","webpack:///src/modules/checkout-delivery-options/checkout-delivery-options.view.tsx?d64d","webpack:///src/common/utilities.ts?0d8b","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/order-history/order-history.tsx?33c9","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","_getGroupTitleComponentWithMultiplePickUp","groupTitle","iconClass","lineItemWraperIcon","lineItemWraper","products","editCartText","EditCart","attribute","groupClass","LineItems","Header","Msdyn365","editProps","requestContext","editLink","href","itemsForPickup","itemsForShip","itemsForEmail","itemsGroupWithMulitplePickupMode","_getLineItems","WineClubDetails","wineClubData","variantPreference","_shipTypeJSX","_isGiftJSX","shipType","deliveryType","pickupLocationName","pickupLocationAddress","display","selectedLocation","orderDetailProps","app","wineClubPickupLocations","pickupLocationId","address","forMyself","OrderDetailsOrderInfomation","orderInformationProps","salesId","createdDate","amount","channelReferenceId","channelName","channelAddress","isWineClubOrder","Node","WineClubDetailsRender","OrderDetailsSalesLine","salesLineProps","salesLine","buyAgainButton","OrderDetailsGroupDelivery","deliveryProps","trackingInfo","OrderDetailsGroup","groupProps","delivery","salesLinesProps","salesLines","salesStatus","OrderDetailsGroups","groupsProps","groups","isWineClubPickup","group","OrderDetailsOrderSummary","orderSummaryProps","subtotal","shipping","tax","totalAmount","earnedPoints","OrderDetailsPayment","paymentMethodsProps","methods","OrderDetailsHelp","helpProps","needHelpLabel","helpLineNumberLabel","contactNumber","OrderDetailsView","alert","loading","orderInfomation","orderSummary","payment","help","Module","OrderSummaryLine","priceContext","getOrderDetailsOrderSummary","order","resource","orderSummaryHeading","orderSummaryItemsTotalLabel","orderSummaryShippingFeeLabel","orderSummaryTaxLabel","orderSummaryGrandTotalLabel","pointsEarnedLabel","SubtotalAmount","ChargeAmount","TaxAmount","TotalAmount","getOrderInformation","moduleName","showChannelInfo","receiptEmail","receiptId","receiptEmailMessage","orderItemLabel","orderItemsLabel","orderIdLabel","receiptIdLabel","confirmationIdLabel","posChannelNameText","onlineStoreChannelNameText","orderPlacedOnLabel","isSalesInvoice","getOrderInfomationInput","channelIdentities","apiSettings","channelId","locale","ChannelId","SalesLines","countItems","orderChannel","orderOrgUnitLocation","CreatedDateTime","Date","toLocaleDateString","SalesId","ReceiptId","ReceiptEmail","ChannelReferenceId","Address","emptyActiveCart","ctx","lineItemIdsToRemove","getCartState","getCheckoutState","e","Error","activeCart","activeCartLine","checkoutCartLine","removeCartLines","cartLineIds","removeAllPromoCodes","removeCheckoutCartId","line","brandCode","brandCodeParser","appContext","ariaHiddenFunc","window","ariaHidden","document","getElementsByClassName","i","setAttribute","CartIconView","onFocus","miniCartWrapper","renderModuleAttributes","cartIcon","FlyoutContainer","flyoutTitle","CartlinesWrapper","miniCartItemWrapper","cartline","storeLocation","remove","_renderCartlines","cartlines","totalPrice","checkoutAsSignInUserButton","goToCartButton","CartLineItemFunctions","renderProductDimensions","Product","DimensionStrings","Dimensions","productDimension","DimensionTypeValue","DimensionValue","Value","IsGiftCard","renderDiscountLines","DiscountLines","discountLine","OfferId","OfferName","DiscountCost","isSalesLine","PeriodicDiscount","DiscountAmountWithoutTax","BasePrice","DiscountAmount","Percentage","renderInventoryLabel","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","renderShippingLabel","hasShippingMethod","some","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","chargeTotal","CalculatedAmount","priceComponent","renderOtherCharges","otherCharges","chargeline","otherCharge","msdyn365Commerce","createComponent","component","destructDimensionStrings","fallbackImageUrl","getFallbackImageUrl","ItemId","cropFocalRegion","ObjectExtensions","isNullOrUndefined","productDimensions","renderDisountLines","prodAttribute","productName","_updateQuantity","quantityOnChange","parseInt","_generateSelectMenu","quantity","currentQuantity","nodes","_generateMenu","_generateQuantityAndPrice","isOutOfStock","classNames","maxQuantity","NetAmount","Price","NetAmountWithoutTax","NetPrice","displayMode","reducedDimensions","str","Image","src","fallBackSrc","altText","loadFailureBehavior","jsxName","MasterProductId","MasterProdDisplay","masterProdId","variantName","ArrayExtensions","hasElements","WineClubDataStore","LOCAL_STORAGE_LOCATION","changeEvents","previousWineData","localStorage","getItem","reset","JSON","parse","instance","getDeliveryMapFromConfig","coreContext","wineClubShippingLabels","standard","pickup","premium","edit","newData","_save","deleteKeys","tosAgree","clubId","isInResetState","setItem","stringify","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","giftCardExtend","Balance","tenderTypeId","giftCardPin","Pin","giftCardExpirationYear","ExpirationDate","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","getOrderDetailsPaymentMethods","tenderLines","tenderIdOperationIdMap","paymentMethodsTitle","creditCardEndingLabel","giftCardEndingLabel","amountCoveredLabel","loyaltyCardUsedLabel","cashUsedLabel","customerAccountUsedLabel","getLastFourDigit","digits","substr","lines","tenderLine","showAmount","cardLastFourDigit","MaskedCardNumber","isValidCardNumber","isNaN","AuthorizedAmount","showAmountCovered","getCard","getGiftCertificate","getLoyalty","getCash","getCustomerAccountPayment","formatProductData","brand","variant","category","discounts","coupon","discount","join","subscription","subscribe","frequency","addToCart","ecommerce","currencyCode","add","dataLayer","removeFromCart","productDetailView","detail","purchase","actionField","revenue","subTotal","transactionId","confirmationId","affiliation","impression","impressions","idx","position","step","subscriptions","publish","eventName","eventData","subscriber","handler","CarouselView","Carousel","closeAnimation","activeIndex","next","previous","pause","pauseOnHover","ride","autoplay","interval","transitionType","slots","content","hideFlipper","dismissEnabled","onIndicatorsClickHandler","handleDismissCarousel","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","directionTextPrev","flipperPrevious","directionTextNext","flipperNext","handleOnExited","handleOnExiting","showCompleteAddress","shipToLabel","storeLabel","phoneLabel","County","FullAddress","SmweCartLine","showImages","zeroAvailabilityError","intlFormatter","cultureFormatter","shouldDisableQty","toLowerCase","GiftCardItemId","_getPriceAdjustmentPercent","_getPriceDiscount","showDiscountPercent","_doubleDiscounts","DiscountCode","GiftCardFieldType","giftCardFormObj","FirstName","Key","Type","Extension","StringValue","Required","isValid","LastName","ElectronicDeliveryEmail","Attribute","ElectronicDeliveryEmailContent","_getPriceAdjustmentSavings","Fragment","priceAdjustmentSavings","productType","ProductType","check","isWineProduct","tabIndex","formatCurrency","Comment","_getCartLineComment","IsGiftCardLine","giftCardFormField","setGiftCardFormField","useState","formFieldsDebounce","setFormFieldsDebounce","useEffect","unhydratedCartLineLoad","field","fieldState","ExtensionProperties","property","extension","prevState","setFormFieldState","giftCardFormIsValid","RegExp","test","cartLineErrors","giftCardValidation","delayDebounceFn","setTimeout","ItemTaxGroupId","cartLineOnChange","updateFormFieldToCartLine","clearTimeout","handleChange","_renderGiftCardPrompt","NotificationType","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","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","_renderAppliedPromoCode","Coupons","appliedPromoCodeHeadingText","appliedPromoCodeSubheadingText","removePromoAriaLabelFormat","removePromoText","isCollapseOpen","promoCodeHeadingText","PromoCodeComponent","Cart","Component","cartLinesInvalid","parsedProductAttributes","_getImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","_removeItemFromCartHandler","cartlineToRemove","_generateRemovalAnalyticsEvent","getNotificationMessage","createNotificationMessage","messagetype","success","warning","debug","_moveToWishlistSuccessHandler","_updateCartlineQuantity","cartlineToUpdate","newQuantity","updateCartLineQuantity","componentDidMount","_setProductAttributes","_generateCheckoutAnalyticsEvent","signInUrl","routes","guestCheckoutUrl","getUrlSync","backToShoppingUrl","backToShoppingOverride","destinationUrl","backToShopping","checkoutURL","_getCheckoutURL","isCartEmpty","cartTitle","OrderSummaryWrapper","OrderSummaryItems","outOfStockThreshold","enableStockCheck","maxQuantityForCartLineItem","quantityDisplayText","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","invalidProductError","collapseTimeOut","duplicatePromotionErrorText","orderSummaryTitle","orderSummaryLineitems","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","taxLabel","estimatedTaxLabel","orderTotalLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","backToShoppingButton","backToShoppingButtonTitle","storeSelector","waitingComponent","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","checkoutButtonDisabled","cartLineStatus","isAbsoluteUrl","returnURL","origin","indexOf","productID","entry","isLineSubscriptionLine","mappedProducts","getAttributesForCart","getOrderConfirmationHelp","helpLineContactAriaLabel","OrderConfirmation","handleOrderConfirmationHeadingChange","getDeliveryMode","featureSate","pickupDeliveryMode","BackToShopping","backToShoppingAttributes","loyaltyCard","RewardPoints","pointPrograms","point","RewardPointId","rewardLines","LoyaltyRewardPointLines","total","RewardPointAmountQuantity","orderDetailsLines","orderDetailsLine","TenderLines","getTenderIdOperationIdMap","noSalesOrderText","loadingLabel","pickupItemsHeader","pickingItemsLabel","shippingAddressTitle","shippingItemToYouLabel","emailItemsHeader","emailingItemsLabel","showTimeslot","backToShoppingLink","footerProps","LabelComponent","isDataReady","TransactionTypeValue","salesLinesInput","getSalesLinesInput","getSalesLines","orderInfomationInput","getGroups","isConfirmationView","getOrderConfirmationOrderSummary","getOrderConfirmationPaymentMethods","computed","showAddress","groupSalesLines","_salesLines","pickingItemsLabelText","shippingItemsToYouText","emailingItemsLabelText","isProcessing","pickDateTimeslot","pickupDateTimeslot","shippedStatusCheck","pickupProps","processing","shippingItemsToYou","getValidProductImages","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","mediaLocations","validateMediaLocaionAsync","pairs","pair","mediaLocation","imageData","Uri","AltText","http","XMLHttpRequest","open","onload","onerror","send","MediaGallery","defaultGalleryImageSettings","md","defaultThumbnailImageSettings","noneWineProductImageSettings","xl","usePNGImageSetting","modifiedViewports","onExiting","animating","onExited","nextIndex","isLastItem","goToIndex","isFirstItem","mediaGalleryItems","_getCarouselItem","image","useAlternateImageSettings","galleryImageSettings","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","thumbnailImageSettings","which","KeyCodes","Enter","Space","modifiedImageSettings","isGiftCard","giftCardImage","wineAttributes","productSpecificationData","toUpperCase","attr","TextValue","showPaginationTooltip","_mapProductToImageData","isVertical","thumbnailsOrientation","isProductLightbox","parent","isProductLightBox","CarouselProps","previousScreenshotFlipperText","nextScreenshotFlipperText","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","Link","ProductSearchResultItems","moduleType","moduleId","allowBackNavigation","ProductComponent","ratingAriaLabel","allowBack","FeatureSearchResultItem","productRecordId","getProductPageUrlSync","fallbackImage","onTelemetryClick","imageUrl","img","imageProps","renderProductPlacementImage","featureSimilarLooksTitle","Title","Separator","separator","isRangeType","dataTypeValue","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","rangeStart","RightValueBoundString","rangeEnd","parentProductRefinerHierarchy","RefinerTypeValue","Values","child","matchingIndex","findIndex","criterion","splice","RangeRefineItem","_formattedPriceReverseLookup","Map","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","UnitText","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","isDisabled","formAttrs","rangeNameFormat","KeyName","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onBlur","ref","maxLabel","placeholderTextMax","max","sliderId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","current","focus","selected","touched","validationError","validationErrorRange","currency","trace","priceAmount","Intl","NumberFormat","style","currencyDisplay","minimumFractionDigits","formatPrice","has","set","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","getElementById","tooltip","RefineItem","_onClick","anchorType","children","attrs","isSingleSelect","itemTypeClassName","SourceValue","contentAction","etext","LeftValueBoundLocalizedString","_getRefinerUrl","Count","refinerRating","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","urlBuilder","ChoiceSummary","closeButtonGlyph","stopPropagation","clearAll","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedChoices","_getKeyForRefinerValue","clearAllText","choiceAriaLabel","selectedRefinersMap","clearAllAttributes","listItemProps","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","hierarchy","innerText","ModalToggle","innerRef","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","modalCloseButtonText","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","onUpdateRefiners","ErrorMessage","SearchResultContainer","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","_pageType","urlTokens","pageType","expandrefinerCount","_getActivePrice","listPageState","activeProducts","productRecIds","prod","projectDomain","CatalogId","catalogId","affliations","customerInput","GetCustomerInput","customer","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","AccountNumber","getActivePricesAsync","activePricesResponse","productPrices","activePrice","TradeAgreementPrice","AdjustedPrice","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","query","SearchResultContainer_1","getFriendlyName","NameTranslations","productCountNumber","productCountText","totalProductCount","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","nextText","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","refiners","refiner","activeRefiners","activeFilters","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","searchConfiguration","mappedConfiguration","sortColumn","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","dropdownOption","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","_viewport","device","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","querySorting","sorting","decodeURIComponent","pageSize","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","itemId","includeAttributes","getCollectionProducts","productResults","enableAffiliationBasedPricing","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","Text","MsDyn365","isBrowser","addEventListener","componentWillUnmount","removeEventListener","searchProduct","errorText","breaCrumbType","breadcrumbType","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","isMobile","FeatureSearchContainer","similarLookProduct","_getViewport","innerWidth","cssLabel","_buildOrderSummarySection","_computedLoyaltyAmount","dM","OtherChargeAmount","hasDeliveryMethod","deliveryModes","ShippingChargeAmount","getDeliveryConfiguration","otherChargeLabel","giftCardAmount","giftCardTotalValue","giftCard","_computeGiftCardAmount","totalAmountAfterGiftCard","loyalty","loyaltyLabel","giftcardLabel","totalDiscounts","getOrderDetailsHelp","ContactNumber","getCacheKey","getCacheObjectType","dataCacheType","getModuleStates","cacheKey","ModuleStatesCacheKey","moduleStates","WrappedComponent","_super","_this","states","_a","hasInitialized","isRequired","isCancellable","isSubmitContainer","childIds","validate","isPending","isSkipped","isCancelAllowed","shouldSubmitContainer","hasModuleState","setIsRequired","setIsSubmitContainer","onSkip","onDisable","getModule","getModuleStateManager","getModuleByTypeName","getModuleStateManagerByTypeName","options","__assign","values","_moduleState","modules","source","module","isMatch","allMatched","skipSkippableItem","_validateLeaf","method","childId","_validateContainer","enableControl","initializeState","__extends","ModuleState","imageSettingsVal","imageConcatVal","_inlineZoomDivRef","openModalDialog","imageModalSlider","ZoomView","carouselprops","_renderCarouselItemImageView","hideIndicator","carousel","imageModalSliderProps","ontoggle","galleryCarousel","ImagefullView","isImageZoomed","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","imageSource","curatedImage","images","lastUpdate","now","validateProductImages","allowFullscreen","allowFullScreen","zoomViewMode","imageZoom","zoomView","_renderImageInContainerOnZoom","_renderImageInlineOnZoom","_renderImageFullScreenOnZoom","divRef","dataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","inlineZoomImageOnHover","inlineZoomInit","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","fullScreenTitleText","parentDiv","querySelector","removeAttribute","removeInlineZoomStyle","handleCheckoutOrderConfirmationHeadingChange","_renderStoreLocation","updateItemClickHandler","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","priceString","totalPriceFormatString","CartIconComponent","cartLabel","cartQtyLabel","UncontrolledTooltip","placement","hideArrow","trigger","FlyoutCartLineItems","productDimensionTypeConfiguration","outOfStockText","outOfRangeOneText","outOfRangeFormatText","brandCodeTable","currentBrandCode","slice","brandFound","brandName","carouselContainer","_renderThumbnailItem","thumbnail","MediaGalleryView","thumbnails","_renderThumbnails","productLink","OrderDetails","handleOrderDetailsHeadingChange","noSalesOrderDetailsText","addressOptions","showFullAddress","channels","salesLInput","ProductAvailableQuantity","isServiceItem","ItemTypeValue","RemoveCartItem","removeCartItemAttribute","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","availableQuantity","CartIcon","payload","TelemetryEvent","CheckOut","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","ViewShoppingBag","viewShoppingBagAttributes","GetSalesOrderHistoryWithHydrationsInput","paging","filterState","buildCacheKey","OrderHistoryFilterState","CurrentUser","getSalesOrderHistoryWithHydrationsAction","salesOrders","getOrderShipmentsHistoryAsync","top","OrganizationWide","queryResultSetting","getOrganizationWideOrderHistory","GetOrganizationWideOrderHistoryInput","getOrganizationWideOrderShipmentHistory","productIdsByChannelId","currentChannelId","productIdsByChannel","orderProductId","orderChannelId","splitProductsByChannelId","getProductsPromise","entryChannelId","entryProductIdsList","productIds","productInputs","ProductInput","getSimpleProducts","getProducts","getProductsCall","productList","memo","createObservableDataAction","CartView","preventCheckout","lineId","_isInvalidCart","cartEmptyText","emptyCartText","itemsTitle","qtyTitle","unitPriceTitle","totalTitle","orderSummaryLines","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","assertive","fade","includeAlertClass","inputNumber","inputPin","inputExp","applyButton","showGiftCardPinInput","showGiftCardExpInput","inputProps","inputNumProps","inputPinProps","inputExpProps","getFormattedPrice","canRemove","onRemoveGiftCard","enteredGiftCardLabel","giftCardAvailableBalanceLabel","removeGiftCardButton","balance","CardCurrencyCode","giftCardLast4Digit","selectedGiftCard","removeButton","itemProps","getList","giftCards","listProps","GiftCardTitle","CheckoutGiftCard","isFetchingGiftCard","isEnabled","isPaymentVerificationRedirection","couldPaidByGiftCard","giftCardSupported","handleCancelOrSubmit","hasSelectedItem","enterGiftCardNumber","enterGiftCardPin","enterGiftCardExp","removeGiftCard","applyGiftCard","giftCardTypes","getGiftCardTypes","giftCardType","isPinRequired","IsPinRequired","isExpRequired","IsExpirationDateRequired","PaymentMethodId","getGiftCard","addGiftCard","additionalProperties","findGiftcardTenderTypes","giftcardType","matchedTenderTypes","ConnectorId","noBalanceError","invalidCardInfoError","invalidCardTypeError","noCardPinError","noCardExpError","supportedGiftCardType","internalGiftcardTenderTypes","externalGiftcardTenderTypes","includes","month","year","getGiftCardAsync","activeGiftCard","emptyInputError","duplicatedCodeError","invalidCodeError","card","getLoyaltyAmount","requestFormData","pv","when","showAdditionalFields","shouldPayGiftCard","moduleClassName","checkoutGiftCardProps","showGiftCard","TitleCompoent","form","PickUpAtStoreComponent","LineItemComponent","LineItemGroupComponent","lineItem","LineItemsComponent","itemsForSubscription","subscriptionHeader","OrderSummaryComponent","CheckoutView","canShow","checkoutProps","headerProps","hasSalesOrder","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","orderConfirmation","guidedForm","placeOrderButton","keepShoppingButton","createSearchResultModal","modalProps","createModalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","SearchResultContainerView","isWine","isEvent","EventDeliveryMode","PromoBannerView","promoBannerProps","contentProps","closeButton","bannerMessages","PromoBannerTextProps","PromoBannerLinksProps","handleLinks","handleText","slides","links","moduleComponentProps","shipments","isCurrentChannel","imageOnly","shipment","_shipment","ShipmentLines","_shipmentLine","getSalesLine","Shipments","getSalesOrder","detailsAriaLabel","detailsLabel","salesOrderProps","TransactionId","orderDetailsAttributes","orderDetailsLink","_getorderDetailsPageUrl","AddCheckoutLoyalty","cardNumber","drawer","rewardPoints","loyaltyAmountContainer","appliedLoyaltyAmountContainer","loyaltyAmountLabel","loyaltyAmountInput","loyaltyAmountApplyButton","showAppliedAmount","loyaltyAmountAppliedText","loyaltyAmountAppliedPrice","loyaltyAmountRemoveButton","rewardPoint","checkoutLoyaltyRewardPoint","availablePointsText","activePoints","expiringPointsText","expiringPoints","ShowCheckoutLoyalty","coveredAmountText","CheckoutLoyaltyView","checkoutLoyalty","showLoyalty","addLoyalty","isShowLoyalty","isShowAddLoyalty","EmailDeliveryComponent","LineItemGroupComponentWithMultiplePickUp","LineItemComponentWithMultiplePickUp","PickUpAtStoreComponentWithMultiplePickUp","termsAndConditionsProps","termsAndConditions","isValidationPassed","handleCheckoutHeadingChange","checkoutHeading","cartStatus","isEmptyCart","getSlotItems","onPlaceOrder","checkoutOutOfStockErrorMessage","invalidCartVersionErrorMessage","isOverMaxQuantity","hasOrderConfirmation","updateCartLineEmailAddress","placeOrder","emailDeliveryCartLines","lineDeliverySpecifications","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","ElectronicDeliveryEmailAddress","newGuestCheckoutEmail","updateLineDeliverySpecificationsAsync","updatedCart","productInventoryInformation","productInventory","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","checkoutBtnText","renderMsdyn365Text","AlertComponent","GuidedFormComponent","getOrderSummary","PlaceOrderButtonComponent","canPlaceOrder","getOrderHistoryFilterStateResources","orderHistoryFilterYourOrderHistory","orderHistoryFilterOrganizationWide","OrderHistoryFilterComponent","IsB2bAdmin","popoverRef","createRef","popoverState","setPopoverState","togglePopover","setFilterState","currentState","onFilterStateClick","clickedState","onFilterStateChanged","Popover","EnumExtensions","getEnumValues","onStateClick","stateStringRepresentation","renderFilterStateItem","salesLineQuantityText","phoneAriaLabel","buyItAgainLabel","buyItAgainAriaLabel","orderStatusReadyForPickup","orderStatusProcessing","orderStatusShipped","orderStatusPickedUp","orderStatusCanceled","orderStatusEmailed","pickedUpSalesLines","deliveredSalesLines","carryOutSalesLines","emailSalesLines","trackingLabel","trackingAriaLabel","trackingComingSoonLabel","pickupDateTimeslotText","pickupTimeslotPlaceHolder","salesStatusStringMap","canceled","readyForPickup","pickedUp","shipped","unknown","emailed","deliveryTypeStringMap","pickUp","ship","carryOut","email","pickupMode","getPickupModeDesc","getPickupDeliveryMode","getSalesStatusCode","SalesStatusValue","salesStatusString","salesStatusComp","deliveryTypeString","getdeliveryTypeString","deliveryTypeClass","getdeliveryTypeClassName","storePickUp","getStoreName","deliveryTypeComp","TrackingUrl","TrackingNumber","BuyItAgain","buyItAgainAttributes","canShowTimeslot","PickupTimeslotStartDateTime","PickupTimeslotEndDateTime","getDateTimeslot","pickupDateTimeslotInfo","defaultImageSettings","salesLineDeliveryMode","retailMultiplePickupOption","deliveryO","deliveryDesc","balanceCheckButton","GiftCardBalanceCheck","_isEnabled","_getFormattedPrice","_enterGiftCardNumber","_clearError","_enterGiftCardPin","_enterGiftCardExp","_setError","_applyGiftCard","_getGiftCardTypes","_getGiftCard","_findGiftcardTenderTypes","giftCardBalanceCheckProps","CheckoutAlert","subscriptionLineItems","nonSubscriptionItems","subscriptionItems","subLine","SUBCRIPTION_LINE","Heading","showLineItems","CheckoutGuidedCard","editButtonRef","formCardRef","renderFooder","isVisted","isSubmitting","hasControlGroup","saveAndContinueBtnLabel","canSubmit","canCancel","focusOnFirstFocusableElement","node","ReactDOM","findDOMNode","focusOnEditButton","scrollToTitle","formCard","scrollIntoView","getTitle","headingTag","Tag","componentDidUpdate","prevProps","isActive","onNext","modifyBtnLabel","canEdit","active","closed","visted","hidden","initialized","ready","updating","CheckoutGuidedForm","currentStep","getEnabledModules","getStep","getId","getHeading","_emitAnalyticsEvent","GuidedCard","subFrequency","getSubscriptionValues","isSubscription","CheckoutPlaceOrderButton","isBusy","setIsBusy","findCreditCardType","cardTypes","cardType","CardTypeValue","maskNumFrom","NumberFrom","maskNumTo","NumberTo","maskLength","cardSubStr","getCardTypesAsync","isWineClubCheckout","_setWineClubDeliveryOption","orderConfirmationLinkOverride","orderConfirmationOverride","orderedProducts","redirect","overrideConfirmationLink","orderConfirmationUrl","updateSalesOrder","newSalesOrder","newOrderedProducts","_setDefaultSubscriptionFields","wineClub","wineClubSetup","ids","club","variants","_navigateToCart","_isCartValidAsClub","lineFind","_clubItemIds","clubItemId","deliveryOptionInput","wineClubDeliveryOption","cartChanges","SUBSCRIPTION_NAME","SUBSCRIPTION_DEFAULT_NAME","SUBSCRIPTION_FREQUENCY","defaultSubscriptionFrequencyId","updateSubscription","Label","PromoBannerCloseButton","closeButtonAriaLabel","onClose","PromoBannerClose","PromoBannerLinks","onTextChange","editableLinks","_mapEditableLinks","linkdata","link","linkText","editableLink","linkUrl","openInNewTab","PromoBannerText","PromoBanner","isVisible","handleTextChange","handleLinkTextChange","linkIndex","_next","_isLastItem","_goToIndex","_previous","_isFirstItem","_onDismiss","closeButtonLabel","onDismiss","attributeCache","getAttributesByProductID","productIDs","groupedIDs","uncachedAttributes","uncached","productSearchCriteria","Ids","Context","searchAsync","output","translatedProperties","FriendlyName","ValueString","fetchProductAttributes","cached","cartItem","nonSubscriptionHeader","From","SelectedGiftCard","GiftCardList","AddResource","ShowResource","CheckoutGiftCardView","OrderConfirmationOrderInfomation","OrderConfirmationSalesLine","OrderConfirmationGroupDelivery","OrderConfirmationGroup","OrderConfirmationGroups","OrderConfirmationOrderSummary","OrderConfirmationPayment","OrderConfirmationHelp","OrderConfirmationView","mixModeCartError","contentSlotData","Purchase","OrderHistoryOrderInfomation","OrderHistoryGroupDelivery","OrderHistoryGroup","OrderHistoryGroups","OrderHistoryHeader","orderCountLabel","extraActions","OrderHistorySalesOder","OrderHistoryList","OrderHistoryView","orderHistoryProps","header","emptyMessage","moreButton","CarouselModule","_handleDismissCarousel","dismissCarousel","closeNow","_onExiting","_onExited","newIndex","statusValue","placeHolder","startDate","endDate","date","DateTimeFormat","timeZone","timeslotformatter","hour","minute","hour12","getInstance","wineClubIds","emitAnalyticsEvent","orderHydration","_generatePurchaseAnalyticsEvent","ext","fakeCartLines","Form","Item","GiftCardBalanceCheckView","AdressInput","ariaValueMax","ariaValueMin","ariaValueNow","CheckoutLoyaltyLabel","htmlFor","CheckoutLoyaltyText","CheckoutLoyalty","CardNumber","updateLoyaltyCardId","shouldPayLoyalty","_dialogToggleRef","_applyLoyaltyPoints","_removeLoyaltyPoints","_onBlur","dollarsApplied","maxDollars","isFetchingLoyaltyCard","loyaltyTransactionEstimation","MaxCurrencyValueOfLoyaltyPoints","_updateEstimate","_updateLoyalty","loyaltyHeadingText","TextComponent","loyaltyCoveredAmountText","Drawer","toggleButtonText","_drawerHeader","openGlyph","closeGlyph","glyphPlacement","points","_renderPointSection","availablePointsLabel","expiringLoyaltyPointsLabel","payWithLoyaltyAmountLabel","InputComponent","applyCheckoutLoyaltyPaymentText","removeCheckoutLoyaltyPaymentText","ActivePoints","PointsExpiringSoon","updateLoyaltyAmount","newAmount","parseFloat","num","channelConfig","loyalPointsRequest","createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput","_query","callActionOrExecute","GetLoyaltyTransactionEstimationInput","newMaxPoints","commerceValues","newValue","changedProperty","findAndUpdateLine","updateAsync","GetCheckoutCartInput","isProductSubscribable","productAttributes","SUBSCRIPTION_PRODUCT","BooleanValue","freq","filterCartLines","subscriptionLines","clearSubscription","editObj","DeliveryOptionList","DeliveryOptionSelected","CheckoutDeliveryOptionsView","getSalesLinesByDelivery","flatGroup","getGroupBySalesStatusCode","groupBySalesStatusCode","getGroupByAddressId","addressId","groupByAddressId","TrackingId","getGroupByTrackingId","trackingId","groupByTrackingId","Save","SaveContinue","saveBtnAttributes","Cancel","cancelBtnAttributes","changeBtnLabel","CheckoutChange","changeBtnAttributes","prodName","masterProductInput","SelectedVariantInput","getSelectedVariant","masterProduct","console","OrderHistory","handleOrderHistoryHeadingChange","onMoreButtonClick","getOrderHistory","renderExtraActions","initState","orderHistory","isShowMoreButton","ex","reject","noOrderHistoryLable","moreButtonText","ordersCountLabel","_orderCountLabel","ViewMore","viewMoreAttributes"],"mappings":"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","file":"static/js/3.d9ea7ae457fcdf3be261.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 * as React from 'react';\r\nimport { wineClubPickupLocations } from '../../../settings/app.settings';\r\nimport { WineClubDataRef } from '../../wine-club-signup/wine-club-data';\r\nimport { IOrderDetailsViewProps } from '../smwe-order-details';\r\n\r\nexport interface IWineClubDetailsProps {\r\n orderDetailProps: IOrderDetailsViewProps;\r\n wineClubData: WineClubDataRef;\r\n}\r\n\r\n/**\r\n * renders wine club details ONCE, and wipes\r\n */\r\nexport class WineClubDetails extends React.Component {\r\n constructor(props: IWineClubDetailsProps) {\r\n super(props);\r\n }\r\n\r\n public render(): JSX.Element {\r\n if (this.props.wineClubData.variantPreference === null) {\r\n return
;\r\n }\r\n return (\r\n
\r\n {this._shipTypeJSX}\r\n {this._isGiftJSX}\r\n
\r\n );\r\n }\r\n\r\n private get _shipTypeJSX(): JSX.Element {\r\n const shipType = this.props.wineClubData.deliveryType;\r\n\r\n let display = 'Ship To';\r\n let pickupLocationName: string | undefined;\r\n let pickupLocationAddress: string | undefined;\r\n if (shipType === 'PICKUP') {\r\n display = 'Pickup';\r\n const locations = this.props.orderDetailProps.context.app.config.wineClubPickupLocations as wineClubPickupLocations || [];\r\n const selectedLocation = locations.find(location => location.id === this.props.wineClubData.pickupLocationId);\r\n if (selectedLocation) {\r\n pickupLocationName = selectedLocation.name;\r\n pickupLocationAddress = selectedLocation.address;\r\n }\r\n }\r\n\r\n return (\r\n \r\n
\r\n Delivery Method:\r\n {display}\r\n
\r\n {\r\n shipType === 'PICKUP' && (\r\n
\r\n Deliver To:\r\n {pickupLocationName} at\r\n {pickupLocationAddress}\r\n
\r\n )\r\n }\r\n
\r\n );\r\n }\r\n\r\n private get _isGiftJSX(): JSX.Element {\r\n return (\r\n
\r\n Gift Membership:\r\n \r\n {\r\n this.props.wineClubData.forMyself ? 'No' : 'Yes'\r\n }\r\n \r\n
\r\n );\r\n }\r\n\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n IGroup,\r\n IGroupDelivery,\r\n IGroups,\r\n IHelp,\r\n IOrderInformation,\r\n IOrderSummary,\r\n IPaymentMethods,\r\n ISalesLine\r\n} from '@msdyn365-commerce-modules/order-management';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { WineClubDetails } from './components/wine-club-details';\r\nimport { IOrderDetailsViewProps } from './smwe-order-details';\r\n\r\nexport const OrderDetailsOrderInfomation: React.FC = ({\r\n orderInformationProps,\r\n salesId,\r\n createdDate,\r\n count,\r\n amount,\r\n channelReferenceId,\r\n channelName,\r\n channelAddress,\r\n isWineClubOrder,\r\n props\r\n}) => (\r\n \r\n {channelName}\r\n {channelAddress}\r\n {channelReferenceId}\r\n {salesId}\r\n {createdDate}\r\n {count}\r\n {amount}\r\n {isWineClubOrder && props && WineClubDetailsRender(props)}\r\n \r\n);\r\n\r\nexport const OrderDetailsSalesLine: React.FC = ({ salesLineProps, salesLine, buyAgainButton }) => (\r\n \r\n {salesLine}\r\n {buyAgainButton}\r\n \r\n);\r\n\r\nexport const OrderDetailsGroupDelivery: React.FC = ({ deliveryProps, heading, count, address, trackingInfo, isWineClubOrder }) => {\r\n return (\r\n \r\n {heading}\r\n {count}\r\n {address}\r\n {trackingInfo}\r\n \r\n );\r\n};\r\n\r\nexport const OrderDetailsGroup: React.FC = ({ groupProps, delivery, salesLinesProps, salesLines, isWineClubOrder }) => (\r\n \r\n {delivery && }\r\n {salesLines && (\r\n \r\n {salesLines.map(salesLine => (\r\n \r\n \r\n {salesLine.salesStatus}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n);\r\n\r\nexport const OrderDetailsGroups: React.FC = ({ groupsProps, groups, isWineClubOrder, isWineClubPickup }) => (\r\n \r\n {groups.map((group, index) => (\r\n \r\n ))}\r\n \r\n);\r\n\r\nexport const OrderDetailsOrderSummary: React.FC = ({ orderSummaryProps, heading, subtotal, shipping, tax, totalAmount, earnedPoints }) => (\r\n \r\n {heading}\r\n {subtotal}\r\n {shipping}\r\n {tax}\r\n {totalAmount}\r\n {earnedPoints}\r\n \r\n);\r\n\r\nexport const OrderDetailsPayment: React.FC = ({ paymentMethodsProps, title, methods }) => (\r\n \r\n {title}\r\n {methods}\r\n \r\n);\r\n\r\nexport const OrderDetailsHelp: React.FC = ({ helpProps, needHelpLabel, helpLineNumberLabel, contactNumber }) => (\r\n \r\n {needHelpLabel}\r\n {helpLineNumberLabel}\r\n {contactNumber}\r\n \r\n);\r\n\r\nexport const WineClubDetailsRender = (props: IOrderDetailsViewProps) => {\r\n return ;\r\n};\r\n\r\nconst OrderDetailsView: React.FC = (props) => {\r\n const {\r\n moduleProps,\r\n heading,\r\n alert,\r\n loading,\r\n orderInfomation,\r\n orderSummary,\r\n payment,\r\n help,\r\n groups,\r\n isWineClubOrder,\r\n isWineClubPickup\r\n } = props;\r\n\r\n return (\r\n \r\n {heading}\r\n {alert}\r\n {loading}\r\n {orderInfomation && }\r\n {groups && }\r\n {orderSummary && }\r\n {payment && }\r\n {help && }\r\n \r\n );\r\n};\r\n\r\nexport default OrderDetailsView;\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 { PriceComponent } from '@msdyn365-commerce/components';\n\nimport * as React from 'react';\nimport { IGetOrderSummaryInput, IOrderSummary, IPriceContext } from '../../../common/';\n\ninterface ISummaryLineProps {\n priceContext?: IPriceContext;\n name: string;\n label: string;\n value?: number;\n}\n\nconst OrderSummaryLine: React.SFC = ({ name, label, value = 0, priceContext }) => (\n

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

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

{orderSummaryHeading}

,\n subtotal: (\n \n ),\n shipping: canShip ? (\n \n ) : '',\n tax: ,\n totalAmount: (\n \n ),\n earnedPoints: earnedPoints ? : undefined\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ChannelIdentity, OrderShipments, OrgUnitLocation, SalesOrder } from '@msdyn365-commerce/retail-proxy';\nimport get from 'lodash/get';\nimport * as React from 'react';\nimport { countItems, IModuleComponentProps, IPriceContext } from './utilities';\n\nexport interface IOrderInformationInputResources {\n receiptEmailMessage?: string;\n orderItemLabel: string;\n orderItemsLabel: string;\n processingLabel: string;\n orderIdLabel: string;\n receiptIdLabel: string;\n confirmationIdLabel: string;\n trackingLabel: string;\n trackingAriaLabel: string;\n trackingComingSoonLabel: string;\n posChannelNameText?: string;\n onlineStoreChannelNameText?: string;\n orderPlacedOnLabel?: string;\n}\nexport interface IOrderInformationInput {\n moduleName: string;\n channelReferenceId?: string;\n channelName?: string;\n channelAddress?: string;\n showChannelInfo?: boolean;\n receiptEmail?: string;\n createdDate?: string;\n amount?: number;\n priceContext: IPriceContext;\n salesId?: string;\n receiptId?: string;\n hasTrackingInfo?: boolean;\n count?: number;\n resources: IOrderInformationInputResources;\n isSalesInvoice?: boolean;\n}\n\nexport interface IOrderInformation {\n orderInformationProps: INodeProps;\n channelName: React.ReactNode;\n channelAddress: React.ReactNode;\n salesId: React.ReactNode;\n receiptId: React.ReactNode;\n receiptEmail: React.ReactNode;\n createdDate: React.ReactNode;\n count: React.ReactNode;\n amount: React.ReactNode;\n channelReferenceId: React.ReactNode;\n}\n\nexport const getOrderInformation = ({\n moduleName,\n channelReferenceId,\n channelName,\n channelAddress,\n showChannelInfo,\n receiptEmail,\n createdDate,\n amount,\n priceContext,\n salesId,\n receiptId,\n count,\n resources: { receiptEmailMessage, orderItemLabel, orderItemsLabel, orderIdLabel, receiptIdLabel, confirmationIdLabel, posChannelNameText, onlineStoreChannelNameText, orderPlacedOnLabel },\n isSalesInvoice\n}: IOrderInformationInput): IOrderInformation => ({\n orderInformationProps: { className: `${moduleName}__order-information` },\n channelName: showChannelInfo && channelName && (\n channelAddress ? {`${posChannelNameText} ${channelName}`}\n : {onlineStoreChannelNameText}),\n channelAddress: showChannelInfo && channelAddress && {channelAddress},\n salesId: salesId ? {`${orderIdLabel} ${salesId}`} : '',\n receiptId: receiptId ? {`${receiptIdLabel} ${receiptId}`} : '',\n receiptEmail: receiptEmail && (\n \n {receiptEmailMessage}\n {receiptEmail}\n \n ),\n createdDate: !isSalesInvoice && createdDate && {orderPlacedOnLabel} {createdDate},\n count: !isSalesInvoice && count !== undefined && count > 0 && (\n \n {count === 1 ? `${count} ${orderItemLabel}` : `${count} ${orderItemsLabel}`}\n \n ),\n amount: !isSalesInvoice && (amount || amount === 0) && (\n \n ),\n channelReferenceId: channelReferenceId && (\n {`${confirmationIdLabel} `}{channelReferenceId}\n )\n});\n\ninterface IProps extends IModuleComponentProps {\n resources: IOrderInformationInputResources;\n}\n\nexport const getOrderInfomationInput = (\n props: IProps,\n moduleName: string,\n order: SalesOrder | OrderShipments,\n priceContext: IPriceContext,\n channelIdentities?: ChannelIdentity[],\n orgUnitLocations?: OrgUnitLocation[],\n showChannelInfo?: boolean,\n isSalesInvoice?: boolean\n): IOrderInformationInput => {\n const {\n resources,\n context: {\n request: {\n apiSettings: { channelId }\n }\n }\n } = props;\n\n // @ts-ignore OrderShipments doesnt has ChannelId\n const showTrackingInfo = !!order.ChannelId && order.ChannelId === channelId;\n\n const locale = get(props, 'context.request.locale') || 'en-US';\n const count = order.SalesLines && order.SalesLines.length ? countItems(order.SalesLines) : 0;\n\n const orderChannel = channelIdentities ? channelIdentities.filter(channel => { return channel.RecordId === order.ChannelId; }) : '';\n const orderOrgUnitLocation = orgUnitLocations ? orgUnitLocations.filter(location => { return location.ChannelId === order.ChannelId; }) : '';\n\n return {\n moduleName: moduleName,\n createdDate: (order.CreatedDateTime && new Date(order.CreatedDateTime).toLocaleDateString(locale)) || '',\n salesId: order.SalesId,\n receiptId: order.ReceiptId,\n showChannelInfo: showChannelInfo,\n // @ts-ignore OrderShipments doesnt has ReceiptEmail\n receiptEmail: order.ReceiptEmail,\n channelReferenceId: order.ChannelReferenceId,\n channelName: orderChannel && orderChannel.length > 0 ? orderChannel[0].Name : '',\n channelAddress: orderOrgUnitLocation && orderOrgUnitLocation.length > 0 ? orderOrgUnitLocation[0].Address : '',\n amount: order.TotalAmount || 0,\n priceContext: priceContext,\n count,\n resources,\n isSalesInvoice\n };\n};\n","export * from './get-help';\nexport * from './get-order-summary';\nexport * from './get-payment-methods';","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\nimport {\r\n IGroup,\r\n IGroupDelivery,\r\n IGroups,\r\n IOrderDetailsViewProps,\r\n IOrderInformation,\r\n IOrderSummary,\r\n IPaymentMethods,\r\n ISalesLine\r\n} from '@msdyn365-commerce-modules/order-management';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\r\nimport * as React from 'react';\r\nimport { brandCodeParser } from '../../../Utilities/brand-code-parser';\r\n\r\nexport const OrderDetailsOrderInfomation: React.FC = ({\r\n orderInformationProps,\r\n salesId,\r\n createdDate,\r\n channelReferenceId,\r\n count\r\n}) => (\r\n \r\n {salesId}\r\n {createdDate}\r\n {channelReferenceId}\r\n {count}\r\n \r\n);\r\n\r\nexport const OrderDetailsSalesLine: React.FC<{line: ISalesLine; context: ICoreContext}> = ({ line: { salesLineProps, salesLine, buyAgainButton, data }, context }) => {\r\n const brandCode = brandCodeParser({ description: data.product.Description, appContext: context });\r\n return (\r\n \r\n {brandCode &&
{brandCode}
}\r\n {salesLine}\r\n {buyAgainButton}\r\n
\r\n );\r\n};\r\n\r\nexport const OrderDetailsGroupDelivery: React.FC = ({ deliveryProps, address, trackingInfo }) => (\r\n \r\n {address}\r\n {trackingInfo}\r\n \r\n);\r\n\r\nexport const OrderDetailsGroup: React.FC<{group: IGroup; context:ICoreContext}> = ({ group: { groupProps, delivery, salesLinesProps, salesLines }, context }) => (\r\n \r\n {delivery && }\r\n {salesLines && (\r\n \r\n {salesLines.map(salesLine => (\r\n \r\n \r\n \r\n ))}\r\n \r\n )}\r\n \r\n);\r\n\r\nexport const OrderDetailsGroups: React.FC<{groups: IGroups; context: ICoreContext}> = ({ groups: { groupsProps, groups }, context }) => (\r\n \r\n {groups.map((group, index) => (\r\n \r\n ))}\r\n \r\n);\r\n\r\nexport const OrderDetailsOrderSummary: React.FC = ({ orderSummaryProps, heading, subtotal, shipping, tax, totalAmount }) => (\r\n \r\n {heading}\r\n {subtotal}\r\n {shipping}\r\n {tax}\r\n {totalAmount}\r\n \r\n);\r\n\r\nexport const OrderDetailsPayment: React.FC = ({ paymentMethodsProps, title, methods }) => (\r\n \r\n {title}\r\n {methods}\r\n \r\n);\r\n\r\nconst OrderDetailsView: React.FC = ({\r\n moduleProps,\r\n alert,\r\n loading,\r\n orderInfomation,\r\n orderSummary,\r\n payment,\r\n groups,\r\n context\r\n}) => {\r\n return (\r\n \r\n {alert}\r\n {loading}\r\n {orderInfomation && }\r\n
\r\n {groups && }\r\n
\r\n
\r\n
\r\n {groups && }\r\n {payment && }\r\n
\r\n
\r\n {orderSummary && }\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default OrderDetailsView;\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/* 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 ariaHiddenFunc=()=>{\r\n if(typeof window!=='undefined'){\r\n const ariaHidden=document.getElementsByClassName('msc-flyout-inner');\r\n for(var i=0;i {\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 \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\n\r\nexport default CartIconView;","/*!\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 { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, IGridSettings, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { CartLine as CartLineType, SalesLine as SalesLineType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\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 /** String for amount key */\r\n amountString?: 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 /** Aria label for the decrement button in quanitity component */\r\n decrementButtonAriaLabel?: string;\r\n /** Aria label for the increment button in quanitity component */\r\n incrementButtonAriaLabel?: string;\r\n /** original text screenreader */\r\n originalPriceText: string;\r\n /** current text screenreader */\r\n currentPriceText: string;\r\n /** shipping Charges Text */\r\n shippingChargesText: string;\r\n}\r\n\r\ninterface ICartLineData {\r\n cartLine: CartLineType | SalesLineType;\r\n product?: SimpleProduct;\r\n}\r\n\r\nexport type CartLineDisplayMode = 'DEFAULT' | 'COMPACT';\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 /** Error message to show in place of quantity */\r\n errorMessage?: string;\r\n /** Display mode to use */\r\n displayMode?: CartLineDisplayMode;\r\n /** Inventory information label */\r\n inventoryInformationLabel?: string;\r\n /** Inventory information class name */\r\n inventoryLabelClassName?: string;\r\n /** Flag to show/hide shipping charges for line items */\r\n showShippingChargesForLineItems?: boolean;\r\n /** Boolean flag to indicate if cart state status is ready */\r\n isCartStateReady?: boolean;\r\n /** Chanel Delivery Option configuration is from api. */\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n /** Quantity onChange callback */\r\n quantityOnChange?(cartLine: CartLineType, newQuantity: number): void;\r\n}\r\n\r\ninterface IDimensionStrings {\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 /** String for amount key */\r\n amountString?: string;\r\n}\r\n\r\nconst CartLineItemFunctions = {\r\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\r\n if (!Product || !Product.Dimensions) {\r\n return [];\r\n }\r\n\r\n return Product.Dimensions.map(productDimension => {\r\n\r\n if (productDimension.DimensionTypeValue === 1) {\r\n return (\r\n
\r\n {DimensionStrings.colorString}\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 2) {\r\n return (\r\n
\r\n {DimensionStrings.configString}\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 3) {\r\n return (\r\n
\r\n {DimensionStrings.sizeString}\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 4) {\r\n return (\r\n
\r\n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n
\r\n );\r\n }\r\n return null;\r\n });\r\n },\r\n renderDiscountLines: (props: ICartLineProps) => {\r\n\r\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\r\n return null;\r\n }\r\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\r\n return (\r\n
\r\n \r\n {discountLine.OfferName ? discountLine.OfferName : ''}:\r\n {` ${props.resources.discountStringText || 'Discount'} `}\r\n \r\n \r\n {discountLine.DiscountCost && (\r\n <>\r\n \r\n \r\n )}\r\n \r\n \r\n {` (${discountLine.Percentage !== undefined ? discountLine.Percentage : ''}%)`}\r\n \r\n
\r\n );\r\n });\r\n },\r\n renderInventoryLabel: (props: ICartLineProps) => {\r\n if (!props.inventoryInformationLabel) {\r\n return null;\r\n }\r\n const inventoryCssName = props.inventoryLabelClassName ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}` : 'msc-cart-line__product-inventory-label';\r\n return (\r\n {props.inventoryInformationLabel}\r\n );\r\n },\r\n renderShippingLabel: (props: ICartLineProps) => {\r\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\r\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\r\n const cartline = props.data.cartLine;\r\n let hasShippingMethod = false;\r\n if(channelDeliveryOptionConfig !== undefined) {\r\n hasShippingMethod = !!cartline.DeliveryMode && channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode) ? true : false;\r\n } else {\r\n hasShippingMethod = !!cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode ? true : false;\r\n }\r\n if (!hasShippingMethod) {\r\n return undefined;\r\n }\r\n\r\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\r\n\r\n if (shippingChargeLines.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\r\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\r\n }, 0);\r\n\r\n const priceComponent = (\r\n \r\n );\r\n return (\r\n <>\r\n \r\n \r\n {priceComponent}\r\n \r\n \r\n );\r\n },\r\n renderOtherCharges: (props: ICartLineProps) => {\r\n const cartline = props.data.cartLine;\r\n const otherCharges = cartline.ChargeLines?.filter((chargeline) => !chargeline.IsShipping);\r\n\r\n return otherCharges && otherCharges.map((otherCharge, key) => {\r\n return otherCharge && otherCharge.CalculatedAmount ? (\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n ) : '';\r\n }) || undefined;\r\n }\r\n};\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nconst CartLine: React.FC = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources } = props;\r\n const { product, cartLine } = props.data;\r\n\r\n const destructDimensionStrings = {\r\n sizeString: resources.sizeString,\r\n colorString: resources.colorString,\r\n styleString: resources.styleString,\r\n configString: resources.configString,\r\n amountString: resources.amountString\r\n };\r\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\r\n const imageSettings = props.imageSettings;\r\n imageSettings.cropFocalRegion = !ObjectExtensions.isNullOrUndefined(imageSettings);\r\n const { inputQuantityAriaLabel } = props.resources;\r\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\r\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\r\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\r\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\r\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\r\n const prodAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n const productName = product?.Name || cartLine.Description;\r\n\r\n const _generateErrorMessage = (): JSX.Element | null => {\r\n if (props.errorMessage) {\r\n return (\r\n
\r\n \r\n {props.errorMessage}\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n const _updateQuantity = (event: React.ChangeEvent) => {\r\n if (props.quantityOnChange) {\r\n props.quantityOnChange(props.data.cartLine, parseInt(event.target.value, 10));\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\r\n // tslint:disable-next-line:react-a11y-role-has-required-aria-props\r\n nodes.push();\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n const _generateSelectMenu = (quantity: number, currentQuantity: number | undefined): JSX.Element => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n const _generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n\r\n const errorMessage = _generateErrorMessage();\r\n\r\n if (props.isOutOfStock) {\r\n if (errorMessage) {\r\n return [errorMessage];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n if (props.isQuantityEditable && !props.data.product?.IsGiftCard) {\r\n if (errorMessage) {\r\n nodes.push(errorMessage);\r\n }\r\n nodes.push(_generateSelectMenu(props.maxQuantity || 10, props.currentQuantity));\r\n } else {\r\n nodes.push(\r\n
\r\n \r\n {errorMessage}\r\n {props.data.cartLine.Quantity}\r\n
\r\n );\r\n }\r\n\r\n nodes.push(\r\n
\r\n \r\n
\r\n );\r\n\r\n return nodes;\r\n };\r\n\r\n if (props.displayMode === 'COMPACT') {\r\n const reducedDimensions: string = product?.Dimensions ? product.Dimensions.reduce(\r\n (str, productDimension) => {\r\n if (productDimension.DimensionValue && productDimension.DimensionValue.Value) {\r\n if (str) {\r\n return `${str}, ${productDimension.DimensionValue.Value}`;\r\n }\r\n\r\n return `${productDimension.DimensionValue.Value}`;\r\n }\r\n\r\n return str;\r\n },\r\n '') : '';\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n {productName}\r\n {reducedDimensions !== '' ?\r\n
{reducedDimensions}
:\r\n ''\r\n }\r\n {\r\n _generateQuantityAndPrice()\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n let jsxName = {productName};\r\n if (product?.MasterProductId) {\r\n jsxName = ;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {jsxName}\r\n {\r\n ArrayExtensions.hasElements(productDimensions) ?\r\n
{productDimensions}
:\r\n ''\r\n }\r\n {renderDisountLines}\r\n {renderInventoryLabel}\r\n {props.showShippingChargesForLineItems &&
\r\n {renderShippingLabel}\r\n
}\r\n {renderOtherCharges}\r\n
\r\n {\r\n _generateQuantityAndPrice()\r\n }\r\n
\r\n
\r\n );\r\n};\r\n\r\n// @ts-ignore\r\nexport const CartLineItemComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\r\n 'CartLineItem',\r\n { component: CartLine, ...CartLineItemFunctions }\r\n);","import { ICoreContext } from '@msdyn365-commerce/core-internal';\r\nimport { wineClubShippingLabels } from '../../settings/app.settings';\r\n\r\nexport type WineClubDataRef = {\r\n variantPreference: string | null;\r\n forMyself: boolean | null;\r\n deliveryType: DeliveryType;\r\n clubId: number | null;\r\n tosAgree: boolean;\r\n pickupLocationId?: string;\r\n};\r\n\r\nexport type DeliveryType = 'STANDARD' | 'PREMIUM' | 'PICKUP';\r\nexport type DeletableKeys = 'variantPreference' | 'forMyself' | 'deliveryType' | 'clubId' | 'tosAgree' | 'pickupLocationId';\r\n\r\n/**\r\n * singleton class responsible for the users selections\r\n */\r\nexport class WineClubDataStore {\r\n private static instance: WineClubDataStore;\r\n\r\n private readonly LOCAL_STORAGE_LOCATION: string = 'WINE-CLUB-SELECTIONS';\r\n\r\n private wineClubData!: WineClubDataRef;\r\n\r\n private changeEvents: ((newData: WineClubDataRef) => void)[] = [];\r\n\r\n /**\r\n * get the current pages data\r\n * @returns singleton data of data store\r\n */\r\n public static getInstance(onChange?: (newData: WineClubDataRef) => void): WineClubDataStore {\r\n if (!WineClubDataStore.instance) {\r\n WineClubDataStore.instance = new WineClubDataStore();\r\n }\r\n\r\n if (onChange) {\r\n WineClubDataStore.instance.changeEvents.push(onChange);\r\n }\r\n\r\n return WineClubDataStore.instance;\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n public getDeliveryMapFromConfig(coreContext: ICoreContext<{ [x: string]: any }>): {\r\n standard: string; premium: string; pickup: string;\r\n } {\r\n const config = coreContext.app.config.wineClubShippingLabels || {};\r\n return {\r\n standard: config.standard,\r\n pickup: config.pickup,\r\n premium: config.premium\r\n };\r\n }\r\n\r\n public edit(newData: WineClubDataRef): void {\r\n this.wineClubData = newData;\r\n this.changeEvents.forEach(event => event(newData));\r\n this._save();\r\n }\r\n\r\n public get(): WineClubDataRef {\r\n return { ...this.wineClubData };\r\n }\r\n\r\n public deleteKeys(...keys: DeletableKeys[]): void {\r\n keys.forEach(key => delete this.wineClubData[key]);\r\n this.changeEvents.forEach(event => event(this.wineClubData));\r\n this._save();\r\n }\r\n\r\n public reset(): WineClubDataStore {\r\n this.wineClubData = {\r\n deliveryType: 'STANDARD',\r\n tosAgree: false,\r\n forMyself: null,\r\n clubId: null,\r\n variantPreference: null\r\n };\r\n this.changeEvents.forEach(event => event(this.wineClubData));\r\n this._save();\r\n return this;\r\n }\r\n\r\n public isInResetState(): boolean {\r\n const {\r\n deliveryType,\r\n tosAgree,\r\n forMyself,\r\n clubId,\r\n variantPreference\r\n } = this.wineClubData;\r\n\r\n return deliveryType === 'STANDARD' &&\r\n tosAgree === false &&\r\n forMyself === null &&\r\n clubId === null &&\r\n variantPreference === null;\r\n }\r\n\r\n private constructor() {\r\n // tslint:disable-next-line: no-typeof-undefined\r\n if (typeof window !== 'undefined') {\r\n const previousWineData = window && window.localStorage.getItem(this.LOCAL_STORAGE_LOCATION);\r\n\r\n if (!previousWineData) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n this.wineClubData = JSON.parse(previousWineData);\r\n }\r\n }\r\n\r\n private _save(): void {\r\n // tslint:disable-next-line: no-typeof-undefined\r\n if (typeof window !== 'undefined') {\r\n window.localStorage.setItem(this.LOCAL_STORAGE_LOCATION, JSON.stringify(this.wineClubData));\r\n }\r\n }\r\n}","import { IActionContext } from '@msdyn365-commerce/core';\nimport { getCheckoutState } from '@msdyn365-commerce/global-state';\nimport { checkoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n getTenderTypesAsync, resolveCardTypesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport {\n Address, CardType, CartTenderLine, RetailOperation, SalesOrder, TenderType, TokenizedPaymentCard\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nexport const OPERATIONS = {\n PayCard: 201,\n PayGiftCertificate: 214,\n PayLoyalty: 207,\n PayCustomerAccount: 202\n};\n\nconst getCardTypeId = async (ctx: IActionContext, cardPrefix: string = ''): Promise => {\n try {\n const response = await resolveCardTypesAsync({ callerContext: ctx }, cardPrefix, CardType.Unknown);\n if (response && response.length > 0) {\n return response[0].TypeId;\n }\n } catch (error) {\n ctx.telemetry.error('Call to resolveCardTypesAsync failed.', error);\n }\n return undefined;\n};\n\nconst findTenderIdTypeByOperationId = (tenderTypes: TenderType[], operationId: RetailOperation): string | undefined => {\n const matchedTenderType = tenderTypes.find(tenderType => tenderType.OperationId === operationId);\n if (matchedTenderType) {\n return matchedTenderType.TenderTypeId;\n }\n return;\n};\n\nconst roundNumber = (value: number) => Number(value.toFixed(2));\n\nasync function getLoyaltyTenderLine(\n ctx: IActionContext,\n LoyaltyCardId: string,\n Amount: number = 0,\n Currency: string = 'USD'\n): Promise {\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n if (!tenderTypes) {\n throw new Error('Fail to get gift card tender line');\n }\n\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayLoyalty);\n return {\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n 'Amount@odata.type': '#Decimal',\n Currency,\n TenderTypeId,\n Amount,\n LoyaltyCardId\n };\n}\n\nasync function getGiftCardTenderLine(\n ctx: IActionContext,\n GiftCardId: string = '',\n Amount: number = 0,\n Currency: string = 'USD',\n tenderTypeId?: string,\n giftCardPin?: string,\n giftCardExpirationYear?: number,\n giftCardExpirationMonth?: number\n): Promise {\n let TenderTypeId = tenderTypeId;\n\n if (!TenderTypeId) {\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n if (!tenderTypes) {\n throw new Error('Fail to get gift card tender line');\n }\n TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayGiftCertificate);\n }\n\n const GiftCardPin = giftCardPin;\n const GiftCardExpirationYear = giftCardExpirationYear;\n const GiftCardExpirationMonth = giftCardExpirationMonth;\n return {\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n 'Amount@odata.type': '#Decimal',\n Currency,\n TenderTypeId,\n Amount,\n GiftCardId,\n GiftCardPin,\n GiftCardExpirationYear,\n GiftCardExpirationMonth\n };\n}\n\nasync function getCreditCardTenderLine(\n ctx: IActionContext,\n tokenizedPaymentCard: TokenizedPaymentCard,\n cardPrefix: string = '',\n Amount: number = 0,\n Currency: string = 'USD',\n billingAddress?: Address\n): Promise {\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n let cartTypeId = tokenizedPaymentCard.CardTypeId;\n\n if (!cartTypeId) {\n cartTypeId = await getCardTypeId(ctx, cardPrefix);\n }\n\n if (!tenderTypes) {\n throw new Error('Fail to get card tender type');\n }\n\n if (!cartTypeId) {\n throw new Error('Fail to get card type id');\n }\n\n const TenderTypeId = tokenizedPaymentCard.TenderType ?? findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\n const cardTenderLine: CartTenderLine = {\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n 'Amount@odata.type': '#Decimal',\n Currency,\n Amount,\n TenderTypeId,\n CardTypeId: cartTypeId\n };\n cardTenderLine.TokenizedPaymentCard = {\n ...tokenizedPaymentCard,\n CardTypeId: cartTypeId,\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.TokenizedPaymentCard',\n House: tokenizedPaymentCard.House || 'N/A',\n ...(tokenizedPaymentCard.CardTokenInfo && {\n CardTokenInfo: {\n ...tokenizedPaymentCard.CardTokenInfo,\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CardTokenInfo'\n }\n }),\n ...(billingAddress && {\n Phone: billingAddress.Phone,\n Country: billingAddress.ThreeLetterISORegionName,\n Address1: billingAddress.Street,\n City: billingAddress.City,\n State: billingAddress.State,\n Zip: billingAddress.ZipCode\n })\n };\n\n return cardTenderLine;\n}\n\nasync function createCustomerAccountTenderLine(\n ctx: IActionContext,\n Amount: number,\n Currency: string = 'USD',\n): Promise {\n const CustomerId = null;\n if (!ctx.requestContext.user.isAuthenticated) {\n ctx.telemetry.error('A customer id is required to pay with customer account');\n }\n\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n if (!tenderTypes) {\n ctx.telemetry.error('No tender types found for this channel');\n }\n\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCustomerAccount);\n if (!TenderTypeId) {\n ctx.telemetry.error('No customer account tender type');\n }\n return {\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n // @ts-ignore\n // tslint:disable-next-line:prefer-type-cast\n 'Amount@odata.type': '#Decimal',\n Currency,\n TenderTypeId,\n Amount,\n // @ts-ignore\n CustomerId\n };\n}\n\n// tslint:disable-next-line:max-func-body-length\nexport default async (ctx: IActionContext, updatedCartVersion?: number): Promise => {\n const checkoutState = await getCheckoutState(ctx).catch(error => {\n throw error;\n });\n\n const cartState = checkoutState.checkoutCart;\n\n const channelConfiguration = ctx.requestContext.channel;\n\n if (!cartState || !Object.keys(cartState).length || !checkoutState || !channelConfiguration) {\n throw new Error('Fail to placeOrder');\n }\n\n const {\n giftCardExtends,\n tokenizedPaymentCard,\n cardPrefix,\n guestCheckoutEmail,\n billingAddress,\n loyaltyAmount\n } = checkoutState;\n const { Currency } = channelConfiguration;\n\n let amountDue = cartState.cart.AmountDue || 0;\n let cartTenderLines;\n const getTenderLinePromises = [];\n const loyaltyCardNumber = cartState.cart.LoyaltyCardId;\n\n // Pay by loyalty first\n if (loyaltyAmount && loyaltyCardNumber) {\n const chargedAmount = roundNumber(Math.min(loyaltyAmount, amountDue));\n const loyaltyTenderLinePromise = getLoyaltyTenderLine(ctx, loyaltyCardNumber, chargedAmount, Currency);\n getTenderLinePromises.push(loyaltyTenderLinePromise);\n amountDue = roundNumber(amountDue - chargedAmount);\n }\n\n // Then by gift card\n if (giftCardExtends && giftCardExtends.length) {\n giftCardExtends.some(giftCardExtend => {\n if (giftCardExtend.Balance && amountDue > 0) {\n const chargedAmount = roundNumber(Math.min(giftCardExtend.Balance, amountDue));\n const tenderTypeId = giftCardExtend.TenderTypeId;\n const giftCardPin = giftCardExtend.Pin;\n const giftCardExpirationYear = giftCardExtend.ExpirationDate ? parseInt(giftCardExtend.ExpirationDate?.split('/')[1], 10) : undefined;\n const giftCardExpirationMonth = giftCardExtend.ExpirationDate ? parseInt(giftCardExtend.ExpirationDate?.split('/')[0], 10) : undefined;\n const creditCardTenderLinePromise = getGiftCardTenderLine(ctx, giftCardExtend.Id, chargedAmount, Currency, tenderTypeId, giftCardPin, giftCardExpirationYear, giftCardExpirationMonth);\n getTenderLinePromises.push(creditCardTenderLinePromise);\n amountDue = roundNumber(amountDue - chargedAmount);\n }\n return amountDue === 0;\n });\n }\n\n // Then by customer account\n if (checkoutState.customerAccountAmount > 0) {\n const chargedAmount = roundNumber(Math.min(checkoutState.customerAccountAmount, amountDue));\n const customerAccountTenderLinePromise = createCustomerAccountTenderLine(ctx, chargedAmount, Currency);\n getTenderLinePromises.push(customerAccountTenderLinePromise);\n amountDue = roundNumber(amountDue - chargedAmount);\n }\n\n // Pay the rest by credit card\n if (amountDue > 0) {\n if (!tokenizedPaymentCard) {\n throw new Error('Fail to placeOrder: no token found');\n }\n const creditCardTenderLinePromise = getCreditCardTenderLine(\n ctx,\n tokenizedPaymentCard,\n cardPrefix,\n amountDue,\n Currency,\n billingAddress\n );\n getTenderLinePromises.push(creditCardTenderLinePromise);\n }\n\n if (getTenderLinePromises.length > 0) {\n // When payment methods is required\n cartTenderLines = await Promise.all(getTenderLinePromises).catch(error => {\n throw error;\n });\n\n if (!cartTenderLines || !cartTenderLines.length) {\n throw new Error('Fail to placeOrder: fail to get cart tender lines');\n }\n }\n\n const cartVersion = updatedCartVersion || cartState.cart.Version;\n // Proceed checkout\n const salesOrder = await checkoutAsync(\n { callerContext: ctx, bypassCache: 'get' },\n cartState.cart.Id,\n guestCheckoutEmail,\n // @ts-ignore fields tokenizedPaymentCard and receiptNumberSequence are optional\n undefined,\n undefined,\n cartTenderLines || null,\n cartVersion\n // @ts-ignore\n ).catch(error => {\n throw error;\n });\n\n if (!salesOrder) {\n throw new Error('Fail to placeOrder: fail to checkout');\n }\n\n return salesOrder;\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { TenderLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\nimport { IPaymentMethods, IPaymentMethodsInput } from '../../../common';\n\n// tslint:disable-next-line:max-func-body-length\nexport const getOrderDetailsPaymentMethods = ({\n priceContext,\n tenderLines,\n tenderIdOperationIdMap,\n resource: { paymentMethodsTitle, creditCardEndingLabel, giftCardEndingLabel, amountCoveredLabel, loyaltyCardUsedLabel, cashUsedLabel, customerAccountUsedLabel }\n}: IPaymentMethodsInput): IPaymentMethods => {\n\n const OPERATIONS = {\n PayCard: 201,\n PayGiftCertificate: 214,\n PayLoyalty: 207,\n PayCash: 200,\n PayCustomerAccount: 202,\n };\n\n const getLastFourDigit = (digits = '') => digits.substr(-4);\n\n const getCard = (tenderLine: TenderLine, showAmount: boolean = false) => {\n const cardLastFourDigit = getLastFourDigit(tenderLine.MaskedCardNumber);\n // @ts-ignore\n const isValidCardNumber = cardLastFourDigit && !isNaN(cardLastFourDigit);\n const amount = (tenderLine.AuthorizedAmount || 0) > 0 ? tenderLine.AuthorizedAmount : tenderLine.Amount;\n const showAmountCovered = showAmount && amount && amount > 0 ? true : false;\n\n return (\n
\n

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

\n {showAmountCovered &&

\n {amountCoveredLabel}\n \n

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

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

\n

\n {amountCoveredLabel}\n \n

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

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

\n

\n {amountCoveredLabel}\n \n

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

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

\n

\n {amountCoveredLabel}\n \n

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

{cashUsedLabel}

\n

\n {amountCoveredLabel}\n \n

\n
\n );\n\n return {\n paymentMethodsProps: { className: 'ms-order-details__payment-methods' },\n title:
{paymentMethodsTitle}
,\n methods: tenderLines.reduce((lines: React.ReactNode[], tenderLine) => {\n if (!tenderLine.TenderTypeId) {\n return lines;\n }\n switch (tenderIdOperationIdMap[tenderLine.TenderTypeId]) {\n case OPERATIONS.PayCard:\n lines.push(getCard(tenderLine, tenderLines.length > 1));\n break;\n case OPERATIONS.PayGiftCertificate:\n lines.push(getGiftCertificate(tenderLine));\n break;\n case OPERATIONS.PayLoyalty:\n lines.push(getLoyalty(tenderLine));\n break;\n case OPERATIONS.PayCash:\n lines.push(getCash(tenderLine));\n break;\n case OPERATIONS.PayCustomerAccount:\n lines.push(getCustomerAccountPayment(tenderLine));\n break;\n default:\n // do nothing\n }\n return lines;\n }, [])\n };\n};\n","//==============================================================================\r\n//==============================================================================\r\nimport { IComponentProps } from '@msdyn365-commerce/core';\r\nimport { DiscountLine, IDictionary, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { brandCodeParser } from '../brand-code-parser';\r\n\r\nimport { subscribe } from './analytics-dispatcher';\r\nimport * as GA from './ga-typings';\r\n\r\n//==============================================================================\r\n// CONSTANTS\r\n//==============================================================================\r\nconst SUBSCRIBER_NAME = 'GOOGLE_ANALYTICS';\r\nconst CURRENCY_CODE = 'USD';\r\n\r\nconst UNKNOWN_VALUE = 'unknown';\r\n\r\n//==============================================================================\r\n// INTERFACES\r\n//==============================================================================\r\n\r\n// Data passed to events that deal with a single product\r\ninterface ISingleProductProps extends IComponentProps {\r\n product: SimpleProduct;\r\n quantity: number;\r\n price: number;\r\n attributes: IDictionary | undefined;\r\n subscription: boolean;\r\n frequency?: string;\r\n discounts?: DiscountLine[];\r\n category?: string;\r\n}\r\n\r\n// Data passed to events that deal with multiple products\r\ninterface IMultiProductProps extends IComponentProps {\r\n confirmationId: string | undefined;\r\n\r\n // Transactions\r\n id: string; // The transaction ID\r\n revenue: number; // Specifies the total revenue or grand total associated with the transaction\r\n tax: number; // The total tax associated with the transaction\r\n shipping: number; // The shipping cost associated with the transaction\r\n affiliation?: string; // The store or affiliation from which this transaction occurred\r\n coupon?: string; // The transaction coupon redeemed with the transaction\r\n\r\n // Impressions\r\n list?: string;\r\n category?: string;\r\n\r\n // Checkout\r\n step?: number;\r\n\r\n // Common\r\n products: ISingleProductProps[];\r\n}\r\n\r\ninterface IExtendedProduct extends GA.IEECProduct {\r\n subscribe?: boolean; // Flag denoting that the item is a subscription rather than a one-time purchase\r\n frequency?: string; // If an item is part of a subscription, include the frequency of the subscription\r\n}\r\n\r\n// tslint:disable-next-line: no-any\r\ndeclare const dataLayer: any[] | undefined;\r\n\r\n//==============================================================================\r\n// Common Helpers\r\n//==============================================================================\r\nfunction formatProductData(data: ISingleProductProps): IExtendedProduct {\r\n\r\n // Convert internal event data to GA event data\r\n const product: IExtendedProduct = {\r\n id: data.product.ItemId || UNKNOWN_VALUE,\r\n name: data.product.Name || UNKNOWN_VALUE,\r\n brand: brandCodeParser({ description: data.product.Description, appContext: data.context }) || UNKNOWN_VALUE,\r\n variant: (data.attributes && data.attributes['Wine Bottle Size']) || UNKNOWN_VALUE, // Size for wine\r\n price: (data.price !== undefined) ? data.price : data.product.Price,\r\n quantity: data.quantity,\r\n };\r\n\r\n // Add optional entries\r\n data.category && (product.category = data.category);\r\n data.discounts && (product.coupon = data.discounts.map(discount => discount.OfferName).join(','));\r\n\r\n if (data.subscription) {\r\n product.subscribe = true;\r\n data.frequency && (product.frequency = data.frequency);\r\n }\r\n\r\n return product;\r\n}\r\n\r\n//==============================================================================\r\n// EVENT HANDLERS\r\n//==============================================================================\r\n\r\n//----------------------------------------------------------\r\n// Add to Cart\r\n//----------------------------------------------------------\r\nfunction addToCart(data: ISingleProductProps): void {\r\n\r\n // Convert internal event data to GA event data\r\n const product: IExtendedProduct = formatProductData(data);\r\n\r\n // Create an event rather than directly pushing to the data layer to enforce typing\r\n const event: GA.IAddToCartEvent = {\r\n event: 'addToCart',\r\n ecommerce: {\r\n currencyCode: CURRENCY_CODE,\r\n add: {\r\n products: [product]\r\n },\r\n }\r\n };\r\n\r\n if (typeof dataLayer !== 'undefined') {\r\n dataLayer.push(event);\r\n }\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Remove from Cart\r\n//----------------------------------------------------------\r\nfunction removeFromCart(data: ISingleProductProps): void {\r\n\r\n // Convert internal event data to GA event data\r\n const product: IExtendedProduct = formatProductData(data);\r\n\r\n // Create an event rather than directly pushing to the data layer to enforce typing\r\n const event: GA.IRemoveFromCartEvent = {\r\n event: 'removeFromCart',\r\n ecommerce: {\r\n remove: {\r\n products: [product]\r\n },\r\n }\r\n };\r\n\r\n if (typeof dataLayer !== 'undefined') {\r\n dataLayer.push(event);\r\n }\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Product Detail View (PDP visited)\r\n//----------------------------------------------------------\r\nfunction productDetailView(data: ISingleProductProps): void {\r\n\r\n // Convert internal event data to GA event data\r\n const product: IExtendedProduct = formatProductData(data);\r\n\r\n // Quantity isn't valid for this event. Rather than sending \"undefined\", remove it completely.\r\n delete product.quantity;\r\n\r\n // Create an event rather than directly pushing to the data layer to enforce typing\r\n const event: GA.IProductDetailViewEvent = {\r\n event: 'detail',\r\n ecommerce: {\r\n detail: {\r\n // actionField: {\r\n // list: '' // We have category at the product level. This would probably always be something like \"PDP\".\r\n // },\r\n products: [product]\r\n },\r\n }\r\n };\r\n\r\n if (typeof dataLayer !== 'undefined') {\r\n dataLayer.push(event);\r\n }\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Purchase Complete\r\n//----------------------------------------------------------\r\nfunction purchase(data: IMultiProductProps): void {\r\n\r\n // Convert internal event data to GA event data\r\n const products: IExtendedProduct[] = data.products.map(formatProductData);\r\n\r\n // Create an event rather than directly pushing to the data layer to enforce typing\r\n const event: GA.IPurchaseEvent = {\r\n event: 'purchase',\r\n ecommerce: {\r\n purchase: {\r\n actionField: {\r\n id: data.id,\r\n revenue: data.revenue,\r\n tax: data.tax,\r\n shipping: data.shipping,\r\n },\r\n orderSummary: {\r\n subTotal: data.revenue - (data.tax + data.shipping),\r\n shipping: data.shipping,\r\n tax: data.tax,\r\n transactionId: data.confirmationId,\r\n confirmationId: data.id\r\n },\r\n products: products,\r\n },\r\n }\r\n };\r\n\r\n // Only add optional fields if they are present in the source (instead of sending \"undefined\")\r\n data.coupon && (event.ecommerce.purchase.actionField.coupon = data.coupon);\r\n data.affiliation && (event.ecommerce.purchase.actionField.affiliation = data.affiliation);\r\n\r\n if (typeof dataLayer !== 'undefined') {\r\n dataLayer.push(event);\r\n }\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Product Impressions\r\n//----------------------------------------------------------\r\nfunction impression(data: IMultiProductProps): void {\r\n\r\n // Convert internal event data to GA event data\r\n const impressions: GA.IEECImpression[] = data.products.map((product, idx) => {\r\n\r\n return {\r\n id: product.product.ItemId || UNKNOWN_VALUE,\r\n name: product.product.Name || UNKNOWN_VALUE,\r\n brand: brandCodeParser({ description: product.product.Description, appContext: data.context }) || UNKNOWN_VALUE,\r\n variant: (product.attributes && product.attributes['Wine Bottle Size']) || UNKNOWN_VALUE,\r\n position: idx,\r\n price: product.product.Price,\r\n\r\n list: data.list, // The list or collection to which the product belongs (e.g. Search Results)\r\n category: data.category || UNKNOWN_VALUE // The category to which the product belongs (e.g. Apparel). Use / as a delimiter to specify up to 5-levels of hierarchy (e.g. Apparel/Men/T-Shirts)\r\n };\r\n });\r\n\r\n // Create an event rather than directly pushing to the data layer to enforce typing\r\n const event: GA.IImpressionEvent = {\r\n event: 'impression',\r\n ecommerce: {\r\n currencyCode: CURRENCY_CODE,\r\n impressions: impressions\r\n }\r\n };\r\n\r\n if (typeof dataLayer !== 'undefined') {\r\n dataLayer.push(event);\r\n }\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Purchase Complete\r\n//----------------------------------------------------------\r\nfunction checkout(data: IMultiProductProps): void {\r\n\r\n // Convert internal event data to GA event data\r\n const products: IExtendedProduct[] = data.products.map(formatProductData);\r\n\r\n // Create an event rather than directly pushing to the data layer to enforce typing\r\n const event: GA.ICheckoutStepEvent = {\r\n event: 'checkout',\r\n ecommerce: {\r\n checkout: {\r\n actionField: {\r\n step: data.step,\r\n },\r\n products: products,\r\n },\r\n }\r\n };\r\n\r\n // Not entirely standard, but include it anyway\r\n if (data.coupon) {\r\n event.ecommerce.checkout.actionField.coupon = data.coupon;\r\n }\r\n\r\n if (typeof dataLayer !== 'undefined') {\r\n dataLayer.push(event);\r\n }\r\n}\r\n\r\n//==============================================================================\r\n//==============================================================================\r\n\r\n//----------------------------------------------------------\r\n//----------------------------------------------------------\r\nexport function init(): void {\r\n subscribe(SUBSCRIBER_NAME, 'addToCart', addToCart);\r\n subscribe(SUBSCRIBER_NAME, 'removeFromCart', removeFromCart);\r\n subscribe(SUBSCRIBER_NAME, 'productDetailView', productDetailView);\r\n subscribe(SUBSCRIBER_NAME, 'purchase', purchase);\r\n subscribe(SUBSCRIBER_NAME, 'impression', impression);\r\n subscribe(SUBSCRIBER_NAME, 'checkout', checkout);\r\n}\r\n","//==============================================================================\r\n// Analytics Event Dispatcher\r\n//\r\n// This module receives events and forwards them to the appropriate handlers\r\n// Subscriptions are managed using a subscriber ID to aid in unsubscribing\r\n//==============================================================================\r\n\r\n// This totally destroys the plugin pattern, but it's difficult to use that pattern\r\n// in a module system, particularly with server-side rendering-friendly webpack chunks.\r\nimport { init as GA_init } from './google-analytics';\r\n\r\n//==============================================================================\r\n//==============================================================================\r\n// tslint:disable-next-line: no-any\r\ntype IEventHandler = (eventData: any) => void;\r\n\r\n// List of subscribers to a single event\r\ninterface IEventSubscribers {\r\n [subscriber: string]: IEventHandler;\r\n}\r\n\r\n//==============================================================================\r\n//==============================================================================\r\n\r\n// List of subscriptions, organized by event name and then subscriber name\r\nconst subscriptions: { [eventName: string]: IEventSubscribers } = {};\r\n\r\n//----------------------------------------------------------\r\n//----------------------------------------------------------\r\n// tslint:disable-next-line: no-any\r\nexport function publish(eventName: string, eventData: any): void {\r\n if (subscriptions[eventName]) {\r\n // Get the list of subscribers for this event\r\n const subscribers = Object.keys(subscriptions[eventName]);\r\n\r\n // Notify each subscriber\r\n subscribers.forEach(subscriber => subscriptions[eventName][subscriber](eventData));\r\n }\r\n}\r\n\r\n//----------------------------------------------------------\r\n//----------------------------------------------------------\r\nexport function subscribe(subscriber: string, eventName: string, handler: IEventHandler): void {\r\n // If it's a new event, create an entry\r\n if (!subscriptions[eventName]) {\r\n subscriptions[eventName] = {};\r\n }\r\n\r\n // Ensure this subscriber isn't already subscribed to this event\r\n if (subscriptions[eventName][subscriber]) {\r\n throw new Error(`Duplicate subscription request for ${subscriber}: ${eventName}`);\r\n }\r\n\r\n // Add the subscription\r\n subscriptions[eventName][subscriber] = handler;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Unsubscribe to a single event\r\n//----------------------------------------------------------\r\nexport function unsubscribe(subscriber: string, eventName: string): void {\r\n if (subscriptions[eventName] && subscriptions[eventName][subscriber]) {\r\n delete subscriptions[eventName][subscriber];\r\n }\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Perform all init functions here (ugh!)\r\n//----------------------------------------------------------\r\nGA_init();","/*---------------------------------------------------------------------------------------------\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 { ICarouselViewProps } from '@msdyn365-commerce-modules/carousel/src/modules/carousel/./carousel';\r\nimport { Carousel } from '@msdyn365-commerce/components';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nconst CarouselView: React.FC = props => (\r\n \r\n \r\n \r\n);\r\n\r\nexport default CarouselView;\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 { Address } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport type addressType = 'store' | 'ship';\n\nexport interface IShippingAddressProps {\n moduleName: string;\n address: Address;\n deliveryType: string;\n showCompleteAddress?: boolean;\n resource: {\n shipToLabel: string;\n storeLabel: string;\n phoneLabel: string;\n phoneAriaLabel: string;\n };\n}\n\nconst Address: React.SFC = ({\n moduleName,\n address,\n deliveryType,\n showCompleteAddress,\n resource: { shipToLabel, storeLabel, phoneLabel }\n}) => (\n
\n
{deliveryType !== 'ship' ? storeLabel : shipToLabel}
\n {address.Name && {address.Name}}\n {showCompleteAddress ?\n (<>\n {address.Street && {address.Street} }\n {address.City && {address.City}}\n {address.State && {`, ${address.State}`}}\n {address.County && {`, ${address.County}`}}\n {address.ZipCode && {` ${address.ZipCode}`}}\n {address.ThreeLetterISORegionName && {` ${address.ThreeLetterISORegionName}`}}\n {address.Phone && (\n \n {phoneLabel}\n \n )}\n ) : address.FullAddress && {address.FullAddress}}\n
\n );\n\nexport default React.memo(Address);\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport {\r\n IActionContext,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n Image,\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n CartLine,\r\n SalesLine\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { brandCodeParser } from '../Utilities/brand-code-parser';\r\nimport ProductType from '../Utilities/productType';\r\nimport { MasterProdDisplay } from './master-prod-display-name';\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs\r\n */\r\nexport interface ICartlineResourceString {\r\n /** Display string for discount label */\r\n discountStringText: string;\r\n /** String for size key */\r\n sizeString: string;\r\n /** String for color key */\r\n colorString: string;\r\n /** String associated with the configuration product dimension */\r\n configString: string;\r\n /** String for style key */\r\n styleString: string;\r\n /** Display string for quantity label */\r\n quantityDisplayString: string;\r\n /** Display string for quantity label */\r\n inputQuantityAriaLabel: string;\r\n}\r\n\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n product: SimpleProduct;\r\n}\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem\r\n */\r\nexport interface ICartLineProps extends IComponentProps {\r\n /** The flag to change the quantity component from interactible to static */\r\n disableQuantityInteractivity?: boolean;\r\n /** The primary image url */\r\n primaryImageUrl?: string;\r\n /** The product url */\r\n productUrl?: string;\r\n /** GridSettings for the product image in cartLine */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartLine */\r\n imageSettings: IImageSettings;\r\n /** Boolean flag to indicate if the item is out of stock */\r\n isOutOfStock?: boolean;\r\n /** Flag to make quantity section editable */\r\n isQuantityEditable?: boolean;\r\n /** Max quantity for line item */\r\n maxQuantity?: number;\r\n /** Current quantity for line item */\r\n currentQuantity?: number;\r\n /** Resource string for the component */\r\n resources: ICartlineResourceString;\r\n /** SalesLine flag */\r\n isSalesLine?: boolean;\r\n // Remove button coming from smwe-cartline\r\n // remove:string;\r\n remove?: React.ReactNode;\r\n /** Display images for on cart lines */\r\n showImages?: boolean;\r\n /** Has zero availability error? */\r\n zeroAvailabilityError?: boolean;\r\n cartState?: ICartState;\r\n cartLineErrors?: { [index: string]: boolean };\r\n /** Replaces discount code name with percent */\r\n showDiscountPercent?: boolean;\r\n /** Quantity onChange callback */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): void;\r\n cartLineOnChange?(ctx: IActionContext, cartState: ICartState | undefined, cartLine: CartLine): void;\r\n}\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nconst SmweCartLine: React.FC = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources, primaryImageUrl, showImages, gridSettings, imageSettings, zeroAvailabilityError } = props;\r\n const intlFormatter = props.context.cultureFormatter;\r\n const { product, cartLine } = props.data;\r\n const { inputQuantityAriaLabel } = props.resources;\r\n const _updateQuantity = (event: React.ChangeEvent) => {\r\n if (props.quantityOnChange) {\r\n props.quantityOnChange(\r\n props.data.cartLine,\r\n parseInt(event.target.value, 10)\r\n );\r\n }\r\n };\r\n\r\n const _generateMenu = (quantity: number) => {\r\n const nodes = [];\r\n\r\n for (let i = 1; i <= quantity; i++) {\r\n // tslint:disable-next-line:react-a11y-role-has-required-aria-props\r\n nodes.push(\r\n \r\n {i}\r\n \r\n );\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n const _generateSelectMenu = (\r\n quantity: number,\r\n currentQuantity: number | undefined\r\n ): JSX.Element => {\r\n const shouldDisableQty = props.data.product && props.data.product.ItemId?.toLowerCase() === props.context.request.channel?.GiftCardItemId?.toLowerCase();\r\n return (\r\n \r\n \r\n {_generateMenu(quantity)}\r\n \r\n {props.remove}\r\n \r\n );\r\n };\r\n\r\n const _generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n const priceAdjustmentSavings = _getPriceAdjustmentSavings();\r\n const productType = new ProductType();\r\n productType.check(cartLine.DeliveryMode, props.context);\r\n\r\n const isWineProduct = productType.isWineProduct();\r\n if (isWineProduct && props.isOutOfStock && !zeroAvailabilityError) {\r\n return null;\r\n }\r\n\r\n if (props.isQuantityEditable) {\r\n nodes.push(\r\n _generateSelectMenu(props.maxQuantity || 10, props.currentQuantity)\r\n );\r\n } else {\r\n nodes.push(\r\n
\r\n \r\n \r\n {props.data.cartLine.Quantity} {props.remove}\r\n \r\n
\r\n );\r\n }\r\n nodes.push(\r\n \r\n
\r\n {props.data.cartLine.Price !== undefined\r\n ? intlFormatter.formatCurrency(props.data.cartLine.Price)\r\n : ''}\r\n {_getPriceAdjustmentPercent()}\r\n
\r\n {_getPriceDiscount()}\r\n \r\n );\r\n nodes.push(\r\n \r\n
\r\n \r\n
\r\n {isSalesLine\r\n ? props.data.cartLine.Price &&\r\n intlFormatter.formatCurrency(props.data.cartLine.Price)\r\n : props.data.cartLine.NetPrice === 0 ? intlFormatter.formatCurrency(0)\r\n : props.data.cartLine.NetPrice &&\r\n intlFormatter.formatCurrency(props.data.cartLine.NetPrice)}\r\n
\r\n {(props.data.cartLine.DiscountAmountWithoutTax &&\r\n props.data.cartLine.DiscountAmountWithoutTax > 0) ||\r\n (priceAdjustmentSavings &&\r\n priceAdjustmentSavings > 0)\r\n ? `Savings ${intlFormatter.formatCurrency(\r\n (props.data.cartLine.DiscountAmountWithoutTax || 0) + _getPriceAdjustmentSavings()\r\n )}`\r\n : null}\r\n
\r\n
\r\n \r\n );\r\n return nodes;\r\n };\r\n\r\n const _getCartLineImage = (): JSX.Element | null => {\r\n if (showImages && primaryImageUrl) {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceAdjustmentPercent = (): JSX.Element | null => {\r\n if (props.data.product.Price && props.data.cartLine.Price && (props.data.cartLine.Price < props.data.product.Price)) {\r\n return {` (${(100 - ((props.data.cartLine.Price / props.data.product.Price) * 100)).toFixed(0)}% Off)`};\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceDiscount = (): string | null => {\r\n if (\r\n props.data.cartLine.DiscountAmountWithoutTax !== undefined &&\r\n props.data.cartLine.DiscountAmountWithoutTax !== 0 &&\r\n props.data.cartLine.Quantity &&\r\n props.data.cartLine.DiscountLines\r\n ) {\r\n if (props.showDiscountPercent && props.data.cartLine.NetPrice) {\r\n return `${((props.data.cartLine.DiscountAmountWithoutTax / props.data.cartLine.NetPrice) * 100).toFixed(0)}% off`;\r\n }\r\n return `${_doubleDiscounts()} ${props.data.cartLine.DiscountLines[0].DiscountCode}`;\r\n\r\n }\r\n return null;\r\n };\r\n\r\n enum GiftCardFieldType {\r\n Extension, Attribute\r\n }\r\n\r\n interface IGiftCardFields {\r\n Key: string;\r\n Type: GiftCardFieldType;\r\n StringValue: string;\r\n Required: boolean;\r\n isValid?: boolean;\r\n }\r\n\r\n interface IGiftCardFormObj {\r\n FirstName: IGiftCardFields;\r\n LastName: IGiftCardFields;\r\n ElectronicDeliveryEmail: IGiftCardFields;\r\n ElectronicDeliveryEmailContent: IGiftCardFields;\r\n }\r\n\r\n const giftCardFormObj: IGiftCardFormObj = {\r\n FirstName: {\r\n Key: 'FirstName',\r\n Type: GiftCardFieldType.Extension,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n LastName: {\r\n Key: 'LastName',\r\n Type: GiftCardFieldType.Extension,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n ElectronicDeliveryEmail: {\r\n Key: 'ElectronicDeliveryEmail',\r\n Type: GiftCardFieldType.Attribute,\r\n StringValue: '',\r\n Required: true,\r\n isValid: true\r\n },\r\n ElectronicDeliveryEmailContent: {\r\n Key: 'ElectronicDeliveryEmailContent',\r\n Type: GiftCardFieldType.Attribute,\r\n StringValue: '',\r\n Required: false\r\n },\r\n };\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n const _renderGiftCardPrompt = (): JSX.Element | null => {\r\n\r\n if (!props.data.cartLine.IsGiftCardLine) {\r\n return null;\r\n }\r\n\r\n const [giftCardFormField, setGiftCardFormField] = useState(giftCardFormObj);\r\n const [formFieldsDebounce, setFormFieldsDebounce] = useState('');\r\n\r\n const setFormFieldState = () => {\r\n const unhydratedCartLineLoad = { ...props.data.cartLine };\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Type === GiftCardFieldType.Extension) {\r\n unhydratedCartLineLoad.ExtensionProperties = unhydratedCartLineLoad.ExtensionProperties || [];\r\n const property = unhydratedCartLineLoad.ExtensionProperties.find((extension) => {\r\n return extension.Key?.toLowerCase() === fieldState.Key?.toLowerCase();\r\n });\r\n if (property) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [field]: {\r\n ...prevState[field],\r\n StringValue: property.Value?.StringValue\r\n }\r\n }));\r\n }\r\n } else if (fieldState.Type === GiftCardFieldType.Attribute) {\r\n const property = unhydratedCartLineLoad[fieldState.Key];\r\n if (property) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [fieldState.Key]: {\r\n ...prevState[fieldState.Key],\r\n StringValue: unhydratedCartLineLoad[fieldState.Key]\r\n }\r\n }));\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFormFieldToCartLine = () => {\r\n const unhydratedCartLineLoad = { ...props.data.cartLine };\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Type === GiftCardFieldType.Extension) {\r\n unhydratedCartLineLoad.ExtensionProperties = unhydratedCartLineLoad.ExtensionProperties || [];\r\n unhydratedCartLineLoad.ExtensionProperties.push({\r\n Key: fieldState.Key,\r\n Value: {\r\n StringValue: fieldState.StringValue\r\n }\r\n });\r\n } else if (fieldState.Type === GiftCardFieldType.Attribute) {\r\n unhydratedCartLineLoad[fieldState.Key] = giftCardFormField[fieldState.Key].StringValue;\r\n }\r\n });\r\n // Removing 'ItemTaxGroupId' from the object because now in new SSK its READONLY Attribute, can't be updated.\r\n delete (unhydratedCartLineLoad.ItemTaxGroupId);\r\n props.cartLineOnChange && props.cartLineOnChange(props.context.actionContext, props.cartState, unhydratedCartLineLoad);\r\n };\r\n\r\n const giftCardValidation = () => {\r\n let giftCardFormIsValid = true;\r\n Object.keys(giftCardFormField).forEach((field) => {\r\n const fieldState = giftCardFormField[field];\r\n if (fieldState.Required) {\r\n if (fieldState.StringValue.trim() === '') {\r\n giftCardFormIsValid = false;\r\n fieldState.isValid = false;\r\n } else {\r\n fieldState.isValid = true;\r\n }\r\n\r\n if (fieldState.Key === 'ElectronicDeliveryEmail') {\r\n const validEmailRegex =\r\n RegExp(/^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i);\r\n if (!validEmailRegex.test(fieldState.StringValue)) {\r\n giftCardFormIsValid = false;\r\n fieldState.isValid = false;\r\n } else {\r\n fieldState.isValid = true;\r\n }\r\n }\r\n }\r\n });\r\n if (props.cartLineErrors) {\r\n if (giftCardFormIsValid) {\r\n props.cartLineErrors[props.data.cartLine.LineId!] = false;\r\n } else {\r\n props.cartLineErrors[props.data.cartLine.LineId!] = true;\r\n }\r\n }\r\n };\r\n\r\n // Setting the data from the cartline to State on load\r\n useEffect(() => {\r\n setFormFieldState();\r\n }, []);\r\n\r\n //Checking giftCard form validation\r\n useEffect(() => {\r\n giftCardValidation();\r\n }, [giftCardFormField]);\r\n\r\n // Updating formfield to cardLine\r\n useEffect(() => {\r\n const delayDebounceFn = setTimeout(() => {\r\n updateFormFieldToCartLine();\r\n }, 600);\r\n\r\n return () => clearTimeout(delayDebounceFn);\r\n }, [formFieldsDebounce]);\r\n\r\n const handleChange = (name: string) => (event: React.ChangeEvent) => {\r\n const value = event?.target.value;\r\n if (name) {\r\n setGiftCardFormField((prevState: IGiftCardFormObj) => ({\r\n ...prevState,\r\n [name]: {\r\n ...prevState[name],\r\n StringValue: value,\r\n },\r\n }));\r\n setFormFieldsDebounce(value);\r\n }\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n

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

\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n };\r\n\r\n const _getCartLineComment = (): JSX.Element | null => {\r\n const productType = new ProductType();\r\n productType.check(cartLine.DeliveryMode, props.context);\r\n if (productType.isWineProduct() && props.data.cartLine.Comment) {\r\n return (\r\n
\r\n {props.data.cartLine.Comment}\r\n
);\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const _getPriceAdjustmentSavings = (): number => {\r\n if (props.data.product.Price && props.data.cartLine.Price && props.data.cartLine.NetPrice) {\r\n const priceUnadjusted = (props.data.cartLine.NetPrice / (props.data.cartLine.Price / props.data.product.Price));\r\n return (priceUnadjusted - props.data.cartLine.NetPrice);\r\n } else {\r\n return 0;\r\n }\r\n };\r\n\r\n const _doubleDiscounts = (): string => {\r\n if (_getPriceAdjustmentPercent()) {\r\n return '+ ';\r\n } else {\r\n return '';\r\n }\r\n };\r\n\r\n const brandCode = brandCodeParser({ description: product.Description, appContext: props.context });\r\n\r\n let jsxName = {product.Name};\r\n if (product.MasterProductId) {\r\n jsxName = ;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n {_getCartLineImage()}\r\n
\r\n {brandCode &&\r\n
\r\n {brandCode}\r\n
\r\n }\r\n
\r\n {jsxName}\r\n
\r\n
\r\n
\r\n
\r\n \r\n {_generateQuantityAndPrice()}\r\n \r\n {_getCartLineComment()}\r\n {_renderGiftCardPrompt()}\r\n
\r\n
\r\n );\r\n};\r\n\r\n// @ts-ignore\r\nexport default SmweCartLine;\r\n","import OrderConfirmation from './order-confirmation';\nimport OrderConfirmationView from './order-confirmation.view';\n\nexport * from './order-confirmation';\nexport * from './order-confirmation.data';\nexport * from './order-confirmation.view';\nexport * from './order-confirmation.props.autogenerated';\nexport * from './components';\n\nexport {\n OrderConfirmation,\n OrderConfirmationView\n};","/**\r\n * enum to define all message types used in INotificationMessage\r\n */\r\nexport const enum NotificationType {\r\n info = 'info',\r\n success = 'success',\r\n warning = 'warning',\r\n error = 'error',\r\n validation = 'validation',\r\n none = 'none'\r\n}\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\nimport getNotificationMessage, { createNotificationMessage } from '../../dataActions/get-notification-message';\r\nimport { NotificationType } from '../../models/notification-message-type';\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 content?: React.ReactNode[];\r\n backToShoppingButton: React.ReactNode;\r\n waitingComponent: React.ReactNode;\r\n promoCode: React.ReactNode;\r\n cartLoadingStatus: string;\r\n cartDataResult: boolean;\r\n\r\n checkoutButtonDisabled: React.ReactNode;\r\n cartLineStatus: IDictionary;\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 content: this.props.slots.content && this.props.slots.content.length > 0 ? this.props.slots.content : null,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n waitingComponent: ,\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).then(() => {\r\n getNotificationMessage( // eslint-disable-line\r\n createNotificationMessage({ message: \"Item Removed from cart successfully\", messagetype: NotificationType.success }),\r\n this.props.context.actionContext\r\n );\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _generateRemovalAnalyticsEvent(cartlineToRemove: CartLine): void {\r\n const productID = cartlineToRemove.ProductId;\r\n if (!productID) {\r\n return;\r\n }\r\n\r\n const product = this.props.data.products.result?.find(entry => entry.RecordId === productID);\r\n const attributes = this.parsedProductAttributes[productID];\r\n\r\n publish('removeFromCart', {\r\n product,\r\n quantity: cartlineToRemove.Quantity,\r\n attributes,\r\n subscription: isLineSubscriptionLine(cartlineToRemove),\r\n context: this.props.context\r\n });\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _generateCheckoutAnalyticsEvent(cart: ICartState, products: SimpleProduct[]): void {\r\n\r\n // Convert to the format the analytics module requires\r\n const mappedProducts = cart.cart.CartLines?.map(line => {\r\n const product = products.find(entry => entry.RecordId === line.ProductId);\r\n\r\n return {\r\n product,\r\n quantity: line.Quantity,\r\n attributes: this.parsedProductAttributes[line.ProductId!],\r\n subscription: isLineSubscriptionLine(line),\r\n discounts: line.DiscountLines,\r\n context: this.props.context,\r\n };\r\n });\r\n\r\n publish('checkout', {\r\n step: 0, // We're counting the cart page as step 0\r\n products: mappedProducts,\r\n coupon: cart.cart.Coupons?.map(coupon => coupon.Code).join(','),\r\n });\r\n }\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n };\r\n\r\n private async _setProductAttributes(): Promise {\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","import { ICarouselViewProps } from '@msdyn365-commerce-modules/carousel/dist/types/modules/carousel/carousel';\r\nimport { Carousel } from '@msdyn365-commerce/components';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ICarouselProps } from '../definition-extensions/carousel.ext.props.autogenerated';\r\n\r\nconst CarouselView: React.FC> = props => (\r\n \r\n \r\n \r\n);\r\n\r\nexport default CarouselView;\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 { getPayloadObject, getTelemetryAttributes } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IGetHelpInput, IHelp } from '../../../';\n\nexport const getOrderConfirmationHelp = ({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel, telemetryContent }: IGetHelpInput): IHelp => {\n const payLoad = getPayloadObject('click', telemetryContent!, '');\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return ({\n helpProps: { className: 'ms-order-confirmation__help' },\n needHelpLabel:

{needHelpLabel}

,\n helpLineNumberLabel: {helpLineNumberLabel},\n contactNumber: (\n \n {contactNumber}\n \n )\n });\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, ProductDeliveryOptions, SalesLine, SalesOrder, SimpleProduct, TransactionType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { computed } from 'mobx';\nimport * as React from 'react';\nimport { IGetOrderSummaryInput, IHelp, IOrderSummary, IPaymentMethods, IPaymentMethodsInput } from '../../common';\nimport { getGroups, IGroups } from '../../common/get-groups';\nimport { getOrderInfomationInput, getOrderInformation, IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { getSalesLines, getSalesLinesInput } from '../../common/get-sales-lines';\nimport LabelComponent from '../../common/label';\nimport { getTenderIdOperationIdMap, IPriceContext } from '../../common/utilities';\nimport { getOrderConfirmationHelp } from './components/get-help';\nimport { getOrderConfirmationOrderSummary } from './components/get-order-summary';\nimport { getOrderConfirmationPaymentMethods } from './components/get-payment-methods';\nimport { IOrderConfirmationData } from './order-confirmation.data';\nimport { IOrderConfirmationProps } from './order-confirmation.props.autogenerated';\n\nexport * from '../../common/get-groups';\nexport * from '../../common/get-order-information';\nexport * from '../../common/get-sales-line';\nexport * from '../../common/get-sales-lines';\nexport * from '../../common/utilities';\nexport * from './components/get-help';\nexport * from './components/get-order-summary';\nexport * from './components/get-payment-methods';\n\nexport interface IOrderConfirmationViewProps extends IOrderConfirmationProps {\n moduleProps: IModuleProps;\n salesOrder?: SalesOrder;\n footerProps?: INodeProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n heading: React.ReactNode;\n backToShoppingLink?: React.ReactNode;\n orderInfomation?: IOrderInformation;\n salesLines?: ISalesLine[];\n groups?: IGroups;\n orderSummary?: IOrderSummary;\n payment?: IPaymentMethods;\n help?: IHelp;\n}\n\n/**\n *\n * OrderConfirmation component\n * @extends {React.PureComponent>}\n */\nclass OrderConfirmation extends React.PureComponent> {\n private moduleName: string = 'ms-order-confirmation';\n private telemetryContent?: ITelemetryContent;\n private backToShoppingAttributes?: Msdyn365.IDictionary;\n\n constructor(props: IOrderConfirmationProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\n this.backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n }\n\n @computed get isCurrentChannel(): boolean {\n if (!this.order) {\n return false;\n }\n return this.order.ChannelId === get(this.props, 'context.request.apiSettings.channelId');\n }\n\n @computed get isDataReady(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'SUCCESS';\n }\n\n @computed get hasError(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'FAILED';\n }\n\n @computed get order(): SalesOrder | undefined {\n return get(this.props, 'data.orderHydration.result.salesOrder');\n }\n\n @computed get products(): SimpleProduct[] {\n return get(this.props, 'data.orderHydration.result.products') || [];\n }\n\n @computed get deliveryOptions(): ProductDeliveryOptions[] {\n return get(this.props, 'data.orderHydration.result.deliveryOptions') || [];\n }\n\n @computed get priceContext(): IPriceContext {\n const {\n id,\n typeName,\n context,\n telemetry,\n resources: { freePriceText }\n } = this.props;\n return {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n }\n\n @computed get earnedPoints(): number {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n if (loyaltyCard && loyaltyCard.RewardPoints && this.order) {\n const pointPrograms = loyaltyCard.RewardPoints.map(point => point.RewardPointId);\n const rewardLines = this.order.LoyaltyRewardPointLines || [];\n let total = 0;\n rewardLines.forEach(line => {\n if ((line.RewardPointAmountQuantity || 0) > 0 && pointPrograms.indexOf(line.RewardPointId) > -1) {\n total += line.RewardPointAmountQuantity!;\n }\n });\n return total;\n }\n return 0;\n }\n\n @computed get orderSummaryProps(): IGetOrderSummaryInput | undefined {\n if (!this.order) {\n return;\n }\n const { request } = this.props.context;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\n const orderDetailsLines = this.order?.SalesLines;\n const canShip = orderDetailsLines?.some(orderDetailsLine => (orderDetailsLine.DeliveryMode && orderDetailsLine.DeliveryMode !== '')\n ? (orderDetailsLine.DeliveryMode !== this.getDeliveryMode(orderDetailsLine, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig?.result, pickupDeliveryModeCode) && orderDetailsLine.DeliveryMode !== emailDeliveryModeCode)\n : orderDetailsLine);\n\n const {\n resources: { orderSummaryHeading, orderSummaryItemsTotalLabel, orderSummaryShippingFeeLabel, orderSummaryTaxLabel, orderSummaryGrandTotalLabel, pointsEarnedLabel }\n } = this.props;\n return {\n order: this.order,\n earnedPoints: this.earnedPoints,\n priceContext: this.priceContext,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n pointsEarnedLabel,\n orderSummaryGrandTotalLabel\n },\n canShip: canShip\n };\n }\n\n @computed get paymentMethodsProps(): IPaymentMethodsInput | undefined {\n const tenderTypes = this.props.data.tenderTypes.result;\n if (!this.order || !this.order.TenderLines || !tenderTypes) {\n return;\n }\n\n const locale = get(this.props, 'context.request.locale') || 'en-US';\n\n const {\n resources: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n } = this.props;\n\n return {\n priceContext: this.priceContext,\n tenderLines: this.order.TenderLines,\n tenderIdOperationIdMap: getTenderIdOperationIdMap(tenderTypes),\n locale,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n };\n }\n\n // tslint:disable-next-line:max-func-body-length\n public render(): JSX.Element {\n const {\n resources: {\n noSalesOrderText,\n genericErrorMessage,\n needHelpLabel,\n helpLineNumberLabel,\n loadingLabel,\n backToShopping,\n orderItemLabel,\n orderItemsLabel,\n pickupItemsHeader,\n pickingItemsLabel,\n shippingAddressTitle,\n shippingItemToYouLabel,\n helpLineContactAriaLabel,\n emailItemsHeader,\n emailingItemsLabel\n },\n config: { heading, contactNumber, showTimeslot }\n } = this.props;\n\n const moduleProps = { moduleProps: this.props, className: classname('ms-order-confirmation', this.props.config.className) };\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n let viewProps: IOrderConfirmationViewProps = {\n ...this.props,\n moduleProps,\n heading: heading && heading.text && (\n \n ),\n backToShoppingLink: backToShoppingUrl && (\n \n ),\n footerProps: { className: 'ms-order-confirmation__footer' }\n };\n\n if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.isDataReady) {\n viewProps = {\n ...viewProps,\n loading: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.order) {\n viewProps = {\n ...viewProps,\n alert: \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const isSalesInvoice = this.order.TransactionTypeValue === 15 as TransactionType.SalesInvoice;\n\n const salesLinesInput = getSalesLinesInput(this.props, this.moduleName, this.order, this.products, this.priceContext, true, showTimeslot, undefined,\n retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig?.result, this.deliveryOptions);\n const salesLines = salesLinesInput && getSalesLines(salesLinesInput);\n const orderInfomationInput = this.order && getOrderInfomationInput(this.props, this.moduleName, this.order, this.priceContext, undefined, undefined, undefined, isSalesInvoice);\n const orderInfomation = orderInfomationInput && getOrderInformation(orderInfomationInput);\n\n viewProps = {\n ...viewProps,\n salesOrder: this.order,\n orderInfomation,\n salesLines,\n groups: !isSalesInvoice && salesLines\n ? getGroups({\n moduleName: this.moduleName,\n salesLines,\n resources: {\n orderItemLabel, orderItemsLabel, pickupItemsHeader, pickingItemsLabel, shippingAddressTitle, shippingItemToYouLabel,\n emailItemsHeader, emailingItemsLabel\n },\n showTimeslot: showTimeslot,\n isConfirmationView: true,\n retailMultiplePickUpOptionEnabled\n })\n : undefined,\n orderSummary: !isSalesInvoice && this.orderSummaryProps ? getOrderConfirmationOrderSummary(this.orderSummaryProps) : undefined,\n payment: !isSalesInvoice && this.paymentMethodsProps ? getOrderConfirmationPaymentMethods(this.paymentMethodsProps) : undefined,\n help: !isSalesInvoice && contactNumber ? getOrderConfirmationHelp({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel, telemetryContent: this.telemetryContent }) : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleOrderConfirmationHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private getDeliveryMode = (salesLine: SalesLine, featureSate: boolean = false, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, pickupDeliveryMode?: string) => {\n if(!featureSate) {\n return pickupDeliveryMode;\n } else {\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === salesLine.DeliveryMode);\n }\n };\n\n}\n\nexport default OrderConfirmation;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { format, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { ISalesLine } from './get-sales-line';\nimport { groupSalesLines, IDeliveryType, ISalesStatusCode } from './utilities';\n\nexport interface IGroupDelivery {\n deliveryProps: INodeProps;\n pickupProps: INodeProps;\n showTimeslot: boolean;\n heading: React.ReactNode;\n count: React.ReactNode;\n processing: React.ReactNode;\n trackingInfo: React.ReactNode;\n address: React.ReactNode;\n shippingItemsToYou?: React.ReactNode;\n pickupDateTimeslot?: React.ReactNode;\n shippedStatusCheck?: React.ReactNode;\n}\n\nexport interface IGroup {\n groupProps: INodeProps;\n salesLinesProps: INodeProps;\n delivery: IGroupDelivery;\n salesLines: ISalesLine[];\n address: React.ReactNode;\n // row data\n data: {\n count: number;\n deliveryType: IDeliveryType;\n salesStatus: ISalesStatusCode;\n };\n}\n\nexport interface IGroupsInput {\n moduleName: string;\n salesLines: ISalesLine[];\n resources: {\n orderItemLabel: string;\n orderItemsLabel: string;\n pickupItemsHeader?: string;\n pickingItemsLabel?: string;\n shippingAddressTitle?: string;\n shippingItemToYouLabel?: string;\n emailItemsHeader?: string;\n emailingItemsLabel?: string;\n };\n showAddress?: boolean;\n isConfirmationView?: boolean;\n showTimeslot?: boolean;\n retailMultiplePickUpOptionEnabled?: boolean;\n}\n\nexport interface IGroups {\n groupsProps: INodeProps;\n groups: IGroup[];\n}\n\nexport const getGroups = ({ moduleName, salesLines, showAddress, showTimeslot, isConfirmationView, retailMultiplePickUpOptionEnabled,\n resources: {\n orderItemLabel,\n orderItemsLabel,\n pickupItemsHeader,\n pickingItemsLabel,\n shippingAddressTitle,\n shippingItemToYouLabel,\n emailItemsHeader,\n emailingItemsLabel }\n}: IGroupsInput): IGroups => {\n // tslint:disable-next-line:cyclomatic-complexity\n const groups = groupSalesLines(salesLines).map(group => {\n const { deliveryType, salesStatus, count, salesLines: _salesLines } = group;\n const itemLabel = count === 1 ? orderItemLabel : orderItemsLabel;\n const pickingItemsLabelText = pickingItemsLabel && format(pickingItemsLabel, count, itemLabel);\n const shippingItemsToYouText = shippingItemToYouLabel && format(shippingItemToYouLabel, count, itemLabel);\n const emailingItemsLabelText = emailingItemsLabel && format(emailingItemsLabel, count, itemLabel);\n const multiplePickup = deliveryType === 'ship' ? 'ship' : deliveryType === 'email' ? 'email' : 'pickup';\n const groupProps = { className: `${moduleName}__group-deliveryType-${multiplePickup} salesStatus-${salesStatus}` };\n const salesLinesProps = { className: `${moduleName}__sales-lines` };\n const address = _salesLines[0].address;\n const trackingInfo = _salesLines[0].trackingInfo;\n const isProcessing = _salesLines[0].data.salesStatus === 'processing';\n const pickDateTimeslot = _salesLines[0].pickupDateTimeslot;\n const shippedStatusCheck = _salesLines[0].data.salesStatus;\n const multiplePickUp = retailMultiplePickUpOptionEnabled ? 'multiple-pickUp' : '';\n const delivery: IGroupDelivery = {\n deliveryProps: { className: `${moduleName}__group-delivery ${multiplePickUp}` },\n pickupProps: { className: `${moduleName}__delivery-container` },\n heading: (\n \n {isProcessing\n ? isConfirmationView\n ? deliveryType === 'pickUp' ? pickupItemsHeader : deliveryType === 'ship' ? shippingAddressTitle : deliveryType === 'email' ? emailItemsHeader : deliveryType\n : _salesLines[0].deliveryType\n : _salesLines[0].salesStatus}\n \n ),\n processing: isProcessing ? (\n {_salesLines[0].salesStatus}\n ) : (\n undefined\n ),\n count: !isConfirmationView && {`(${count} ${itemLabel})`},\n shippingItemsToYou: isConfirmationView && deliveryType === 'ship'\n ? {shippingItemsToYouText}\n : deliveryType === 'pickUp'\n ? {pickingItemsLabelText}\n : deliveryType === 'email' ? {emailingItemsLabelText}\n : {pickingItemsLabelText},\n trackingInfo,\n address,\n pickupDateTimeslot: pickDateTimeslot,\n showTimeslot: showTimeslot || false,\n shippedStatusCheck:shippedStatusCheck\n };\n return {\n groupProps,\n salesLinesProps,\n delivery,\n salesLines: _salesLines,\n address: (showAddress) && address,\n data: {\n count,\n deliveryType,\n salesStatus\n }\n };\n });\n\n return {\n groupsProps: { className: `${moduleName}__groups` },\n groups\n };\n};\n","import { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IActionContext, IImageData } from '@msdyn365-commerce/core';\r\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport async function getValidProductImages(productId: number, channelId: number, actionContext: IActionContext): Promise {\r\n const actionInput = new MediaLocationsForSelectedVariantInput(\r\n productId,\r\n channelId,\r\n );\r\n\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return Promise.all(mediaLocations.map(validateMediaLocaionAsync))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n });\r\n }\r\n\r\n return [];\r\n }).catch(error => {\r\n actionContext.telemetry.error(error);\r\n\r\n return [];\r\n });\r\n}\r\n\r\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\r\n const imageData = {\r\n src: mediaLocation.Uri || '',\r\n altText: mediaLocation.AltText || ''\r\n };\r\n\r\n if (imageData.src === '') {\r\n return [imageData, false];\r\n }\r\n\r\n return new Promise<[IImageData, boolean]>((resolve) => {\r\n try {\r\n const http = new XMLHttpRequest();\r\n http.open('HEAD', mediaLocation.Uri!, true);\r\n\r\n http.onload = () => {\r\n resolve([imageData, http.status === 200 || http.status === 201]);\r\n };\r\n\r\n http.onerror = () => {\r\n resolve([imageData, false]);\r\n };\r\n\r\n http.send();\r\n } catch (e) {\r\n resolve([imageData, false]);\r\n }\r\n });\r\n}","/*---------------------------------------------------------------------------------------------\r\n * 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 { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport * as React from 'react';\r\n\r\n// import {thumbnailsOrientation} from '@msdyn365-commerce-modules/media-gallery';\r\nimport { IComponentNodeProps, IModuleProps, INodeProps, ISingleSlideCarouselProps, KeyCodes, NodeTag, SingleSlideCarousel } from '@msdyn365-commerce-modules/utilities';\r\nimport { IImageData, IImageDimension, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ISmweMediaGalleryData } from './smwe-media-gallery.data';\r\nimport { ISmweMediaGalleryProps } from './smwe-media-gallery.props.autogenerated';\r\nimport { getValidProductImages } from './utils';\r\n\r\nexport interface IMediaGalleryState {\r\n animating: boolean;\r\n activeIndex: number;\r\n mediaGalleryItems: IImageData[] | undefined;\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailsViewProps {\r\n ThumbnailsContainerProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n\r\n items?: IMediaGalleryThumbnailItemViewProps[];\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailItemViewProps {\r\n ThumbnailItemContainerProps: INodeProps;\r\n\r\n Picture: React.ReactElement;\r\n}\r\n\r\nexport interface IMediaGalleryViewProps extends ISmweMediaGalleryProps {\r\n state: IMediaGalleryState;\r\n productUrl?: string;\r\n isProductLightBox?: boolean;\r\n MediaGallery: IModuleProps;\r\n CarouselProps: INodeProps;\r\n Thumbnails: IMediaGalleryThumbnailsViewProps;\r\n}\r\n\r\ninterface IImageSettingsViewports {\r\n xs: IImageDimension;\r\n sm?: IImageDimension | undefined;\r\n md?: IImageDimension | undefined;\r\n lg?: IImageDimension | undefined;\r\n xl?: IImageDimension | undefined;\r\n}\r\n\r\nconst SLRAppellation: string = 'SLR Appellation';\r\nconst TastingNotes: string = 'Tasting Notes';\r\n\r\n/**\r\n * Media gallery component\r\n */\r\nclass MediaGallery extends React.Component, IMediaGalleryState> {\r\n private readonly defaultGalleryImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=0&h=387&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=0&h=387&m=8', w: 0, h: 0 },\r\n md: { q: 'w=0&h=772&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=0&h=772&m=8', w: 0, h: 0 },\r\n },\r\n lazyload: true\r\n };\r\n\r\n private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n lg: { q: 'w=100&m=8', w: 100, h: 0 },\r\n },\r\n lazyload: true\r\n };\r\n\r\n private noneWineProductImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=180&h=0&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=180&h=0&m=8', w: 0, h: 0 },\r\n md: { q: 'w=260&h=0&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=260&m=0', w: 0, h: 0 },\r\n xl: { q: 'w=260&m=0', w: 0, h: 0 },\r\n },\r\n lazyload: true\r\n };\r\n\r\n private isWineProduct: boolean = true;\r\n\r\n constructor(props: ISmweMediaGalleryProps) {\r\n super(props);\r\n this.state = { activeIndex: 0, animating: false, mediaGalleryItems: undefined };\r\n\r\n const modifiedImageSettings = props.config.galleryImageSettings;\r\n if(modifiedImageSettings) {\r\n if(modifiedImageSettings.viewports) {\r\n modifiedImageSettings.viewports = this.usePNGImageSetting(modifiedImageSettings.viewports);\r\n props.config.galleryImageSettings = modifiedImageSettings;\r\n }\r\n }\r\n }\r\n\r\n public usePNGImageSetting = (viewports: IImageSettingsViewports): IImageSettingsViewports => {\r\n const modifiedViewports = viewports;\r\n if(modifiedViewports?.xs?.q) {\r\n modifiedViewports.xs.q = modifiedViewports.xs.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.sm?.q) {\r\n modifiedViewports.sm.q = modifiedViewports.sm.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.md?.q) {\r\n modifiedViewports.md.q = modifiedViewports.md.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.lg?.q) {\r\n modifiedViewports.lg.q = modifiedViewports.lg.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.xl?.q) {\r\n modifiedViewports.xl.q = modifiedViewports.xl.q.replace('f=jpg', 'f=png');\r\n }\r\n\r\n return modifiedViewports;\r\n };\r\n\r\n public async componentDidMount(): Promise {\r\n const isGiftCard = this.props.data.product && this.props.data.product.result ? this.props.data.product.result.ItemId?.toLowerCase() === 'giftcard' : false;\r\n const giftCardImage: IImageData = {src: this.props.context.app.config.giftCardImage || ''};\r\n reaction(\r\n () => this.props.data.product.result ? this.props.data.product.result.RecordId : null,\r\n async () => {\r\n if (this.props.data.product.result) {\r\n if (isGiftCard && this.props.context.app.config.giftCardImage) {\r\n this.setState({\r\n mediaGalleryItems: [giftCardImage]\r\n });\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: await getValidProductImages(this.props.data.product.result.RecordId, +this.props.context.request.apiSettings.channelId, this.props.context.actionContext)\r\n });\r\n }\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: []\r\n });\r\n }\r\n }\r\n );\r\n\r\n if (this.props.data.product.result) {\r\n if (isGiftCard && this.props.context.app.config.giftCardImage) {\r\n this.setState({\r\n mediaGalleryItems: [giftCardImage]\r\n });\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: await getValidProductImages(this.props.data.product.result.RecordId, +this.props.context.request.apiSettings.channelId, this.props.context.actionContext)\r\n });\r\n }\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: []\r\n });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n data: {\r\n product: {\r\n result: product\r\n }\r\n },\r\n id,\r\n config,\r\n resources\r\n } = this.props;\r\n const data: ISmweMediaGalleryData = this.props.data;\r\n const wineAttributes = this.props.data.productSpecificationData.result && this.props.data.productSpecificationData.result.filter(\r\n attribute => attribute.Name && (attribute.Name.toUpperCase() === SLRAppellation.toUpperCase() || attribute.Name.toUpperCase() === TastingNotes.toUpperCase())\r\n );\r\n const isWineProduct = !!(wineAttributes && wineAttributes.map(attr => attr.TextValue).filter(value => value).length);\r\n this.isWineProduct = isWineProduct;\r\n\r\n if (!data) {\r\n throw new Error('[MediaGallery] Data items returned null or undefined');\r\n }\r\n\r\n let mediaGalleryItems = this.state.mediaGalleryItems;\r\n const { className, showPaginationTooltip } = config;\r\n\r\n if (!mediaGalleryItems && product) {\r\n mediaGalleryItems = [\r\n this._mapProductToImageData(product)\r\n ];\r\n }\r\n\r\n const isVertical: boolean = (config.thumbnailsOrientation === 'vertical');\r\n\r\n let productUrl;\r\n if (data.product && data.product.status === 'SUCCESS') {\r\n if (product) {\r\n productUrl = getProductUrlSync(product, this.props.context.actionContext, undefined);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-typeof-undefined\r\n const isProductLightbox = (typeof window !== 'undefined') && (window.location !== window.parent.location);\r\n\r\n const viewProps: IMediaGalleryViewProps = {\r\n ...(this.props as ISmweMediaGalleryProps),\r\n state: this.state,\r\n productUrl,\r\n isProductLightBox: isProductLightbox,\r\n MediaGallery: {\r\n moduleProps: this.props,\r\n className: classnames('ms-media-gallery', className, 'overflow-hidden',\r\n isVertical ? 'row' : 'col',\r\n isVertical ? 'media-gallery-vertical' : 'media-gallery-horizontal')\r\n },\r\n CarouselProps: {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items: mediaGalleryItems && mediaGalleryItems.map((item: IImageData, index: number) => this._getCarouselItem(item, index)),\r\n activeIndex: this.state.activeIndex,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n showPaginationTooltip: showPaginationTooltip === true,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting\r\n } as IComponentNodeProps,\r\n Thumbnails: {\r\n ThumbnailsContainerProps: {\r\n className: classnames('ms-media-gallery__thumbnails-container',\r\n isVertical ? 'h-100' : 'w-100',\r\n 'd-flex',\r\n 'justify-content-center',\r\n isVertical ? 'order-1' : 'row')\r\n },\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: 'ms-media-gallery__thumbnails',\r\n vertical: isVertical,\r\n flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n flipperNextLabel: resources.nextScreenshotFlipperText,\r\n parentId: id,\r\n useTabList: true,\r\n } as IComponentNodeProps,\r\n items: mediaGalleryItems && mediaGalleryItems.map((item: IImageData, index: number) => this._getThumbnailItem(item, index, this.state.activeIndex)),\r\n }\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private onExiting = () => {\r\n this.setState({ animating: true });\r\n };\r\n\r\n private onExited = () => {\r\n this.setState({ animating: false });\r\n };\r\n\r\n private next = (): void => {\r\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private previous = (): void => {\r\n const nextIndex = this.isFirstItem() ? (this.state.mediaGalleryItems ? this.state.mediaGalleryItems.length - 1 : 0) : this.state.activeIndex - 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private goToIndex = (index: number): void => {\r\n if (this.state.animating) {\r\n return;\r\n }\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _getCarouselItem = (image: IImageData, index: number): React.ReactNode => (\r\n \r\n );\r\n\r\n private _getThumbnailItem = (image: IImageData, index: number, modifiedActiveIndex: number): IMediaGalleryThumbnailItemViewProps => {\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: index,\r\n 'aria-label': image.altText,\r\n 'aria-selected': modifiedActiveIndex === index,\r\n 'aria-controls': `${this.props.id}__carousel-item__${index}`,\r\n onClick: this._generateOnThumbnailClick(index),\r\n onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n };\r\n\r\n private _generateOnThumbnailKeyDown = (index: number) => {\r\n return (event: React.KeyboardEvent) => {\r\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n }\r\n };\r\n };\r\n\r\n private _generateOnThumbnailClick = (index: number) => {\r\n return (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n };\r\n };\r\n\r\n private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n return {\r\n src: product.PrimaryImageUrl || '',\r\n };\r\n }\r\n\r\n private isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\r\n}\r\n\r\nexport default MediaGallery;","import * as React from 'react';\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => ( {text} );","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n}\n\nexport const ProductSearchResultItems: React.FC = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent\n}) => {\n\n return (\n\n
    \n {products.map((product: ProductSearchResult, index: number) => (\n
  • \n \n
  • \n ))}\n
\n );\n\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent ,onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image} from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n// import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n}\n\nexport const FeatureSearchResultItem: React.FC = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent\n}) => {\n if(product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId: 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n \n );\n\n};\n\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, altText?: string, fallbackImage?: string,): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings: gridSettings,\n imageSettings: imageSettings,\n fallBackSrc: fallbackImage\n };\n return (\n \n );\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\nreturn

{title}

;\n}","import * as React from 'react';\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC = ({ text, className }) => ( {text} );\n","import * as React from 'react';\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC = ({ separator }) => ( {separator} );","import { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport const enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport const enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport const enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\n/**\n * Checks if the data type value corresponds to a slider.\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer;\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value\n * @param productRefinerValue product refiner value to match\n * @param refinementCriteria selected refinement criteria\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // if the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find(\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value\n * @param productRefinerValue product refiner value to match\n * @param refinementCriteria selected refinement criteria\n */\nexport function isMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriterion: ProductRefinerValue\n): boolean {\n // if the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\n };\n updatedRefinementCriteria.push(next);\n\n } // else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString,\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency: currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (e) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\n }\n\n return result;\n}","import { Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { formatPrice } from './utilities';\n\ntype InputType = 'Min' | 'Max';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n}\n\n/**\n * Range refine item state\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu)\n */\n@observer\nexport default class RangeRefineItem extends React.Component {\n private _formattedPriceReverseLookup: Map = new Map();\n\n private minInput: React.RefObject;\n private maxInput: React.RefObject;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef();\n this.maxInput = React.createRef();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\n const initialMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false\n };\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n
\n \n \n {validationErrorMin &&\n {validationErrorMin}\n }\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\n {validationErrorMax}\n }\n
\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\n const min = productRefinerValue.LeftValueBoundString;\n const max = productRefinerValue.RightValueBoundString;\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n const minPrice = this._formatPrice(min);\n const maxPrice = this._formatPrice(max);\n const selectedMinPrice =this._formatPrice(selectedMin);\n const selectedMaxPrice =this._formatPrice(selectedMax);\n\n return (\n \n );\n }\n\n private _changeMin(event: React.FocusEvent): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({validationErrorMin: refineItemCommonProps.validationErrorNaN});\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n } else {\n this._focus('Min');\n }\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({validationErrorMax: refineItemCommonProps.validationErrorNaN});\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n const locale = this.props.refineItemCommonProps.locale;\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\n\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\n this._formattedPriceReverseLookup.set(result, amount);\n }\n\n return result;\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n // tslint:disable-next-line:no-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // tslint:disable-next-line\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n // tslint:disable-next-line\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (!!element) {\n setTimeout(\n () => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}","import { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\n\n/**\n * RefineItem properties\n */\nexport interface IRefineItemProps {\n\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n /** The telemetry content */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\n */\nexport default class RefineItem extends React.Component {\n private anchorType: React.RefObject;\n private payLoad: IPayLoad;\n\n constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n // tslint:disable-next-line:max-func-body-length\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\n const selectedRating = parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n return (\n \n \n \n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n \n \n );\n } else {\n return undefined;\n }\n } else {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n return (\n
  • \n \n \n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n \n \n
  • \n );\n }\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private _onClick = (e: React.MouseEvent): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(\n () => {\n this.anchorType.current && this.anchorType.current.focus();\n },\n 0\n );\n }\n }\n}","import { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport classnames from 'classnames';\nimport { get } from 'lodash';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n}\n\n /**\n * ChoiceSummary component\n */\n@observer\nexport default class ChoiceSummary extends React.Component {\n private closeButtonGlyph: string = 'msi-close-btn';\n private payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n const { selectedChoices } = this.props;\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\n return {\n key: this._getKeyForRefinerValue(selectedRefiner),\n value: selectedRefiner\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n
    \n {items.length > 0 && label && {label}}\n
      \n {items.map((item: IRefinerMap, index: number) => {\n const listItemProps = {\n 'aria-posinset': index,\n 'aria-setsize': items.length\n };\n\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n
    • \n \n {item.key}\n \n \n
    • \n );\n })}\n
    \n {items.length > 0 && clearAllText && {clearAllText}}\n
    \n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n if (refinerHierarchy && refinerHierarchy.find) {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n const locale = get(this.props, 'context.request.locale', 'en-US');\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency: currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (e) {\n result = `${priceAmount} ${currency}`;\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\n }\n\n return result;\n }\n\n private _onClick = (e: React.MouseEvent): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll: clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n }\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => (itemClicked.innerText && itemClicked.innerText.trim()) === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","import {\n Button,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject | undefined;\n onModalToggle():void;\n}\n\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\n const {text, onClick, ariaLabel, innerRef, id} = props;\n return ;\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps):ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: \n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n \n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return (\n \n {props.resources.modalTitle}\n \n );\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n \n \n \n );\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {IAny, ICoreContext, IGeneric} from '@msdyn365-commerce/core';\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\n\n/**\n * Properties associated with the RefineSubmenu component\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext>;\n moduleId: string;\n moduleTypeName: string;\n /** The telemetry content */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent}\n */\nclass RefineSubmenu extends React.Component {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n // if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\n return null;\n }\n return (\n
    \n \n {productRefinerHierarchy.KeyName}\n \n \n {this._renderChildItems(productRefinerHierarchy)}\n \n
    \n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\n const refinerValuesList = (productRefinerHierarchy.Values || []);\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n return (\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index= {index}\n context = {context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n />\n );\n });\n return (\n
      \n {listItems}\n
    \n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = (productRefinerHierarchy.Values || []);\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\n return (\n
  • \n \n
  • \n );\n });\n return
      {listItems}
    ;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;","import * as React from 'react';\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC = ({ text }) => {\n return (\n \n
    {text}
    \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 {ArrayExtensions, getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, ITelemetryContent, LabeledDropdown, UncontrolledPagination } from '@msdyn365-commerce-modules/utilities';\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { format, ProductPrice,ProductRefinerValue, ProjectionDomain, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\nimport {\n getActivePricesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { AffiliationLoyaltyTier, CustomerAffiliation } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classnames from 'classnames';\nimport { computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { buildListPageUrl, getCollectionProducts, getCurrentUrl, GetFullProductsByCollectionInput, parseQueryParam, sortOptions } from './actions';\nimport {\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title:ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?:React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component\n * @extends {React.PureComponent>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent, ISearchResultContainerState> {\n\n @computed get isMobile(): boolean {\n return (this._viewport === 'xs' || this._viewport === 'sm');\n }\n\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n ];\n private _refineItemCommonProps: IRefineItemCommonProps;\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n @observable\n private _viewport: GridSize;\n\n private _modalToggleRef: React.RefObject;\n private _sortAndFilterContainerRef: React.RefObject;\n private expandrefinerCount: number | undefined = 0;\n private telemetryContent: ITelemetryContent;\n private productPrices: ProductPrice[];\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && nameTranslations.length > 0) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation && nameTranslation.Text;\n }\n\n constructor(props: ISearchResultContainerProps, state: ISearchResultContainerState) {\n super(props);\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef();\n this._sortAndFilterContainerRef = React.createRef();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices=[];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false\n };\n const {\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat\n } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n // Initalization of list page\n this.props.data.products.then((products) => {\n this.props.data.listPageState.then((listPageState) => {\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n let querySorting: SortColumn[] = [];\n\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\n },\n () => {\n const input = new GetFullProductsByCollectionInput(\n listPageState.pageType,\n this.props.context.request.apiSettings,\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\n listPageState.activeFilters || [],\n +(this.props.context.request.urlTokens.itemId || 0),\n this.props.context.request.query && this.props.context.request.query.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\n this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes === true ? true : false,\n this.props.context.request.locale\n );\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\n listPageState.activeProducts = productResults.products;\n listPageState.totalProductCount = productResults.count;\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\n // tslint:disable-next-line:no-floating-promises\n this._getActivePrice();\n }\n });\n }\n );\n\n });\n });\n\n if (this.props.context.request.query?.productId) {\n this.props.data.featureProduct.then((products) => {\n this.props.data.listPageState.then((listPageStateFeature) => {\n listPageStateFeature.featureProduct = products;\n\n });\n });\n }\n this._updateViewport();\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n if (this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\n // tslint:disable-next-line:no-floating-promises\n this._getActivePrice();\n }\n }\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const { imageSettings, className, allowBackNavigation } = this.props.config;\n const { resources } = this.props;\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\n let errorText = '';\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n if(!products || products.length === 0) {\n errorText = this._pageType === 'Category'? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n\n }\n const productsComponent = (\n \n );\n\n const featureComponent = (\n \n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown(): null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: {className: 'ms-search-result-container__product-section'},\n CategoryNavContainer: {className: 'ms-search-result-container__category-nav-section'},\n RefineAndProductSectionContainer: {className: 'ms-search-result-container__refine-product-section'},\n choiceSummary: this._getChoiceSummary(),\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ?\n (\n \n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && (\n \n ),\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\n productPrices: this.productPrices\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n private _getActivePrice = async (): Promise => {\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\n const projectDomain: ProjectionDomain = { ChannelId: this.props.context.request.apiSettings.channelId, CatalogId: this.props.context.request.apiSettings.catalogId };\n const affliations: AffiliationLoyaltyTier[] = [];\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\n\n if (customer && customer.CustomerAffiliations) {\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\n const aff: AffiliationLoyaltyTier = { AffiliationId: affliation.RetailAffiliationId, CustomerId: customer.AccountNumber };\n affliations.push(aff);\n });\n }\n\n await getActivePricesAsync(\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\n projectDomain,\n productRecIds,\n new Date(),\n null,\n affliations,\n true\n ).then((activePricesResponse:ProductPrice[]) => {\n this.productPrices = activePricesResponse;\n products = products.map(prod => {\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\n if (activePrice) {\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\n prod.BasePrice = Math.max(activePrice.BasePrice || 0, activePrice.TradeAgreementPrice || 0, activePrice.AdjustedPrice || 0);\n }\n return prod;\n });\n this.props.data.listPageState.then((listPageState) => {\n listPageState.activeProducts = products;\n });\n }).catch((error: Error) => {\n this.props.context.actionContext.trace(error.message);\n this.props.context.actionContext.telemetry.exception(error);\n this.props.context.actionContext.telemetry.debug(`[get Affiliation based price on search result container ]Error executing action`);\n throw new Error('[get Affiliation based price on search result container]Error executing action');\n });\n }\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\n const {resources} = this.props;\n return SearchResultModal(\n {\n resources:{\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen:this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n }\n\n private _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle = (data.category.result && SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name);\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const titlePrefix = ;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: 'ms-search-result-container__title' },\n title:{\n titlePrefix: titlePrefix,\n titleText: titleText,\n titleCount: titleCount\n }\n };\n\n }\n private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n\n }\n\n private _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={this.sortByDropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />);\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown:dropdown\n };\n }\n\n private _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data && data.listPageState && data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n const skipCount = listPageState && listPageState.currentPageNumber !== null ?\n (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) :\n ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\n const totalItems = listPageState && listPageState.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp={'skip'}\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={<div className='msc-pagination__prev'><span className='ms-search-result__pagination-left' aria-hidden='true'/><span className='prev-text'>{previousText}</span></div>}\n nextText={<div className='msc-pagination__next'><span className='next-text'>{nextText}</span><span className='ms-search-result__pagination-right' aria-hidden='true'/></div>}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />);\n }\n\n private _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\n return refiner.Values.length > 0;\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={expandedRefiners && expandedRefiners > index ? true : false}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context = {context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n />\n );\n });\n\n return {\n RefineMenuContainer:{className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer:{className: 'ms-search-result-container__refiner-section'},\n refiners: subMenus\n };\n\n }\n\n private _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n selectedChoices={selectedRefiners}\n // @ts-ignore: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n />\n );\n\n }\n\n private _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const { context } = this.props;\n const requestContext = context && context.request;\n const actionContext = context && context.actionContext;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n }\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\n });\n }\n\n private _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === option.key; });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n }\n\n private _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const { data } = this.props;\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\n\n const activeSortColumn =\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\n\n if (activeSortColumn && data.searchConfiguration.result) {\n const activeMappedConfig = data.searchConfiguration.result.find((mappedSearchConfig) => {\n return (mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName) &&\n (mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending);\n });\n if (activeMappedConfig) {\n return this.sortByDropdownOptions.find((dropdownOption) => dropdownOption.key === activeMappedConfig.key);\n }\n }\n\n return;\n }\n\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const { context } = this.props;\n const requestContext = context && context.request;\n const actionContext = context && context.actionContext;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n }\n\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n }\n\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n } else {\n this.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\n return '';\n }\n }\n\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n },\n 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n }\n\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n }\n\n private _getViewport(): GridSize {\n const { context } = this.props;\n\n // always render in mobile viewport on a mobile device\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\n return 'xs';\n }\n\n if (MsDyn365.isBrowser && window.innerWidth) {\n const gridSettings = context.request.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n } else {\n return 'xl';\n }\n }\n }\n\n return 'lg';\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch(refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n }\n\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, ChannelDeliveryOptionConfiguration} from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderSummaryProps {\n subTotalLabel: string;\n shippingLabel: string;\n taxLabel: string;\n orderTotalLabel: string;\n loyaltyLabel?:string;\n giftcardLabel?:string;\n totalDiscountsLabel: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n id: string;\n typeName: string;\n otherChargeLabel?: string;\n freeText?:string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n}\n\nexport interface IOrderSummaryLines {\n subtotal: React.ReactNode;\n shipping?: React.ReactNode;\n otherCharge?: React.ReactNode;\n tax: React.ReactNode;\n orderTotal: React.ReactNode;\n totalDiscounts?: React.ReactNode;\n giftCard?:React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IOrderSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?:string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\ninterface IShippingOrderLine {\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n canShip?: boolean;\n hasDeliveryMethod?: boolean;\n hasShippingMethod?: boolean;\n freightFee?: number;\n}\n\nconst OrderSummaryLine: React.FC<IOrderSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return(\n <p className={`msc-order-summary__line-${cssLabel}`}>\n <span className='msc-order-summary__label'>{label}</span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: {CustomerContextualPrice: price}\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className={'msc-order-summary__value'}\n />\n ) : (\n <span className='msc-order-summary__value'>{toBeCalculatedText}</span>\n )}\n </p>\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = '',\n ):React.ReactNode => {\n return (\n <OrderSummaryLine\n price = { price }\n label = { label }\n context = { props.context }\n id = { props.id }\n typeName = { props.typeName }\n toBeCalculatedText = { props.toBeCalculatedText }\n freeText = { props.freeText }\n telemetry = {props.telemetry}\n cssLabel = {cssLabel}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nconst getDeliveryConfiguration = (cart: Cart, channelConfiguration: ChannelConfiguration, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, retailMultiplePickUpOptionEnabled?: boolean):IShippingOrderLine => {\n\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\n const emailDeliveryModeCode = channelConfiguration && channelConfiguration.EmailDeliveryModeCode;\n const cartLines = cart.CartLines || [];\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\n\n const freightFee = cart.ShippingChargeAmount;\n const canShip = deliveryModes.some(deliveryMode => (deliveryMode !== '' && (deliveryMode === getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) || deliveryMode === emailDeliveryModeCode)) ? false : true);\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) && deliveryMode !== emailDeliveryModeCode);\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (deliveryMode?: string, featureSate: boolean = false, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, pickupDeliveryMode?: string) => {\n if(!featureSate) {\n return pickupDeliveryMode;\n } else {\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n }\n};\n\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const { SubtotalAmount, TaxAmount, DiscountAmountWithoutTax = 0, TotalAmount, OtherChargeAmount } = props.cart;\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(props.cart, props.channelConfiguration, props.channelDeliveryOptionConfig, props.retailMultiplePickUpOptionEnabled);\n const reactNodes:IOrderSummaryLines = {\n subtotal: _buildOrderSummarySection(props, SubtotalAmount, 'sub-total', props.subTotalLabel),\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount: undefined, 'tax-amount', props.taxLabel),\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge: OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount,'other-charges', props.otherChargeLabel) || undefined,\n };\n\n if(canShip) {\n reactNodes.shipping =_buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if(props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if(loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if(giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection({...props, freeText: undefined }, totalAmountAfterGiftCard, 'total', props.orderTotalLabel);\n }\n\n if(DiscountAmountWithoutTax > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmountWithoutTax, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IGetHelpInput, IHelp } from '../../../';\n\nexport const getOrderDetailsHelp = ({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel, telemetryContent }: IGetHelpInput): IHelp => {\n const payLoad: IPayLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.ContactNumber);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return ({\n helpProps: { className: 'ms-order-details__help' },\n needHelpLabel: <p className='ms-order-details__help-title'>{needHelpLabel}</p>,\n helpLineNumberLabel: <span className='ms-order-details__help-label'>{helpLineNumberLabel}</span>,\n contactNumber: (\n <a className='ms-order-details__help-content-number' aria-label={`${helpLineContactAriaLabel} ${contactNumber}`} href={`tel:${contactNumber}`} {...attributes}>\n {contactNumber}\n </a>\n )}\n );\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { 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 = <IModuleStates>ctx.get<IModuleStates>(cacheKey.getCacheObjectType(), cacheKey.getCacheKey());\n if (moduleStates) {\n return moduleStates;\n }\n ctx.update(cacheKey, {});\n moduleStates = <IModuleStates>ctx.get<IModuleStates>(cacheKey.getCacheObjectType(), cacheKey.getCacheKey());\n return moduleStates;\n}\n\nexport function updateModuleStates(value: IModuleStates, ctx: IActionContext): void {\n const cacheKey = new ModuleStatesCacheKey();\n ctx.update(cacheKey, value);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. 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 = <P extends IProps>(WrappedComponent: React.ComponentType<P>): React.ComponentType<P> => {\n /**\n *\n * ModuleState component\n * @extends {React.Component<P>}\n */\n @observer\n class ModuleState extends React.Component<P> {\n constructor(props: P) {\n super(props);\n this.initializeState();\n }\n\n public render(): JSX.Element | null {\n const { id } = this.props;\n return <WrappedComponent {...this.props} moduleState={this.getModuleStateManager(id)} />;\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<IModuleState>): void => {\n if (moduleState.hasInitialized) {\n // state has been initialized\n return;\n }\n this.update(id, {\n hasInitialized: true,\n ...options\n });\n }\n };\n };\n\n /**\n * GetModuleStateManagerByTypeName\n * Get module state manager by type name\n */\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<IModuleState>): void => {\n // console.log('withModuleState - update', id, value);\n const modules = this.get();\n if (!modules[id]) {\n this.props.telemetry.error(`withModuleState update() - Module state with id ${id} is not found.`);\n return;\n }\n modules[id] = {\n ...modules[id],\n ...value\n };\n };\n\n private _validateLeaf = (id: string, source: Partial<IModuleState>): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n return false;\n }\n return isMatch(module, source);\n };\n\n private _validateContainer = (\n id: string,\n source: Partial<IModuleState>,\n allMatched?: boolean,\n skipSkippableItem?: boolean\n ): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n // module doesn't has module state\n return !!allMatched;\n }\n\n if (skipSkippableItem && (module.status === 'disabled' || module.status === 'skipped')) {\n // Skip disabled or skipped modules\n return !!allMatched;\n }\n\n // It is leaf module\n if (!module.childIds || !module.childIds.length) {\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<IModuleState>, allMatched?: boolean, skipSkippableItem?: boolean): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n return false;\n }\n\n // It is leaf module\n if (!module.childIds || !module.childIds.length) {\n return this._validateLeaf(id, source);\n }\n\n // It is container module\n return this._validateContainer(id, source, allMatched, skipSkippableItem);\n };\n\n /**\n * hasExternalSubmitGroup\n * Module will use external submit group\n */\n private hasExternalSubmitGroup = (): boolean => {\n return !!this.props.enableControl;\n };\n\n /**\n * hasModuleState\n * Module is using module state manager\n */\n private hasModuleState = (id: string): boolean => {\n const modules = this.get();\n const module = modules[id];\n return !!module;\n };\n }\n\n return ModuleState;\n};\n\nexport default withModuleState;","import { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy';\n\nexport async function getValidProductImages(productId: number, channelId: number, actionContext: IActionContext, imageSettings: IImageSettings): Promise<IImageData[]> {\n const actionInput = new MediaLocationsForSelectedVariantInput(\n productId,\n channelId,\n );\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n }).catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(mediaLocations: MediaLocation[], actionContext: IActionContext, imageSettings: IImageSettings): Promise<IImageData[]> {\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n }).catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate prodcut images');\n return [];\n });\n}\n\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings: IImageSettings): Promise<[IImageData, boolean]> {\n const imageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n\n const imageSettingsVal = ((imageSettings.viewports?.lg!.q!).replace(/['\"]+/g, ''));\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n const imageConcatVal = `${imageData.src}` + `&` + `${imageSettingsVal}`;\n\n return new Promise<[IImageData, boolean]>((resolve) => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageConcatVal, true);\n\n http.onload = () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n };\n\n http.onerror = () => {\n resolve([imageData, false]);\n };\n\n http.send();\n } catch (e) {\n resolve([imageData, false]);\n }\n });\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\n\nimport {\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInit,\n INodeProps,\n ISingleSlideCarouselProps,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeInlineZoomStyle,\n SingleSlideCarousel\n} from '@msdyn365-commerce-modules/utilities';\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { imageSource, imageZoom, IMediaGalleryData, IMediaGalleryProps, thumbnailsOrientation } from '../..';\nimport { getValidProductImages, validateProductImages } from './utils';\n\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n mediaGalleryItems: IImageData[] | undefined;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n}\n\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps<IMediaGalleryData> {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?:React.ReactElement|null;\n}\n\n/**\n * Media gallery component\n */\nclass MediaGallery extends React.Component<IMediaGalleryProps<IMediaGalleryData>, IMediaGalleryState> {\n private _inlineZoomDivRef: Map<number, HTMLDivElement> = new Map();\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n constructor(props: IMediaGalleryProps<IMediaGalleryData>) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = { activeIndex: 0, animating: false, mediaGalleryItems: undefined, isImageZoomed: false, modalIsOpen:false };\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public async componentDidMount(): Promise<void> {\n const source = this.props.config.imageSource || imageSource.pageContext;\n const curatedImage = this.props.config.images || [];\n\n if (source === imageSource.pageContext) {\n reaction(\n () => (this.props.data.product.result ? this.props.data.product.result.RecordId : null),\n async () => {\n if (this.props.data.product.result) {\n const images = await getValidProductImages(\n this.props.data.product.result.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\n );\n this.setState({\n mediaGalleryItems: [...images, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n } else {\n this.setState({\n mediaGalleryItems: [...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n }\n }\n );\n }\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\n );\n this.setState({\n mediaGalleryItems: [...images, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n } else if (source === imageSource.pageContext && this.props.data.product.result) {\n const images = await getValidProductImages(\n this.props.data.product.result.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\n );\n\n this.setState({\n mediaGalleryItems: [...images, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n } else {\n this.setState({\n mediaGalleryItems: [...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n }\n }\n\n public render(): JSX.Element {\n const {\n id,\n config,\n resources\n } = this.props;\n\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const { className, showPaginationTooltip } = config;\n const galleryImageSettings = config.galleryImageSettings;\n if(galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n const thumbnailImageSettings = config.thumbnailImageSettings;\n if(thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n const allowFullscreen:boolean = config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline\n ? imageZoom.inline\n : config.imageZoom === imageZoom.container\n ? imageZoom.container\n : '';\n const zoomView = allowFullscreen ? 'fullscreen': zoomViewMode;\n\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps<IMediaGalleryData>),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: allowFullscreen ? this.imageModalSlider(zoomViewMode): null,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(zoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: this.state.lastUpdate\n } as IComponentNodeProps<ICarouselProps>,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: this.state.lastUpdate\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) => this._getThumbnailItem(item, thumbnailImageSettings || this.defaultThumbnailImageSettings, index, this.state.activeIndex))\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private onExiting = () => {\n this.setState({ animating: true });\n };\n\n private onExited = () => {\n this.setState({ animating: false });\n };\n\n private next = (): void => {\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n };\n\n private previous = (): void => {\n const nextIndex = this.isFirstItem()\n ? this.state.mediaGalleryItems\n ? this.state.mediaGalleryItems.length - 1\n : 0\n : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n };\n\n private goToIndex = (index: number): void => {\n this.setState({ activeIndex: index });\n };\n\n private _renderCarouselItemImageView(zoomView: string, image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n if (zoomView === 'container') {\n return this._renderImageInContainerOnZoom(image, imageSettings, index);\n } else if (zoomView === 'inline') {\n return this._renderImageInlineOnZoom(image, imageSettings, index);\n } else if (zoomView === 'fullscreen') {\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n } else {\n return <React.Fragment>{this._getCarouselItem(image, imageSettings, index)}</React.Fragment>;\n }\n }\n\n private _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\n <Image\n className='ms-media-gallery__item'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n role='tabpanel'\n id={`${this.props.id}__carousel-item__${index}`}\n />\n );\n\n private _getThumbnailItem = (image: IImageData, imageSettings: IImageSettings, index: number, modifiedActiveIndex: number): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n 'aria-controls': `${this.props.id}__carousel-item__${index}`,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n className='ms-media-gallery__thumbnail'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n />\n )\n };\n };\n\n private _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent<HTMLLIElement>) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\n return (\n // tslint:disable-next-line: react-this-binding-issue\n <div className={`ms-inline-zoom ${this.state.isImageZoomed ? 'zoomed' : ''}`} ref={divRef => this._inlineZoomDivRef.set(index, divRef!)} data-scale={this.props.config.dataScale}>\n <Image\n className='ms-media-gallery__item'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n role='tabpanel'\n onClick={this._onInlineImageClick}\n onMouseOver={this.state.isImageZoomed && this._inlineZoomImageOnHover || undefined}\n id={`${this.props.id}__carousel-item__${index}`}\n />\n <Image\n role='presentation'\n className='ms-inline-zoom__zoomedImg'\n {...image}\n onClick={this._onImageMouseOut}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n id={`${this.props.id}__zoom__${index}`}\n onMouseMove={this.state.isImageZoomed && inlineZoomImageOnMouseMove || undefined}\n />\n </div>\n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent<HTMLImageElement>): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale);\n }\n\n private _onInlineImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\n return;\n }\n\n inlineZoomInit(event, this.props.config.dataScale);\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent<HTMLImageElement, MouseEvent>): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent<HTMLImageElement>): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\n return (\n <div className='ms-containerZoom__container'>\n <div className='ms-containerZoom__zoom-lens' role='presentation' onMouseOut={this._onMouseOutLensContainer} onClick={this._onMouseOutLensContainer} onMouseMove={this.state.isImageZoomed && onMouseMoveLensContainer || undefined} />\n <Image\n className='ms-media-gallery__item'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n onClick={this._onContainerZoomImageClick}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n onMouseOver={this.state.isImageZoomed && onMouseOverImageContainer || undefined}\n id={`${this.props.id}__carousel-item__${index}`}\n />\n </div>\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\n return (\n <div className='ms-fullscreen-section'>\n <Image\n className='ms-media-gallery__item'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n role='tabpanel'\n />\n <div className='ms-fullscreen-section__overlay'>\n <a href='javascript:void(0);' title={this.props.resources.fullScreenTitleText} role='button' onClick={this.openModalDialog} className='ms-fullscreen-section__magnifying-glass-icon'/>\n </div>\n </div>\n );\n }\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl || ''\n };\n }\n\n private isFirstItem = () => this.state.activeIndex === 0;\n\n private isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\n\n private openModalDialog = (): void => {\n this._toggleModal();\n }\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n }\n\n private imageModalSlider=(ZoomView:string):React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources,\n config\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n\n const galleryImageSettings = config.galleryImageSettings;\n if(galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(ZoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: true,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n } as IComponentNodeProps<ICarouselProps>;\n\n const carousel = <Carousel {...carouselprops} />;\n\n const imageModalSliderProps:IModalViewProps = {\n modalIsOpen:this.state.modalIsOpen,\n ontoggle:this._toggleModal,\n galleryCarousel: carousel\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n }\n}\n\nexport default MediaGallery;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { computed } from 'mobx';\nimport * as React from 'react';\nimport { IGetOrderSummaryInput, IHelp, IOrderSummary, IPaymentMethods, IPaymentMethodsInput } from '../../common';\nimport { getGroups, IGroups } from '../../common/get-groups';\nimport { getOrderInfomationInput, getOrderInformation, IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { getSalesLines, getSalesLinesInput } from '../../common/get-sales-lines';\nimport LabelComponent from '../../common/label';\nimport { getTenderIdOperationIdMap, IPriceContext } from '../../common/utilities';\nimport { getOrderConfirmationHelp } from '../order-confirmation/components/get-help';\nimport { getOrderConfirmationOrderSummary } from '../order-confirmation/components/get-order-summary';\nimport { getOrderConfirmationPaymentMethods } from '../order-confirmation/components/get-payment-methods';\nimport { ICheckoutOrderConfirmationData } from './checkout-order-confirmation.data';\nimport { ICheckoutOrderConfirmationProps } from './checkout-order-confirmation.props.autogenerated';\n\nexport * from '../../common/get-groups';\nexport * from '../../common/get-order-information';\nexport * from '../../common/get-sales-line';\nexport * from '../../common/get-sales-lines';\nexport * from '../../common/utilities';\nexport * from '../order-confirmation/components/get-help';\nexport * from '../order-confirmation/components/get-order-summary';\nexport * from '../order-confirmation/components/get-payment-methods';\n\nexport interface ICheckoutOrderConfirmationViewProps extends ICheckoutOrderConfirmationProps<ICheckoutOrderConfirmationData> {\n moduleProps: IModuleProps;\n salesOrder?: SalesOrder;\n footerProps?: INodeProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n heading: React.ReactNode;\n backToShoppingLink?: React.ReactNode;\n orderInfomation?: IOrderInformation;\n salesLines?: ISalesLine[];\n groups?: IGroups;\n orderSummary?: IOrderSummary;\n payment?: IPaymentMethods;\n help?: IHelp;\n}\n\n/**\n *\n * OrderConfirmation component\n * @extends {React.PureComponent<IOrderConfirmationProps<IOrderConfirmationData>>}\n */\nclass OrderConfirmation extends React.PureComponent<ICheckoutOrderConfirmationProps<ICheckoutOrderConfirmationData>> {\n private moduleName: string = 'ms-order-confirmation';\n private telemetryContent?: ITelemetryContent;\n private backToShoppingAttributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: ICheckoutOrderConfirmationProps<ICheckoutOrderConfirmationData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\n this.backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n }\n\n @computed get isCurrentChannel(): boolean {\n if (!this.order) {\n return false;\n }\n return this.order.ChannelId === get(this.props, 'context.request.apiSettings.channelId');\n }\n\n @computed get isDataReady(): boolean {\n return get(this.props, 'data.checkout.status') === 'SUCCESS';\n }\n\n @computed get hasError(): boolean {\n return get(this.props, 'data.checkout.status') === 'FAILED';\n }\n\n @computed get order(): SalesOrder | undefined {\n return get(this.props, 'data.checkout.result.salesOrder');\n }\n\n @computed get products(): SimpleProduct[] {\n return get(this.props, 'data.checkout.result.orderedProducts') || [];\n }\n\n @computed get priceContext(): IPriceContext {\n const {\n id,\n typeName,\n context,\n telemetry,\n resources: { freePriceText }\n } = this.props;\n return {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n }\n\n @computed get earnedPoints(): number {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n if (loyaltyCard && loyaltyCard.RewardPoints && this.order) {\n const pointPrograms = loyaltyCard.RewardPoints.map(point => point.RewardPointId);\n const rewardLines = this.order.LoyaltyRewardPointLines || [];\n let total = 0;\n rewardLines.forEach(line => {\n if ((line.RewardPointAmountQuantity || 0) > 0 && pointPrograms.indexOf(line.RewardPointId) > -1) {\n total += line.RewardPointAmountQuantity!;\n }\n });\n return total;\n }\n return 0;\n }\n\n @computed get orderSummaryProps(): IGetOrderSummaryInput | undefined {\n if (!this.order) {\n return;\n }\n\n const {\n resources: { orderSummaryHeading, orderSummaryItemsTotalLabel, orderSummaryShippingFeeLabel, orderSummaryTaxLabel, orderSummaryGrandTotalLabel, pointsEarnedLabel }\n } = this.props;\n return {\n order: this.order,\n earnedPoints: this.earnedPoints,\n priceContext: this.priceContext,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n pointsEarnedLabel,\n orderSummaryGrandTotalLabel\n }\n };\n }\n\n @computed get paymentMethodsProps(): IPaymentMethodsInput | undefined {\n const tenderTypes = this.props.data.tenderTypes.result;\n if (!this.order || !this.order.TenderLines || !tenderTypes) {\n return;\n }\n\n const locale = get(this.props, 'context.request.locale') || 'en-US';\n\n const {\n resources: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n } = this.props;\n\n return {\n priceContext: this.priceContext,\n tenderLines: this.order.TenderLines,\n tenderIdOperationIdMap: getTenderIdOperationIdMap(tenderTypes),\n locale,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n };\n }\n\n public render(): JSX.Element {\n const {\n resources: {\n noSalesOrderText,\n genericErrorMessage,\n needHelpLabel,\n helpLineNumberLabel,\n loadingLabel,\n backToShopping,\n orderItemLabel,\n orderItemsLabel,\n helpLineContactAriaLabel,\n },\n config: { heading, contactNumber, showTimeslot }\n } = this.props;\n\n const moduleProps = { moduleProps: this.props, className: classname('ms-order-confirmation', this.props.config.className) };\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n let viewProps: ICheckoutOrderConfirmationViewProps = {\n ...this.props,\n moduleProps,\n heading: heading && heading.text && (\n <Msdyn365.Text\n {...heading}\n className='ms-order-confirmation__heading'\n text={heading.text}\n tag={heading.tag || 'h2'}\n editProps={{ onEdit: this.handleCheckoutOrderConfirmationHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n backToShoppingLink: backToShoppingUrl && (\n <Button className='ms-order-confirmation__btn-keep-shopping' href={backToShoppingUrl} {...this.backToShoppingAttributes}>\n {backToShopping}\n </Button>\n ),\n footerProps: { className: 'ms-order-confirmation__footer' }\n };\n\n if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: <LabelComponent className='ms-order-confirmation__alert' label={genericErrorMessage} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.isDataReady) {\n viewProps = {\n ...viewProps,\n loading: <LabelComponent className='ms-order-confirmation__loading' label={loadingLabel} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.order) {\n viewProps = {\n ...viewProps,\n alert: <LabelComponent className='ms-order-confirmation__alert' label={noSalesOrderText} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const salesLinesInput = getSalesLinesInput(this.props, this.moduleName, this.order, this.products, this.priceContext, false, showTimeslot, undefined, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig?.result);\n const salesLines = salesLinesInput && getSalesLines(salesLinesInput);\n\n const orderInfomationInput = this.order && getOrderInfomationInput(this.props, this.moduleName, this.order, this.priceContext);\n const orderInfomation = orderInfomationInput && getOrderInformation(orderInfomationInput);\n\n viewProps = {\n ...viewProps,\n salesOrder: this.order,\n orderInfomation,\n salesLines,\n groups: salesLines\n ? getGroups({\n moduleName: this.moduleName,\n salesLines,\n resources: { orderItemLabel, orderItemsLabel },\n showTimeslot: showTimeslot,\n retailMultiplePickUpOptionEnabled\n })\n : undefined,\n orderSummary: this.orderSummaryProps ? getOrderConfirmationOrderSummary(this.orderSummaryProps) : undefined,\n payment: this.paymentMethodsProps ? getOrderConfirmationPaymentMethods(this.paymentMethodsProps) : undefined,\n help: contactNumber ? getOrderConfirmationHelp({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel, telemetryContent: this.telemetryContent }) : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleCheckoutOrderConfirmationHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n}\n\nexport default OrderConfirmation;\n","/*---------------------------------------------------------------------------------------------\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<HTMLElement>) => { 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 <CartLineItemComponent\r\n data={{\r\n cartLine: cartline,\r\n product: product\r\n }}\r\n currentQuantity={cartline.Quantity}\r\n maxQuantity={maxQuantity}\r\n isOutOfStock={props.isStockCheckEnabled ? (maxQuantity <= 0 ? true: false) : false}\r\n gridSettings={gridSettings}\r\n imageSettings={imageSettings}\r\n id={id}\r\n typeName={typeName}\r\n productUrl={getProductUrlSync(product, props.context.actionContext, undefined)}\r\n context={context}\r\n resources={resources}\r\n key={index}\r\n isQuantityEditable={true}\r\n quantityOnChange={updateItemClickHandler}\r\n primaryImageUrl={product.PrimaryImageUrl}\r\n displayMode='COMPACT'\r\n />),\r\n remove: (\r\n <Button\r\n className='msc-cart-line__remove-item'\r\n onClick={onRemoveClickHandler}\r\n title={removeButtonText}\r\n >\r\n {removeButtonText}\r\n </Button>\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 <div className={`msc-cart-line__bopis-method`}>\r\n <span className={`pick-up`}>{orgUnitName}</span>\r\n </div>\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<IMiniCartData> {\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<ISmweMinicartData> {\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<ICartProps<ICartData>>}\r\n */\r\n@observer\r\nclass MiniCart extends React.Component<ISmweMinicartProps<ISmweMinicartData>, IMiniCartState> {\r\n constructor(props: ISmweMinicartProps<ISmweMinicartData>) {\r\n super(props);\r\n this.state = { miniCartData: {} };\r\n }\r\n\r\n public async componentDidMount(): Promise<void> {\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 <CartIconComponent\r\n cartLabel={resources.cartLabel}\r\n cartQtyLabel={resources.cartQtyLabel}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{cart: 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 <Button disabled={hasErrors} className={'ms-cart-icon__btn-checkout'} href={checkoutURL} title={resources.checkoutButtonTitle}>{resources.checkoutButtonTitle}</Button>\r\n ) : null,\r\n checkoutAsGuestButton: (!isCartEmpty && !isAuthenticated) ?\r\n (\r\n <Button disabled={hasErrors} className={'ms-cart-icon__btn-guestcheckout'} href={guestCheckoutUrl} title={resources.guestCheckoutButtonTitle}>{resources.guestCheckoutButtonTitle}</Button>\r\n ) : null,\r\n goToCartButton:\r\n (\r\n <Button className={'ms-cart-icon__btn-gotocart'} href={cartUrl} title={goToCartButtonText}>{goToCartButtonText}</Button>\r\n ),\r\n flyoutTitle:\r\n (\r\n <span className={`ms-cart-icon__flyout-title`}>{flyoutTitle}</span>\r\n ),\r\n totalPrice:\r\n (\r\n <div className={`ms-cart-icon__subtotal`}>{priceString}</div>\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}","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { TenderLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\nimport { IPaymentMethods, IPaymentMethodsInput } from '../../../common';\n\nexport const getOrderConfirmationPaymentMethods = ({\n priceContext,\n tenderLines,\n tenderIdOperationIdMap,\n resource: { paymentMethodsTitle, creditCardEndingLabel, giftCardEndingLabel, amountCoveredLabel, loyaltyCardUsedLabel, cashUsedLabel }\n}: IPaymentMethodsInput): IPaymentMethods => {\n const getLastFourDigit = (digits = '') => digits.substr(-4);\n\n const getCard = (tenderLine: TenderLine, showAmount: boolean = false) => {\n const cardLastFourDigit = getLastFourDigit(tenderLine.MaskedCardNumber);\n // @ts-ignore\n const isValidCardNumber = cardLastFourDigit && !isNaN(cardLastFourDigit);\n const amount = (tenderLine.AuthorizedAmount || 0) > 0 ? tenderLine.AuthorizedAmount : tenderLine.Amount;\n const showAmountCovered = showAmount && amount && amount > 0 ? true : false;\n\n return (\n <div className='ms-order-confirmation__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-confirmation__payment-methods-card'>\n {`${tenderLine.CardTypeId} ${isValidCardNumber ? `${creditCardEndingLabel} ${cardLastFourDigit}` : ``}`}\n </p>\n {showAmountCovered && <p className='ms-order-confirmation__payment-methods-card-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-confirmation__payment-methods-card-amount'\n data={{ price: { CustomerContextualPrice: amount || 0 } }}\n />\n </p>}\n </div>\n );\n };\n\n const getGiftCertificate = (tenderLine: TenderLine) => (\n <div className='ms-order-confirmation__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-confirmation__payment-methods-gift-card-number'>\n {giftCardEndingLabel} {getLastFourDigit(tenderLine.GiftCardId)}\n </p>\n <p className='ms-order-confirmation__payment-methods-gift-card-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-confirmation__payment-methods-gift-card-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 } }}\n />\n </p>\n </div>\n );\n\n const getLoyalty = (tenderLine: TenderLine) => (\n <div className='ms-order-confirmation__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-confirmation__payment-methods-loyalty-number'>\n {loyaltyCardUsedLabel} {tenderLine.LoyaltyCardId}\n </p>\n <p className='ms-order-confirmation__payment-methods-loyalty-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-confirmation__payment-methods-loyalty-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 } }}\n />\n </p>\n </div>\n );\n\n const getCash = (tenderLine: TenderLine) => (\n <div className='ms-order-confirmation__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-confirmation__payment-methods-cash'>{cashUsedLabel}</p>\n <p className='ms-order-confirmation__payment-methods-cash-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-confirmation__payment-methods-cash-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 } }}\n />\n </p>\n </div>\n );\n\n return {\n paymentMethodsProps: { className: 'ms-order-confirmation__payment-methods' },\n title: <div className='ms-order-confirmation__payment-methods-title'>{paymentMethodsTitle}</div>,\n methods: tenderLines.reduce((lines: React.ReactNode[], tenderLine) => {\n if (!tenderLine.TenderTypeId) {\n return lines;\n }\n switch (tenderIdOperationIdMap[tenderLine.TenderTypeId]) {\n case 201:\n lines.push(getCard(tenderLine, tenderLines.length > 1));\n break;\n case 214:\n lines.push(getGiftCertificate(tenderLine));\n break;\n case 207:\n lines.push(getLoyalty(tenderLine));\n break;\n case 200:\n lines.push(getCash(tenderLine));\n break;\n default:\n // do nothing\n }\n return lines;\n }, [])\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport { Carousel } from '@msdyn365-commerce/components';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { ICarouselViewProps } from './carousel';\n\nconst CarouselView: React.FC<ICarouselViewProps> = props => (\n <Module {...props.carouselContainer} {...props.renderModuleAttributes(props)}>\n <Carousel\n className={classnames(props.closeAnimation)}\n activeIndex={props.activeIndex}\n next={props.next}\n previous={props.previous}\n pause={props.config.pauseOnHover ? 'hover' : false}\n ride={props.config.autoplay ? 'carousel' : undefined}\n autoplay={props.config.autoplay}\n interval={props.config.interval}\n transitionType={(props.config.transitionType) ? props.config.transitionType : undefined}\n items={props.slots && props.slots.content && props.slots.content.length ? props.slots.content : []}\n hideFlipper={props.config.hideFlipper}\n dismissEnabled={props.config.dismissEnabled}\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\n handleDismissCarousel={props.handleDismissCarousel}\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\n directionTextPrev={props.resources && props.resources.flipperPrevious}\n directionTextNext={props.resources && props.resources.flipperNext}\n handleOnExited={props.handleOnExited}\n handleOnExiting={props.handleOnExiting}\n telemetryContent={props.telemetryContent}\n />\n </Module>\n);\n\nexport default CarouselView;\n","import OrderHistory from './order-history';\nimport OrderHistoryView from './order-history.view';\n\nexport * from './order-history';\nexport * from './order-history.view';\nexport * from './order-history.data';\nexport { IOrderHistoryConfig, IOrderHistoryResources, IOrderHistoryProps } from './order-history.props.autogenerated';\nexport * from './actions/get-order-shipment-history';\nexport * from './components/get-sales-order';\n\nexport {\n OrderHistory,\n OrderHistoryView\n};","import { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '@msdyn365-commerce-modules/media-gallery';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n return (\r\n <Node {...ThumbnailItemContainerProps}>\r\n {Picture}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\r\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\r\n\r\n return (\r\n <Node {...ThumbnailsContainerProps}>\r\n <Node {...SingleSlideCarouselComponentProps}>\r\n {items && items.map(_renderThumbnailItem)}\r\n </Node>\r\n </Node>\r\n );\r\n};\r\n\r\nconst MediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\r\n const {CarouselProps, Thumbnails, MediaGallery} = props;\r\n\r\n return (\r\n <Module {...MediaGallery}>\r\n <Node {...CarouselProps} />\r\n {_renderThumbnails(Thumbnails)}\r\n {props.slots && props.slots.productLink && props.slots.productLink.length > 0 ? props.slots.productLink : ''}\r\n </Module>\r\n );\r\n};\r\nexport default MediaGalleryView;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, FeatureState, LoyaltyRewardPoint, ProductDeliveryOptions,SalesLine, SalesOrder,SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { computed } from 'mobx';\nimport * as React from 'react';\nimport { IGetOrderSummaryInput, IHelp, IOrderSummary, IPaymentMethods, IPaymentMethodsInput } from '../../common';\nimport { getGroups, IGroups } from '../../common/get-groups';\nimport { getOrderInfomationInput, getOrderInformation, IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { getSalesLines, getSalesLinesInput } from '../../common/get-sales-lines';\nimport LabelComponent from '../../common/label';\nimport { getTenderIdOperationIdMap, IPriceContext } from '../../common/utilities';\nimport { IOrderDetailsData, IOrderDetailsProps } from './../..';\nimport { getOrderDetailsHelp } from './components/get-help';\nimport { getOrderDetailsOrderSummary } from './components/get-order-summary';\nimport { getOrderDetailsPaymentMethods } from './components/get-payment-methods';\nimport { addressOptions } from './order-details.props.autogenerated';\n\nexport * from '../../common/get-groups';\nexport * from '../../common/get-order-information';\nexport * from '../../common/get-sales-line';\nexport * from '../../common/get-sales-lines';\nexport * from '../../common/utilities';\nexport * from './components/get-help';\nexport * from './components/get-order-summary';\nexport * from './components/get-payment-methods';\n\nexport interface IOrderDetailsViewProps extends IOrderDetailsProps<IOrderDetailsData> {\n moduleProps: IModuleProps;\n salesOrder?: SalesOrder;\n footerProps?: INodeProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n heading: React.ReactNode;\n backToShoppingLink?: React.ReactNode;\n orderInfomation?: IOrderInformation;\n salesLines?: ISalesLine[];\n groups?: IGroups;\n orderSummary?: IOrderSummary;\n payment?: IPaymentMethods;\n help?: IHelp;\n}\n\n/**\n *\n * OrderDetails component\n * @extends {React.PureComponent<IOrderDetailsProps<IOrderDetailsData>>}\n */\nclass OrderDetails extends React.PureComponent<IOrderDetailsProps<IOrderDetailsData>> {\n private moduleName: string = 'ms-order-details';\n private telemetryContent: ITelemetryContent;\n\n @computed get isCurrentChannel(): boolean {\n if (!this.order) {\n return false;\n }\n return this.order.ChannelId === get(this.props, 'context.request.apiSettings.channelId');\n }\n\n @computed get isDataReady(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'SUCCESS';\n }\n\n @computed get hasError(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'FAILED';\n }\n\n @computed get order(): SalesOrder | undefined {\n return get(this.props, 'data.orderHydration.result.salesOrder');\n }\n\n @computed get products(): SimpleProduct[] {\n return get(this.props, 'data.orderHydration.result.products') || [];\n }\n\n @computed get deliveryOptions(): ProductDeliveryOptions[] {\n return get(this.props, 'data.orderHydration.result.deliveryOptions') || [];\n }\n\n @computed get priceContext(): IPriceContext {\n const {\n id,\n typeName,\n context,\n telemetry,\n resources: { freePriceText }\n } = this.props;\n return {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n }\n\n @computed get earnedPoints(): number {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n if (loyaltyCard && loyaltyCard.RewardPoints && this.order) {\n const pointPrograms = loyaltyCard.RewardPoints.map((point:LoyaltyRewardPoint) => point.RewardPointId);\n const rewardLines = this.order.LoyaltyRewardPointLines || [];\n let total = 0;\n rewardLines.forEach(line => {\n if ((line.RewardPointAmountQuantity || 0) > 0 && pointPrograms.indexOf(line.RewardPointId) > -1) {\n total += line.RewardPointAmountQuantity!;\n }\n });\n return total;\n }\n return 0;\n }\n\n @computed get orderSummaryProps(): IGetOrderSummaryInput | undefined {\n if (!this.order) {\n return;\n }\n const { request } = this.props.context;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find((item:FeatureState) => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\n const orderDetailsLines = this.order?.SalesLines;\n const canShip = orderDetailsLines?.some(orderDetailsLine => (orderDetailsLine.DeliveryMode && orderDetailsLine.DeliveryMode !== '')\n ? (orderDetailsLine.DeliveryMode !== this.getDeliveryMode(orderDetailsLine, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig?.result, pickupDeliveryModeCode) && orderDetailsLine.DeliveryMode !== emailDeliveryModeCode)\n : orderDetailsLine);\n\n const {\n resources: { orderSummaryHeading, orderSummaryItemsTotalLabel, orderSummaryShippingFeeLabel, orderSummaryTaxLabel, orderSummaryGrandTotalLabel, pointsEarnedLabel }\n } = this.props;\n return {\n order: this.order,\n earnedPoints: this.earnedPoints,\n priceContext: this.priceContext,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n pointsEarnedLabel,\n orderSummaryGrandTotalLabel\n },\n canShip: canShip\n };\n }\n\n @computed get paymentMethodsProps(): IPaymentMethodsInput | undefined {\n const tenderTypes = this.props.data.tenderTypes.result;\n if (!this.order || !this.order.TenderLines || !tenderTypes) {\n return;\n }\n\n const locale = get(this.props, 'context.request.locale') || 'en-US';\n\n const {\n resources: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n } = this.props;\n\n return {\n priceContext: this.priceContext,\n tenderLines: this.order.TenderLines,\n tenderIdOperationIdMap: getTenderIdOperationIdMap(tenderTypes),\n locale,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n };\n }\n\n constructor(props: IOrderDetailsProps<IOrderDetailsData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public render(): JSX.Element {\n const {\n resources: {\n noSalesOrderDetailsText,\n genericErrorMessage,\n needHelpLabel,\n helpLineNumberLabel,\n loadingLabel,\n backToShopping,\n orderItemLabel,\n orderItemsLabel,\n helpLineContactAriaLabel,\n },\n config: { heading, contactNumber, showChannelInfo, showTimeslot }\n } = this.props;\n\n const showAddress = this.props.config.addressOptions !== undefined && this.props.config.addressOptions === addressOptions.showAddressWithSingleLine || this.props.config.addressOptions === addressOptions.showAddressWithMultiplelines;\n const showFullAddress = this.props.config.addressOptions !== undefined && this.props.config.addressOptions === addressOptions.showAddressWithMultiplelines;\n const moduleProps = { moduleProps: this.props, className: classname('ms-order-details', this.props.config.className) };\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const channelIdentities = this.props.data.channels.result && this.props.data.channels.result.channelIdentities;\n const orgUnitLocations = this.props.data.orgUnitLocations.result && this.props.data.orgUnitLocations.result.orgUnitLocations;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n let viewProps: IOrderDetailsViewProps = {\n ...this.props,\n moduleProps,\n heading: heading && (\n <Msdyn365.Text\n {...heading}\n className='ms-order-details__heading'\n text={heading.text}\n tag={heading.tag || 'h2'}\n editProps={{ onEdit: this.handleOrderDetailsHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n backToShoppingLink: backToShoppingUrl && (\n <Button className='ms-order-details__btn-keep-shopping' href={backToShoppingUrl}>\n {backToShopping}\n </Button>\n ),\n footerProps: { className: 'ms-order-details__footer' }\n };\n\n if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: <LabelComponent className='ms-order-details__alert' label={genericErrorMessage} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.isDataReady) {\n viewProps = {\n ...viewProps,\n loading: <LabelComponent className='ms-order-details__loading' label={loadingLabel} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.order) {\n viewProps = {\n ...viewProps,\n alert: <LabelComponent className='ms-order-details__alert' label={noSalesOrderDetailsText} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const salesLInput = getSalesLinesInput(this.props, this.moduleName, this.order, this.products,\n this.priceContext, showFullAddress, showTimeslot, this.telemetryContent, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig?.result, this.deliveryOptions);\n const salesLines = salesLInput && getSalesLines(salesLInput);\n\n const orderInfomationInput = this.order && getOrderInfomationInput(this.props, this.moduleName, this.order, this.priceContext, channelIdentities, orgUnitLocations, showChannelInfo);\n const orderInfomation = orderInfomationInput && getOrderInformation(orderInfomationInput);\n\n viewProps = {\n ...viewProps,\n salesOrder: this.order,\n orderInfomation,\n salesLines,\n groups: salesLines\n ? getGroups({\n moduleName: this.moduleName,\n salesLines,\n resources: { orderItemLabel, orderItemsLabel },\n showAddress: showAddress,\n showTimeslot: showTimeslot,\n retailMultiplePickUpOptionEnabled: retailMultiplePickUpOptionEnabled\n })\n : undefined,\n orderSummary: this.orderSummaryProps ? getOrderDetailsOrderSummary(this.orderSummaryProps) : undefined,\n payment: this.paymentMethodsProps ? getOrderDetailsPaymentMethods(this.paymentMethodsProps) : undefined,\n help: contactNumber ? getOrderDetailsHelp({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel, telemetryContent: this.telemetryContent }) : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleOrderDetailsHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private getDeliveryMode = (salesLine: SalesLine, featureSate: boolean = false, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, pickupDeliveryMode?: string) => {\n if(!featureSate) {\n return pickupDeliveryMode;\n } else {\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === salesLine.DeliveryMode);\n }\n };\n}\n\nexport default OrderDetails;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, ChannelDeliveryOptionConfiguration, OrgUnitLocation, ProductAvailableQuantity, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\n\nexport interface IFlyoutCartLineItemsProps {\n cartlines: CartLine[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n /** GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n /** ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName:string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n maxCartlineQuantity: number;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n outOfStockThreshold: number;\n isStockCheckEnabled: boolean;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n cartline: React.ReactNode;\n remove: React.ReactNode;\n storeLocation: React.ReactNode;\n hasError: boolean;\n\n data: {\n product: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getProduct = (productId: number | undefined, products: SimpleProduct[]): SimpleProduct | undefined => {\n if (productId !== undefined && products) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n return undefined;\n};\n\nconst _getCartItemMaxQuantity = (outOfStockThreshold: number, maxCartlineQuantity: number, isStockCheckEnabled: boolean, productAvailability?: ProductAvailableQuantity) => {\n if(isStockCheckEnabled) {\n if(!productAvailability || !productAvailability.AvailableQuantity || productAvailability.AvailableQuantity <= 0 || productAvailability.AvailableQuantity <= outOfStockThreshold) {\n return 0;\n }\n return productAvailability.AvailableQuantity - outOfStockThreshold;\n }\n\n return maxCartlineQuantity;\n};\n\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct,\n props:IFlyoutCartLineItemsProps,\n index:number,\n foundProductAvailability?:ProductAvailableQuantity,\n foundProductDeliveryOptions?:ProductDeliveryOptions,\n ):IFlyoutCartLineItemViewProps => {\n const {\n imageSettings,\n gridSettings,\n id,\n typeName,\n context,\n resources,\n removeButtonText,\n removeItemClickHandler } = props;\n\n const maxQuantity = _getCartItemMaxQuantity(props.outOfStockThreshold, props.maxCartlineQuantity, props.isStockCheckEnabled, foundProductAvailability);\n\n // check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n const isServiceItem = product.ItemTypeValue === PRODUCTASSERVICE;\n\n const onRemoveClickHandler = (event: React.MouseEvent<HTMLElement>) => { removeItemClickHandler(cartline); };\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return {\n data: {\n product: product,\n cartline: cartline\n },\n hasError: (!isServiceItem && props.isStockCheckEnabled) ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n <CartLineItemComponent\n data={{\n cartLine: cartline,\n product: product\n }}\n currentQuantity = {cartline.Quantity!}\n maxQuantity = {maxQuantity}\n isOutOfStock = {(!isServiceItem && props.isStockCheckEnabled) ? (maxQuantity <= 0 ? true: false) : false}\n gridSettings={gridSettings}\n imageSettings={imageSettings}\n id={id}\n typeName={typeName}\n productUrl={getProductUrlSync(product, props.context.actionContext, undefined)}\n context={context}\n resources={resources}\n key={index}\n isQuantityEditable={false}\n primaryImageUrl={product.PrimaryImageUrl}\n displayMode='COMPACT'\n telemetryContent={props.telemetryContent!}\n channelDeliveryOptionConfig = {props.channelDeliveryOptionConfig}\n />),\n remove: (\n <Button\n className='msc-cart-line__remove-item'\n onClick={onRemoveClickHandler}\n title={removeButtonText}\n {...removeCartItemAttribute}\n >\n {removeButtonText}\n </Button>\n ),\n storeLocation: (\n _renderStoreLocation(cartline, props)\n )\n };\n};\n\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\n if(cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n if(orgUnitName) {\n return (\n <div className={`msc-cart-line__bopis-method`}>\n <span className={`pick-up`}>{orgUnitName}</span>\n </div>\n );\n }\n }\n\n return null;\n};\n\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if(!orgUnitLocations || !fulfillmentStoreId || !(orgUnitLocations.length > 0)) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if(foundLocation) {\n return foundLocation.OrgUnitName;\n } else {\n return fulfillmentStoreId;\n }\n};\n\nconst _assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: IFlyoutCartLineItemsProps):IFlyoutCartLineItemViewProps[] | null => {\n const reactNodes:IFlyoutCartLineItemViewProps[] = [];\n\n if(!products || products.length === 0) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n\n cartlines.map((cartline, index) => {\n const product = _getProduct(cartline.ProductId, products);\n let foundProductAvailability;\n if(props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n }\n let foundProductDeliveryOption;\n if(props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n if(product) {\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability?.ProductAvailableQuantity, foundProductDeliveryOption));\n }\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component\n */\n\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\n const { products, cartlines } = props;\n return (\n _assembleCartlines(cartlines, products, props)\n );\n};","import { ActiveCartProductsInput, getActiveCartProductsAction, getAvailabilitiesForCartLineItems, getDeliveryOptionsForCartLineItems, IProductInventoryInformation, ProductAvailabilitiesForCartLineItems, ProductDeliveryOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n products?: SimpleProduct[];\n productAvailabilites?: IProductInventoryInformation[];\n deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise<IMiniCartData> {\n const miniCartData: IMiniCartData = {};\n\n const cart = cartState.cart;\n\n // If there are cart lines, make call to get products\n // If there are invocie linese, then there is no products, so don't make call to get products\n if (cart && cart.CartLines && cart.CartLines.length && !cartState.hasInvoiceLine) {\n await getActiveCartProductsAction(\n new ActiveCartProductsInput(),\n ctx\n )\n .then(products => {\n if (products) {\n miniCartData.products = products;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getAvailabilitiesForCartLineItems(\n new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings),\n ctx\n )\n .then(availableQuantity => {\n if (availableQuantity) {\n miniCartData.productAvailabilites = availableQuantity;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getDeliveryOptionsForCartLineItems(\n new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings),\n ctx\n )\n .then(deliveryOptions => {\n if (deliveryOptions) {\n miniCartData.deliveryOptions = deliveryOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n }\n\n return miniCartData;\n}","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, INodeProps, ITelemetryContent, TelemetryConstant, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport { CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport { CartLine, ChannelDeliveryOptionConfiguration ,OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { ICartIconData } from './cart-icon.data';\nimport { ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n miniCartData: IMiniCartData;\n orgUnitLocations?: OrgUnitLocation[];\n}\n\nexport interface ICartIconViewProps extends ICartIconProps<ICartIconData> {\n className: string;\n cartIcon: React.ReactNode;\n\n FlyoutContainer?: INodeProps;\n\n CartlinesWrapper: INodeProps;\n miniCartWrapper: INodeProps;\n miniCartItemWrapper: INodeProps;\n cartlines?: IFlyoutCartLineItemViewProps[];\n flyoutTitle: React.ReactNode;\n totalPrice: React.ReactNode;\n\n checkoutAsGuestButton?: React.ReactNode;\n checkoutAsSignInUserButton?: React.ReactNode;\n goToCartButton?: React.ReactNode;\n waitingComponent?: React.ReactNode;\n\n isCartLoading: boolean;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass CartIcon extends React.Component<ICartIconProps<ICartIconData>, IMiniCartState> {\n private telemetryContent: ITelemetryContent;\n private checkoutBySignInAttributes: IDictionary<string> | undefined;\n private checkoutByGuestAttributes: IDictionary<string> | undefined;\n private viewShoppingBagAttributes: IDictionary<string> | undefined;\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n constructor(props: ICartIconProps<ICartIconData>) {\n super(props);\n this.state = { miniCartData: {} };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n }\n\n public async componentDidMount(): Promise<void> {\n const context = this.props.context.actionContext;\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\n });\n }\n );\n\n this.setState({\n orgUnitLocations: this.props.data.orgUnitLocations.result\n });\n }\n\n // tslint:disable-next-line:cyclomatic-complexity\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n config: {\n enableHoverCart\n },\n context: {\n request: {\n user: {\n isAuthenticated,\n signInUrl\n }\n }\n },\n context,\n resources\n } = this.props;\n\n const cart = this.props.data.cart && this.props.data.cart.result || undefined;\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const hasInvoiceLine = cart && cart.hasInvoiceLine;\n const cartLines = this._getCartLines();\n const hasErrors = cartLines ? cartLines.some(cartline => cartline.hasError) : false;\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n const cartSize = cartLines ? cartLines.length : 0;\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', cartSize.toString());\n const flyoutTitle = resources.flyoutTitle;\n // If there are invoice lines, don't update mini cart price\n const price = cart && !cart.hasInvoiceLine && cart.cart.TotalAmount || undefined;\n const priceString = price ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price)) : '';\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 cartIcon: (\n <CartIconComponent\n cartLabel={resources.cartLabel}\n cartQtyLabel={resources.cartQtyLabel}\n context={context}\n id={id}\n typeName={typeName}\n data={{cart: cart}}\n telemetryContent={this.telemetryContent}\n />\n ),\n cartlines: cartLines,\n FlyoutContainer: includeFlyout ? {\n tag: UncontrolledTooltip,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__flyout-container',\n trigger: 'hover focus',\n displayMode: 'FLYOUT',\n target: id\n } : undefined,\n CartlinesWrapper: {\n className: 'ms-cart-icon__cart-lines'\n },\n miniCartWrapper: {\n className: classnames('ms-cart-icon'),\n id: this.props.id\n },\n miniCartItemWrapper: {\n className: classnames('msc-cart-lines-item')\n },\n // If there are invoice lines, don't update mini cart checkout button\n checkoutAsSignInUserButton: (!isCartEmpty && !hasInvoiceLine) ?\n (\n <Button disabled={hasErrors} className={'ms-cart-icon__btn-checkout'} href={checkoutURL} title={resources.checkoutButtonTitle}{...this.checkoutBySignInAttributes}>{resources.checkoutButtonTitle}</Button>\n ) : null,\n checkoutAsGuestButton: (!isCartEmpty && !isAuthenticated) ?\n (\n <Button disabled={hasErrors} className={'ms-cart-icon__btn-guestcheckout'} href={guestCheckoutUrl} title={resources.guestCheckoutButtonTitle}{...this.checkoutByGuestAttributes}>{resources.guestCheckoutButtonTitle}</Button>\n ) : null,\n goToCartButton:\n (\n <Button className={'ms-cart-icon__btn-gotocart'} href={cartUrl} title={goToCartButtonText} {...this.viewShoppingBagAttributes}>{goToCartButtonText}</Button>\n ),\n flyoutTitle:\n (\n <span className={`ms-cart-icon__flyout-title`}>{flyoutTitle}</span>\n ),\n totalPrice:\n (\n <div className={`ms-cart-icon__subtotal`}>{priceString}</div>\n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${signInUrl.indexOf('?') === -1 ? '?' : '&'}ru=${returnURL}`;\n }\n\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n const {\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config: config,\n telemetry,\n resources\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const cart = this.props.data.cart && this.props.data.cart.result;\n\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\n (\n FlyoutCartLineItems({\n cartlines: cart.cart.CartLines,\n products: this.state.miniCartData.products,\n productAvailabilites: this.state.miniCartData.productAvailabilites,\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n imageSettings: imageSettings,\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: '', // not used\n discountStringText: '', // not used\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: ''\n },\n telemetry: telemetry,\n removeButtonText: resources.removeCartButtonText,\n outOfStockText: '', // not used\n outOfRangeOneText: '', // not used\n outOfRangeFormatText: '', // not used\n cartState: cart,\n orgUnitLocations: this.state.orgUnitLocations,\n removeItemClickHandler: this._removeItemFromCartHandler,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n telemetryContent: this.telemetryContent,\n channelDeliveryOptionConfig : this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined\n })\n ) : null;\n }\n\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return imageSettings || {\n viewports: {\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n }\n\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input)\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n }\n}\n\nexport default CartIcon;\n","import { buildCacheKey, getOrganizationWideOrderHistory, GetOrganizationWideOrderHistoryInput, getSimpleProducts, ProductInput } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings\n} from '@msdyn365-commerce/core';\nimport { IQueryResultSettings } from '@msdyn365-commerce/retail-proxy';\nimport { getOrderShipmentsHistoryAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CustomersDataActions.g';\nimport { OrderShipments, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { OrderHistoryFilterState } from '../components/order-history-filter';\n\nexport interface IPaging {\n top: number;\n skip: number;\n}\n\nexport interface IOrderHistory {\n salesOrders: OrderShipments[];\n products: SimpleProduct[];\n}\n\n/**\n * Calls the Retail API and returns the products\n */\nconst getOrderShipmentHistory = (paging: IPaging) => async (ctx: IActionContext): Promise<OrderShipments[]> => {\n return getOrderShipmentsHistoryAsync(\n {\n callerContext: ctx,\n queryResultSettings: {\n Paging: {\n Top: paging.top,\n Skip: paging.skip\n }\n }\n },\n ''\n );\n};\n\n/**\n * Calls the Retail API and returns the products\n */\nconst getOrganizationWideOrderShipmentHistory = (paging: IPaging) => async (context: IActionContext): Promise<OrderShipments[]> => {\n const queryResultSetting: IQueryResultSettings = {\n Paging: {\n Top: paging.top,\n Skip: paging.skip\n }\n };\n\n return getOrganizationWideOrderHistory(new GetOrganizationWideOrderHistoryInput(queryResultSetting), context);\n};\n\n/**\n * Calls the Retail API and returns the products\n */\nconst getProducts = (productIds: number[] = [], channelId?: number) => (ctx: IActionContext): Promise<SimpleProduct[]> => {\n const productInputs = productIds.map(productId => new ProductInput(productId, ctx.requestContext.apiSettings, channelId));\n return getSimpleProducts(productInputs, ctx);\n};\n\n/**\n * Action input\n */\nexport class GetSalesOrderHistoryWithHydrationsInput implements IActionInput {\n public paging: IPaging;\n public filterState: OrderHistoryFilterState;\n private apiSettings: ICommerceApiSettings;\n\n constructor(paging: IPaging, apiSettings: ICommerceApiSettings, filterState?: OrderHistoryFilterState) {\n this.apiSettings = apiSettings;\n this.paging = paging;\n this.filterState = filterState || OrderHistoryFilterState.CurrentUser;\n }\n\n public getCacheKey = () => buildCacheKey(`OrderHistory`, this.apiSettings);\n public getCacheObjectType = () => `OrderHistory`;\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * Splits product ids from the given orders into lists by their channel id.\n * @param {OrderShipments[]} salesOrders Orders with the products.\n * @param {number} currentChannelId Channel id to use by default if no channel id is provided for a product.\n * @returns {{ [x: number]: number[] }} A dictionary where the key is a channel id,\n * and the value is a list of product ids in which all items correspond to the key channel id.\n * @remark The list of product ids is always non-empty.\n */\nconst splitProductsByChannelId = (\n salesOrders: OrderShipments[],\n currentChannelId: number): { [x: number]: number[] } => {\n\n const productIdsByChannel: { [x: number]: number[] } = {};\n\n salesOrders.forEach(salesOrder => salesOrder?.SalesLines?.forEach(line => {\n const orderProductId = line.ProductId || 0;\n const orderChannelId = salesOrder.ChannelId || currentChannelId;\n if (!productIdsByChannel[orderChannelId]) {\n productIdsByChannel[orderChannelId] = [];\n }\n productIdsByChannel[orderChannelId].push(orderProductId);\n }));\n\n return productIdsByChannel;\n};\n\n/**\n * Get sales order with hydrations action\n */\nexport async function getSalesOrderHistoryWithHydrationsAction(\n input: GetSalesOrderHistoryWithHydrationsInput,\n context: IActionContext\n): Promise<IOrderHistory> {\n if (!context) {\n throw new Error('getSalesOrderWithHydrationsAction - Action context cannot be null/undefined');\n }\n const channelId = context.requestContext.apiSettings.channelId;\n let salesOrders: OrderShipments[] = [];\n\n switch (input.filterState) {\n case OrderHistoryFilterState.CurrentUser:\n salesOrders = await getOrderShipmentHistory(input.paging)(context);\n break;\n case OrderHistoryFilterState.OrganizationWide:\n salesOrders = await getOrganizationWideOrderShipmentHistory(input.paging)(context);\n break;\n default:\n throw new Error('getSalesOrderWithHydrationsAction - Invalid OrderHistoryFilterState passed');\n }\n\n if (!salesOrders || !salesOrders.length) {\n return {\n salesOrders: [],\n products: []\n };\n }\n\n // Splits the data by channel ids so that the products from different channels can be processed separately.\n const productIdsByChannelId = splitProductsByChannelId(salesOrders, channelId);\n\n // Promise that retrieves information about the products for each channel id.\n // Note, the list of product ids should not be empty\n // as it will generate an empty request which will force the promise to fail.\n const getProductsPromise = Object.entries(productIdsByChannelId).map(\n ([entryChannelId, entryProductIdsList]) => {\n const getProductsCall = getProducts(entryProductIdsList, Number(entryChannelId));\n return getProductsCall(context);\n });\n\n return Promise.all(getProductsPromise).then(\n (productList): IOrderHistory => {\n const products = productList.reduce((memo, list) => {\n return [...memo, ...list];\n }, []); // tslint:disable-line:align\n\n return {\n salesOrders,\n products\n };\n }).catch(error => {\n context.telemetry.exception(error);\n context.telemetry.debug('Failed to get products');\n throw error;\n });\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/order-management/order-history/get-order-shipment-history',\n action: <IAction<IOrderHistory>>getSalesOrderHistoryWithHydrationsAction\n});","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IDictionary } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ICartlinesViewProps } from '../../../modules/smwe-cart/components/smwe-cart-line-items';\r\nimport { ICartViewProps } from '../../../modules/smwe-cart/smwe-cart';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean,\r\n itemsTitle: string,\r\n qtyTitle: string,\r\n unitPriceTitle: string,\r\n totalTitle: string\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus}</>;\r\n }\r\n if (cartLines) {\r\n return (\r\n <div>\r\n <div className='cart-lineitems-header'>\r\n <div className='header-items'>{itemsTitle}</div>\r\n <div className='header-qty'>{qtyTitle}</div>\r\n <div className='header-unitprice'>{unitPriceTitle}</div>\r\n <div className='header-total'>{totalTitle}</div>\r\n </div>\r\n\r\n <ul className='cart-lineitems-container'>\r\n {cartLines.map((cartLine, index) => {\r\n return (\r\n <li className='msc-cart-lines-item' key={index}>\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n <Node {...cartLine.pickUpInStore.ContainerProps}>\r\n {cartLine.pickUpInStore.defaultComponent}\r\n </Node>\r\n ) : null}\r\n {cartLine.addToWishlist}\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n );\r\n } else {\r\n return cartDataResult ? (\r\n <div className='msc-cart__empty-cart'>\r\n <p className='msc-cart-line'>{cartEmptyText}</p>\r\n {backToShoppingButton}\r\n </div>\r\n ) : (\r\n <>{waitingComponent}</>\r\n );\r\n }\r\n};\r\n\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n return (\r\n <Node {...OrderSummaryItems}>\r\n {orderSummaryLines.subtotal}\r\n {orderSummaryLines.shipping}\r\n {orderSummaryLines.tax}\r\n {orderSummaryLines.totalDiscounts\r\n ? orderSummaryLines.totalDiscounts\r\n : null}\r\n {orderSummaryLines.orderTotal}\r\n <p className='cart-order-summary-asterix'>{props.resources.conditionsText}</p>\r\n </Node>\r\n );\r\n};\r\n\r\n// Detect invalid items in the cart. Items are flagged externally via the Comment field\r\nconst _isInvalidCart = (cartLinesInvalid: IDictionary<boolean>): boolean => {\r\n\r\n for (const lineId of Object.keys(cartLinesInvalid)) {\r\n if (cartLinesInvalid[lineId]) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n//==================================================\r\n//==================================================\r\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => {\r\n const preventCheckout = _isInvalidCart(props.cartLineStatus);\r\n\r\n return (\r\n <div\r\n className={props.className}\r\n id={props.id}\r\n {...props.renderModuleAttributes(props)}\r\n >\r\n {props.title}\r\n <Node {...props.CartlinesWrapper}>\r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult,\r\n props.resources.itemsTitle,\r\n props.resources.qtyTitle,\r\n props.resources.unitPriceTitle,\r\n props.resources.totalTitle\r\n )}\r\n </Node>\r\n {props.orderSummaryHeading && (\r\n <Node {...props.OrderSummaryWrapper}>\r\n {props.orderSummaryHeading}\r\n {_renderOrderSummarylines(\r\n props.orderSummaryLineitems,\r\n props.OrderSummaryItems,\r\n props\r\n )}\r\n <Node className='checkout-btn-wrap'>\r\n {props.backToShoppingButton}\r\n {preventCheckout ? props.checkoutButtonDisabled : props.checkoutAsSignInUserButton}\r\n </Node>\r\n <div className='msc-promo-code'>\r\n {props.promoCode}\r\n </div>\r\n </Node>\r\n )}\r\n {props.storeSelector}\r\n </div>\r\n);};\r\n\r\nexport default CartView;","/*---------------------------------------------------------------------------------------------\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<HTMLInputElement>;\n inputPinRef?: React.RefObject<HTMLInputElement>;\n inputExpRef?: React.RefObject<HTMLInputElement>;\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<void>;\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<void> => {\n e.preventDefault();\n await onApplyGiftCard();\n };\n\n const onChangeNumber = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = (e.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardNumber(value);\n };\n\n const onChangePin = (e: React.ChangeEvent<HTMLInputElement>) => {\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<HTMLInputElement>) => {\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 <label id='ms-checkout-gift-card__label' className='ms-checkout-gift-card__input-label'>\n {giftCardFormLabel}\n </label>\n );\n\n const inputPinLabel = (\n <label id='ms-checkout-gift-card__input-pin-label' className='ms-checkout-gift-card__input-pin-label'>\n {giftCardPinLabel}\n </label>\n );\n\n const inputExpLabel = (\n <label id='ms-checkout-gift-card__input-exp-label' className='ms-checkout-gift-card__input-exp-label'>\n {giftCardExpLabel}\n </label>\n );\n\n const alertFieldLabel = (\n <label id='ms-checkout-gift-card__input-alert' className='ms-checkout-gift-card__input-alert-label'>\n {giftCardAlertLabel}\n </label>\n );\n\n const alert = (\n <Alert\n tag='span'\n id='ms-checkout-gift-card__error'\n className='ms-checkout-gift-card__input-error'\n role='alert'\n assertive={false}\n fade={false}\n includeAlertClass={false}\n isOpen={!!errorMessage}\n >\n {errorMessage}\n </Alert>\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 <input\n ref={inputRef}\n type='text'\n className='ms-checkout-gift-card__input-text form-control'\n aria-label={giftCardNumberLabel}\n onChange={onChangeNumber}\n value={giftCardNumber}\n aria-labelledby='ms-checkout-gift-card__label ms-checkout-gift-card__error'\n />\n );\n\n const inputPin = (\n <input\n ref={inputPinRef}\n type='text'\n className='ms-checkout-gift-card__input-pin-text form-contol'\n aria-label={giftCardPinLabel}\n placeholder={giftCardPinPlaceholderText}\n onChange={onChangePin}\n value={giftCardPin}\n aria-labelledby='ms-checkout-gift-card__label ms-checkout-gift-card__error'\n />\n );\n\n const inputExp = (\n <input\n ref={inputExpRef}\n type='text'\n className='ms-checkout-gift-card__input-exp-text form-contol'\n aria-label={giftCardExpLabel}\n placeholder={giftCardExpPlaceholderText}\n onChange={onChangeExp}\n value={giftCardExp}\n aria-labelledby='ms-checkout-gift-card__label ms-checkout-gift-card__error'\n />\n );\n\n const applyButton = (\n <Button\n className='ms-checkout-gift-card__btn-apply'\n onClick={onApply}\n aria-label={applyGiftCardButton}\n disabled={!giftCardNumber}\n >\n {applyGiftCardButton}\n </Button>\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<IGiftCardItemProps>}\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 <span className='ms-checkout-gift-card__item-text'>\n {enteredGiftCardLabel} {giftCardLast4Digit} ({giftCardAvailableBalanceLabel}{' '}\n <span className='ms-checkout-gift-card__balance'>{balance}</span>)\n </span>\n );\n\n const removeButton = canRemove && (\n <Button className='ms-checkout-gift-card__btn-remove' onClick={onRemove}>\n {removeGiftCardButton}\n </Button>\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<IGiftCardTitleProps> = ({ title }) => <label className='ms-checkout-gift-card__title'>{title}</label>;\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<ICheckoutGiftCardData>, 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<ICheckoutGiftCardProps<ICheckoutGiftCardData>, ICheckoutGiftCardState>}\n */\n@observer\nexport class CheckoutGiftCard extends React.Component<ICheckoutGiftCardModuleProps, ICheckoutGiftCardState> {\n public state: ICheckoutGiftCardState = {\n isFetchingGiftCard: false,\n errorMessage: '',\n giftCardNumber: '',\n giftCardPin: '',\n giftCardExp: ''\n };\n\n private inputRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private inputPinRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private inputExpRef: React.RefObject<HTMLInputElement> = 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: <TitleCompoent title={resources.giftCardFormLabel} />,\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<void> => {\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<void> => {\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<GiftCard | undefined> => {\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<CardTypeInfo[] | undefined> => {\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<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\r\n <Node {...PickUpAtStore}>\r\n {label}\r\n {location}\r\n </Node>\r\n);\r\n\r\nexport const LineItemComponent: React.FC<ILineItem> = ({ LineItem, item, pickUpAtStore }) => (\r\n <Node {...LineItem}>\r\n {item}\r\n {pickUpAtStore && <PickUpAtStoreComponent {...pickUpAtStore} />}\r\n </Node>\r\n);\r\n\r\nexport const LineItemGroupComponent: React.FC<ILineItemDeliveryGroup> = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\r\n <Node {...LineItemDeliveryGroup}>\r\n {heading}\r\n <Node {...LineItemList}>\r\n {lineItems.map(lineItem => (\r\n <LineItemComponent key={lineItem.LineId} {...lineItem} />\r\n ))}\r\n </Node>\r\n </Node>\r\n);\r\n\r\nexport const LineItemsComponent: React.FC<ILineItems> = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForSubscription, subscriptionHeader }) => (\r\n <Node {...LineItems}>\r\n <Node {...Header}>\r\n {heading}\r\n {editLink}\r\n </Node>\r\n {itemsForPickup && <LineItemGroupComponent {...itemsForPickup} />}\r\n {itemsForShip && <LineItemGroupComponent {...itemsForShip} />}\r\n {itemsForSubscription && itemsForSubscription.length > 0 &&\r\n <Node className='ms-checkout__line-items-list__subscriptions'>\r\n <div className='ms-checkout__line-items-list__subscriptions-title'>{subscriptionHeader}</div>\r\n {itemsForSubscription.map(lineItem => (\r\n <LineItemComponent key={lineItem.LineId} {...lineItem} />\r\n ))}\r\n </Node>\r\n }\r\n </Node>\r\n);\r\n\r\nconst OrderSummaryComponent: React.FC<IOrderSummary> = ({ heading, lines }) => (\r\n <div className='msc-order-summary-wrapper'>\r\n {heading}\r\n <div className='msc-order-summary__items'>\r\n {lines && (\r\n <>\r\n {lines.subtotal}\r\n {lines.shipping}\r\n {lines.tax}\r\n {lines.totalDiscounts}\r\n {lines.loyalty}\r\n {lines.giftCard}\r\n {lines.orderTotal}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n);\r\n\r\nconst CheckoutView: React.FC<ICheckoutViewProps> = props => {\r\n const {\r\n canShow,\r\n checkoutProps,\r\n headerProps,\r\n hasSalesOrder,\r\n bodyProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n sideControlFirstProps,\r\n sideControlSecondProps,\r\n orderConfirmation,\r\n loading,\r\n alert,\r\n title,\r\n guidedForm,\r\n orderSummary,\r\n lineItems,\r\n placeOrderButton,\r\n keepShoppingButton\r\n } = props;\r\n\r\n return (\r\n <Module {...checkoutProps}>\r\n {!hasSalesOrder && <Node {...headerProps}>{title}</Node> }\r\n {!hasSalesOrder &&\r\n <Node {...bodyProps}>\r\n {loading}\r\n {alert}\r\n {canShow && (\r\n <>\r\n <Node {...mainProps}>\r\n {guidedForm}\r\n <Node {...mainControlProps}>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n </Node>\r\n <Node {...sideProps}>\r\n {orderSummary && <OrderSummaryComponent {...orderSummary} />}\r\n <Node {...sideControlFirstProps}>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n {lineItems && <LineItemsComponent {...lineItems} />}\r\n <Node {...sideControlSecondProps}>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n </Node>\r\n </>\r\n )}\r\n </Node>\r\n }\r\n {hasSalesOrder && orderConfirmation}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default CheckoutView;\r\n","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { ISearchResultModalViewProps } from './components';\nimport { ICategoryHierarchyViewProps, IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, FeatureSearchContainer, similarLookProduct } = props;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions)}\n <Node {...FeatureSearchContainer}>\n {similarLookProduct}\n </Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>\n {similarLookProduct}\n </Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n\n};\n\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps): JSX.Element => {\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown), modalProps.modalFooter);\n};\n\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>\n {submenu}\n </React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown) {\n return (\n <Node {...SortingContainer}>\n {sortByDropDown}\n </Node>\n );\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>\n {title.titleCount}\n </h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;","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 { INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { SalesOrder } from '@msdyn365-commerce/retail-proxy';\nimport { TenderLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IPriceContext } from './utilities';\n\nexport * from './address';\nexport * from './get-groups';\nexport * from './get-order-information';\nexport * from './get-sales-line';\nexport * from './get-sales-lines';\nexport * from './label';\nexport * from './utilities';\n\nexport interface IGetHelpInput {\n needHelpLabel: string;\n helpLineNumberLabel: string;\n contactNumber: string;\n helpLineContactAriaLabel: string;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface IHelp {\n helpProps: INodeProps;\n needHelpLabel: React.ReactNode;\n helpLineNumberLabel: React.ReactNode;\n contactNumber: React.ReactNode;\n}\n\nexport interface IGetOrderSummaryInput {\n order: SalesOrder;\n earnedPoints: number;\n priceContext: IPriceContext;\n resource: {\n orderSummaryItemsTotalLabel: string;\n orderSummaryShippingFeeLabel: string;\n orderSummaryTaxLabel: string;\n orderSummaryGrandTotalLabel: string;\n orderSummaryHeading: string;\n pointsEarnedLabel: string;\n };\n canShip?: boolean;\n}\n\nexport interface IOrderSummary {\n orderSummaryProps: INodeProps;\n heading: React.ReactNode;\n subtotal: React.ReactNode;\n shipping: React.ReactNode;\n tax: React.ReactNode;\n totalAmount: React.ReactNode;\n earnedPoints?: React.ReactNode;\n}\n\nexport interface IPaymentMethodsInput {\n priceContext: IPriceContext;\n tenderLines: TenderLine[];\n tenderIdOperationIdMap: object;\n locale: string;\n resource: {\n paymentMethodsTitle: string;\n creditCardEndingLabel: string;\n giftCardEndingLabel: string;\n amountCoveredLabel: string;\n loyaltyCardUsedLabel: string;\n cashUsedLabel: string;\n customerAccountUsedLabel: string;\n };\n}\n\nexport interface IPaymentMethods {\n paymentMethodsProps: INodeProps;\n title: React.ReactNode;\n methods: React.ReactNode[];\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 { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC<IPromoBannerViewProps> = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n PromoBannerTextProps,\n PromoBannerLinksProps,\n CarouselProps,\n handleLinks,\n handleText\n } = props;\n\n const slides = bannerMessages && bannerMessages.map((message, index) => {\n return (\n <Node {...contentProps} key={index}>\n {message.text && <Node {...PromoBannerTextProps} text={message.text} onClick={handleText}/>}\n {message.links && message.links.length > 0 && <Node {...PromoBannerLinksProps} links={message.links} onClick={handleLinks} />}\n </Node>\n );\n });\n\n return (\n <Module {...promoBannerProps}>\n <Node {...CarouselProps} items={slides} />\n {closeButton}\n </Module>\n );\n};\nexport default PromoBannerView;\n","import Checkout from './checkout';\nimport CheckoutView from './checkout.view';\n\nexport * from './checkout';\nexport * from './checkout.view';\nexport * from './actions/get-products-in-active-checkout-cart';\nexport * from './components';\nexport * from './methods';\nexport * from './checkout.data';\nexport * from './checkout.props.autogenerated';\n\nexport {\n Checkout,\n CheckoutView\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { IActionContext, IGridSettings, IImageSettings } from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration , OrderShipments, ProductDeliveryOptions, SalesLine, SalesOrder, Shipment, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getSalesLine, ISalesLine, ISalesLineResources } from './get-sales-line';\nimport { IModuleComponentProps, IPriceContext } from './utilities';\n\nexport interface IGetSalesLinesInput {\n moduleName: string;\n moduleComponentProps: IModuleComponentProps;\n isCurrentChannel: boolean;\n\n salesLines: SalesLine[];\n products: SimpleProduct[];\n shipments?: Shipment[];\n priceContext: IPriceContext;\n resources: ISalesLineResources;\n actionContext: IActionContext;\n gridSettings: IGridSettings;\n imageSettings?: IImageSettings;\n imageOnly?: boolean;\n showCompleteAddress?: boolean;\n showTimeslot: boolean;\n telemetryContent?: ITelemetryContent;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n productDeliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const getSalesLines = ({\n moduleName,\n moduleComponentProps,\n salesLines,\n products,\n shipments,\n resources,\n isCurrentChannel,\n imageOnly,\n showCompleteAddress,\n showTimeslot,\n telemetryContent,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig,\n productDeliveryOptions\n}: IGetSalesLinesInput): ISalesLine[] => {\n return salesLines.map(salesLine => {\n const product = products.find(_product => _product.RecordId === salesLine.ProductId) || ({} as SimpleProduct);\n const shipment = shipments && shipments.find(_shipment => _shipment.ShipmentLines?.find(_shipmentLine => _shipmentLine.ItemId === product.ItemId));\n return getSalesLine({\n moduleName,\n moduleComponentProps,\n product,\n shipment,\n salesLine,\n isCurrentChannel,\n resources,\n imageOnly,\n showCompleteAddress,\n showTimeslot,\n telemetryContent,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig,\n productDeliveryOptions\n });\n });\n};\n\ninterface IProps extends IModuleComponentProps {\n resources: ISalesLineResources;\n}\n\nexport const getSalesLinesInput = (\n props: IProps,\n moduleName: string,\n order: SalesOrder | OrderShipments,\n products: SimpleProduct[],\n priceContext: IPriceContext,\n showCompleteAddress?: boolean,\n showTimeslot?: boolean,\n telemetryContent?: ITelemetryContent,\n retailMultiplePickUpOptionEnabled?: boolean,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n productDeliveryOptions?: ProductDeliveryOptions[] | undefined\n): IGetSalesLinesInput | undefined => {\n if (!order || !order.SalesLines || !order.SalesLines.length) {\n return;\n }\n\n const {\n resources,\n config: { imageSettings },\n context: {\n actionContext,\n request: {\n gridSettings,\n apiSettings: { channelId }\n }\n }\n } = props;\n\n const isCurrentChannel = !order.ChannelId || order.ChannelId === channelId;\n\n return {\n moduleName,\n moduleComponentProps: props,\n isCurrentChannel,\n salesLines: order.SalesLines,\n products,\n shipments: order.Shipments,\n priceContext: priceContext,\n resources,\n actionContext: actionContext,\n gridSettings: gridSettings!,\n imageSettings: imageSettings,\n showCompleteAddress: showCompleteAddress,\n showTimeslot: showTimeslot || false,\n telemetryContent: telemetryContent,\n retailMultiplePickUpOptionEnabled: retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig,\n productDeliveryOptions: productDeliveryOptions\n };\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { getUrlSync } from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, ChannelIdentity, OrderShipments, OrgUnitLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\nimport { getGroups, IGroups } from '../../../common/get-groups';\nimport { getOrderInfomationInput, getOrderInformation, IOrderInformation } from '../../../common/get-order-information';\nimport { getSalesLines, getSalesLinesInput } from '../../../common/get-sales-lines';\nimport { IOrderHistoryData } from '../order-history.data';\nimport { IOrderHistoryProps } from '../order-history.props.autogenerated';\n\nexport interface ISalesOrderProps extends IOrderHistoryProps<IOrderHistoryData> {\n salesOrder: OrderShipments;\n products: SimpleProduct[];\n channelIdentities?: ChannelIdentity[];\n orgUnitLocations?: OrgUnitLocation[];\n showChannelInfo?: boolean;\n telemetryContent?: ITelemetryContent;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n}\n\nexport interface ISalesOrder {\n salesOrderProps: INodeProps;\n orderInfomation: IOrderInformation;\n groups?: IGroups;\n orderDetailsLink: React.ReactNode;\n}\n\nexport const getSalesOrder = (input: ISalesOrderProps): ISalesOrder => {\n const {\n id,\n typeName,\n context,\n telemetry,\n products,\n salesOrder,\n showChannelInfo,\n channelIdentities,\n orgUnitLocations,\n telemetryContent,\n resources: { freePriceText, detailsAriaLabel, detailsLabel, orderItemLabel, orderItemsLabel },\n context: { actionContext },\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig\n } = input;\n\n const moduleName = 'ms-order-history';\n\n const priceContext = {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n\n const _getorderDetailsPageUrl = (): string => {\n const url = getUrlSync('orderDetails', actionContext) || '';\n const separator = url.includes('?') ? '&' : '?';\n if (salesOrder.SalesId) {\n // Redirect with sales order sales id\n return `${url}${separator}salesId=${salesOrder.SalesId}`;\n } else {\n // Redirect with sales order transaction id\n return `${url}${separator}transactionId=${salesOrder.TransactionId}`;\n }\n };\n\n const salesOrderProps = { className: 'ms-order-history__sales-order', key: salesOrder.SalesId || salesOrder.TransactionId };\n\n const orderInfomationInput = getOrderInfomationInput(input, moduleName, salesOrder, priceContext, channelIdentities, orgUnitLocations, showChannelInfo);\n const orderInfomation = getOrderInformation(orderInfomationInput);\n\n const salesLinesInput = products && getSalesLinesInput(input, moduleName, salesOrder, products, priceContext, undefined, undefined, undefined, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig);\n const salesLines = salesLinesInput && getSalesLines({ ...salesLinesInput, imageOnly: true });\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.OrderDetails);\n const orderDetailsAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n const groups =\n salesLines &&\n getGroups({\n moduleName,\n salesLines,\n resources: { orderItemLabel, orderItemsLabel },\n retailMultiplePickUpOptionEnabled: retailMultiplePickUpOptionEnabled\n });\n\n const orderDetailsLink = (\n <Button\n href={_getorderDetailsPageUrl()}\n aria-label={\n salesOrder.ChannelReferenceId && detailsAriaLabel\n ? detailsAriaLabel.replace('{orderId}', salesOrder.ChannelReferenceId)\n : ''\n }\n className='ms-order-history__btn-order-details'\n {...orderDetailsAttributes}\n >\n {detailsLabel}\n </Button>\n );\n\n return {\n salesOrderProps,\n orderInfomation,\n groups,\n orderDetailsLink\n };\n};\n","import OrderDetails from './modules/order-details/order-details';\nimport OrderDetailsView from './modules/order-details/order-details.view';\n\nexport * from './modules/order-confirmation';\nexport * from './modules/order-details';\nexport * from './modules/order-history';\nexport * from './common';\nexport * from './actions/get-sales-order-with-hydrations';\nexport * from './actions/get-tender-types';\n\nexport {\n OrderDetails,\n OrderDetailsView\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\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<ICheckoutLoyaltyAdd> = ({\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 <Node {...drawer}>\n {rewardPoints.map((rewardPoint: ICheckoutLoyaltyRewardPoint) => {\n return (\n <Node {...rewardPoint.checkoutLoyaltyRewardPoint} key={rewardPoint.key}>\n {rewardPoint.title}\n {rewardPoint.availablePointsText}\n {rewardPoint.activePoints}\n {rewardPoint.expiringPointsText}\n {rewardPoint.expiringPoints}\n </Node>\n );\n })}\n </Node>\n <Node {...loyaltyAmountContainer}>\n {loyaltyAmountLabel}\n {loyaltyAmountInput}\n {loyaltyAmountApplyButton}\n {\n showAppliedAmount &&\n <Node {...appliedLoyaltyAmountContainer}>\n {loyaltyAmountAppliedText}\n {loyaltyAmountAppliedPrice}\n {loyaltyAmountRemoveButton}\n </Node>\n }\n </Node>\n </>\n );\n};\n\nconst ShowCheckoutLoyalty: React.FC<ICheckoutLoyaltyShow> = ({\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<ICheckoutLoyaltyViewProps> = props => {\n const { checkoutLoyalty,\n viewState,\n showLoyalty,\n addLoyalty } = props;\n\n return (\n <Module {...checkoutLoyalty}>\n {viewState.isShowLoyalty && <ShowCheckoutLoyalty {...showLoyalty} />}\n {viewState.isShowAddLoyalty && <AddCheckoutLoyalty {...addLoyalty} />}\n </Module>\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 { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { ICartIconViewProps } from './cart-icon';\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\n\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n return cartLines.map((cartLine, index) => {\n return (\n <Node {...props.miniCartItemWrapper} key={index}>\n {cartLine.cartline}\n {cartLine.storeLocation}\n {cartLine.remove}\n </Node>\n );\n });\n};\n\nconst CartIconView: React.FC<ICartIconViewProps> = (props: ICartIconViewProps) => (\n <Node {...props.miniCartWrapper} {...props.renderModuleAttributes(props)}>\n {props.cartIcon}\n {props.FlyoutContainer ? (\n <Node {...props.FlyoutContainer}>\n {props.flyoutTitle}\n <Node {...props.CartlinesWrapper}>\n {_renderCartlines(props.cartlines, props)}\n </Node>\n {props.totalPrice}\n {props.checkoutAsSignInUserButton}\n {props.goToCartButton}\n </Node>\n ) : false }\n </Node>\n);\n\nexport default CartIconView;","/*---------------------------------------------------------------------------------------------\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<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\n <Node {...PickUpAtStore}>\n {label}\n {location}\n </Node>\n);\n\nexport const EmailDeliveryComponent: React.FC<IEmailDelivery> = ({ EmailDelivery, label }) => (\n <Node {...EmailDelivery}>\n {label}\n </Node>\n);\n\nexport const LineItemComponent: React.FC<ILineItem> = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\n <Node {...LineItem}>\n {item}\n {pickUpAtStore && <PickUpAtStoreComponent {...pickUpAtStore} />}\n {emailDelivery && <EmailDeliveryComponent {...emailDelivery} />}\n </Node>\n);\n\nexport const LineItemGroupComponent: React.FC<ILineItemDeliveryGroup> = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\n <Node {...LineItemDeliveryGroup}>\n {heading}\n <Node {...LineItemList}>\n {lineItems.map(lineItem => (\n <LineItemComponent key={lineItem.LineId} {...lineItem} />\n ))}\n </Node>\n </Node>\n);\n\nexport const LineItemGroupComponentWithMultiplePickUp: React.FC<ILineItemDeliveryGroup> = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems, lineItemWraper, lineItemWraperIcon }) => (\n <Node {...LineItemDeliveryGroup}>\n {lineItemWraperIcon}\n {lineItemWraper}\n {heading}\n <Node {...LineItemList}>\n {lineItems.map(lineItem => (\n <LineItemComponentWithMultiplePickUp key={lineItem.LineId} {...lineItem} />\n ))}\n </Node>\n </Node>\n);\n\nexport const LineItemComponentWithMultiplePickUp: React.FC<ILineItem> = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\n <Node {...LineItem}>\n {item}\n {emailDelivery && <EmailDeliveryComponent {...emailDelivery} />}\n </Node>\n);\n\nexport const PickUpAtStoreComponentWithMultiplePickUp: React.FC<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\n <Node {...PickUpAtStore}>\n {label}\n {location}\n </Node>\n);\n\nexport const LineItemsComponent: React.FC<ILineItems> = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForEmail, itemsGroupWithMulitplePickupMode }) => (\n <Node {...LineItems}>\n <Node {...Header}>\n {heading}\n {editLink}\n </Node>\n {itemsGroupWithMulitplePickupMode === undefined && itemsForPickup && <LineItemGroupComponent {...itemsForPickup} />}\n {itemsGroupWithMulitplePickupMode === undefined && itemsForEmail && <LineItemGroupComponent {...itemsForEmail} />}\n {itemsGroupWithMulitplePickupMode === undefined && itemsForShip && <LineItemGroupComponent {...itemsForShip} />}\n {itemsGroupWithMulitplePickupMode !== undefined ? itemsGroupWithMulitplePickupMode.map((item, index) => {\n return <LineItemGroupComponentWithMultiplePickUp {...item} key={index} />;\n }) : null\n }\n </Node>\n);\n\nconst OrderSummaryComponent: React.FC<IOrderSummary> = ({ heading, lines }) => (\n <div className='msc-order-summary-wrapper'>\n {heading}\n <div className='msc-order-summary__items'>\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 </div>\n </div>\n);\n\nconst CheckoutView: React.FC<ICheckoutViewProps> = 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 <Module {...checkoutProps}>\n {!hasSalesOrder && <Node {...headerProps}>{title}</Node>}\n {!hasSalesOrder &&\n <Node {...bodyProps}>\n {loading}\n {alert}\n {canShow && (\n <>\n <Node {...mainProps}>\n {guidedForm}\n <Node {...termsAndConditionsProps}>\n {termsAndConditions}\n </Node>\n <Node {...mainControlProps}>\n {placeOrderButton}\n {keepShoppingButton}\n </Node>\n </Node>\n <Node {...sideProps}>\n {orderSummary && <OrderSummaryComponent {...orderSummary} />}\n <Node {...sideControlFirstProps}>\n <Node {...termsAndConditionsProps}>\n {termsAndConditions}\n </Node>\n {placeOrderButton}\n {keepShoppingButton}\n </Node>\n {lineItems && <LineItemsComponent {...lineItems} />}\n <Node {...sideControlSecondProps}>\n <Node {...termsAndConditionsProps}>\n {termsAndConditions}\n </Node>\n {placeOrderButton}\n {keepShoppingButton}\n </Node>\n </Node>\n </>\n )}\n </Node>\n }\n {hasSalesOrder && orderConfirmation}\n </Module>\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<ICheckoutData> {\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<ICheckoutData>, IModuleStateProps { }\n\n/**\n *\n * CheckoutContainer component\n * @extends {React.Component<ICheckoutModuleProps>}\n */\n// @ts-ignore\n@withModuleState\n@observer\nclass Checkout extends React.Component<ICheckoutModuleProps> {\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: <AlertComponent {...{ message: cookieConsentRequiredMessage }} />\n };\n } else if (this.isLoading()) {\n viewProps = {\n ...viewProps,\n loading: <Waiting className='msc-waiting-circular msc-waiting-lg' />\n };\n } else if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: <AlertComponent {...{ message: genericErrorMessage }} />\n };\n } else {\n viewProps = {\n ...viewProps,\n alert: errorMessage && <AlertComponent {...{ message: errorMessage }} />,\n canShow: true,\n guidedForm: checkoutInformation ? (\n <GuidedFormComponent\n {...{\n items: checkoutInformation,\n moduleState: moduleState,\n disableGuidedCheckoutFlow: disableGuidedCheckoutFlow,\n resource: resources,\n requestContext: this.props.context,\n isMobile: isMobile,\n isEditor: this.isEditorialMode,\n telemetryContent: this.telemetryContent\n }}\n />\n ) : (\n undefined\n ),\n orderSummary: getOrderSummary(this.props),\n lineItems: hasInvoiceLine ? undefined : getLineItems(this.props, this.telemetryContent),\n placeOrderButton: (\n <PlaceOrderButtonComponent {...{ checkoutBtnText, placeOrder: this.onPlaceOrder, canPlaceOrder: this.canPlaceOrder, telemetryContent: this.telemetryContent }} />\n ),\n termsAndConditions: termsAndConditions,\n keepShoppingButton: backToShoppingUrl && (\n <Button\n className='ms-checkout__btn-keep-shopping msc-btn'\n title={backToShopping}\n color='secondary'\n href={backToShoppingUrl}\n {...backToShoppingAttributes}\n >\n {backToShopping}\n </Button>\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 <Msdyn365.Text\n {...checkoutHeading}\n tag={checkoutHeading.tag || 'h2'}\n className='ms-checkout__title'\n text={checkoutHeading.text}\n editProps={{ onEdit: this.handleCheckoutHeadingChange, requestContext: this.props.context.request }}\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<void> => {\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<number | undefined> => {\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<boolean> => {\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport {\n IGroup,\n IGroupDelivery,\n IGroups,\n IHelp,\n IOrderDetailsViewProps,\n IOrderInformation,\n IOrderSummary,\n IPaymentMethods,\n ISalesLine\n} from './../..';\n\nexport const OrderDetailsOrderInfomation: React.FC<IOrderInformation> = ({\n orderInformationProps,\n salesId,\n receiptId,\n createdDate,\n count,\n amount,\n channelReferenceId,\n channelName,\n channelAddress\n}) => (\n <Node {...orderInformationProps}>\n {channelName}\n {channelAddress}\n {channelReferenceId}\n {salesId}\n {receiptId}\n {createdDate}\n {count}\n {amount}\n </Node>\n );\n\nexport const OrderDetailsSalesLine: React.FC<ISalesLine> = ({ salesLineProps, salesLine, buyAgainButton }) => (\n <Node {...salesLineProps}>\n {salesLine}\n {buyAgainButton}\n </Node>\n);\n\nexport const OrderDetailsGroupDelivery: React.FC<IGroupDelivery> = ({ deliveryProps, heading, count, trackingInfo, shippedStatusCheck }) => (\n <Node {...deliveryProps}>\n {heading}\n {count}\n {shippedStatusCheck === 'shipped' ? null : trackingInfo}\n </Node>\n);\n\nexport const OrderDetailsGroup: React.FC<IGroup> = ({ groupProps, delivery, address, salesLinesProps, salesLines }) => (\n <Node {...groupProps}>\n {delivery && <OrderDetailsGroupDelivery {...delivery} />}\n {salesLines && (\n <Node {...salesLinesProps}>\n {salesLines.map(salesLine => (\n <React.Fragment key={salesLine.data.salesLine.LineId}>\n {salesLine.data.deliveryType === 'ship' && salesLine.data.shipment ? salesLine.trackingInfo : null}\n <OrderDetailsSalesLine {...salesLine} />\n {salesLine.salesStatus}\n </React.Fragment>\n ))}\n </Node>\n )}\n {!delivery.showTimeslot && address}\n {delivery.showTimeslot && (\n <Node {...delivery.pickupProps}>\n {address}\n {delivery.pickupDateTimeslot}\n </Node>\n )}\n </Node>\n);\n\nexport const OrderDetailsGroups: React.FC<IGroups> = ({ groupsProps, groups }) => (\n <Node {...groupsProps}>\n {groups.map((group, index) => (\n <OrderDetailsGroup key={index} {...group} />\n ))}\n </Node>\n);\n\nexport const OrderDetailsOrderSummary: React.FC<IOrderSummary> = ({ orderSummaryProps, heading, subtotal, shipping, tax, totalAmount, earnedPoints }) => (\n <Node {...orderSummaryProps}>\n {heading}\n {subtotal}\n {shipping}\n {tax}\n {totalAmount}\n {earnedPoints}\n </Node>\n);\n\nexport const OrderDetailsPayment: React.FC<IPaymentMethods> = ({ paymentMethodsProps, title, methods }) => (\n <Node {...paymentMethodsProps}>\n {title}\n {methods}\n </Node>\n);\n\nexport const OrderDetailsHelp: React.FC<IHelp> = ({ helpProps, needHelpLabel, helpLineNumberLabel, contactNumber }) => (\n <Node {...helpProps}>\n {needHelpLabel}\n {helpLineNumberLabel}\n {contactNumber}\n </Node>\n);\n\nconst OrderDetailsView: React.FC<IOrderDetailsViewProps> = ({\n moduleProps,\n heading,\n alert,\n loading,\n orderInfomation,\n orderSummary,\n payment,\n help,\n groups\n}) => {\n return (\n <Module {...moduleProps}>\n {heading}\n {alert}\n {loading}\n {orderInfomation && <OrderDetailsOrderInfomation {...orderInfomation} />}\n {groups && <OrderDetailsGroups {...groups} />}\n {orderSummary && <OrderDetailsOrderSummary {...orderSummary} />}\n {payment && <OrderDetailsPayment {...payment} />}\n {help && <OrderDetailsHelp {...help} />}\n </Module>\n );\n};\n\nexport default OrderDetailsView;\n","import React from 'react';\n\nimport { EnumExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Popover } from '@msdyn365-commerce-modules/utilities';\nimport { IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\n\nexport interface IOrderHistoryFilterResources {\n orderHistoryFilterYourOrderHistory: string;\n orderHistoryFilterOrganizationWide: string;\n}\n\nexport interface IOrderHistoryFilterData {\n customerInformation: Customer;\n}\n\nexport interface IOrderHistoryFilterProps extends IComponentProps<IOrderHistoryFilterData> {\n className: string;\n\n resources: IOrderHistoryFilterResources;\n\n currentState: OrderHistoryFilterState;\n onFilterStateChanged(state: OrderHistoryFilterState): void;\n}\n\nexport enum OrderHistoryFilterState {\n CurrentUser,\n OrganizationWide\n}\n\nconst getOrderHistoryFilterStateResources = (filterState: OrderHistoryFilterState, resources: IOrderHistoryFilterResources): string => {\n switch (filterState) {\n case OrderHistoryFilterState.CurrentUser:\n return resources.orderHistoryFilterYourOrderHistory;\n case OrderHistoryFilterState.OrganizationWide:\n return resources.orderHistoryFilterOrganizationWide;\n default:\n throw new Error('Failed to retrieve resource description for unknown order history filter state.');\n }\n};\n\nconst renderFilterStateItem = (\n filterState: OrderHistoryFilterState,\n resources: IOrderHistoryFilterResources,\n className: string,\n onStateClick: (filterState: OrderHistoryFilterState) => void): React.ReactNode => {\n\n const stateStringRepresentation = OrderHistoryFilterState[filterState];\n\n const onClick = () => {\n return onStateClick(filterState);\n };\n\n return (\n <a role='button' className={`${className}__item__${stateStringRepresentation}`} onClick={onClick}>\n {getOrderHistoryFilterStateResources(filterState, resources)}\n </a>\n );\n};\n\nconst OrderHistoryFilter: React.FC<IOrderHistoryFilterProps> = (props: IOrderHistoryFilterProps) => {\n // Current version of filter doesn't include functionality for non b2b admins.\n if (!props.data.customerInformation.IsB2bAdmin) {\n return null;\n }\n\n const popoverRef = React.createRef<HTMLButtonElement>();\n const [popoverState, setPopoverState] = React.useState(false);\n const togglePopover = () => {\n setPopoverState(!popoverState);\n };\n\n const [filterState, setFilterState] = React.useState(props.currentState);\n\n const onFilterStateClick = (clickedState: OrderHistoryFilterState) => {\n setFilterState(clickedState);\n setPopoverState(false);\n props.onFilterStateChanged(clickedState);\n };\n\n return (\n <div className={props.className}>\n <Button\n className={`${props.className}__expand-filter-button`}\n innerRef={popoverRef}\n aria-expanded={popoverState}\n aria-describedby={props.className}\n onClick={togglePopover}\n >\n {getOrderHistoryFilterStateResources(filterState, props.resources)}\n </Button>\n <Popover\n id={props.className}\n placement={'bottom-end'}\n isOpen={popoverState}\n target={popoverRef}\n toggle={togglePopover}\n >\n {\n EnumExtensions.getEnumValues<OrderHistoryFilterState>(OrderHistoryFilterState).map(state => {\n return renderFilterStateItem(state, props.resources, props.className, onFilterStateClick);\n })\n }\n </Popover>\n </div>\n );\n};\n\n// @ts-ignore\nexport const OrderHistoryFilterComponent: React.FunctionComponent<IOrderHistoryFilterProps> = msdyn365Commerce.createComponent<IOrderHistoryFilterProps>(\n 'OrderHistoryFilterComponent',\n { component: OrderHistoryFilter }\n);","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { ArrayExtensions, getFallbackImageUrl, getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { CartLineItemComponent } from '@msdyn365-commerce/components';\nimport { Image } from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, ProductDeliveryOptions, SalesLine, Shipment, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\nimport Address from './address';\nimport LabelComponent from './label';\nimport { defaultImageSettings, getDateTimeslot, getSalesStatusCode, IDeliveryType, IModuleComponentProps, ISalesStatusCode } from './utilities';\n\nexport type ISalesStatusStringMap = {\n [x in ISalesStatusCode]: string | undefined;\n};\n\nexport type IDeliveryTypeStringMap = {\n [x in IDeliveryType]: string | undefined;\n};\n\nexport interface ISalesLineResources {\n productDimensionTypeSize: string;\n productDimensionTypeColor: string;\n productDimensionTypeStyle: string;\n salesLineQuantityText: string;\n configString: string;\n shipToLabel: string;\n storeLabel: string;\n phoneLabel: string;\n phoneAriaLabel: string;\n buyItAgainAriaLabel: string;\n buyItAgainLabel: string;\n orderStatusReadyForPickup: string;\n orderStatusPickedUp: string;\n orderStatusShipped: string;\n orderStatusCanceled: string;\n orderStatusProcessing: string;\n pickedUpSalesLines: string;\n deliveredSalesLines: string;\n carryOutSalesLines: string;\n trackingLabel: string;\n trackingAriaLabel: string;\n trackingComingSoonLabel: string;\n discountStringText: string;\n orderStatusEmailed: string;\n emailSalesLines: string;\n pickupDateTimeslotText: string;\n pickupTimeslotPlaceHolder: string;\n shippingCharges?: string;\n}\n\nexport interface IGetSalesLineInput {\n moduleName: string;\n moduleComponentProps: IModuleComponentProps;\n product: SimpleProduct;\n shipment?: Shipment;\n salesLine: SalesLine;\n isCurrentChannel: boolean;\n resources: ISalesLineResources;\n imageOnly?: boolean;\n showCompleteAddress?: boolean;\n showTimeslot: boolean;\n telemetryContent?: ITelemetryContent;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n productDeliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport interface ISalesLine {\n salesLineProps: INodeProps;\n salesLine: React.ReactNode;\n address?: React.ReactNode;\n buyAgainButton?: React.ReactNode;\n salesStatus: React.ReactNode;\n deliveryType: React.ReactNode;\n trackingInfo: React.ReactNode;\n pickupDateTimeslot: React.ReactNode;\n\n // row data\n data: {\n salesLine: SalesLine;\n product: SimpleProduct;\n shipment?: Shipment;\n deliveryType: string;\n productUrl: string;\n salesStatus: ISalesStatusCode;\n };\n}\n\n// tslint:disable:max-func-body-length\n// tslint:disable-next-line:cyclomatic-complexity\nexport const getSalesLine = ({\n moduleName,\n moduleComponentProps: {\n id,\n typeName,\n context,\n telemetry,\n config: { imageSettings, showShippingChargesForLineItems }\n },\n showCompleteAddress,\n product,\n shipment,\n salesLine,\n isCurrentChannel,\n imageOnly,\n showTimeslot,\n resources: {\n productDimensionTypeSize: sizeString,\n productDimensionTypeColor: colorString,\n productDimensionTypeStyle: styleString,\n salesLineQuantityText: quantityDisplayString,\n configString,\n shipToLabel,\n storeLabel,\n phoneLabel,\n phoneAriaLabel,\n buyItAgainLabel,\n buyItAgainAriaLabel,\n orderStatusReadyForPickup,\n orderStatusProcessing,\n orderStatusShipped,\n orderStatusPickedUp,\n orderStatusCanceled,\n orderStatusEmailed,\n pickedUpSalesLines,\n deliveredSalesLines,\n carryOutSalesLines,\n emailSalesLines,\n trackingLabel,\n trackingAriaLabel,\n trackingComingSoonLabel,\n discountStringText,\n pickupDateTimeslotText,\n pickupTimeslotPlaceHolder,\n shippingCharges\n },\n telemetryContent,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig,\n productDeliveryOptions\n}: IGetSalesLineInput): ISalesLine => {\n const salesStatusStringMap: ISalesStatusStringMap = {\n canceled: orderStatusCanceled,\n readyForPickup: orderStatusReadyForPickup,\n pickedUp: orderStatusPickedUp,\n processing: orderStatusProcessing,\n shipped: orderStatusShipped,\n unknown: undefined,\n emailed: orderStatusEmailed\n };\n\n const deliveryTypeStringMap: IDeliveryTypeStringMap = {\n pickUp: pickedUpSalesLines,\n ship: deliveredSalesLines,\n carryOut: carryOutSalesLines,\n email: emailSalesLines\n };\n\n const gridSettings = context.request.gridSettings;\n const pickupDeliveryModeCode = context.request.channel && context.request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = context.request.channel && context.request.channel.EmailDeliveryModeCode;\n const productUrl = getProductUrlSync(product, context.actionContext, undefined);\n const pickupMode = getPickupModeDesc(product, salesLine.DeliveryMode, productDeliveryOptions, retailMultiplePickUpOptionEnabled);\n const deliveryType =\n getPickupDeliveryMode(salesLine.DeliveryMode, pickupDeliveryModeCode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig)\n ? pickupMode\n : !!emailDeliveryModeCode && emailDeliveryModeCode !== '' && emailDeliveryModeCode === salesLine.DeliveryMode\n ? 'email'\n : !!salesLine.DeliveryMode\n ? 'ship'\n : 'carryOut';\n const salesStatus = getSalesStatusCode(deliveryType, salesLine.SalesStatusValue, pickupMode);\n const salesStatusString = salesStatusStringMap[salesStatus];\n const salesStatusComp = salesStatusString && <LabelComponent className={`${moduleName}__sales-status`} label={salesStatusString} />;\n const deliveryTypeString = getdeliveryTypeString(deliveryType, deliveryTypeStringMap, retailMultiplePickUpOptionEnabled);\n const deliveryTypeClass = getdeliveryTypeClassName(deliveryType, deliveryTypeStringMap);\n const storePickUp = retailMultiplePickUpOptionEnabled ? getStoreName(salesLine, deliveryType) : null;\n const deliveryTypeComp = retailMultiplePickUpOptionEnabled ? deliveryTypeString && <LabelComponent className={`${moduleName}__devliery-type ${deliveryTypeClass}-icon`} label= {`${deliveryTypeString} ${storePickUp}`} />\n : deliveryTypeString && <LabelComponent className={`${moduleName}__devliery-type`} label={deliveryTypeString} />;\n const trackingInfo = isCurrentChannel && deliveryType === 'ship' && (\n <span className={`${moduleName}__tracking-info`}>\n {trackingLabel}\n {shipment ? (\n <a className={`${moduleName}__tracking-link`} href={shipment.TrackingUrl} aria-label={trackingAriaLabel}>\n {shipment.TrackingNumber}\n </a>\n ) : (\n <>{trackingComingSoonLabel}</>\n )}\n </span>\n );\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.BuyItAgain);\n const buyItAgainAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n const fallbackImageUrl = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n\n const canShowTimeslot: boolean = showTimeslot\n && deliveryType === pickupMode\n && salesLine.PickupTimeslotStartDateTime !== undefined\n && salesLine.PickupTimeslotEndDateTime !== undefined;\n\n const pickupDateTimeslot = canShowTimeslot ? getDateTimeslot(pickupTimeslotPlaceHolder, salesLine.PickupTimeslotStartDateTime, salesLine.PickupTimeslotEndDateTime, context.request.locale) : '';\n const pickupDateTimeslotInfo = canShowTimeslot && (\n <div className={`${moduleName}__pickup-date-timeslot`}>\n <div className={`${moduleName}__pickup-date-timeslot-title`}>{pickupDateTimeslotText}</div>\n <div className={`${moduleName}__pickup-date-timeslot-content`}>{pickupDateTimeslot}</div>\n </div>\n );\n if(imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n return {\n data: {\n salesLine,\n productUrl,\n deliveryType,\n salesStatus,\n product,\n shipment\n },\n salesLineProps: { className: `${moduleName}__sales-line` },\n salesLine: imageOnly ? (\n <div className={`${moduleName}__sales-line-picture`}>\n <Image\n className={`${moduleName}__sales-line-image`}\n altText={product.Name}\n src={product.PrimaryImageUrl || ''}\n fallBackSrc={fallbackImageUrl}\n gridSettings={gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n ) : (\n <CartLineItemComponent\n id={id}\n typeName={typeName}\n context={context}\n resources={{\n sizeString,\n colorString,\n styleString,\n quantityDisplayString,\n configString,\n discountStringText,\n inputQuantityAriaLabel: '',\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: shippingCharges || ''\n }}\n primaryImageUrl={product.PrimaryImageUrl}\n productUrl={productUrl}\n imageSettings={imageSettings || defaultImageSettings}\n gridSettings={gridSettings!}\n isSalesLine={true}\n data={{ cartLine: salesLine, product: product }}\n showShippingChargesForLineItems = {showShippingChargesForLineItems}\n channelDeliveryOptionConfig = {retailMultiplePickUpOptionEnabled? channelDeliveryOptionConfig: undefined}\n />\n ),\n address: salesLine.ShippingAddress && (\n <Address\n moduleName={moduleName}\n address={salesLine.ShippingAddress}\n resource={{ shipToLabel, storeLabel, phoneLabel, phoneAriaLabel }}\n deliveryType={deliveryType}\n showCompleteAddress={showCompleteAddress}\n />\n ),\n deliveryType: deliveryTypeComp,\n salesStatus: salesStatusComp,\n trackingInfo,\n buyAgainButton: retailMultiplePickUpOptionEnabled ? isCurrentChannel && (\n <a\n href={productUrl}\n aria-label={product?.Name && buyItAgainAriaLabel ? (buyItAgainAriaLabel || '').replace('{productName}', product?.Name) : ''}\n className={`${moduleName}__sales-line-btn-buy-it-again-link`}\n {...buyItAgainAttributes}\n >\n {buyItAgainLabel}\n </a>\n ) :\n isCurrentChannel && (\n <Button\n href={productUrl}\n aria-label={product?.Name && buyItAgainAriaLabel ? (buyItAgainAriaLabel || '').replace('{productName}', product?.Name) : ''}\n className={`${moduleName}__sales-line-btn-buy-it-again`}\n {...buyItAgainAttributes}\n >\n {buyItAgainLabel}\n </Button>\n ),\n pickupDateTimeslot: pickupDateTimeslotInfo\n };\n};\n\nexport const getPickupDeliveryMode = (salesLineDeliveryMode?: string, pickupDeliveryModeCode?: string, retailMultiplePickupOption?: boolean,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, productDeliveryOptions?: ProductDeliveryOptions[]): boolean => {\n if (retailMultiplePickupOption) {\n return salesLineDeliveryMode === channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === salesLineDeliveryMode);\n } else {\n return !!pickupDeliveryModeCode && pickupDeliveryModeCode !== '' && pickupDeliveryModeCode === salesLineDeliveryMode;\n }\n};\n\nexport const getdeliveryTypeString = (deliveryType: string, deliveryTypeStringMap: IDeliveryTypeStringMap , retailMultiplePickupOption?: boolean): string | undefined=> {\n if(retailMultiplePickupOption) {\n switch (deliveryType) {\n case 'ship':\n case 'carryout':\n case 'email':\n return deliveryTypeStringMap[deliveryType];\n default:\n return deliveryType;\n }\n } else {\n return deliveryTypeStringMap[deliveryType];\n }\n};\n\nexport const getdeliveryTypeClassName = (deliveryType: string, deliveryTypeStringMap: IDeliveryTypeStringMap , retailMultiplePickupOption?: boolean): string | undefined=> {\n switch (deliveryType) {\n case 'ship':\n case 'carryout':\n case 'email':\n return deliveryType;\n default:\n return 'pickUp';\n }\n};\n\nexport const getPickupModeDesc = (product: SimpleProduct, salesLineDeliveryMode?: string, productDeliveryOptions?: ProductDeliveryOptions[], retailMultiplePickupOption?: boolean): string => {\n let deliveryOption: string = 'pickup';\n if (ArrayExtensions.hasElements(productDeliveryOptions) && product !== undefined) {\n let foundProductDeliveryOption;\n foundProductDeliveryOption = productDeliveryOptions?.find((deliveryO) => {\n return deliveryO && deliveryO.ProductId === product.RecordId;\n });\n const deliveryDesc = foundProductDeliveryOption?.DeliveryOptions ? foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === salesLineDeliveryMode)?.Description: deliveryOption;\n if (deliveryDesc !== undefined) {\n deliveryOption = deliveryDesc;\n }\n }\n return deliveryOption;\n};\n\nexport const getStoreName = (salesLine: SalesLine, deliveryType?: string): string | undefined => {\n switch (deliveryType) {\n case 'ship':\n case 'email':\n case 'carryout':\n return '';\n default:\n return `, ${salesLine.ShippingAddress?.Name}`;\n }\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Alert, Button, INodeProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { showAdditionalFields } from '../gift-card-balance-check.props.autogenerated';\n\nexport interface IGetFormInput {\n errorMessage: string;\n giftCardNumber: string;\n giftCardPin: string;\n giftCardExp: string;\n inputRef?: React.RefObject<HTMLInputElement>;\n inputPinRef?: React.RefObject<HTMLInputElement>;\n inputExpRef?: React.RefObject<HTMLInputElement>;\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<void>;\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<void> => {\n e.preventDefault();\n await onApplyGiftCard();\n };\n\n const onChangeNumber = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = (e.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardNumber(value);\n };\n\n const onChangePin = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = (e.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardPin(value);\n };\n\n const onChangeExp = (e: React.ChangeEvent<HTMLInputElement>) => {\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 <label id='ms-gift-card-balance-check__label' className='ms-gift-card-balance-check__input-label'>\n {giftCardFormLabel}\n </label>\n );\n\n const inputPinLabel = (\n <label id='ms-gift-card-balance-check__input-pin-label' className='ms-gift-card-balance-check__input-pin-label'>\n {giftCardPinLabel}\n </label>\n );\n\n const inputExpLabel = (\n <label id='ms-gift-card-balance-check__input-exp-label' className='ms-gift-card-balance-check__input-exp-label'>\n {giftCardExpLabel}\n </label>\n );\n\n const alertFieldLabel = (\n <label id='ms-gift-card-balance-check__input-alert' className='ms-gift-card-balance-check__input-alert-label'>\n {giftCardAlertLabel}\n </label>\n );\n\n const alert = (\n <Alert\n tag='span'\n id='ms-gift-card-balance-check__error'\n className='ms-gift-card-balance-check__input-error'\n role='alert'\n assertive={false}\n fade={false}\n includeAlertClass={false}\n isOpen={!!errorMessage}\n >\n {errorMessage}\n </Alert>\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 <input\n ref={inputRef}\n type='text'\n className='ms-gift-card-balance-check__input-text form-control'\n aria-label={giftCardNumberLabel}\n onChange={onChangeNumber}\n value={giftCardNumber}\n aria-labelledby='ms-gift-card-balance-check__label ms-gift-card-balance-check__error'\n />\n );\n\n const inputPin = (\n <input\n ref={inputPinRef}\n type='text'\n className='ms-gift-card-balance-check__input-pin-text form-contol'\n aria-label={giftCardPinLabel}\n placeholder={giftCardPinPlaceholderText}\n onChange={onChangePin}\n value={giftCardPin}\n aria-labelledby='ms-gift-card-balance-check__label ms-gift-card-balance-check__error'\n />\n );\n\n const inputExp = (\n <input\n ref={inputExpRef}\n type='text'\n className='ms-gift-card-balance-check__input-exp-text form-contol'\n aria-label={giftCardExpLabel}\n placeholder={giftCardExpPlaceholderText}\n onChange={onChangeExp}\n value={giftCardExp}\n aria-labelledby='ms-gift-card-balance-check__label ms-gift-card-balance-check__error'\n />\n );\n\n const applyButton = (\n <Button\n className='ms-gift-card-balance-check__btn-apply'\n onClick={onApply}\n aria-label={balanceCheckButton}\n disabled={!giftCardNumber}\n >\n {balanceCheckButton}\n </Button>\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<IGiftCardItemProps>}\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 <span className='ms-gift-card-balance-check__item-text'>\n {enteredGiftCardLabel} {giftCardLast4Digit} ({giftCardAvailableBalanceLabel}{' '}\n <span className='ms-gift-card-balance-check__balance'>{balance}</span>)\n </span>\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<IGiftCardBalanceCheckModuleProps, IGiftCardBalanceCheckState>}\n */\nexport class GiftCardBalanceCheck extends React.Component<IGiftCardBalanceCheckModuleProps, IGiftCardBalanceCheckState> {\n public state: IGiftCardBalanceCheckState = {\n isFetchingGiftCard: false,\n errorMessage: '',\n giftCardNumber: '',\n giftCardPin: '',\n giftCardExp: ''\n };\n\n private inputRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private inputPinRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private inputExpRef: React.RefObject<HTMLInputElement> = 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<void> => {\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<GiftCard | undefined> => {\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<CardTypeInfo[] | undefined> => {\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<IAlertProps> = ({ message }) => (\r\n <p className='ms-checkout__error-message' role='alert' aria-live='assertive'>\r\n {message}\r\n </p>\r\n);\r\n\r\nexport default CheckoutAlert;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * 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<ISmweCheckoutData>): 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 <CartLineItemComponent\r\n id={id}\r\n typeName={typeName}\r\n context={context}\r\n resources={{\r\n sizeString: productDimensionTypeSize,\r\n colorString: productDimensionTypeColor,\r\n styleString: productDimensionTypeStyle,\r\n quantityDisplayString,\r\n configString,\r\n inputQuantityAriaLabel,\r\n discountStringText,\r\n\r\n originalPriceText:'',\r\n currentPriceText:'',\r\n shippingChargesText: shippingCharges,\r\n }}\r\n isQuantityEditable={false}\r\n imageSettings={imageSettings!}\r\n gridSettings={gridSettings!}\r\n productUrl={getProductUrlSync(product, context.actionContext, undefined)}\r\n primaryImageUrl={product.PrimaryImageUrl}\r\n data={{\r\n cartLine: cartLine,\r\n product: product\r\n }}\r\n />\r\n );\r\n };\r\n\r\n const _getPickUpAtStoreComponents = (pickupDeliveryLocation: string): IPickUpAtStore => {\r\n const {\r\n resources: { pickUpAtStoreWithLocationText }\r\n } = input;\r\n\r\n return {\r\n PickUpAtStore: { className: 'ms-checkout__pick-up-at-store' },\r\n label: <span className='ms-checkout__store-label'>{pickUpAtStoreWithLocationText}</span>,\r\n location: <div className='ms-checkout__store-location'>{pickupDeliveryLocation}</div>\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: <div className='ms-checkout__line-items-group-title'>{title}</div>,\r\n lineItems: _getLineItemsComponents(nonSubscriptionItems)\r\n };\r\n };\r\n\r\n const _getLineItems = (): ILineItems | undefined => {\r\n const {\r\n context,\r\n config: { lineItemsHeading },\r\n data: { products },\r\n resources: { editCartText, subscriptionHeader }\r\n } = input;\r\n\r\n const 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 && <Heading className='ms-checkout__line-items-heading' {...lineItemsHeading} />,\r\n editLink: (\r\n <Button\r\n className='ms-checkout__line-items-edit-cart-link'\r\n title={editCartText}\r\n color='link'\r\n href={getUrlSync('cart', context.actionContext) || ''}\r\n >\r\n {editCartText}\r\n </Button>\r\n ),\r\n itemsForPickup: _getLineItemsByDeliveryType('pickup'),\r\n itemsForShip: _getLineItemsByDeliveryType('ship'),\r\n itemsForSubscription: subscriptionLineItems,\r\n subscriptionHeader: subscriptionHeader\r\n };\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<ISmweCheckoutData>): IOrderSummary => {\r\n const {\r\n config: { orderSummaryHeading },\r\n data: { checkout },\r\n resources: {\r\n subTotalLabel,\r\n shippingLabel,\r\n taxLabel,\r\n orderTotalLabel,\r\n loyaltyLabel,\r\n giftcardLabel,\r\n totalDiscountsLabel,\r\n freeText,\r\n toBeCalculatedText\r\n },\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 && <Heading className='msc-order-summary__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 modifyBtnLabel: 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<ICheckoutGuidedCardProps>}\r\n */\r\nclass CheckoutGuidedCard extends React.PureComponent<ICheckoutGuidedCardProps> {\r\n private editButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\r\n private formCardRef: React.RefObject<HTMLDivElement> = 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 { modifyBtnLabel } = resource;\r\n\r\n const canEdit = hasControlGroup && isReady && isVisted && onEdit;\r\n\r\n return (\r\n <div\r\n className={classname('ms-checkout__guided-card', {\r\n active: isActive,\r\n expanded: isExpanded,\r\n closed: !isExpanded,\r\n visted: isVisted,\r\n hidden: disabled,\r\n initialized: hasInitialized,\r\n disabled: disabled,\r\n ready: isReady,\r\n pending: isPending,\r\n updating: isUpdating\r\n })}\r\n ref={this.formCardRef}\r\n >\r\n <div className='ms-checkout__guided-card-header'>\r\n {this.getTitle()}\r\n\r\n {canEdit && (\r\n <Button\r\n innerRef={this.editButtonRef}\r\n className='ms-checkout__guided-card-btn-edit'\r\n title={modifyBtnLabel}\r\n color='link'\r\n onClick={onEdit}\r\n aria-label={title && title.text ? `${modifyBtnLabel} ${title.text}` : ''}\r\n >\r\n {modifyBtnLabel}\r\n </Button>\r\n )}\r\n </div>\r\n\r\n <div\r\n className={classname('ms-checkout__guided-card-body', {\r\n hidden: !isExpanded\r\n })}\r\n >\r\n <div className='ms-checkout__guided-card-content'>{children}</div>\r\n\r\n {this.renderFooder()}\r\n </div>\r\n </div>\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 <div className='ms-checkout__guided-card-footer'>\r\n {canSubmit && (\r\n <Button\r\n className={classname('ms-checkout__guided-card-btn-save', { 'is-submitting': isSubmitting })}\r\n title={isVisted ? saveBtnLabel : saveAndContinueBtnLabel}\r\n color='primary'\r\n disabled={isSubmitting}\r\n onClick={onSubmit}\r\n >\r\n {isVisted ? saveBtnLabel : saveAndContinueBtnLabel}\r\n </Button>\r\n )}\r\n {canCancel && (\r\n <Button\r\n className='ms-checkout__guided-card-btn-cancel'\r\n title={cancelBtnLabel}\r\n color='secondary'\r\n onClick={onCancel}\r\n >\r\n {cancelBtnLabel}\r\n </Button>\r\n )}\r\n </div>\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 <Tag className='ms-checkout__guided-card-title'>\r\n <span className='ms-checkout__guided-card-title-step'>{step + 1}. </span>\r\n {text && <span className='ms-checkout__guided-card-title-text'>{text}</span>}\r\n </Tag>\r\n );\r\n };\r\n}\r\n\r\nexport default CheckoutGuidedCard;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * 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 modifyBtnLabel: string;\r\n cancelBtnLabel: string;\r\n saveAndContinueBtnLabel: string;\r\n };\r\n\r\n products: AsyncResult<SimpleProduct[]>;\r\n cart: AsyncResult<ICartState>;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n}\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<ICheckoutGuidedFormProps>}\r\n */\r\n@observer\r\nclass CheckoutGuidedForm extends React.Component<ICheckoutGuidedFormProps> {\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 <div className='ms-checkout__guided-form'>\r\n {items.map((item: React.ReactNode) => {\r\n const childId = this.getId(item);\r\n const step = this.getStep(childId);\r\n const title = this.getHeading(item);\r\n const state = this.props.moduleState.getModule(childId);\r\n const { isReady, isPending, isUpdating, isDisabled, onEdit, onCancel, onSubmit, hasModuleState, hasInitialized } =\r\n state || ({} as IModuleStateManager);\r\n return (\r\n <GuidedCard\r\n key={childId}\r\n step={step}\r\n title={title}\r\n resource={resource}\r\n disabled={!hasModuleState || isDisabled}\r\n isActive={this.isActive(step)}\r\n isVisted={this.isVisted(step)}\r\n isExpanded={this.isExpanded(step)}\r\n isSubmitting={isPending}\r\n isMobile={this.props.isMobile}\r\n isPending={isPending}\r\n isUpdating={isUpdating}\r\n hasInitialized={hasInitialized}\r\n isReady={isReady}\r\n onSubmit={onSubmit}\r\n onCancel={onCancel}\r\n onEdit={onEdit}\r\n onNext={this.onNext}\r\n hasControlGroup={!this.props.disableGuidedCheckoutFlow && hasInitialized}\r\n >\r\n {React.cloneElement(item as React.ReactElement, { enableControl: true })}\r\n </GuidedCard>\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n private 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<void> {\r\n\r\n // Wait for the cart to load -- we need it before we can request attributes\r\n const cart = (await this.props.cart).cart;\r\n if (cart.CartLines && cart.CartLines.length) {\r\n\r\n // Wait for products and attributes to be loaded\r\n // Everything has been requested as early as possible, so these aren't linear events\r\n const attributes = await getAttributesForCart(cart.CartLines, this.props.context.actionContext);\r\n const products = await this.props.products;\r\n const subFrequency = getSubscriptionValues(cart).frequency;\r\n\r\n // Convert to the format the analytics module requires\r\n const mappedProducts = cart.CartLines.map(line => {\r\n const isSubscription = isLineSubscriptionLine(line);\r\n\r\n return {\r\n product: products.find(product => product.RecordId === line.ProductId),\r\n quantity: line.Quantity,\r\n attributes: line.ProductId ? attributes[line.ProductId] : [],\r\n subscription: isSubscription,\r\n frequency: isSubscription && subFrequency,\r\n discounts: line.DiscountLines,\r\n context: this.props.context,\r\n };\r\n });\r\n\r\n publish('checkout', {\r\n step: step + 1, // The cart page is step 0, so start from 1 here\r\n products: mappedProducts,\r\n coupon: cart.Coupons?.map(coupon => coupon.Code).join(','),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport default CheckoutGuidedForm;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * 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<void>;\r\n}\r\n\r\nconst CheckoutPlaceOrderButton: React.FC<ICheckoutPlaceOrderButtonProps> = ({ 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 <Button\r\n className={classnames('ms-checkout__btn-place-order', { 'is-busy': isBusy })}\r\n color='primary'\r\n onClick={onPlaceOrder}\r\n disabled={!canPlaceOrder}\r\n >\r\n {placeOrderText}\r\n </Button>\r\n );\r\n};\r\n\r\nexport default CheckoutPlaceOrderButton;\r\n","import { IActionContext } from '@msdyn365-commerce/core';\r\nimport { getCartState, getCheckoutState } from '@msdyn365-commerce/global-state';\r\n\r\nasync function emptyActiveCart(ctx: IActionContext): Promise<void> {\r\n let cartState;\r\n let checkoutState;\r\n const lineItemIdsToRemove = [];\r\n\r\n try {\r\n cartState = await getCartState(ctx);\r\n checkoutState = await getCheckoutState(ctx);\r\n } catch (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<CartTenderLine> {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n\r\n if (!tenderTypes) {\r\n throw new Error('Fail to get gift card tender line');\r\n }\r\n\r\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayLoyalty);\r\n return {\r\n // @ts-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<CartTenderLine> {\r\n let TenderTypeId = tenderTypeId;\r\n\r\n if (!TenderTypeId) {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n if (!tenderTypes) {\r\n throw new Error('Fail to get gift card tender line');\r\n }\r\n TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayGiftCertificate);\r\n }\r\n\r\n const GiftCardPin = giftCardPin;\r\n const GiftCardExpirationYear = giftCardExpirationYear;\r\n const GiftCardExpirationMonth = giftCardExpirationMonth;\r\n return {\r\n // @ts-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<CartTenderLine> {\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<SalesOrder> => {\r\n const checkoutState = await getCheckoutState(ctx).catch(error => {\r\n throw error;\r\n });\r\n\r\n const cartState = checkoutState.checkoutCart;\r\n\r\n const channelConfiguration = ctx.requestContext.channel;\r\n\r\n if (!cartState || !Object.keys(cartState).length || !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<ISmweCheckoutData> {\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<ISmweCheckoutData>, IModuleStateProps { }\r\n\r\n/**\r\n *\r\n * CheckoutContainer component\r\n * @extends {React.Component<ICheckoutModuleProps>}\r\n */\r\n// @ts-ignore\r\n@withModuleState\r\n@observer\r\nclass Checkout extends React.Component<ICheckoutModuleProps> {\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 && <Heading {...checkoutHeading} className='ms-checkout__title' />\r\n };\r\n\r\n if (isConsentGiven === false) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: <AlertComponent {...{ message: cookieConsentRequiredMessage }} />\r\n };\r\n } else if (!this.cartStatus || this.cartStatus === 'LOADING' || this.isEmptyCart) {\r\n viewProps = {\r\n ...viewProps,\r\n loading: <Waiting className='msc-waiting-circular msc-waiting-lg' />\r\n };\r\n } else if (this.hasError) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: <AlertComponent {...{ message: genericErrorMessage }} />\r\n };\r\n } else {\r\n viewProps = {\r\n ...viewProps,\r\n alert: errorMessage && <AlertComponent {...{ message: errorMessage }} />,\r\n canShow: true,\r\n guidedForm: checkoutInformation ? (\r\n <GuidedFormComponent\r\n {...{\r\n items: checkoutInformation,\r\n moduleState: moduleState,\r\n disableGuidedCheckoutFlow: disableGuidedCheckoutFlow,\r\n resource: resources,\r\n isMobile: isMobile,\r\n isEditor: this.isEditorialMode,\r\n products: this.props.data.products,\r\n cart: this.props.data.cart,\r\n context: this.props.context,\r\n }}\r\n />\r\n ) : (\r\n undefined\r\n ),\r\n orderSummary: getOrderSummary(this.props),\r\n lineItems: getLineItems(this.props),\r\n placeOrderButton: (\r\n <PlaceOrderButtonComponent {...{ placeOrderText, placeOrder: this.onPlaceOrder, canPlaceOrder: this.canPlaceOrder }} />\r\n ),\r\n keepShoppingButton: backToShoppingUrl && (\r\n <Button\r\n className='ms-checkout__btn-keep-shopping msc-btn'\r\n title={backToShopping}\r\n color='secondary'\r\n href={backToShoppingUrl}\r\n >\r\n {backToShopping}\r\n </Button>\r\n )\r\n };\r\n }\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n 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<boolean> {\r\n const checkoutState = await this.props.data.checkout;\r\n const lines = checkoutState.checkoutCart.cart.CartLines || [];\r\n if (lines.length !== 1) { return false; } // you can only checkout with one item\r\n // find the first existing line\r\n const line = lines.find(lineFind => !!lineFind)!;\r\n const isClubItem = this._clubItemIds.find(clubItemId => line.ProductId === +clubItemId);\r\n if (!isClubItem) { return false; }\r\n\r\n return true;\r\n }\r\n\r\n private onPlaceOrder = async (): Promise<void> => {\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<void> {\r\n const checkoutState = await this.props.data.checkout;\r\n const deliveryOptionInput = {\r\n deliveryModeId: this.props.app.config.wineClubDeliveryOption,\r\n shippingAddress: checkoutState.shippingAddress || {}\r\n };\r\n\r\n await checkoutState.checkoutCart.updateCartDeliverySpecification(\r\n deliveryOptionInput\r\n )\r\n .then((response) => {\r\n if (response.status === 'FAILED') {\r\n this.props.moduleState.setHasError(true);\r\n this.props.moduleState.onUpdating();\r\n }\r\n })\r\n .catch(() => {\r\n this.props.moduleState.setHasError(true);\r\n this.props.moduleState.onUpdating();\r\n });\r\n }\r\n\r\n private async _setDefaultSubscriptionFields(): Promise<void> {\r\n const values = getSubscriptionValues(this.props.data.cart.result?.cart);\r\n const cartChanges: CommerceProperty[] = [];\r\n if (!values.name) {\r\n cartChanges.push({\r\n Key: SubscriptionCommerceValues.SUBSCRIPTION_NAME,\r\n Value: {\r\n StringValue: SubscriptionCommerceValues.SUBSCRIPTION_DEFAULT_NAME\r\n }\r\n });\r\n }\r\n if (!values.frequency) {\r\n cartChanges.push({\r\n Key: SubscriptionCommerceValues.SUBSCRIPTION_FREQUENCY,\r\n Value: {\r\n StringValue: this.props.context.app.config.defaultSubscriptionFrequencyId\r\n }\r\n });\r\n }\r\n if (cartChanges.length > 0) {\r\n await updateSubscription(this.props.data.cart, cartChanges, this.props.context);\r\n }\r\n }\r\n}\r\n\r\nexport default Checkout;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * 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","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\ninterface ILabelProps {\n className: string;\n label: string;\n}\n\nconst Label: React.FC<ILabelProps> = ({ className, label }) => <span className={className}>{label}</span>;\n\nexport default Label;\n","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\n const {CarouselProps, Thumbnails, MediaGallery, Modal} = props;\n\n return (\n <Module {...MediaGallery}>\n <Node {...CarouselProps} />\n {Modal}\n {_renderThumbnails(Thumbnails)}\n </Module>\n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n <Node {...ThumbnailsContainerProps}>\n <Node {...SingleSlideCarouselComponentProps}>\n {items && items.map(_renderThumbnailItem)}\n </Node>\n </Node>\n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return (\n <Node {...ThumbnailItemContainerProps}>\n {Picture}\n </Node>\n );\n};\n\nexport default MediaGalleryView;","/*---------------------------------------------------------------------------------------------\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';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n\n}\n\nexport const PromoBannerCloseButton: React.FC<IPromoBannerCloseButton> = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button className='ms-promo-banner__close-button' aria-label={closeButtonAriaLabel} onClick={onClose} {...attributes}>\n <span className='ms-promo-banner__close-button__label' aria-hidden={true}>{label}</span>\n </button>\n );\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC<IPromoBannerLinks> = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return(\n <span className='ms-promo-banner__links'>\n {editableLinks && editableLinks.length ?\n <Msdyn365.Links\n links= {editableLinks}\n editProps={{onTextChange: onTextChange, requestContext: requestContext}}\n />\n : null\n }\n </span>\n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if(!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link,index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'button',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC<IPromoBannerText> = ({ text, onTextChange, requestContext }) => {\n return(\n <Msdyn365.Text\n className='ms-promo-banner__text'\n tag={'span'}\n text={text}\n editProps = {{onEdit: onTextChange, requestContext: requestContext}}\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 { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps ;\n bannerMessages: IBannerMessagesData[];\n PromoBannerTextProps: INodeProps;\n PromoBannerLinksProps: INodeProps;\n CarouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component\n * @extends {React.PureComponent<IPromoBannerProps<IPromoBannerState>>}\n */\nclass PromoBanner extends React.PureComponent<IPromoBannerProps<{}>, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className= '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n className: classnames('ms-promo-banner', className),\n isVisible, // state data\n onDismiss: this._onDismiss, // methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: { className: classnames('ms-promo-banner', className), moduleProps: this.props, role: 'banner' },\n PromoBannerTextProps: {\n tag: PromoBannerText\n },\n PromoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n bannerMessages: bannerMessages,\n activeIndex: activeIndex,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex: activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval: interval,\n hideFlipper: hideFlipper,\n autoplay: autoplay\n },\n closeButton: dismissEnabled && <PromoBannerCloseButton {...{ onClose: this._onDismiss, label: closeButtonLabel, closeButtonAriaLabel, telemetryContent: this.telemetryContent }} />\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if(this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n }\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if(this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if(links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private _previous = (): void => {\n const nextIndex = this._isFirstItem() ? (this.props.config.bannerMessages ? this.props.config.bannerMessages.length - 1 : 0) : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private _isFirstItem = () => this.state.activeIndex === 0;\n\n private _isLastItem = () => this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { PriceComponent } from '@msdyn365-commerce/components';\n\nimport * as React from 'react';\nimport { IGetOrderSummaryInput, IOrderSummary, IPriceContext } from '../../../common/';\n\ninterface ISummaryLineProps {\n priceContext?: IPriceContext;\n name: string;\n label: string;\n value?: number;\n}\n\nconst OrderSummaryLine: React.SFC<ISummaryLineProps> = ({ name, label, value = 0, priceContext }) => (\n <p className={`ms-order-confirmation__order-summary-line-${name}`}>\n <span className={`ms-order-confirmation__order-summary-label`}>{label}</span>\n {priceContext ? (\n <PriceComponent\n {...priceContext}\n className={`ms-order-confirmation__order-summary-price`}\n data={{ price: { CustomerContextualPrice: value } }}\n />\n ) : (\n <span className={`ms-order-confirmation__order-summary-price`}>{value}</span>\n )}\n </p>\n);\n\nexport const getOrderConfirmationOrderSummary = ({\n order,\n priceContext,\n earnedPoints,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n orderSummaryGrandTotalLabel,\n pointsEarnedLabel\n },\n canShip\n}: IGetOrderSummaryInput): IOrderSummary => {\n return {\n orderSummaryProps: { className: 'ms-order-confirmation__order-summary' },\n heading: <p className='ms-order-confirmation__order-summary-heading'>{orderSummaryHeading}</p>,\n subtotal: (\n <OrderSummaryLine\n name='subtotal'\n label={orderSummaryItemsTotalLabel}\n value={order.SubtotalAmount}\n priceContext={priceContext}\n />\n ),\n shipping: canShip ? (\n <OrderSummaryLine name='shipping' label={orderSummaryShippingFeeLabel} value={order.ChargeAmount} priceContext={priceContext} />\n ): '',\n tax: <OrderSummaryLine name='tax-amount' label={orderSummaryTaxLabel} value={order.TaxAmount} priceContext={priceContext} />,\n totalAmount: (\n <OrderSummaryLine\n name='total-amount'\n label={orderSummaryGrandTotalLabel}\n value={order.TotalAmount}\n priceContext={priceContext}\n />\n ),\n earnedPoints: earnedPoints ? <OrderSummaryLine name='earned-points' label={pointsEarnedLabel} value={earnedPoints} /> : undefined\n };\n};\n","//==============================================================================\r\n//==============================================================================\r\nimport { get, groupBy, uniq } from 'lodash';\r\n\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { searchAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { CartLine, ProductProperty, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { IContext } from '@msdyn365-commerce/retail-proxy/dist/Interfaces';\r\n\r\n//==============================================================================\r\n//==============================================================================\r\nexport interface IAttributeList {\r\n [attributeName: string]: string;\r\n}\r\n\r\nexport interface IAttributeBank {\r\n [productId: number]: IAttributeList;\r\n}\r\n\r\n//==============================================================================\r\n//==============================================================================\r\nlet attributeCache: IAttributeBank = {};\r\n\r\n//----------------------------------------------------------\r\n// Given a set of product IDs, return product attributes for\r\n// all of them.\r\n//\r\n// Returns an IAttributeBank, grouped by product ID then\r\n// attribute name.\r\n//----------------------------------------------------------\r\nasync function fetchProductAttributes(productIDs: number[], context: IActionContext): Promise<IAttributeBank> {\r\n\r\n // Fetch product information from retail server\r\n const ctx: IContext = { callerContext: context };\r\n const productSearchCriteria: ProductSearchCriteria = {\r\n Ids: productIDs,\r\n Context: {\r\n ChannelId: context.requestContext.apiSettings.channelId,\r\n CatalogId: context.requestContext.apiSettings.catalogId\r\n },\r\n };\r\n\r\n const result = await searchAsync(ctx, productSearchCriteria);\r\n\r\n // Transform results into a useful format\r\n return result.reduce(\r\n (output, product) => {\r\n const translatedProperties: ProductProperty[] = get(product, 'ProductProperties[0].TranslatedProperties', []);\r\n\r\n // Convert from an array of records to a hash of values\r\n output[product.RecordId] = translatedProperties.reduce(\r\n (attributes, property) => {\r\n if (property.FriendlyName && property.ValueString) {\r\n attributes[property.FriendlyName] = property.ValueString;\r\n }\r\n\r\n return attributes;\r\n },\r\n {} as IAttributeList\r\n );\r\n\r\n return output;\r\n },\r\n {} as IAttributeBank\r\n );\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Given a set of product IDs, return product attributes for\r\n// all of them.\r\n//\r\n// Uses a local cache at the product ID level to prevent\r\n// duplicate requests.\r\n//\r\n// Returns an IAttributeBank, grouped by product ID then\r\n// attribute name.\r\n//----------------------------------------------------------\r\nexport async function getAttributesByProductID(productIDs: number[], context: IActionContext): Promise<IAttributeBank> {\r\n\r\n // Split IDs into cached and uncached groups\r\n const groupedIDs = groupBy(productIDs, id => (attributeCache[id] ? 'cached' : 'uncached'));\r\n\r\n // Fetch products not already in the cache\r\n const uncachedAttributes = groupedIDs.uncached ? await fetchProductAttributes(groupedIDs.uncached, context) : {};\r\n\r\n // Merge new products into the cache\r\n attributeCache = {...attributeCache, ...uncachedAttributes};\r\n\r\n // Add cached entries to the result\r\n const result = uncachedAttributes; // This does nothing except change the name. Referring to the combined result as \"uncached\" is unclear.\r\n groupedIDs.cached && groupedIDs.cached.forEach(id => {\r\n result[id] = attributeCache[id];\r\n });\r\n\r\n return result;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Given an array of cart lines, return product attributes for\r\n// all products in the cart\r\n//----------------------------------------------------------\r\nexport function getAttributesForCart(cartLines: CartLine[], context: IActionContext): Promise<IAttributeBank> {\r\n\r\n // Create a list of product IDs from the cart lines, removing any duplicates\r\n const productIDs = uniq(cartLines.map(line => line.ProductId!));\r\n\r\n // Fetch the attributes for the requested products\r\n return getAttributesByProductID(productIDs, context);\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\r\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore, ISmweCheckoutData } from '../../../modules/smwe-checkout';\r\nimport { brandCodeParser } from '../../../Utilities/brand-code-parser';\r\nimport { ISmweCheckoutProps } from '../definition-extensions/smwe-checkout.ext.props.autogenerated';\r\n\r\nexport const PickUpAtStoreComponent: React.FC<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\r\n <Node {...PickUpAtStore}>\r\n {label}\r\n {location}\r\n </Node>\r\n);\r\n\r\nexport const LineItemComponent: React.FC<{ line: ILineItem; cartItem?: CartLine; context: ICoreContext }> = ({ line: { LineItem, item, pickUpAtStore }, cartItem, context }) => {\r\n let brandCode: string = '';\r\n if (cartItem) {\r\n brandCode = brandCodeParser({ description: cartItem.Description, appContext: context });\r\n }\r\n return (\r\n <Node {...LineItem}>\r\n {brandCode && <div className='msc-cart-line__brand'>{brandCode}</div>}\r\n {item}\r\n {pickUpAtStore && <PickUpAtStoreComponent {...pickUpAtStore} />}\r\n </Node>\r\n );\r\n};\r\n\r\nexport const LineItemGroupComponent: React.FC<{ group: ILineItemDeliveryGroup; props: ISmweCheckoutProps<{}>; data: ISmweCheckoutData; context: ICoreContext }> = (\r\n { group: { LineItemDeliveryGroup, LineItemList, heading, lineItems }, props, data, context }\r\n) => {\r\n const { nonSubscriptionHeader } = props.resources;\r\n return (\r\n <Node {...LineItemDeliveryGroup}>\r\n {heading}\r\n {lineItems.length > 0 &&\r\n <Node {...LineItemList}>\r\n <div className='ms-checkout__line-items-list-title'>{nonSubscriptionHeader}</div>\r\n {lineItems.map(lineItem => {\r\n // get the item and send it to the component\r\n const item = data.checkout.result?.checkoutCart.cart.CartLines?.find(cartItem => cartItem.LineId === lineItem.LineId);\r\n return (\r\n <LineItemComponent key={lineItem.LineId} line={lineItem} cartItem={item} context={context} />\r\n );\r\n })}\r\n </Node>\r\n }\r\n </Node>\r\n );\r\n};\r\n\r\nexport const LineItemsComponent: React.FC<{ lineItems: ILineItems; props: ISmweCheckoutProps<{}>; data: ISmweCheckoutData; context: ICoreContext }> = (\r\n { lineItems: { LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForSubscription, subscriptionHeader },\r\n props,\r\n data,\r\n context }\r\n) => (\r\n <Node {...LineItems}>\r\n <Node {...Header}>\r\n {heading}\r\n {editLink}\r\n </Node>\r\n {itemsForPickup && <LineItemGroupComponent group={itemsForPickup} props={props} data={data} context={context} />}\r\n {itemsForShip && <LineItemGroupComponent group={itemsForShip} props={props} data={data} context={context} />}\r\n {itemsForSubscription && itemsForSubscription.length > 0 &&\r\n <Node className='ms-checkout__line-items-list'>\r\n <div className='ms-checkout__line-items-list-title'>{subscriptionHeader}</div>\r\n {itemsForSubscription.map((lineItem: ILineItem) => {\r\n // get the item and send it to the component\r\n const item = data.checkout.result?.checkoutCart.cart.CartLines?.find(cartItem => cartItem.LineId === lineItem.LineId);\r\n return (\r\n <LineItemComponent key={lineItem.LineId} line={lineItem} cartItem={item} context={context} />\r\n );\r\n })}\r\n </Node>\r\n }\r\n </Node>\r\n);\r\n\r\nconst OrderSummaryComponent: React.FC<IOrderSummary> = ({ heading, lines }) => (\r\n <div className='msc-order-summary-wrapper'>\r\n {heading}\r\n <div className='msc-order-summary__items'>\r\n {lines && (\r\n <>\r\n {lines.subtotal}\r\n {lines.shipping}\r\n {lines.tax}\r\n {lines.totalDiscounts}\r\n {lines.loyalty}\r\n {lines.giftCard}\r\n {lines.orderTotal}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n);\r\n\r\nconst CheckoutView: React.FC<ICheckoutViewProps & ISmweCheckoutProps<{}>> = props => {\r\n const {\r\n canShow,\r\n checkoutProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n loading,\r\n alert,\r\n guidedForm,\r\n orderSummary,\r\n lineItems,\r\n placeOrderButton,\r\n data,\r\n context\r\n } = props;\r\n return (\r\n <Module {...checkoutProps}>\r\n {loading}\r\n {alert}\r\n {canShow && (\r\n <>\r\n <Node {...mainProps}>\r\n {guidedForm}\r\n <Node {...mainControlProps}>\r\n {placeOrderButton}\r\n </Node>\r\n </Node>\r\n <Node {...sideProps}>\r\n {orderSummary && <OrderSummaryComponent {...orderSummary} />}\r\n {lineItems && <LineItemsComponent lineItems={lineItems} props={props} data={data} context={context} />}\r\n </Node>\r\n </>\r\n )}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default CheckoutView;\r\n","/*---------------------------------------------------------------------------------------------\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<IAlertProps> = ({ message }) => (\n <p className='ms-checkout__error-message' role='alert' aria-live='assertive'>\n {message}\n </p>\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<IForm> = ({ formProps, label, inputPinLabel, inputExpLabel, alert, inputProps, inputNumProps,\n inputPinProps, inputExpProps, inputNumber, inputPin, inputExp, applyButton, supportExternalGiftCard, showGiftCardPinInput, showGiftCardExpInput, alertFieldLabel }) => (\n <Node {...formProps}>\n {alert}\n {supportExternalGiftCard ?\n <Node {...inputProps}>\n <Node {...inputNumProps}>\n {label}\n {inputNumber}\n </Node>\n {showGiftCardPinInput &&\n <Node {...inputPinProps}>\n {inputPinLabel}\n {inputPin}\n </Node>\n }\n {showGiftCardExpInput &&\n <Node {...inputExpProps}>\n {inputExpLabel}\n {inputExp}\n </Node>\n }\n {(showGiftCardPinInput || showGiftCardExpInput) && alertFieldLabel}\n </Node>\n : <>{label}{inputNumber}</>\n }\n {applyButton}\n </Node>\n);\n\nexport const SelectedGiftCard: React.FC<IItem> = ({ itemProps, selectedGiftCard, removeButton }) => (\n <Node {...itemProps}>\n {selectedGiftCard}\n {removeButton}\n </Node>\n);\n\nexport const GiftCardList: React.FC<IList> = ({ listProps, list }) => (\n <Node {...listProps}>\n {list.map(({ id, ...item }) => (\n <SelectedGiftCard key={id} {...item} />\n ))}\n </Node>\n);\n\nexport const AddResource: React.FC<IAddResource> = ({ form, list }) => (\n <>\n {form && <From {...form} />}\n {list && <GiftCardList {...list} />}\n </>\n);\n\nexport const ShowResource: React.FC<IShowResource> = ({ title, list }) => (\n <>\n {title}\n {list && <GiftCardList {...list} />}\n </>\n);\n\nconst CheckoutGiftCardView: React.FC<ICheckoutGiftCardViewProps> = props => {\n const { checkoutGiftCardProps, showGiftCard, addGiftCard } = props;\n return (\n <Module {...checkoutGiftCardProps}>\n {showGiftCard && <ShowResource {...showGiftCard} />}\n {addGiftCard && <AddResource {...addGiftCard} />}\n </Module>\n );\n};\n\nexport default CheckoutGiftCardView;\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 {\n IGroup,\n IGroupDelivery,\n IGroups,\n IOrderConfirmationViewProps,\n IOrderInformation,\n ISalesLine\n} from './order-confirmation';\n\nimport {\n IHelp,\n IOrderSummary,\n IPaymentMethods,\n\n} from '../../common';\n\nexport const OrderConfirmationOrderInfomation: React.FC<IOrderInformation> = ({\n orderInformationProps,\n receiptEmail,\n createdDate,\n channelReferenceId\n}) => (\n <Node {...orderInformationProps}>\n {createdDate}\n {channelReferenceId}\n {receiptEmail}\n </Node>\n );\n\nexport const OrderConfirmationSalesLine: React.FC<ISalesLine> = ({ salesLineProps, salesLine, buyAgainButton }) => (\n <Node {...salesLineProps}>\n {salesLine}\n </Node>\n);\n\nexport const OrderConfirmationGroupDelivery: React.FC<IGroupDelivery> = ({ deliveryProps, heading, count, processing, address, trackingInfo, pickupDateTimeslot }) => (\n <Node {...deliveryProps}>\n {heading}\n {address}\n {pickupDateTimeslot}\n </Node>\n);\n\nexport const OrderConfirmationGroup: React.FC<IGroup> = ({ groupProps, delivery, salesLinesProps, salesLines }) => (\n <Node {...groupProps}>\n {delivery && <OrderConfirmationGroupDelivery {...delivery} />}\n {delivery && delivery.shippingItemsToYou}\n {salesLines && (\n <Node {...salesLinesProps}>\n {salesLines.map(salesLine => (\n <OrderConfirmationSalesLine key={salesLine.data.salesLine.LineId} {...salesLine} />\n ))}\n </Node>\n )}\n </Node>\n);\n\nexport const OrderConfirmationGroups: React.FC<IGroups> = ({ groupsProps, groups }) => (\n <Node {...groupsProps}>\n {groups.map((group, index) => (\n <OrderConfirmationGroup key={index} {...group} />\n ))}\n </Node>\n);\n\nexport const OrderConfirmationOrderSummary: React.FC<IOrderSummary> = ({ orderSummaryProps, heading, subtotal, shipping, tax, totalAmount, earnedPoints }) => (\n <Node {...orderSummaryProps}>\n {heading}\n {subtotal}\n {shipping}\n {tax}\n {totalAmount}\n {earnedPoints}\n </Node>\n);\n\nexport const OrderConfirmationPayment: React.FC<IPaymentMethods> = ({ paymentMethodsProps, title, methods }) => (\n <Node {...paymentMethodsProps}>\n {title}\n {methods}\n </Node>\n);\n\nexport const OrderConfirmationHelp: React.FC<IHelp> = ({ helpProps, needHelpLabel, helpLineNumberLabel, contactNumber }) => (\n <Node {...helpProps}>\n {needHelpLabel}\n {helpLineNumberLabel}\n {contactNumber}\n </Node>\n);\n\nconst OrderConfirmationView: React.FC<IOrderConfirmationViewProps> = ({\n moduleProps,\n heading,\n backToShoppingLink,\n alert,\n loading,\n orderInfomation,\n orderSummary,\n payment,\n help,\n groups\n}) => {\n return (\n <Module {...moduleProps}>\n {heading}\n {alert}\n {loading}\n {orderInfomation && <OrderConfirmationOrderInfomation {...orderInfomation} />}\n {backToShoppingLink}\n {groups && <OrderConfirmationGroups {...groups} />}\n {payment && <OrderConfirmationPayment {...payment} />}\n {orderSummary && <OrderConfirmationOrderSummary {...orderSummary} />}\n {help && <OrderConfirmationHelp {...help} />}\n </Module>\n );\n};\n\nexport default OrderConfirmationView;\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Alert, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IDictionary } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ICartlinesViewProps } from './components/smwe-cart-line-items';\r\nimport { ICartViewProps } from './smwe-cart';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean,\r\n itemsTitle: string,\r\n qtyTitle: string,\r\n unitPriceTitle: string,\r\n totalTitle: string\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus}</>;\r\n }\r\n if (cartLines) {\r\n return (\r\n <table>\r\n <tr className='cart-lineitems-header'>\r\n <th className='header-items' tabIndex={0}>{itemsTitle}</th>\r\n <th className='header-qty' tabIndex={0}>{qtyTitle}</th>\r\n <th className='header-unitprice' tabIndex={0}>{unitPriceTitle}</th>\r\n <th className='header-total' tabIndex={0}>{totalTitle}</th>\r\n </tr>\r\n <tbody>\r\n <div className='cart-lineitems-container'>\r\n {cartLines.map((cartLine, index) => {\r\n return (\r\n <div className='msc-cart-lines-item' key={index}>\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n <Node {...cartLine.pickUpInStore.ContainerProps}>\r\n {cartLine.pickUpInStore.defaultComponent}\r\n </Node>\r\n ) : null}\r\n {cartLine.addToWishlist}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </tbody>\r\n </table>\r\n );\r\n } else {\r\n return cartDataResult ? (\r\n <div className='msc-cart__empty-cart'>\r\n <p className='msc-cart-line'>{cartEmptyText}</p>\r\n {backToShoppingButton}\r\n </div>\r\n ) : (\r\n <>{waitingComponent}</>\r\n );\r\n }\r\n};\r\n\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n return (\r\n <Node {...OrderSummaryItems}>\r\n {orderSummaryLines.subtotal}\r\n {orderSummaryLines.shipping}\r\n {orderSummaryLines.tax}\r\n {orderSummaryLines.totalDiscounts\r\n ? orderSummaryLines.totalDiscounts\r\n : null}\r\n {orderSummaryLines.orderTotal}\r\n <p className='cart-order-summary-asterix'>{props.resources.conditionsText}</p>\r\n </Node>\r\n );\r\n};\r\n\r\n// Detect invalid items in the cart. Items are flagged externally via the Comment field\r\nconst _isInvalidCart = (cartLinesInvalid: IDictionary<boolean>): boolean => {\r\n\r\n for (const lineId of Object.keys(cartLinesInvalid)) {\r\n if (cartLinesInvalid[lineId]) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n//==================================================\r\n//==================================================\r\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => {\r\n const preventCheckout = _isInvalidCart(props.cartLineStatus) || props.mixedCart.isMixedCart;\r\n\r\n return (\r\n <div\r\n className={props.className}\r\n id={props.id}\r\n {...props.renderModuleAttributes(props)}\r\n >\r\n {props.title}\r\n <Alert isOpen={props.cartlines !== undefined && props.mixedCart && props.mixedCart.isMixedCart} className='cart-error' color='danger' assertive={true} >\r\n <div className='cart-error-wrapper'>\r\n <div className='msc-alert__header' aria-hidden='true'>\r\n <span className='msi-exclamation-triangle' />\r\n <span>{props.resources.mixModeCartError}</span>\r\n </div>\r\n </div>\r\n </Alert>\r\n <Node {...props.CartlinesWrapper}>\r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult,\r\n props.resources.itemsTitle,\r\n props.resources.qtyTitle,\r\n props.resources.unitPriceTitle,\r\n props.resources.totalTitle\r\n )}\r\n </Node>\r\n {props.content &&\r\n props.content.map(\r\n (contentSlotData: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {contentSlotData}\r\n </div>\r\n );\r\n }\r\n )}\r\n {props.orderSummaryHeading && (\r\n <Node {...props.OrderSummaryWrapper}>\r\n {_renderOrderSummarylines(\r\n props.orderSummaryLineitems,\r\n props.OrderSummaryItems,\r\n props\r\n )}\r\n <Node className='checkout-btn-wrap'>\r\n {props.backToShoppingButton}\r\n {preventCheckout ? props.checkoutButtonDisabled : props.checkoutAsSignInUserButton}\r\n </Node>\r\n <div className='promo-code-wrap'>\r\n {props.promoCode}\r\n </div>\r\n </Node>\r\n )}\r\n {props.storeSelector}\r\n </div>\r\n );\r\n};\r\n\r\nexport default CartView;","/*---------------------------------------------------------------------------------------------\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<void>;\n}\n\nconst CheckoutPlaceOrderButton: React.FC<ICheckoutPlaceOrderButtonProps> = ({ 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 <Button\n className={classnames('ms-checkout__btn-place-order', { 'is-busy': isBusy })}\n color='primary'\n onClick={onPlaceOrder}\n title={checkoutBtnText}\n {...attributes}\n disabled={!canPlaceOrder}\n >\n {checkoutBtnText}\n </Button>\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IGroup, IGroupDelivery, IGroups, IHeader, IList, IOrderHistoryViewProps, IOrderInformation, ISalesOrder } from './order-history';\n\nexport const OrderHistoryOrderInfomation: React.FC<IOrderInformation> = ({\n orderInformationProps,\n salesId,\n receiptId,\n channelName,\n createdDate,\n count,\n amount,\n channelReferenceId\n}) => (\n <Node {...orderInformationProps}>\n {channelName}\n {salesId}\n {receiptId}\n {createdDate}\n {count}\n {amount}\n {channelReferenceId}\n </Node>\n );\n\nexport const OrderHistoryGroupDelivery: React.FC<IGroupDelivery> = ({ deliveryProps, heading, count, processing, address, trackingInfo }) => (\n <Node {...deliveryProps}>\n {heading}\n {count}\n {processing}\n {address}\n {trackingInfo}\n </Node>\n);\n\nexport const OrderHistoryGroup: React.FC<IGroup> = ({ groupProps, delivery, salesLinesProps, salesLines }) => (\n <Node {...groupProps}>\n {delivery && <OrderHistoryGroupDelivery {...delivery} />}\n {salesLines && (\n <Node {...salesLinesProps}>\n {salesLines.map(salesLine => (\n <React.Fragment key={salesLine.data.salesLine.LineId}>{salesLine.salesLine}</React.Fragment>\n ))}\n </Node>\n )}\n </Node>\n);\n\nexport const OrderHistoryGroups: React.FC<IGroups> = ({ groupsProps, groups }) => (\n <Node {...groupsProps}>\n {groups.map((group, index) => (\n <OrderHistoryGroup key={index} {...group} />\n ))}\n </Node>\n);\n\nexport const OrderHistoryHeader: React.FC<IHeader> = ({ headerProps, heading, orderCountLabel, extraActions }) => (\n <Node {...headerProps}>\n {heading}\n {orderCountLabel}\n {extraActions}\n </Node>\n);\n\nexport const OrderHistorySalesOder: React.FC<ISalesOrder> = ({ salesOrderProps, orderInfomation, groups, orderDetailsLink }) => (\n <Node {...salesOrderProps}>\n {orderInfomation && <OrderHistoryOrderInfomation {...orderInfomation} />}\n {groups && <OrderHistoryGroups {...groups} />}\n {orderDetailsLink}\n </Node>\n);\n\nexport const OrderHistoryList: React.FC<IList> = ({ listProps, salesOrders }) => (\n <Node {...listProps}>{salesOrders && salesOrders.map((salesOrder, index) => <OrderHistorySalesOder key={index} {...salesOrder} />)}</Node>\n);\n\nconst OrderHistoryView: React.FC<IOrderHistoryViewProps> = ({\n orderHistoryProps,\n header,\n alert,\n loading,\n emptyMessage,\n backToShoppingLink,\n list,\n moreButton\n}) => (\n <Module {...orderHistoryProps}>\n {header && <OrderHistoryHeader {...header} />}\n {loading}\n {alert && (\n <>\n {alert}\n {backToShoppingLink}\n </>\n )}\n {emptyMessage && (\n <>\n {emptyMessage}\n {backToShoppingLink}\n </>\n )}\n {list && <OrderHistoryList {...list} />}\n {moreButton && moreButton}\n </Module>\n );\n\nexport default OrderHistoryView;\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 { ICarouselViewProps } from '@msdyn365-commerce-modules/carousel/src/modules/carousel/./carousel';\r\nimport { Carousel } from '@msdyn365-commerce/components';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nconst CarouselView: React.FC<ICarouselViewProps> = props => (\r\n <React.Fragment>\r\n <Carousel\r\n className={classnames(props.closeAnimation, props.config.className)}\r\n activeIndex={props.activeIndex}\r\n next={props.next}\r\n previous={props.previous}\r\n pause={props.config.pauseOnHover ? 'hover' : false}\r\n ride={props.config.autoplay ? 'carousel' : undefined}\r\n autoplay={props.config.autoplay}\r\n interval={props.config.interval}\r\n transitionType={(props.config.transitionType) ? props.config.transitionType : undefined}\r\n items={props.slots && props.slots.content && props.slots.content.length ? props.slots.content : []}\r\n hideFlipper={props.config.hideFlipper}\r\n dismissEnabled={props.config.dismissEnabled}\r\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\r\n handleDismissCarousel={props.handleDismissCarousel}\r\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\r\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\r\n directionTextPrev={props.resources && props.resources.flipperPrevious}\r\n directionTextNext={props.resources && props.resources.flipperNext}\r\n handleOnExited={props.handleOnExited}\r\n handleOnExiting={props.handleOnExiting}\r\n />\r\n </React.Fragment>\r\n);\r\n\r\nexport default CarouselView;\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 { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { ICarouselData } from './carousel.data';\nimport { ICarouselProps } from './carousel.props.autogenerated';\nimport { ICarouselState } from './carousel.state';\n\nexport interface ICarouselViewProps extends ICarouselProps<{}>, ICarouselState {\n closeAnimation: string;\n carouselContainer: IModuleProps;\n telemetryContent: ITelemetryContent;\n next(): void;\n previous(): void;\n onIndicatorsClickHandler():void;\n handleDismissCarousel(): void;\n handleOnExited(): void;\n handleOnExiting(): void;\n}\n\n/**\n *\n * CarouselModule component\n * @extends {React.PureComponent<ICarouselProps<ICarouselData>>}\n */\nclass CarouselModule extends React.PureComponent<ICarouselProps<ICarouselData>, ICarouselState> {\n private animating: boolean;\n private telemetryContent: ITelemetryContent;\n\n constructor(props: ICarouselProps<ICarouselData>, state: ICarouselState) {\n super(props);\n this.state = { activeIndex: 0, closeNow: false, dismissCarousel: false };\n this.animating = false;\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n }\n\n public componentDidMount(): void {\n if(this.props.context && this.props.context.request && this.props.context.request.cookies) {\n if (this.props.context.request.cookies.get(`CarouselDismiss_${this.props.id}`) === undefined) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'false');\n this.setState({ dismissCarousel: false });\n }\n }\n }\n\n public render(): JSX.Element | null {\n if (this.state.dismissCarousel) {\n return null;\n }\n\n const { className } = this.props.config;\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n ...this.state,\n telemetryContent: this.telemetryContent,\n carouselContainer: {\n moduleProps: this.props,\n className: classnames('ms-carousel', className)\n },\n closeAnimation: this.state.closeNow ? 'close-now' : '',\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n handleDismissCarousel: this._handleDismissCarousel,\n handleOnExited: this._onExited,\n handleOnExiting: this._onExiting};\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * function implementation to dismiss the Carousel\n */\n private _handleDismissCarousel = (): void => {\n if(this.props.context && this.props.context.request && this.props.context.request.cookies) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'true');\n this.setState({ dismissCarousel: true });\n }\n }\n\n /**\n * function implementation to move to next slide\n */\n private _next = (): void => {\n const { slots } = this.props;\n const nextIndex = this.state.activeIndex === (slots && slots.content && slots.content.length - 1) ? 0 : this.state.activeIndex + 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n }\n\n /**\n * function implementation to move to previous slide\n */\n private _previous = (): void => {\n const slots = this.props.slots && this.props.slots.content;\n const nextIndex = this.state.activeIndex === 0 ? (slots ? slots.length - 1 : 0) : this.state.activeIndex - 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n }\n\n private _onExiting = (): void => {\n this.animating = true;\n }\n\n private _onExited = (): void => {\n this.animating = false;\n this.setState({ closeNow: false });\n }\n\n /**\n * function implementation to move to a given slide\n */\n private _goToIndex = (newIndex: number): void => {\n if (this.animating) { return; }\n this.setState({ activeIndex: newIndex });\n }\n}\n\nexport default CarouselModule;\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<ICheckoutData>): 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 <Msdyn365.Text\n className='msc-order-summary__heading'\n {...orderSummaryHeading}\n tag={orderSummaryHeading.tag || 'h2'}\n text={orderSummaryHeading.text}\n editProps={{ onEdit: handleOrderSummaryHeadingChange, requestContext: context.request }}\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","/*---------------------------------------------------------------------------------------------\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 { IGetHelpInput, IHelp } from '@msdyn365-commerce-modules/order-management';\r\nimport * as React from 'react';\r\n\r\nexport const getOrderDetailsHelp = ({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel }: IGetHelpInput): IHelp => ({\r\n helpProps: { className: 'ms-order-details__help' },\r\n needHelpLabel: <p className='ms-order-details__help-title'>{needHelpLabel}</p>,\r\n helpLineNumberLabel: <span className='ms-order-details__help-label'>{helpLineNumberLabel}</span>,\r\n contactNumber: (\r\n <a className='ms-order-details__help-content-number' aria-label={helpLineContactAriaLabel} href={`tel:${contactNumber}`}>\r\n {contactNumber}\r\n </a>\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 { PriceComponent } from '@msdyn365-commerce/components';\r\n\r\nimport { IGetOrderSummaryInput, IOrderSummary, IPriceContext } from '@msdyn365-commerce-modules/order-management';\r\nimport * as React from 'react';\r\n\r\ninterface ISummaryLineProps {\r\n priceContext?: IPriceContext;\r\n name: string;\r\n label: string;\r\n value?: number;\r\n}\r\n\r\nconst OrderSummaryLine: React.SFC<ISummaryLineProps> = ({ name, label, value = 0, priceContext }) => (\r\n <p className={`ms-order-details__order-summary-line-${name}`}>\r\n <span className={`ms-order-details__order-summary-label`}>{label}</span>\r\n {priceContext ? (\r\n <PriceComponent\r\n {...priceContext}\r\n className={`ms-order-details__order-summary-price`}\r\n data={{ price: { CustomerContextualPrice: value } }}\r\n />\r\n ) : (\r\n <span className={`ms-order-details__order-summary-price`}>{value}</span>\r\n )}\r\n </p>\r\n);\r\n\r\nexport const getOrderDetailsOrderSummary = ({\r\n order,\r\n priceContext,\r\n earnedPoints,\r\n resource: {\r\n orderSummaryHeading,\r\n orderSummaryItemsTotalLabel,\r\n orderSummaryShippingFeeLabel,\r\n orderSummaryTaxLabel,\r\n orderSummaryGrandTotalLabel,\r\n pointsEarnedLabel\r\n }\r\n}: IGetOrderSummaryInput): IOrderSummary => {\r\n return {\r\n orderSummaryProps: { className: 'ms-order-details__order-summary' },\r\n heading: <p className='ms-order-details__order-summary-heading'>{orderSummaryHeading}</p>,\r\n subtotal: (\r\n <OrderSummaryLine\r\n name='subtotal'\r\n label={orderSummaryItemsTotalLabel}\r\n value={order.SubtotalAmount}\r\n priceContext={priceContext}\r\n />\r\n ),\r\n shipping: (\r\n <OrderSummaryLine name='shipping' label={orderSummaryShippingFeeLabel} value={order.ChargeAmount} priceContext={priceContext} />\r\n ),\r\n tax: <OrderSummaryLine name='tax-amount' label={orderSummaryTaxLabel} value={order.TaxAmount} priceContext={priceContext} />,\r\n totalAmount: (\r\n <OrderSummaryLine\r\n name='total-amount'\r\n label={orderSummaryGrandTotalLabel}\r\n value={order.TotalAmount}\r\n priceContext={priceContext}\r\n />\r\n ),\r\n earnedPoints: earnedPoints ? <OrderSummaryLine name='earned-points' label={pointsEarnedLabel} value={earnedPoints} /> : 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 { IPaymentMethods, IPaymentMethodsInput } from '@msdyn365-commerce-modules/order-management';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { TenderLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport * as React from 'react';\r\n\r\nconst getLastFourDigit = (digits = '') => digits.substr(-4);\r\n\r\nexport const getOrderDetailsPaymentMethods = ({\r\n priceContext,\r\n tenderLines,\r\n tenderIdOperationIdMap,\r\n resource: { paymentMethodsTitle, creditCardEndingLabel, giftCardEndingLabel, amountCoveredLabel, loyaltyCardUsedLabel, cashUsedLabel }\r\n}: IPaymentMethodsInput): IPaymentMethods => {\r\n const getCard = (tenderLine: TenderLine) => (\r\n <div className='ms-order-details__payment-methods-line' key={tenderLine.TenderTypeId}>\r\n <p className='ms-order-details__payment-methods-card'>\r\n {`${tenderLine.CardTypeId} ${creditCardEndingLabel} ${getLastFourDigit(tenderLine.MaskedCardNumber)}`}\r\n </p>\r\n </div>\r\n );\r\n\r\n const getGiftCertificate = (tenderLine: TenderLine) => (\r\n <div className='ms-order-details__payment-methods-line' key={tenderLine.TenderTypeId}>\r\n <p className='ms-order-details__payment-methods-gift-card-number'>\r\n {giftCardEndingLabel} {getLastFourDigit(tenderLine.GiftCardId)}\r\n </p>\r\n <p className='ms-order-details__payment-methods-gift-card-amount-info'>\r\n {amountCoveredLabel}\r\n <PriceComponent\r\n {...priceContext}\r\n className='ms-order-details__payment-methods-gift-card-amount'\r\n data={{price: { CustomerContextualPrice: tenderLine.Amount || 0 }}}\r\n />\r\n </p>\r\n </div>\r\n );\r\n\r\n const getLoyalty = (tenderLine: TenderLine) => (\r\n <div className='ms-order-details__payment-methods-line' key={tenderLine.TenderTypeId}>\r\n <p className='ms-order-details__payment-methods-loyalty-number'>\r\n {loyaltyCardUsedLabel} {tenderLine.LoyaltyCardId}\r\n </p>\r\n <p className='ms-order-details__payment-methods-loyalty-amount-info'>\r\n {amountCoveredLabel}\r\n <PriceComponent\r\n {...priceContext}\r\n className='ms-order-details__payment-methods-loyalty-amount'\r\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 }}}\r\n />\r\n </p>\r\n </div>\r\n );\r\n\r\n const getCash = (tenderLine: TenderLine) => (\r\n <div className='ms-order-details__payment-methods-line' key={tenderLine.TenderTypeId}>\r\n <p className='ms-order-details__payment-methods-cash'>{cashUsedLabel}</p>\r\n <p className='ms-order-details__payment-methods-cash-amount-info'>\r\n {amountCoveredLabel}\r\n <PriceComponent\r\n {...priceContext}\r\n className='ms-order-details__payment-methods-cash-amount'\r\n data={{ price: {CustomerContextualPrice: tenderLine.Amount || 0 }}}\r\n />\r\n </p>\r\n </div>\r\n );\r\n\r\n return {\r\n paymentMethodsProps: { className: 'ms-order-details__payment-methods' },\r\n title: <div className='ms-order-details__payment-methods-title'>{paymentMethodsTitle}</div>,\r\n methods: tenderLines.reduce((lines: React.ReactNode[], tenderLine) => {\r\n if (!tenderLine.TenderTypeId) {\r\n return lines;\r\n }\r\n switch (tenderIdOperationIdMap[tenderLine.TenderTypeId]) {\r\n case 201:\r\n lines.push(getCard(tenderLine));\r\n break;\r\n case 214:\r\n lines.push(getGiftCertificate(tenderLine));\r\n break;\r\n case 207:\r\n lines.push(getLoyalty(tenderLine));\r\n break;\r\n case 200:\r\n lines.push(getCash(tenderLine));\r\n break;\r\n default:\r\n // do nothing\r\n }\r\n return lines;\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 { Address as IAddress } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\n\r\nexport type addressType = 'store' | 'ship';\r\n\r\nexport interface IShippingAddressProps {\r\n moduleName: string;\r\n address: IAddress;\r\n deliveryType: string;\r\n showCompleteAddress?: boolean;\r\n resource: {\r\n shipToLabel: string;\r\n storeLabel: string;\r\n phoneLabel: string;\r\n phoneAriaLabel: string;\r\n };\r\n}\r\n\r\nconst Address: React.SFC<IShippingAddressProps> = ({\r\n moduleName,\r\n address,\r\n deliveryType,\r\n showCompleteAddress,\r\n resource: { shipToLabel, storeLabel, phoneLabel }\r\n}) => (\r\n <div className={`${moduleName}__address deliveryType-${deliveryType}`}>\r\n <div className={`${moduleName}__address-header`}>{deliveryType !== 'ship' ? storeLabel : shipToLabel}</div>\r\n {address.Name && <span className={`${moduleName}__address-name`}>{address.Name}</span>}\r\n {showCompleteAddress ?\r\n (<>\r\n {address.Street && <span className={`${moduleName}__address-street`}>{address.Street} </span>}\r\n {address.City && <span className={`${moduleName}__address-city`}>{address.City}</span>}\r\n {address.State && <span className={`${moduleName}__address-state`}>{`, ${address.State}`}</span>}\r\n {address.County && <span className={`${moduleName}__address-county`}>{`, ${address.County}`}</span>}\r\n {address.ZipCode && <span className={`${moduleName}__address-zipcode`}>{` ${address.ZipCode}`}</span>}\r\n {address.ThreeLetterISORegionName && <span className={`${moduleName}__address-threeletterisoregionname`}>{` ${address.ThreeLetterISORegionName}`}</span>}\r\n {address.Phone && (\r\n <span className={`${moduleName}__address-phone`}>\r\n <span className={`${moduleName}__address-phone-label`}>{phoneLabel}</span>\r\n <span className={`${moduleName}__address-phone-icon`} aria-hidden='true' />\r\n {address.Phone}\r\n </span>\r\n )}\r\n </>) : address.FullAddress && <span className={`${moduleName}__address-full-address`}>{address.FullAddress}</span>}\r\n </div>\r\n );\r\n\r\nexport default React.memo(Address);\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\ninterface ILabelProps {\r\n className: string;\r\n label: string;\r\n}\r\n\r\nconst Label: React.FC<ILabelProps> = ({ className, label }) => <span className={className}>{label}</span>;\r\n\r\nexport default Label;\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 { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { IAny, ICoreContext, IGeneric, IImageSettings, IModule, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { SalesLine, TenderType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport groupBy from 'lodash/groupBy';\r\nimport { ISalesLine } from './get-sales-line';\r\n\r\nexport interface IModuleComponentProps extends IModule {\r\n config: {\r\n imageSettings?: IImageSettings;\r\n showShippingChargesForLineItems?: boolean;\r\n };\r\n}\r\n\r\nexport interface IPriceContext {\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n telemetry: ITelemetry;\r\n freePriceText: string;\r\n}\r\n\r\nexport const getTenderIdOperationIdMap = (tenderTypes: TenderType[]): object => {\r\n return tenderTypes.reduce((map, tenderType) => {\r\n if (tenderType.TenderTypeId) {\r\n map[tenderType.TenderTypeId] = tenderType.OperationId;\r\n }\r\n return map;\r\n }, {});\r\n};\r\n\r\nexport const countItems = (salesLines: SalesLine[]) => {\r\n return salesLines.reduce((count, salesLine) => {\r\n return count + (salesLine.Quantity || 0);\r\n }, 0);\r\n};\r\n\r\nexport const getSalesLinesByDelivery = (salesLines?: SalesLine[], pickupDeliveryModeCode?: string): SalesLine[] => {\r\n if (!salesLines || !salesLines.length) {\r\n return [];\r\n }\r\n return salesLines.filter(salesLine =>\r\n // isPickUp ? getPickUp : getOthers\r\n (pickupDeliveryModeCode && pickupDeliveryModeCode !== '') ? salesLine.DeliveryMode === pickupDeliveryModeCode : salesLine.DeliveryMode !== pickupDeliveryModeCode\r\n );\r\n};\r\n\r\nexport const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=80&h=80&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=147&h=147&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n};\r\n\r\nexport type IDeliveryType = 'pickUp' | 'ship' | 'carryOut' | 'email';\r\n\r\nexport type ISalesStatusCode = 'canceled' | 'readyForPickup' | 'pickedUp' | 'processing' | 'shipped' | 'unknown' | 'emailed';\r\n\r\nexport const getSalesStatusCode = (deliveryType: string, statusValue?: number, pickupMode?: string): ISalesStatusCode => {\r\n if (statusValue === 7) {\r\n return 'canceled';\r\n }\r\n\r\n if (pickupMode !== undefined) {\r\n switch (statusValue) {\r\n case 3:\r\n return 'readyForPickup';\r\n case 4:\r\n return 'pickedUp';\r\n default:\r\n return 'processing';\r\n }\r\n }\r\n if (deliveryType === 'pickUp') {\r\n switch (statusValue) {\r\n case 3:\r\n return 'readyForPickup';\r\n case 4:\r\n return 'pickedUp';\r\n default:\r\n return 'processing';\r\n }\r\n } else if (deliveryType === 'ship') {\r\n switch (statusValue) {\r\n case 3:\r\n return 'processing';\r\n case 4:\r\n return 'shipped';\r\n default:\r\n return 'processing';\r\n }\r\n } else if (deliveryType === 'email') {\r\n switch (statusValue) {\r\n case 3:\r\n return 'processing';\r\n case 4:\r\n return 'emailed';\r\n default:\r\n return 'processing';\r\n }\r\n } else if (deliveryType === 'carryOut') {\r\n return 'processing';\r\n } else {\r\n return 'unknown';\r\n }\r\n};\r\n\r\nexport type ITrackingId = string | 'unknown';\r\nexport type IAddressId = string | 'unknown';\r\n\r\nexport interface IGroupData {\r\n deliveryType: IDeliveryType;\r\n salesStatus: ISalesStatusCode;\r\n addressId: IAddressId | 'unknown';\r\n trackingId: ITrackingId | 'unknown';\r\n count: number;\r\n salesLines: ISalesLine[];\r\n}\r\n\r\nexport const groupSalesLines = (salesLines: ISalesLine[]): IGroupData[] => {\r\n const getGroupByDeliveryType = (items: ISalesLine[]) => groupBy(items, item => item.data.deliveryType);\r\n const getGroupBySalesStatusCode = (items: ISalesLine[]) => groupBy(items, item => item.data.salesStatus);\r\n const getGroupByTrackingId = (items: ISalesLine[]) => groupBy(items, item => item.data.salesLine.TrackingId || 'unknown');\r\n const getGroupByAddressId = (items: ISalesLine[]) =>\r\n groupBy(items, item => (item.data.salesLine.ShippingAddress && item.data.salesLine.ShippingAddress.RecordId) || 'unknown');\r\n\r\n const flatGroup: IGroupData[] = [];\r\n\r\n // 1) Group by delivery type\r\n // @ts-ignore\r\n const group = getGroupByDeliveryType(salesLines);\r\n\r\n // 2) Group by sales status code\r\n Object.entries(group).forEach(([deliveryType, groupByDeliveryType]) => {\r\n // @ts-ignore\r\n group[deliveryType] = getGroupBySalesStatusCode(groupByDeliveryType);\r\n\r\n Object.entries(group[deliveryType]).forEach(([salesStatus, groupBySalesStatusCode]) => {\r\n // @ts-ignore 3) Group by address id\r\n groupBySalesStatusCode[salesStatus] = getGroupByAddressId(groupBySalesStatusCode);\r\n\r\n // @ts-ignore\r\n Object.entries(groupBySalesStatusCode[salesStatus]).forEach(([addressId, groupByAddressId]) => {\r\n // @ts-ignore 4) Group by address id\r\n groupByAddressId[addressId] = getGroupByTrackingId(groupByAddressId);\r\n\r\n // @ts-ignore\r\n Object.entries(groupByAddressId[addressId]).forEach(([trackingId, groupByTrackingId]) => {\r\n flatGroup.push({\r\n // @ts-ignore\r\n deliveryType,\r\n // @ts-ignore\r\n salesStatus,\r\n addressId,\r\n trackingId,\r\n // @ts-ignore\r\n count: countItems(groupByTrackingId.map(item => item.data.salesLine)),\r\n // @ts-ignore\r\n salesLines: groupByTrackingId\r\n });\r\n });\r\n });\r\n });\r\n });\r\n\r\n return flatGroup;\r\n};\r\n\r\nexport const getDateTimeslot = (placeHolder: string, startDate: Date | undefined, endDate: Date | undefined, locale: string): string => {\r\n if (!startDate || !endDate) {\r\n return '';\r\n }\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n timeZone: 'UTC'\r\n };\r\n const dateformatter = new Intl.DateTimeFormat(locale, dateOptions);\r\n const date = dateformatter.format(new Date(startDate));\r\n\r\n const timeslotOptions: Intl.DateTimeFormatOptions = {\r\n hour: 'numeric',\r\n minute: 'numeric',\r\n hour12: true,\r\n timeZone: 'UTC'\r\n };\r\n const timeslotformatter = new Intl.DateTimeFormat(locale, timeslotOptions);\r\n const timeslot = format(placeHolder, timeslotformatter.format(new Date(startDate)), timeslotformatter.format(new Date(endDate)));\r\n return `${date} ${timeslot}`;\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 { ArrayExtensions, getFallbackImageUrl, getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport { CartLineItemComponent } from '../../../components/cartlineitem-variant.component';\r\nimport { Image } from '@msdyn365-commerce/core';\r\nimport { ChannelDeliveryOptionConfiguration, ProductDeliveryOptions, SalesLine, Shipment, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport Address from './address';\r\nimport LabelComponent from './label';\r\nimport { defaultImageSettings, getDateTimeslot, getSalesStatusCode, IDeliveryType, IModuleComponentProps, ISalesStatusCode } from './utilities';\r\n\r\nexport type ISalesStatusStringMap = {\r\n [x in ISalesStatusCode]: string | undefined;\r\n};\r\n\r\nexport type IDeliveryTypeStringMap = {\r\n [x in IDeliveryType]: string | undefined;\r\n};\r\n\r\nexport interface ISalesLineResources {\r\n productDimensionTypeSize: string;\r\n productDimensionTypeColor: string;\r\n productDimensionTypeStyle: string;\r\n salesLineQuantityText: string;\r\n configString: string;\r\n shipToLabel: string;\r\n storeLabel: string;\r\n phoneLabel: string;\r\n phoneAriaLabel: string;\r\n buyItAgainAriaLabel: string;\r\n buyItAgainLabel: string;\r\n orderStatusReadyForPickup: string;\r\n orderStatusPickedUp: string;\r\n orderStatusShipped: string;\r\n orderStatusCanceled: string;\r\n orderStatusProcessing: string;\r\n pickedUpSalesLines: string;\r\n deliveredSalesLines: string;\r\n carryOutSalesLines: string;\r\n trackingLabel: string;\r\n trackingAriaLabel: string;\r\n trackingComingSoonLabel: string;\r\n discountStringText: string;\r\n orderStatusEmailed: string;\r\n emailSalesLines: string;\r\n pickupDateTimeslotText: string;\r\n pickupTimeslotPlaceHolder: string;\r\n shippingCharges?: string;\r\n}\r\n\r\nexport interface IGetSalesLineInput {\r\n moduleName: string;\r\n moduleComponentProps: IModuleComponentProps;\r\n product: SimpleProduct;\r\n shipment?: Shipment;\r\n salesLine: SalesLine;\r\n isCurrentChannel: boolean;\r\n resources: ISalesLineResources;\r\n imageOnly?: boolean;\r\n showCompleteAddress?: boolean;\r\n showTimeslot: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n retailMultiplePickUpOptionEnabled?: boolean;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n productDeliveryOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\nexport interface ISalesLine {\r\n salesLineProps: INodeProps;\r\n salesLine: React.ReactNode;\r\n address?: React.ReactNode;\r\n buyAgainButton?: React.ReactNode;\r\n salesStatus: React.ReactNode;\r\n deliveryType: React.ReactNode;\r\n trackingInfo: React.ReactNode;\r\n pickupDateTimeslot: React.ReactNode;\r\n\r\n // row data\r\n data: {\r\n salesLine: SalesLine;\r\n product: SimpleProduct;\r\n shipment?: Shipment;\r\n deliveryType: string;\r\n productUrl: string;\r\n salesStatus: ISalesStatusCode;\r\n };\r\n}\r\n\r\n// tslint:disable:max-func-body-length\r\n// tslint:disable-next-line:cyclomatic-complexity\r\nexport const getSalesLine = ({\r\n moduleName,\r\n moduleComponentProps: {\r\n id,\r\n typeName,\r\n context,\r\n telemetry,\r\n config: { imageSettings, showShippingChargesForLineItems }\r\n },\r\n showCompleteAddress,\r\n product,\r\n shipment,\r\n salesLine,\r\n isCurrentChannel,\r\n imageOnly,\r\n showTimeslot,\r\n resources: {\r\n productDimensionTypeSize: sizeString,\r\n productDimensionTypeColor: colorString,\r\n productDimensionTypeStyle: styleString,\r\n salesLineQuantityText: quantityDisplayString,\r\n configString,\r\n shipToLabel,\r\n storeLabel,\r\n phoneLabel,\r\n phoneAriaLabel,\r\n buyItAgainLabel,\r\n buyItAgainAriaLabel,\r\n orderStatusReadyForPickup,\r\n orderStatusProcessing,\r\n orderStatusShipped,\r\n orderStatusPickedUp,\r\n orderStatusCanceled,\r\n orderStatusEmailed,\r\n pickedUpSalesLines,\r\n deliveredSalesLines,\r\n carryOutSalesLines,\r\n emailSalesLines,\r\n trackingLabel,\r\n trackingAriaLabel,\r\n trackingComingSoonLabel,\r\n discountStringText,\r\n pickupDateTimeslotText,\r\n pickupTimeslotPlaceHolder,\r\n shippingCharges\r\n },\r\n telemetryContent,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig,\r\n productDeliveryOptions\r\n}: IGetSalesLineInput): ISalesLine => {\r\n const salesStatusStringMap: ISalesStatusStringMap = {\r\n canceled: orderStatusCanceled,\r\n readyForPickup: orderStatusReadyForPickup,\r\n pickedUp: orderStatusPickedUp,\r\n processing: orderStatusProcessing,\r\n shipped: orderStatusShipped,\r\n unknown: undefined,\r\n emailed: orderStatusEmailed\r\n };\r\n\r\n const deliveryTypeStringMap: IDeliveryTypeStringMap = {\r\n pickUp: pickedUpSalesLines,\r\n ship: deliveredSalesLines,\r\n carryOut: carryOutSalesLines,\r\n email: emailSalesLines\r\n };\r\n\r\n const gridSettings = context.request.gridSettings;\r\n const pickupDeliveryModeCode = context.request.channel && context.request.channel.PickupDeliveryModeCode;\r\n const emailDeliveryModeCode = context.request.channel && context.request.channel.EmailDeliveryModeCode;\r\n const productUrl = getProductUrlSync(product, context.actionContext, undefined);\r\n const pickupMode = getPickupModeDesc(product, salesLine.DeliveryMode, productDeliveryOptions, retailMultiplePickUpOptionEnabled);\r\n const deliveryType =\r\n getPickupDeliveryMode(salesLine.DeliveryMode, pickupDeliveryModeCode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig)\r\n ? pickupMode\r\n : !!emailDeliveryModeCode && emailDeliveryModeCode !== '' && emailDeliveryModeCode === salesLine.DeliveryMode\r\n ? 'email'\r\n : !!salesLine.DeliveryMode\r\n ? 'ship'\r\n : 'carryOut';\r\n const salesStatus = getSalesStatusCode(deliveryType, salesLine.SalesStatusValue, pickupMode);\r\n const salesStatusString = salesStatusStringMap[salesStatus];\r\n const salesStatusComp = salesStatusString && <LabelComponent className={`${moduleName}__sales-status`} label={salesStatusString} />;\r\n const deliveryTypeString = getdeliveryTypeString(deliveryType, deliveryTypeStringMap, retailMultiplePickUpOptionEnabled);\r\n const deliveryTypeClass = getdeliveryTypeClassName(deliveryType, deliveryTypeStringMap);\r\n const storePickUp = retailMultiplePickUpOptionEnabled ? getStoreName(salesLine, deliveryType) : null;\r\n const deliveryTypeComp = retailMultiplePickUpOptionEnabled ? deliveryTypeString && <LabelComponent className={`${moduleName}__devliery-type ${deliveryTypeClass}-icon`} label={`${deliveryTypeString} ${storePickUp}`} />\r\n : deliveryTypeString && <LabelComponent className={`${moduleName}__devliery-type`} label={deliveryTypeString} />;\r\n const trackingInfo = isCurrentChannel && deliveryType === 'ship' && (\r\n <span className={`${moduleName}__tracking-info`}>\r\n <span className={`${moduleName}__tracking-info-label`}>{trackingLabel}</span>\r\n {shipment ? (\r\n <a className={`${moduleName}__tracking-link`} href={shipment.TrackingUrl} aria-label={trackingAriaLabel}>\r\n {shipment.TrackingNumber}\r\n </a>\r\n ) : (\r\n <span className={`${moduleName}__tracking-info-value`}>{trackingComingSoonLabel}</span>\r\n )}\r\n </span>\r\n );\r\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.BuyItAgain);\r\n const buyItAgainAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const fallbackImageUrl = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n\r\n const canShowTimeslot: boolean = showTimeslot\r\n && deliveryType === pickupMode\r\n && salesLine.PickupTimeslotStartDateTime !== undefined\r\n && salesLine.PickupTimeslotEndDateTime !== undefined;\r\n\r\n const pickupDateTimeslot = canShowTimeslot ? getDateTimeslot(pickupTimeslotPlaceHolder, salesLine.PickupTimeslotStartDateTime, salesLine.PickupTimeslotEndDateTime, context.request.locale) : '';\r\n const pickupDateTimeslotInfo = canShowTimeslot && (\r\n <div className={`${moduleName}__pickup-date-timeslot`}>\r\n <div className={`${moduleName}__pickup-date-timeslot-title`}>{pickupDateTimeslotText}</div>\r\n <div className={`${moduleName}__pickup-date-timeslot-content`}>{pickupDateTimeslot}</div>\r\n </div>\r\n );\r\n if(imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n return {\r\n data: {\r\n salesLine,\r\n productUrl,\r\n deliveryType,\r\n salesStatus,\r\n product,\r\n shipment\r\n },\r\n salesLineProps: { className: `${moduleName}__sales-line` },\r\n salesLine: imageOnly ? (\r\n <div className={`${moduleName}__sales-line-picture`}>\r\n <Image\r\n className={`${moduleName}__sales-line-image`}\r\n altText={product.Name}\r\n src={product.PrimaryImageUrl || ''}\r\n fallBackSrc={fallbackImageUrl}\r\n gridSettings={gridSettings!}\r\n imageSettings={imageSettings || defaultImageSettings}\r\n loadFailureBehavior='empty'\r\n />\r\n </div>\r\n ) : (\r\n <CartLineItemComponent\r\n id={id}\r\n typeName={typeName}\r\n context={context}\r\n resources={{\r\n sizeString,\r\n colorString,\r\n styleString,\r\n quantityDisplayString,\r\n configString,\r\n discountStringText,\r\n inputQuantityAriaLabel: '',\r\n originalPriceText: '',\r\n currentPriceText: '',\r\n shippingChargesText: shippingCharges || ''\r\n }}\r\n primaryImageUrl={product.PrimaryImageUrl}\r\n productUrl={productUrl}\r\n imageSettings={imageSettings || defaultImageSettings}\r\n gridSettings={gridSettings!}\r\n isSalesLine={true}\r\n data={{ cartLine: salesLine, product: product }}\r\n showShippingChargesForLineItems={showShippingChargesForLineItems}\r\n channelDeliveryOptionConfig={retailMultiplePickUpOptionEnabled? channelDeliveryOptionConfig: undefined}\r\n />\r\n ),\r\n address: salesLine.ShippingAddress && (\r\n <Address\r\n moduleName={moduleName}\r\n address={salesLine.ShippingAddress}\r\n resource={{ shipToLabel, storeLabel, phoneLabel, phoneAriaLabel }}\r\n deliveryType={deliveryType}\r\n showCompleteAddress={showCompleteAddress}\r\n />\r\n ),\r\n deliveryType: deliveryTypeComp,\r\n salesStatus: salesStatusComp,\r\n trackingInfo,\r\n buyAgainButton: retailMultiplePickUpOptionEnabled ? isCurrentChannel && (\r\n <a\r\n href={productUrl}\r\n aria-label={product?.Name && buyItAgainAriaLabel ? (buyItAgainAriaLabel || '').replace('{productName}', product?.Name) : ''}\r\n className={`${moduleName}__sales-line-btn-buy-it-again-link`}\r\n {...buyItAgainAttributes}\r\n >\r\n {buyItAgainLabel}\r\n </a>\r\n ) :\r\n isCurrentChannel && (\r\n <Button\r\n href={productUrl}\r\n aria-label={product?.Name && buyItAgainAriaLabel ? (buyItAgainAriaLabel || '').replace('{productName}', product?.Name) : ''}\r\n className={`${moduleName}__sales-line-btn-buy-it-again`}\r\n {...buyItAgainAttributes}\r\n >\r\n {buyItAgainLabel}\r\n </Button>\r\n ),\r\n pickupDateTimeslot: pickupDateTimeslotInfo\r\n };\r\n};\r\n\r\nexport const getPickupDeliveryMode = (salesLineDeliveryMode?: string, pickupDeliveryModeCode?: string, retailMultiplePickupOption?: boolean,\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, productDeliveryOptions?: ProductDeliveryOptions[]): boolean => {\r\n if (retailMultiplePickupOption) {\r\n return salesLineDeliveryMode === channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === salesLineDeliveryMode);\r\n } else {\r\n return !!pickupDeliveryModeCode && pickupDeliveryModeCode !== '' && pickupDeliveryModeCode === salesLineDeliveryMode;\r\n }\r\n};\r\n\r\nexport const getdeliveryTypeString = (deliveryType: string, deliveryTypeStringMap: IDeliveryTypeStringMap , retailMultiplePickupOption?: boolean): string | undefined=> {\r\n if(retailMultiplePickupOption) {\r\n switch (deliveryType) {\r\n case 'ship':\r\n case 'carryout':\r\n case 'email':\r\n return deliveryTypeStringMap[deliveryType];\r\n default:\r\n return deliveryType;\r\n }\r\n } else {\r\n return deliveryTypeStringMap[deliveryType];\r\n }\r\n};\r\n\r\nexport const getdeliveryTypeClassName = (deliveryType: string, deliveryTypeStringMap: IDeliveryTypeStringMap , retailMultiplePickupOption?: boolean): string | undefined=> {\r\n switch (deliveryType) {\r\n case 'ship':\r\n case 'carryout':\r\n case 'email':\r\n return deliveryType;\r\n default:\r\n return 'pickUp';\r\n }\r\n};\r\n\r\nexport const getPickupModeDesc = (product: SimpleProduct, salesLineDeliveryMode?: string, productDeliveryOptions?: ProductDeliveryOptions[], retailMultiplePickupOption?: boolean): string => {\r\n let deliveryOption: string = 'pickup';\r\n if (ArrayExtensions.hasElements(productDeliveryOptions) && product !== undefined) {\r\n const foundProductDeliveryOption = productDeliveryOptions?.find((deliveryO) => {\r\n return deliveryO && deliveryO.ProductId === product.RecordId;\r\n });\r\n const deliveryDesc = foundProductDeliveryOption?.DeliveryOptions ? foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === salesLineDeliveryMode)?.Description: deliveryOption;\r\n if (deliveryDesc !== undefined) {\r\n deliveryOption = deliveryDesc;\r\n }\r\n }\r\n return deliveryOption;\r\n};\r\n\r\nexport const getStoreName = (salesLine: SalesLine, deliveryType?: string): string | undefined => {\r\n switch (deliveryType) {\r\n case 'ship':\r\n case 'email':\r\n case 'carryout':\r\n return '';\r\n default:\r\n return `, ${salesLine.ShippingAddress?.Name}`;\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 classname from 'classnames';\r\nimport get from 'lodash/get';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n getGroups,\r\n getOrderInfomationInput,\r\n getOrderInformation,\r\n getTenderIdOperationIdMap,\r\n IGetOrderSummaryInput,\r\n IGroups,\r\n IHelp,\r\n IOrderInformation,\r\n IOrderSummary,\r\n IPaymentMethods,\r\n IPaymentMethodsInput,\r\n IPriceContext,\r\n ISalesLine,\r\n} from '@msdyn365-commerce-modules/order-management';\r\nimport { Button, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { CartLine, SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nimport { publish } from '../../Utilities/analytics/analytics-dispatcher';\r\nimport { getAttributesForCart, IAttributeBank } from '../../Utilities/get-product-attributes';\r\n\r\nimport { wineClubSetup } from '../../settings/app.settings';\r\nimport { WineClubDataRef, WineClubDataStore } from '../wine-club-signup/wine-club-data';\r\nimport { getOrderDetailsHelp } from './components/get-help';\r\nimport { getOrderDetailsOrderSummary } from './components/get-order-summary';\r\nimport { getOrderDetailsPaymentMethods } from './components/get-payment-methods';\r\nimport { getSalesLines, getSalesLinesInput } from './components/get-sales-lines';\r\nimport { ISmweOrderDetailsData } from './smwe-order-details.data';\r\nimport { ISmweOrderDetailsProps } from './smwe-order-details.props.autogenerated';\r\n\r\nexport * from './components/get-help';\r\nexport * from './components/get-order-summary';\r\nexport * from './components/get-payment-methods';\r\n\r\nexport interface IOrderDetailsViewProps extends ISmweOrderDetailsProps<ISmweOrderDetailsData> {\r\n moduleProps: IModuleProps;\r\n salesOrder?: SalesOrder;\r\n footerProps?: INodeProps;\r\n alert?: React.ReactNode;\r\n loading?: React.ReactNode;\r\n heading: React.ReactNode;\r\n backToShoppingLink?: React.ReactNode;\r\n orderInfomation?: IOrderInformation;\r\n salesLines?: ISalesLine[];\r\n groups?: IGroups;\r\n orderSummary?: IOrderSummary;\r\n payment?: IPaymentMethods;\r\n help?: IHelp;\r\n isWineClubOrder?: boolean;\r\n isWineClubPickup?: boolean;\r\n wineClubData?: WineClubDataRef;\r\n}\r\n\r\n/**\r\n *\r\n * OrderDetails component\r\n * @extends {React.Component<ISmweOrderDetailsProps<ISmweOrderDetailsData>>}\r\n */\r\nclass OrderDetails extends React.Component<ISmweOrderDetailsProps<ISmweOrderDetailsData>> {\r\n private moduleName: string = 'ms-order-details';\r\n private parsedProductAttributes: IAttributeBank = {};\r\n private wineClubData: WineClubDataRef;\r\n\r\n @computed get isCurrentChannel(): boolean {\r\n if (!this.order) {\r\n return false;\r\n }\r\n return this.order.ChannelId === get(this.props, 'context.request.apiSettings.channelId');\r\n }\r\n\r\n @computed get isDataReady(): boolean {\r\n return get(this.props, 'data.orderHydration.status') === 'SUCCESS';\r\n }\r\n\r\n @computed get hasError(): boolean {\r\n return get(this.props, 'data.orderHydration.status') === 'FAILED';\r\n }\r\n\r\n @computed get order(): SalesOrder | undefined {\r\n return get(this.props, 'data.orderHydration.result.salesOrder');\r\n }\r\n\r\n @computed get products(): SimpleProduct[] {\r\n return get(this.props, 'data.orderHydration.result.products') || [];\r\n }\r\n\r\n @computed get priceContext(): IPriceContext {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n telemetry,\r\n resources: { freePriceText }\r\n } = this.props;\r\n return {\r\n id,\r\n typeName,\r\n context,\r\n telemetry,\r\n freePriceText\r\n };\r\n }\r\n\r\n @computed get earnedPoints(): number {\r\n const loyaltyCard = this.props.data.loyaltyCard.result;\r\n if (loyaltyCard && loyaltyCard.RewardPoints && this.order) {\r\n const pointPrograms = loyaltyCard.RewardPoints.map(point => point.RewardPointId);\r\n const rewardLines = this.order.LoyaltyRewardPointLines || [];\r\n let total = 0;\r\n rewardLines.forEach(line => {\r\n if ((line.RewardPointAmountQuantity || 0) > 0 && pointPrograms.indexOf(line.RewardPointId) > -1) {\r\n total += line.RewardPointAmountQuantity!;\r\n }\r\n });\r\n return total;\r\n }\r\n return 0;\r\n }\r\n\r\n @computed get orderSummaryProps(): IGetOrderSummaryInput | undefined {\r\n if (!this.order) {\r\n return;\r\n }\r\n\r\n const {\r\n resources: { orderSummaryHeading, orderSummaryItemsTotalLabel, orderSummaryShippingFeeLabel, orderSummaryTaxLabel, orderSummaryGrandTotalLabel, pointsEarnedLabel }\r\n } = this.props;\r\n return {\r\n order: this.order,\r\n earnedPoints: this.earnedPoints,\r\n priceContext: this.priceContext,\r\n resource: {\r\n orderSummaryHeading,\r\n orderSummaryItemsTotalLabel,\r\n orderSummaryShippingFeeLabel,\r\n orderSummaryTaxLabel,\r\n pointsEarnedLabel,\r\n orderSummaryGrandTotalLabel\r\n }\r\n };\r\n }\r\n\r\n @computed get paymentMethodsProps(): IPaymentMethodsInput | undefined {\r\n const tenderTypes = this.props.data.tenderTypes.result;\r\n if (!this.order || !this.order.TenderLines || !tenderTypes) {\r\n return;\r\n }\r\n\r\n const locale = get(this.props, 'context.request.locale') || 'en-US';\r\n\r\n const {\r\n resources: {\r\n paymentMethodsTitle,\r\n creditCardEndingLabel,\r\n giftCardEndingLabel,\r\n amountCoveredLabel,\r\n cashUsedLabel,\r\n loyaltyCardUsedLabel,\r\n customerAccountUsedLabel\r\n }\r\n } = this.props;\r\n\r\n return {\r\n priceContext: this.priceContext,\r\n tenderLines: this.order.TenderLines,\r\n tenderIdOperationIdMap: getTenderIdOperationIdMap(tenderTypes),\r\n locale,\r\n resource: {\r\n paymentMethodsTitle,\r\n creditCardEndingLabel,\r\n giftCardEndingLabel,\r\n amountCoveredLabel,\r\n cashUsedLabel,\r\n loyaltyCardUsedLabel,\r\n\r\n customerAccountUsedLabel,\r\n }\r\n };\r\n }\r\n\r\n // this should be moved to a utility (WineClubUtils) or something\r\n @computed get wineClubIds(): string[] {\r\n const wineClub = this.props.app.config.wineClubSetup as wineClubSetup | undefined;\r\n const ids: string[] = [];\r\n wineClub && wineClub.forEach(club => club.variants.forEach(variant => ids.push(variant.itemId)));\r\n return ids;\r\n }\r\n\r\n @computed get isWineClubOrder(): boolean {\r\n if (!this.order) { return false; }\r\n\r\n const lines = this.order.SalesLines || [];\r\n\r\n // clubs have only one item\r\n if (lines.length > 1) { return false; }\r\n\r\n for (const line of lines) {\r\n const isClubOrder = this.wineClubIds.find(clubId => +clubId === line.ProductId);\r\n if (isClubOrder) { return true; }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n @computed get isWineClubPickup(): boolean {\r\n return this.wineClubData.deliveryType === 'PICKUP';\r\n }\r\n\r\n public constructor(props: ISmweOrderDetailsProps<ISmweOrderDetailsData>) {\r\n super(props);\r\n\r\n this.wineClubData = WineClubDataStore.getInstance().get();\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n public componentDidMount(): void {\r\n // Don't do anything unless emitAnalyticsEvent is enabled\r\n if (!this.props.config.emitAnalyticsEvent) {\r\n return;\r\n }\r\n\r\n // Wait for sales order and product data to load\r\n this.props.data.orderHydration.then(data => {\r\n\r\n // Ensure it loaded successfully\r\n if (this.isDataReady) {\r\n\r\n // Fetch attributes, then generate the checkout event\r\n this._setProductAttributes()\r\n .then(() => this._generatePurchaseAnalyticsEvent())\r\n .catch(e => this.props.telemetry.exception(e));\r\n }\r\n }).catch(e => this.props.telemetry.exception(e));\r\n WineClubDataStore.getInstance().reset();\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n public render(): JSX.Element {\r\n const {\r\n resources: {\r\n noSalesOrderText,\r\n genericErrorMessage,\r\n needHelpLabel,\r\n helpLineNumberLabel,\r\n loadingLabel,\r\n backToShopping,\r\n orderItemLabel,\r\n orderItemsLabel,\r\n helpLineContactAriaLabel,\r\n },\r\n config: { heading, contactNumber, showChannelInfo }\r\n } = this.props;\r\n\r\n const moduleProps = { moduleProps: this.props, className: classname('ms-order-details', this.props.config.className) };\r\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\r\n const channelIdentities = this.props.data.channels.result && this.props.data.channels.result.channelIdentities;\r\n const orgUnitLocations = this.props.data.orgUnitLocations.result && this.props.data.orgUnitLocations.result.orgUnitLocations;\r\n\r\n let viewProps: IOrderDetailsViewProps = {\r\n ...this.props,\r\n moduleProps,\r\n heading: heading && <Heading {...heading} className='ms-order-details__heading' />,\r\n backToShoppingLink: backToShoppingUrl && (\r\n <Button className='ms-order-details__btn-keep-shopping' href={backToShoppingUrl}>\r\n {backToShopping}\r\n </Button>\r\n ),\r\n footerProps: { className: 'ms-order-details__footer' }\r\n };\r\n\r\n if (this.hasError) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: <span className='ms-order-details__alert'>{genericErrorMessage}</span>\r\n };\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n if (!this.isDataReady) {\r\n viewProps = {\r\n ...viewProps,\r\n loading: <span className='ms-order-details__loading'>{loadingLabel}</span>\r\n };\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n if (!this.order) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: <span className='ms-order-details__alert'>{noSalesOrderText}</span>\r\n };\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n const salesLinesInput = getSalesLinesInput(this.props, this.moduleName, this.order, this.products, this.priceContext);\r\n const salesLines = salesLinesInput && getSalesLines(salesLinesInput);\r\n\r\n const orderInfomationInput = this.order && getOrderInfomationInput(this.props, this.moduleName, this.order, this.priceContext, channelIdentities, orgUnitLocations, showChannelInfo);\r\n const orderInfomation = orderInfomationInput && getOrderInformation(orderInfomationInput);\r\n\r\n viewProps = {\r\n ...viewProps,\r\n salesOrder: this.order,\r\n orderInfomation,\r\n salesLines,\r\n groups: salesLines\r\n ? getGroups({\r\n moduleName: this.moduleName,\r\n salesLines,\r\n resources: { orderItemLabel, orderItemsLabel }\r\n })\r\n : undefined,\r\n orderSummary: this.orderSummaryProps ? getOrderDetailsOrderSummary(this.orderSummaryProps) : undefined,\r\n payment: this.paymentMethodsProps ? getOrderDetailsPaymentMethods(this.paymentMethodsProps) : undefined,\r\n help: contactNumber ? getOrderDetailsHelp({ needHelpLabel, helpLineNumberLabel, contactNumber, helpLineContactAriaLabel }) : undefined,\r\n isWineClubOrder: this.isWineClubOrder,\r\n isWineClubPickup: this.isWineClubPickup,\r\n wineClubData: this.wineClubData\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private _generatePurchaseAnalyticsEvent(): void {\r\n if (this.order?.SalesLines) {\r\n\r\n // Format product data for Purchase event\r\n const products = this.order.SalesLines.map(line => {\r\n const product = this.products.find(entry => entry.RecordId === line.ProductId);\r\n\r\n // For some reason, if we properly use the external constant for IsSubsciption (or better yet, the isLineSubscriptionLine\r\n // helper) React explodes with a cryptic error about an undefined component.\r\n const isSubscription = !!line?.ExtensionProperties?.find(ext => ext.Key === 'IsSubscription');\r\n\r\n return {\r\n product,\r\n quantity: line.Quantity,\r\n subscription: isSubscription,\r\n discounts: line.DiscountLines,\r\n attributes: this.parsedProductAttributes[line.ProductId!],\r\n price: line.NetAmount ? (line.NetAmount / (line.Quantity || 1)).toFixed(2) : line.Price,\r\n\r\n context: this.props.context,\r\n };\r\n });\r\n\r\n // Generate a GA event\r\n publish('purchase', {\r\n id: this.order.ChannelReferenceId, // Id = transaction ID, ChannelReferenceId = Confirmation #\r\n revenue: this.order.TotalAmount,\r\n tax: this.order.TaxAmount,\r\n shipping: this.order.ChargeAmount,\r\n coupon: this.order.Coupons?.map(coupon => coupon.Code).join(','),\r\n affiliation: this.order.ChannelId,\r\n products\r\n });\r\n }\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Fetch product attributes for all products on a sales order\r\n //----------------------------------------------------------\r\n private async _setProductAttributes(): Promise<void> {\r\n if (this.order) {\r\n const salesLines = this.order.SalesLines;\r\n\r\n if (salesLines) {\r\n const fakeCartLines: CartLine[] = salesLines.map(line => ({ ProductId: line.ProductId }));\r\n this.parsedProductAttributes = await getAttributesForCart(fakeCartLines, this.props.context.actionContext);\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default OrderDetails;\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 { IModuleComponentProps, IPriceContext } from '@msdyn365-commerce-modules/order-management/src/common/utilities';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IActionContext, IGridSettings, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ChannelDeliveryOptionConfiguration , OrderShipments, ProductDeliveryOptions, SalesLine, SalesOrder, Shipment, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getSalesLine, ISalesLine, ISalesLineResources } from './get-sales-line';\r\n\r\nexport interface IGetSalesLinesInput {\r\n moduleName: string;\r\n moduleComponentProps: IModuleComponentProps;\r\n isCurrentChannel: boolean;\r\n\r\n salesLines: SalesLine[];\r\n products: SimpleProduct[];\r\n shipments?: Shipment[];\r\n priceContext: IPriceContext;\r\n resources: ISalesLineResources;\r\n actionContext: IActionContext;\r\n gridSettings: IGridSettings;\r\n imageSettings?: IImageSettings;\r\n imageOnly?: boolean;\r\n showCompleteAddress?: boolean;\r\n showTimeslot: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n retailMultiplePickUpOptionEnabled?: boolean;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n productDeliveryOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\nexport const getSalesLines = ({\r\n moduleName,\r\n moduleComponentProps,\r\n salesLines,\r\n products,\r\n shipments,\r\n resources,\r\n isCurrentChannel,\r\n imageOnly,\r\n showCompleteAddress,\r\n showTimeslot,\r\n telemetryContent,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig,\r\n productDeliveryOptions\r\n}: IGetSalesLinesInput): ISalesLine[] => {\r\n return salesLines.map(salesLine => {\r\n const product = products.find(_product => _product.RecordId === salesLine.ProductId) || ({} as SimpleProduct);\r\n const shipment = shipments && shipments.find(_shipment => _shipment.ShipmentLines?.find(_shipmentLine => _shipmentLine.ItemId === product.ItemId));\r\n return getSalesLine({\r\n moduleName,\r\n moduleComponentProps,\r\n product,\r\n shipment,\r\n salesLine,\r\n isCurrentChannel,\r\n resources,\r\n imageOnly,\r\n showCompleteAddress,\r\n showTimeslot,\r\n telemetryContent,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig,\r\n productDeliveryOptions\r\n });\r\n });\r\n};\r\n\r\ninterface IProps extends IModuleComponentProps {\r\n resources: ISalesLineResources;\r\n}\r\n\r\nexport const getSalesLinesInput = (\r\n props: IProps,\r\n moduleName: string,\r\n order: SalesOrder | OrderShipments,\r\n products: SimpleProduct[],\r\n priceContext: IPriceContext,\r\n showCompleteAddress?: boolean,\r\n showTimeslot?: boolean,\r\n telemetryContent?: ITelemetryContent,\r\n retailMultiplePickUpOptionEnabled?: boolean,\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\r\n productDeliveryOptions?: ProductDeliveryOptions[] | undefined\r\n): IGetSalesLinesInput | undefined => {\r\n if (!order || !order.SalesLines || !order.SalesLines.length) {\r\n return;\r\n }\r\n\r\n const {\r\n resources,\r\n config: { imageSettings },\r\n context: {\r\n actionContext,\r\n request: {\r\n gridSettings,\r\n apiSettings: { channelId }\r\n }\r\n }\r\n } = props;\r\n\r\n const isCurrentChannel = !order.ChannelId || order.ChannelId === channelId;\r\n\r\n return {\r\n moduleName,\r\n moduleComponentProps: props,\r\n isCurrentChannel,\r\n salesLines: order.SalesLines,\r\n products,\r\n shipments: order.Shipments,\r\n priceContext: priceContext,\r\n resources,\r\n actionContext: actionContext,\r\n gridSettings: gridSettings!,\r\n imageSettings: imageSettings,\r\n showCompleteAddress: showCompleteAddress,\r\n showTimeslot: showTimeslot || false,\r\n telemetryContent: telemetryContent,\r\n retailMultiplePickUpOptionEnabled: retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig: channelDeliveryOptionConfig,\r\n productDeliveryOptions: productDeliveryOptions\r\n };\r\n};\r\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<IForm> = ({ formProps, label, inputPinLabel, inputExpLabel, alert, inputProps, inputNumProps,\n inputPinProps, inputExpProps, inputNumber, inputPin, inputExp, applyButton, supportExternalGiftCard, showGiftCardPinInput, showGiftCardExpInput, alertFieldLabel }) => (\n <Node {...formProps}>\n {alert}\n {supportExternalGiftCard ?\n <Node {...inputProps}>\n <Node {...inputNumProps}>\n {label}\n {inputNumber}\n </Node>\n {showGiftCardPinInput &&\n <Node {...inputPinProps}>\n {inputPinLabel}\n {inputPin}\n </Node>\n }\n {showGiftCardExpInput &&\n <Node {...inputExpProps}>\n {inputExpLabel}\n {inputExp}\n </Node>\n }\n {(showGiftCardPinInput || showGiftCardExpInput) && alertFieldLabel}\n </Node>\n : <>{label}{inputNumber}</>\n }\n {applyButton}\n </Node>\n);\n\nexport const Item: React.FC<IItem> = ({ itemProps, selectedGiftCard }) => (\n <Node {...itemProps}>\n {selectedGiftCard}\n </Node>\n);\n\nconst GiftCardBalanceCheckView: React.FC<IGiftCardBalanceCheckViewProps> = props => {\n const { giftCardBalanceCheckProps, form, item } = props;\n return (\n <Module {...giftCardBalanceCheckProps}>\n {form && <Form {...form} />}\n {item && <Item {...item} />}\n </Module>\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<HTMLInputElement>): void;\n onBlur(event: React.FocusEvent<HTMLInputElement>): void;\n}\n\nconst AdressInput: React.FC<ICheckoutLoyaltyInput> = ({\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 <input\n className={className}\n type={type}\n value={value}\n min={min}\n max={max}\n step={step}\n aria-valuemax={ariaValueMax}\n aria-valuemin={ariaValueMin}\n aria-valuenow={ariaValueNow}\n onChange={onChange}\n onBlur={onBlur}\n id={id}\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<ICheckoutLoyaltyLabelProps>}\n */\nconst CheckoutLoyaltyLabel: React.FC<ICheckoutLoyaltyLabelProps> = ({\n className,\n text,\n htmlFor\n}) => {\n\n return <label className={className} htmlFor={htmlFor}>{text}</label>;\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<ICheckoutLoyaltyTextProps>}\n */\nconst CheckoutLoyaltyText: React.FC<ICheckoutLoyaltyTextProps> = ({\n className,\n text,\n}) => {\n if(!text) {\n return null;\n }\n\n return <span className={className}>{text}</span>;\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<ICheckoutLoyaltyData>, 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<ICheckoutLoyaltyProps<ICheckoutLoyaltyData>>}\n */\n// @ts-ignore\n@withModuleState\n@observer\nclass CheckoutLoyalty extends React.Component<ICheckoutLoyaltyModuleProps, ICheckoutLoyaltyState> {\n private _dialogToggleRef: React.RefObject<HTMLButtonElement> | 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<void> {\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: <Heading headingTag='h3' className={`${this.moduleClassName}__heading`} text={resources.loyaltyHeadingText} />,\n coveredAmountText: (\n <TextComponent className={`${this.moduleClassName}__text`} text={resources.loyaltyCoveredAmountText} />\n ),\n amount: (\n <PriceComponent\n className={`${this.moduleClassName}__applied-value`}\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n data={{ price: { CustomerContextualPrice: checkoutState && checkoutState.loyaltyAmount } }}\n />\n )\n },\n addLoyalty: {\n heading: <Heading headingTag='h3' className={`${this.moduleClassName}__heading`} text={resources.loyaltyHeadingText} />,\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: <TextComponent className={`${this.moduleClassName}__card-number`} text={loyaltyCard.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 <LabelComponent\n className={`${this.moduleClassName}__amount-label`}\n text={resources.payWithLoyaltyAmountLabel}\n htmlFor={`${this.props.id}-label`}\n />\n ),\n loyaltyAmountInput: (\n <InputComponent\n className={`${this.moduleClassName}__amount-input`}\n onChange={this._onInputChange}\n onBlur={this._onBlur}\n type='number'\n step='.01'\n value={this.state.dollarsApplied}\n min={0}\n max={this.maxDollars}\n ariaValueMax={this.maxDollars}\n ariaValueMin={0}\n ariaValueNow={this.state.dollarsApplied}\n id={`${this.props.id}-label`}\n />\n ),\n loyaltyAmountApplyButton: (\n <Button\n className={`${this.moduleClassName}__amount-button`}\n title={this.props.resources.applyCheckoutLoyaltyPaymentText}\n onClick={this._applyLoyaltyPoints}\n disabled={\n this.state.dollarsApplied > this.maxDollars ||\n this.state.dollarsApplied <= 0 ||\n this.state.isFetchingLoyaltyCard\n }\n >\n {this.props.resources.applyCheckoutLoyaltyPaymentText}\n </Button>\n ),\n showAppliedAmount: checkoutState && checkoutState.loyaltyAmount > 0,\n loyaltyAmountAppliedText: (\n <TextComponent className={`${this.moduleClassName}__applied-text`} text={resources.loyaltyCoveredAmountText} />\n ),\n loyaltyAmountAppliedPrice: (\n <PriceComponent\n className={`${this.moduleClassName}__applied-value`}\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n data={{ price: { CustomerContextualPrice: checkoutState && checkoutState.loyaltyAmount } }}\n />\n ),\n loyaltyAmountRemoveButton: (\n <Button\n className='ms-checkout-loyalty-remove-btn'\n title={this.props.resources.removeCheckoutLoyaltyPaymentText}\n onClick={this._removeLoyaltyPoints}\n innerRef={this._dialogToggleRef}\n >\n {this.props.resources.removeCheckoutLoyaltyPaymentText}\n </Button>\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 <React.Fragment>\n <p className={`${this.moduleClassName}__covered-text`}>{this.props.resources.loyaltyCoveredAmountText}</p>\n <PriceComponent\n className={`${this.moduleClassName}__applied-value`}\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n data={{ price: { CustomerContextualPrice: this.maxDollars } }}\n />\n </React.Fragment>\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: <TextComponent className={`${this.moduleClassName}__program-title`} text={point.Description} />,\n availablePointsText: <TextComponent className={`${this.moduleClassName}__program-available`} text={loyaltyCoveredAmountText} />,\n activePoints: (\n <TextComponent className={`${this.moduleClassName}__program-points`} text={(point && point.ActivePoints!).toString()} />\n ),\n expiringPointsText: <TextComponent className={`${this.moduleClassName}__program-expiring`} text={expiringLoyaltyPointsLabel} />,\n expiringPoints: (\n <TextComponent\n className={`${this.moduleClassName}__program-points`}\n text={(point && point.PointsExpiringSoon!).toString()}\n />\n )\n };\n }\n\n private init = async (): Promise<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 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<void> {\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<void> {\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<HTMLInputElement>): 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<HTMLInputElement>): 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<LoyaltyPointRedemptionEstimate>(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<ICartState>, commerceValues: CommerceProperty[], context: ICoreContext): Promise<void> {\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<void> {\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 {\n ICheckoutOrderConfirmationViewProps,\n IGroup,\n IGroupDelivery,\n IGroups,\n IOrderInformation,\n ISalesLine\n} from './checkout-order-confirmation';\n\nimport {\n IHelp,\n IOrderSummary,\n IPaymentMethods,\n\n} from '../../common';\n\nexport const OrderConfirmationOrderInfomation: React.FC<IOrderInformation> = ({\n orderInformationProps,\n receiptEmail,\n createdDate,\n channelReferenceId\n}) => (\n <Node {...orderInformationProps}>\n {channelReferenceId}\n {receiptEmail}\n </Node>\n );\n\nexport const OrderConfirmationSalesLine: React.FC<ISalesLine> = ({ salesLineProps, salesLine, buyAgainButton }) => (\n <Node {...salesLineProps}>\n {salesLine}\n </Node>\n);\n\nexport const OrderConfirmationGroupDelivery: React.FC<IGroupDelivery> = ({ deliveryProps, heading, count, processing, address, pickupDateTimeslot, trackingInfo }) => (\n <Node {...deliveryProps}>\n {heading}\n {count}\n {address}\n {pickupDateTimeslot}\n </Node>\n);\n\nexport const OrderConfirmationGroup: React.FC<IGroup> = ({ groupProps, delivery, salesLinesProps, salesLines }) => (\n <Node {...groupProps}>\n {delivery && <OrderConfirmationGroupDelivery {...delivery} />}\n {salesLines && (\n <Node {...salesLinesProps}>\n {salesLines.map(salesLine => (\n <OrderConfirmationSalesLine key={salesLine.data.salesLine.LineId} {...salesLine} />\n ))}\n </Node>\n )}\n </Node>\n);\n\nexport const OrderConfirmationGroups: React.FC<IGroups> = ({ groupsProps, groups }) => (\n <Node {...groupsProps}>\n {groups.map((group, index) => (\n <OrderConfirmationGroup key={index} {...group} />\n ))}\n </Node>\n);\n\nexport const OrderConfirmationOrderSummary: React.FC<IOrderSummary> = ({ orderSummaryProps, heading, subtotal, shipping, tax, totalAmount, earnedPoints }) => (\n <Node {...orderSummaryProps}>\n {heading}\n {subtotal}\n {shipping}\n {tax}\n {totalAmount}\n {earnedPoints}\n </Node>\n);\n\nexport const OrderConfirmationPayment: React.FC<IPaymentMethods> = ({ paymentMethodsProps, title, methods }) => (\n <Node {...paymentMethodsProps}>\n {title}\n {methods}\n </Node>\n);\n\nexport const OrderConfirmationHelp: React.FC<IHelp> = ({ helpProps, needHelpLabel, helpLineNumberLabel, contactNumber }) => (\n <Node {...helpProps}>\n {needHelpLabel}\n {helpLineNumberLabel}\n {contactNumber}\n </Node>\n);\n\nconst OrderConfirmationView: React.FC<ICheckoutOrderConfirmationViewProps> = ({\n moduleProps,\n heading,\n backToShoppingLink,\n alert,\n loading,\n orderInfomation,\n orderSummary,\n payment,\n help,\n groups\n}) => {\n return (\n <Module {...moduleProps}>\n {heading}\n {alert}\n {loading}\n {orderInfomation && <OrderConfirmationOrderInfomation {...orderInfomation} />}\n {backToShoppingLink}\n {groups && <OrderConfirmationGroups {...groups} />}\n {orderSummary && <OrderConfirmationOrderSummary {...orderSummary} />}\n {payment && <OrderConfirmationPayment {...payment} />}\n {help && <OrderConfirmationHelp {...help} />}\n </Module>\n );\n};\n\nexport default OrderConfirmationView;\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<ICheckoutDeliveryOptionsList> = ({\n DeliveryOptionsList,\n list\n}) => {\n if (!list || list.length === 0) {\n return null;\n }\n\n return (\n <Node {...DeliveryOptionsList}>\n {list.map((deliveryOption: ICheckoutDeliveryOptionEdit) => {\n return (<Node {...deliveryOption.DeliveryOption} key={deliveryOption.code}>\n {deliveryOption.radioButton}\n {deliveryOption.description}\n {deliveryOption.price}\n </Node>);\n })}\n </Node>\n );\n};\n\nconst DeliveryOptionSelected: React.FC<ICheckoutDeliveryOption> = ({\n DeliveryOption,\n description,\n price,\n}) => {\n\n return (\n <Node {...DeliveryOption}>\n {description}\n {price}\n </Node>\n );\n};\n\nconst ErrorMessage: React.FC<ICheckoutDeliveryOptionsError> = ({\n Error,\n title,\n message,\n}) => {\n\n return (\n <Node {...Error}>\n {title}\n {message}\n </Node>\n );\n};\n\nconst CheckoutDeliveryOptionsView: React.FC<ICheckoutDeliveryOptionsViewProps> = 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 <Module {...CheckoutDeliveryOptions}>\n {viewState.isLoading && waiting}\n {viewState.isError && errorMessage && <ErrorMessage {...errorMessage} />}\n {viewState.isShowList && deliveryOptions && <DeliveryOptionList {...deliveryOptions} />}\n {viewState.isShowSelected && deliveryOptionSelected && <DeliveryOptionSelected {...deliveryOptionSelected} />}\n {viewState.isShowSaveButton && saveButton}\n {viewState.isShowEditButton && editButton}\n {viewState.isShowCancelButton && cancelButton}\n </Module>\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 { format } from '@msdyn365-commerce-modules/utilities';\nimport { IAny, ICoreContext, IGeneric, IImageSettings, IModule, ITelemetry } from '@msdyn365-commerce/core';\nimport { SalesLine, TenderType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport groupBy from 'lodash/groupBy';\nimport { ISalesLine } from './get-sales-line';\n\nexport interface IModuleComponentProps extends IModule {\n config: {\n imageSettings?: IImageSettings;\n showShippingChargesForLineItems?: boolean;\n };\n}\n\nexport interface IPriceContext {\n id: string;\n typeName: string;\n context: ICoreContext<IGeneric<IAny>>;\n telemetry: ITelemetry;\n freePriceText: string;\n}\n\nexport const getTenderIdOperationIdMap = (tenderTypes: TenderType[]): object => {\n return tenderTypes.reduce((map, tenderType) => {\n if (tenderType.TenderTypeId) {\n map[tenderType.TenderTypeId] = tenderType.OperationId;\n }\n return map;\n }, {});\n};\n\nexport const countItems = (salesLines: SalesLine[]) => {\n return salesLines.reduce((count, salesLine) => {\n return count + (salesLine.Quantity || 0);\n }, 0);\n};\n\nexport const getSalesLinesByDelivery = (salesLines?: SalesLine[], pickupDeliveryModeCode?: string): SalesLine[] => {\n if (!salesLines || !salesLines.length) {\n return [];\n }\n return salesLines.filter(salesLine =>\n // isPickUp ? getPickUp : getOthers\n (pickupDeliveryModeCode && pickupDeliveryModeCode !== '') ? salesLine.DeliveryMode === pickupDeliveryModeCode : salesLine.DeliveryMode !== pickupDeliveryModeCode\n );\n};\n\nexport const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=80&h=80&m=6`, w: 0, h: 0 },\n lg: { q: `w=147&h=147&m=6`, w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\nexport type IDeliveryType = 'pickUp' | 'ship' | 'carryOut' | 'email';\n\nexport type ISalesStatusCode = 'canceled' | 'readyForPickup' | 'pickedUp' | 'processing' | 'shipped' | 'unknown' | 'emailed';\n\nexport const getSalesStatusCode = (deliveryType: string, statusValue?: number, pickupMode?: string): ISalesStatusCode => {\n if (statusValue === 7) {\n return 'canceled';\n }\n\n if (pickupMode !== undefined) {\n switch (statusValue) {\n case 3:\n return 'readyForPickup';\n case 4:\n return 'pickedUp';\n default:\n return 'processing';\n }\n }\n if (deliveryType === 'pickUp') {\n switch (statusValue) {\n case 3:\n return 'readyForPickup';\n case 4:\n return 'pickedUp';\n default:\n return 'processing';\n }\n } else if (deliveryType === 'ship') {\n switch (statusValue) {\n case 3:\n return 'processing';\n case 4:\n return 'shipped';\n default:\n return 'processing';\n }\n } else if (deliveryType === 'email') {\n switch (statusValue) {\n case 3:\n return 'processing';\n case 4:\n return 'emailed';\n default:\n return 'processing';\n }\n } else if (deliveryType === 'carryOut') {\n return 'processing';\n } else {\n return 'unknown';\n }\n};\n\nexport type ITrackingId = string | 'unknown';\nexport type IAddressId = string | 'unknown';\n\nexport interface IGroupData {\n deliveryType: IDeliveryType;\n salesStatus: ISalesStatusCode;\n addressId: IAddressId | 'unknown';\n trackingId: ITrackingId | 'unknown';\n count: number;\n salesLines: ISalesLine[];\n}\n\nexport const groupSalesLines = (salesLines: ISalesLine[]): IGroupData[] => {\n const getGroupByDeliveryType = (items: ISalesLine[]) => groupBy(items, item => item.data.deliveryType);\n const getGroupBySalesStatusCode = (items: ISalesLine[]) => groupBy(items, item => item.data.salesStatus);\n const getGroupByTrackingId = (items: ISalesLine[]) => groupBy(items, item => item.data.salesLine.TrackingId || 'unknown');\n const getGroupByAddressId = (items: ISalesLine[]) =>\n groupBy(items, item => (item.data.salesLine.ShippingAddress && item.data.salesLine.ShippingAddress.RecordId) || 'unknown');\n\n const flatGroup: IGroupData[] = [];\n\n // 1) Group by delivery type\n // @ts-ignore\n const group = getGroupByDeliveryType(salesLines);\n\n // 2) Group by sales status code\n Object.entries(group).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-ignore\n group[deliveryType] = getGroupBySalesStatusCode(groupByDeliveryType);\n\n Object.entries(group[deliveryType]).forEach(([salesStatus, groupBySalesStatusCode]) => {\n // @ts-ignore 3) Group by address id\n groupBySalesStatusCode[salesStatus] = getGroupByAddressId(groupBySalesStatusCode);\n\n // @ts-ignore\n Object.entries(groupBySalesStatusCode[salesStatus]).forEach(([addressId, groupByAddressId]) => {\n // @ts-ignore 4) Group by address id\n groupByAddressId[addressId] = getGroupByTrackingId(groupByAddressId);\n\n // @ts-ignore\n Object.entries(groupByAddressId[addressId]).forEach(([trackingId, groupByTrackingId]) => {\n flatGroup.push({\n // @ts-ignore\n deliveryType,\n // @ts-ignore\n salesStatus,\n addressId,\n trackingId,\n // @ts-ignore\n count: countItems(groupByTrackingId.map(item => item.data.salesLine)),\n // @ts-ignore\n salesLines: groupByTrackingId\n });\n });\n });\n });\n });\n\n return flatGroup;\n};\n\nexport const getDateTimeslot = (placeHolder: string, startDate: Date | undefined, endDate: Date | undefined, locale: string): string => {\n if (!startDate || !endDate) {\n return '';\n }\n\n const dateOptions: Intl.DateTimeFormatOptions = {\n timeZone: 'UTC'\n };\n const dateformatter = new Intl.DateTimeFormat(locale, dateOptions);\n const date = dateformatter.format(new Date(startDate));\n\n const timeslotOptions: Intl.DateTimeFormatOptions = {\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n timeZone: 'UTC'\n };\n const timeslotformatter = new Intl.DateTimeFormat(locale, timeslotOptions);\n const timeslot = format(placeHolder, timeslotformatter.format(new Date(startDate)), timeslotformatter.format(new Date(endDate)));\n return `${date} ${timeslot}`;\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/ //\nimport { Heading as HeadingType } from '@msdyn365-commerce-modules/data-types';\nimport { Button, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport * as React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport interface ICheckoutGuidedCardProps {\n step: number;\n title?: HeadingType;\n disabled?: boolean; // module is not available\n isActive?: boolean; // step === currentStep\n isVisted?: boolean; // step < currentStep\n isExpanded?: boolean;\n isReady?: boolean;\n isPending?: boolean;\n isUpdating?: boolean;\n isSubmitting?: boolean;\n isCancelAllowed?: boolean;\n isMobile?: boolean;\n hasInitialized?: boolean;\n hasControlGroup?: boolean;\n children: React.ReactNode;\n resource: {\n checkoutStepTitleFormat: string;\n saveBtnLabel: string;\n changeBtnLabel: string;\n cancelBtnLabel: string;\n saveAndContinueBtnLabel: string;\n };\n telemetryContent?: ITelemetryContent;\n onEdit?(): void;\n onCancel?(): void;\n onSubmit?(): void;\n onNext(): void;\n}\n\n/**\n *\n * CheckoutGuidedCard component\n * @extends {React.Component<ICheckoutGuidedCardProps>}\n */\nclass CheckoutGuidedCard extends React.PureComponent<ICheckoutGuidedCardProps> {\n private editButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\n private formCardRef: React.RefObject<HTMLDivElement> = 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 <div\n className={classname('ms-checkout__guided-card', {\n active: isActive,\n expanded: isExpanded,\n closed: !isExpanded,\n visted: isVisted,\n hidden: disabled,\n initialized: hasInitialized,\n disabled: disabled,\n ready: isReady,\n pending: isPending,\n updating: isUpdating\n })}\n ref={this.formCardRef}\n >\n <div className='ms-checkout__guided-card-header'>\n {this.getTitle()}\n\n {canEdit && (\n <Button\n innerRef={this.editButtonRef}\n className='ms-checkout__guided-card-btn-edit'\n title={changeBtnLabel}\n color='link'\n onClick={onEdit}\n aria-label={title && title.text ? `${changeBtnLabel} ${title.text}` : ''}\n {...changeBtnAttributes}\n >\n {changeBtnLabel}\n </Button>\n )}\n </div>\n\n <div\n className={classname('ms-checkout__guided-card-body', {\n hidden: !isExpanded\n })}\n >\n <div className='ms-checkout__guided-card-content'>{children}</div>\n\n {this.renderFooder()}\n </div>\n </div>\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 <div className='ms-checkout__guided-card-footer'>\n {canSubmit && (\n <Button\n className={classname('ms-checkout__guided-card-btn-save', { 'is-submitting': isSubmitting })}\n title={isVisted ? saveBtnLabel : saveAndContinueBtnLabel}\n color='primary'\n disabled={isSubmitting}\n onClick={onSubmit}\n {...saveBtnAttributes}\n >\n {isVisted && isCancelAllowed ? saveBtnLabel : saveAndContinueBtnLabel}\n </Button>\n )}\n {canCancel && (\n <Button\n className='ms-checkout__guided-card-btn-cancel'\n title={cancelBtnLabel}\n color='secondary'\n onClick={onCancel}\n {...cancelBtnAttributes}\n >\n {cancelBtnLabel}\n </Button>\n )}\n </div>\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 <Tag className='ms-checkout__guided-card-title'>\n <span className='ms-checkout__guided-card-title-step'>{step + 1}. </span>\n {text && <span className='ms-checkout__guided-card-title-text'>{text}</span>}\n </Tag>\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<ICheckoutGuidedFormProps>}\n */\n@observer\nclass CheckoutGuidedForm extends React.Component<ICheckoutGuidedFormProps> {\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 <div className='ms-checkout__guided-form'>\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 <GuidedCard\n key={childId}\n step={step}\n title={title}\n resource={resource}\n disabled={!hasModuleState || isDisabled}\n isActive={this.isActive(step)}\n isVisted={this.isVisted(step)}\n isExpanded={this.isExpanded(step)}\n isSubmitting={isPending}\n isMobile={this.props.isMobile}\n isPending={isPending}\n isUpdating={isUpdating}\n hasInitialized={hasInitialized}\n isReady={isReady}\n isCancelAllowed={isCancelAllowed}\n onSubmit={onSubmit}\n onCancel={onCancel}\n onEdit={onEdit}\n onNext={this.onNext}\n hasControlGroup={!this.props.disableGuidedCheckoutFlow && hasInitialized}\n telemetryContent= {this.props.telemetryContent}\n >\n {React.cloneElement(item as React.ReactElement, { enableControl: true })}\n </GuidedCard>\n );\n })}\n </div>\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<IMasterProdDisplay, { prodName: string }> {\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 = <React.Fragment>{this.props.variantName}</React.Fragment>;\r\n if (this.state.prodName !== '') {\r\n name = <React.Fragment>{this.state.prodName} - {this.props.variantName}</React.Fragment>;\r\n }\r\n return name;\r\n }\r\n}\r\n\r\nexport async function getMasterProduct(masterId: number, ctx: IActionContext): Promise<SimpleProduct | null> {\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 classname from 'classnames';\nimport { observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\n\nimport LabelComponent from '../../common/label';\nimport {\n getSalesOrderHistoryWithHydrationsAction, GetSalesOrderHistoryWithHydrationsInput,\n IOrderHistory, IPaging\n} from './actions/get-order-shipment-history';\nimport { getSalesOrder, ISalesOrder } from './components/get-sales-order';\nimport { OrderHistoryFilterComponent, OrderHistoryFilterState } from './components/order-history-filter';\nimport { IOrderHistoryData } from './order-history.data';\nimport { IOrderHistoryProps } from './order-history.props.autogenerated';\n\nexport * from '../../common/get-groups';\nexport * from '../../common/get-order-information';\nexport * from '../../common/get-sales-line';\nexport * from '../../common/get-sales-lines';\nexport * from '../../common/utilities';\nexport * from './components/get-sales-order';\n\nexport * from '../../common/get-order-information';\nexport * from './components/get-sales-order';\n\nexport interface IHeader {\n headerProps: INodeProps;\n heading: React.ReactNode;\n orderCountLabel?: React.ReactNode;\n extraActions?: React.ReactNode;\n}\n\nexport interface IList {\n listProps: INodeProps;\n salesOrders: ISalesOrder[];\n}\n\nexport interface IOrderHistoryViewState {\n isDataReady: boolean;\n hasError: boolean;\n isLoading: boolean;\n isShowMoreButton: boolean;\n}\n\nexport interface IOrderHistoryViewProps extends IOrderHistoryProps<IOrderHistoryData> {\n orderHistory: IOrderHistory;\n orderHistoryProps: IModuleProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n emptyMessage?: React.ReactNode;\n header: IHeader;\n backToShoppingLink?: React.ReactNode;\n list?: IList;\n moreButton?: React.ReactNode;\n viewState: IOrderHistoryViewState;\n}\n\n/**\n *\n * OrderHistory component\n * @extends {React.Component<IOrderHistoryProps<IOrderHistoryData>>}\n */\n@observer\nclass OrderHistory extends React.Component<IOrderHistoryProps<IOrderHistoryData>> {\n @observable private orderHistory!: IOrderHistory;\n @observable private viewState!: IOrderHistoryViewState;\n private filterState: OrderHistoryFilterState;\n private pageSize!: number;\n private paging!: IPaging;\n private telemetryContent?: ITelemetryContent;\n private payLoad: IPayLoad;\n\n constructor(props: IOrderHistoryProps<IOrderHistoryData>) {\n super(props);\n this.initState();\n this.filterState = OrderHistoryFilterState.CurrentUser;\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n }\n\n public componentDidMount(): void {\n if(this.props.context.actionContext.requestContext.user.isAuthenticated) {\n this.getOrderHistory()\n .then(() => {\n this.viewState.isDataReady = true;\n })\n .catch(ex => {\n this.viewState.hasError = true;\n });\n } else {\n this.viewState.isDataReady = true;\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { heading, className, showChannelInfo },\n resources: { genericErrorMessage, noOrderHistoryLable, moreButtonText, backToShopping, orderCountLabel, ordersCountLabel, loadingLabel }\n } = this.props;\n const { salesOrders, products } = this.orderHistory;\n const { isDataReady, hasError, isShowMoreButton, isLoading } = this.viewState;\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const channelIdentities = this.props.data.channels.result && this.props.data.channels.result.channelIdentities;\n const orgUnitLocations = this.props.data.orgUnitLocations.result && this.props.data.orgUnitLocations.result.orgUnitLocations;\n\n let viewProps: IOrderHistoryViewProps = {\n ...this.props,\n orderHistory: this.orderHistory,\n viewState: this.viewState,\n orderHistoryProps: {\n moduleProps: this.props,\n className: classname('ms-order-history', className)\n },\n header: {\n headerProps: { className: 'ms-order-history__header' },\n heading: heading && heading.text && (\n <Msdyn365.Text\n {...heading}\n className='ms-order-history__heading'\n text={heading.text}\n tag={heading.tag || 'h2'}\n editProps={{ onEdit: this.handleOrderHistoryHeadingChange, requestContext: this.props.context.request }}\n />\n )\n },\n backToShoppingLink: backToShoppingUrl && (\n <Button className='ms-order-history__btn-keep-shopping' href={backToShoppingUrl}>\n {backToShopping}\n </Button>\n )\n };\n\n if (hasError) {\n viewProps = {\n ...viewProps,\n alert: <LabelComponent className='ms-order-history__alert' label={genericErrorMessage} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!isDataReady) {\n viewProps = {\n ...viewProps,\n loading: <LabelComponent className='ms-order-history__loading' label={loadingLabel} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!salesOrders || salesOrders.length === 0) {\n viewProps = {\n ...viewProps,\n emptyMessage: <p className='ms-order-history__empty-message'>{noOrderHistoryLable}</p>\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const _orderCountLabel = salesOrders.length === 1 ? orderCountLabel : ordersCountLabel;\n this.payLoad.contentAction.etext = TelemetryConstant.ViewMore;\n const viewMoreAttributes = getTelemetryAttributes(this.telemetryContent!,this.payLoad);\n\n viewProps = {\n ...viewProps,\n header: {\n ...viewProps.header,\n orderCountLabel: <span className='ms-order-history__order-count'>{`(${salesOrders.length} ${_orderCountLabel})`}</span>,\n extraActions: this.renderExtraActions()\n },\n list: {\n listProps: { className: 'ms-order-history__sales-order-list' },\n salesOrders: salesOrders.map(salesOrder =>\n getSalesOrder({\n ...this.props,\n products,\n salesOrder,\n channelIdentities,\n orgUnitLocations,\n showChannelInfo,\n telemetryContent: this.telemetryContent\n })\n )\n },\n moreButton: isShowMoreButton && (\n <Button className={`ms-order-history__btn-more ${isLoading ? 'is-busy' : ''}`} {...viewMoreAttributes} disabled={isLoading} onClick={this.onMoreButtonClick}>\n {moreButtonText}\n </Button>\n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleOrderHistoryHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private onMoreButtonClick = () => {\n // tslint:disable-next-line:no-floating-promises\n this.getOrderHistory();\n }\n\n private renderExtraActions = () => {\n return this.props.data.customerInformation && this.props.data.customerInformation.result && (\n <OrderHistoryFilterComponent\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n className='ms-order-history__ms-order-history-filter'\n resources={this.props.resources}\n data={{customerInformation: this.props.data.customerInformation.result}}\n currentState={this.filterState}\n onFilterStateChanged={this.onFilterStateChanged}\n />\n );\n }\n\n private initState = () => {\n this.orderHistory = {\n salesOrders: [],\n products: []\n };\n this.viewState = {\n isDataReady: false,\n hasError: false,\n isShowMoreButton: (this.props.config.pageSize || 0) > 0,\n isLoading: false\n };\n this.pageSize = this.props.config.pageSize || 10;\n this.paging = {\n top: this.pageSize,\n skip: 0\n };\n }\n\n private onFilterStateChanged = (state: OrderHistoryFilterState) => {\n this.initState();\n this.filterState = state;\n this.getOrderHistory()\n .then(() => {\n this.viewState.isDataReady = true;\n })\n .catch(ex => {\n this.viewState.hasError = true;\n });\n }\n\n private getOrderHistory = async (): Promise<void> => {\n const actionContext = this.props.context.actionContext;\n const input = new GetSalesOrderHistoryWithHydrationsInput(this.paging, this.props.context.request.apiSettings, this.filterState);\n\n try {\n this.viewState.isLoading = true;\n const response = await getSalesOrderHistoryWithHydrationsAction(input, actionContext);\n if (response) {\n const { products, salesOrders } = response;\n this.orderHistory.products.push(...products);\n this.orderHistory.salesOrders.push(...salesOrders);\n this.viewState.isShowMoreButton = this.viewState.isShowMoreButton && response.salesOrders.length > 0 && response.salesOrders.length === this.pageSize;\n this.paging.skip += this.pageSize;\n }\n this.viewState.isLoading = false;\n return Promise.resolve();\n } catch (error) {\n return Promise.reject();\n }\n }\n}\n\nexport default OrderHistory;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\nimport { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport checkout from './checkout';\nimport emptyActiveCart from './empty-active-cart';\n\nexport default async (ctx: IActionContext, checkoutState: ICheckoutState | undefined, orderedProducts: SimpleProduct[] | undefined, redirect: boolean, updatedCartVersion?: number) => {\n let salesOrder: SalesOrder;\n\n // Proceed checkout\n try {\n salesOrder = await checkout(ctx, updatedCartVersion);\n } catch (error) {\n throw error;\n }\n\n // Remove purchased items from the active cart\n try {\n await emptyActiveCart(ctx);\n } catch (error) {\n throw error;\n }\n\n if (redirect) {\n // Redirect to the order confirmation page\n const orderConfirmationUrl = getUrlSync('orderConfirmation', ctx) || '';\n if (!orderConfirmationUrl) {\n throw new Error('Error: No orderConfirmationUrl');\n }\n\n const separator = orderConfirmationUrl.includes('?') ? '&' : '?';\n const url = `${orderConfirmationUrl}${separator}transactionId=${salesOrder.Id}`;\n window.location.assign(url);\n } else {\n if (checkoutState) {\n const result = await checkoutState.updateSalesOrder({ newSalesOrder: salesOrder, newOrderedProducts: orderedProducts || [] });\n\n if (result.status === 'FAILED') {\n throw new Error('Error: Updating error state failed');\n }\n } else {\n throw new Error('Error: No checkout state');\n }\n }\n};\n"],"sourceRoot":""}