{"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/actions/submit-helpfulness-vote.ts?be08","webpack:///src/modules/checkout/components/get-line-items.tsx?5207","webpack:///src/index.ts?c6ae","webpack:///src/modules/quick-order/components/quick-order-drawer.tsx?25f0","webpack:///src/modules/quick-order/components/quick-order-form.tsx?61bd","webpack:///src/modules/quick-order/components/quick-order-product.ts?af99","webpack:///src/modules/quick-order/components/quick-order-table/components/quick-order-table-header-component.tsx?d661","webpack:///src/modules/quick-order/components/quick-order-table/components/quick-order-table-row-component.tsx?cb68","webpack:///src/modules/quick-order/components/quick-order-table/quick-order-table-component.tsx?a7a8","webpack:///src/modules/quick-order/quick-order.tsx?7aab","webpack:///src/modules/fabrikam/views/components/promocode.component.tsx?7eef","webpack:///src/Common/get-product.ts?5f1d","webpack:///src/actions/inputs/submit-user-review-input.ts?921c","webpack:///src/modules/fabrikam/views/components/cartlineitem.component.tsx?4b07","webpack:///src/modules/checkout/methods/empty-active-cart.ts?524e","webpack:///src/modules/checkout/components/index.ts?5ba9","webpack:///src/modules/order-template-list/components/order-template-list.tsx?f2fd","webpack:///src/modules/order-template-list/components/orderTemplateList-status-message.tsx?dbea","webpack:///src/modules/video-player/components/additional-content.tsx?22a8","webpack:///src/modules/video-player/video-player.tsx?cfb9","webpack:///src/modules/checkout/methods/checkout.ts?3b66","webpack:///src/modules/search-result-container/components/title.tsx?365d","webpack:///src/modules/bulk-purchase/bulk-purchase.view.tsx?2550","webpack:///src/modules/write-review/index.ts?2b94","webpack:///src/common/rnrInterface.ts?25e5","webpack:///./src/themes/gardner-theme-b2c/views/ratings-histogram.view.tsx?6015","webpack:///src/modules/reviews-list/components/review-card.tsx?2d16","webpack:///src/modules/reviews-list/components/components.tsx?c96f","webpack:///src/modules/order-template/order-template.tsx?4281","webpack:///src/modules/search-result-container/components/utilities.ts?41e3","webpack:///src/modules/quick-order/quick-order.view.tsx?2242","webpack:///./src/themes/gardner-theme/views/components/promocode.component.tsx?4e92","webpack:///./src/utils/cartAttributeManager.ts?f742","webpack:///src/modules/ratings-histogram/ratings-histogram.tsx?4c32","webpack:///src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?671e","webpack:///src/modules/wishlist-items/components/wishlist-item.tsx?1fe2","webpack:///src/modules/wishlist-items/components/wishlist-items-status-message.tsx?7062","webpack:///src/modules/wishlist-items/wishlist-items.tsx?3721","webpack:///src/modules/reviews-list/reviews-list.tsx?b5d0","webpack:///src/modules/search-result-container/search-result-container.tsx?97e0","webpack:///src/order-summary-lineitem.tsx?86d9","webpack:///src/common/index.ts?ee63","webpack:///../../src/index.ts?0e3e","webpack:///src/modules/search-result-container/components/error-message.tsx?c0c2","webpack:///src/modules/media-gallery/utils/get-valid-product-images.ts?4e26","webpack:///src/modules/media-gallery/media-gallery.tsx?3b46","webpack:///src/modules/cart/components/cart-pick-up-in-store.tsx?f7bf","webpack:///src/modules/cart/components/cart-line-items.tsx?a1e3","webpack:///src/modules/cart/components/cart-line-groups.tsx?b88f","webpack:///src/modules/cart/utils/get-promotion-in-cart.ts?1379","webpack:///src/modules/cart/cart.tsx?f1c3","webpack:///src/modules/cart/components/cart-line-items-promotion.tsx?6882","webpack:///src/modules/adventureworks/views/components/product.component.tsx?f602","webpack:///src/modules/product-collection/product-collection.view.tsx?9eb3","webpack:///src/actions/inputs/submit-helpfulness-vote-input.ts?cfb5","webpack:///src/modules/adventureworks/views/search-result-container.view.tsx?18e4","webpack:///src/modules/carousel/carousel.view.tsx?b19a","webpack:///src/modules/active-image/active-image.view.tsx?b3e2","webpack:///src/actions/report-review-concern.ts?11eb","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/product-collection/product-collection.tsx?b9b8","webpack:///../../../src/module-state-manager/with-module-state.tsx?61ca","webpack:///src/modules/cart/cart.view.tsx?394b","webpack:///src/modules/order-template/components/add-line/spinner.tsx?28dd","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/themes/gardner-theme/views/order-template-list.view.tsx?0f10","webpack:///../../src/checkout-state.ts?acd8","webpack:///src/modules/search-result-container/search-result-container.view.tsx?3d61","webpack:///src/modules/video-player/video-player.view.tsx?2e40","webpack:///src/modules/checkout/index.ts?1106","webpack:///src/modules/search-result-container/components/refine-item.tsx?b232","webpack:///src/modules/reviews-list/components/report-review-modal.tsx?22a9","webpack:///src/modules/order-template/components/add-line/add-line.tsx?add3","webpack:///src/modules/order-template/components/add-line/dropdown.tsx?40af","webpack:///src/modules/order-template/components/add-line/not-found.tsx?00ed","webpack:///src/modules/order-template/components/common/order-template-quantity.tsx?dfc0","webpack:///src/modules/order-template/components/add-line/product-configuration.tsx?ac81","webpack:///src/modules/order-template/components/add-line/product-list.tsx?5107","webpack:///src/modules/order-template/components/order-template-actions.tsx?5f39","webpack:///src/modules/order-template/components/order-template-lines.tsx?cdf6","webpack:///src/modules/order-template/components/order-template-lines-status-message.tsx?0022","webpack:///src/modules/order-template/components/order-template-table-heading.tsx?606c","webpack:///src/modules/checkout-loyalty/checkout-loyalty.view.tsx?876d","webpack:///src/modules/search-result-container/components/index.ts?cc7a","webpack:///src/modules/cart-icon/cart-icon.view.tsx?d63a","webpack:///src/modules/adventureworks/views/components/cartlineitem.component.tsx?c848","webpack:///src/modules/checkout/checkout.view.tsx?e9a7","webpack:///src/common/review-modal.tsx?7ef9","webpack:///src/modules/checkout/components/get-invoice-payment-summary.tsx?6271","webpack:///src/modules/checkout/checkout.tsx?baa3","webpack:///src/modules/search-result-container/components/product-search-result-items.tsx?1766","webpack:///src/common/error.tsx?f9f6","webpack:///src/modules/search-result-container/components/choice-summary.tsx?f4a7","webpack:///src/modules/search/search.view.tsx?e62d","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/search-result-container/components/refine-submenu.tsx?1e62","webpack:///../../../src/module-state-manager/module-state.ts?7579","webpack:///src/modules/search-result-container/components/separator.tsx?7b76","webpack:///src/modules/reviews-list/index.ts?51cb","webpack:///./src/themes/gardner-theme/views/components/create-order-template.component.tsx?a75f","webpack:///src/modules/write-review/components/components.tsx?ead4","webpack:///src/modules/write-review/write-review.tsx?dea3","webpack:///src/modules/media-gallery/media-gallery.view.tsx?6e14","webpack:///src/modules/active-image-utilities/active-product.tsx?2e3c","webpack:///src/modules/active-image-utilities/additional-content.tsx?115e","webpack:///src/modules/active-image-utilities/image-mapper.tsx?3afb","webpack:///src/modules/active-image/active-image.tsx?f30d","webpack:///src/modules/order-template-list/components/create-order-template.tsx?81ed","webpack:///src/modules/order-template-list/order-template-list.tsx?bc4a","webpack:///src/actions/inputs/report-review-concern-input.ts?c9d1","webpack:///src/modules/ratings-histogram/component/components.tsx?2a0b","webpack:///./src/themes/gardner-theme/views/ratings-histogram.view.tsx?e3b1","webpack:///src/modules/search-result-container/components/range-refine-item.tsx?6e24","webpack:///src/modules/reviews-list/reviews-list.view.tsx?6dd9","webpack:///src/actions/index.ts?e12b","webpack:///src/modules/checkout/components/alert.tsx?5f0c","webpack:///src/modules/wishlist-items/wishlist-items.view.tsx?caf1","webpack:///src/modules/checkout-gift-card/checkout-gift-card.view.tsx?3424","webpack:///src/modules/order-template/order-template.view.tsx?f2c8","webpack:///src/modules/search-result-container/components/link.tsx?d3ce","webpack:///src/modules/bulk-purchase/bulk-purchase.tsx?d704","webpack:///src/modules/checkout/components/place-order-button.tsx?c8b4","webpack:///../../../src/module-state-manager/index.ts?8e3a","webpack:///src/modules/carousel/carousel.tsx?bfbb","webpack:///src/modules/ratings-histogram/ratings-histogram.view.tsx?4481","webpack:///src/modules/search-result-container/actions/index.ts?3dfa","webpack:///./src/themes/gardner-theme-b2c/views/order-template-list.view.tsx?ee61","webpack:///src/modules/checkout/components/get-order-summary.tsx?6f62","webpack:///src/modules/checkout/methods/index.ts?4c8b","webpack:///./src/themes/gardner-theme-b2c/views/components/create-order-template.component.tsx?d054","webpack:///./src/themes/gardner-theme-b2c/views/components/promocode.component.tsx?ce90","webpack:///src/modules/ratings-histogram/index.ts?834d","webpack:///src/modules/search-result-container/components/modal.tsx?afdd","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/modules/order-template/components/bulk-actions.tsx?f343","webpack:///src/modules/checkout-delivery-options/checkout-delivery-options.view.tsx?d64d","webpack:///src/modules/search-result-container/components/feature-search-result-item.tsx?98c1","webpack:///src/modules/checkout/components/guided-card.tsx?5a55","webpack:///src/search-state.ts?b5d7","webpack:///src/modules/search/actions/get-auto-suggest-suggestions.ts?6ade","webpack:///src/modules/search/components/search.categorysuggest.tsx?3bc4","webpack:///src/modules/search/components/search.form.tsx?3c4b","webpack:///src/modules/search/components/search.keywordsuggest.tsx?59ca","webpack:///src/modules/search/components/search.label.tsx?91cb","webpack:///src/modules/search/components/search.productsuggest.tsx?d6fa","webpack:///src/modules/search/search.tsx?3f45","webpack:///src/modules/order-template-list/order-template-list.view.tsx?20f7","webpack:///src/modules/checkout/components/guided-form.tsx?7fad","webpack:///src/invoice-summary-lineitem.tsx?1b66","webpack:///../../src/checkout-state-data-action.ts?8344","webpack:///src/actions/submit-user-review.ts?d4c7","webpack:///src/validate-cart.ts?28cc","webpack:///src/modules/checkout/methods/place-order.ts?6d11","webpack:///src/modules/write-review/write-review.view.tsx?9069"],"names":["CheckoutDeliveryOptionsDescription","_ref","description","React","className","CheckoutDeliveryOptionsErrorMessage","message","CheckoutDeliveryOptionsErrorTitle","title","CheckoutDeliveryOptionsRadioButton","isChecked","value","ariaSetSize","ariaPosInSet","ariaLabel","telemetryContent","onChange","payLoad","getPayloadObject","TelemetryConstant","DeliveryOptions","attributes","getTelemetryAttributes","Object","assign","checked","type","contentAction","etext","name","CheckoutDeliveryOptions","constructor","props","super","selectedItemId","deliveryOptions","isLoading","retailMultiplePickUpOptionEnabled","init","async","this","moduleState","onEdit","isSelectDefaultOptionEnabled","undefined","onCancel","onSubmit","status","config","useDefaultDeliveryOption","canShip","cartDeliveryMode","getSavedDeliveryOption","loadDeliveryOptions","_this$props$data$chec","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","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","_this$props$data$chec2","updateShouldCollapsePaymentSection","newShouldCollapsePaymentSection","_this$props$data$chec3","updateCartDeliverySpecification","savedDeliveryOption","_this$props$data$chec4","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","_this$channelDelivery","PickupDeliveryModeCodes","getDeliveryOptions","_this$props$data$chec5","cartState","cartId","Id","originalDeliveryMode","shippingCartLines","hasShippingDeliveryLines","clearCartLinesDeliveryInformation","channelDeliveryOptionConfiguration","deliveryOptionFilter","filterDeliveryModeOption","FilterDeliveryModeOption","None","FilterOutNonCarrierDeliveryMode","getDeliveryOptionsAsync","callerContext","actionContext","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","_unused","deliveryOptionsNotFound","_this$props$data$chec6","_this$props$data$chec7","updateHasCartDeliveryMode","newHasCartDeliveryMode","isPaymentVerificationRedirection","_this$props$data$chec8","getStoredDeliveryOptions","_this$props$data$chec9","_this$props$data$chec10","_this$props$data$chec11","isExpressCheckoutApplied","_this$props$data$chec12","_this$props$data$chec13","event","currentTarget","getTelemetryObject","telemetryPageName","friendlyName","when","isDataReady","reaction","_this$props$data$chec14","_this$props$data$chec15","_this$props$data$chec16","_this$props$data$chec17","shouldComponentUpdate","nextProps","nextState","state","render","_this$props$data$chan","_this$props$data$feat","featureState","feature","Name","IsEnabled","isReady","isUpdating","hasError","isError","isShowList","isShowSelected","deliveryOptionAriaLabel","viewProps","_objectSpread","deliveryOptionsData","alert","ErrorComponent","errorMessageData","viewState","isShowSaveButton","hasExternalSubmitGroup","isShowEditButton","isShowCancelButton","moduleProps","classname","DeliveryOptionsList","list","deliveryOptionSelected","waiting","Waiting","saveButton","editButton","cancelButton","renderView","__decorate","observable","computed","action","withModuleState","observer","submitHelpfulnessVoteDataAction","createObservableDataAction","input","ctx","reviewId","tenantId","locale","authToken","inputIsValid","Error","requestUrl","serviceEndpoint","requestBody","isHelpful","requestHeader","headers","Authorization","sendRequest","trace","exception","debug","getLineItems","_featureState$result","_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","productUrl","getProductUrlSync","MsDyn365","isBrowser","_cartLine$CatalogId","fullUrl","URL","window","href","searchParams","set","CatalogId","CartLineItemComponent","sizeString","colorString","styleString","amountString","originalPriceText","currentPriceText","shippingChargesText","isQuantityEditable","primaryImageUrl","PrimaryImageUrl","_getPickUpAtStoreComponents","pickupDeliveryLocation","pickUpAtStoreWithLocationText","PickUpAtStore","label","_getEmailDeliveryComponents","emailDeliveryText","EmailDelivery","_getLineItemsComponents","items","isPickUp","_getCartPickDeliveryMode","isEmailDelivery","LineId","LineItem","item","pickUpAtStore","emailDelivery","cartLineItem","_channelDeliveryOptio","StringExtensions","isNullOrWhitespace","_countItems","reduce","Quantity","_filterItemsByDiliveryType","_channelDeliveryOptio2","_getLineItemsByDeliveryType","_getGroupTitleComponent","_input$data$deliveryO","itemLabel","itemsLabel","inStorePickUpLabel","shippingCountCheckoutLineItem","emailDeliveryModeDesc","productDeliveryOptions","_productDeliveryOptio","suffix","replace","toString","LineItemDeliveryGroup","classnames","LineItemList","heading","lineItems","handleLineItemHeadingChange","lineItemsHeading","text","target","_getLineItemsByDeliveryTypeWithMulitplePickupMode","multiplePickUpLabel","shippingLable","_filterItemsByMultiplePickupMode","getGroupByStorePickup","groupBy","groupDelivery","cartLinesGroup","cartLinesGrp","entries","forEach","groupByDeliveryType","push","keys","key","cartLines","lineItemDeliveryGroup","_getGroupTitleComponentWithMultiplePickUp","fulFillmentStoreId","_input$data$deliveryO2","_input$data$deliveryO3","pickupDeliveryModeDesc","_productDeliveryOptio2","_productDeliveryOptio3","groupTitle","iconClass","lineItemWraperIcon","lineItemWraper","_getLineItems","products","editCartText","EditCart","attribute","groupClass","LineItems","Header","Msdyn365","editProps","requestContext","editLink","itemsForPickup","itemsForShip","itemsForEmail","itemsGroupWithMulitplePickupMode","QuickOrderDrawer","_toggle","bind","isManuallyToggled","isOpen","collapseProps","drawerGlyphClass","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","children","drawerClass","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","Collapse","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","e","preventDefault","setState","onToggle","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxChars","maxQuantity","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","addQuantityPlaceholderText","handleQuantityChange","handleInputChange","handleAddToCartClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","ref","quantityNode","pattern","maxLength","quantity","placeholder","addToCartBtn","userMessage","stateMessage","Alert","statusCssString","messageGlyph","messageText","QuickOrderProduct","simpleProduct","isSelected","QuickOrderDesktopHeaderCellsComponent","columnWithNumberClassName","createElement","Fragment","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","rowClassName","headerCells","isMobile","defaultImageSettings","viewports","xs","q","w","h","lg","lazyload","cropFocalRegion","QuickOrderTableRowProductImageComponent","_props$data$product$P","_props$imageSettings","fallbackImageUrl","getFallbackImageUrl","ItemId","apiSettings","containerClassName","Image","altText","src","fallBackSrc","loadFailureBehavior","QuickOrderExtraActionsPopupComponent","ObjectExtensions","isNullOrUndefined","getProductPageUrlSync","QuickOrderDesktopTableRowCellComponent","_product$Dimensions","_cartLine$LineId","Dimensions","dimension","_dimension$DimensionV","DimensionValue","Value","dimensionValue","join","quickOrderProductDimensionsSeparator","Price","UnitOfMeasureSymbol","IncrementalQuantity","max","currentCount","quickOrderInputQuantityAriaLabel","decrementButtonAriaLabel","quickOrderDecrementButtonAriaLabel","incrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","isGiftCard","IsGiftCard","TotalAmount","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","format","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","useState","isMobileView","quickOrderProducts","updateViewport","addEventListener","headerClassName","quickOrderProduct","QuickOrder","waitTime","dimensionUpdateQueue","FinitePromiseQueue","dimensions","cssClassNameConfigure","quickOrderCallbacks","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","query","productText","productResponse","productDimensions","inputQuantityText","quantityInput","current","HTMLInputElement","cancellabelDebounce","cancel","isQuickOrderFormExpanded","_debounce","getScanResult","GetScanResultInput","channelId","results","Product","ProductDimensionFull","setTimeout","_addItemToCart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","_this$props$context$r","_this$props$context$a","isOrderQuantityLimitsFeatureEnabledInHq","defaultOrderQuantityLimitsFeatureConfig","app","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","defaultDeliveryOption","ArrayExtensions","hasElements","isOrderQuantityLimitsFeatureEnabled","productAvailableQuantity","_updateAvailablity","addProductToCartInput","enableStockCheck","availableQuantity","ProductAvailableQuantity","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","addProductToCart","inputProductText","substatus","maxQtyLimitReachedMessage","_getMaxQtyMessage","_result$errorDetails","errorDetails","LocalizedMessage","warning","_getConcatenatedMaxQtyMessage","currentQuantity","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","_handleQuantityChange","currentValue","Number","parseInt","inputElement","isNaN","setAttribute","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_this$state$productRe","productDimensionTypeConfiguration","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","configureErrors","errorState","mappedDimensions","DimensionTypeValue","ExtensionProperties","selectedProduct","Promise","resolve","reject","newProduct","getSelectedVariant","SelectedVariantInput","MasterProductId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","productAvailable","_getDimensionErrorString","dimensionTypeValue","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","viewport","device","Type","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","quickAddQuantityPlaceholderText","productConfigureResources","selectDimensionFormatString","quickOrderProps","contentProps","isB2B","drawer","quickOrderForm","quickOrderList","_renderQuickOrderTable","form","configure","getProductConfigure","_initQuickOrderProducts","_cart$cart$CartLines","validValues","tableClassName","productInventoryInfo","_cart$result","maxQuantityForLineItem","maxQuantityForCartLineItem","addedQuantity","_item$ItemId","minInventory","Math","min","PromoCode","_onInputChangeHandler","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","promoCode","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","_onSubmitHandler","_applyPromotionHandler","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","_removePromotion","getAttribute","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_calculateDiscount","discountAmount","line","DiscountLines","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","removePromotionHandler","promoCodTotalDiscount","coupon","appliedPromoCodeHeadingText","removePromoAriaLabelFormat","removePromoText","ApplyPromoCode","isCollapseOpen","promoCodeHeadingText","getProductByProductId","getProductByProductIdAndWarehouse","warehouseId","targetWarehouseValue","WarehouseId","_product$Behavior","Behavior","InventoryLocationId","SubmitUserReviewInput","userReviewData","authorization","getCacheKey","getCacheObjectType","dataCacheType","CatalogLabelComponent","catalogId","user","isB2b","catalogs","catalog","CartLineItemFunctions","renderProductDimensions","DimensionStrings","productDimension","OfferId","OfferName","isSalesLine","PeriodicDiscount","EffectiveAmount","BasePrice","EffectivePercentage","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","IsInvoiceLine","unitOfMeasureDisplayType","DefaultUnitOfMeasure","_props$context$reques","cartline","hasShippingMethod","some","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","chargeTotal","CalculatedAmount","priceComponent","_cartline$ChargeLines","otherCharges","chargeline","otherCharge","SalesAgreementLineRecordId","salesAgreementPricePrompt","CartLine","_props$primaryImageUr","destructDimensionStrings","renderDisountLines","renderInventoryLabel","renderUnitOfMeasure","renderShippingLabel","renderOtherCharges","renderSalesAgreementPrompt","productAttribute","productName","imgeClassName","newValue","quantityOnChange","lineIndex","NetAmount","NetAmountWithoutTax","NetPrice","salesAgreementLineId","_generateQuantityandPrice","nodes","isOutOfStock","isCartStateReady","classNames","priceResources","DiscountAmount","DiscountAmountWithoutTax","priceEditorResources","CartLinePriceEditor","emptyActiveCart","lineItemIdsToRemove","getCartState","getCheckoutState","activeCart","activeCartLine","checkoutCartLine","removeCartLines","cartLineIds","removeAllPromoCodes","removeCheckoutCartId","OrderTemplateActions","onRemoveOrderTemplate","handlers","itemKey","removeOrderTemplateActionHandler","OrderTemplateRender","orderTemplate","removeFromOrderTemplateListText","orderTemplateState","enableImageProductLink","onDismiss","orderTemplateImage","_renderOrderTemplateImages","orderTemplateLines","orderTemplateAriaLabel","_renderAriaLabel","orderTemplateName","_getOrderTemplatePageUrl","_getUrlSync","url","getUrlSync","separator","includes","totalLines","addToCartButton","AddOrderTemplateToCartComponent","moduleTypeName","addToCartText","addToBagText","dialogStrings","removeButton","orderTemplateStatusMessage","toggle","onClickHandler","xl","slice","_line$fullProduct$Pro","_line$fullProduct","_line$fullProduct$Pro2","_line$fullProduct2","_line$fullProduct3","_line$fullProduct$Pro3","_line$fullProduct4","_getFallbackImageUrl","_line$fullProduct5","fullProduct","ProductDetails","alt","OrderTemplateListStatusMessage","errorType","getAdditionalContentItems","_item$links","renderHeading","additionalContentHeading","handleAdditionalTextChange","subtext","renderParagraph","additionalContentParagraphText","handleAdditionalParagraphChange","links","ctaLink","renderLinks","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","link","onTextChange","handleAdditionalLinkTextChange","additionalContentItemContainer","additionalContentItemLinks","videoPlayerAdditionalContent","additionalContent","additionalContentNode","additionalContentItems","VideoPlayer","handleTextChange","handleParagraphChange","paragraph","isMobileDevice","variant","VariantType","Viewport","options","video","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","_video$_links","videoId","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","player","Player","playerData","isEditor","params","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainer","detailsContainerCTA","handleText","handleParagraph","handleAdditionalText","handleAdditionalParagraph","handleLink","handleLinkTextChange","handleAdditionalLink","_this$props$config$ad","linkData","linkId","_heading$tag","OPERATIONS","PayCard","PayGiftCertificate","PayLoyalty","PayCustomerAccount","getCardTypeId","cardPrefix","arguments","resolveCardTypesAsync","CardType","Unknown","TypeId","findTenderIdTypeByOperationId","tenderTypes","operationId","matchedTenderType","tenderType","OperationId","TenderTypeId","roundNumber","toFixed","updatedCartVersion","channelConfiguration","giftCardExtends","tokenizedPaymentCard","guestCheckoutEmail","billingAddress","loyaltyAmount","cardPaymentAcceptResult","shouldEnableSinglePaymentAuthorizationCheckout","isExpressAddressApplied","Currency","cartTenderLines","amountDue","AmountDue","getTenderLinePromises","loyaltyCardNumber","LoyaltyCardId","chargedAmount","loyaltyTenderLinePromise","Amount","getTenderTypesAsync","getLoyaltyTenderLine","giftCardExtend","Balance","_giftCardExtend$Expir","_giftCardExtend$Expir2","tenderTypeId","giftCardPin","Pin","giftCardExpirationYear","ExpirationDate","split","giftCardExpirationMonth","creditCardTenderLinePromise","GiftCardId","GiftCardPin","GiftCardExpirationYear","GiftCardExpirationMonth","getGiftCardTenderLine","customerAccountAmount","customerAccountTenderLinePromise","CustomerId","isAuthenticated","createCustomerAccountTenderLine","amount","currency","TokenizedPaymentCard","House","Phone","Country","ThreeLetterISORegionName","Address1","Street","City","State","Zip","ZipCode","cardTenderLine","CardPaymentAcceptResult","getCreditCardTenderLineForSinglePaymentAuth","_tokenizedPaymentCard","cartTypeId","CardTypeId","TenderType","CardTokenInfo","getCreditCardTenderLine","all","cartVersion","Version","salesOrder","checkoutAsync","bypassCache","_error$data","_error$data2","_cardPaymentAcceptRes","AdditionalContext","updateRedirectAdditionalContext","newRedirectAdditionalContext","updateRedirectPaymentConnectorId","newRedirectPaymentConnectorId","Settings","PaymentConnectorId","updateIsCheckoutCallFailed","newIsCheckoutCallFailed","refreshCart","updateIsExpressCheckoutApplied","newIsExpressCheckoutApplied","Title","BulkPurchaseViewComponent","Module","container","content","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","RatingsHistogramView","histogramItems","histogramProps","moduleId","averageRating","componentId","_data$ratingsSummary$","_data$ratingsSummary$2","_data$ratingsSummary$3","_data$ratingsSummary$4","_data$ratingsSummary$5","_data$ratingsSummary$6","reviewsCount","ratingsSummary","reviewsCountString","numberOfReviewsString","RatingComponent","avgRating","readOnly","averageRatingAriaLabel","Node","buttonProps","starLabel","bar","histogramItem","ReviewCard","cardProps","isUserReview","review","userName","rating","date","renderDate","submittedDateTime","reviewTitle","reviewText","ratingHelpfulLabel","wasReviewHelpfulText","like","voteHelpfulButton","dislike","edit","report","reportToggle","responseName","userResponse","responderName","responseText","responseDate","cardBodyProps","responseProps","reviewProps","controlsProps","headerProps","reviewRatingNarratorText","parentId","parentType","isVoted","isVotedFor","i","votedReviews","approved","isDisabled","yesButtonText","noButtonText","voteCount","helpfulPositive","helpfulNegative","onClickMethod","updateReviewHelpfulness","signInUrl","toggleWriteReviewModal","editReviewCardText","Intl","DateTimeFormat","month","day","year","Date","toggleReportReviewModal","reportConcernText","reportedReviews","reportedText","reportedReviewId","returnRef","innerRef","ReviewCount","currentPage","reviewsShownOnEachPage","pageReviewCountText","_getReviewStartNumber","_getReviewEndNumber","PageControls","previousPageClick","_getPreviousPageData","nextPageClick","_getNextPageData","Next","nextAttribute","Previous","previousAttribute","_hasPreviousPage","_paginationAriaLabel","pageReviewAriaLabel","previousButtonText","_hasNextPage","nextButtonText","_getPagesCount","_getReviewsShown","ceil","isNextPage","page","pageModifier","pageReviewCount","updateReviews","selectedSortByOption","selectedFilterByOption","OrderTemplateLines","_onRemoveSelection","removeSelectedFailureMessage","removeSelectedSuccessMessage","lines","productSelection","productListLines","productListLine","productListId","ProductListId","maxWaitTimeInMilliSeconds","removeProductListLinesAsync","reload","_this$props$data$orde","substr","indexOf","productList","_onAddSelectionToBag","selectedLines","productLine","_productLine$fullProd","_productLine$fullProd2","_productLine$fullProd3","_productLine$fullProd4","_productLine$productL","ProductTypeValue","AdjustedPrice","_addItemToBag","_getCurrentUrl","reqContext","onCloseHandler","isItemAddedToOrderTemplateOpen","_renderItemAddedToCartDialog","itemAddedToCartDialogData","ItemAddedToCartDialog","_generateItemAddedToCartDialogResources","modalOpen","onClose","_renderPagination","itemsPerPage","skipCount","_getCurrentPageNumber","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_toggleDetailsDisplayed","isDetailsDisplayed","detailedProductView","OrderTemplateMobileLineView","_onDismiss","_changeQuantity","orderTemplateLinesData","orderLineIndex","findIndex","newProductListLine","prevQuantity","_objectWithoutProperties","_excluded","isQuantityDisabledForUpdate","updateProductListLinesAsync","newLine","updatedLines","updatedOrderTemplate","ProductListLines","update","ActiveOrderTemplateLinesInput","editOrderTemplateLineQuantityError","maxQuantityLimitText","addedToCartFailureMessage","getPriceForSelectedVariant","PriceForSelectedVariantInput","priceResult","AsyncResult","isMiniCart","addToCartBehavior","productPrice","maxQuantityForProductListLineItem","_removeItemFromOrderTemplateLines","token","userToken","_renameTemplate","_removeTemplate","deleteAsync","_orderTemplate$result","deleteOrderTemplateFailedText","newLink","_getViewport","innerWidth","sm","md","paginationPreviousText","paginationNextText","_viewport","_updateViewport","isConfirmAddSelectionToBagModalOpen","componentWillUnmount","removeEventListener","emptyOrderTemplateLinesText","errorGettingOrderTemplateLines","errorProps","statusMessage","Spinner","msg","progressNotificationText","Heading","OrderTemplateLinesStatusMessage","orderTemplateResult","_isFirstPage","emptyViewProps","productsStatusMessage","ProductsTable","ProductsTableRow","ProductsTableHeading","_renderProductListHeader","orderLines","_renderProductList","callbacks","updateQuantity","debounce","orderActions","_renderOrderTemplateActions","pagination","itemAddedToCartDialog","bulkOrderLineActions","_getOrderTemplateLineActions","toggleDetailsDisplayed","onSelect","updated","_product$fullProduct","onSelectAll","productNumberText","productUnitPriceText","productUOMText","productQuantityText","productActionsText","selectAllRowsText","productNumber","productUnitPrice","productUOM","productQuantity","productActions","clickHandler","OrderTemplateTableHeading","orderTemplateId","OrderTemplateBulkActions","onAddSelectionToBag","onRemoveSelection","isMinifiedView","_generateLinesAddedToCartDialogResources","viewCartButtonText","orderTemplateCloseButtonText","linesAddedToCartHeaderItemsOneText","linesAddedToCartHeaderLinesOneText","linesAddedToCartHeaderLinesFormatText","linesAddedToCartHeaderMessageText","itemAddedToCartHeaderItemOneText","itemAddedToCartHeaderItemFormatText","itemAddedToCartHeaderMessageText","addTemplateToBagButtonText","renameTemplateButtonText","deleteTemplateButtonText","closeWindowButtonText","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","orderTemplateActions","onRenameTemplate","onRemoveTemplate","renameOrderTemplateDialogStrings","_generateOrderTemplateNameDialogResources","linesAddedToCartDialogResources","OrderTemplateActionsView","orderTemplateHeaderLabel","renameOrderTemplateTitleText","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","renameOrderTemplateButtonText","orderTemplateCancelButtonLabel","skip","selectOneRowText","moreButtonText","viewProductDetailsText","addOrderTemplateItemToBagButtonText","removeItemFromOrderTemplateButtonText","deleteButtonText","currentProductProps","orderTemplateLine","ProductPrice","onAddToBag","onRemoveItem","onChangeQuantity","removeFromOrderTemplateLinesText","addToBagButtonText","OrderTemplateLineView","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","next","rangeStart","RightValueBoundString","rangeEnd","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","criterion","splice","renderConfigure","containerProps","dropdowns","renderConfigureDropdown","dropdown","labelContainerProps","errors","select","quickOrderView","renderForm","quickOrderProductContent","quickOrderMsgContent","COUPON_ATTRIBUTE_KEY","_onInputChange","_cart","addAttributeToCart","attrKey","attrValue","attributeArray","AttributeValues","attributeObj","TextValue","TextValueTranslations","attrIdx","a","_a$Name","toUpperCase","updateCart","newCartObject","removeAttributeFromCart","_a$Name2","totalCouponDiscountAmount","_coupon$Code","PromoCodeComponent","msdyn365Commerce","createComponentOverride","component","RatingsHistogram","handleHeadingChange","selectFilterBy","ratingCount","totalRatingsCount","completeClass","HistogramItems","hideCount","averageNumber","AverageRatingNumber","summary","totalReviews","TotalReviews","ratingsSummaryProps","stars","filterKey","createRatingsReviewsStateInput","WishlistItemDimension","WishListItemActions","onAddToCart","formattedPrice","cultureFormatter","formatCurrency","CurrencyCode","renderProductLink","recordId","productAttributes","renderInventoryInformationLabel","WishlistItemAddToCartButtonComponent","isInStock","outOfStockText","isServiceItem","ItemTypeValue","ReleasedProductType","Service","addItemAction","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","unitOfMeasure","_renderProductImage","image","fallbackImage","_renderPrice","_renderProductDimensions","WishlistItemsStatusMessage","WishlistItems","_renderHeading","productAvailability","addedToCartSuccessMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","_this$props$context","_await$cart$cart","curQuantity","_getInventoryValueMessage","_result$errorDetails2","_removeItemFromWishlist","wishlists","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","commerceList","castCommerceList","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","castSimpleProducts","_inventoryLabel","StockLevelLabel","_inventoryClassName","StockLevelCode","toLowerCase","_isProductInStock","productResult","IsProductAvailable","CommerceListLines","foundWishlistItem","commerceListLine","emptyWishlistText","wishlistErrorGettingWishlist","productsList","Products","ProductDimensions","addToCartButtonText","removeButtonText","wishlistState","productImage","productLink","productUnitOfMeasure","entireProductLink","productAriaLabel","inventoryInformation","productStatusMessage","WishlistItem","productInventoryCollection","ReviewsList","sortByDropdownOptions","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","componentDidMount","reviewsList","pagingInfo","listOfReviews","isFilterApplied","ratingsReviewsState","filterKeyValue","dropdownItemsCount","filterByOption","option","selectedIndex","_userReview","userReview","_reviewCard","_reviewCards","reviewList","reviewElements","isTakenDown","isPublished","_userReportModalToggle","reportingReviewId","_toggleReviewModal","_onReportModalOpen","updateReviewHelpfulnessVote","_userReviewModal","ReviewModal","isReviewModalOpen","userReviewRating","userReviewTitle","userReviewText","onModalToggle","onTitleChange","_onTitleChange","_onTextChange","onRatingChange","_onRatingChange","onReviewComplete","_onReviewComplete","renderContextId","_userReviewModalToggle","hasReviewError","reviewsListCallbacks","updateReviewTitle","updateReviewText","updateRating","isSuccess","_reportReviewModal","ReportReviewModal","isReportModalOpen","reportedKey","_onReportModalClose","onRadioChange","_onRadioChange","reportReview","_reportReview","hasReportError","reported","ReviewConcernCategory","SpamAdvertising","_reportReviewCallback","reportReviewConcern","ReportReviewConcernInput","getRnrPartnerId","getUserToken","getRnrAuthEndpointId","_value","reportedReview","updateSortByDropdown","notification","selectedOption","updateFilterByDropdown","skipItems","getSelectedProductIdFromActionInput","getReviewsForGivenProduct","GetProductReviewsInput","getRnrEndpointId","_updateVoteUi","alreadyExists","concat","submitHelpfulnessVote","SubmitHelpfulnessVoteInput","onReviewSubmitted","isSuccessful","submitReview","toggleModal","toggleReportModal","showSpinner","reviewModal","reportReviewModal","filterByDropdown","LabeledDropdown","labelText","filterByDropdownText","dropdownId","dropdownOptions","onSelectOption","controlledByParent","sortByDropdown","sortByDropdownText","reviewCount","refineReviewsProps","reviewsListProps","reviewCards","pageControls","noReviewsMessage","noReviewsWithFilterMessage","noReviewsWithSelectedFilterMessage","sortByOptions","filterByOptions","SearchResultContainer","SearchResultContainer_1","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","expandrefinerCount","defaultPageNumber","getCatalogId","isListPageStateUpdated","_updateListPageState","listPageState","_this$props$config$it","_this$props$config$it2","_this$props$context$r2","querySorting","sorting","JSON","parse","decodeURIComponent","currentPageNumber","sortingCritera","Columns","pageSize","activeProducts","totalProductCount","activeFilters","hydrateRefinersFromUrl","featureProduct","_getProductsDimensionsAvailabilities","_this$props$data$list","_this$props$data$list2","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","SearchResultModal","modalCloseButtonText","modalTitle","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","category","getFriendlyName","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","Link","categoryLinkAriaLabel","Url","categoryHierarchySeparator","Separator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","_getAllSortByOptions","hideRating","dropdownOption","SortingContainer","sortByDropDown","labelClassname","sortByDropdownLabel","dropdownClassname","toggleColor","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","productRefinerHierarchy","RefineSubmenu","selectedRefinerValues","refineItemCommonProps","_refineItemCommonProps","minValueSliderThumbAriaLabel","maxValueSliderThumbAriaLabel","onUpdateRefiners","_onUpdateRefiners","urlBuilder","_buildRefinerUrl","isExpandedOnInitialLoad","productCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","singleProductCountAriaLabel","_this$props$data$prod","_this$props$data$prod2","inventoryAwareSortableAttributeId","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","channelInventoryConfigurationId","_getChoiceSummary","_this$props$data$prod3","selectedRefiners","ChoiceSummary","clearAllText","choiceSummaryLabel","closeAriaLabel","selectedChoices","refinerHierarchy","choiceFormat","choiceRangeValueFormat","onChoiceClicked","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","choiceAriaLabel","_getProducts","_this$props$slots","_this$props$data$prod4","allowBackNavigation","shouldAllowBackNavigation","breadCrumbType","breadcrumbType","shouldAllowBack","quickviewSlot","slots","quickview","isPriceMinMaxFeatureState","ProductSearchResultItems","moduleType","isPriceMinMaxEnabled","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","_this$props$data$list6","newRefinementCriteria","clearAll","dropdownElementId","dropdownElement","document","getElementById","focus","selectedChoice","choiceClicked","selectedRefiner","isClearAll","refinerCount","productPrices","pending","placeholderTextMax","minLabel","maxLabel","rangeNameFormat","validationErrorNaN","validationErrorNotNumber","validationErrorRange","validationErrorNotRange","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a2","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r3","_this$props$context$r4","_this$props$context$r5","_this$props","newListPageState","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","stringify","Recommendation","recommendation","includeAttributes","productResults","getCollectionProducts","enableAffiliationBasedPricing","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r6","_this$props$context$r7","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","_listPageState$result","_listPageState$result2","_this$props$context$r8","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","FeatureSearchResultItem","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","ModalToggle","searchResultModal","ErrorMessage","FeatureSearchContainer","similarLookProduct","Browser","OrderSummaryLine","toBeCalculatedText","freeText","cssLabel","_buildOrderSummarySection","_computedLoyaltyAmount","getDeliveryMode","featureSate","pickupDeliveryMode","dM","OrderSummary","SubtotalAmount","SubtotalAmountWithoutTax","TaxAmount","TaxOnNonShippingCharges","OtherChargeAmount","hasDeliveryMethod","getDeliveryConfiguration","isTaxIncludedInPrice","isShowTaxBreakup","deliveryModes","taxOnShippingCharge","TaxOnShippingCharge","shippingChargeAmount","ShippingChargeAmount","otherChargeAmount","otherShippingChargeAmount","isTaxGreaterThanZero","otherChargeAmountTotal","subtotalAmountActual","reactNodes","subtotal","subTotalLabel","tax","taxLabel","orderTotal","orderTotalLabel","otherChargeLabel","shipping","shippingLabel","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardCounter","giftCard","totalAmountAfterGiftCard","loyalty","loyaltyLabel","giftcardLabel","totalDiscounts","totalDiscountsLabel","getValidProductImages","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","mediaLocations","mediaLocation","validateMediaLocaionAsync","pairs","pair","validateProductImages","imageData","Uri","AltText","http","XMLHttpRequest","open","send","MediaGallery","_this","_props$config$zoomedI","_inlineZoomDivRef","Map","mediaGalleryImages","defaultGalleryImageSettings","defaultThumbnailImageSettings","onExiting","animating","onExited","removeInlineZoomStyle","isLastItem","nextIndex","activeIndex","goToIndex","updateZoomedInImage","previous","images","mediaGalleryItems","isFirstItem","_getCarouselItem","isInPopup","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","tabIndex","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","_refHandler","divRef","which","KeyCodes","Enter","Space","openModalDialog","imageModalSlider","ZoomView","_mapProductToImageData","carouselprops","Carousel","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","ontoggle","galleryCarousel","ImagefullView","isImageZoomed","isInitialLoad","skipImageValidation","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","_this$props$config$im","source","imageSource","shouldUpdateOnPartialDimensionSelection","_setRenderType","mediaLocationsForSelectedVariant","_this$props$config$th","thumbnailImageSettings","_setImages","_this$props$config$th2","productVariant","_product$productVaria","_this$props$config$th3","_this$props$config$th4","_this$props$config$im2","isVertical","thumbnailsOrientation","isFullscreenAllowed","allowFullScreen","zoomViewMode","imageZoom","emptyPlaceHolderImage","placeholderImageName","_this$props$config$im3","_mediaLocation$Uri","_mediaLocation$AltTex","curatedImages","_filterMasterImageFromVariant","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","Modal","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","useTabList","_this$state$mediaGall","lastUpdate","defaultKey","_getEmptyThumbnailItem","_this$state$mediaGall2","zoomView","_renderEmptyImage","_this$props$config$im4","_this$props$config$sh","curatedImage","imagesToSet","shouldHideMasterProductImagesForVariant","_item$src","incrementedIndex","imageIndex","now","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh2","shouldHidePrimaryImages","variantImages","isVariantProduct","itemId","_item$src2","imagePattern","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","String","_handleMobileViewZoomedImageClick","style","transform","classList","remove","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","add","scrollTo","_this$props$config$da4","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","fullScreenTitleText","_product$PrimaryImage","parentDiv","querySelector","removeAttribute","removeContainerZoomStyle","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","storeSelectorModuleId","openDialog","alreadySelectedLocation","onLocationSelected","orgUnitLocation","updateCartLinePickupLocation","cartLineId","locationChangedHandler","_onLocationChangedCallback","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","foundLocation","_props$channelDeliver","retailMulitplePickupFeatureState","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","delivery","pickup","deliveryCode","toggleBopis","defaultComponent","_renderShippingMethod","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","toggleBOPIS","shipitText","pickUpInStoreText","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","ContainerProps","_assembleNode","foundProductAvailability","productPickUpOptions","_foundProductAvailabi","_props$cartState","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","defaultWishlistName","nameOfWishlist","availableQuantityInStock","isStockCheckEnabled","_getCartItemAvailableQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","isQuantityLimitsFeatureEnabled","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","MaximumQuantity","shouldSkipStockCheck","_getErrorMessage","_props$productAvailab","finalErrorMessages","productAvailabilites","shouldIgnoreWarehouse","InventLocationId","includeErrors","outOfRangeOneText","outOfRangeFormatText","cartlinesErrors","LineIndex","_i$DataValidationFail","DataValidationFailure","ErrorContext","onRemoveClickHandler","onRemoveClickFunction","payload","TelemetryEvent","RemoveFromCart","inventoryLbl","inventoryCode","isCustomPriceSelected","_cartline$CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","updateCartLinesQuantitySuccessHandler","pickUpInStore","pickitUpText","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","assembleCartlines","cartlines","_productAvailability$2","_productAvailability$3","_cartline$WarehouseId","_productAvailability$","CartLineGroupItems","_assembleGroupCartlines","deliveryType","carLineViewProps","getPromotionData","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","promotionOptions","Cart","Component","_isMounted","promotionPopupId","promotionLinkClick","showPromotionDialog","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","removeItemFromCartHandler","cartlineToRemove","validateCart","updateCartlineQuantity","cartlineToUpdate","cartLineQuantityUpdatedAsync","cartActionResult","_cartActionResult$err","lineUpdateFailure","validationResults","previousState","currentErrors","fulfillmentStoreIdUpdated","getActiveCartProductsAction","ActiveCartProductsInput","isCartValid","_this$props$data$cart","getOrderQuantityLimitsFeatureFlag","showAvailablePromotions","_this$props$data$cart2","guestCheckoutUrl","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","RetailMultiplePickupFeatureState","multiplePickUpEnabled","getCartLinesGroup","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","_getPromoCode","_getPromotions","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","expressCheckoutButton","paymentExpress","ExpressCheckoutSectionWrapper","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","storeSelector","waitingComponent","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","_this$props$data$cart3","_this$props$data$feat2","_this$props$data$cust","_cart$cart","RetailB2BEcommerceFeatureState","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","promotionStringHeading","promotionSeeAllLink","promotionDialog","ModalHeader","ModalBody","_promotion","_promotion$Promotion","Promotion","ModalFooter","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","element","_element$data","outOfStockErrorMessage","allErrors","_cartline$data","_cartline$data$produc","fullError","Wrapper","assertive","outOfStockErrorMessageHeader","header","InvoiceSummary","totalAmountLabel","invoiceLabel","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","itemsWithCountLabel","estimatedShippingLabel","estimatedTaxLabel","yetToBeCalculatedText","IsTaxIncludedInPrice","collapseTimeOut","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateCustomPriceAlertMessageText","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","createOrderTemplateHeader","createOrderTemplateDescription","createOrderTemplateButtonText","cancelNewOrderTemplateCreationButtonText","_this$props$data$feat3","_this$props$data$cata","modules","storeSelectorId","CartLineItems","warehouseAggregation","quantityDisplayText","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","RegExp","test","returnURL","origin","validateCartAsync","_featureStatuses$find","featureStatuses","_this$props$data$feat4","_this$props$data$cata2","_this$props$data$chan2","_this$props$data$cart4","cartLinesPickUpOptions","getDefaultColorSwatchSelected","productData","_colorAttribute$Swatc","_colorAttribute$Swatc2","_colorAttribute$Swatc3","colorAttribute","attributeValue","_attributeValue$KeyNa","KeyName","toLocaleLowerCase","defaultSwatch","Swatches","IsDefault","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","baseUrl","search","pathname","renderProductUnitOfMeasure","renderLabel","ratingAriaLabelText","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","ratingAriaLabel","roundedRating","renderPrice","basePrice","adjustedPrice","savingsText","renderProductPlacementImage","imageUrl","_context$app$config","contextConfig","fallbackImageSource","img","imageProps","ProductComponent","_product$Name","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","ratingCountAriaLabel","allowBack","quickViewButton","isEnabledProductDescription","inventoryLabel","dimensionAvailabilities","swatchItemAriaLabel","MIN_VALUE","productImageUrlFromSwatch","dimensionToPreSelectInProductCard","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","useEffect","selectedSwatchItems","Dictionary","updatePageAndImageUrl","useCallback","swatchItem","setValue","productPageUrlWithSwatch","newUrl","delete","swatchProductImageUrl","productImageUrls","newImageUrl","isUnitOfMeasureEnabled","onTelemetryClick","AverageRating","TotalRatings","attributeValues","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","colorHexCode","SwatchColorHexCode","SwatchImageUrl","isDefault","dimensionAvailability","_swatchItem$SwatchVal3","swatch","ProductComponentSwatchComponent","onSelectDimension","totalRatings","numberRatings","renderRating","inventoryAvailabilityLabel","selectedDimensions","getValues","convertDimensionTypeToProductDimensionType","cloneElement","selectedProductId","renderQuickView","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","ProductContainer","productComponent","ProductCollectionView","ProductCollectionContainer","GridComponentProps","isCarousel","DescriptionInterval","renderProductCards","getInventoryLabel","inventoryAttribute","renderProductCardsDescription","_props$data$products$","_props$data$featureSt","isAllowBack","quickviewslot","priceRangeSeparator","renderProducts","_props$data$listPageS","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","renderTitleCount","renderCategoryHierarchy","configureStickyFilter","isStickyHeader","headerContainer","headerHeight","offsetHeight","bannerHeights","headerElement","defaultContainer","refinerElement","documentElement","scrollTop","clientHeight","createSearchResultModal","modalProps","isRecoSearchPage","modal","modalHeader","createModalBody","modalFooter","modalBody","renderSort","submenu","renderRefinerMobile","renderRefiner","renderRefinerFooter","handler","doneAriaLabel","doneText","renderTitle","SearchResultContainerView","_props$context$action","useStickyFilter","stickyFilterSetup","enableStickyHeader","isExpanded","setIsExpanded","wrapperRefiner","useRef","refinerRefernce","handleClickOutside","contains","useOutsideClick","enableProdutDescription","filterText","retrieveItems","CarouselView","renderModuleAttributes","closeAnimation","pause","pauseOnHover","ride","autoplay","transitionType","hideFlipper","dismissEnabled","handleDismissCarousel","dismissCarouselAriaText","ariaLabelForDismissButton","activeImageView","activePointContainer","activePointDetailsContainer","imageMapper","additionalContentContainer","detailsContainerCta","productCardtopPosition","productCardleftPosition","overlay","productCard","reportReviewConcernDataAction","concernCategory","_renderStoreLocation","_assembleCartlines","foundProductDeliveryOption","foundProductDeliveryOptions","outOfStockThreshold","RemoveCartItem","removeCartItemAttribute","displayMode","storeLocation","getMiniCartData","miniCartData","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","CartIcon","getSortedCartLines","sortOrder","sort","item1","item2","_item2$LineNumber","_item1$LineNumber","LineNumber","_item1$LineNumber2","_item2$LineNumber2","_getImageSettings","_removeItemFromCartHandler","CheckOut","ViewShoppingBag","viewShoppingBagAttributes","_this$props$data$orgU","_setOrderQuantityLimitsFeatureFlag","componentDidUpdate","prevProps","enableHoverCart","isAnonymousCheckout","cartUrl","_getCheckoutURL","shouldShowMiniCart","isProductAddedToCart","AddToCartBehavior","showMiniCart","includeFlyout","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","flyoutTitle","flyoutTooltip","UncontrolledTooltip","placement","hideArrow","trigger","shouldShowCloseButton","cartPageUrl","priceString","totalPriceFormatString","cartIcon","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","miniCartWrapper","miniCartItemWrapper","goToCartButton","totalPrice","_cart$result$cart$Ver","lastValidatedCartVersion","FlyoutCartLineItems","cartLinesSortOrder","ProductCollection","validProducts","initProductState","productCollectionProducts","equals","_getProduct","_this$state$productsD","breaCrumbType","reviewCountAriaLabelValue","ratingCountAriaLabelSingleUser","_product$MasterProduc","masterProductId","layout","headingLabel","headingComponent","updatedProducts","getProductData","productCollectionViewProps","WrappedComponent","_super","ModuleState","call","initializeState","_b","states","getModuleStates","updateModuleStates","__assign","_a","hasInitialized","isRequired","isCancellable","isSubmitContainer","childIds","getModuleStateManager","validate","isPending","isSkipped","isCancelAllowed","shouldSubmitContainer","hasModuleState","setIsRequired","setIsSubmitContainer","onSkip","onDisable","getModule","getModuleByTypeName","getModuleStateManagerByTypeName","moduleStates","values","_moduleState","_validateLeaf","module","isMatch","_validateContainer","allMatched","skipSkippableItem","childId","_isPaymentSectionContainer","enableControl","__extends","prototype","_renderCartlines","cartEmptyText","_cartLine$cartlineId","renderCartLinesGroupHeader","pickUpText","shippingText","emailShippingText","titleSeparate","_cartLine$pickUpInSto4","renderCartLinesGroupTitle","_cartLine$pickUpInSto","_cartLine$pickUpInSto2","_cartLine$pickUpInSto3","CartView","_props$cart","_props$cart2","errorData","emailshippingText","emptyCartText","renderCartLinesGroup","_renderInvoiceSummarylines","invoiceSummaryLines","invoices","_renderOrderSummarylines","orderSummaryLines","onApplyHandler","onApplyGiftCard","onChangeNumberHandler","onEnterGiftCardNumber","onChangePinHandler","onEnterGiftCardPin","onChangeExpHandler","onEnterGiftCardExp","getForm","inputRef","inputPinRef","inputExpRef","giftCardNumber","giftCardExp","supportExternalGiftCard","additionalFields","disableAddGiftCard","applyGiftCardButton","giftCardFormLabel","giftCardNumberLabel","giftCardPinLabel","giftCardExpLabel","giftCardAlertLabel","giftCardPinPlaceholderText","giftCardExpPlaceholderText","formProps","inputPinLabel","inputExpLabel","alertFieldLabel","fade","includeAlertClass","inputNumber","inputPin","inputExp","applyButton","showGiftCardPinInput","showGiftCardExpInput","inputProps","inputNumProps","inputPinProps","inputExpProps","onRemoveHandler","onRemoveGiftCard","_giftCard$Id","getItem","getFormattedPrice","canRemove","enteredGiftCardLabel","giftCardAvailableBalanceLabel","removeGiftCardButton","balance","CardCurrencyCode","giftCardLast4Digit","selectedGiftCard","itemProps","getList","giftCards","listProps","GiftCardTitle","SupportedGiftCardType","CheckoutGiftCard","isFetchingGiftCard","isEnabled","couldPaidByGiftCard","giftCardSupported","External","shouldBeEnabledForGuest","handleCancelOrSubmit","hasSelectedItem","currencyCode","enterGiftCardNumber","enterGiftCardPin","enterGiftCardExp","removeGiftCard","applyGiftCard","giftCardTypes","getGiftCardTypes","giftCardType","isPinRequired","IsPinRequired","isExpRequired","IsExpirationDateRequired","PaymentMethodId","getGiftCard","addGiftCard","findGiftcardTenderTypes","giftcardType","matchedTenderTypes","Internal","ConnectorId","noBalanceError","invalidCardInfoError","invalidCardTypeError","noCardPinError","noCardExpError","supportedGiftCardType","internalGiftcardTenderTypes","externalGiftcardTenderTypes","Both","getGiftCardAsync","activeGiftCard","emptyInputError","duplicatedCodeError","invalidCodeError","card","GiftCard","getLoyaltyAmount","getGiftCardTotalAmount","showAdditionalFields","shouldPayGiftCard","moduleClassName","checkoutGiftCardProps","showGiftCard","TitleCompoent","_reloadPage","OrderTemplateListViewComponent","OrderTemplateList","OrderTemplates","OrderTemplate","createOrderTemplateButton","templateHeaderStatusMessage","console","log","CreateNewTemplateButtonComponent","createOrderTemplateText","createNewTemplateButtonText","onOrderTemplateCreated","headingForEmptyOrderTemplateList","textForEmptyOrderTemplateList","renderOrderTemplate","orderTemplateNodeProps","orderTemplateImageElement","currentImageListLength","CheckoutState","_giftCards","_giftCardExtends","_loyaltyAmount","_guestCheckoutEmail","_isTermsAndConditionAccepted","_customerAccountAmount","defineProperty","_tenderLine","_billingAddress","_shippingAddress","_cardPrefix","_loyaltyCardNumber","updateTokenizedPaymentCard","newTokenizedPaymentCard","updateTenderLine","newTenderLine","updateShippingAddress","newShippingAddress","updateBillingAddress","newBillingAddress","updateCardPrefix","newCardPrefix","removeGiftCardExtend","__spreadArrays","addGiftCardExtend","updateLoyaltyCardNumber","newLoyaltyCardNumber","updateLoyaltyAmount","newAmount","updateGuestCheckoutEmail","newGuestCheckoutEmail","updateTermsAndConditionsAcceptance","newIsTermsAndConditionAccepted","updateCustomerAccountAmount","VideoPlayerView","RefineItem","_onClick","selectedRefinementCriterion","anchorType","_productRefinerValue$","attrs","isSingleSelect","itemTypeClassName","inputType","SourceValue","Rating","_renderRating","LeftValueBoundLocalizedString","productCount","Count","refineMenuItemAriaLabel","_getRefinerUrl","_renderSwatch","_this$props$parentPro","_this$props$parentPro2","_productRefinerValue$2","hasColor","hasImage","swatchItems","checkIfShouldDisplayAsSwatch","SwatchComponent","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_this$props$selectedR","_productRefinerValue$3","refinerRating","ratingRefiner","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","reportConcernDropdownOptions","SubmitReview","submitReviewAttribute","SuccessButton","successAttribute","Cancel","cancelAttribute","reportSpamText","OffensiveContent","offensiveContentText","Profanity","profanityContentText","applicationNode","returnFocusRef","headerSubmitted","feedbackThankYouText","cancelReportReviewText","submitButton","reportReviewButtonText","succesfulButton","okReportReviewText","reportMessage","reportModalMessage","reportSubmittedMessage","radioButtons","radioPairs","errorMessageText","inputId","htmlFor","CONTENT","AddLineToTemplate","Search","searchTextInput","createRef","addLineButtonRef","_renderSearchForm","searchButtonAriaLabel","searchModalPlaceholderText","autoComplete","_onSearchSubmit","autoFocus","_get","Loading","_getSearchResults","NotFound","ProductList","_onQuantityChangeHandler","selectedQuantity","_onSelectItem","varianteInput","_getProductDimensions","selectedProductDimensions","ProductConfiguration","_onBackButtonClickHandler","_highlightSearchTerm","parsedName","unescape","dangerouslySetInnerHTML","__html","_resultCountText","searchResultsCountVerbage","searchResultsCountSubject","_addItemToTemplateHandler","AddItemToOrderTemplateInput","addItemToOrderTemplate","reloadPage","_toggleModalHandler","onComponentDidMount","_this$searchTextInput","onComponentDidUpdate","_this$searchTextInput2","addLineModalLinkText","backToResultsText","showBackArrow","_renderContent","addToTemplateHandler","onQuantityChangeHandler","highlightSearchTerm","searchForm","productProps","renderResultCountText","notFoundSearchErrorNotice","notFoundSearchErrorRedediation","NotFoundComponent","searchErrorMessage","searchText","searchCriteriaInput","Context","ChannelId","IncludeAttributes","SearchCondition","searchByCriteriaAsync","Dropdown","selectMenu","_onChanged","selectId","selectedValue","innerText","dropdownList","dropdownName","selected","OrderTemplateQuantity","_validateMin","minValue","currentInput","_handleChange","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","incDisabled","extraClass","getChangeHandler","_onIncrementalChange","onBlur","updatedQuantity","defaultProps","_getDimensionsError","dimensionName","dimensionMissingError","_addToTemplateHandler","isBusy","showAddConfirmation","addToTemplateDuplicateError","addToTemplateGenericError","_onQuantityChange","_onDimensionChanged","_this$state$errors","remainingDimensionsErrors","selection","buttonDisabled","dimensionInput","variantDimensions","availabilityInput","priceInput","unitPrice","b","_product$Name2","addItemToTemplateText","addLineProductUnitPricePrefix","quantitySelectLabel","addLineProductUnitOfMeasurePrefix","totalPriceLabel","_formatPrice","_getDimensionsNodes","_getConfirmationMessage","selectedDimensionNames","addToTemplateConfirmation","_this$state$errors2","unshift","selectProductButtonText","fallBackImg","ProductSelectButton","buttonText","setBusy","getClickHandler","removeOrderActionHandler","_removeOrderTemplate","addTemplateToBag","_getOrderTemplateAddToCartDialog","renameTemplate","_getOrderTemplateRenameControl","removeTemplate","RenameOrderTemplateComponent","OrderTemplateLineActions","getAddToBag","getRemoveItem","PopUp","showMobile","setShowMobile","getActionButton","removeButtonClassName","addButtonClassName","onSelectLineHandler","UnitOfMeasure","selectLine","productInfo","renderProductInfo","productQuantityView","_generateQuantity","addToBagButton","popUp","onChangeHandler","_orderTemplateLine$fu","dimensionsLine","componentClassName","getOnChange","checkedLines","scope","AddCheckoutLoyalty","cardNumber","rewardPoints","loyaltyAmountContainer","appliedLoyaltyAmountContainer","loyaltyAmountLabel","loyaltyAmountInput","loyaltyAmountApplyButton","showAppliedAmount","loyaltyAmountAppliedText","loyaltyAmountAppliedPrice","loyaltyAmountRemoveButton","rewardPoint","checkoutLoyaltyRewardPoint","availablePointsText","activePoints","expiringPointsText","expiringPoints","ShowCheckoutLoyalty","_ref2","coveredAmountText","CheckoutLoyaltyView","checkoutLoyalty","showLoyalty","addLoyalty","isShowLoyalty","isShowAddLoyalty","CartIconView","cartLineItemFunctions","dimensionStrings","_productDimension$Dim","_productDimension$Dim2","_productDimension$Dim3","_productDimension$Dim4","ProductDimensionType","Color","Configuration","Size","Style","_discountLine$OfferId","Percentage","discountPercent","_discountLine$Percent","updatedPercent","DiscountLineTypeValue","DiscountLineType","TenderTypeDiscount","_discountLine$Effecti","effectiveAmount","_chargeLine$Calculate","_cartline$ChargeLines2","_otherCharges$map","itemIndex","renderProductUnitPrice","renderDiscountLines","cartLineContentClassName","generateErrorMessage","generateQuantityAndPrice","_props$maxQuantity","_props$data$product$I","renderSaving","PickUpAtStoreComponent","EmailDeliveryComponent","LineItemComponent","_ref3","LineItemGroupComponent","_ref4","lineItem","LineItemGroupComponentWithMultiplePickUp","_ref5","LineItemComponentWithMultiplePickUp","_ref6","PickUpAtStoreComponentWithMultiplePickUp","_ref7","LineItemsComponent","_ref8","OrderSummaryComponent","_ref9","PaymentSummaryComponent","_ref10","CheckoutView","canShow","checkoutProps","hasSalesOrder","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","termsAndConditionsProps","orderConfirmation","loading","guidedForm","orderSummary","invoicePaymentSummary","placeOrderButton","termsAndConditions","keepShoppingButton","onClickSubmit","submitButtonAttribute","cancelButtonAttribute","modalHeaderNode","discardReviewButtonText","submitDisabled","submitReviewButtonText","ratingsInput","ratingLabel","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","inputRow","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","selectRatingAriaLabel","initialRating","selectRatingLabel","reviewTitleMaxLength","reviewTitleAriaLabel","reviewTitleLabel","reviewTextMaxLength","rows","reviewAriaLabel","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","PrivacyPolicy","privacyPolicyAttribute","privacyPolicyTitle","onReviewSubmission","userEmail","emailAddress","submitUserReview","firstName","getReviewInput","GetUserReviewInput","getInvoicePaymentSummary","isValidationPassed","isPlaceOrderLoading","handleCheckoutHeadingChange","checkoutHeading","cartStatus","isEmptyCart","getSlotItems","triggerPaymentWithPlaceOrder","updateShouldTriggerPaymentWithPlaceOrder","newShouldTriggerPaymentWithPlaceOrder","shouldTriggerPaymentWithPlaceOrder","onPlaceOrder","checkoutOutOfStockErrorMessage","invalidCartVersionErrorMessage","missingRequiredCartTenderLinesErrorMessage","isOverMaxQuantity","_checkout$result","hasOrderConfirmation","updateCartLineEmailAddress","placeOrder","updateIsPaymentSectionContainerReady","newIsPaymentSectionContainerReady","emailDeliveryCartLines","lineDeliverySpecifications","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","DeliveryPreferenceType","ElectronicDelivery","ElectronicDeliveryEmailAddress","updateLineDeliverySpecificationsAsync","updatedCart","_cart$CartLines","_cart$CartLines2","productsThatShouldValidateInventory","_cartlineProduct$Beha","cartlineProduct","isStockedItem","IsStockedProduct","productInventory","_productInventory$Pro","cartLinesInventoryValidation","getActiveChildModuleStates","onContainerReady","redirectToCartPage","notFoundEditCartLinkMessage","editCartLink","validateForCheckout","retry","validateForCheckoutAsync","_result$ValidationFai","ValidationFailuresByCartLines","refreshError","isEditorialMode","isTermsAndConditionAccepted","isCartReady","_this$props$data$chec18","isPaymentSectionContainerReady","_this$props$data$chec19","_this$props$data$chec20","_this$props$data$chec21","_this$props$data$chec22","redirectAdditionalContext","isPaymentVerificationRequired","_this$props$data$chec23","isPaymentSectionContainerHasError","_this$props$data$chec24","canPlaceOrder","_this$props$data$chec25","_this$props$data$chec26","updateIsPlaceOrderEnabledInRedirection","newIsPlaceOrderEnabledInRedirection","_this$props$data$chec27","_this$props$data$chec28","_this$props$data$chec29","_this$props$data$chec30","_this$props$data$chec31","_this$props$data$chec32","_this$props$data$chec33","_this$props$data$chec34","_this$props$data$chec35","_this$props$data$chec36","_this$props$data$chec37","_document","_this$props$data$chec38","disableGuidedCheckoutFlow","backToShopping","placeOrderText","confirmPaymentText","cookieConsentRequiredMessage","checkoutClass","checkoutInformation","isConsentGiven","cookies","backToShoppingAttributes","checkoutBtnText","hasShippingAddress","hasCartDeliveryMode","hasGuestCheckoutEmail","hasExpressPaymentContainer","getElementsByClassName","display","renderMsdyn365Text","AlertComponent","_this$props$data$chec39","_this$props$data$chec40","GuidedFormComponent","resource","getOrderSummary","PlaceOrderButtonComponent","closeButtonGlyph","stopPropagation","_getSelectedRefinerChoice","itemClicked","nextItemToFocus","nextSibling","choice","parent","hierarchy","_getKeyForRefinerValue","selectedRefinersMap","clearAllAttributes","overallFormat","rangeFormat","refinerValueName","refinerName","UnitText","textContent","SearchForm","FormWrapper","cancelBtn","submitBtn","_renderKeywordSuggestions","KeywordSuggest","UlKeyword","keywordSuggestions","isLoadingAutoSuggest","isLoadingNode","_renderProductSuggestions","ProductSuggest","UlProduct","productSuggestions","LiProduct","AProduct","_renderCategorySuggestions","CategorySuggest","UlCategory","categorySuggestions","SearchView","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","autosuggestCategory","autosuggestKeyword","autosuggestProduct","balanceCheckButton","GiftCardBalanceCheck","_isEnabled","_getFormattedPrice","_enterGiftCardNumber","_clearError","_enterGiftCardPin","_enterGiftCardExp","_setError","_applyGiftCard","_getGiftCardTypes","_getGiftCard","_findGiftcardTenderTypes","giftCardBalanceCheckProps","_onToggleItem","_onToggleSubmenu","expanded","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","Slider","SliderWithBars","rangeType","RangeRefineItem","sliderKey","prevState","ModuleStatesCacheKey","cacheKey","modalCloseButtonReference","CreateOrderTemplateButton","onCancelHandler","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","onCreateButtonClick","OrderTemplateNameDialog","isUpdateDialog","setModalOpen","parentElementRef","SignInMessage","SignInButton","SignIn","WriteReview","PureComponent","writeReviewCallbacks","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","_renderThumbnails","thumbnails","_renderThumbnailItem","MediaGalleryView","ratingId","_totalRatings$toStrin","ActiveProductComponent","imgData","assembleNode","isOpenInNewTab","activeImageAdditionalContent","CanvasCalculations","CanvasStyles","ImageMapper","_isDesktopViewPort","_context","getActiveImageWidth","activeImageReferenceValue","activeImageRefs","clientWidth","getActiveImageHeight","convertHexToRgb","hexColor","exec","rValue","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","_this$_canvas$current","_this$_canvas$current2","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","width","fillStyle","body","fillText","drawButton","_this$_canvas$current3","_this$_canvas$current4","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","_this$props$imageMapp","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","radius","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","animate","_this$_canvas$current5","_this$_canvas$current6","ellipse","requestAnimationFrame","textFadeInterval","collapseAnimation","_this$props$imageMapp2","collapseAnimationStartWidth","collapseAnimationEndWidth","clearMargin","clearHeight","clearWidth","collapseRadius","textFadeOutValue","textFadeOutStartValue","_this$_canvas$current7","_this$_canvas$current8","clearRect","drawCircle","_this$_canvas$current9","_this$_canvas$current10","viewPort","doubleMultiplier","strokeStyle","arc","PI","scaleCoords","imgWidth","defaultWidth","defaultScale","scale","coord","renderPrefilledAreas","areaMap","areas","area","computeCenter","scaledCoords","handleHoverOn","center","handleHoverOff","_this$_canvas$current11","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","height","click","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","_this$props$imageMapp3","_this$props$imageMapp4","_area$productSearchRe","xsRadius","extendedArea","areaKey","altTextWithProductName","productSearchResult","shape","onFocus","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","shouldRender","_requestContext$gridS","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","areaId","updateClientWidth","renderImageMapper","_this$props$config$ac","configProduct","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","xPosition","yPosition","activePoint","mappedArea","_activeImageClass","enterArea","leaveArea","activeImage","_activeImageRefs","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","resetState","renderProductComponent","_this$state$area","_this$state$area$prim","_product$ItemId","baseImageUrl","productImageSettings","renderProductCard","_productCardDivRef","renderOverlay","getProductCardPositionX","_this$props$config$pr","_this$props$config$pr2","_defaultImageSettings","_area$center$","_area$center","getDefaultImageSettings","productImageSettingsWidth","productCardWidth","leftAllignPosition","position","getProductCardPositionY","_this$props$config$pr3","_this$props$config$pr4","_defaultImageSettings2","productImageSettingsHeight","produtCardHight","_area$center$2","_area$center2","keyDown","enterKey","nodeName","escKey","renderActiveImageDetailsLinks","_telemetryContent","willOpenInNewTab","renderActiveImageDetailsHeading","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","_activeImageIdPart$","activeImageSource","decrementOne","_handleOutsideClick","_this$_productCardDiv","timeoutInterval","Array","from","handleAdditionalLinkText","_onRemoveFromOrderTemplateList","p","headerStatusMessage","_heading$text","_heading$tag3","emptyOrderTemplateText","orderTemplatesData","orderTemplateListHeading","orderTemplateListTitle","_heading$tag2","_renderOrderTemplateList","currentTemplateProps","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","totalCount","percentage","formattedPercent","NumberFormat","barItemAriaLabel","Progress","_selectedRefinementCr","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","ariaValueText","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","initialMin","initialMax","maxValue","labels","sliderKeyString","sliderThumbs","validationErrorMin","validationErrorMax","touchedMin","touchedMax","previousProps","updateSliderProps","_renderInputFields","_renderSlider","_this$props$selectedR5","_this$props$selectedR6","_this$props$selectedR7","_this$props$selectedR8","formAttrs","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","ariaAttributes","inForm","step","orientation","showLabels","showTooltip","onChangeEnd","handleTooltipText","_changeValue","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","maxNum","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","touched","validationError","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","tooltip","buildReviewCard","createReviewModal","createReportModal","ReviewsListview","CheckoutAlert","_renderItem","WishlistItemsView","From","SelectedGiftCard","GiftCardList","AddResource","ShowResource","CheckoutGiftCardView","quantityLabel","OrderTemplateLinesView","toggleDetails","wrapClassName","BulkPurchase","_toggleCollapse","hasDimensionsInProps","hasDimensionsInData","_renderCollapseContent","_renderCollapseButton","_renderCollapse","bulkPurchaseHeaderTitle","_renderMainContent","RichTextComponent","bulkPurchaseDescriptionText","_renderMatrix","ProductDimensionsMatrix","buttonsStates","onPlaceOrderHandler","buttonSetState","CheckoutPlaceOrderButton","setIsBusy","Purchase","CarouselModule","_handleDismissCarousel","dismissCarousel","_next","closeNow","_previous","_onExiting","_onExited","_goToIndex","newIndex","showLineItems","orderSummaryProps","applyPromotionHandler","_event$currentTarget$","modalNode","modalFooterNode","zIndex","Form","Item","GiftCardBalanceCheckView","AdressInput","ariaValueMax","ariaValueMin","ariaValueNow","CheckoutLoyaltyLabel","CheckoutLoyaltyText","CheckoutLoyalty","_defaultLoyaltyPoints","loyaltyCard","CardNumber","updateLoyaltyCardId","shouldPayLoyalty","_dialogToggleRef","_applyLoyaltyPoints","_removeLoyaltyPoints","_onBlur","dollarsApplied","maxDollars","isFetchingLoyaltyCard","loyaltyTransactionEstimation","MaxCurrencyValueOfLoyaltyPoints","_updateEstimate","_updateLoyalty","headingTag","loyaltyHeadingText","TextComponent","loyaltyCoveredAmountText","Drawer","toggleButtonText","_drawerHeader","glyphPlacement","RewardPoints","points","_renderPointSection","availablePointsLabel","expiringLoyaltyPointsLabel","LabelComponent","payWithLoyaltyAmountLabel","InputComponent","applyCheckoutLoyaltyPaymentText","removeCheckoutLoyaltyPaymentText","point","RewardPointId","ActivePoints","PointsExpiringSoon","parseFloat","num","channelConfig","loyalPointsRequest","createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput","_query","callActionOrExecute","_points$MaxCurrencyVa","GetLoyaltyTransactionEstimationInput","newMaxPoints","isAddDisabled","isRemoveDisabled","addHandler","removeHandler","searchInputAriaLabel","backButtonText","addSelectedToBagButtonText","removeSelectedToBagButtonText","addLineProps","DeliveryOptionList","DeliveryOptionSelected","CheckoutDeliveryOptionsView","productRecordId","featureSimilarDescriptionTitle","featureSimilarLooksTitle","CheckoutGuidedCard","editButtonRef","formCardRef","renderFooder","isVisted","isSubmitting","hasControlGroup","saveAndContinueBtnLabel","canSubmit","canCancel","Save","SaveContinue","saveBtnAttributes","cancelBtnAttributes","focusOnFirstFocusableElement","node","focusOnEditButton","scrollToTitle","formCard","scrollIntoView","getTitle","Tag","isActive","onNext","changeBtnLabel","CheckoutChange","changeBtnAttributes","canEdit","active","closed","visted","hidden","initialized","ready","updating","SearchState","SuggestionType","AutoSuggestInput","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","searchCriteria","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","ImageUrl","AllSearchResults","getSearchSuggestionsActionDataAction","autoSuggestPromises","inputData","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","queryUrl","categoryRefiners","Category","encodedRefiner","compressRefiners","formattedText","getRichTextHtml","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","inputNode","submitBtnNode","KeywordSuggestionsComponent","formattedLink","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","ProductSuggestionsComponent","productSuggestionHeading","productAutoSuggestionHeading","_item$Value","Value3","DecimalValue","_renderThumbnail","_getLiWrapper","_getAWrapper","recid","_props$resources","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","size","SpinnerSize","medium","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","Escape","formReference","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","inputSuggestionType","_loadSuggestions","_handleSubmit","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","route","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","autoSuggestAriaLabel","searchInputMaxLength","searchFormClass","_initSuggestionTypes","_suggestions$AllSearc","_suggestions$AllSearc2","_suggestions$AllSearc3","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","Keyword","_item$RefinerRecordId","suggestionTypes","suggestionTypeCriterion","unique","validSuggestions","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","_getSearchRefiners","Random","Guid","generateGuid","_getSearchSuggestions","_updateSearchRefiners","suggestionTypeItem","charAt","ProductsDataActions","getProductSearchRefinersAsync","OrderTemplateListView","_renderOrderTemplate","CheckoutGuidedForm","currentStep","getEnabledModules","getStep","getId","getHeading","_state$childIds","currentId","shouldCollapseAfterRedirect","hasMissingInfo","hasOrderError","GuidedCard","InvoiceSummaryLine","_buildPaymentSummarySection","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","CheckoutStateInput","buildCacheKey","submitReviewDataAction","propsContext","cartResult","shouldRetry","_validationResult$Val","validationResult","CartsDataActions","validateError","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","newQuantity","updateLineResult","updateCartLineQuantity","orderedProducts","redirect","orderConfirmationUrl","updateSalesOrder","newSalesOrder","newOrderedProducts","WriteReviewView"],"mappings":"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","file":"static/js/7.078ddb35910815ca5756.chunk.js","sourcesContent":["/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsDescriptionProps {\n description?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.description\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsDescription: React.FC = ({\n description\n}) => {\n if (!description) {\n return null;\n }\n\n return (\n {description}\n );\n};\n\nexport default CheckoutDeliveryOptionsDescription;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsErrorMessageProps {\n message?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.message\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsErrorMessage: React.FC = ({\n message\n}) => {\n if (!message) {\n return null;\n }\n\n return (\n

\n {message}\n

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

\n {title}\n

\n );\n\n};\n\nexport default CheckoutDeliveryOptionsErrorTitle;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface 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 * AddPaymentForm SFC.\n * @param root0\n * @param root0.isChecked\n * @param root0.value\n * @param root0.ariaSetSize\n * @param root0.ariaPosInSet\n * @param root0.ariaLabel\n * @param root0.telemetryContent\n * @param root0.onChange\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","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { 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';\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { action, computed, observable, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ErrorComponent } from '../../common/error';\nimport { ICheckoutDeliveryOptionsData } from './checkout-delivery-options.data';\nimport { filterDeliveryModeOption, ICheckoutDeliveryOptionsProps, useDefaultDeliveryOption } 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 alert?: 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-expect-error\n@withModuleState\n@observer\nclass CheckoutDeliveryOptions extends React.Component {\n @observable private selectedItemId: string = '';\n\n @observable private deliveryOptions: DeliveryOption[] = [];\n\n @observable private isLoading: boolean = false;\n\n @observable private errorMessage?: string;\n\n @computed private get isDataReady(): boolean {\n return (this.props.data.checkout.result && this.props.data.checkout.status) === 'SUCCESS';\n }\n\n private cartDeliveryMode?: string;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n private readonly isSelectDefaultOptionEnabled?: boolean;\n\n public constructor(props: ICheckoutDeliveryOptionsModuleProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.isSelectDefaultOptionEnabled = this.props.config.useDefaultDeliveryOption &&\n this.props.config.useDefaultDeliveryOption !== useDefaultDeliveryOption.none;\n }\n\n public async componentDidMount(): Promise {\n when(\n () => this.isDataReady,\n async () => {\n await this.init();\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.shippingAddress,\n async () => {\n await this.loadDeliveryOptions();\n this.props.moduleState.setIsCancellable(false);\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.isExpressCheckoutApplied,\n async (isExpressCheckoutApplied) => {\n if (isExpressCheckoutApplied && this.canShip()) {\n await this.loadDeliveryOptions();\n this.props.moduleState.setIsCancellable(false);\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n }\n }\n );\n }\n\n public shouldComponentUpdate(nextProps: ICheckoutDeliveryOptionsModuleProps,\n nextState: ICheckoutDeliveryOptionsViewState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\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 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 && !this.isSelectDefaultOptionEnabled;\n const isShowSelected = !this.isLoading && !hasError && isReady;\n const { errorMessageTitle, deliveryOptionAriaLabel } = this.props.resources;\n\n const viewProps = {\n ...this.props,\n onDeliveryOptionChange: this.onDeliveryOptionChange,\n selectedItemId: this.selectedItemId,\n deliveryOptionsData: this.deliveryOptions,\n isLoading: this.isLoading,\n alert: this.errorMessage && ,\n errorMessageData: this.errorMessage,\n viewState: {\n isLoading: this.isLoading,\n isError,\n isShowList,\n 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 DeliveryOptionsList: {\n className: 'ms-checkout-delivery-options__list',\n role: 'list',\n 'aria-label': deliveryOptionAriaLabel },\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 readonly init = async (): Promise => {\n this.props.moduleState.init({\n onEdit: this.isSelectDefaultOptionEnabled ? undefined : this.onEdit,\n onCancel: this.isSelectDefaultOptionEnabled ? undefined : this.onCancel,\n onSubmit: this.isSelectDefaultOptionEnabled ? undefined : this.onSubmit,\n status: (!(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption) &&\n this.canShip()) ? 'updating' : 'disabled'\n });\n\n this.cartDeliveryMode = this.getSavedDeliveryOption();\n await this.loadDeliveryOptions();\n };\n\n private readonly canShip = (): boolean => {\n const hasInvoice = this.props.data.checkout.result?.checkoutCart.hasInvoiceLine;\n return !hasInvoice && this.getCartLinesForShipping().length > 0;\n };\n\n private readonly 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 readonly 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 return {\n DeliveryOption: { className: 'ms-checkout-delivery-options__option-selected' },\n description: ,\n price: \n };\n };\n\n private readonly getErrorMessage = (): ICheckoutDeliveryOptionsError => {\n const { errorMessageTitle } = this.props.resources;\n return {\n // @ts-expect-error\n CheckoutDeliveryOptionsError: { tag: 'span', className: 'ms-address-form__error', role: 'alert', 'aria-live': 'assertive' },\n title: ,\n message: \n };\n };\n\n private readonly getDeliveryOptionList = (): ICheckoutDeliveryOptionEdit[] => {\n const count = this.deliveryOptions.length;\n const { priceFree } = this.props.resources;\n const { id, typeName, context } = this.props;\n\n return this.deliveryOptions.map((deliveryOption: DeliveryOption, index: number) => {\n return {\n DeliveryOption: { className: 'ms-checkout-delivery-options__option', role: 'listitem' },\n code: deliveryOption.Code || '',\n radioButton: (\n \n ),\n description: (\n \n ),\n price: (\n \n )\n };\n });\n };\n\n private readonly getSaveButton = (): React.ReactNode => {\n const { saveBtnLabel = 'Save' } = this.props.resources;\n return (\n \n {saveBtnLabel}\n \n );\n };\n\n private readonly getEditButton = (): React.ReactNode => {\n const { editBtnLabel = 'Change' } = this.props.resources;\n return (\n \n {editBtnLabel}\n \n );\n };\n\n private readonly getCancelButton = (): React.ReactNode => {\n const { cancelBtnLabel = 'Cancel' } = this.props.resources;\n return (\n \n {cancelBtnLabel}\n \n );\n };\n\n private readonly 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 readonly clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.errorMessage = undefined;\n };\n\n private readonly onSave = async (): Promise => {\n await this.onSubmit();\n };\n\n private readonly onEdit = async (): Promise => {\n this.onUpdating();\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n };\n\n private readonly onSubmit = async (): Promise => {\n await this.updateCartDeliverySpecification(this.selectedItemId);\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n };\n\n private readonly onCancel = async (): Promise => {\n // Reset to the saved value\n const savedDeliveryOption = this.getSavedDeliveryOption();\n if (savedDeliveryOption) {\n this.selectedItemId = savedDeliveryOption;\n this.onReady();\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n } else {\n this.onUpdating();\n }\n };\n\n private readonly getSavedDeliveryOption = (): string | undefined => {\n const cartLinesForShipping = this.getCartLinesForShipping();\n return cartLinesForShipping[0] && cartLinesForShipping[0].DeliveryMode;\n };\n\n private readonly 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,\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 readonly 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 ? ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(\n cartLine => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (cartLine.DeliveryMode !== this.channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLine.DeliveryMode) && cartLine.DeliveryMode !== emailDeliveryModeCode) : cartLine)\n ) : ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(\n cartLine => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode) : cartLine)\n );\n };\n\n private readonly 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, channelDeliveryOptionConfiguration: this.channelDeliveryOptionConfig });\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({\n callerContext: context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context.actionContext)\n },\n cartId, shippingAddress, [], deliveryOptionFilter, true);\n\n if (hasShippingDeliveryLines) {\n await this.updateCartDeliverySpecification(originalDeliveryMode);\n }\n\n if (response && response.length > 0) {\n this.deliveryOptions = response;\n }\n } catch {\n this.setError(resources.genericErrorMessage);\n }\n\n if (this.deliveryOptions.length === 0) {\n this.setError(resources.deliveryOptionsNotFound);\n } else if (this.cartDeliveryMode && this.isDeliveryModeExists(this.cartDeliveryMode)) {\n this.selectedItemId = this.cartDeliveryMode;\n this.cartDeliveryMode = undefined;\n this.onReady();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: true });\n\n if (!this.props.data.checkout.result?.isPaymentVerificationRedirection) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n } else {\n this.onUpdating();\n this.selectedItemId = this.deliveryOptions.length > 0 ? this.deliveryOptions[0].Code || '' : ''; // By default, select first delivery\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: !!this.isSelectDefaultOptionEnabled });\n }\n\n this.isLoading = false;\n }\n };\n\n private readonly getStoredDeliveryOptions = async (): Promise => {\n if (!this.props.data.checkout.result) {\n return;\n }\n\n const { context } = this.props;\n const cartState = this.props.data.checkout.result.checkoutCart;\n\n if (context) {\n this.isLoading = true;\n this.deliveryOptions = [];\n this.selectedItemId = '';\n this.clearError();\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, channelDeliveryOptionConfiguration: this.channelDeliveryOptionConfig });\n if (hasShippingDeliveryLines) {\n await this.updateCartDeliverySpecification(originalDeliveryMode);\n }\n }\n\n if (this.cartDeliveryMode) {\n this.selectedItemId = this.cartDeliveryMode;\n this.cartDeliveryMode = undefined;\n this.onReady();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: true });\n\n if (!this.props.data.checkout.result.isPaymentVerificationRedirection) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n }\n\n this.isLoading = false;\n }\n };\n\n private readonly loadDeliveryOptions = async (): Promise => {\n const shippingAddress = this.props.data.checkout.result?.shippingAddress;\n const isExpressCheckoutApplied = this.props.data.checkout.result?.isExpressCheckoutApplied;\n\n if (this.canShip() && shippingAddress) {\n if (!this.props.data.checkout.result?.isPaymentVerificationRedirection || this.isSelectDefaultOptionEnabled || isExpressCheckoutApplied) {\n await this.getDeliveryOptions(shippingAddress);\n }\n\n if (this.props.data.checkout.result?.isPaymentVerificationRedirection) {\n await this.getStoredDeliveryOptions();\n }\n\n if (this.isSelectDefaultOptionEnabled || isExpressCheckoutApplied) {\n this.onSubmit();\n }\n }\n };\n\n private readonly onDeliveryOptionChange = (event: React.ChangeEvent) => {\n const deliveryModeId = event.currentTarget.value;\n this.selectedItemId = deliveryModeId;\n };\n\n private readonly onReady = () => {\n if (!(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption)) {\n this.props.moduleState.onReady();\n }\n };\n\n private readonly onUpdating = () => {\n if (!(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption)) {\n this.props.moduleState.onUpdating();\n }\n };\n\n private readonly onPending = () => {\n if (!this.isSelectDefaultOptionEnabled) {\n this.props.moduleState.onPending();\n }\n };\n}\n\nexport default CheckoutDeliveryOptions;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitHelpfulnessVoteInput } from './inputs/submit-helpfulness-vote-input';\n\nasync function submitHelpfulnessVote(input: SubmitHelpfulnessVoteInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId}, locale= ${\n input.locale\n },`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/votes/review/${input.reviewId}` +\n `?tenantId=${input.tenantId}` +\n `&locale=${input.locale}`;\n\n const requestBody = {\n isHelpful: !!input.isHelpful\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch((error) => {\n ctx.trace('[SubmitHelpfulnessVote] Failed to vote on a review');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitHelpfulnessVote] Failed to vote on a review');\n return false;\n });\n}\n\nfunction inputIsValid(input: SubmitHelpfulnessVoteInput): boolean {\n return (\n input &&\n input.reviewId.length > 0 &&\n input.tenantId.length > 0 &&\n input.locale.length > 0 &&\n input.authToken.length > 0\n );\n}\n\nexport const submitHelpfulnessVoteDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-helpfulness-vote',\n action: >submitHelpfulnessVote\n});\n\nexport default submitHelpfulnessVoteDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartLineItemComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, * as Msdyn365 from '@msdyn365-commerce/core';\nimport { CartLine, OrgUnitLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getProductUrlSync, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport get from 'lodash/get';\nimport groupBy from 'lodash/groupBy';\nimport * as React from 'react';\n\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\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 let productUrl = getProductUrlSync(product, context.actionContext, undefined);\n if (MsDyn365.isBrowser) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartLine.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n\n return (\n \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: \n {pickUpAtStoreWithLocationText}\n ,\n location:
\n {pickupDeliveryLocation}\n
\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: \n {emailDeliveryText}\n \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 ? 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 ? 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\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 !== '') ? (_getCartShipDeliveryMode(cartLine) && cartLine.DeliveryMode !== emailDeliveryModeCode) : cartLine)\n );\n } else if (type === 'pickup') {\n return cart.CartLines.filter((cartLine: CartLine) => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (_getCartPickDeliveryMode(cartLine)) : null)\n );\n }\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:
\n {title}\n
,\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 === 0 || !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-expect-error\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:
\n {groupTitle}\n
,\n heading:
\n {title}\n
,\n lineItems: _getLineItemsComponents(item)\n });\n });\n\n return lineItemDeliveryGroup;\n };\n\n return _getLineItems();\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport * from './validate-cart';\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderDrawerProps } from './quick-order-drawer-props';\n\nexport interface IQuickOrderDrawerState {\n isOpen: boolean;\n}\n\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\n\nexport default class QuickOrderDrawer extends React.Component {\n public state: IQuickOrderDrawerState;\n\n private readonly drawerOpenGlyph: string;\n\n private readonly drawerCloseGlyph: string;\n\n private readonly drawerGlyphClass: string;\n\n private isManuallyToggled: boolean;\n\n constructor(props: IQuickOrderDrawerProps) {\n super(props);\n this._toggle = this._toggle.bind(this);\n this.isManuallyToggled = false;\n this.state = { isOpen: (props.collapseProps && props.collapseProps.isOpen) || false };\n this.drawerGlyphClass = classnames('drawer__glyph',\n this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n\n if (this.props.animateGlyph) {\n this.drawerOpenGlyph = classnames(this.drawerGlyphClass,\n this.props.openGlyph ? this.props.openGlyph : (this.props.closeGlyph ? this.props.closeGlyph : ''));\n this.drawerCloseGlyph = this.drawerOpenGlyph;\n } else {\n this.drawerOpenGlyph = classnames(this.drawerGlyphClass,\n this.props.openGlyph ? this.props.openGlyph : '');\n this.drawerCloseGlyph = classnames(this.drawerGlyphClass,\n this.props.closeGlyph ? this.props.closeGlyph : '');\n }\n }\n\n public shouldComponentUpdate(nextProps: IQuickOrderDrawerProps,\n nextState: IQuickOrderDrawerState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const collapseProps = { ...this.props.collapseProps } as ICollapseProps;\n\n // If the drawer is manually toggled by pressing the button, then we use the internal state\n if (collapseProps.isOpen === undefined || this.isManuallyToggled) {\n collapseProps.isOpen = this.state.isOpen;\n } else {\n this.state.isOpen = collapseProps.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className ? this.props.className : '');\n this.isManuallyToggled = false;\n return (\n
\n \n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\n \n \n
\n );\n }\n\n private _generateDrawerButtonInnerMarkup(collapseState: boolean): JSX.Element {\n const drawerButtonTextClass = classnames('drawer__buttontext', this.props.toggleButtonClassName ? this.props.toggleButtonClassName : '');\n return (\n <>\n

\n {this.props.moduleHeadingText}\n

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

\n {ariaLabelProduct}\n

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

\n {ariaLabelQuantity}\n

\n \n
\n );\n\n const addtoCartNode = (\n
\n \n {ariaLabelAddtoCart}\n \n
\n );\n\n const userMessageNode = quickOrderState && quickOrderState.stateMessage ? (\n \n \n \n {quickOrderState.stateMessage.messageText}\n \n \n ) : undefined;\n\n return {\n product: productNode,\n addToCartBtn: addtoCartNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order.\n */\nexport class QuickOrderProduct {\n @observable\n public isSelected: boolean;\n\n public readonly cartLine: CartLine;\n\n public readonly simpleProduct: SimpleProduct;\n\n public constructor(cartLine: CartLine, simpleProduct: SimpleProduct) {\n this.cartLine = cartLine;\n this.simpleProduct = simpleProduct;\n this.isSelected = false;\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Interface for quick order table header resources.\n */\nexport interface IQuickOrderTableHeaderResources {\n quickOrderProductNumberText: string;\n quickOrderProductText: string;\n quickOrderUnitPriceText: string;\n quickOrderUnitOfMeasureText: string;\n quickOrderQuantityText: string;\n quickOrderTotalText: string;\n quickOrderActionsText: string;\n}\n\n/**\n * Interface for quick order table props.\n */\nexport interface IQuickOrderTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderTableHeaderResources;\n}\n\n/**\n * Interface for quick order table header component.\n */\nexport interface IQuickOrderTableHeaderComponent extends IComponent {\n}\n\n/**\n * Get the quick order header cells for desktop.\n * @param props -- The quick order table header props.\n * @returns The list of cells for quick order header component in desktop version.\n */\nconst QuickOrderDesktopHeaderCellsComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n \n \n \n \n {resources.quickOrderProductNumberText}\n \n \n {resources.quickOrderProductText}\n \n \n {resources.quickOrderUnitPriceText}\n \n \n {resources.quickOrderUnitOfMeasureText}\n \n \n {resources.quickOrderQuantityText}\n \n \n {resources.quickOrderTotalText}\n \n \n {resources.quickOrderActionsText}\n \n \n );\n};\n\n/**\n * Get the quick order header cells for mobile.\n * @param props -- The quick order table header props.\n * @returns The quick order header component in desktop version.\n */\nconst QuickOrderMobileHeaderCellsComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n \n \n {resources.quickOrderProductNumberText}\n \n \n \n );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderTableHeaderComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = ();\n } else {\n headerCells = ();\n }\n\n return (\n \n \n {headerCells}\n \n \n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { CartLine, format, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Data required to render each quick order row.\n */\nexport interface IQuickOrderTableRowData {\n cartLine: CartLine;\n product: SimpleProduct;\n}\n\n/**\n * Resources for quick order table rows.\n */\nexport interface IQuickOrderTableRowResources {\n quickOrderQuantityMobileText: string;\n quickOrderProductDimensionsSeparator: string;\n quickOrderViewDetailsButtonText: string;\n quickOrderViewDetailsButtonAriaLabel: string;\n quickOrderRemoveItemButtonAriaLabel: string;\n quickOrderInputQuantityAriaLabel: string;\n quickOrderDecrementButtonAriaLabel: string;\n quickOrderIncrementButtonAriaLabel: string;\n}\n\n/**\n * Interface for quick order table props.\n */\nexport interface IQuickOrderTableRowProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderTableRowResources;\n}\n\n/**\n * The default image settings for quick order table row.\n */\nconst defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Renders product image for quick order row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderTableRowProductImageComponent: React.FC = (props: IQuickOrderTableRowProps) => {\n\n const fallbackImageUrl = getFallbackImageUrl(props.data.product.ItemId, props.context.actionContext.requestContext.apiSettings);\n\n const containerClassName = `${props.className}__product-image-container`;\n\n return (\n
\n \n
\n );\n};\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderExtraActionsPopupComponent: React.FC = (props: IQuickOrderTableRowProps): JSX.Element | null => {\n const product: SimpleProduct = props.data.product;\n\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n\n return (\n
\n
\n );\n};\n\n/**\n * Renders quick order table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order rows for desktop view.\n */\nexport const QuickOrderDesktopTableRowCellComponent: React.FC = (props: IQuickOrderTableRowProps) => {\n const product: SimpleProduct = props.data.product;\n const cartLine: CartLine = props.data.cartLine;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n return (\n <>\n \n \n \n \n {product.ItemId}\n \n \n
\n \n {product.Name}\n \n \n {\n product.Dimensions?.map(\n dimension => dimension.DimensionValue?.Value).filter(\n dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue)).join(\n props.resources.quickOrderProductDimensionsSeparator)\n }\n \n
\n \n \n {cartLine.Price}\n \n \n {cartLine.UnitOfMeasureSymbol}\n \n \n \n \n \n {cartLine.TotalAmount}\n \n \n \n \n \n );\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order rows for mobile view.\n */\nexport const QuickOrderMobileTableRowCellComponent: React.FC = (props: IQuickOrderTableRowProps) => {\n const product: SimpleProduct = props.data.product;\n const cartLine: CartLine = props.data.cartLine;\n\n return (\n <>\n \n \n \n \n
\n \n {product.ItemId}\n \n \n {format(props.resources.quickOrderQuantityMobileText, cartLine.Quantity)}\n \n
\n \n \n \n \n \n );\n};\n\n/**\n * Quick order table row component.\n * @param props - Configuration of the component.\n * @returns React node for the row.\n */\nexport const QuickOrderTableRowComponent: React.FC = (props: IQuickOrderTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = ();\n } else {\n headerCells = ();\n }\n\n return (\n \n \n {headerCells}\n \n \n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365, { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { QuickOrderProduct } from '../quick-order-product';\nimport { IQuickOrderTableHeaderResources, QuickOrderTableHeaderComponent } from './components/quick-order-table-header-component';\nimport { IQuickOrderTableRowResources, QuickOrderTableRowComponent } from './components/quick-order-table-row-component';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderTableData {\n quickOrderProducts: QuickOrderProduct[];\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderTableResources extends IQuickOrderTableHeaderResources, IQuickOrderTableRowResources {\n}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderTableProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n resources: IQuickOrderTableResources;\n isMobileView: boolean;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderTableComponent extends IComponent {\n}\n\n/**\n * The quick order table.\n * @param props -- The quick order table props.\n * @returns The quick order table element.\n */\nexport const QuickOrderTableComponent: React.FC = (props: IQuickOrderTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderProducts = props.data.quickOrderProducts;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\n };\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', updateViewport);\n }\n\n const headerClassName = `${props.className}__header`;\n const rowClassName = `${props.className}__row`;\n\n return (\n \n \n {\n quickOrderProducts.map((quickOrderProduct, index) => {\n return (\n \n );\n })\n }\n
\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { getProductConfigure, IErrorState, IProductDimensionCallbacks, IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { CartLine, ProductDimension, ProductDimensionValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ArrayExtensions, FinitePromiseQueue, FinitePromiseQueueError,\n getDimensionsForSelectedVariant, GetDimensionsForSelectedVariantInput,\n getProductAvailabilitiesForSelectedVariant, getScanResult, GetScanResultInput,\n getSelectedVariant, IProductInventoryInformation, IPromiseQueue, ObjectExtensions, ProductAvailabilitiesForSelectedVariantInput,\n QueryResultSettingsProxy, SelectedVariantInput, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed, observable } from 'mobx';\nimport * as React from 'react';\n\nimport { QuickOrderDrawer, QuickOrderFormComponent, QuickOrderProduct } from './components';\nimport { QuickOrderTableComponent } from './components/quick-order-table/quick-order-table-component';\nimport { IQuickOrderData } from './quick-order.data';\nimport { IQuickOrderProps, IQuickOrderResources } from './quick-order.props.autogenerated';\n\n/**\n * Quick Order View Props Interface properties.\n */\nexport interface IQuickOrderViewProps extends IQuickOrderProps {\n isB2B?: boolean;\n productText: string;\n isQuickOrderFormExpanded: boolean;\n contentProps: INodeProps ;\n drawer: INodeProps;\n quickOrderForm: INodeProps;\n quickOrderFormProductContent: INodeProps;\n quickOrderFormMsgContent: INodeProps;\n quickOrderProps: IModuleProps;\n quickOrderList?: React.ReactNode;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n}\n\n/**\n * Quick Order State Message Interface properties.\n */\nexport interface IQuickOrderStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * GridSize Interface properties.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Quick Order Interface properties.\n */\nexport interface IQuickOrderState {\n isQuickOrderFormExpanded: boolean;\n isUpdatingDimension?: boolean;\n productAvailableQuantity: IProductInventoryInformation | undefined;\n productResponse: SimpleProduct | undefined;\n productDimensions: ProductDimensionFull[] | undefined;\n productText: string;\n quantity: number;\n stateMessage?: IQuickOrderStateMessage;\n productDimensionErrorState: IErrorState;\n isMobile: boolean;\n products: SimpleProduct[];\n}\n\n/**\n *\n * QuickOrder component.\n * @extends {React.PureComponent, IQuickOrderState>}\n */\nclass QuickOrder extends React.PureComponent, IQuickOrderState> {\n @observable\n private readonly viewport: GridSize;\n\n private readonly productTextInput: React.RefObject;\n\n private readonly quantityInput: React.RefObject;\n\n private readonly waitTime: number = 500;\n\n private readonly quickOrderFormClass: string;\n\n private readonly quickOrderFormProductContent: string;\n\n private readonly quickOrderFormMsgContent: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly dimensionUpdateQueue: IPromiseQueue = new FinitePromiseQueue(2);\n\n private dimensions: { [id: number]: string } = {};\n\n private readonly cssClassNameConfigure: string = 'ms-quick-order__content-form-main';\n\n // @ts-expect-error -- Existing code.\n private cancellabelDebounce: debounce;\n\n private readonly quickOrderCallbacks: IProductDimensionCallbacks = {\n\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n return this.dimensionUpdateQueue.enqueue(async () => {\n return this._updateDimensions();\n }).catch((error: any) => { // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw error;\n }\n });\n },\n\n /**\n * Get Dropdown name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources.\n * @returns Dropdown name.\n */\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n\n /**\n * Method to call on dimension change.\n * @param isUpdatingDimension - Flag to update dimension.\n */\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n public constructor(props: IQuickOrderProps) {\n super(props);\n this.productTextInput = React.createRef();\n this.quantityInput = React.createRef();\n this.viewport = props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.state = {\n productText: '',\n isQuickOrderFormExpanded: false,\n productAvailableQuantity: undefined,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: []\n };\n this._handleInputChange = this._handleInputChange.bind(this);\n this._handleQuantityChange = this._handleQuantityChange.bind(this);\n this.quickOrderFormClass = 'ms-quick-order__content-form';\n this.quickOrderFormProductContent = 'ms-quick-order__content-form-main';\n this.quickOrderFormMsgContent = 'ms-quick-order__content-form-msg';\n }\n\n @computed get isMobile(): boolean {\n return (this.viewport === 'xs' || this.viewport === 'sm');\n }\n\n public render(): JSX.Element | null {\n\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const { quickOrderModuleHeading, quickOrderModuleDescription,\n quickOrderAddtobag, quickOrderProductQuantityInputLabel,\n quickOrderProductInputLabel, quickOrderProductDimensionTypeColor,\n quickOrderProductDimensionTypeConfiguration, quickOrderSelectDimensionFormatString,\n quickOrderProductDimensionTypeSize, quickOrderProductDimensionTypeStyle,\n quickOrderProductDimensionTypeAmount, quickAddQuantityPlaceholderText\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderProductDimensionTypeAmount\n };\n\n const {\n isQuickOrderFormExpanded,\n productText,\n productDimensionErrorState,\n productResponse,\n productDimensions\n } = this.state;\n\n const moduleClassName: string = 'ms-quick-order';\n\n const viewProps: IQuickOrderViewProps = {\n ...(this.props as IQuickOrderProps),\n\n quickOrderProps: { className: classnames('ms-quick-order', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order__content' },\n isB2B: customerInfo?.IsB2b,\n drawer: {\n tag: QuickOrderDrawer,\n className: `${moduleClassName}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderFormExpanded },\n moduleHeadingText: quickOrderModuleHeading,\n moduleDescriptionText: quickOrderModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this.telemetryContent\n },\n quickOrderForm: {\n className: `${this.quickOrderFormClass} ${isQuickOrderFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderFormProductContent: {\n className: this.quickOrderFormProductContent\n },\n quickOrderFormMsgContent: {\n className: this.quickOrderFormMsgContent\n },\n productText,\n quickOrderList: ArrayExtensions.hasElements(this.state.products) ? this._renderQuickOrderTable('ms-quick-order') : undefined,\n form: QuickOrderFormComponent({\n productTextInput: this.productTextInput,\n quantityTextInput: this.quantityInput,\n disableAddtoCart: !productResponse,\n ariaLabelAddtoCart: quickOrderAddtobag,\n ariaLabelProduct: quickOrderProductInputLabel,\n ariaLabelQuantity: quickOrderProductQuantityInputLabel,\n addQuantityPlaceholderText: quickAddQuantityPlaceholderText,\n maxChars: 50,\n maxQuantity,\n quickOrderState: this.state,\n handleInputChange: this._handleInputChange,\n handleAddToCartClick: this._addItemToCart,\n handleQuantityChange: this._handleQuantityChange\n }),\n configure: productResponse && productDimensions ? getProductConfigure(this.cssClassNameConfigure, this.props.context, this.props.friendlyName,\n this.props.telemetry, quickOrderSelectDimensionFormatString,\n productConfigureResources, this.quickOrderCallbacks, productResponse,\n productDimensions, productDimensionErrorState) : undefined,\n isQuickOrderFormExpanded: this.state.isQuickOrderFormExpanded,\n isMobileView: this.state.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderProducts(): QuickOrderProduct[] {\n const {\n data: {\n cart: { result: cart }\n }\n } = this.props;\n\n const products: SimpleProduct[] = this.state.products;\n\n const quickOrderProducts = cart?.cart.CartLines?.map((cartLine: CartLine) => {\n const quickOrderProduct = products.find(product => product.RecordId === cartLine.ProductId);\n if (ObjectExtensions.isNullOrUndefined(quickOrderProduct)) {\n return undefined;\n }\n\n return new QuickOrderProduct(cartLine, quickOrderProduct);\n });\n\n return ArrayExtensions.validValues(quickOrderProducts);\n }\n\n /**\n * Render Quick Order Table.\n * @param className - Class name.\n * @returns JSX element.\n */\n private _renderQuickOrderTable(className: string): JSX.Element {\n const tableClassName = `${className}__table-list`;\n\n return (\n \n );\n }\n\n /**\n * Method to handle input change.\n * @param query - Class name.\n */\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length > 4) {\n this.setState({ productText: query, quantity: 0, productResponse: undefined, productDimensions: [] });\n this.setState({ stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n } });\n const inputQuantityText = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n if (inputQuantityText) {\n inputQuantityText.value = '0';\n }\n } else {\n return;\n }\n\n if (this.cancellabelDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this.cancellabelDebounce.cancel();\n }\n\n const {\n telemetry,\n context\n } = this.props;\n const maxChar = 50;\n if (context) {\n if (!StringExtensions.isNullOrWhitespace(query)) {\n if (query.length > maxChar) {\n return;\n }\n\n this.cancellabelDebounce = debounce(() => {\n getScanResult(\n new GetScanResultInput(\n context.actionContext.requestContext.apiSettings,\n query,\n context.actionContext.requestContext.apiSettings.channelId\n ),\n this.props.context.actionContext)\n .then(results => {\n this.setState({\n productResponse: results?.Product,\n productDimensions: results?.ProductDimensionFull,\n isQuickOrderFormExpanded: true\n });\n })\n .catch(error => {\n this.setState({ productText: '' });\n telemetry.exception(error);\n telemetry.debug('Unable to get scan results');\n });\n }, this.waitTime);\n\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- Existing code.\n this.cancellabelDebounce();\n }, 0);\n this.setState({ productText: query, isQuickOrderFormExpanded: true });\n } else {\n this.setState({ productText: '', productResponse: undefined, isQuickOrderFormExpanded: true });\n }\n }\n };\n\n /**\n * Method to add product in cart.\n */\n private readonly _addItemToCart = async (): Promise => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { quickOrderAddedToCartSuccessMessage, quickOrderAddedToCartFailureMessage } = resources;\n const { productResponse, quantity } = this.state;\n this.setState({ stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n } });\n\n if (context && productResponse !== undefined && this._validateCart(productResponse, quantity) && cart.result) {\n const isOrderQuantityLimitsFeatureEnabledInHq = this.props.data.featureState.result\n ?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing code.\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context.request.app.platform?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings = defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n\n // Get product delivery mode info\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [productResponse.RecordId]);\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n const defaultDeliveryOption = ArrayExtensions.hasElements(deliveryOptions) &&\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) ? deliveryOptions[0].DeliveryOptions[0].Code : undefined;\n\n const isOrderQuantityLimitsFeatureEnabled = isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n if (this.state.productAvailableQuantity === undefined) {\n await this._updateAvailablity();\n }\n const { productAvailableQuantity } = this.state;\n const addProductToCartInput = {\n product: productResponse,\n count: quantity,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Existing code.\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productAvailableQuantity ? productAvailableQuantity.ProductAvailableQuantity.AvailableQuantity : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: isOrderQuantityLimitsFeatureEnabled },\n isAddEmailDeliveryItemToCart: defaultDeliveryOption !== undefined && defaultDeliveryOption === emailDeliveryModeCode,\n deliveryMode: defaultDeliveryOption\n };\n\n cart.result.addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.props.telemetry.debug('[quick-order] Cart Updated');\n const inputProductText = this.productTextInput.current instanceof HTMLInputElement && this.productTextInput.current;\n const inputQuantityText = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n if (inputProductText) {\n inputProductText.value = '';\n }\n if (inputQuantityText) {\n inputQuantityText.value = '0';\n }\n this.setState({ \n productText: '',\n quantity: 0,\n productResponse: undefined,\n productDimensions: [],\n stateMessage: {\n messageText: quickOrderAddedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n } });\n } else if (result.substatus === 'MAXQUANTITY') {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order', quantity);\n const maxQtyLimitReachedMessage = this._getMaxQtyMessage(productAvailableQuantity, quantity);\n\n this.setState({ stateMessage: {\n messageText: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n } else if (result.substatus === 'QUANTITYLIMITS' && isOrderQuantityLimitsFeatureEnabled) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order', maxQtyLimitReachedMessage);\n\n this.setState({ stateMessage: {\n messageText: maxQtyLimitReachedMessage || quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n } else {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order');\n\n this.setState({ stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[quick-order] Error trying to Update Cart Line from the quick order');\n\n this.setState({ stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n });\n }\n };\n\n private _getMaxQtyMessage(productInventoryInfo: IProductInventoryInformation | undefined, currentQuantity: number): string {\n const { context, data } = this.props;\n const { cart } = data;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing code.\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\n const addedQuantity = cart.result?.cart.CartLines?.find(item => item.ItemId?.toString() === this.state.productText)?.Quantity || 0;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- existing code.\n if (!productInventoryInfo || !productInventoryInfo.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return this._getConcatenatedMaxQtyMessage(addedQuantity.toString(), maxQuantityForLineItem.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, productInventoryInfo.ProductAvailableQuantity.AvailableQuantity);\n\n return this._getConcatenatedMaxQtyMessage(currentQuantity.toString(), minInventory.toString());\n }\n\n /**\n * Method to return concatenated added quantity Message.\n * @param currentQuantity - Current or added Quantity.\n * @param maxQuantity - Max Quantity.\n * @returns - ConcatenatedMaxQtyMessage.\n */\n private readonly _getConcatenatedMaxQtyMessage = (currentQuantity: string, maxQuantity: string): string => {\n const { quickOrderMaxQuantityLimitText, quickOrderAlreadyItemQuantityText } = this.props.resources;\n\n if (currentQuantity !== '0') {\n return quickOrderAlreadyItemQuantityText.replace('{curQuantity}', currentQuantity) +\n quickOrderMaxQuantityLimitText.replace('{maxQuantity}', maxQuantity);\n }\n\n return quickOrderMaxQuantityLimitText.replace('{maxQuantity}', maxQuantity);\n };\n\n /**\n * Method to handle quantity change.\n * @param value - Quantity.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n let currentValue = Number.parseInt((value), 10);\n const inputElement = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n if (isNaN(currentValue)) {\n currentValue = 0;\n }\n this.setState(\n { quantity: currentValue },\n () => {\n debounce(\n () => {\n if (!isNaN(this.state.quantity) && this.state.quantity >= 0 && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n },\n 200)();\n }\n );\n };\n\n private readonly _updateDimensionValue = (productDimensionFull: ProductDimensionFull, newValueId: string | undefined): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update product dimension.\n */\n private readonly _updateDimensions = async (): Promise => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: {\n channelId\n }\n }\n }\n } = this.props;\n const { productDimensions, productResponse } = this.state;\n if (!productResponse || !productDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.productDimensionErrorState.otherError) {\n const clearOtherErrorState = { ...this.state.productDimensionErrorState };\n clearOtherErrorState.otherError = undefined;\n this.setState({ productDimensionErrorState: clearOtherErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const key of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[key]) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[key] = undefined;\n\n this.setState({ productDimensionErrorState: errorState });\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue: this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) || dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n }).filter(dimension => {\n return dimension.DimensionValue;\n });\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n const selectedProduct = new Promise(async (resolve, reject) => {\n const newProduct = (await getSelectedVariant(\n new SelectedVariantInput(\n productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n channelId,\n mappedDimensions, undefined,\n this.props.context.request\n ),\n actionContext\n ));\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n const variantProduct = await selectedProduct;\n this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n if (variantProduct) {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(\n variantProduct.RecordId,\n channelId\n ),\n actionContext\n );\n\n if (newAvailableQuantity && newAvailableQuantity.length > 0) {\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n }\n };\n\n /**\n * Method to update product availablity.\n */\n private readonly _updateAvailablity = async (): Promise => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: {\n channelId\n }\n }\n }\n } = this.props;\n const { productResponse } = this.state;\n if (!productResponse) {\n return;\n }\n\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(\n productResponse.RecordId,\n channelId\n ),\n actionContext\n );\n\n if (newAvailableQuantity && ArrayExtensions.hasElements(newAvailableQuantity)) {\n const productAvailable = newAvailableQuantity.find(quantity => quantity.ProductAvailableQuantity.ProductId === productResponse.RecordId);\n this.setState({ productAvailableQuantity: productAvailable });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n };\n\n /**\n * Method to get dimension error string.\n * @param dimensionTypeValue - Dimension value.\n * @param resources - Localized error message.\n * @param isGiftCard - Flag to check giftcard.\n * @returns Dimension error string.\n */\n private readonly _getDimensionErrorString = (dimensionTypeValue: number, resources: IQuickOrderResources, isGiftCard?: boolean): string => {\n switch (dimensionTypeValue) {\n case 1: // ProductDimensionType.Color\n return resources.quickOrderproductDimensionTypeColorErrorMessage;\n case 2: // ProductDimensionType.Configuration\n return resources.quickOrderproductDimensionTypeConfigurationErrorMessage;\n case 3: // ProductDimensionType.Size\n return resources.quickOrderproductDimensionTypeSizeErrorMessage;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.quickOrderproductDimensionTypeAmountErrorMessage : resources.quickOrderproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n /**\n * Method to validate the cart.\n * @param productResponse - Simple product object.\n * @param quantity - Quantity.\n * @returns Flag after validating cart.\n */\n private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n const missingDimensions = productResponse.Dimensions?.filter(\n (dimension: ProductDimension) => !(dimension.DimensionValue?.Value)\n );\n if (missingDimensions && missingDimensions.length > 0) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n if (this.state.productDimensionErrorState.configureErrors) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors = userMessage;\n\n this.setState({ productDimensionErrorState: errorState });\n return false;\n }\n }\n\n if (quantity <= 0) {\n const resources = this.props.resources;\n this.setState({ stateMessage: {\n messageText: resources.quickOrderWrongQuantityErrorMsg,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n return false;\n }\n return true;\n };\n\n /**\n * Method to get configuration error string.\n * @param result - List of Dimension values.\n * @param isGiftCard - Flag to check giftcard.\n * @returns Error object.\n */\n private _getConfigureErrors(result: ProductDimension[] | undefined, isGiftCard?: boolean): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n const dimensions: { [configureId: string]: string | undefined } = {};\n const resources = this.props.resources;\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n return dimensions;\n }\n}\n\nexport default QuickOrder;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { Button, format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoCodeProps extends IComponentProps<{}> {\n cart: ICartState | undefined;\n promoCodeHeadingText: string;\n appliedPromoCodeHeadingText: string;\n removePromoAriaLabelFormat: string;\n promoPlaceholderText: string;\n promoCodeApplyButtonText: string;\n collapseTimeOut: number;\n removePromoText: string;\n invalidPromoCodeErrorText: string;\n failedToAddPromoCodeErrorText: string;\n duplicatePromoCodeErrorText: string;\n failedToRemovePromoCodeErrorText: string;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n promoCodeApplyCallback?(): void;\n}\n\ninterface IPromoCodeState {\n isCollapseOpen: boolean;\n promoCodeInputValue: string;\n error: string;\n canApply: boolean;\n}\n\n/**\n *\n * The PromoCode component renders the promocode section.\n * @extends {React.PureComponent}\n */\nclass PromoCode extends React.Component {\n\n private readonly payLoad: IPayLoad;\n\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\n this.state = {\n isCollapseOpen: false,\n promoCodeInputValue: '',\n error: '',\n canApply: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IPromoCodeProps, nextState: IPromoCodeState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n return (\n
\n
\n {this.props.promoCodeHeadingText}\n
\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\n

\n {this.state.error}\n

\n {this._renderAppliedPromoCode(this.props)}\n
\n );\n }\n\n private readonly _onInputChangeHandler = (e: React.ChangeEvent) => {\n const error = e.target.value === '' ? '' : this.state.error;\n this.setState({\n promoCodeInputValue: e.target.value, error,\n canApply: !!e.target.value\n });\n };\n\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart) {\n return;\n }\n const appliedPromo = this.state.promoCodeInputValue;\n\n cartState.addPromoCode({ promoCode: appliedPromo })\n .then(result => {\n if (result.status === 'SUCCESS') {\n // Show success text\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\n } else if (result.substatus === 'ALREADYADDED') {\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\n } else {\n this.setState({ error: this.props.invalidPromoCodeErrorText });\n }\n })\n .catch(error => {\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\n });\n };\n\n /**\n * On Submit function.\n * @param cartState -Cartstate.\n * @returns Apply promotion.\n */\n private readonly _onSubmitHandler = (cartState: ICartState | undefined) => (event: React.FormEvent) => {\n event.preventDefault();\n this._applyPromotionHandler(cartState);\n };\n\n /**\n * On apply promotion function.\n * @param cartState -Cartstate.\n * @returns Apply promotion.\n */\n private readonly _applyPromotionHandler = (cartState: ICartState | undefined) => () => {\n this._applyPromotion(cartState);\n };\n\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\n\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n
\n
\n \n \n {promoCodeApplyButtonText}\n \n
\n
\n );\n };\n\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\n if (!cartState) {\n return;\n }\n const code = event.currentTarget.getAttribute('data-value') || '';\n cartState.removePromoCodes({\n promoCodes: [code]\n })\n .then(result => {\n if (result.status === 'SUCCESS') {\n this.setState({ error: '' });\n }\n })\n .catch(() => {\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\n });\n\n };\n\n private readonly _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\n return;\n }\n let discountAmount = 0;\n for (const line of cartState.cart.CartLines) {\n if (line.DiscountLines) {\n for (const discountLine of line.DiscountLines) {\n if (discountLine.DiscountCode === code) {\n discountAmount += discountLine.DiscountCost!;\n }\n }\n }\n }\n return discountAmount * -1;\n };\n\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || props.cart.cart.Coupons.length === 0) {\n return;\n }\n\n const removePromotionHandler = (event: React.MouseEvent) => {\n this._removePromotion(props.cart, event);\n };\n\n const promoCodTotalDiscount = props.cart.cart.Coupons.reduce(\n (count: number, coupon: Coupon) => {\n return count + (this._calculateDiscount(coupon.Code || '', props.cart) || 0);\n },\n 0);\n\n return (\n <>\n
\n
\n {this.props.appliedPromoCodeHeadingText}\n
\n \n
\n {\n props.cart.cart.Coupons.map((coupon: Coupon) => {\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\n\n return (\n
\n
\n {coupon.Code}\n {' '}\n (\n \n )\n
\n \n {props.removePromoText}\n \n
\n );\n })\n }\n \n );\n };\n}\n\nexport default PromoCode;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Find the product in array of products considering product id.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @returns - The found product.\n */\nexport function getProductByProductId(productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined {\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n\n return undefined;\n}\n\n/**\n * Find the product in array of products considering product id and product behavior's warehouse.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @param warehouseId - Warehouse id of cartLine.\n * @param cartState - The cart start in case cart line has no warehouse.\n * @returns - The found product.\n */\nexport function getProductByProductIdAndWarehouse(\n productId: number | undefined,\n products?: SimpleProduct[],\n warehouseId?: string,\n cartState?: ICartState): SimpleProduct | undefined {\n const targetWarehouseValue = warehouseId ?? cartState?.cart.WarehouseId;\n\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId &&\n product.Behavior?.InventoryLocationId === targetWarehouseValue;\n });\n }\n\n return undefined;\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nimport { IUserReviewData } from './submit-user-review-input-data';\n\n/**\n * SubmitUserReview Input Action.\n */\nexport class SubmitUserReviewInput implements IActionInput {\n /**\n * The Id representing the product to get the ratings for.\n */\n public productId?: string;\n\n /**\n * The ID representing the tenant.\n */\n public tenantId: string;\n\n /**\n * The calling organization's channel id.\n */\n public channelId: string;\n\n /**\n * The locale for which to get the ratings from.\n */\n public locale: string;\n\n /**\n * The user's review data.\n */\n public userReviewData: IUserReviewData;\n\n /**\n * The user's authorization token.\n */\n public authorization: string;\n\n /**\n * The ratings and reviews service endpoint.\n */\n public serviceEndpoint: string;\n\n constructor(\n productId: string | undefined,\n tenantId: string,\n channelId: string,\n locale: string,\n userReviewData: IUserReviewData,\n authorization: string,\n serviceEndpoint: string\n ) {\n this.productId = productId;\n this.tenantId = tenantId;\n this.channelId = channelId;\n this.locale = locale;\n this.userReviewData = userReviewData;\n this.authorization = authorization;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitUserReview';\n\n public getCacheObjectType = () => 'SubmitUserReview';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { CartLine, ProductCatalog, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\n\n/**\n * ICartlineResourceString: Interface for specifying the\n * resource strings that the component needs.\n */\nexport interface ICartlineResourceString {\n\n /**\n * Display string for discount label\n */\n discountStringText: string;\n\n /**\n * String for size key\n */\n sizeString: string;\n\n /**\n * String for color key\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension\n */\n configString: string;\n\n /**\n * String for style key\n */\n styleString: string;\n\n /**\n * String for amount key\n */\n amountString?: string;\n\n /**\n * Display string for quantity label\n */\n quantityDisplayString: string;\n\n /**\n * Display string for quantity label\n */\n inputQuantityAriaLabel: string;\n\n /**\n * Aria label for the decrement button in quantity component\n */\n decrementButtonAriaLabel: string;\n\n /**\n * Aria label for the increment button in quantity component\n */\n incrementButtonAriaLabel: string;\n\n /**\n * Original text screenreader\n */\n originalPriceText: string;\n\n /**\n * Current text screenreader\n */\n currentPriceText: string;\n\n /**\n * Shipping Charges Text\n */\n shippingChargesText: string;\n\n priceEditorResources?: ICartLinePriceEditorResources;\n salesAgreementPricePrompt?: string;\n}\n\ninterface ICartLineData {\n cartLine: CartLine | SalesLine;\n cartState?: ICartState;\n product?: SimpleProduct;\n catalogs?: ProductCatalog[];\n}\n\n/**\n * ICartLineProps: The props required to render cartLineitem.\n */\nexport interface ICartLineProps extends IComponentProps {\n\n /**\n * The flag to change the quantity component from intractable to static.\n */\n disableQuantityInteractivity?: boolean;\n\n /**\n * The primary image url.\n */\n primaryImageUrl?: string;\n\n /**\n * The product url.\n */\n productUrl?: string;\n\n /**\n * GridSettings for the product image in cartLine.\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartLine.\n */\n imageSettings: IImageSettings;\n\n /**\n * Boolean flag to indicate if the item is out of stock.\n */\n isOutOfStock?: boolean;\n\n /**\n * Flag to make quantity section editable.\n */\n isQuantityEditable?: boolean;\n\n /**\n * Max quantity for line item.\n */\n maxQuantity?: number;\n\n /**\n * Current quantity for line item.\n */\n currentQuantity?: number;\n\n /**\n * Resource string for the component.\n */\n resources: ICartlineResourceString;\n\n /**\n * SalesLine flag.\n */\n isSalesLine?: boolean;\n\n /**\n * Error message to show in place of quantity.\n */\n errorMessage?: string;\n\n /**\n * Inventory information label.\n */\n inventoryInformationLabel?: string;\n\n /**\n * Inventory information class name.\n */\n inventoryLabelClassName?: string;\n\n /**\n * Flag to show/hide shipping charges for line items.\n */\n showShippingChargesForLineItems?: boolean;\n\n /**\n * Boolean flag to indicate if cart state status is ready.\n */\n isCartStateReady?: boolean;\n\n /**\n * Chanel Delivery Option configuration is from api.\n */\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n /**\n * The telemetry content.\n */\n telemetryContent?: ITelemetryContent;\n\n /**\n * The cart line index.\n */\n lineIndex?: number;\n\n /**\n * Quantity onChange callback.\n */\n quantityOnChange?(cartLine: CartLine, newQuantity: number, lineIndex?: number): boolean;\n}\n\ninterface IDimensionStrings {\n\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n}\n\n/**\n * Renders catalog label for the cart line.\n * @param props - Cart line props.\n * @returns Catalog label.\n */\nconst CatalogLabelComponent: React.FC = (props: ICartLineProps) => {\n const catalogId = props.data.cartLine.CatalogId;\n\n if (!props.context.request.user.isB2b || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\n return null;\n }\n\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\n\n if (!catalog || !catalog.Name) {\n return null;\n }\n\n return (\n
\n {catalog.Name}\n
\n );\n};\n\nconst CartLineItemFunctions = {\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\n if (!Product || !Product.Dimensions) {\n return [];\n }\n\n return Product.Dimensions.map(productDimension => {\n\n if (productDimension.DimensionTypeValue === 1) {\n return (\n
\n \n {DimensionStrings.colorString}\n :\n \n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n \n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 2) {\n return (\n
\n \n {DimensionStrings.configString}\n :\n \n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n \n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 3) {\n return (\n
\n \n {DimensionStrings.sizeString}\n :\n \n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n \n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 4) {\n return (\n
\n \n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}\n :\n \n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n \n
\n );\n }\n return null;\n });\n },\n\n renderDiscountLines: (props: ICartLineProps) => {\n\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\n return null;\n }\n\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n return (\n
\n \n {discountLine.OfferName ? discountLine.OfferName : ''}\n :\n {` ${props.resources.discountStringText || 'Discount'} `}\n \n \n \n \n \n {` (${discountLine.EffectivePercentage !== undefined ? discountLine.EffectivePercentage : ''}%)`}\n \n
\n );\n });\n },\n renderInventoryLabel: (props: ICartLineProps) => {\n if (!props.inventoryInformationLabel) {\n return null;\n }\n const inventoryCssName = props.inventoryLabelClassName ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}` : 'msc-cart-line__product-inventory-label';\n return (\n \n {props.inventoryInformationLabel}\n \n );\n },\n\n /**\n * Gets the react node for product unit of measure display.\n * @param props - Icartline props.\n * @returns The node representing markup for unit of measure component.\n */\n renderUnitOfMeasure: (props: ICartLineProps) => {\n\n if (props.data.cartLine.IsInvoiceLine) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\n return undefined;\n }\n\n const product = props.data.product;\n if (!product || !product.DefaultUnitOfMeasure) {\n return undefined;\n }\n\n return (\n
\n \n {product.DefaultUnitOfMeasure}\n \n
\n );\n },\n renderShippingLabel: (props: ICartLineProps) => {\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\n const cartline = props.data.cartLine;\n let hasShippingMethod = false;\n if (channelDeliveryOptionConfig !== undefined) {\n hasShippingMethod = !!(cartline.DeliveryMode &&\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode));\n } else {\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\n }\n if (!hasShippingMethod) {\n return undefined;\n }\n\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\n\n if (shippingChargeLines.length === 0) {\n return undefined;\n }\n\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\n }, 0);\n\n const priceComponent = (\n \n );\n return (\n <>\n \n \n {priceComponent}\n \n \n );\n },\n renderOtherCharges: (props: ICartLineProps) => {\n const cartline = props.data.cartLine;\n const otherCharges = cartline.ChargeLines?.filter((chargeline) => !chargeline.IsShipping);\n\n return otherCharges && otherCharges.map((otherCharge, key) => {\n return otherCharge && otherCharge.CalculatedAmount ? (\n
\n \n \n \n \n
\n ) : '';\n }) || undefined;\n },\n\n /**\n * Render the sales agreement prompt.\n * @param props - The ICartLineProps.\n * @returns The JSX.Element.\n */\n renderSalesAgreementPrompt: (props: ICartLineProps): JSX.Element | null => {\n if (props.data.cartLine.SalesAgreementLineRecordId === 0) {\n return null;\n }\n return (
\n {props.resources.salesAgreementPricePrompt}\n
);\n }\n};\n\nconst CartLine: React.FC = (props: ICartLineProps) => {\n const { isSalesLine, productUrl, resources } = props;\n const { product, cartLine } = props.data;\n\n const destructDimensionStrings = {\n sizeString: resources.sizeString,\n colorString: resources.colorString,\n styleString: resources.styleString,\n configString: resources.configString,\n amountString: resources.amountString\n };\n\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n const imageSettings = props.imageSettings;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\n const renderUnitOfMeasure = CartLineItemFunctions.renderUnitOfMeasure(props);\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\n const renderSalesAgreementPrompt = CartLineItemFunctions.renderSalesAgreementPrompt(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\n const productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const productName = product?.Name || cartLine.Description;\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\n\n const onChange = (newValue: number): boolean => {\n if (props.quantityOnChange) {\n return props.quantityOnChange(props.data.cartLine, newValue, props.lineIndex);\n }\n return true;\n };\n\n const _generateErrorMessage = (): JSX.Element | null => {\n if (props.errorMessage) {\n return (\n
\n \n \n {props.errorMessage}\n \n
\n );\n }\n\n return null;\n };\n\n const _generateQuantityandPrice = (): JSX.Element[] | null => {\n const nodes = [];\n if (props.isOutOfStock) {\n return null;\n }\n\n // No quantity selector for invoice line\n if (!props.data.cartLine.IsInvoiceLine) {\n if (props.data.product && props.isQuantityEditable) {\n nodes.push(\n
\n
\n {resources.quantityDisplayString}\n
\n \n
\n );\n } else {\n nodes.push(\n
\n \n \n {props.data.cartLine.Quantity}\n \n
\n );\n }\n }\n\n nodes.push(\n
\n \n {\n props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 &&\n <>\n \n {` ${props.resources.discountStringText || 'Discount'} `}\n \n \n ||\n null\n }\n
\n );\n\n return nodes;\n };\n\n return (\n <>\n
\n
\n \n
\n
\n
\n \n {\n MsDyn365.isBrowser ? \n {productName}\n : null\n }\n {ArrayExtensions.hasElements(productDimensions) ?
\n {productDimensions}\n
: ''}\n {renderUnitOfMeasure}\n
\n \n
\n {renderDisountLines}\n {renderInventoryLabel}\n {props.showShippingChargesForLineItems &&
\n {renderShippingLabel}\n
}\n {renderOtherCharges}\n {renderSalesAgreementPrompt}\n
\n {\n _generateQuantityandPrice()\n }\n {\n props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && \n }\n
\n
\n { _generateErrorMessage() }\n \n );\n};\n\nexport default CartLine;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { 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 (error) {\n throw error;\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 (error) {\n throw error;\n }\n}\n\nexport default emptyActiveCart;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport * 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';\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { AddOrderTemplateToCartComponent, ILinesAddedToCartDialogResources } from '@msdyn365-commerce/components';\nimport { getUrlSync, ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getFallbackImageUrl, getProductUrlSync, OrderTemplate, OrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateActionMessageState } from '../order-template-list';\n\nexport interface ISingleOrderTemplateProps extends ProductList {\n orderTemplateState: IOrderTemplateActionMessageState;\n name?: string;\n orderTemplate: OrderTemplate;\n context: ICoreContext;\n imageSettings?: IImageSettings;\n enableImageProductLink?: boolean;\n removeFromOrderTemplateListText: string;\n addToBagText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n handlers: {\n onRemoveOrderTemplate(id: string): void | undefined;\n onDismiss(): void;\n };\n resources: {\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISingleOrderTemplateViewProps {\n key: string;\n orderTemplateImage: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n orderTemplateStatusMessage?: React.ReactNode;\n orderTemplateName?: React.ReactNode;\n orderTemplateAriaLabel?: string;\n orderTemplateHeaderDivider?: React.ReactNode;\n}\n\nconst _removeItemFromOrderTemplateList = (props: ISingleOrderTemplateProps): void => {\n const { onRemoveOrderTemplate } = props.handlers;\n const { itemKey } = props;\n\n onRemoveOrderTemplate && itemKey && onRemoveOrderTemplate(itemKey);\n};\n\nconst OrderTemplateActions = {\n removeOrderTemplate: _removeItemFromOrderTemplateList\n};\n\n/**\n * Remove order template action.\n * @param input -Single order template props.\n * @returns Set remove order template.\n */\nconst removeOrderTemplateActionHandler = (input: ISingleOrderTemplateProps) => () => {\n OrderTemplateActions.removeOrderTemplate(input);\n};\n\nexport const OrderTemplateRender = (input: ISingleOrderTemplateProps): ISingleOrderTemplateViewProps | null => {\n const { Id, orderTemplate, removeFromOrderTemplateListText, orderTemplateState, handlers, name, imageSettings, context, telemetryContent, enableImageProductLink } = input;\n\n if (!Id) {\n return null;\n }\n\n const _getOrderTemplatePageUrl = (): string => {\n const url = getUrlSync('ordertemplate', context.actionContext) ?? '';\n const separator = url.includes('?') ? '&' : '?';\n if (Id) {\n return `${url}${separator}id=${Id}`;\n }\n return '';\n\n };\n\n const { onDismiss } = handlers;\n\n return {\n key: `${Id}-template`,\n orderTemplateImage: _renderOrderTemplateImages(context, orderTemplate.orderTemplateLines, imageSettings, enableImageProductLink),\n orderTemplateAriaLabel: _renderAriaLabel(input),\n orderTemplateName:\n (\n
\n \n
\n {orderTemplate.totalLines}\n {' '}\n line items\n
\n
\n
\n ),\n addToCartButton:\n (\n
\n \n
\n ),\n removeButton:\n (\n \n ),\n orderTemplateStatusMessage: orderTemplateState && orderTemplateState.isOpen && orderTemplateState.userMessage &&\n (\n
\n \n \n {orderTemplateState.userMessage}\n \n \n
\n )\n\n };\n\n};\n\n/**\n * On image click handler.\n * @param productUrl -Product url value.\n * @returns Assign window location.\n */\nconst onClickHandler = (productUrl: string) => () => {\n window.location.assign(productUrl);\n};\n\nconst _renderOrderTemplateImages = (context: ICoreContext, orderTemplateLines?: OrderTemplateLine[],\n imageSettings?: IImageSettings, enableImageProductLink?: boolean): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n if (orderTemplateLines) {\n const count = orderTemplateLines.length < 4 ? orderTemplateLines.length : 4;\n\n return (\n
\n {orderTemplateLines?.slice(0, count).map(line => {\n const productUrl = line.fullProduct ? getProductUrlSync(line.fullProduct.ProductDetails, context.actionContext, undefined) : '';\n\n return ();\n })}\n
\n );\n }\n return (\n
\n );\n\n};\n\nconst _renderAriaLabel = (props: ISingleOrderTemplateProps): string => {\n const { name } = props;\n return (`${name}`);\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { orderTemplateListStatus } from '../order-template-list';\n\nexport interface IOrderTemplateListStatusMessageProps {\n className?: string;\n errorType: orderTemplateListStatus;\n text?: string;\n}\n\nexport const OrderTemplateListStatusMessage: React.FC = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return (\n

\n { text }\n

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

\n { text }\n

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

\n { text }\n

\n );\n }\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IAdditionalContentData, ILinksData } from '../video-player.props.autogenerated';\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Component props.\n */\nexport interface IVideoPlayerAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content view props.\n */\nexport interface IVideoPlayerAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n additionalContentItems?: IVideoPlayerAdditionalContentItemViewProps;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Item view props.\n */\nexport interface IVideoPlayerAdditionalContentItemViewProps {\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentItemContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Video Player Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalTextChange(event);\n }, requestContext\n }}\n />);\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Video Player Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalParagraphChange(event);\n }, requestContext\n }}\n />);\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Video Player Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IVideoPlayerAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'ms-video-player__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.openInNewTab,\n role: 'link'\n };\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Video Player additonal content item props.\n * @param props - Video Player Additional content component props.\n * @returns IVideoPlayerAdditionalContentItemViewProps.\n */\nconst getAdditionalContentItems = (\n item: IAdditionalContentData,\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentItemViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentItemContainer: { className: 'ms-video-player__details__additional-content__container' },\n additionalContentItemLinks: { className: 'ms-video-player__details__additional-content__cta' }\n };\n};\n\n/**\n * VideoPlayerAdditionalContent component.\n * @param props - Video Player Additional content component props.\n * @returns Video Player Additional content view props.\n */\nexport const videoPlayerAdditionalContent = (props: IVideoPlayerAdditionalContentProps): IVideoPlayerAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n const reactNodes: IVideoPlayerAdditionalContentItemViewProps = getAdditionalContentItems(additionalContent, props);\n return {\n additionalContentNode: { className: 'ms-video-player__details__additional-content' },\n additionalContentItems: reactNodes\n };\n};\n\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IPlayerData, IPlayerOptions, IPlayerResources, IVideoMetadata, Player } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, getTelemetryObject, INodeProps,\n isMobile, ITelemetryContent, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, videoPlayerAdditionalContent } from './components/additional-content';\nimport { ILinksData, IVideoPlayerConfig, IVideoPlayerProps } from './video-player.props.autogenerated';\n\nexport interface IVideoPlayerViewProps extends IVideoPlayerProps<{}> {\n player: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IVideoPlayerAdditionalContentViewProps;\n handleText?(): void;\n handleParagraph?(): void;\n handleAdditionalText?(): void;\n handleAdditionalParagraph?(): void;\n handleLink?(): void;\n handleAdditionalLink?(): void;\n}\n\n/**\n *\n * VideoPlayer component.\n * @extends {React.PureComponent>}\n */\nclass VideoPlayer extends React.PureComponent> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly isMobileDevice: boolean;\n\n public constructor(props: IVideoPlayerProps) {\n super(props);\n this.isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n }\n\n public render(): JSX.Element {\n const options = {\n ...this.props.config,\n isMobileDevice: this.isMobileDevice\n };\n const video: MsDyn365.IVideoData = this.props.config.video;\n const playerResources: IPlayerResources = {\n playAriaLabel: this.props.resources.playLabel,\n pauseAriaLabel: this.props.resources.pauseLabel,\n playingAriaLabel: this.props.resources.playingLabel,\n pausedAriaLabel: this.props.resources.pausedLabel,\n muteAriaLabel: this.props.resources.muteLabel,\n unMuteAriaLabel: this.props.resources.unMuteLabel,\n fullScreenAriaLabel: this.props.resources.fullScreenLabel,\n exitFullScreenAriaLabel: this.props.resources.exitFullScreenLabel,\n seekBarLabel: this.props.resources.seekBarLabel,\n videoTimeDurationLabel: this.props.resources.videoTimeDurationLabel,\n closedCaptionLabel: this.props.resources.closedCaptionLabel\n };\n const videoMetaData: IVideoMetadata = {};\n\n if (video) {\n videoMetaData.videoId = video.id;\n videoMetaData.title = video.title;\n videoMetaData.duration = video.playTime;\n\n if (video.thumbnail) {\n videoMetaData.posterframeUrl = video.thumbnail.src;\n }\n\n if (video._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = video._links.binaryReferences;\n }\n }\n const videoPlayerData: IPlayerData = { options: options as IPlayerOptions, metaData: videoMetaData };\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n\n player: (\n \n \n \n ),\n title: this._getVideoDetailsHeading(),\n text: this._getVideoDetailsParagraph(),\n links: this._getVideoDetailsLinks(),\n detailsContainer: { className: 'ms-video-player__details' },\n detailsContainerCTA: { className: 'ms-video-player__details__cta' },\n additionalContent: videoPlayerAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n\n }),\n handleText: this.handleTextChange,\n handleParagraph: this.handleParagraphChange,\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleLink: this.handleLinkTextChange,\n handleAdditionalLink: this.handleAdditionalTextChange\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * Handle paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * Handle additional text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * Handle additional link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle additional paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * Get video details links.\n * @returns - React node.\n */\n private _getVideoDetailsLinks(): React.ReactNode[] | undefined {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n\n return (\n links?.map((linkData: ILinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'ms-video-player__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.openInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n {\n this.handleLinkTextChange(index, event);\n }, requestContext: this.props.context.request }}\n />\n );\n })\n );\n }\n\n private _getVideoDetailsHeading(): React.ReactNode | undefined {\n const { heading } = this.props.config;\n\n return (\n heading && (\n \n )\n );\n }\n\n private _getVideoDetailsParagraph(): React.ReactNode | undefined {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n \n )\n );\n }\n}\n\nexport default VideoPlayer;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { 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, CardPaymentAcceptResult, 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-expect-error\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n\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-expect-error\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\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-expect-error\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n 'Amount@odata.type': '#Decimal',\n Currency,\n Amount,\n TenderTypeId,\n CardTypeId: cartTypeId\n };\n cardTenderLine.TokenizedPaymentCard = {\n ...tokenizedPaymentCard,\n CardTypeId: cartTypeId,\n\n // @ts-expect-error\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.TokenizedPaymentCard',\n House: tokenizedPaymentCard.House || 'N/A',\n ...(tokenizedPaymentCard.CardTokenInfo && {\n CardTokenInfo: {\n ...tokenizedPaymentCard.CardTokenInfo,\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\n/**\n * Get credit card tender line.\n * @param context - Action context.\n * @param amount - Due amount for credit card.\n * @param currency - Currency.\n * @param cardPaymentAcceptResult - CardPaymentAcceptResult.\n * @param billingAddress - BillingAddress.\n * @returns - The credit card tender line.\n */\nasync function getCreditCardTenderLineForSinglePaymentAuth(\n context: IActionContext,\n amount: number = 0,\n currency: string = 'USD',\n cardPaymentAcceptResult?: CardPaymentAcceptResult,\n billingAddress?: Address\n): Promise {\n const tenderTypes = await getTenderTypesAsync({ callerContext: context, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n const tenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\n\n if (cardPaymentAcceptResult) {\n cardPaymentAcceptResult.TokenizedPaymentCard = {\n // @ts-expect-error\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.TokenizedPaymentCard',\n House: 'N/A',\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\n const cardTenderLine: CartTenderLine = {\n // @ts-expect-error -- existing data.\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n 'Amount@odata.type': '#Decimal',\n Currency: currency,\n Amount: amount,\n TenderTypeId: tenderTypeId,\n CardPaymentAcceptResult: cardPaymentAcceptResult\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 '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n 'Amount@odata.type': '#Decimal',\n Currency,\n TenderTypeId,\n Amount,\n\n // @ts-expect-error\n CustomerId\n };\n}\n\nexport default async (ctx: IActionContext, updatedCartVersion?: number, isPaymentVerificationRedirection?: boolean): 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 === 0 || !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 cardPaymentAcceptResult,\n shouldEnableSinglePaymentAuthorizationCheckout,\n isExpressCheckoutApplied,\n isExpressAddressApplied\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 > 0) {\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 ? Number.parseInt(giftCardExtend.ExpirationDate?.split('/')[1], 10) : undefined;\n const giftCardExpirationMonth = giftCardExtend.ExpirationDate ? Number.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 let creditCardTenderLinePromise: Promise;\n\n if (\n shouldEnableSinglePaymentAuthorizationCheckout &&\n (!(isExpressCheckoutApplied && !isExpressAddressApplied) || (isExpressCheckoutApplied && isPaymentVerificationRedirection))\n ) {\n creditCardTenderLinePromise = getCreditCardTenderLineForSinglePaymentAuth(\n ctx,\n amountDue,\n Currency,\n cardPaymentAcceptResult,\n billingAddress\n );\n } else {\n if (!tokenizedPaymentCard) {\n throw new Error('Fail to placeOrder: no token found');\n }\n creditCardTenderLinePromise = getCreditCardTenderLine(\n ctx,\n tokenizedPaymentCard,\n cardPrefix,\n amountDue,\n Currency,\n billingAddress\n );\n }\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 === 0) {\n throw new Error('Fail to placeOrder: fail to get cart tender lines');\n }\n }\n\n const cartVersion = updatedCartVersion || cartState.cart.Version;\n\n // Proceed checkout\n const salesOrder = await checkoutAsync(\n { callerContext: ctx, bypassCache: 'get' },\n cartState.cart.Id,\n guestCheckoutEmail,\n undefined,\n undefined,\n cartTenderLines || null,\n cartVersion\n ).catch(async error => {\n if (checkoutState.shouldEnableSinglePaymentAuthorizationCheckout) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown type.\n if (error.data?.AdditionalContext) {\n await checkoutState.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown type.\n await checkoutState.updateRedirectAdditionalContext({ newRedirectAdditionalContext: error?.data?.AdditionalContext as string });\n await checkoutState.updateRedirectPaymentConnectorId({ newRedirectPaymentConnectorId: cardPaymentAcceptResult?.Settings?.PaymentConnectorId as string });\n } else {\n await checkoutState.updateIsCheckoutCallFailed({ newIsCheckoutCallFailed: true });\n\n if (isPaymentVerificationRedirection) {\n await checkoutState.checkoutCart.refreshCart({});\n await checkoutState.updateIsExpressCheckoutApplied({ newIsExpressCheckoutApplied: false});\n await checkoutState.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n }\n }\n\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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC = ({ text, className }) => (\n {' '}\n {text}\n {' '}\n);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IBulkPurchaseViewProps } from './bulk-purchase';\n\n/**\n * Bulk purchase view.\n * @param props - Bulk purchase view props.\n * @returns React node with a module.\n */\nexport const BulkPurchaseViewComponent: React.FC = props => {\n return (\n \n {props.content}\n \n );\n};\n\nexport default BulkPurchaseViewComponent;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport WriteReview from './write-review';\nimport WriteReviewView from './write-review.view';\n\nexport * from './write-review';\nexport * from './write-review.data';\nexport { IWriteReviewConfig, IWriteReviewProps, IWriteReviewResources } from './write-review.props.autogenerated';\nexport * from './write-review.view';\n\nexport {\n WriteReview,\n WriteReviewView\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { OrderBy } from '../actions/inputs/get-product-reviews-input';\n\nexport interface IRnrKeyValuePair {\n key: string;\n value: string;\n}\n\nexport interface IRnrOrderByKeyValuePair {\n key: OrderBy;\n value: string;\n}\n\nexport function setFocusOnElement(id: string): void {\n const element = document.getElementById(id);\n if (element) {\n element.focus();\n }\n}\n\nexport const TOGGLE_REVIEW_MODAL_BUTTON_ID: string = 'reviewproductid';\nexport const TOGGLE_EDIT_MODAL_BUTTON_ID: string = 'ms-write-review__edit';\nexport const TOGGLE_EDIT_MODAL_BUTTON_CARD_ID: string = 'ms-reviews-list__edit';\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { IHistogramItemViewProps,\r\n IRatingsHistogramData,\r\n IRatingsHistogramViewProps } from '@msdyn365-commerce-modules/ratings-reviews';\r\nimport { format, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRatingsHistogramProps, IRatingsHistogramResources } from '../definition-extensions/ratings-histogram.ext.props.autogenerated';\r\n\r\n/**\r\n * Histogram item.\r\n * @param props - Histogram Item ViewProps.\r\n * @returns Histogram Item node.\r\n */\r\nconst histogramItem = (props: IHistogramItemViewProps) => {\r\n return (\r\n \r\n {props.starLabel}\r\n {props.bar}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Average ratings.\r\n * @param data - Props data.\r\n * @param context - Histogram Item ViewProps.\r\n * @param typeName - Histogram Item ViewProps.\r\n * @param componentId - Histogram Item ViewProps.\r\n * @param resources - Module resource strings.\r\n * @returns Average ratings.\r\n */\r\nconst averageRating = (data: IRatingsHistogramData, context: ICoreContext, typeName: string, componentId: string, resources: IRatingsHistogramResources) => {\r\n const defaultAverageRating: number = 0;\r\n const reviewsCount = data.ratingsSummary.result?.reviewsCount ?? defaultAverageRating;\r\n const reviewsCountString = resources.numberOfReviewsString ? format(resources.numberOfReviewsString, reviewsCount) : `${reviewsCount} reviews`;\r\n\r\n return (\r\n
\r\n
\r\n {data.ratingsSummary.result?.averageRating}\r\n
\r\n
\r\n \r\n
\r\n
\r\n {reviewsCountString}\r\n
\r\n
\r\n );\r\n};\r\n\r\n/**\r\n * Histogram view.\r\n * @param props - Ratings HistogramV iewProps.\r\n * @returns Histogram view module.\r\n */\r\nconst RatingsHistogramView: React.FC> = props => {\r\n const { heading, histogramItems, histogramProps, moduleProps, data, resources } = props;\r\n const context = props.context;\r\n const typeName = props.typeName;\r\n const moduleId = props.id;\r\n\r\n return (\r\n \r\n {heading}\r\n
\r\n {averageRating(data, context, typeName, moduleId, resources)}\r\n \r\n {histogramItems.map(item => {\r\n return histogramItem(item);\r\n })}\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RatingsHistogramView;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { Button, format, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { TOGGLE_EDIT_MODAL_BUTTON_CARD_ID } from '../../../common/rnrInterface';\n\nexport interface IReviewCardResources {\n wasReviewHelpfulText: string;\n yesButtonText: string;\n noButtonText: string;\n editReviewCardText: string;\n reportedText: string;\n reportConcernText: string;\n reviewRatingNarratorText: string;\n}\n\nexport interface IReviewCardProps {\n review: Review;\n resources: IReviewCardResources;\n context: ICoreContext>;\n isUserReview?: boolean;\n parentId: string;\n parentType: string;\n reportedReviews: string[];\n returnRef: React.RefObject | undefined;\n reportedReviewId: string;\n votedReviews: { reviewId: string; approved: boolean }[];\n toggleWriteReviewModal?(): void;\n toggleReportReviewModal(reviewId: string): void;\n updateReviewHelpfulness(reviewId: string, isHelpful: boolean): void;\n}\n\nexport interface IReviewCardViewProps {\n cardProps: INodeProps;\n name: React.ReactElement;\n rating: React.ReactElement;\n date: React.ReactElement;\n reviewTitle: React.ReactElement;\n reviewText: React.ReactElement;\n ratingHelpfulLabel?: React.ReactElement;\n like?: React.ReactElement;\n dislike?: React.ReactElement;\n edit: React.ReactNode;\n report: React.ReactNode;\n responseName: React.ReactNode;\n responseDate: React.ReactNode;\n responseText: React.ReactNode;\n cardBodyProps: INodeProps;\n responseProps: INodeProps;\n reviewProps: INodeProps;\n controlsProps: INodeProps;\n headerProps: INodeProps;\n}\n\n/**\n * Review card component.\n */\n\nexport const ReviewCard = (props: IReviewCardProps): IReviewCardViewProps => {\n const className = props.isUserReview ? 'ms-reviews-list__card ms-reviews-list__user-review' : 'ms-reviews-list__card';\n return {\n cardProps: { className, key: props.review.reviewId },\n name:

\n {props.review.userName}\n

,\n rating: rating(props),\n date:

\n {renderDate(props, props.review.submittedDateTime)}\n

,\n reviewTitle:

\n {props.review.title}\n

,\n reviewText:

\n {props.review.reviewText}\n

,\n ratingHelpfulLabel: props.isUserReview ? undefined :

\n {props.resources.wasReviewHelpfulText}\n

,\n like: props.isUserReview ? undefined : voteHelpfulButton(props, true),\n dislike: props.isUserReview ? undefined : voteHelpfulButton(props, false),\n edit: editButton(props),\n report: reportToggle(props),\n responseName: props.review.userResponse ?

\n {props.review.userResponse.responderName}\n

: undefined,\n responseText: props.review.userResponse ?

\n {props.review.userResponse.responseText}\n

: undefined,\n responseDate: props.review.userResponse ?

\n {renderDate(props, props.review.userResponse.submittedDateTime)}\n

: undefined,\n cardBodyProps: { className: 'ms-reviews-list__card-body' },\n responseProps: { className: 'ms-reviews-list__response' },\n reviewProps: { className: 'ms-reviews-list__review' },\n controlsProps: { className: 'ms-reviews-list__card-controls' },\n headerProps: { className: 'ms-reviews-list__card-header' }\n };\n};\n\nconst rating = (props: IReviewCardProps) => {\n return (\n \n );\n};\n\nconst isVotedFor = (props: IReviewCardProps, isHelpful: boolean): boolean => {\n for (let i = 0; i < props.votedReviews.length; i++) {\n if (props.votedReviews[i].reviewId === props.review.reviewId) {\n return props.votedReviews[i].approved === isHelpful;\n }\n }\n\n return false;\n};\n\nconst voteHelpfulButton = (props: IReviewCardProps, isHelpful: boolean) => {\n const isVoted = isVotedFor(props, isHelpful);\n const isDisabled = props.isUserReview || isVoted ? 'disabled' : '';\n let className = isHelpful ? 'ms-reviews-list__like' : 'ms-reviews-list__dislike';\n className = `${className} ${isDisabled}`;\n const label = isHelpful ? props.resources.yesButtonText : props.resources.noButtonText;\n let voteCount = (isHelpful ? props.review.helpfulPositive : props.review.helpfulNegative) || 0;\n voteCount = isVoted ? voteCount + 1 : voteCount;\n const title = `(${voteCount})`;\n const user = props.context.request.user;\n const onClickMethod = () => {\n props.updateReviewHelpfulness(props.review.reviewId!, isHelpful);\n };\n const onClick = isDisabled ? undefined : onClickMethod;\n\n if (user.isAuthenticated) {\n return (\n {title}\n );\n }\n return (\n {title}\n );\n};\n\nconst editButton = (props: IReviewCardProps) => {\n if (props.isUserReview) {\n return ();\n }\n\n return undefined;\n};\n\nconst renderDate = (props: IReviewCardProps, date?: Date): string | Date => {\n if (!date) {\n return '';\n }\n\n try {\n return new Intl.DateTimeFormat(props.context.request.locale, { month: 'long', day: 'numeric', year: 'numeric' }).format(new Date(date));\n } catch {\n return date;\n }\n};\n\n/**\n * On Click Handler.\n * @param props -Review card props.\n * @returns Report review modal.\n */\nconst onClick = (props: IReviewCardProps) => () => {\n props.toggleReportReviewModal(props.review.reviewId!);\n};\n\nconst reportToggle = (props: IReviewCardProps) => {\n const user = props.context.request.user;\n if (props.isUserReview) {\n return undefined;\n } else if (!user.isAuthenticated) {\n return ();\n }\n\n if (props.reportedReviews.includes(props.review.reviewId!)) {\n return (

\n {props.resources.reportedText}\n

);\n }\n\n const ref = props.review.reviewId === props.reportedReviewId ? props.returnRef : undefined;\n\n return ();\n\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { format, getPayloadObject, getTelemetryAttributes, ILabeledDropdownOption, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IReviewCountResources {\n pageReviewCountText: string;\n}\n\nexport interface IReviewCountProps {\n resources: IReviewCountResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n}\n\nexport const ReviewCount: React.FC = (props: IReviewCountProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n\n return (\n \n {format(\n resources.pageReviewCountText,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage),\n reviewsCount\n )}\n \n );\n};\n\nexport interface IPageControlResources {\n previousButtonText: string;\n nextButtonText: string;\n pageReviewAriaLabel: string;\n}\n\nexport interface IPageControlsProps {\n resources: IPageControlResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n telemetryContent?: ITelemetryContent;\n updateReviews(skipItems: number, selectedSortByOption: ILabeledDropdownOption, selectedFilterByOption: ILabeledDropdownOption, currentPage: number, isFilterApplied: boolean): Promise;\n}\n\nexport const PageControls: React.FC = (props: IPageControlsProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n const previousPageClick = React.useCallback(() => {\n return _getPreviousPageData(props);\n }, [props]);\n const nextPageClick = React.useCallback(() => {\n return _getNextPageData(props);\n }, [props]);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Next);\n const nextAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Previous;\n const previousAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n
\n {_hasPreviousPage(currentPage) && (\n \n {resources.previousButtonText}\n \n )}\n {_hasNextPage(currentPage, reviewsCount, reviewsShownOnEachPage) && (\n \n {resources.nextButtonText}\n \n )}\n
\n );\n};\n\nconst _hasPreviousPage = (currentPage: number): boolean => {\n return currentPage > 1;\n};\n\nconst _hasNextPage = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number): boolean => {\n return _getPagesCount(reviewsCount, reviewsShownOnEachPage) > currentPage;\n};\n\nconst _getReviewsShown = (reviewsShownOnEachPage: number) => {\n return Math.min(25, reviewsShownOnEachPage);\n};\n\nconst _getPagesCount = (reviewsCount: number, reviewsShownOnEachPage: number): number => {\n return Math.ceil(reviewsCount / _getReviewsShown(reviewsShownOnEachPage));\n};\n\nconst _paginationAriaLabel = (pageReviewAriaLabel: string, currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number, isNextPage: boolean, page?: number): string => {\n const pageModifier = isNextPage ? 1 : -1;\n return format(\n pageReviewAriaLabel,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage, currentPage + pageModifier),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage, currentPage + pageModifier),\n reviewsCount\n );\n};\n\nconst _getReviewStartNumber = (currentPage: number, reviewsShownOnEachPage: number, page?: number): number => {\n return ((page || currentPage) - 1) * _getReviewsShown(reviewsShownOnEachPage) + 1;\n};\n\nconst _getReviewEndNumber = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number, page?: number): number => {\n const pageUsed = page || currentPage;\n const pageReviewCount = pageUsed * _getReviewsShown(reviewsShownOnEachPage);\n return pageReviewCount < reviewsCount ? pageReviewCount : reviewsCount;\n};\n\nconst _getPreviousPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewStartNumber(props.currentPage, props.reviewsShownOnEachPage) - 1 - _getReviewsShown(props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage - 1,\n false\n );\n};\n\nconst _getNextPageData = async (props: IPageControlsProps) => {\n\n await props.updateReviews(\n _getReviewEndNumber(props.currentPage, props.reviewsCount, props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage + 1,\n false\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport {\n IItemAddedToCartDialogData, IItemAddedToCartDialogResources, ILinesAddedToCartDialogResources, IOrderTemplateNameDialogResources, ItemAddedToCartDialog\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { AsyncResult, getUrlSync, IRequestContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult } from '@msdyn365-commerce/global-state';\nimport { ProductList, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport {\n deleteAsync,\n removeProductListLinesAsync,\n updateProductListLinesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n getPriceForSelectedVariant, getProductUrlSync, ObjectExtensions,\n OrderTemplate, OrderTemplateLine, PriceForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, getTelemetryObject, Heading, IModuleProps, INodeProps, ITelemetryContent, UncontrolledPagination } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport debounce from 'lodash/debounce';\nimport { action, computed, observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n IOrderTemplateActionsProps, IOrderTemplateActionsViewProps, IOrderTemplateLineProps, IOrderTemplateLineViewProps, IOrderTemplateTableHeadingProps,\n OrderTemplateActionsView, OrderTemplateLinesStatusMessage, OrderTemplateLineView, OrderTemplateMobileLineView, OrderTemplateTableHeading\n} from '../..';\nimport { ActiveOrderTemplateLinesInput } from './actions/get-order-template';\nimport { OrderTemplateBulkActions } from './components/bulk-actions';\nimport { IOrderTemplateData } from './order-template.data';\nimport { IOrderTemplateProps, IOrderTemplateResources } from './order-template.props.autogenerated';\nimport Spinner from './components/add-line/spinner';\n\nexport interface IOrderTemplateLineActionMessageState {\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isItemAddedToOrderTemplateOpen: boolean;\n isConfirmAddSelectionToBagModalOpen: boolean;\n itemAddedToCartDialogData?: IItemAddedToCartDialogData;\n productSelection: IOrderTemplateLineViewModel[];\n isDetailsDisplayed: boolean;\n detailedProductView?: IOrderTemplateLineViewProps;\n isQuantityDisabledForUpdate?: boolean;\n}\n\nexport type orderTemplateLinesStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\ntype GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface IOrderTemplateViewProps extends IOrderTemplateProps {\n OrderTemplateLines: IModuleProps;\n callbacks?: IOrderTemplateLinesCallbacks;\n status?: orderTemplateLinesStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n OrderTemplateActions?: INodeProps;\n ProductsTable?: INodeProps;\n ProductsTableRow?: INodeProps;\n ProductsTableHeading?: React.ReactNode;\n ProductDetails?: INodeProps;\n orderLines?: IOrderTemplateLineViewProps[];\n productListLines?: ProductListLine[];\n productsStatusMessage?: React.ReactNode;\n orderActions?: IOrderTemplateActionsViewProps | null;\n resources: IOrderTemplateResources;\n pagination?: React.ReactNode;\n itemAddedToCartDialog?: React.ReactNode;\n bulkOrderLineActions?: React.ReactNode;\n isDetailsDisplayed?: boolean;\n detailedProduct?: IOrderTemplateLineProps;\n detailedProductView?: IOrderTemplateLineViewProps;\n productQuantityView?: React.ReactNode;\n addButton?: React.ReactNode;\n isMobile?: boolean;\n toggleDetailsDisplayed?(props: IOrderTemplateLineProps | undefined): void;\n}\n\nexport interface IOrderTemplateLinesCallbacks {\n updateQuantity(itemKey: string, quantity: number): void;\n}\n\nexport interface IOrderTemplateLineViewModel extends OrderTemplateLine {\n isChecked: boolean;\n productQuantityView: React.ReactNode;\n}\n\n/**\n *\n * OrderTemplateLines component.\n * @extends {React.PureComponent, IOrderTemplateLineActionMessageState>}\n */\n@observer\nclass OrderTemplateLines extends React.Component, IOrderTemplateLineActionMessageState> {\n private readonly className: string;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n @observable\n private _viewport: GridSize;\n\n @computed get isMobile(): boolean {\n return (this._viewport === 'xs' || this._viewport === 'sm');\n }\n\n constructor(props: IOrderTemplateProps, state: IOrderTemplateLineActionMessageState) {\n super(props);\n this.className = 'ms-order-template';\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._updateViewport = this._updateViewport.bind(this);\n\n this.state = {\n itemKey: '',\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n isItemAddedToOrderTemplateOpen: false,\n isConfirmAddSelectionToBagModalOpen: false,\n productSelection: [],\n isDetailsDisplayed: false,\n isQuantityDisabledForUpdate: false\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this._updateViewport();\n\n if (MsDyn365.isBrowser && !this.props.context.request.user.isAuthenticated) {\n window.location.assign(this.props.context.request.user.signInUrl || '/');\n }\n }\n\n @action\n public async componentDidMount(): Promise {\n this.setState({});\n const orderTemplate = await this.props.data.orderTemplate;\n this.props.config.heading!.text = orderTemplate?.productList.Name || '';\n this.setState({\n productSelection: orderTemplate?.orderTemplateLines as IOrderTemplateLineViewModel[]\n });\n\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public shouldComponentUpdate(nextProps: IOrderTemplateProps,\n nextState: IOrderTemplateLineActionMessageState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyOrderTemplateLinesText, errorGettingOrderTemplateLines } = this.props.resources;\n const { orderTemplate, cart } = this.props.data;\n\n if (cart.status === 'LOADING' || ObjectExtensions.isNullOrUndefined(orderTemplate) || orderTemplate.status === 'LOADING') {\n const errorProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(this.className, className)\n },\n status: 'LOADING',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || orderTemplate.status === 'FAILED') {\n const errorProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'FAILED',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n\n return this.props.renderView(errorProps);\n }\n\n const orderTemplateResult = orderTemplate && orderTemplate.result;\n const orderTemplateLines = orderTemplateResult && orderTemplateResult.orderTemplateLines;\n\n if (!orderTemplateResult || !orderTemplateLines || orderTemplateLines.length === 0) {\n if (orderTemplateResult && !this._isFirstPage() && MsDyn365.isBrowser) {\n window.location.href = this._getOrderTemplatePageUrl();\n return null;\n }\n\n const emptyViewProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'EMPTY',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'SUCCESS',\n productsStatusMessage: this.state.isOpen && (\n
\n \n \n {this.state.userMessage}\n \n \n
\n ),\n heading: heading && ,\n OrderTemplateActions: {\n className: `${this.className}-action-bar`,\n tag: 'div'\n },\n ProductsTable: {\n className: `${this.className}__table`,\n tag: 'table',\n role: 'grid'\n },\n ProductsTableRow: {\n className: `${this.className}-table-line`,\n tag: 'tr'\n },\n ProductsTableHeading: this._renderProductListHeader(this.props.resources),\n ProductDetails: {\n className: `${this.className}-table-line__link`,\n tag: 'a'\n },\n orderLines: this._renderProductList(),\n callbacks: { updateQuantity: debounce(this._changeQuantity, 2000) },\n orderActions: this._renderOrderTemplateActions(orderTemplateResult),\n pagination: this._renderPagination(),\n itemAddedToCartDialog: this._renderItemAddedToCartDialog(),\n bulkOrderLineActions: this._getOrderTemplateLineActions(orderTemplateResult.productList.Id),\n isDetailsDisplayed: this.state.isDetailsDisplayed,\n toggleDetailsDisplayed: this._toggleDetailsDisplayed,\n detailedProductView: this.state.detailedProductView,\n isMobile: this.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void {\n line.isChecked = isChecked;\n\n const updated = this.state.productSelection.map(product => {\n if (product.fullProduct?.ProductDetails.ItemId === line.fullProduct?.ProductDetails.ItemId) {\n line.isChecked = isChecked;\n }\n return product;\n }) || [];\n\n this.setState({\n productSelection: updated\n });\n }\n\n public onSelectAll(isChecked: boolean): void {\n const updated = this.state.productSelection.map(line => {\n line.isChecked = isChecked;\n return line;\n }) || [];\n\n this.setState({\n productSelection: updated\n });\n }\n\n private _renderProductListHeader(resources: IOrderTemplateResources): React.ReactNode {\n const { productNumberText, productText, productUnitPriceText, productUOMText, productQuantityText, productActionsText, selectAllRowsText } = resources;\n const headers: IOrderTemplateTableHeadingProps = {\n productNumber: productNumberText,\n productName: productText,\n productUnitPrice: productUnitPriceText,\n productUOM: productUOMText,\n productQuantity: productQuantityText,\n productActions: productActionsText,\n selectAllRowsText,\n lines: this.state.productSelection,\n isMobile: this.isMobile,\n clickHandler: (isChecked: boolean) => {\n this.onSelectAll(isChecked);\n }\n };\n\n return ;\n }\n\n private _getOrderTemplateLineActions(orderTemplateId: string): React.ReactNode {\n return (\n line.isChecked)}\n onAddSelectionToBag={this._onAddSelectionToBag}\n onRemoveSelection={this._onRemoveSelection}\n isMinifiedView={this.isMobile}\n />\n );\n }\n\n private _generateLinesAddedToCartDialogResources(): ILinesAddedToCartDialogResources {\n return {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\n };\n }\n\n private _generateItemAddedToCartDialogResources(): IItemAddedToCartDialogResources {\n return {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n itemAddedToCartHeaderItemOneText: this.props.resources.itemAddedToCartHeaderItemOneText,\n itemAddedToCartHeaderItemFormatText: this.props.resources.itemAddedToCartHeaderItemFormatText,\n itemAddedToCartHeaderMessageText: this.props.resources.itemAddedToCartHeaderMessageText,\n freePriceText: this.props.resources.freePriceText,\n originalPriceText: this.props.resources.originalPriceText,\n currentPriceText: this.props.resources.currentPriceText\n };\n }\n\n private readonly _onRemoveSelection = (): void => {\n const { context, resources } = this.props;\n const { telemetry } = context;\n const { removeSelectedFailureMessage, removeSelectedSuccessMessage } = resources;\n const lines = this.state.productSelection;\n const productListLines = lines && lines.length && lines\n .filter(line => line.isChecked)\n .map(line => line.productListLine);\n\n if (productListLines && productListLines.length > 0) {\n const productListId = productListLines[0].ProductListId;\n\n const maxWaitTimeInMilliSeconds: number = 1000;\n removeProductListLinesAsync({ callerContext: context.actionContext }, productListId!, productListLines)\n .then(async () => {\n this.setState({\n userMessage: removeSelectedSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n // eslint-disable-next-line no-promise-executor-return -- fix\n await new Promise(resolve => setTimeout(resolve, maxWaitTimeInMilliSeconds));\n window.location.reload();\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\n telemetry.error(error);\n this.setState({\n userMessage: removeSelectedFailureMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n });\n }\n };\n\n private readonly _getOrderTemplatePageUrl = (): string => {\n let url = getUrlSync('ordertemplate', this.props.context.actionContext) || '';\n url = url.includes('?') ? url.substr(0, url.indexOf('?')) : url;\n if (this.props.data.orderTemplate?.result?.productList.Id) {\n return `${url}?id=${this.props.data.orderTemplate.result.productList.Id}`;\n }\n return '';\n\n };\n\n private readonly _onAddSelectionToBag = async (): Promise => {\n const lines = this.state.productSelection;\n const selectedLines = lines.filter(line => line.isChecked);\n if (selectedLines.length > 0) {\n for (const productLine of selectedLines) {\n const itemKey = productLine.fullProduct?.ProductDetails.ItemId ?? '';\n const product = productLine.fullProduct?.ProductDetails ?? { RecordId: 0, ProductTypeValue: 0, BasePrice: 0, Price: 0, AdjustedPrice: 0 };\n const quantity = productLine.productListLine.Quantity ?? 0;\n this._addItemToBag(product, quantity, itemKey);\n }\n }\n return Promise.resolve(void (0));\n };\n\n private _renderOrderTemplateActions(orderTemplate: OrderTemplate): IOrderTemplateActionsViewProps {\n const { id, typeName, context, resources } = this.props;\n const {\n addTemplateToBagButtonText,\n renameTemplateButtonText,\n deleteTemplateButtonText,\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage\n } = resources;\n\n const orderTemplateActions: IOrderTemplateActionsProps = {\n data: { orderTemplate },\n id,\n typeName,\n context,\n telemetryContent: this.telemetryContent,\n handlers: {\n onRenameTemplate: this._renameTemplate,\n onRemoveTemplate: this._removeTemplate\n },\n renameOrderTemplateDialogStrings: this._generateOrderTemplateNameDialogResources(resources),\n resources: {\n addTemplateToBagButtonText,\n renameTemplateButtonText,\n deleteTemplateButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n closeWindowButtonText,\n linesAddedToCartDialogResources: this._generateLinesAddedToCartDialogResources()\n }\n };\n\n return OrderTemplateActionsView(orderTemplateActions);\n }\n\n private _generateOrderTemplateNameDialogResources(resources: IOrderTemplateResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.renameOrderTemplateTitleText,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateTitle,\n orderTemplateDescription: '',\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n orderTemplateButtonLabel: resources.renameOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelBtnLabel\n };\n }\n\n private readonly _getCurrentUrl = (reqContext: IRequestContext): URL => {\n if (MsDyn365.isBrowser) {\n return new URL(window.location.href);\n }\n return new URL(reqContext.url.requestUrl.href);\n };\n\n /**\n * On close handler.\n */\n private readonly onCloseHandler = () => {\n this.setState({\n itemKey: this.state.itemKey,\n userMessage: this.state.userMessage,\n statusCssString: this.state.statusCssString,\n messageGlyph: this.state.messageGlyph,\n isOpen: this.state.isOpen,\n isItemAddedToOrderTemplateOpen: false\n });\n };\n\n private readonly _renderItemAddedToCartDialog = (): React.ReactNode | null => {\n if (!this.state.itemAddedToCartDialogData) {\n return null;\n }\n\n return (\n \n );\n };\n\n private _isFirstPage(): boolean {\n return this._getCurrentPageNumber() === 0;\n }\n\n private _getCurrentPageNumber(): number {\n const itemsPerPage = this.props.config.itemsPerPage || 50;\n return this.props.context.request.query && (+this.props.context.request.query.skip / itemsPerPage) || 0;\n }\n\n private readonly _renderPagination = (): React.ReactNode | null => {\n const { config, context, data, resources } = this.props;\n const orderTemplate = data && data.orderTemplate && data.orderTemplate.result;\n if (!orderTemplate) {\n return null;\n }\n\n const fullUrl = this._getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 50;\n const currentPageNumber = this._getCurrentPageNumber();\n const skipCount = currentPageNumber * itemsPerPage;\n const totalItems = orderTemplate && orderTemplate.totalLines;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n\n return (\n \n );\n };\n\n private _renderProductList(): IOrderTemplateLineViewProps[] {\n const {\n selectOneRowText,\n moreButtonText,\n viewProductDetailsText,\n priceFree,\n originalPriceText,\n currentPriceText,\n addOrderTemplateItemToBagButtonText,\n removeItemFromOrderTemplateButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n inputQuantityAriaLabel,\n deleteButtonText,\n incrementButtonAriaLabel,\n decrementButtonAriaLabel\n } = this.props.resources;\n\n const { context, telemetry } = this.props;\n const { imageSettings } = this.props.config;\n\n return this.state.productSelection.map((line, index) => {\n const currentProductProps: IOrderTemplateLineProps = {\n orderTemplateLine: line,\n productListLine: line.productListLine,\n price: line.fullProduct?.ProductPrice,\n context,\n isQuantityDisabledForUpdate: this.state.isQuantityDisabledForUpdate,\n productUrl: line.fullProduct ? getProductUrlSync(line.fullProduct.ProductDetails, context.actionContext, undefined) : '',\n imageSettings,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n quantity: line.productListLine.Quantity!,\n handlers: {\n onAddToBag: this._addItemToBag,\n onRemoveItem: this._removeItemFromOrderTemplateLines,\n onChangeQuantity: this._changeQuantity,\n onSelect: this.onSelect.bind(this)\n },\n resources: {\n selectOneRowText,\n moreButtonText,\n viewProductDetailsText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText,\n inputQuantityAriaLabel,\n removeFromOrderTemplateLinesText: removeItemFromOrderTemplateButtonText,\n addToBagButtonText: addOrderTemplateItemToBagButtonText,\n deleteButtonText,\n incrementButtonAriaLabel,\n decrementButtonAriaLabel\n },\n index,\n isMobile: this.isMobile,\n toggleDetailsDisplayed: this._toggleDetailsDisplayed\n };\n\n return OrderTemplateLineView(currentProductProps)!;\n });\n }\n\n private readonly _toggleDetailsDisplayed = (props: IOrderTemplateLineProps): void => {\n let state = {\n isDetailsDisplayed: !this.state.isDetailsDisplayed\n };\n if (props) {\n state = { ...state, ...{\n detailedProductView: OrderTemplateMobileLineView(props)\n } };\n }\n this.setState(state);\n };\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _changeQuantity = (itemKey: string, quantity: number, props?: IOrderTemplateLineProps) => {\n const { context, data, telemetry, config, resources } = this.props;\n const { orderTemplate } = data;\n\n if (context) {\n if (orderTemplate?.result) {\n const orderTemplateLinesData = orderTemplate.result.orderTemplateLines;\n if (orderTemplateLinesData) {\n const orderLineIndex = orderTemplateLinesData.findIndex((lines: OrderTemplateLine) => lines.productListLine.LineId === itemKey);\n const newProductListLine = { ...orderTemplateLinesData[orderLineIndex] };\n if (orderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return;\n }\n const prevQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n // Update mobile modal\n if (props) {\n props.quantity = quantity;\n this.setState({\n detailedProductView: OrderTemplateMobileLineView(props)\n });\n }\n\n this.setState({\n isQuantityDisabledForUpdate: true\n });\n\n updateProductListLinesAsync({ callerContext: context.actionContext }, orderTemplate.result.productList.Id, [line.productListLine])\n .then(list => {\n this.setState({\n itemKey,\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isQuantityDisabledForUpdate: false,\n isOpen: false\n });\n if (list) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n orderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...orderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedOrderTemplate = { ...orderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(new ActiveOrderTemplateLinesInput(context.actionContext.requestContext, config), updatedOrderTemplate);\n }\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable to update product quantity.');\n telemetry.error(error);\n const userMessage = resources.editOrderTemplateLineQuantityError;\n if (props) {\n props && (props.productListLine.Quantity = prevQuantity);\n this.setState({\n itemKey,\n userMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isQuantityDisabledForUpdate: false,\n isOpen: true,\n detailedProductView: OrderTemplateMobileLineView(props)\n });\n } else {\n newProductListLine.productListLine.Quantity = prevQuantity;\n this.setState({\n itemKey,\n userMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isQuantityDisabledForUpdate: false,\n isOpen: true\n });\n }\n });\n }\n }\n }\n };\n\n private readonly _addItemToBag = (product: SimpleProduct, quantity: number, itemKey: string): void => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { maxQuantityLimitText, addedToCartFailureMessage } = resources;\n\n if (context) {\n if (cart.result) {\n const addProductToCartInput = {\n product,\n count: quantity\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then((result: ICartActionResult) => {\n if (result.status === 'SUCCESS') {\n return getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(\n product.RecordId,\n this.props.context.actionContext.requestContext.apiSettings.channelId,\n product),\n this.props.context.actionContext).then(priceResult => {\n if (!priceResult) {\n return AsyncResult.reject('Failed to retrieve product price');\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\n const isMiniCart = context.app.config.addToCartBehavior === 'showMiniCart';\n this.setState({\n itemKey,\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n isItemAddedToOrderTemplateOpen: !isMiniCart,\n itemAddedToCartDialogData: {\n product,\n productPrice: priceResult,\n quantity\n },\n isDetailsDisplayed: false\n });\n return AsyncResult.resolve();\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n this.setState({\n itemKey,\n userMessage:\n maxQuantityLimitText\n .replace('{curQuantity}', quantity.toString())\n .replace('{maxQuantity}', context.app.config.maxQuantityForProductListLineItem.toString()) ||\n `You can only add ${context.app.config.maxQuantityForProductListLineItem} of this item to your shopping bag`,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n }\n telemetry.debug('[order-template-lines] Unable to Update Cart Line from the order template lines');\n this.setState({\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n\n })\n .catch((error: Error) => {\n telemetry.warning(error.message);\n telemetry.debug('[order-template-lines] Error trying to Update Cart Line from the order template lines');\n this.setState({\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private readonly _removeItemFromOrderTemplateLines = (line: IOrderTemplateLineViewModel): void | undefined => {\n const { context, data, telemetry } = this.props;\n const { orderTemplate } = data;\n\n if (context && context.actionContext) {\n const maxWaitTimeInMilliSeconds: number = 1000;\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplate?.result && line) {\n removeProductListLinesAsync({ callerContext: context.actionContext }, line.productListLine.ProductListId!, [line.productListLine])\n .then(async () => {\n // eslint-disable-next-line no-promise-executor-return -- fix\n await new Promise(resolve => setTimeout(resolve, maxWaitTimeInMilliSeconds));\n window.location.reload();\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\n '[order-template-lines] Unable remove items from the order template lines user token or lineItemID was not found'\n );\n }\n }\n };\n\n private readonly _renameTemplate = async (_template: ProductList): Promise => {\n window.location.reload();\n return Promise.resolve();\n };\n\n private readonly _removeTemplate = () => {\n const { context, data, telemetry, resources } = this.props;\n const { orderTemplate } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplate && orderTemplate.result) {\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.result.productList)\n .then()\n .catch((error: string) => {\n telemetry.warning('[order-template] Unable to delete order template.');\n telemetry.error(error);\n this.setState({\n itemKey: orderTemplate.result?.productList.Id || '',\n userMessage: resources.deleteOrderTemplateFailedText,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n const newLink = getUrlSync('ordertemplatelist', this.props.context.actionContext);\n if (newLink) {\n window.location.assign(newLink);\n }\n } else {\n telemetry.warning('[order-template] Failed to delete order template. Order template was not found');\n }\n } else {\n telemetry.warning('[order-template] Failed to delete order template.');\n }\n };\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n }\n\n private readonly _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 }\n return 'xl';\n\n }\n }\n\n return 'xs';\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n
\n
\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n
\n \n {paginationNextText}\n \n
\n );\n };\n}\n\nexport default OrderTemplateLines;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\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 enum ProductRefinerValueDataTypeValue {\n\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 enum ProductRefinerTypeValue {\n\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 enum ProductRefinerSource {\n\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 /**\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 /**\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 /**\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 /**\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 * @param dataTypeValue\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 * @param refinementCriterion\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,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductDimensionConfigureDropdownViewProps, IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderFormViewProps } from './components';\nimport { IQuickOrderViewProps } from './quick-order';\n\n/**\n * Render product dimension/configure container.\n * @param configure -- Product dimension configuration.\n * @returns Container to have dimension dropdown.\n */\nconst renderConfigure = (configure?: IProductDimensionConfigureViewProps): JSX.Element | null => {\n if (configure !== undefined) {\n const { containerProps, dropdowns } = configure;\n\n return (\n \n {dropdowns.map(renderConfigureDropdown)}\n \n );\n }\n return null;\n\n};\n\n/**\n * Render product dimension/configure dropdown.\n * @param dropdown -- Product dimension drop down.\n * @returns Dropdown.\n */\nconst renderConfigureDropdown = (dropdown: IProductDimensionConfigureDropdownViewProps): JSX.Element => {\n const { containerProps, labelContainerProps, heading, errors, select } = dropdown;\n\n return (\n \n \n {heading}\n \n {errors}\n {select}\n \n );\n};\n\nconst renderForm = (form: IQuickOrderFormViewProps, isMobileView: boolean, quickOrderForm: INodeProps, quickOrderProductContent: INodeProps, quickOrderMsgContent: INodeProps, configure?: IProductDimensionConfigureViewProps) => {\n return isMobileView ? (\n \n \n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n \n {form.userMessage}\n \n {form.addToCartBtn}\n \n \n ) : (\n \n \n {form.userMessage}\n \n \n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToCartBtn}\n \n \n );\n};\n\nconst quickOrderView: React.FC = props => {\n const {\n isB2B,\n quickOrderProps,\n contentProps,\n form,\n quickOrderForm,\n drawer,\n configure,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n quickOrderList,\n isMobileView\n } = props;\n\n return isB2B ? (\n \n \n \n {renderForm(form as IQuickOrderFormViewProps, isMobileView, quickOrderForm,\n quickOrderFormProductContent, quickOrderFormMsgContent, configure)}\n \n \n\n {quickOrderList}\n \n ) : null;\n};\nexport default quickOrderView;\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { 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\nimport { Button, format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { addAttributeToCart, removeAttributeFromCart } from \"../../../../utils/cartAttributeManager\";\r\n\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\nexport interface IPromoCodeComponent extends IComponent { }\r\n\r\nconst PromoCodeComponentActions = {};\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.Component {\r\n private readonly COUPON_ATTRIBUTE_KEY = 'coupon-code';\r\n private readonly payLoad: IPayLoad;\r\n\r\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\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 shouldComponentUpdate(nextProps: IPromoCodeProps): boolean {\r\n if (this.props.appliedPromoCodeHeadingText !== nextProps.appliedPromoCodeHeadingText) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n
\r\n
\r\n {this.props.promoCodeHeadingText}\r\n
\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n

\r\n {this.state.error}\r\n

\r\n {this._renderAppliedPromoCode(this.props)}\r\n
\r\n );\r\n }\r\n\r\n private readonly _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,\r\n canApply: !!e.target.value\r\n });\r\n };\r\n\r\n private readonly _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 const _cart = addAttributeToCart(this.COUPON_ATTRIBUTE_KEY, appliedPromo, cartState.cart);\r\n void cartState.updateCart({newCartObject: _cart})\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 readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n const _onSubmit = (event: React.FormEvent) => {\r\n event.preventDefault(); this._applyPromotion(cartState);\r\n };\r\n const _applyPromotion = (event: React.MouseEvent) => {\r\n this._applyPromotion(cartState);\r\n };\r\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n {promoCodeApplyButtonText}\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n private readonly _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: [code]\r\n })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n const _cart = removeAttributeFromCart(this.COUPON_ATTRIBUTE_KEY, cartState.cart);\r\n void cartState.updateCart({newCartObject: _cart, additionalProperties: { AttributeValues: _cart.AttributeValues || [] }});\r\n this.setState({ error: '' });\r\n\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\r\n });\r\n\r\n };\r\n\r\n private readonly _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 readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\r\n return;\r\n }\r\n\r\n const _removePromotion = (event: React.MouseEvent) => {\r\n this._removePromotion(props.cart, event);\r\n };\r\n let totalCouponDiscountAmount = 0;\r\n for (const coupon of props.cart.cart.Coupons) {\r\n const discountAmount = this._calculateDiscount(coupon.Code ?? '', props.cart);\r\n if (discountAmount) {\r\n totalCouponDiscountAmount += discountAmount;\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n {this.props.appliedPromoCodeHeadingText}\r\n
\r\n \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\r\n return (\r\n
\r\n
\r\n {coupon.Code}\r\n {' '}\r\n (\r\n \r\n )\r\n
\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// @ts-expect-error\r\nexport const PromoCodeComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'PromoCode',\r\n { component: PromoCode, ...PromoCodeComponentActions }\r\n);\r\n\r\n\r\nexport default PromoCodeComponent;\r\n","import { Cart } from '@msdyn365-commerce/retail-proxy';\r\nimport { AttributeTextValueClass } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\n\r\nconst addAttributeToCart = (attrKey: string, attrValue: string, cart: Cart): Cart => {\r\n const _cart = { ...cart };\r\n const attributeArray = _cart.AttributeValues || [];\r\n const attributeObj = {\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: attrKey,\r\n ExtensionProperties: [],\r\n TextValue: attrValue,\r\n TextValueTranslations: []\r\n };\r\n const attrIdx = attributeArray.findIndex(a => a.Name?.toUpperCase() === attrKey.toUpperCase());\r\n\r\n //Update existing attribute if there.\r\n if (attrIdx > -1) {\r\n (attributeArray[attrIdx] as AttributeTextValueClass).TextValue = attrValue;\r\n } else {\r\n attributeArray.push(attributeObj);\r\n }\r\n\r\n _cart.AttributeValues = attributeArray;\r\n\r\n return _cart;\r\n};\r\n\r\nconst removeAttributeFromCart = (attrKey: string, cart: Cart): Cart => {\r\n const _cart = { ...cart };\r\n const attributeArray = _cart.AttributeValues || [];\r\n const attrIdx = attributeArray.findIndex(a => a.Name?.toUpperCase() === attrKey.toUpperCase());\r\n\r\n //We can't remove attribute values for some reason, so we'll just set the value to ''\r\n if (attrIdx > -1) {\r\n (attributeArray[attrIdx] as AttributeTextValueClass).TextValue = '';\r\n }\r\n _cart.AttributeValues = attributeArray;\r\n return _cart;\r\n};\r\n\r\nexport { addAttributeToCart, removeAttributeFromCart };\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { format, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { createRatingsReviewsStateInput } from '../../actions/ratings-reviews-state-data-action';\nimport { AverageRatingNumber, HistogramItems, IHistogramItemViewProps, TotalReviews } from './component/components';\nimport { IRatingsHistogramData } from './ratings-histogram.data';\nimport { IRatingsHistogramProps } from './ratings-histogram.props.autogenerated';\n\nexport interface IRatingsHistogramViewProps extends IRatingsHistogramProps {\n className: string;\n histogramItems: IHistogramItemViewProps[];\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n averageRating: React.ReactNode;\n averageNumber: React.ReactNode;\n totalReviews: React.ReactNode;\n histogramProps: INodeProps;\n ratingsSummaryProps: INodeProps;\n callbacks: IRatingsHistogramCallbacks;\n}\n\nexport interface IRatingsHistogramCallbacks {\n selectFilterBy(stars: number): void;\n}\n\n/**\n * RatingsHistogram component.\n * @extends {React.Component>}\n */\n@observer\nclass RatingsHistogram extends React.PureComponent> {\n\n constructor(props: IRatingsHistogramProps) {\n super(props);\n this.selectFilterBy = this.selectFilterBy.bind(this);\n }\n\n public render(): JSX.Element | null {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const { ratingsSummary: { result: ratingsSummary } } = this.props.data;\n const ratingCount = ratingsSummary && ratingsSummary.totalRatingsCount ? `${ratingsSummary.totalRatingsCount}` : '0';\n\n const completeClass = classname('ms-ratings-histogram', className);\n const viewProps: IRatingsHistogramViewProps = {\n ...this.props,\n className: completeClass,\n callbacks: {\n selectFilterBy: this.selectFilterBy\n },\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n histogramItems: ratingsSummary ? HistogramItems({ ratingsSummary, resources: { ...resources }, locale: this.props.context.request.locale, onClick: this.selectFilterBy }) : [],\n averageRating: ratingsSummary && (\n \n ),\n averageNumber: ratingsSummary && ,\n totalReviews: ratingsSummary && ,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\n \n ),\n histogramProps: { className: 'ms-ratings-histogram__histogram' }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({ filterKey }), { filterKey });\n }\n}\n\nexport default RatingsHistogram;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC = ({ key, className, dimensionType, dimensionValue }) => (\n
\n \n {dimensionType}\n :\n \n \n {dimensionValue}\n \n
\n);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { CommerceListLine, ProductPrice, ReleasedProductType, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getFallbackImageUrl, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext>;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice = price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return (`${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`);\n case 3:\n return (`${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`);\n case 4:\n return (`${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`);\n default:\n return '';\n }\n });\n }\n\n return (`${Name} ${formattedPrice} ${dimensions && dimensions.join('') || ''}`);\n};\n\n/**\n * Renders a link to a product based on the given props.\n * @param input - Wishlist item props with the info about the product.\n * @returns React component with a link to a product.\n */\nconst renderProductLink = (input: IWishlistItemProps) => {\n const { productUrl, telemetryContent } = input;\n const { RecordId: recordId, Name: productName } = input.product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return !StringExtensions.isNullOrWhitespace(productUrl) &&\n (\n \n {productName}\n \n );\n};\n\n/**\n * Renders a product name box.\n * @param productName - The text to display.\n * @returns React component with a name of a product.\n */\nconst renderProductName = (productName: string) => {\n return (\n
\n {productName}\n
\n );\n};\n\n/**\n * Renders inventory information.\n * @param inventoryInformationLabel - The text to display.\n * @param inventoryLabelClassName - The component class name.\n * @returns React component.\n */\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\n const inventoryCssName = inventoryLabelClassName ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}` : 'ms-wishlist-items__inventory-label';\n return !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\n \n {inventoryInformationLabel}\n \n );\n};\n\n/**\n * Renders add to cart button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\n const { isInStock, addToCartText, outOfStockText } = input;\n\n // Check if the product is service or not by product type.\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n const addItemAction = React.useCallback(() => {\n WishListItemActions.addToCart(input);\n }, [input]);\n\n return (\n \n { (isServiceItem || isInStock) && addToCartText || outOfStockText }\n \n );\n};\n\n/**\n * Renders remove from wishlist button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\n const { removeFromWishlistText } = input;\n\n const removeItemAction = React.useCallback(() => {\n WishListItemActions.removeItem(input);\n }, [input]);\n\n return (\n \n );\n};\n\n/**\n * Gets the react node for product unit of measure display.\n * @param context - Module context.\n * @param unitOfMeasure - Product unit of measure.\n * @returns The node representing markup for unit of measure component.\n */\nconst renderUnitOfMeasure = (context: ICoreContext>, unitOfMeasure?: string) => {\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (context.app.config && (!context.app.config.unitOfMeasureDisplayType || context.app.config.unitOfMeasureDisplayType === 'none')) {\n return undefined;\n }\n\n if (!unitOfMeasure) {\n return undefined;\n }\n\n return (\n
\n \n {unitOfMeasure}\n \n
\n );\n};\n\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const { product, productUrl, price, context, imageSettings,\n wishlistState, itemKey, handlers, inventoryInformationLabel, enableImageProductLink, inventoryLabelClassName } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n\n return {\n key: `${RecordId}-item`,\n productImage: PrimaryImageUrl && Name && _renderProductImage(context, product.Name!, PrimaryImageUrl, fallbackImage, imageSettings),\n productLink: renderProductLink(input),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n productUnitOfMeasure: product.DefaultUnitOfMeasure && renderUnitOfMeasure(context, product.DefaultUnitOfMeasure),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink && Name && renderProductName(Name),\n\n addToCartButton: ,\n inventoryInformation: renderInventoryInformationLabel(inventoryInformationLabel, inventoryLabelClassName),\n removeButton: ,\n productStatusMessage: wishlistState && wishlistState.isOpen &&\n wishlistState.productId === RecordId && wishlistState.itemKey === itemKey &&\n (\n
\n \n \n {wishlistState.userMessage}\n \n \n
\n )\n };\n};\n\nconst _renderProductImage = (context: ICoreContext, heading: string, image?: string, fallbackImage?: string, imageSettings?: IImageSettings): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n \n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n \n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch (dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n \n );\n });\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return (\n

\n { text }\n

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

\n { text }\n

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

\n { text }\n

\n );\n }\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ArrayExtensions, getProductUrlSync, IProductInventoryInformation, QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n}\n\n/**\n *\n * WishlistItems component.\n * @extends {React.PureComponent, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component, IWishlistItemActionMessageState> {\n\n private readonly telemetryContent: ITelemetryContent;\n\n constructor(props: IWishlistItemsProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public async componentDidMount(): Promise {\n this.setState({});\n }\n\n public shouldComponentUpdate(nextProps: IWishlistItemsProps,\n nextState: IWishlistItemActionMessageState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'LOADING',\n\n // StatusMessage: \n statusMessage: ,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'FAILED',\n statusMessage: ,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult).result;\n\n if (productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'EMPTY',\n statusMessage: ,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul'\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li'\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a'\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions'\n },\n products: productsList && this._renderProductList(productsList)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n\n const { priceFree, originalPriceText, currentPriceText, addToCartButtonText, outOfStockText, removeButtonText, productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle, productDimensionTypeAmount } = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText,\n index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n }\n };\n\n return (\n WishlistItem(currentProductProps)!\n );\n });\n }\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if (!heading) {\n return undefined;\n }\n return (\n \n );\n };\n\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n const isOrderQuantityLimitsFeatureEnabledInHq = this.props.data.featureState.result\n ?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings = defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [product.RecordId]);\n\n const isOrderQuantityLimitsFeatureEnabled = isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n const addProductToCartInput = {\n product,\n quantity: 1,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: isOrderQuantityLimitsFeatureEnabled },\n isAddEmailDeliveryItemToCart: ArrayExtensions.hasElements(deliveryOptions) && ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) && deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\n };\n\n cart.result.addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity = (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && isOrderQuantityLimitsFeatureEnabled) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'INVOICEINCART') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private readonly _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as (CommerceList | null);\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then((products) => {\n const castSimpleProducts: FullProduct[] | null = products as (FullProduct[] | null);\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn\\'t found');\n }\n }\n };\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\n\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText.replace('{maxQuantity}', maxQuantityForLineItem.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(product: FullProduct, productInventoryCollection: IProductInventoryInformation[] | undefined): IProductInventoryInformation | undefined {\n if (productInventoryCollection && productInventoryCollection.length > 0) {\n for (const productResult of productInventoryCollection) {\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n };\n\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n };\n\n private readonly _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n };\n\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (!wishlists.result || wishlists.result.length === 0 || !wishlists.result[0].CommerceListLines || wishlists.result[0].CommerceListLines.length === 0) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter((commerceListLine) => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n }\n return null;\n\n };\n}\n\nexport default WishlistItems;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getRnrAuthEndpointId, getRnrEndpointId, getRnrPartnerId, getSelectedProductIdFromActionInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, ITelemetryContent, LabeledDropdown } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { reportReviewConcern, submitHelpfulnessVote } from '../..';\nimport { getReviewsForGivenProduct } from '../../actions/get-product-reviews';\nimport { GetProductReviewsInput } from '../../actions/inputs/get-product-reviews-input';\nimport { ReportReviewConcernInput, ReviewConcernCategory } from '../../actions/inputs/report-review-concern-input';\nimport { SubmitHelpfulnessVoteInput } from '../../actions/inputs/submit-helpfulness-vote-input';\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { IRnrKeyValuePair, IRnrOrderByKeyValuePair } from '../../common/rnrInterface';\nimport { PageControls, ReviewCount } from './components/components';\nimport { IReportReviewModalViewProps, ReportReviewModal } from './components/report-review-modal';\nimport { IReviewCardViewProps, ReviewCard } from './components/review-card';\nimport { IReviewsListData } from './reviews-list.data';\nimport { IReviewsListProps } from './reviews-list.props.autogenerated';\n\nexport interface IReviewsListState {\n skipItems: number;\n listOfReviews: Review[];\n currentPage: number;\n reviewsCount: number;\n showSpinner: boolean;\n isFilterApplied: boolean;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n userReviewRating: number;\n userReviewTitle: string;\n userReviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n isReportModalOpen: boolean;\n hasReportError: boolean;\n reportingReviewId: string;\n reportedKey: string;\n reported: boolean;\n reportedReviews: string[];\n votedReviews: { reviewId: string; approved: boolean }[];\n}\n\nexport interface IReviewsListCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(product: SimpleProduct, title: string, text: string, rating: number, context: Msdyn365.ICoreContext, userReview?: Review, onReviewSubmission?: (isSuccessful: boolean) => void): void;\n updateReviewHelpfulnessVote(reviewId: string, isHelpful: boolean): void;\n toggleReportModal(reviewId: string): void;\n reportReview(reviewId: string, reportedKey: string): void;\n updateSortByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateFilterByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateReviews(skipItems: number, selectedSortByOption: ILabeledDropdownOption, selectedFilterByOption: ILabeledDropdownOption, currentPage: number, isFilterApplied: boolean): void;\n}\n\nexport interface IReviewsListViewProps extends IReviewsListProps {\n state: IReviewsListState;\n className: string;\n callbacks: IReviewsListCallbacks;\n moduleProps: IModuleProps;\n reviewModal: IReviewModalViewProps;\n reportReviewModal: IReportReviewModalViewProps;\n sortByDropdown: React.ReactNode;\n filterByDropdown: React.ReactNode;\n averageRating: React.ReactNode;\n reviewCount: React.ReactElement;\n refineReviewsProps: INodeProps;\n reviewsListProps: INodeProps;\n reviewCards: IReviewCardViewProps[];\n userReview?: IReviewCardViewProps;\n pageControls: React.ReactNode;\n noReviewsMessage: React.ReactElement;\n noReviewsWithFilterMessage: React.ReactElement;\n heading: React.ReactNode;\n sortByOptions: IRnrOrderByKeyValuePair[];\n filterByOptions: IRnrOrderByKeyValuePair[];\n}\n\n/**\n *\n * ReviewsList component.\n * @extends {React.Component, IReviewsListState>}\n */\n@observer\nclass ReviewsList extends React.Component, IReviewsListState> {\n public sortByDropdownOptions: IRnrOrderByKeyValuePair[] = [\n { key: 'MostHelpful', value: this.props.resources.mostHelpfulSortOptionText },\n { key: 'MostRecent', value: this.props.resources.mostRecentSortOptionText },\n { key: 'HighestRating', value: this.props.resources.highestRatedSortOptionText },\n { key: 'LowestRating', value: this.props.resources.lowestRatedSortOptionText }\n ];\n\n public filterByDropdownOptions: IRnrKeyValuePair[] = [\n { key: '1;2;3;4;5', value: this.props.resources.allRatinsFilterByOptionText },\n { key: '5', value: this.props.resources.fiveStarFilterByOptionText },\n { key: '4', value: this.props.resources.fourStarFilterByOptionText },\n { key: '3', value: this.props.resources.threeStarFilterByOptionText },\n { key: '2', value: this.props.resources.twoStarFilterByOptionText },\n { key: '1', value: this.props.resources.oneStarFilterByOptionText }\n ];\n\n private readonly _userReviewModalToggle: React.RefObject;\n\n private readonly _userReportModalToggle: React.RefObject;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n constructor(props: IReviewsListProps) {\n super(props);\n const { userReview: { result: userReview } } = this.props.data;\n\n this.state = {\n skipItems: 0,\n reviewsCount: 0,\n listOfReviews: [],\n currentPage: 1,\n showSpinner: false,\n isFilterApplied: false,\n selectedSortByOption: this.sortByDropdownOptions[0],\n selectedFilterByOption: this.filterByDropdownOptions[0],\n userReviewRating: userReview ? userReview.rating : 0,\n userReviewText: userReview ? userReview.reviewText : '',\n userReviewTitle: userReview ? userReview.title : '',\n isReviewModalOpen: false,\n hasReviewError: false,\n isReportModalOpen: false,\n hasReportError: false,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising,\n reportingReviewId: '',\n reportedReviews: [],\n votedReviews: []\n };\n\n this._userReviewModalToggle = React.createRef();\n this._userReportModalToggle = React.createRef();\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public componentDidMount = async () => {\n this.props.data.reviewsList.then((reviewsList) => {\n if (\n reviewsList &&\n reviewsList.pagingInfo &&\n reviewsList.pagingInfo.totalItems &&\n reviewsList.items &&\n reviewsList.items.length > 0\n ) {\n this.setState({\n listOfReviews: reviewsList.items,\n reviewsCount: reviewsList.pagingInfo.totalItems\n });\n }\n });\n await this.updateReviews(0, this.state.selectedSortByOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n\n reaction(\n () => this.props.data.ratingsReviewsState.result && this.props.data.ratingsReviewsState.result.filterKey,\n async (filterKey: string | undefined) => {\n const filterKeyValue = Number(filterKey);\n const dropdownItemsCount = this.filterByDropdownOptions.length;\n if (\n filterKey &&\n !isNaN(filterKeyValue) &&\n filterKeyValue < dropdownItemsCount\n ) {\n const filterByOption = this.filterByDropdownOptions.find((option: IRnrKeyValuePair) => option.key === filterKey);\n if (!filterByOption) {\n this.props.telemetry.warning(`[reviews-list] cannot find filter with key ${filterKey}`);\n } else {\n await this.updateReviews(0, this.state.selectedSortByOption, filterByOption, 1, true);\n const selectedIndex = dropdownItemsCount - filterKeyValue;\n this.setState({\n selectedFilterByOption: this.filterByDropdownOptions[selectedIndex]\n });\n }\n }\n }\n );\n };\n\n public shouldComponentUpdate(nextProps: IReviewsListProps,\n nextState: IReviewsListState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { className, heading, reviewsShownOnEachPage } = this.props.config;\n const { currentPage, reviewsCount, selectedFilterByOption, selectedSortByOption } = this.state;\n const { ratingsSummary: { result: ratingsSummary } } = this.props.data;\n const resources = this.props.resources;\n const completeClass = classname('ms-reviews-list', className);\n const viewProps: IReviewsListViewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n callbacks: this.reviewsListCallbacks,\n reviewModal: this._userReviewModal(),\n reportReviewModal: this._reportReviewModal(),\n filterByDropdown: (\n \n ),\n sortByDropdown: ,\n averageRating: ratingsSummary && (\n \n ),\n reviewCount: ,\n refineReviewsProps: { className: 'ms-reviews-list__refiners' },\n reviewsListProps: { className: 'ms-reviews-list__reviews' },\n reviewCards: this._reviewCards(this.state.listOfReviews),\n userReview: this._userReview(),\n pageControls: (\n ),\n noReviewsMessage: \n {resources.noReviewsMessage}\n ,\n noReviewsWithFilterMessage: \n {resources.noReviewsWithSelectedFilterMessage}\n ,\n heading: heading && heading.text && (\n \n ),\n sortByOptions: this.sortByDropdownOptions,\n filterByOptions: this.filterByDropdownOptions\n } as IReviewsListViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private readonly _userReview = () => {\n const userReview = this.props.data.userReview.result;\n\n return userReview && this._reviewCard(userReview, true);\n };\n\n private readonly _reviewCards = (reviewList: Review[]) => {\n const userReview = this.props.data.userReview.result;\n const reviewElements: IReviewCardViewProps[] = [];\n\n for (const review of reviewList) {\n if (!review.isTakenDown && review.isPublished && userReview ? review.reviewId !== userReview.reviewId : true) {\n reviewElements.push(this._reviewCard(review, false));\n }\n }\n return reviewElements;\n };\n\n private readonly _reviewCard = (review: Review, userReview: boolean): IReviewCardViewProps => {\n return ReviewCard({\n review,\n resources: { ...this.props.resources },\n context: this.props.context,\n isUserReview: userReview,\n parentId: this.props.id,\n parentType: this.props.typeName,\n reportedReviews: this.state.reportedReviews,\n returnRef: this._userReportModalToggle,\n reportedReviewId: this.state.reportingReviewId,\n toggleWriteReviewModal: this._toggleReviewModal,\n toggleReportReviewModal: this._onReportModalOpen,\n updateReviewHelpfulness: this.updateReviewHelpfulnessVote,\n votedReviews: this.state.votedReviews\n });\n };\n\n private readonly _userReviewModal = (): IReviewModalViewProps => {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.userReviewRating,\n reviewTitle: this.state.userReviewTitle,\n reviewText: this.state.userReviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this._onReviewComplete,\n renderContextId: 'writeReview-list',\n returnRef: this._userReviewModalToggle,\n hasError: this.state.hasReviewError\n });\n };\n\n private readonly _onTitleChange = (event: React.ChangeEvent): void => {\n this.reviewsListCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent): void => {\n this.reviewsListCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.reviewsListCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n\n } else {\n this.setState({\n isReviewModalOpen: true,\n userReviewText: userReview!.reviewText,\n userReviewTitle: userReview!.title,\n userReviewRating: userReview!.rating\n });\n }\n };\n\n private readonly _onReviewComplete = (isSuccess: boolean): void => {\n if (isSuccess) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n };\n\n private readonly _reportReviewModal = () => {\n return ReportReviewModal({\n resources: { ...this.props.resources },\n context: this.props.context,\n isOpen: this.state.isReportModalOpen,\n returnRef: this._userReportModalToggle,\n reportedKey: this.state.reportedKey,\n onModalToggle: this._onReportModalClose,\n onRadioChange: this._onRadioChange,\n reportReview: this._reportReview,\n hasError: this.state.hasReportError,\n telemetryContent: this.telemetryContent\n });\n };\n\n private readonly _onReportModalOpen = (reviewId: string) => {\n this.setState({ isReportModalOpen: true, reportingReviewId: reviewId, reported: false, reportedKey: ReviewConcernCategory.SpamAdvertising });\n };\n\n private readonly _onReportModalClose = () => {\n this.setState({ isReportModalOpen: false, hasReportError: false });\n };\n\n private readonly _onRadioChange = (event: React.ChangeEvent) => {\n this.setState({ reportedKey: event.currentTarget.getAttribute('data-key') || '' });\n };\n\n private readonly _reportReviewCallback = (reviewId: string, reportedKey: string) => {\n reportReviewConcern(\n new ReportReviewConcernInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n reportedKey,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n ).then((_value: boolean) => {\n const reportedReview = this.state.reportedReviews;\n reportedReview.push(reviewId);\n this.setState({ reported: true, reportedReviews: reportedReview, hasReportError: false });\n }).catch((error: boolean) => {\n this.setState({ hasReportError: true });\n });\n };\n\n private readonly _reportReview = () => {\n this._reportReviewCallback(this.state.reportingReviewId, this.state.reportedKey);\n };\n\n private readonly updateSortByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, notification.selectedOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n };\n\n private readonly updateFilterByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, this.state.selectedSortByOption, notification.selectedOption, 1, true);\n };\n\n private readonly updateReviews = async (\n skipItems: number | 0,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ) => {\n const productId = getSelectedProductIdFromActionInput(this.props.context.actionContext);\n if (productId === undefined) {\n return;\n }\n const result = await getReviewsForGivenProduct(\n\n // Task #211227597 Remove this hardcoded values.\n new GetProductReviewsInput(\n productId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n getRnrEndpointId(this.props.context.actionContext),\n selectedSortByOption.key,\n selectedFilterByOption.key,\n skipItems < 0 ? 0 : skipItems,\n this.props.config.reviewsShownOnEachPage\n ),\n this.props.context.actionContext\n );\n if (result && result.items && result.pagingInfo && result.pagingInfo.totalItems !== undefined) {\n this.setState({\n currentPage,\n listOfReviews: result.items,\n selectedSortByOption,\n selectedFilterByOption,\n reviewsCount: result.pagingInfo.totalItems,\n isFilterApplied\n });\n }\n };\n\n private readonly _updateVoteUi = (reviewId: string, isHelpful: boolean): void => {\n let alreadyExists = false;\n let list = this.state.votedReviews.map((review) => {\n if (review.reviewId === reviewId) {\n review.approved = isHelpful;\n alreadyExists = true;\n }\n return review;\n });\n\n if (!alreadyExists) {\n list = list.concat({ reviewId, approved: isHelpful });\n }\n\n this.setState({ votedReviews: list });\n };\n\n private readonly updateReviewHelpfulnessVote = (reviewId: string, isHelpful: boolean): void => {\n submitHelpfulnessVote(\n new SubmitHelpfulnessVoteInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n isHelpful,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n ).then(() => {\n this._updateVoteUi(reviewId, isHelpful);\n }).catch((error: Error) => {\n throw new Error('[submitHelpfulnessVote]Error executing action');\n });\n };\n\n private readonly getUserToken = (context: Msdyn365.IRequestContext): string => {\n return context && context.user && context.user.token;\n };\n\n private readonly reviewsListCallbacks: IReviewsListCallbacks = {\n updateReviewTitle: (title: string): void => {\n this.setState({ userReviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ userReviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ userReviewRating: rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview,\n toggleModal: this._toggleReviewModal,\n updateReviewHelpfulnessVote: this.updateReviewHelpfulnessVote,\n toggleReportModal: (reviewId: string): void => {\n this.state.isReportModalOpen ? this._onReportModalOpen(reviewId) : this._onReportModalClose();\n },\n reportReview: this._reportReviewCallback,\n updateFilterByDropdown: this.updateFilterByDropdown,\n updateSortByDropdown: this.updateSortByDropdown,\n updateReviews: this.updateReviews\n };\n}\n\nexport default ReviewsList;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy, IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport { format, ProductPrice, ProductRefinerValue, SortColumn,\n TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, DimensionAvailabilitiesForProductSearchResultInput, DimensionTypes,\n getDimensionAvailabilitiesForProductSearchResultAction, getPriceForProductSearchResult,\n IDimensionsApp, PriceForProductSearchResultInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps,\n INodeProps, isMobile, ITelemetryContent, LabeledDropdown, UncontrolledPagination, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { buildListPageUrl, getCollectionProducts, getCollectionRefinersAction, getCurrentUrl,\n GetFullProductsByCollectionInput, IFullProductsSearchResultsWithCount,\n parseQueryParam, ProductListInventoryFilteringOptions, RefinersByCollectionInput, sortOptions } from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,\n Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\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 refiners: IProductRefinerHierarchy[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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 readonly 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 { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject;\n\n private readonly _sortAndFilterContainerRef: React.RefObject;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n private isListPageStateUpdated: boolean = false;\n\n public constructor(props: ISearchResultContainerProps, state: ISearchResultContainerState) {\n super(props);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\n this._viewport = 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 refiners: []\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!, this.props.friendlyName, this.props.telemetry);\n this._updateViewport();\n }\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation?.Text;\n }\n\n public async componentDidMount(): Promise {\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n const listPageState = await this.props.data.listPageState;\n const products = await this.props.data.products;\n\n this._updateListPageState(listPageState, products);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [\n listPageState.activeFilters?.length, listPageState.currentPageNumber,\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\n ];\n },\n async () => {\n const newListPageState = await this.props.data.listPageState;\n const input = new GetFullProductsByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging:\n {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max((newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0)), 0)\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query?.q ? this.props.context.request.query.q : JSON.stringify({ ProductId: this.props.context.request.query?.productId, Recommendation: this.props.context.request.query?.recommendation }),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\n !!(this.props?.config?.includeAttributes),\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId\n );\n\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\n newListPageState.totalProductCount = productResults.count;\n newListPageState.activeProducts = productResults.products;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max((newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber)),\n this.defaultPageNumber)\n },\n count: true, Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n this.props.context.request.query?.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId\n );\n\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\n this.setState({ refiners });\n }\n }\n );\n\n if (this.props.config.enableAffiliationBasedPricing &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n const context = this.props.context as ICoreContext;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) && !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) && !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes) {\n await this._getProductsDimensionsAvailabilities();\n }\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 {\n config: {\n imageSettings,\n className\n },\n resources,\n data: {\n listPageState,\n products: productCollection,\n featureProduct\n }\n } = this.props;\n\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\n this._updateListPageState(listPageState.result, productCollection.result);\n this.isListPageStateUpdated = true;\n }\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\n let errorText = '';\n if (!ArrayExtensions.hasElements(products)) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n\n }\n const productsComponent = this._getProducts();\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?.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?.totalProductCount !== 0 ? (\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: searchProduct ? featureComponent : null,\n productPrices: this.productPrices\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (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 &&\n (+this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber))) || 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\n const productsList = (this.props.data.listPageState.result?.activeProducts) ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(productsList, this.props.context as ICoreContext),\n this.props.context.actionContext);\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise => {\n const productsList = (this.props.data.listPageState.result?.activeProducts) ?? [];\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext);\n\n const listPageState = await this.props.data.listPageState;\n listPageState.activeProducts = products;\n };\n\n private readonly _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 readonly _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 pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\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 ${pageName}` },\n title: {\n titlePrefix,\n titleText,\n titleCount\n }\n };\n\n };\n\n private readonly _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 readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter((dropdownOption) => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\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={dropdownOptions}\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 readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = listPageState?.currentPageNumber ? (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) : ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\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={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />);\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners = this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners) ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n }) : data.refiners.result && data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\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)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\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 /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId ||\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId)\n );\n };\n\n private readonly _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 closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n\n // @ts-expect-error: 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 context={this.props.context}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n />\n );\n\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature');\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: {\n request: requestContext,\n actionContext\n }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\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 return;\n }\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined,\n [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 readonly _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) => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(\n mappedSearchConfig => searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(mappedSearchConfig => mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: {\n request: requestContext,\n actionContext\n }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, 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 readonly _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 }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n\n };\n\n private readonly _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 readonly _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 if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\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 readonly _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 * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>\n {paginationPreviousText}\n </span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>\n {paginationNextText}\n </span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\n );\n };\n\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderSummaryProps {\n subTotalLabel: string;\n shippingLabel: string;\n taxLabel: string;\n orderTotalLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n totalDiscountsLabel: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n id: string;\n typeName: string;\n otherChargeLabel?: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isTaxIncludedInPrice?: boolean;\n isShowTaxBreakup?: boolean;\n}\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'>\n {label}\n </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'>\n {toBeCalculatedText}\n </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,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, retailMultiplePickUpOptionEnabled?: boolean,\n isTaxIncludedInPrice?: boolean, isShowTaxBreakup?: 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 const taxOnShippingCharge = cart.TaxOnShippingCharge !== undefined ? cart.TaxOnShippingCharge : 0;\n const shippingChargeAmount = cart.ShippingChargeAmount !== undefined ? cart.ShippingChargeAmount : 0;\n\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True shippingChargeAmount\n // True True shippingChargeAmount\n // True false shippingChargeAmount + taxOnShippingCharge\n const freightFee = isTaxIncludedInPrice && !isShowTaxBreakup ? shippingChargeAmount + taxOnShippingCharge : cart.ShippingChargeAmount;\n\n const canShip = deliveryModes.some(deliveryMode => (!((deliveryMode !== '' && (deliveryMode === getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) || deliveryMode === emailDeliveryModeCode)))));\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) && deliveryMode !== emailDeliveryModeCode);\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (deliveryMode?: string, featureSate: boolean = false, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, pickupDeliveryMode?: string) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n\n};\n\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const { SubtotalAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n SubtotalAmountWithoutTax,\n TaxAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n TaxOnNonShippingCharges,\n DiscountAmountWithoutTax = 0,\n TotalAmount,\n OtherChargeAmount } = props.cart;\n\n const { canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } = getDeliveryConfiguration(props.cart, props.channelConfiguration, props.channelDeliveryOptionConfig,\n props.retailMultiplePickUpOptionEnabled, props.isTaxIncludedInPrice, props.isShowTaxBreakup);\n\n const otherChargeAmount = OtherChargeAmount !== undefined ? OtherChargeAmount : 0;\n const otherShippingChargeAmount = TaxOnNonShippingCharges !== undefined ? TaxOnNonShippingCharges : 0;\n const isTaxGreaterThanZero = TaxAmount !== undefined && TaxAmount > 0;\n\n const otherChargeAmountTotal = props.isTaxIncludedInPrice && props.isShowTaxBreakup ? otherChargeAmount : otherChargeAmount + otherShippingChargeAmount;\n\n const subtotalAmountActual = props.isTaxIncludedInPrice && props.isShowTaxBreakup ? SubtotalAmountWithoutTax : SubtotalAmount;\n\n const reactNodes: IOrderSummaryLines = {\n subtotal: _buildOrderSummarySection(props, subtotalAmountActual, 'sub-total', props.subTotalLabel),\n tax: props.isShowTaxBreakup ? _buildOrderSummarySection(props, hasDeliveryMethod || isTaxGreaterThanZero ? TaxAmount : undefined, 'tax-amount', props.taxLabel) : '',\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge: OtherChargeAmount && _buildOrderSummarySection(props, otherChargeAmountTotal, 'other-charges', props.otherChargeLabel) || undefined\n };\n\n if (canShip) {\n reactNodes.shipping = _buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection({ ...props, freeText: undefined }, totalAmountAfterGiftCard, 'total', props.orderTotalLabel);\n }\n\n if (DiscountAmountWithoutTax > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmountWithoutTax, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport * from './review-modal';\nexport * from './rnrInterface';\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport checkoutStateDataAction from './checkout-state-data-action';\n\nexport * from './checkout-state';\nexport * from './checkout-state-data-action';\nexport * from './module-state-manager';\n\nexport { checkoutStateDataAction };\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\n return (\n <span className='ms-search-result-container__no-results-message'>\n <h5 className='error-text'>\n {' '}\n {text}\n {' '}\n </h5>\n </span>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getCatalogId, IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\n\nexport async function getValidProductImages(\n productId: number, channelId: number,\n actionContext: IActionContext, imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct): Promise<IImageData[]> {\n\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(\n productId,\n channelId,\n selectedProduct,\n catalogId\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\n// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unused-vars-experimental -- .\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings?: IImageSettings): Promise<[IImageData, boolean]> {\n const imageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>((resolve) => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getValidProductImages, validateProductImages } from './utils';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IImageData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps<IMediaGalleryData> {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems<ItemType> {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component<IMediaGalleryProps<IMediaGalleryData>, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map<number, HTMLDivElement> = new Map();\n\n private mediaGalleryImages: IImageData[] = [];\n\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps<IMediaGalleryData>) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = { activeIndex: 0, animating: false, isImageZoomed: false, modalIsOpen: false,\n isInitialLoad: true, shouldUseOptimizedImage: !!this.props.config.skipImageValidation };\n\n this._zoomedImageSettings = props.config.zoomedImageSettings ??\n props.config.galleryImageSettings ??\n this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise<void> {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n this._setImages(images);\n } else {\n this._setImages([]);\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || ObjectExtensions.isNullOrUndefined(product.productVariant?.RecordId)) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant!.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n if (product) {\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n this._setImages(images);\n } else {\n this._setImages([]);\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._setImages(images);\n }\n\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps<IMediaGalleryData>,\n nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const {\n id,\n config,\n resources\n } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : (config.imageZoom === imageZoom.container ? imageZoom.container : '');\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(this.props.data.product.result.ItemId, this.props.context.request.apiSettings);\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: mediaLocation.AltText ?? ''\n };\n });\n const curatedImages = this.props.config.images ?? [];\n // eslint-disable-next-line inclusive-language/use-inclusive-words -- Following the product naming convention.\n this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps<IMediaGalleryData>),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps<ICarouselProps>,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n\n };\n\n private readonly goToIndex = (index: number): void => {\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems<IMediaGalleryThumbnailItemViewProps> {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return { items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n ...mediaGalleryItems!.map((item: IImageData, index: number) => this._getThumbnailItem(\n item, thumbnailImageSettings ?? this.defaultThumbnailImageSettings, index, this.state.activeIndex))\n ],\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems<React.ReactNode> {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n ...mediaGalleryItems!.map((item: IImageData, index: number) => this._renderCarouselItemImageView(\n zoomView, item, galleryImageSettings ?? this.defaultGalleryImageSettings, index))\n ],\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _setImages(images?: IImageData[]): void {\n const curatedImage = this.props.config.images ?? [];\n // eslint-disable-next-line inclusive-language/use-inclusive-words -- Following the product naming convention.\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n\n let imagesToSet = images ?? [];\n if (shouldHidePrimaryImages) {\n // Currently returned image response is having duplicate image\n // along with non-selected variant and previous selection is not getting cleared. With the help of index we\n // select item from 0 index till it is having non repeating image source name ending with index number.\n // Here we are keeping '.' to make sure that we are considering any digit just before '.' in image source path\n imagesToSet = imagesToSet.filter((item, index) => {\n let incrementedIndex = index;\n const imageIndex = `${++incrementedIndex}.`;\n return item.src?.includes(imageIndex);\n });\n }\n this.setState({\n mediaGalleryItems: [...imagesToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string, image: IImageData, imageSettings: IImageSettings, index: number,\n isInPopup: boolean = false): React.ReactNode {\n\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(image, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(image, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(image, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n }\n\n // No default\n }\n return (<>\n {this._getCarouselItem(image, imageSettings, index, isInPopup)}\n </>);\n\n }\n\n // eslint-disable-next-line inclusive-language/use-inclusive-words, woke/all -- Following the product naming convention.\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n // eslint-disable-next-line inclusive-language/use-inclusive-words -- Following the product naming convention.\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n // eslint-disable-next-line inclusive-language/use-inclusive-words -- Following the product naming convention.\n const isVariantProduct = !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n // Currently returned image response is having duplicate image\n // along with non-selected variant and previous selection is not getting cleared. With the help of index we\n // select item from 0 index till it is having non repeating image source name ending with index number.\n // Here we are keeping '.' to make sure that we are considering any digit just before '.' in image source path\n variantImages = variantImages.filter((item) => {\n const imagePattern = `${itemId}_000`;\n return !item.src?.includes(imagePattern);\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number, isInPopup: boolean = false): React.ReactNode => (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n id={`${this.props.id}__carousel-item__${index}`}\n shouldSkipToMainImage={isInPopup}\n bypassHideOnFailure={index === 0}\n\n />\n );\n\n private readonly _getThumbnailItem = (image: IImageData, imageSettings: IImageSettings, index: number,\n 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 onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n bypassHideOnFailure={index === 0}\n />\n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent<HTMLLIElement>) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n <div\n className={`ms-inline-zoom ${this.state.isImageZoomed ? 'zoomed' : ''}`}\n ref={this._refHandler(index)}\n data-scale={this.props.config.dataScale ?? defaultDataScale}>\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n onClick={this._onInlineImageClick}\n onMouseOver={this.state.isImageZoomed && this._inlineZoomImageOnHover || undefined}\n id={`${this.props.id}__carousel-item__${index}`}\n shouldSkipToMainImage\n imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n bypassHideOnFailure={index === 0}\n />\n <Image\n role='presentation'\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-inline-zoom__zoomedImg'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n onClick={this._onImageMouseOut}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n id={`${this.props.id}__zoom__${index}`}\n onMouseMove={this.state.isImageZoomed && inlineZoomImageOnMouseMove || undefined}\n shouldSkipToMainImage\n imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n bypassHideOnFailure={index === 0}\n />\n </div>\n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent<HTMLImageElement>): void {\n inlineZoomImageOnHover(\n event,\n this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent<HTMLImageElement>) {\n // eslint-disable-next-line xss/no-mixed-html -- Fetch image element from div click.\n const target = this.state.shouldUseOptimizedImage ? event.target as HTMLImageElement : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent<HTMLImageElement, MouseEvent>): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent<HTMLImageElement>): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n <div className='ms-containerZoom__container'>\n <div\n data-scale={this.props.config.dataScale ?? defaultDataScale}\n className='ms-containerZoom__zoom-lens' role='presentation' onMouseOut={this._onMouseOutLensContainer}\n onClick={this._onMouseOutLensContainer} onMouseMove={this.state.isImageZoomed && onMouseMoveLensContainer || undefined} />\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n onClick={this._onContainerZoomImageClick}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n onMouseOver={this.state.isImageZoomed && onMouseOverImageContainer || undefined}\n id={`${this.props.id}__carousel-item__${index}`}\n shouldSkipToMainImage\n imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n bypassHideOnFailure={index === 0}\n />\n </div>\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n <div className='ms-fullscreen-section'>\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n bypassHideOnFailure={index === 0}\n />\n <div className='ms-fullscreen-section__overlay'>\n {/* eslint-disable-next-line jsx-a11y/anchor-has-content, jsx-a11y/anchor-is-valid -- Anchor is valid and doesnt need any content. */}\n <a\n // eslint-disable-next-line react/jsx-no-script-url, no-script-url -- existing code.\n href='javascript:void(0);'\n title={this.props.resources.fullScreenTitleText}\n role='button'\n onClick={this.openModalDialog} className='ms-fullscreen-section__magnifying-glass-icon'\n />\n </div>\n\n </div>\n );\n }\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n <div className='ms-media-gallery__item'>\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item__image'\n src='empty'\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings ?? this.defaultGalleryImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n }\n\n private _getEmptyThumbnailItem(imageSettings: IImageSettings | undefined, 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 return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail-item__image'\n src='empty'\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings ?? this.defaultThumbnailImageSettings}\n loadFailureBehavior='empty'\n />\n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(\n ZoomView, item, this._zoomedImageSettings, index, true)),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps<ICarouselProps>;\n\n const carousel = <Carousel {...carouselprops} />;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n}\n\nexport default MediaGallery;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { CartLine, ChannelDeliveryOptionConfiguration, DeliveryOption, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n retailMulitplePickupFeatureState?: boolean;\n locationChangedHandler(): void;\n}\n\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = async (orgUnitLocation: OrgUnitLocation, cartState: ICartState | undefined, cartline: CartLine, deliveryMode?: string) => {\n if (!cartState) {\n return Promise.resolve();\n }\n return cartState.updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if (isBopisSelected) {\n if (!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager.openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {});\n } else {\n if (!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState.clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n }\n };\n\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n\n };\n\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText: string,\n orgUnitLocations: OrgUnitLocation[] | undefined): JSX.Element => {\n\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = !!cartLine.FulfillmentStoreId;\n\n const toggleBOPIS = (isBopisSelected: boolean) => {\n return () => {\n _toggleBOPIS(isBopisSelected);\n };\n };\n\n return (\n <>\n <label className='msc-cart-line__bopis-shipping'>\n <input\n id={`ms-cart-bopis-ship-option-${cartLine.LineId}`}\n type='radio'\n name={`shippingType ${cartLine.LineId}`}\n onChange={toggleBOPIS(false)}\n value={shipItText}\n checked={!bopisSelected}\n aria-checked={!bopisSelected}\n key={`${cartLine.LineId}-shipit`}\n />\n {shipItText}\n </label>\n <label className='msc-cart-line__bopis-store-pickup'>\n <input\n id={`ms-cart-bopis-pickup-option-${cartLine.LineId}`}\n type='radio'\n name={`shippingType ${cartLine.LineId}`}\n onChange={toggleBOPIS(true)}\n value={pickupInStoretext}\n checked={bopisSelected}\n aria-checked={bopisSelected}\n key={`${cartLine.LineId}-pickup`}\n />\n {pickupInStoretext}\n </label>\n {\n cartLine.FulfillmentStoreId ? (\n <div className='msc-cart-line__bopis__fullfilment'>\n <span className='msc-cart-line__bopis__fullfilment-store'>\n {orgUnitName}\n </span>\n <button className='msc-cart-line__bopis-changestore btn' onClick={toggleBOPIS(true)}>\n {changeStoreText}\n </button>\n </div>\n ) : null\n }\n </>\n );\n };\n\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n /**\n * Method to check if we have atleast one common delivery code between product and channel.\n * @param productdeliveryOptions - Product DeliveryOption List.\n * @param storePickUpOptionList - Channel DeliveryOption List.\n * @returns Boolean flag.\n */\n const matchDeliveryOptions = (productdeliveryOptions: DeliveryOption[] | undefined, storePickUpOptionList: string[] | undefined): boolean => {\n const deliveryOption: string[] = [];\n productdeliveryOptions?.map(delivery => {\n const pickup = (storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code));\n if (pickup) {\n deliveryOption.push(pickup);\n }\n return deliveryOption;\n });\n\n return ArrayExtensions.hasElements(deliveryOption);\n };\n \n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions ||\n !props.deliveryOptions.DeliveryOptions) {\n return undefined;\n }\n\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\n return undefined;\n }\n } else if (!props.pickupDeliveryModeCode || !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(props.cartline, props.shipitText, props.pickUpInStoreText, props.changeStoreText, props.orgUnitLocations),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\n }\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport {\n AddToOrderTemplateComponent, AddToWishlistComponent, CartLineItemComponent,\n IAddToOrderTemplateDialogResources, ICartlineResourceString, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources, IWishlistActionSuccessResult } from '@msdyn365-commerce/components';\nimport MsDyn365, { IAny, ICoreContext, IGeneric, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n ChannelDeliveryOptionConfiguration,\n CommerceList,\n Customer,\n LineDataValidationFailure,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n ArrayExtensions,\n getInvoiceDetailsPageUrlSync,\n getProductUrlSync,\n IProductInventoryInformation,\n ObjectExtensions,\n OrderTemplate\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: LineDataValidationFailure[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n retailMulitplePickupFeatureState?: boolean;\n\n /* GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n\n /* ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext<IGeneric<IAny>>;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateButtonTooltip: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n shouldIgnoreWarehouse: boolean | undefined;\n productAvailability?: AsyncResult<IProductInventoryInformation[]>;\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n cartlineId?: string;\n hasError?: boolean;\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (isStockCheckEnabled: boolean, productAvailability: IProductInventoryInformation | undefined): number => {\n if (!isStockCheckEnabled ||\n !productAvailability ||\n !productAvailability.ProductAvailableQuantity ||\n !productAvailability.IsProductAvailable ||\n !productAvailability.ProductAvailableQuantity.AvailableQuantity) {\n return 0;\n }\n\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled ? (maxByQuantityLimitsFeatureResult < availableQuantityInStock ? maxByQuantityLimitsFeatureResult : availableQuantityInStock) : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n\n};\n\nconst _getErrorMessage = (availableQuantityInStock: number, currentQuantity: number,\n props: ICartLineItemsProps, lineIndex: number, shouldSkipStockCheck: boolean, cartLine: CartLine): string | undefined => {\n const finalErrorMessages: string[] = [];\n\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\n if (isLoadingDeliveryOptions) {\n return undefined;\n }\n\n let foundProductAvailability;\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\n if (props.shouldIgnoreWarehouse) {\n return productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId;\n }\n return productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId &&\n productAvailability.InventLocationId === cartLine.WarehouseId;\n });\n if (foundProductAvailability === undefined) {\n return undefined;\n }\n }\n\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\n if (availableQuantityInStock <= 0) {\n finalErrorMessages.push(props.outOfStockText);\n } else if (availableQuantityInStock < currentQuantity) {\n if (availableQuantityInStock === 1) {\n finalErrorMessages.push(props.outOfRangeOneText);\n } else {\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\n }\n }\n }\n\n // Server-side validation\n props.cartlinesErrors\n .filter(i => i.LineIndex === lineIndex)\n .forEach(i => {\n if (i.DataValidationFailure?.ErrorContext) {\n finalErrorMessages.push(i.DataValidationFailure.ErrorContext);\n }\n });\n\n if (finalErrorMessages.length > 0) {\n return finalErrorMessages.join(' ');\n }\n\n return undefined;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\n\n// eslint-disable-next-line complexity -- Auto-suppressed.\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n productPickUpOptions?: ProductDeliveryOptions): ICartlinesViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText,\n removeItemClickHandler, moveToWishlistSuccessHandler, addToOrderTemplateButtonText, addToOrderTemplateButtonTooltip,\n addToOrderTemplateDialogResources, createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources, duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText, removeFromWishlistButtonText, orderTemplates, customerInformation,\n wishlists, defaultWishlistName, storeSelectorModuleId } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\n\n const maxQuantity = product && _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0);\n\n // Skip stock check if the cart line is a service item or an invoice line\n const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\n\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity) ? undefined : _getErrorMessage(availableQuantityInStock, cartline.Quantity!, props, index, shouldSkipStockCheck, cartline);\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}` : undefined;\n const productDimension = 4;\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\n const isCustomPriceSelected = product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value === 'Custom';\n\n let productUrl: string | undefined;\n if (product) {\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n\n if (MsDyn365.isBrowser) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n } else {\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\n }\n\n return {\n data: {\n product,\n cartline\n },\n cartlineId: cartline.LineId,\n error: errorMessage,\n hasError: (!shouldSkipStockCheck && props.isStockCheckEnabled) ? cartline.Quantity! > (maxQuantity ?? 0) : false,\n cartline: (\n <CartLineItemComponent\n data={{\n cartLine: cartline,\n cartState: props.cartState,\n product,\n catalogs: props.catalogs\n }}\n currentQuantity={cartline.Quantity}\n maxQuantity={maxQuantity}\n isOutOfStock={(!shouldSkipStockCheck && props.isStockCheckEnabled) ? (availableQuantityInStock <= 0) : false}\n gridSettings={gridSettings}\n imageSettings={imageSettings}\n id={id}\n typeName={typeName}\n productUrl={productUrl}\n context={context}\n resources={resources}\n key={`${index}-${productUrl}`}\n lineIndex={index}\n isQuantityEditable={!ObjectExtensions.isNullOrUndefined(product)}\n quantityOnChange={props.updateCartLinesQuantitySuccessHandler}\n primaryImageUrl={product?.PrimaryImageUrl}\n errorMessage={errorMessage}\n inventoryInformationLabel={inventoryLbl}\n inventoryLabelClassName={inventoryCode}\n isCartStateReady={props.cartState?.status === 'READY'}\n showShippingChargesForLineItems={props.showShippingChargesForLineItems}\n telemetryContent={props.telemetryContent}\n channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\n />),\n pickUpInStore: product ? (\n PickUpInStore({\n storeSelectorModuleId,\n cartState: props.cartState,\n cartline,\n product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: productPickUpOptions,\n pickupDeliveryModeCode: cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\n locationChangedHandler: props.locationChangedHandler\n })\n ) : undefined,\n remove: (\n <Button\n className='msc-cart-line__remove-item'\n onClick={onRemoveClickHandler}\n title={removeButtonText}\n {...attributes}\n >\n {removeButtonText}\n </Button>\n ),\n addToWishlist: (\n isAuthenticated && product && !isCustomPriceSelected ? (\n <AddToWishlistComponent\n className='msc-cart-line__add-to-wishlist'\n addToWishlistButtonText={addToWishlistButtonText}\n removeFromWishlistButtonText={removeFromWishlistButtonText}\n context={context}\n id={id}\n key={cartline.LineId}\n typeName={typeName}\n nameOfWishlist={nameOfWishlist}\n cartline={cartline}\n showButtonText\n showStatusMessage={false}\n showRemoveButton={false}\n showButtonTooltip={false}\n ariaRole='button'\n data={{\n wishlists,\n product\n }}\n onSuccess={moveToWishlistSuccessHandler}\n />\n ) : undefined\n ),\n addToOrderTemplate: (\n isAuthenticated && orderTemplates && product ? (\n <AddToOrderTemplateComponent\n className={classnames('msc-cart-line__add-to-order-template', isCustomPriceSelected ? 'disabled' : '')}\n addToOrderTemplateButtonText={addToOrderTemplateButtonText}\n addToOrderTemplateButtonTooltip={addToOrderTemplateButtonTooltip}\n addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\n createOrderTemplateDialogResources={createOrderTemplateDialogResources}\n itemAddedToOrderTemplateDialogResources={itemAddedToOrderTemplateDialogResources}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={duplicateItemsWhenAddingToOrderTemplateDialogResources}\n data={{ product, quantity: cartline.Quantity || 1, orderTemplates, customerInformation }}\n context={context}\n showButtonText\n shouldShowButtonFailedTooltip={isCustomPriceSelected}\n disableButton={isCustomPriceSelected}\n id={id}\n typeName={typeName}\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value\n showButtonTooltip={!props.context.app.config.disableTooltip || false}\n />\n ) : undefined\n )\n };\n};\n\nexport const assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps): ICartlinesViewProps[] | null => {\n const reactNodes: ICartlinesViewProps[] = [];\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\n if (props.shouldIgnoreWarehouse) {\n return productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId;\n }\n return productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase();\n });\n }\n\n let productPickUpOptions;\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\n productPickUpOptions = props.productPickUpOptions.find((deliveryOption) => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n * @param props\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return (\n assembleCartlines(cartlines, products, props)\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\n\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './cart-line-items';\n\nconst _assembleGroupCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => (item.DeliveryMode));\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-expect-error\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n\n });\n\n return reactNodes;\n};\n\n/**\n * CartLine Group component.\n * @param props\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return (\n _assembleGroupCartlines(cartlines, products, props)\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data.\n * @param ctx\n */\nexport async function getPromotionData(ctx: IActionContext): Promise<IPromotionData> {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(\n new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings),\n ctx\n ).then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport {\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources, ILinesAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult, PromoCodeComponent, SaveCartToOrderTemplateComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport {\n ActiveCartProductsInput,\n ArrayExtensions,\n getActiveCartProductsAction,\n ICartLineInventoryValidationResult,\n ObjectExtensions,\n validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, INodeProps, IPayLoad,\n ITelemetryContent, TelemetryConstant, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\n/**\n * Cart view props interface.\n */\nexport interface ICartViewProps extends ICartProps<ICartData> {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?: ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n expressCheckoutButton?: React.ReactNode[];\n ExpressCheckoutSectionWrapper: INodeProps;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n multiplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\n/**\n * Order summary errors interface.\n */\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\n/**\n * Cart component state interface.\n */\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: LineDataValidationFailure[];\n promotionData: IPromotionData;\n isCartValid: boolean;\n}\n\n/**\n * Cart component.\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass Cart extends React.Component<ICartProps<ICartData>> {\n\n public state: ICartComponentState;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n private isQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isMounted: boolean = false;\n\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n public constructor(props: ICartProps<ICartData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n this.state = {\n cartlinesErrors: [],\n showPromotionDialog: false,\n promotionData: {},\n isCartValid: true\n };\n }\n\n /**\n * Component did mount function.\n */\n public async componentDidMount(): Promise<void> {\n this._isMounted = true;\n const {\n config,\n context: {\n actionContext\n }\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\n if (this.isQuantityLimitsFeatureEnabled) {\n await this.validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n }\n );\n }\n }\n\n /**\n * Component will unmount function.\n */\n public componentWillUnmount(): void {\n this._isMounted = false;\n }\n\n /**\n * Should component update function.\n * @param nextProps - Next props.\n * @param nextState - Next state.\n * @returns True if component should update, false otherwise.\n */\n public shouldComponentUpdate(nextProps: ICartProps<ICartData>,\n nextState: ICartComponentState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n /* eslint-disable complexity -- Disabling complexity for render method */\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products }\n },\n context: {\n request: {\n user: {\n isAuthenticated,\n signInUrl\n }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const cartLines = this._getCartLines();\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.props.data.productAvailabilites.result ?? [],\n this.props.context.actionContext,\n products ?? [],\n emailDeliveryModeCode);\n\n const hasError = !validInventoryAcrossCartLines?.isValid || !validInventoryAcrossCartLines && !this.state.isCartValid || (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature');\n const multiplePickUpEnabled = !cart?.hasInvoiceLine && RetailMultiplePickupFeatureState?.IsEnabled;\n const cartLinesGroup = multiplePickUpEnabled ? this.getCartLinesGroup() : null;\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\n for (const cartLineGroup of cartLinesGroup) {\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\n }\n }\n\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\n }\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title: <h1 className='msc-cart__heading'>\n {resources.cartTitle}\n </h1>,\n cart: this.props.data.cart.result,\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\n cartlines: cartLines,\n cartLinesGroup,\n promoCode: this._getPromoCode(),\n promotionOptions: this._getPromotions(),\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry: this.props.telemetry,\n id: this.props.id,\n multiplePickUpEnabled,\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n cart?.hasInvoiceLine ? <h2 className='msc-invoice-summary__heading'>\n { resources.invoiceSummaryTitle }\n </h2> : <h2 className='msc-order-summary__heading'>\n { resources.orderSummaryTitle}\n </h2>\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\n checkoutAsSignInUserButton: (!isCartEmpty) ? (\n <Button\n disabled={hasError} className='msc-cart__btn-checkout' href={checkoutURL}\n title={resources.checkoutButtonTitle} {...checkoutBySignInAttributes} >\n {resources.checkoutButtonTitle}\n </Button>\n ) : null,\n checkoutAsGuestButton: (!isCartEmpty && !isAuthenticated) ? (\n <Button\n disabled={hasError} className='msc-cart__btn-guestcheckout' href={guestCheckoutUrl}\n title={resources.guestCheckoutButtonTitle} {...checkoutByGuestAttributes}>\n {resources.guestCheckoutButtonTitle}\n </Button>\n ) : null,\n expressCheckoutButton: !isCartEmpty ? (this.props.slots.paymentExpress) : null,\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\n backToShoppingButton: <Button\n className='msc-cart__btn-backtoshopping' {...backtoShoppingAttributes} href={backToShoppingUrl}\n title={resources.backToShoppingButtonTitle}>\n {resources.backToShoppingButtonTitle}\n </Button>,\n createTemplateFromCartButton: (this._displayAddCartToTemplate() && products) ? (\n <SaveCartToOrderTemplateComponent\n addToOrderTemplateDialogResources={this._generateAddToOrderTemplateDialogResources(resources)}\n createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(resources)}\n linesAddedToOrderTemplateDialogResources={this._generateLinesAddedToOrderTemplateDialogResources(resources)}\n createOrderTemplateFromCartButton={resources.createOrderTemplateFromCartButton}\n createOrderTemplateFromCartButtonTooltip={resources.createOrderTemplateFromCartButtonTooltip}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{\n orderTemplates: this.props.data.orderTemplates.result!,\n cartLines: this.props.data.cart.result!.cart.CartLines!,\n customerInformation: this.props.data.customerInformation.result\n }}\n />\n ) : null,\n storeSelector: this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n waitingComponent: <Waiting className='msc-waiting-circular msc-waiting-lg' />,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n /* eslint-enable complexity -- Disabling complexity for render method */\n\n /**\n * Promotion click event handler.\n * @param event - The mouse event.\n */\n private readonly promotionLinkClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n /**\n * Promotion close button click.\n */\n private readonly promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n /**\n * Hide promotion dialog.\n */\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n /**\n * Display add to cart template.\n * @returns True if should display, false otherwise.\n */\n private _displayAddCartToTemplate(): boolean {\n const cart = this.props.data.cart?.result;\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\n return false;\n }\n\n const RetailB2BEcommerceFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailB2BEcommerceFeature');\n if (RetailB2BEcommerceFeatureState?.IsEnabled && this.props.data.customerInformation.result?.IsB2b && this.props.data.orderTemplates.result &&\n ArrayExtensions.hasElements(cart.cart?.CartLines) && this.props.data.customerInformation.result) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get promotions.\n * @returns React node with the promotions.\n */\n private _getPromotions(): React.ReactNode {\n return (\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n /**\n * Add error message in cart line in case the quantity exceeds the current inventory.\n * @param cartLines - The cart lines.\n * @param cartLineInventoryValidationResult - The cart line inventory result.\n */\n private _updateCartLineErrorForInvalidInventory(\n cartLines: ICartlinesViewProps[] | null, cartLineInventoryValidationResult: ICartLineInventoryValidationResult) {\n const { resources } = this.props;\n\n if (ArrayExtensions.hasElements(cartLines) &&\n !cartLineInventoryValidationResult.isValid &&\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)) {\n\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\n const cartLine = cartLines.find(element => element.data?.cartline.ProductId === productIdWithError);\n if (cartLine) {\n cartLine.error = resources.outOfStockErrorMessage;\n cartLine.hasError = true;\n }\n }\n }\n }\n\n /**\n * Get order summary errors.\n * @param cartLines - The cart lines.\n * @returns Order summary errors.\n */\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors = cartLines && cartLines.map(cartline => {\n\n // Check if the product is service or not by product type\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\n\n if (!isServiceItem && cartline.error) {\n const fullError = (cartline.data && cartline.data.product?.Name) ? `${cartline.data.product.Name}: ${cartline.error}` : cartline.error;\n\n return (\n <div className='msc-alert__line'>\n {fullError}\n </div>\n );\n }\n\n return null;\n }).filter((line): line is JSX.Element => !!line) || [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>\n {this.props.resources.outOfStockErrorMessageHeader}\n </span>\n </div>\n ),\n errors: allErrors\n };\n }\n\n /**\n * Gets invoice summary line items.\n * @returns Invoice summary lines.\n */\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart }\n },\n telemetry,\n resources\n } = this.props;\n\n return cart?.hasInvoiceLine ? (\n InvoiceSummary({\n orderTotalLabel: resources.totalAmountLabel,\n invoiceLabel: resources.invoiceLabel,\n cart: cart.cart,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry,\n id: this.props.id\n })\n ) : undefined;\n }\n\n /**\n * Gets order summary line items.\n * @returns Order summary lines.\n */\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine ? (\n OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry,\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\n isShowTaxBreakup: isShowOrHideTaxEnabled\n })\n ) : undefined;\n }\n\n /**\n * Gets promo code.\n * @returns React node with the promo code.\n */\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return cart && (\n <PromoCodeComponent\n cart={cart}\n promoCodeHeadingText={resources.promoCodeHeadingText}\n promoPlaceholderText={resources.promoPlaceholderText}\n promoCodeApplyButtonText={resources.promoCodeApplyButtonText}\n appliedPromoCodeHeadingText={resources.appliedPromoCodeHeadingText}\n collapseTimeOut={350}\n removePromoAriaLabelFormat={resources.removePromoAriaLabelFormat}\n removePromoText={resources.removePromoText}\n invalidPromoCodeErrorText={resources.invalidPromoCodeErrorText}\n failedToAddPromoCodeErrorText={resources.failedToAddPromoCodeErrorText}\n failedToRemovePromoCodeErrorText={resources.failedToRemovePromoCodeErrorText}\n duplicatePromoCodeErrorText={resources.duplicatePromotionErrorText}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n telemetryContent={this.telemetryContent}\n />\n );\n }\n\n /**\n * Generate add to order template dialog resources.\n * @param resources - The resources.\n * @returns IAddToOrderTemplateDialogResources.\n */\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n /**\n * Generate item added to order template dialog resources.\n * @param resources - The resources.\n * @returns IItemAddedToOrderTemplateDialogResources.\n */\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n /**\n * Generate lines added to order template dialog resources.\n * @param resources - The resources.\n * @returns ILinesAddedToOrderTemplateDialogResources.\n */\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\n };\n }\n\n /**\n * Generate duplicate items when adding to order template dialog resources.\n * @param resources - The resources.\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\n */\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n /**\n * Generate order template name dialog resources.\n * @param resources - The resources.\n * @returns IOrderTemplateNameDialogResources.\n */\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n /**\n * Gets the cart lines view props.\n * @returns ICartlinesViewProps [].\n */\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature');\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n return ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n CartLineItems({\n cartlines: cart!.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n productAvailability: this.props.data.productAvailabilites\n })\n ) : null;\n }\n\n /**\n * Gets the checkout URL.\n * @param isAuthenticated - Is authenticated flag.\n * @param guestCheckoutUrl - Guest checkout URL.\n * @param signInUrl -The sign in URL.\n * @returns The checkout URL.\n */\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Gets the image settings.\n * @param imageSettings - Image settings.\n * @returns IImageSettings.\n */\n private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n };\n\n /**\n * Remove item from cart handler.\n * @param cartlineToRemove - The cart line to remove.\n */\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input)\n .then(() => {\n this.validateCart()\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n /**\n * Move to wish list handler.\n * @param result - The wish list action success result.\n * @param cartline - The cart line.\n */\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this.removeItemFromCartHandler(cartline);\n }\n };\n\n /**\n * Updates the cart line quantity.\n * @param cartlineToUpdate - The cart line.\n * @param quantity - The quantity.\n * @param lineIndex - The line index.\n * @returns True if the cart line was updated, false otherwise.\n */\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\n cartLineQuantityUpdatedAsync(\n this.isQuantityLimitsFeatureEnabled,\n this.props.data.cart.result,\n this.props.telemetry,\n this.props.data.products.result,\n cartlineToUpdate,\n quantity)\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\n if (cartActionResult?.status === 'SUCCESS') {\n this.validateCart().catch((error) => {\n this.props.telemetry.warning((error as Error).message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n\n return true;\n }\n\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\n // Show update line error message.\n const lineUpdateFailure: LineDataValidationFailure = {\n LineIndex: ObjectExtensions.isNullOrUndefined(lineIndex) ? 0 : lineIndex,\n DataValidationFailure: {\n ErrorContext:\n ArrayExtensions.hasElements(cartActionResult.validationResults) ? cartActionResult.validationResults[0].ErrorContext : '',\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\n }\n };\n\n this.setState((previousState: Readonly<ICartComponentState>) => {\n const currentErrors: LineDataValidationFailure[] = previousState.cartlinesErrors.filter(error => error.LineIndex !== lineIndex);\n currentErrors.push(lineUpdateFailure);\n return { cartlinesErrors: currentErrors };\n });\n }\n\n return false;\n })\n .catch(() => {\n return false;\n });\n\n return false;\n };\n\n /**\n * Fulfillment store id is updated.\n */\n private readonly fulfillmentStoreIdUpdated = () => {\n if (this.isQuantityLimitsFeatureEnabled) {\n // Refresh products (in props.data) based on latest cart.\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\n .then(async () => this.validateCart())\n .catch((error: Error) => {\n this.props.telemetry.warning(error.message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n };\n\n /**\n * Validates cart.\n * @returns Void promise.\n */\n private async validateCart(): Promise<void> {\n const {\n data: { cart },\n telemetry,\n context\n } = this.props;\n\n const validationResults: LineDataValidationFailure[] | undefined = await validateCartAsync(this.isQuantityLimitsFeatureEnabled,\n cart,\n telemetry,\n context,\n true);\n\n if (validationResults) {\n const isValid = !ArrayExtensions.hasElements(validationResults);\n this.setState({\n cartlinesErrors: validationResults,\n isCartValid: isValid\n });\n } else {\n this.setState({ isCartValid: true });\n }\n\n return AsyncResult.resolve();\n }\n\n /**\n * Get order quantity limit feature flag.\n * @returns True if flag is enabled, false otherwise.\n */\n private async getOrderQuantityLimitsFeatureFlag(): Promise<boolean> {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq = featureStatuses\n .find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n try {\n const customerInfo = await this.props.data.customerInformation;\n return !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n }\n\n /**\n * Gets the cart lines group.\n * @returns ICartlinesViewProps [][].\n */\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature');\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n\n return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 && this.props.data.channelDeliveryOptionConfig?.result ? (\n CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n productAvailability: this.props.data.productAvailabilites,\n productPickUpOptions: this.props.data.cartLinesPickUpOptions?.result\n })\n ) : null;\n }\n}\n\nexport default Cart;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent<HTMLElement>): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n\n const {\n id,\n showPromotionPopup,\n promotions,\n resources: {\n promotionLinkText,\n promotionPopupHeading\n },\n onCloseButtonClick,\n onSeeAllClick\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n <>\n <span className='msi-promotion-icon' />\n <span>\n {' '}\n {props.resources.promotionStringHeading}\n </span>\n </>\n ),\n promotionSeeAllLink: (\n <a\n className='msc-cart__promotion_link' tabIndex={0} role='link'\n onClick={onSeeAllClick}>\n {' '}\n {promotionLinkText}\n {' '}\n </a>),\n promotionDialog: (\n <Modal isOpen={showPromotionPopup} className={`${className}`} toggle={onCloseButtonClick}>\n <ModalHeader className={`${className}__dialog__header`} toggle={onCloseButtonClick}>\n <h5 id={titleId} className='msc-cart__promotion-popup_title'>\n {promotionPopupHeading}\n </h5>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <ul>\n {promotions.map(_promotion => {\n return (\n <li className='msc-cart__promotion-popup_name' key={_promotion.LineId}>\n {_promotion.Promotion?.OfferName}\n {' '}\n </li>\n );\n }\n )}\n </ul>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`} />\n </Modal>\n )\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ISwatchItem, PriceComponent, ProductComponentSwatchComponent, RatingComponent } from '@msdyn365-commerce/components';\nimport {\n IAny, IComponent, IComponentProps, ICoreContext, IGeneric,\n IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport { AttributeSwatch, AttributeValue, ProductDimension, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions, convertDimensionTypeToProductDimensionType, Dictionary, DimensionTypes, generateImageUrl,\n getProductPageUrlSync, IDimensionsApp, StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\n if (!productData || !productData.AttributeValues) {\n return null;\n }\n\n const colorAttribute = productData.AttributeValues.find(attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color);\n if (!colorAttribute) {\n return null;\n }\n\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\n return defaultSwatch ?? null;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productData?.PrimaryImageUrl;\n }\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls) ? generateImageUrl(\n defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings) : productData?.PrimaryImageUrl;\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n <div className='msc-product__unit-of-measure'>\n <span>\n {unitOfMeasure}\n </span>\n </div>\n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n <div className='msc-product__availability'>\n <span>\n {inventoryAvailabilityLabel}\n </span>\n </div>\n );\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(coreContext: ICoreContext, productUrl: string, productData?: ProductSearchResult): string | undefined {\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productUrl;\n }\n\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\n return productUrl;\n }\n\n const queryString = `color=${defaultSwatch.SwatchValue}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCard: React.FC<IProductComponentProps> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback((coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === DimensionTypes.color) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls) ? swatchItem.productImageUrls[0] : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n }, [selectedSwatchItems, context, productPageUrl]);\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes);\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n <div className='msc-product__dimensions'>\n {\n attributeValues.map((item: AttributeValue) => {\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches = item.Swatches?.map<ISwatchItem>(swatchItem => {\n return {\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\n value: swatchItem.SwatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.SwatchColorHexCode,\n imageUrl: swatchItem.SwatchImageUrl,\n productImageUrls: swatchItem.ProductImageUrls,\n isDefault: swatchItem.IsDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled: enableStockCheck && dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? ''))?.isDisabled\n };\n }) ?? [];\n if (dimensionToPreSelectInProductCard !== DimensionTypes.none && ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault) && dimensionType === DimensionTypes.color) {\n swatches[0].isDefault = true;\n }\n return (\n <ProductComponentSwatchComponent\n context={context}\n swatches={swatches}\n onSelectDimension={updatePageAndImageUrl}\n key={item.RecordId}\n />\n );\n })\n }\n </div>\n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\n return {\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n DimensionValue: {\n RecordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(\n product.Name,\n context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating, ratingAriaLabel,\n product.TotalRatings, ratingCountAriaLabel)}\n className='msc-product' {...attribute}>\n <div className='msc-product__image__description'>\n <div className='msc-product__image'>\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl,\n product.PrimaryImageUrl, product.Name, context)}\n </div>\n <div className='msc-product__title_description'>\n <h5 className='msc-product__title__text'>\n {product.Name}\n </h5>\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText, isPriceMinMaxEnabled, priceResources)}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n {renderDescription(product.Description)}\n </div>\n </div>\n </a> : <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(product.Name, context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating, ratingAriaLabel)}\n className='msc-product' {...attribute}>\n <div className='msc-product__image'>\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl, product.PrimaryImageUrl, product.Name, context)}\n </div>\n <div className='msc-product__details'>\n <h5 className='msc-product__title'>\n {product.Name}\n </h5>\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText)}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n </div>\n </a>}\n {renderProductDimensions(product.AttributeValues)}\n {!context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\n </>\n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return (\n `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${reviewCountArialableText ? ` ${reviewCountArialableText}` : ''}`\n );\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return (<p className='msc-product__text'>\n {description}\n </p>);\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, avgRating?: number,\n totalRatings?: number, ariaLabel?: string, ratingCountAriaLabel?: string): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n <RatingComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabelText}\n ratingCountAriaLabel={ratingCountAriaLabelText}\n data={{}}\n />\n );\n}\n\nfunction renderPrice(context: ICoreContext, typeName: string, id: string, basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string, originalPriceText?: string, currentPriceText?: string, isPriceMinMaxEnabled?: boolean, priceResources?: IPriceComponentResources): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n <PriceComponent\n context={context}\n id={id}\n typeName={typeName}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n />\n );\n}\n\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings,\n imageUrl?: string, fallbackImageUrl?: string, altText?: string,\n context?: ICoreContext<IGeneric<IAny>>): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n <Image\n requestContext={context?.actionContext.requestContext} {...img} {...imageProps}\n loadFailureBehavior='empty'\n bypassHideOnFailure />\n );\n}\n\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<IProductComponent>(\n 'Product',\n { component: ProductCard, ...PriceComponentActions }\n);\n\nexport default ProductComponent;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './product-collection';\n\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\n const { heading, ProductCollectionContainer, products, SingleSlideCarouselComponentProps, GridComponentProps, isCarousel } = props;\n if (products) {\n return (\n <Module {...ProductCollectionContainer}>\n {heading}\n {\n isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)\n }\n </Module>\n );\n }\n props.context.telemetry.error('Product collection content is empty, module wont render.');\n return null;\n};\n\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return (\n <Node {...carouselContainer}>\n {items && items.map(_renderProduct)}\n </Node>\n );\n};\n\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return (\n <Node {...gridContainer}>\n {items && items.map(_renderProduct)}\n </Node>\n );\n};\n\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\n const { ProductContainer, productComponent } = product;\n\n return (\n <Node {...ProductContainer}>\n {productComponent}\n </Node>\n );\n};\n\nexport default ProductCollectionView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\n/**\n * SubmitHelpfulnessVote Input Action.\n */\nexport class SubmitHelpfulnessVoteInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public isHelpful: boolean;\n\n public authToken: string;\n\n constructor(\n reviewId: string,\n tenantId: string,\n locale: string,\n isHelpful: boolean,\n authToken: string,\n serviceEndpoint: string\n ) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.isHelpful = isHelpful;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitHelpfulnessVote';\n\n public getCacheObjectType = () => 'SubmitHelpfulnessVote';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISearchResultModalViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from '@msdyn365-commerce-modules/search-result-container';\nimport { Button, getTelemetryObject, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport React, { MouseEventHandler, useEffect, useState } from 'react';\n\nimport { ISearchResultContainerProps, ISearchResultContainerResources } from '../definition-extensions/search-result-container.ext.props.autogenerated';\nimport { ProductComponent } from './components/product.component';\n\n/**\n * DescriptionInterval.\n */\nenum DescriptionInterval {\n productDescriptionInterval = 14,\n productDescriptionIntervalRemainder0 = 0,\n productDescriptionIntervalRemainder9 = 9\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProductCards = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n return (\n <Node {...props.ProductsContainer}>\n {props.errorMessage}\n {props.products}\n </Node>\n );\n\n};\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @param product - The product item data.\n * @param index - The index of each product item.\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\n * @returns The JSX Element.\n */\nconst renderProductCardsDescription = (\n props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>,\n product: ProductSearchResult,\n index: number,\n isEnabledProductDescription?: boolean): JSX.Element | null => {\n const { config, context, resources } = props;\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n const breadCrumbType = props.context.app.config.breadcrumbType;\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n const classname = isEnabledProductDescription ? 'ms-product-search-result__item product__description' : 'ms-product-search-result__item';\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature');\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n\n return (\n <li className={classname} key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={config.imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={isAllowBack}\n id={props.id}\n key={product.RecordId}\n typeName={props.typeName}\n data={{ product }}\n quickViewButton={quickviewslot}\n isEnabledProductDescription={isEnabledProductDescription}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n />\n </li>\n );\n};\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProducts = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n const products = props.data.listPageState.result?.activeProducts;\n if (!products || !ArrayExtensions.hasElements(products)) {\n return null;\n }\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\n return (\n <Node {...props.ProductsContainer}>\n {props.errorMessage}\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) => (\n (index % productDescriptionInterval === productDescriptionIntervalRemainder0) ||\n (index % productDescriptionInterval === productDescriptionIntervalRemainder9) ? renderProductCardsDescription(props, product,\n index, true) : renderProductCardsDescription(props, product, index, false)\n ))}\n </ul>\n </Node>\n );\n};\n\n/**\n * Render Title Count.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n {title.titleCount}\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Category Hierarchy.\n * @param props - The category hierarchy view props.\n * @returns The JSX Element.\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[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\n/**\n * Function to make filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\n // Get heights of cookie and promotion banners\n const defaultValue = 0;\n const defaultOffset = 28;\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\n\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\n const containerHeight: number = headerHeight ?? defaultOffset;\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\n const headerElement = document.querySelector('header .lock-opaque');\n const defaultContainer = document.querySelector('header .default-container');\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\n if (refinerElement && headerElement && defaultContainer) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-Filter');\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\n } else {\n refinerElement.classList.remove('lock-Filter');\n }\n } else if (refinerElement) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-top');\n } else {\n refinerElement.classList.remove('lock-top');\n refinerElement.classList.remove('lock-Filter');\n refinerElement.removeAttribute('style');\n }\n }\n};\n\n/**\n * Function to setup filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\n window.addEventListener('scroll', () => {\n configureStickyFilter(isMobile, isStickyHeader);\n });\n configureStickyFilter(isMobile, isStickyHeader);\n}\n\n/**\n * Function to make filter sticky.\n * @param refinerRefernce - Ref prop for filter.\n * @param toggle - Toggle function for filter menu.\n */\nfunction useOutsideClick(refinerRefernce: React.RefObject<HTMLElement>, toggle: (event: Event) => void) {\n React.useEffect(() => {\n\n /**\n * Function to make filter sticky.\n * @param event - Event prop for filter.\n */\n function handleClickOutside(event: Event) {\n const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\n if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\n toggle(event);\n }\n }\n if (MsDyn365.isBrowser) {\n document.addEventListener('click', handleClickOutside);\n }\n return () => {\n if (MsDyn365.isBrowser) {\n document.removeEventListener('click', handleClickOutside);\n }\n };\n }, [refinerRefernce, toggle]);\n}\n\n/**\n * Render the category page items.\n * @param props - The view props.\n * @returns The search Result container module view.\n */\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>> = props => {\n const { SearchResultContainer, pagination, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, FeatureSearchContainer,\n similarLookProduct, errorMessage, resources } = props;\n useEffect(() => {\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\n }\n }, [props]);\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\n const toggle = () => {\n setIsExpanded(!isExpanded);\n };\n const wrapperRefiner = React.useRef(null);\n useOutsideClick(wrapperRefiner, toggle);\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : <Node {...CategoryNavContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {renderTitleCount(TitleViewProps)}\n </Node>}\n {choiceSummary}\n <Node className='msc-sort-filter-wrapper'>\n {modalToggle}\n </Node>\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>\n {similarLookProduct}\n </Node>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitle(TitleViewProps)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>}\n <Node {...FeatureSearchContainer}>\n {similarLookProduct}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n <Node ref={wrapperRefiner} className='ms-refiner-heading'>\n <Node className='ms-refiner-heading_title'>\n <Button\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\n aria-label='Filter'\n onClick={toggle}\n aria-expanded={isExpanded}\n tabIndex={0}\n >\n {resources.filterText}\n </Button>\n <div className='ms-search-result-wrapper-title-choice-summary'>\n {choiceSummary}\n </div>\n <div className='ms-search-result-wrapper-sort-by-category'>\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n </div>\n </Node>\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\n <Node className='ms-refine__footer'>\n {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}\n </Node>\n </Node>\n\n <Node {...ProductSectionContainer}>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\n/**\n * Render Search result Modal.\n * @param modalProps - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string): JSX.Element => {\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown,\n isRecoSearchPage), modalProps.modalFooter);\n};\n\n/**\n * Render Refiner Mobile.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefinerMobile = (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\n/**\n * Render Search result Body.\n * @param props - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\n }\n return null;\n};\n\n/**\n * Render Refiner.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\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\n/**\n * Render Refiner Footer.\n * @param props - The Refine Menu view props.\n * @param handler - The Refine menu toggle function.\n * @param resources - Resources to get the done text and aria label.\n * @returns The JSX Element.\n */\nconst renderRefinerFooter = (props: IRefineMenuViewProps, handler: MouseEventHandler, resources: ISearchResultContainerResources): JSX.Element | null => {\n const { refiners } = props;\n if (refiners) {\n return (\n <Node className='ms-refine__footer__done'>\n <Node\n tag='button'\n className='ms-refine-filter-done'\n aria-label={resources.doneAriaLabel}\n tabIndex={0}\n onClick={handler}\n >\n {resources.doneText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render sort by drop down.\n * @param props - The sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return (\n <Node {...SortingContainer}>\n {sortByDropDown}\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Title.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <Node tag='h1' className=''>\n {title.titlePrefix}\n {title.titleText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselViewProps } from './carousel';\n\n/**\n * Returns item slots.\n * @returns Array of item slots.\n * @param props -Props.\n */\nconst retrieveItems = (props: ICarouselViewProps): React.ReactNode[] => {\n let items = [];\n items = props.slots && props.slots.content && props.slots.content.length > 0 ? props.slots.content : [];\n return items;\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={retrieveItems(props)}\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 keyboard={props.config.keyboard}\n />\n </Module>\n);\n\nexport default CarouselView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IActiveImageAdditionalContentViewProps } from '../active-image-utilities';\nimport { IActiveImageViewProps } from './active-image';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IActiveImageAdditionalContentViewProps) => {\n return (\n <Node {...additionalContent.additionalContentNode}>\n {additionalContent.heading}\n <Node {...additionalContent.additionalContentContainer}>\n {additionalContent.text}\n <Node {...additionalContent.additionalContentItemLinks}>\n {additionalContent.links}\n </Node>\n </Node>\n </Node >\n );\n};\n\n/**\n * Render View.\n * @param props - The view props.\n * @returns -The JSX Element.\n */\nexport const activeImageView: React.FC<IActiveImageViewProps> = props => {\n return (\n <Module {...props.activePointContainer}>\n <Node {...props.activePointDetailsContainer}>\n {props.imageMapper}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </Node>\n <Node\n className='msc-active-image-product-card-container'\n style={{ top: `${props.productCardtopPosition}px`, left: `${props.productCardleftPosition}px` }}>\n {props.overlay}\n {props.productCard}\n </Node>\n </Module>\n );\n};\n\nexport default activeImageView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { ReportReviewConcernInput } from './inputs/report-review-concern-input';\n\nasync function reportReviewConcern(input: ReportReviewConcernInput, ctx: IActionContext): Promise<boolean> {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId},locale= ${\n input.locale\n },`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/concerns/review/${input.reviewId}` +\n `?tenantId=${input.tenantId}` +\n `&locale=${input.locale}`;\n\n const requestBody = {\n concernCategory: input.concernCategory\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest<boolean>(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch((error) => {\n ctx.trace('[ReportReviewConcernInput] Failed to report a concern');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[ReportReviewConcernInput] Failed to report a concern');\n return false;\n });\n}\n\nfunction inputIsValid(input: ReportReviewConcernInput): boolean {\n return (\n input &&\n input.reviewId.length > 0 &&\n input.tenantId.length > 0 &&\n input.locale.length > 0 &&\n input.authToken.length > 0\n );\n}\n\nexport const reportReviewConcernDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/report-review-concern',\n action: <IAction<boolean>>reportReviewConcern\n});\n\nexport default reportReviewConcernDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport MsDyn365, { 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 { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\n\nexport interface IFlyoutCartLineItemsProps {\n cartlines: CartLine[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n\n /**\n * GridSettings for the product image in cartline\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartline\n */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n maxCartlineQuantity: number;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isQuantityLimitsFeatureEnabled: boolean;\n\n outOfStockThreshold: number;\n isStockCheckEnabled: boolean;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n cartline: React.ReactNode;\n remove: React.ReactNode;\n storeLocation: React.ReactNode;\n hasError: boolean;\n\n data: {\n product: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (isStockCheckEnabled: boolean, outOfStockThreshold: number, productAvailability?: ProductAvailableQuantity): number => {\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 0;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled ? (maxByQuantityLimitsFeatureResult < availableQuantityInStock ? maxByQuantityLimitsFeatureResult : availableQuantityInStock) : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct,\n props: IFlyoutCartLineItemsProps,\n index: number,\n foundProductAvailability?: ProductAvailableQuantity,\n foundProductDeliveryOptions?: ProductDeliveryOptions\n): IFlyoutCartLineItemViewProps => {\n const {\n imageSettings,\n gridSettings,\n id,\n typeName,\n context,\n resources,\n removeButtonText,\n removeItemClickHandler } = props;\n\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, props.outOfStockThreshold, foundProductAvailability);\n const maxQuantity = product && _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0);\n\n // Check if the product is service or not by product type\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n if (MsDyn365.isBrowser) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n\n return {\n data: {\n product,\n cartline\n },\n hasError: (!isServiceItem && props.isStockCheckEnabled) ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n <CartLineItemComponent\n data={{\n cartLine: cartline,\n product\n }}\n currentQuantity={cartline.Quantity}\n maxQuantity={maxQuantity}\n isOutOfStock={(!isServiceItem && props.isStockCheckEnabled) ? (availableQuantityInStock <= 0) : false}\n gridSettings={gridSettings}\n imageSettings={imageSettings}\n id={id}\n typeName={typeName}\n productUrl={productUrl}\n context={context}\n resources={resources}\n key={`${index}-${productUrl}`}\n isQuantityEditable={false}\n primaryImageUrl={product.PrimaryImageUrl}\n displayMode='COMPACT'\n telemetryContent={props.telemetryContent}\n channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\n />),\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'>\n {orgUnitName}\n </span>\n </div>\n );\n }\n }\n\n return null;\n};\n\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n\n};\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 let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n }\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n if (product) {\n reactNodes.push(_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};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ActiveCartProductsInput, getActiveCartProductsAction, getAvailabilitiesForCartLineItems, getDeliveryOptionsForCartLineItems, IProductInventoryInformation, ProductAvailabilitiesForCartLineItems, ProductDeliveryOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n products?: SimpleProduct[];\n productAvailabilites?: IProductInventoryInformation[];\n deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data.\n * @param ctx\n * @param cartState\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise<IMiniCartData> {\n const miniCartData: IMiniCartData = {};\n\n const cart = cartState.cart;\n\n // If there are cart lines, make call to get products\n // If there are invocie linese, then there is no products, so don't make call to get products\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\n await getActiveCartProductsAction(\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","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport { CartLine, ChannelDeliveryOptionConfiguration, LineDataValidationFailure, OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, INodeProps,\n ITelemetryContent, TelemetryConstant, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport { ICartIconData } from './cart-icon.data';\nimport { cartLinesSortOrder, ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n miniCartData: IMiniCartData;\n orgUnitLocations?: OrgUnitLocation[];\n isQuantityLimitsFeatureEnabled: boolean;\n isCartValid: boolean;\n}\n\nexport interface ICartIconViewProps extends ICartIconProps<ICartIconData> {\n className: string;\n cartIcon: React.ReactNode;\n FlyoutContainer?: INodeProps;\n CartlinesWrapper: INodeProps;\n miniCartWrapper: INodeProps;\n miniCartItemWrapper: INodeProps;\n cartlines?: IFlyoutCartLineItemViewProps[];\n flyoutTitle: React.ReactNode;\n totalPrice: React.ReactNode;\n checkoutAsGuestButton?: React.ReactNode;\n checkoutAsSignInUserButton?: React.ReactNode;\n goToCartButton?: React.ReactNode;\n waitingComponent?: React.ReactNode;\n isCartLoading: boolean;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component.\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass CartIcon extends React.Component<ICartIconProps<ICartIconData>, IMiniCartState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly checkoutBySignInAttributes: IDictionary<string> | undefined;\n\n private readonly checkoutByGuestAttributes: IDictionary<string> | undefined;\n\n private readonly viewShoppingBagAttributes: IDictionary<string> | undefined;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private lastValidatedCartVersion: number | undefined;\n\n constructor(props: ICartIconProps<ICartIconData>) {\n super(props);\n this.state = {\n miniCartData: {},\n isCartValid: true,\n isQuantityLimitsFeatureEnabled: false\n };\n this.telemetryContent = getTelemetryObject(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 await this._setOrderQuantityLimitsFeatureFlag();\n this._validateCart();\n }\n\n public componentDidUpdate(prevProps: ICartIconProps<ICartIconData>): void {\n this._validateCart();\n }\n\n public shouldComponentUpdate(nextProps: ICartIconProps<ICartIconData>,\n nextState: IMiniCartState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n config: {\n enableHoverCart,\n isAnonymousCheckout\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n const shouldShowMiniCart = cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n const hasInvoiceLine = cart?.hasInvoiceLine;\n const cartLines = this._getCartLines();\n const hasError = !this.state.isCartValid || (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\n const flyoutTitle = resources.flyoutTitle;\n const flyoutTooltip = {\n tag: UncontrolledTooltip,\n shouldShowMiniCart,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__flyout-container',\n trigger: 'hover',\n displayMode: 'FLYOUT',\n target: id,\n shouldShowCloseButton: true,\n cartPageUrl: cartUrl\n };\n\n // If there are invoice lines, don't update mini cart price\n const price = cart && !cart.hasInvoiceLine && cart.cart.TotalAmount || undefined;\n const priceString = price ? 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 }}\n telemetryContent={this.telemetryContent}\n />\n ),\n cartlines: cartLines,\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\n CartlinesWrapper: {\n className: 'ms-cart-icon__cart-lines'\n },\n miniCartWrapper: {\n className: classnames('ms-cart-icon'),\n id: this.props.id\n },\n miniCartItemWrapper: {\n className: classnames('msc-cart-lines-item')\n },\n\n // If there are invoice lines, don't update mini cart checkout button\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\n checkoutAsSignInUserButton: (!isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated)) ? (\n <Button\n disabled={hasError} className='ms-cart-icon__btn-checkout' href={checkoutURL}\n title={resources.checkoutButtonTitle} {...this.checkoutBySignInAttributes}>\n {resources.checkoutButtonTitle}\n </Button>\n ) : null,\n checkoutAsGuestButton: (isAnonymousCheckout && !isCartEmpty && !isAuthenticated) ? (\n <Button\n disabled={hasError} className='ms-cart-icon__btn-guestcheckout' href={guestCheckoutUrl}\n title={resources.guestCheckoutButtonTitle} {...this.checkoutByGuestAttributes}>\n {resources.guestCheckoutButtonTitle}\n </Button>\n ) : null,\n goToCartButton:\n (\n <Button\n className='ms-cart-icon__btn-gotocart' href={cartUrl} title={goToCartButtonText}\n {...this.viewShoppingBagAttributes}>\n {goToCartButtonText}\n </Button>\n ),\n flyoutTitle:\n (\n <span className='ms-cart-icon__flyout-title'>\n {flyoutTitle}\n </span>\n ),\n totalPrice:\n (\n <div className='ms-cart-icon__subtotal'>\n {priceString}\n </div>\n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _validateCart(): void {\n const {\n data: { cart }\n } = this.props;\n const cartVersion = cart.result?.cart?.Version ?? undefined;\n if (this.lastValidatedCartVersion === cartVersion) {\n return;\n }\n\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\n validateCartAsync(this.state.isQuantityLimitsFeatureEnabled, cart, this.props.telemetry, this.props.context)\n .then((result: LineDataValidationFailure[] | undefined) => {\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result) });\n })\n .catch(() => {\n this.setState({ isCartValid: false });\n });\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.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Sort cartline items.\n * @param cartlines - Cartlines to be sorted.\n * @param sortOrder - Ascending or descending.\n * @returns - Sorted cartlines.\n */\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\n const lines: CartLine[] = [...cartlines];\n const zero: number = 0;\n\n if (sortOrder === cartLinesSortOrder.descending) {\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\n }\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\n };\n\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n const {\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config,\n telemetry,\n resources\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const cart = this.props.data.cart && this.props.data.cart.result;\n\n // Cart-icon could be placed in each page\n // so we check cart content to reduce number of RS calls\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\n (\n FlyoutCartLineItems({\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\n products: this.state.miniCartData.products,\n productAvailabilites: this.state.miniCartData.productAvailabilites,\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n imageSettings,\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: 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,\n removeButtonText: resources.removeCartButtonText,\n outOfStockText: '', // Not used\n outOfRangeOneText: '', // Not used\n outOfRangeFormatText: '', // Not used\n cartState: cart,\n orgUnitLocations: this.state.orgUnitLocations,\n removeItemClickHandler: this._removeItemFromCartHandler,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n telemetryContent: this.telemetryContent,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled\n })\n ) : null;\n }\n\n private readonly _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 readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input)\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n private async _setOrderQuantityLimitsFeatureFlag(): Promise<void> {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq = featureStatuses\n .find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n } else {\n this.props.data.customerInformation\n .then(customerInfo => {\n const result = !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n this.setState({ isQuantityLimitsFeatureEnabled: result });\n }).catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n });\n }\n }\n}\n\nexport default CartIcon;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions, DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes, getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult, IDimensionsApp, ObjectExtensions, PriceForProductSearchResultInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IComponentNodeProps, IModuleProps, INodeProps,\n ISingleSlideCarouselProps, ITelemetryContent, NodeTag, SingleSlideCarousel } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductCollectionData } from './product-collection.data';\nimport { IProductCollectionProps, layout } from './product-collection.props.autogenerated';\n\nexport interface IProductCollectionViewProps extends IProductCollectionProps<IProductCollectionData> {\n heading?: React.ReactNode;\n ProductCollectionContainer: IModuleProps;\n SingleSlideCarouselComponentProps: INodeProps;\n GridComponentProps: INodeProps;\n products: IProductComponentViewProps[];\n isCarousel: boolean;\n productPrices?: ProductPrice[];\n}\n\nexport interface IProductComponentViewProps {\n ProductContainer: INodeProps;\n productComponent: React.ReactNode;\n}\nexport interface IProductComponentState {\n products: ProductSearchResult[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * ProductCollection component.\n */\nclass ProductCollection extends React.PureComponent<IProductCollectionProps<IProductCollectionData>, IProductComponentState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n constructor(props: IProductCollectionProps<IProductCollectionData>) {\n super(props);\n this.productPrices = [];\n this.state = {\n products: this.props.config.productCollection.products\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n }\n\n public async componentDidMount(): Promise<void> {\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext.user.isAuthenticated) {\n await this._getActivePrice();\n }\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { resources } = this.props;\n\n // Initialize state in case if the products were not found during initial module render\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data if not there.\n this.initProductState(this.props.config.productCollection);\n\n const products = this.state.products;\n const isCarousel = this.props.config.layout === layout.carousel;\n const headingLabel = heading ? heading.text : '';\n const headingComponent = heading && (\n <Msdyn365.Text\n className='ms-product-collection__heading'\n tag={heading.tag || 'h1'}\n text={headingLabel}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\n const updatedProducts = products?.map(\n (item: ProductSearchResult, index: number) => {\n const getProductData = this._getProduct(item, index);\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\n }\n );\n\n const productCollectionViewProps = {\n ...this.props,\n heading: headingComponent,\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: '',\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\n parentId: this.props.id,\n telemetryContent: this.telemetryContent\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n ProductCollectionContainer: {\n moduleProps: this.props,\n className: classnames('ms-product-collection', className)\n },\n GridComponentProps: {\n tag: 'ul' as NodeTag,\n className: 'ms-product-collection__items'\n },\n isCarousel,\n\n products: ArrayExtensions.hasElements(updatedProducts) && updatedProducts.filter(\n (item) => {\n return item !== undefined;\n }\n ),\n productPrices: this.productPrices\n };\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n /**\n * Get products dimension availabilities.\n * @param products - Products.\n * @returns Promise.\n */\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise<void> => {\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n const validProducts = ArrayExtensions.validValues(products);\n if (ArrayExtensions.hasElements(validProducts) &&\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) && !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) && !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)) {\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n validProducts, this.props.context as ICoreContext<IDimensionsApp>),\n this.props.context.actionContext);\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n }\n };\n\n /**\n * Helper method to initialize products state.\n * @param productCollection - List of products.\n */\n private readonly initProductState = async (productCollection: Msdyn365.IProductList) => {\n let products = this.state.products;\n const productCollectionProducts = productCollection.products;\n if (!ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts)) {\n products = productCollectionProducts;\n this.setState({ products });\n } else if (ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts) &&\n // eslint-disable-next-line sonarjs/no-duplicated-branches -- too small of code to create another function\n !ArrayExtensions.equals(products, productCollectionProducts)) {\n products = productCollectionProducts;\n this.setState({ products });\n }\n\n if (Msdyn365.msdyn365Commerce.isBrowser && !ArrayExtensions.hasElements(this.state.productsDimensionAvailabilities)) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n };\n\n private readonly _getProduct = (product: ProductSearchResult, index: number): IProductComponentViewProps | null => {\n if (!product || !product.Name) {\n this.props.telemetry.trace('[product-collection] Product or product name is null');\n return null;\n }\n const telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n const { imageSettings, allowBackNavigation } = this.props.config;\n const resources = this.props.resources;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n const quickviewSlot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\n const reviewCount = 1;\n const reviewTotalRatings = Number(product.TotalRatings);\n const reviewCountAriaLabelValue = reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature');\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return {\n ProductContainer: {\n tag: 'li' as NodeTag,\n className: 'ms-product-collection__item',\n role: 'listitem',\n key: index\n },\n productComponent: (\n <ProductComponent\n context={this.props.context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n ratingCountAriaLabel={reviewCountAriaLabelValue}\n allowBack={allowBack}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ product }}\n quickViewButton={quickviewSlot}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled?.IsEnabled}\n priceResources={priceResources}\n dimensionAvailabilities={this.state.productsDimensionAvailabilities?.find(\n dimensionAvailability => ArrayExtensions.hasElements(dimensionAvailability) &&\n // eslint-disable-next-line inclusive-language/use-inclusive-words -- Existing data entities.\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId))}\n />\n )\n };\n };\n\n /**\n * Get the active price for products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.state.products;\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n if (Msdyn365.msdyn365Commerce.isBrowser) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n\n this.setState({ products });\n };\n}\n\nexport default ProductCollection;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IModule } from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport isMatch from 'lodash/isMatch';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\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 sectionContainerModuleId = 'section-container';\nconst paymentInstrumentModuleId = 'payment-instrument';\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 shouldComponentUpdate(nextProps: IModuleStateProps): boolean {\n if (this.props === nextProps) {\n return false;\n }\n return true;\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 readonly 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 * @param id\n */\n private readonly 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 => {\n this.update(id, { isRequired: value });\n },\n setIsCancellable: (value: boolean): void => {\n this.update(id, { isCancellable: value });\n },\n setIsSubmitContainer: (value: boolean): void => {\n this.update(id, { isSubmitContainer: value });\n },\n setHasError: (value: boolean): void => {\n this.update(id, { hasError: value });\n },\n onReady: (): void => {\n this.update(id, { status: 'ready' });\n },\n onUpdating: (): void => {\n this.update(id, { status: 'updating' });\n },\n onPending: (): void => {\n this.update(id, { status: 'pending' });\n },\n onSkip: (): void => {\n this.update(id, { status: 'skipped' });\n },\n onDisable: (): void => {\n this.update(id, { status: 'disabled' });\n },\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 * @param typeName\n */\n private readonly 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 readonly get = (): IModuleStates => {\n return getModuleStates(this.props.context.actionContext);\n };\n\n /**\n * Update\n * Update module state.\n * @param id\n * @param value\n */\n private readonly 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 readonly _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 readonly _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 === 0) {\n return this._validateLeaf(id, source);\n }\n\n let childIds = module.childIds;\n\n if (this.props.context.app.config.shouldEnableSinglePaymentAuthorizationCheckout) {\n // For new checkout flow, we bypass the isReady check for payment section container to enable the place order button.\n childIds = childIds.filter(childId => !this._isPaymentSectionContainer(childId));\n }\n\n // It is container module\n const method = allMatched ? 'every' : 'some';\n return childIds[method](childId => this._validateContainer(childId, source, allMatched, skipSkippableItem));\n };\n\n /**\n * Check if it is a section container with payment module.\n * @param moduleId -- The id of the module.\n * @returns If it is a section container with payment module.\n */\n private readonly _isPaymentSectionContainer = (moduleId: string): boolean => {\n if (!moduleId.includes(sectionContainerModuleId)) {\n return false;\n }\n\n const modules = this.get();\n const module = modules[moduleId];\n\n if (module && ArrayExtensions.hasElements(module.childIds.filter(childId => childId.includes(paymentInstrumentModuleId)))) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Validate\n * Validate current module and all its child module match the provided condition.\n * @param id\n * @param source\n * @param allMatched\n * @param skipSkippableItem\n */\n private readonly 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 === 0) {\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 readonly hasExternalSubmitGroup = (): boolean => {\n return !!this.props.enableControl;\n };\n\n /**\n * HasModuleState\n * Module is using module state manager.\n * @param id\n */\n private readonly 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;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\nimport { ICartlinesViewProps } from './components/cart-line-items';\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\n\nconst _renderCartlines = (cartLines: ICartlinesViewProps[] | undefined, cartEmptyText: string, CartlinesWrapper: INodeProps, storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode, waitingComponent: React.ReactNode, cartLoadingStatus: string, cartDataResult: boolean): JSX.Element[] | JSX.Element => {\n\n if (cartLoadingStatus) {\n return (<>\n {cartLoadingStatus}\n </>);\n }\n if (cartLines) {\n return cartLines.map((cartLine) => {\n return (\n <div className='msc-cart-lines-item' key={`${cartLine.cartlineId ?? ''}-${MsDyn365.isBrowser.toString()}`}>\n {cartLine.cartline}\n {\n storeSelector && cartLine.pickUpInStore ? <Node {...cartLine.pickUpInStore.ContainerProps}>\n {cartLine.pickUpInStore.defaultComponent}\n </Node> : null\n }\n {\n cartLine.addToOrderTemplate ? (\n <Node className='msc-cart-line__extra-actions'>\n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n </Node>\n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n </>\n )\n }\n </div>\n );\n });\n }\n return (cartDataResult ? (\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>\n {cartEmptyText}\n </p>\n {backToShoppingButton}\n </div>\n ) : <>\n {waitingComponent}\n </>\n );\n\n};\n\n/**\n * Method will render error block.\n * @param errorData -The order summary errors interface.\n * @returns Jsx element.\n */\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\n return null;\n }\n return (\n <Node {...errorData.Wrapper}>\n {errorData.header}\n {errorData.errors}\n </Node>\n );\n};\n\n/**\n * Method will render invoice summary lines.\n * @param invoiceSummaryLines -The invoicesummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderInvoiceSummarylines = (invoiceSummaryLines: IInvoiceSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps):\nJSX.Element | null => {\n if (!invoiceSummaryLines) {\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render order summary lines.\n * @param orderSummaryLines -The ordersummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps):\nJSX.Element | null => {\n if (!orderSummaryLines) {\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render cart promotions.\n * @param promotions -The cartline item view props.\n * @returns Jsx element.\n */\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n <>\n <Node {...promotions.promotionMessageWrapper} >\n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n </Node>\n\n </>\n );\n\n};\n\n/**\n * Method will render cartlines group title.\n * @param cartLine -The cartline view props.\n * @param titleSeparate -The title separate.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n return (\n <>\n <Node className='msc-cart-lines-group-wraper__bopis-heading-title'>\n {isBopisSelected ? <p className='msc-cart-lines-group-wraper__bopis-heading-title-st'>\n {cartLine.pickUpInStore?.deliveryOption}\n {titleSeparate}\n {cartLine.pickUpInStore?.orgUnitName}\n </p> : null}\n </Node>\n </>\n );\n};\n\n/**\n * Method will render cartlines groups header title.\n * @param pickUpText -The pickup text for group.\n * @param shippingText -The shipping text for group.\n * @param emailShippingText -The email shipping text for group.\n * @param titleSeparate -The title separator.\n * @param cartLine -The cartline view props.\n * @param emailDeliveryModeCode -The email delivery code from channel.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupHeader = (pickUpText: string, shippingText: string, emailShippingText: string,\n titleSeparate: string, cartLine: ICartlinesViewProps, emailDeliveryModeCode?: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n let groupTitle: string;\n\n groupTitle = isBopisSelected ? pickUpText : shippingText;\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\n\n return (\n <>\n <div className='msc-cart-lines-group-wraper__bopis-heading'>\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}-icon`} />\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}`}>\n {groupTitle}\n </p>\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\n </div>\n </>\n );\n};\n\n/**\n * Method will render cartlines in groups.\n * @param props -The cartline.\n * @returns Jsx element.\n */\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\n return (\n <div className='msc-cart-lines-group'>\n { props.cartLinesGroup.map(cartlines => {\n return (<div key={cartlines[0].cartlineId} className='msc-cart-lines-group-wraper'>\n {renderCartLinesGroupHeader(props.resources.pickUpText, props.resources.shippingText,\n props.resources.emailshippingText, props.resources.titleSeparate, cartlines[0],\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode)}\n {_renderCartlines(cartlines, props.resources.emptyCartText, props.CartlinesWrapper, props.storeSelector,\n props.backToShoppingButton, props.waitingComponent, props.cartLoadingStatus, props.cartDataResult)}\n </div>);\n })}\n </div>\n );\n }\n return (props.cartDataResult ? (\n <div className='msc-cartline-wraper'>\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>\n {props.resources.emptyCartText}\n </p>\n {props.backToShoppingButton}\n </div>\n </div>\n ) : <>\n {props.waitingComponent}\n </>\n );\n\n};\n\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => (\n <div className={props.className} id={props.id} {...props.renderModuleAttributes(props)}>\n {props.title}\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? renderCartLinesGroup(props) : <Node {...props.CartlinesWrapper}>\n {_renderCartlines(props.cartlines, props.resources.emptyCartText, props.CartlinesWrapper, props.storeSelector,\n props.backToShoppingButton, props.waitingComponent, props.cartLoadingStatus, props.cartDataResult)}\n </Node>}\n {props.orderSummaryHeading &&\n <Node {...props.OrderSummaryWrapper}>\n {props.orderSummaryHeading}\n {props.cart?.hasInvoiceLine ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props) : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? <Node {...props.ExpressCheckoutSectionWrapper}>\n {props.expressCheckoutButton}\n </Node> : null}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n </Node>}\n {props.storeSelector}\n </div>\n);\n\nexport default CartView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport default (props: { className: string; msg?: string }) => (\n <>\n <div className={`${props.className}__loading__icon`} />\n {props?.msg && <div className={`${props.className}__loading__msg`}>\n {props?.msg}\n </div>}\n </>\n);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Alert, Button, INodeProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\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 disableAddGiftCard?: boolean;\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/**\n * On Apply Function.\n * @param onApplyGiftCard -On Apply Gift Card Function.\n * @returns Call of Apply Gift Card Function.\n */\nconst onApplyHandler = (onApplyGiftCard: () => Promise<void>) => async (event: React.SyntheticEvent): Promise<void> => {\n event.preventDefault();\n await onApplyGiftCard();\n};\n\n/**\n * On change number Function.\n * @param onEnterGiftCardNumber -On enter gift card number Function.\n * @returns Call of on enter gift card number Function.\n */\nconst onChangeNumberHandler = (onEnterGiftCardNumber: (giftCardNumber: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardNumber(value);\n};\n\n/**\n * On Change pin event.\n * @param onEnterGiftCardPin -On enter gift card pin Function.\n * @returns Call of on enter gift card pin Function.\n */\nconst onChangePinHandler = (onEnterGiftCardPin: (giftCardPin: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardPin(value);\n};\n\n/**\n * On Change Event.\n * @param onEnterGiftCardExp -On enter gift card function.\n * @returns Call of On enter gift card function.\n */\n// Need to filter out the month and year\nconst onChangeExpHandler = (onEnterGiftCardExp: (giftCardExp: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardExp(value);\n};\n\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 disableAddGiftCard,\n resources: { applyGiftCardButton, giftCardFormLabel, giftCardNumberLabel, giftCardPinLabel, giftCardExpLabel,\n giftCardAlertLabel, giftCardPinPlaceholderText, giftCardExpPlaceholderText }\n } = options;\n\n const formProps = {\n className: classnames('ms-checkout-gift-card__form', { 'is-invalid': !!errorMessage }),\n onSubmit: onApplyHandler(onApplyGiftCard),\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={onChangeNumberHandler(onEnterGiftCardNumber)}\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={onChangePinHandler(onEnterGiftCardPin)}\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} ${giftCardExpPlaceholderText}`}\n placeholder={giftCardExpPlaceholderText}\n onChange={onChangeExpHandler(onEnterGiftCardExp)}\n value={giftCardExp}\n aria-describedby='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={onApplyHandler(onApplyGiftCard)}\n aria-label={applyGiftCardButton}\n disabled={disableAddGiftCard || !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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Button, INodeProps } from '@msdyn365-commerce-modules/utilities';\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 * On remove function.\n * @param onRemoveGiftCard -Gift card number function.\n * @param giftCard -Gift card values.\n * @returns Call of onRemoveGiftCard function.\n */\nconst onRemoveHandler = (onRemoveGiftCard: (giftCardNumber: string) => void, giftCard: IGiftCardExtend) => (): void => {\n onRemoveGiftCard(giftCard.Id ?? '');\n};\n\n/**\n * GiftCardItem component.\n * @param root0\n * @param root0.giftCard\n * @param root0.getFormattedPrice\n * @param root0.canRemove\n * @param root0.onRemoveGiftCard\n * @param root0.resources\n * @param root0.resources.enteredGiftCardLabel\n * @param root0.resources.giftCardAvailableBalanceLabel\n * @param root0.resources.removeGiftCardButton\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\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}\n {' '}\n {giftCardLast4Digit}\n {' ('}\n {giftCardAvailableBalanceLabel}\n {' '}\n <span className='ms-checkout-gift-card__balance'>\n {balance}\n </span>\n {')'}\n </span>\n );\n\n const removeButton = canRemove && (\n <Button className='ms-checkout-gift-card__btn-remove' onClick={onRemoveHandler(onRemoveGiftCard, giftCard)}>\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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\n\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 === 0) {\n return undefined;\n }\n\n const listProps = {\n className: 'ms-checkout-gift-card__list'\n };\n\n const list = giftCards.map(giftCard => 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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\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'>\n {title}\n</label>);\n\nexport default GiftCardTitle;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\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 { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\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\nenum 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 readonly inputRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private readonly inputPinRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private readonly 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 getGiftCardTotalAmount(): number {\n const checkoutState = this.props.data.checkout.result;\n if (!checkoutState || !checkoutState.giftCardExtends) {\n return 0;\n }\n return checkoutState.giftCardExtends.reduce((count: number, giftCard: IGiftCardExtend) => {\n const balance: number = giftCard.Balance || 0;\n return count + balance;\n }, 0);\n }\n\n @computed get disableAddGiftCard(): boolean {\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n if (!cart) {\n return true;\n }\n return (cart.TotalAmount || 0) - this.getLoyaltyAmount - this.getGiftCardTotalAmount <= 0;\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\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 public componentDidMount(): void {\n when(\n () => this.isDataReady,\n () => {\n this.init();\n }\n );\n }\n\n public shouldComponentUpdate(nextProps: ICheckoutGiftCardModuleProps,\n nextState: ICheckoutGiftCardState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | 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;\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 disableAddGiftCard: this.disableAddGiftCard\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 readonly 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.props.data.checkout.result?.isPaymentVerificationRedirection) {\n this.props.moduleState.onSkip();\n }\n\n };\n\n private readonly 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\n // Use gift card when it is not free\n return (cart.TotalAmount || 0) > 0;\n };\n\n private readonly isEnabled = (): boolean => {\n if (!this.props.context.request.user.isAuthenticated &&\n this.props.context.app.config.giftCardSupported !== SupportedGiftCardType.External &&\n !this.props.config.shouldBeEnabledForGuest) {\n return false;\n }\n return this.couldPaidByGiftCard();\n };\n\n private readonly onEdit = (): void => {\n // Show add gift card form\n this.props.moduleState.onUpdating();\n };\n\n private readonly onCancel = (): void => {\n this.handleCancelOrSubmit();\n };\n\n private readonly onSubmit = (): void => {\n this.handleCancelOrSubmit();\n };\n\n private readonly 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 readonly getFormattedPrice = (price: number = 0, currencyCode: string = 'USD'): string => {\n return this.props.context.cultureFormatter.formatCurrency(price, currencyCode);\n };\n\n private readonly enterGiftCardNumber = (giftCardNumber: string): void => {\n this.setState({\n giftCardNumber\n });\n this.clearError();\n };\n\n private readonly enterGiftCardPin = (giftCardPin: string): void => {\n this.setState({\n giftCardPin\n });\n this.clearError();\n };\n\n private readonly enterGiftCardExp = (giftCardExp: string): void => {\n this.setState({\n giftCardExp\n });\n this.clearError();\n };\n\n private readonly 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 readonly clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.setState({\n errorMessage: ''\n });\n };\n\n private readonly 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 readonly 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, 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 }\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 readonly 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 readonly 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 = Number.parseInt(giftCardExp.split('/')[0], 10);\n const year = Number.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 readonly 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 return resolveCardTypesAsync({ callerContext: this.props.context.actionContext }, giftCardNumber, CardType.GiftCard)\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);\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IOrderTemplateListViewProps, ISingleOrderTemplateViewProps } from '@msdyn365-commerce-modules/order-template';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport CreateNewTemplateButtonComponent from './components/create-order-template.component';\r\nimport * as React from 'react';\r\n\r\nimport { IOrderTemplateListProps, IOrderTemplateListResources } from '../definition-extensions/order-template-list.ext.props.autogenerated';\r\nimport { IOrderTemplateNameDialogResources } from \"@msdyn365-commerce/components\";\r\n\r\n/**\r\n * Interface for OrderTemplateImage.\r\n */\r\ninterface IOrderTemplateImage {\r\n props: {\r\n children: React.ReactElement[];\r\n };\r\n}\r\n\r\n/**\r\n * To render order template.\r\n * @param orderTemplate - The order template view props.\r\n * @param orderTemplateNodeProps - The order template node props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderOrderTemplate = (orderTemplate: ISingleOrderTemplateViewProps, orderTemplateNodeProps?: INodeProps): JSX.Element | null => {\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file\r\n const { key, addToCartButton, orderTemplateImage, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\r\n\r\n const orderTemplateImageElement: IOrderTemplateImage = orderTemplateImage as React.ReactElement;\r\n const currentImageListLength = orderTemplateImageElement.props.children.length;\r\n const defaultNumberImagesInTile = 4;\r\n\r\n if (currentImageListLength < defaultNumberImagesInTile) {\r\n for (let index = 0; index < defaultNumberImagesInTile - currentImageListLength; index++) {\r\n orderTemplateImageElement.props.children.push(<picture />);\r\n }\r\n }\r\n\r\n return (\r\n <Node key={key} className={orderTemplateNodeProps!.className} {...orderTemplateNodeProps}>\r\n {orderTemplateName}\r\n {orderTemplateImage}\r\n {addToCartButton}\r\n {removeButton}\r\n {orderTemplateStatusMessage}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _reloadPage = async () => {\r\n window.location.reload();\r\n};\r\n\r\nconst _generateOrderTemplateNameDialogResources = (resources: IOrderTemplateListResources): IOrderTemplateNameDialogResources => {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n}\r\n\r\n/**\r\n * Order Template List View.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nexport const OrderTemplateListViewComponent: React.FC<IOrderTemplateListViewProps & IOrderTemplateListProps<IOrderTemplateListResources>> = props => {\r\n const {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file\r\n OrderTemplateList, OrderTemplates, OrderTemplate,\r\n status,\r\n statusMessage,\r\n heading,\r\n orderTemplates,\r\n createOrderTemplateButton,\r\n templateHeaderStatusMessage\r\n } = props;\r\n console.log(createOrderTemplateButton)\r\n return (\r\n <Module {...OrderTemplateList}>\r\n {heading}\r\n {status !== 'SUCCESS' && statusMessage}\r\n {status === 'EMPTY' && (\r\n <CreateNewTemplateButtonComponent\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{}}\r\n createOrderTemplateText={props.resources.createNewTemplateButtonText}\r\n onOrderTemplateCreated={_reloadPage}\r\n createOrderTemplateDialogResources={_generateOrderTemplateNameDialogResources(props.resources)}\r\n />\r\n )}\r\n <Node className=''>\r\n {status === 'SUCCESS' &&\r\n (!OrderTemplates || !orderTemplates ||\r\n !ArrayExtensions.hasElements(orderTemplates)) ? (\r\n <div className='ms-order-template__empty-list'>\r\n <h2 className='ms-order-template__empty-list-heading'>\r\n {props.resources.headingForEmptyOrderTemplateList}\r\n </h2>\r\n <p className='ms-order-template__empty-list-text'>\r\n {props.resources.textForEmptyOrderTemplateList}\r\n </p>\r\n {createOrderTemplateButton}\r\n </div>\r\n ) : createOrderTemplateButton}\r\n {templateHeaderStatusMessage}\r\n </Node>\r\n { OrderTemplates && orderTemplates && ArrayExtensions.hasElements(orderTemplates) &&\r\n <Node {...OrderTemplates}>\r\n {orderTemplates.map((orderTemplate) => {\r\n return renderOrderTemplate(orderTemplate, OrderTemplate);\r\n })}\r\n </Node>}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default OrderTemplateListViewComponent;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Address, GiftCard, TenderLine, TokenizedPaymentCard } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { action, computed, observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a checkout.\n */\nexport class CheckoutState {\n @observable private _tokenizedPaymentCard: TokenizedPaymentCard | undefined ;\n\n @computed public get tokenizedPaymentCard(): Readonly<TokenizedPaymentCard> | undefined {\n return this._tokenizedPaymentCard;\n }\n\n @observable private _tenderLine: TenderLine | undefined;\n\n @computed public get tenderLine(): Readonly<TenderLine> | undefined {\n return this._tenderLine;\n }\n\n @observable private _billingAddress: Address | undefined ;\n\n @computed public get billingAddress(): Readonly<Address> | undefined {\n return this._billingAddress;\n }\n\n @observable private _shippingAddress: Address | undefined;\n\n @computed public get shippingAddress(): Readonly<Address> | undefined {\n return this._shippingAddress;\n }\n\n @observable private _cardPrefix: string | undefined;\n\n @computed public get cardPrefix(): Readonly<string> | undefined {\n return this._cardPrefix;\n }\n\n @observable private _giftCards: GiftCard[] = [];\n\n @computed public get giftCards(): readonly GiftCard[] {\n return this._giftCards;\n }\n\n @observable private _giftCardExtends: IGiftCardExtend[] = [];\n\n @computed public get giftCardExtends(): readonly IGiftCardExtend[] {\n return this._giftCardExtends;\n }\n\n @observable private _loyaltyCardNumber?: string;\n\n @computed public get loyaltyCardNumber(): Readonly<string> | undefined {\n return this._loyaltyCardNumber;\n }\n\n @observable private _loyaltyAmount: number = 0;\n\n @computed public get loyaltyAmount(): Readonly<number> | number {\n return this._loyaltyAmount;\n }\n\n @observable private _guestCheckoutEmail: string = '';\n\n @computed public get guestCheckoutEmail(): Readonly<string> | string {\n return this._guestCheckoutEmail;\n }\n\n @observable private _isTermsAndConditionAccepted: boolean = false;\n\n @computed public get isTermsAndConditionAccepted(): Readonly<boolean> | boolean {\n return this._isTermsAndConditionAccepted;\n }\n\n @observable private _customerAccountAmount: number = 0;\n\n @computed public get customerAccountAmount(): Readonly<number> | number {\n return this._customerAccountAmount;\n }\n\n @action\n public updateTokenizedPaymentCard(newTokenizedPaymentCard: TokenizedPaymentCard): void {\n this._tokenizedPaymentCard = newTokenizedPaymentCard;\n }\n\n @action\n public updateTenderLine(newTenderLine: TenderLine | undefined): void {\n this._tenderLine = newTenderLine;\n }\n\n @action\n public updateShippingAddress(newShippingAddress: Address): void {\n this._shippingAddress = newShippingAddress;\n }\n\n @action\n public updateBillingAddress(newBillingAddress: Address): void {\n this._billingAddress = newBillingAddress;\n }\n\n @action\n public updateCardPrefix(newCardPrefix: string): void {\n this._cardPrefix = newCardPrefix;\n }\n\n @action\n public removeGiftCard(giftCardNumber: string): void {\n this._giftCards = this._giftCards.filter(giftCard => giftCard.Id !== giftCardNumber);\n }\n\n @action\n public removeGiftCardExtend(giftCardNumber: string): void {\n this._giftCardExtends = this._giftCardExtends.filter(giftCard => giftCard.Id !== giftCardNumber);\n }\n\n @action\n public addGiftCard(giftCard: GiftCard): void {\n this._giftCards = [giftCard, ...this._giftCards];\n }\n\n @action\n public addGiftCardExtend(giftCard: IGiftCardExtend): void {\n this._giftCardExtends = [giftCard, ...this._giftCards];\n }\n\n @action\n public updateLoyaltyCardNumber(newLoyaltyCardNumber: string): void {\n this._loyaltyCardNumber = newLoyaltyCardNumber;\n }\n\n @action\n public updateLoyaltyAmount(newAmount: number): void {\n this._loyaltyAmount = newAmount;\n }\n\n @action\n public updateGuestCheckoutEmail(newGuestCheckoutEmail: string): void {\n this._guestCheckoutEmail = newGuestCheckoutEmail;\n }\n\n @action\n public updateTermsAndConditionsAcceptance(newIsTermsAndConditionAccepted: boolean): void {\n this._isTermsAndConditionAccepted = newIsTermsAndConditionAccepted;\n }\n\n @action\n public updateCustomerAccountAmount(newAmount: number): void {\n this._customerAccountAmount = newAmount;\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\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 const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\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 && !isRecoSearchPage && 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,\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element => {\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage), modalProps.modalFooter);\n};\n\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), 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, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\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;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps } from './components/additional-content';\nimport { IVideoPlayerViewProps } from './video-player';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IVideoPlayerAdditionalContentViewProps) => {\n if (additionalContent.additionalContentItems) {\n return (\n <Node {...additionalContent.additionalContentNode}>\n <>\n {additionalContent.additionalContentItems.heading}\n <Node {...additionalContent.additionalContentItems.additionalContentItemContainer}>\n {additionalContent.additionalContentItems.text}\n <Node {...additionalContent.additionalContentItems.additionalContentItemLinks}>\n {additionalContent.additionalContentItems.links}\n </Node>\n </Node>\n </>\n </Node >\n );\n }\n\n return null;\n};\n\nconst VideoPlayerView: React.FC<IVideoPlayerViewProps> = props => {\n return (\n <div\n id={props.id}\n className='ms-video-player'\n {...props.renderModuleAttributes(props)}\n >\n {props.player}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </div>\n );\n};\n\nexport default VideoPlayerView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport Checkout from './checkout';\nimport CheckoutView from './checkout.view';\n\nexport * from './actions/get-products-in-active-checkout-cart';\nexport * from './checkout';\nexport * from './checkout.data';\nexport * from './checkout.props.autogenerated';\nexport * from './checkout.view';\nexport * from './components';\nexport * from './methods';\n\nexport {\n Checkout,\n CheckoutView\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\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<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): 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<IRefineItemProps, IRefineItemState> {\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\n\n private readonly payLoad: IPayLoad;\n\n public 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 public shouldComponentUpdate(nextProps: IRefineItemProps,\n nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\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 return this._renderRating(productRefinerValue, parentProductRefinerHierarchy, isChecked, context, index, telemetryContent,\n productCountAriaLabel, singleProductCountAriaLabel);\n\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText) : '';\n } else {\n refineMenuItemAriaLabel =\n refineItemsAriaLabel ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount) : '';\n }\n return (\n <li className='ms-refine-submenu-item' id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={0}\n onClick={this._onClick}\n className={itemTypeClassName}\n role={inputType}\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {this._renderSwatch()}\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n\n }\n\n private _renderSwatch(): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasValidSwatch = hasColor || hasImage;\n const shouldDisplayAsSwatch = hasValidSwatch && checkIfShouldDisplayAsSwatch(\n dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\n const swatchItems = shouldDisplayAsSwatch ? [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ] : undefined;\n\n if (!swatchItems) {\n return null;\n }\n\n return (\n <SwatchComponent\n className='ms-refine-submenu-item__swatch'\n apiSettings={this.props.context.request.apiSettings}\n list={swatchItems}\n isSelectionEnabled={false}\n isRefineItem\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,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(\n () => {\n this.anchorType.current && this.anchorType.current.focus();\n },\n 0\n );\n }\n };\n\n private _renderRating(productRefinerValue: ProductRefinerValue, parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean, context: ICoreContext, index?: number, telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string, ratingSingleUserCountAriaLabel?: string): JSX.Element | undefined {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\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 const productCountAriaLabelValue = (productRefinerValue.Count !== undefined &&\n productRefinerValue.Count === defaultChkProductCount) ? (ratingSingleUserCountAriaLabel &&\n format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)) : (ratingUserCountAriaLabel &&\n format(ratingUserCountAriaLabel, productRefinerValue.Count));\n return (\n <li\n className='ms-refine-submenu-item'\n role={!this.props.isMobileView ? 'presentation' : undefined}\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\n >\n <a\n href={this._getRefinerUrl()}\n role='option'\n aria-selected={isChecked}\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\n ${productCountAriaLabelValue!}`}\n onClick={this._onClick}\n {...attribute}\n >\n <RatingComponent\n className={ratingComponentClass}\n avgRating={refinerRating}\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\n hideCount={false}\n readOnly\n ariaLabel=''\n context={context}\n id={this.props.moduleId}\n typeName={this.props.moduleTypeName}\n data={{}}\n />\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n return undefined;\n }\n\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { Alert, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, Modal, ModalBody, ModalFooter, ModalHeader, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ReviewConcernCategory } from '../../../actions/inputs/report-review-concern-input';\nimport { IRnrKeyValuePair } from '../../../common/rnrInterface';\n\nexport interface IReportReviewModalProps {\n resources: IReportReviewModalResources;\n context: ICoreContext<IGeneric<IAny>>;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n reportedKey: string;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onRadioChange(event: React.ChangeEvent<HTMLInputElement>): void;\n reportReview(): void;\n}\n\nexport interface IReportReviewModalResources {\n reportConcernText: string;\n feedbackThankYouText: string;\n reportModalMessage: string;\n reportSubmittedMessage: string;\n reportSpamText: string;\n offensiveContentText: string;\n profanityContentText: string;\n okReportReviewText: string;\n cancelReportReviewText: string;\n reportReviewButtonText: string;\n errorMessageText: string;\n}\n\nexport interface IReportReviewModalViewProps {\n modal: INodeProps;\n modalHeader: INodeProps;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n header: React.ReactElement;\n headerSubmitted: React.ReactElement;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n succesfulButton: React.ReactElement;\n reportMessage: React.ReactElement;\n reportSubmittedMessage: React.ReactElement;\n radioButtons: React.ReactElement;\n error: React.ReactElement;\n}\n\nlet reportConcernDropdownOptions: IRnrKeyValuePair[];\n\n/**\n * CartLineItems component.\n */\n\nexport const ReportReviewModal = (props: IReportReviewModalProps): IReportReviewModalViewProps => {\n\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitReviewAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.SuccessButton;\n const successAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n reportConcernDropdownOptions = [\n { key: ReviewConcernCategory.SpamAdvertising, value: props.resources.reportSpamText },\n { key: ReviewConcernCategory.OffensiveContent, value: props.resources.offensiveContentText },\n { key: ReviewConcernCategory.Profanity, value: props.resources.profanityContentText }\n ];\n\n return {\n modal: { tag: Modal, className: 'ms-report-review-modal msc-modal-input-required', toggle: props.onModalToggle, applicationNode: 'renderPage', isOpen: props.isOpen, returnFocusRef: props.returnRef },\n modalHeader: { tag: ModalHeader, toggle: props.onModalToggle, className: 'ms-report-review-modal-header' },\n modalFooter: { tag: ModalFooter, className: 'ms-report-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-report-review-modal-body' },\n header: <p className='ms-reviews-list__report-header'>\n {props.resources.reportConcernText}\n </p>,\n headerSubmitted: <p className='ms-reviews-list__report-header'>\n {props.resources.feedbackThankYouText}\n </p>,\n cancelButton: <button className='msc-btn ms-reviews-list__cancel' onClick={props.onModalToggle} {...cancelAttribute}>\n {props.resources.cancelReportReviewText}\n </button>,\n submitButton: <button className='msc-btn ms-reviews-list__submit' onClick={props.reportReview} {...submitReviewAttribute}>\n {' '}\n {props.resources.reportReviewButtonText || 'Report'}\n </button>,\n succesfulButton: <button className='msc-btn ms-reviews-list__success' onClick={props.onModalToggle} {...successAttribute}>\n {props.resources.okReportReviewText}\n </button>,\n reportMessage: <p className='ms-reviews-list__report-message'>\n {props.resources.reportModalMessage}\n </p>,\n reportSubmittedMessage: <p className='ms-reviews-list__report-message'>\n {props.resources.reportSubmittedMessage}\n </p>,\n radioButtons: radioPairs(props),\n error: <Alert className='ms-reviews-list__report-error' isOpen={props.hasError} color='danger'>\n {props.resources.errorMessageText}\n </Alert>\n };\n};\n\nconst radioPairs = (props: IReportReviewModalProps) => {\n const pairs = [];\n for (const option of reportConcernDropdownOptions) {\n const inputId = `report-review-${option.key}`;\n const checked = option.key === props.reportedKey;\n pairs.push(\n <div className='ms-report-review-modal-pair' key={option.key}>\n <input\n className='msc-radio-input'\n type='radio'\n name='report-error'\n id={inputId}\n data-key={option.key}\n value={option.value}\n checked={checked}\n aria-checked={checked}\n onChange={props.onRadioChange}\n />\n <label className='msc-radio-label' htmlFor={inputId}>\n {option.value}\n </label>\n </div>\n );\n }\n\n return (\n <fieldset>\n {pairs}\n </fieldset>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { getCatalogId, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n addItemToOrderTemplate,\n AddItemToOrderTemplateInput,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getSelectedVariant,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Modal, ModalBody, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport { get } from 'lodash';\nimport { computed } from 'mobx';\nimport React from 'react';\n\nimport { IProductConfigurationState, NotFoundComponent, ProductConfiguration, ProductList } from '.';\nimport Spinner from './spinner';\n\nexport interface IAddLineToTemplateProps {\n context: ICoreContext;\n resources: IAddLineToTemplateResources;\n orderTemplateId: string;\n imageSettings?: IImageSettings;\n}\n\nexport interface IAddLineToTemplateResources {\n addLineModalLinkText: string;\n searchButtonAriaLabel: string;\n searchInputAriaLabel: string;\n searchModalPlaceholderText: string;\n selectProductButtonText: string;\n addItemToTemplateText: string;\n addLineProductUnitPricePrefix: string;\n backButtonText: string;\n decrementButtonAriaLabel: string;\n incrementButtonAriaLabel: string;\n quantitySelectLabel: string;\n addLineProductUnitOfMeasurePrefix: string;\n notFoundSearchErrorNotice: string;\n notFoundSearchErrorRedediation: string;\n searchErrorMessage: string;\n productDimensionTypeColor: string;\n productDimensionTypeConfiguration: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n searchResultsCountVerbage: string;\n searchResultsCountSubject: string;\n addToTemplateConfirmation: string;\n totalPriceLabel: string;\n progressNotificationText: string;\n addToTemplateDuplicateError: string;\n addToTemplateGenericError: string;\n dimensionMissingError: string;\n backToResultsText?: string;\n}\n\nenum CONTENT {\n Search,\n ProductList,\n ProductConfiguration,\n NotFound,\n Error,\n Loading\n}\n\ninterface IAddLineToTemplateState {\n isOpen: boolean;\n query: string;\n products: ProductSearchResult[];\n content: number;\n selectedProduct: SimpleProduct | null;\n selectedProductDimensions?: ProductDimensionFull[];\n selectedQuantity?: number;\n reloadPage?: boolean;\n}\n\n/**\n * Add Lines to order template.\n */\nexport class AddLineToTemplate extends React.Component<IAddLineToTemplateProps, IAddLineToTemplateState> {\n public state: IAddLineToTemplateState = {\n isOpen: false,\n query: '',\n products: [],\n content: CONTENT.Search,\n selectedProduct: null\n };\n\n public defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n public searchTextInput: React.RefObject<HTMLInputElement> = React.createRef();// @TODO public/private\n\n private readonly addLineButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n constructor(props: IAddLineToTemplateProps) {\n super(props);\n }\n\n public onComponentDidMount(): void {\n this.searchTextInput.current?.focus();\n }\n\n public onComponentDidUpdate(): void {\n this.searchTextInput.current?.focus();\n }\n\n @computed get showBackArrow(): boolean {\n return this.state.content === CONTENT.ProductConfiguration;\n }\n\n public shouldComponentUpdate(nextProps: IAddLineToTemplateProps,\n nextState: IAddLineToTemplateState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const {\n resources: { addLineModalLinkText, backToResultsText }\n } = this.props;\n\n const modalProps = {\n ...this.props,\n className: 'msc-add-line-to-template',\n toggle: this._toggleModalHandler,\n isOpen: this.state.isOpen,\n ariaLabel: addLineModalLinkText\n };\n\n return (\n <>\n <Modal {...modalProps}>\n <ModalHeader toggle={this._toggleModalHandler}>\n {this.showBackArrow && <button\n type='button'\n className='msc-modal__back-button'\n aria-label={backToResultsText}\n onClick={this._onBackButtonClickHandler}\n />}\n {addLineModalLinkText}\n </ModalHeader>\n {this._renderContent()}\n </Modal>\n <button\n type='button'\n className='msc-add-line-to-template__button msc-btn'\n aria-label={addLineModalLinkText}\n onClick={this._toggleModalHandler}\n ref={this.addLineButtonRef}>\n <span />\n {addLineModalLinkText}\n </button>\n </>\n );\n }\n\n private readonly _renderSearchForm = () => {\n const {\n resources: { searchButtonAriaLabel, searchModalPlaceholderText }\n } = this.props;\n\n return (\n <form\n className='msc-add-line-to-template__search-form'\n aria-label={searchButtonAriaLabel}\n name='add-line-to-template-search-form'\n role='form'\n autoComplete='off'\n onSubmit={this._onSearchSubmit}\n >\n <input\n type='text'\n autoFocus\n aria-label={searchModalPlaceholderText}\n className='msc-form-control msc-add-line-to-template__search-input'\n placeholder={searchModalPlaceholderText}\n value={this.state.query}\n onChange={this._onInputChange}\n ref={this.searchTextInput}\n maxLength={200}\n />\n <button\n className='msc-add-line-to-template__search-button'\n aria-label={searchButtonAriaLabel}\n color='primary'\n />\n </form>\n );\n };\n\n private readonly _onSearchSubmit = (event: React.FormEvent): void => {\n event.preventDefault();\n\n const query = get(this, 'searchTextInput.current.value', null);\n\n if (!query) {\n return;\n }\n\n this.setState({\n content: CONTENT.Loading\n });\n\n this._getSearchResults(query)\n .then(result => {\n if (result.length === 0) {\n this.setState({\n products: result,\n content: CONTENT.NotFound\n });\n } else {\n this.setState({\n products: result,\n content: CONTENT.ProductList\n });\n }\n })\n .catch(error => {\n this.setState({\n content: CONTENT.Error\n });\n });\n };\n\n private readonly _onQuantityChangeHandler = (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n selectedQuantity: +event.target.value\n });\n };\n\n private readonly _onSelectItem = async (product: ProductSearchResult): Promise<ProductDimensionFull[]> => {\n const {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n } = this.props.context;\n const varianteInput = new SelectedVariantInput(product.RecordId, channelId, [], undefined,\n this.props.context.request);\n const productVariant = await getSelectedVariant(varianteInput, actionContext);\n\n if (!productVariant) {\n this.props.context.telemetry.error('Error retrieving product variant');\n return Promise.resolve([]);\n }\n\n const dimensions = await this._getProductDimensions(product as SimpleProduct);\n\n this.setState({\n selectedProductDimensions: dimensions,\n content: CONTENT.ProductConfiguration,\n selectedProduct: productVariant\n });\n\n return dimensions;\n };\n\n private readonly _onInputChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n this.setState({\n query: event.target.value\n });\n };\n\n private readonly _onBackButtonClickHandler = (): void => {\n this.setState({\n content: CONTENT.ProductList\n });\n };\n\n private readonly _highlightSearchTerm = (name: string) => {\n const parsedName = name && unescape(name.replace(new RegExp(this.state.query, 'i'), '<span>$&</span>'));\n\n return <div className='msc-add-line-to-template__product__name' dangerouslySetInnerHTML={{ __html: parsedName || '' }} />;\n };\n\n private readonly _resultCountText = (): string => {\n return this.props.resources.searchResultsCountVerbage\n .replace('{count}', this.state.products.length.toString())\n .replace('{subject}', `${this.props.resources.searchResultsCountSubject}${(this.state.products.length > 1 ? 's' : '')}`);\n };\n\n private _renderContent(): React.ReactNode | null {\n switch (this.state.content) {\n case CONTENT.ProductConfiguration:\n const { selectedProduct, selectedProductDimensions } = this.state;\n const viewProps = {\n ...this.props,\n imageSettings: this.props.imageSettings || this.defaultImageSettings,\n product: selectedProduct!,\n dimensions: selectedProductDimensions!,\n addToTemplateHandler: this._addItemToTemplateHandler,\n onQuantityChangeHandler: this._onQuantityChangeHandler,\n highlightSearchTerm: this._highlightSearchTerm,\n searchForm: this._renderSearchForm()\n };\n\n return <ProductConfiguration {...viewProps} />;\n\n case CONTENT.ProductList:\n const productProps = {\n ...this.props,\n imageSettings: this.props.imageSettings || this.defaultImageSettings,\n clickHandler: this._onSelectItem,\n products: this.state.products,\n highlightSearchTerm: this._highlightSearchTerm,\n searchForm: this._renderSearchForm(),\n renderResultCountText: this._resultCountText\n };\n\n return (\n <ModalBody>\n <ProductList {...productProps} />\n </ModalBody>\n );\n\n case CONTENT.Loading:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n <Spinner className='msc-add-line-to-template' msg={this.props.resources.progressNotificationText} />\n </ModalBody>\n );\n\n case CONTENT.NotFound:\n const { notFoundSearchErrorNotice, notFoundSearchErrorRedediation } = this.props.resources;\n\n return (\n <ModalBody>\n <p className='msc-add-line-to-template__search-result-count'>\n {this._resultCountText()}\n </p>\n {this._renderSearchForm()}\n <NotFoundComponent error={notFoundSearchErrorNotice} msg={notFoundSearchErrorRedediation} />\n </ModalBody>\n );\n\n case CONTENT.Error:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n <div className='msc-alert-danger' aria-live='assertive'>\n {this.props.resources.searchErrorMessage}\n </div>\n </ModalBody>\n );\n\n default:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n </ModalBody>\n );\n }\n }\n\n private readonly _addItemToTemplateHandler = async (config: IProductConfigurationState): Promise<ProductListLine> => {\n const { orderTemplateId, context: { actionContext } } = this.props;\n const input = new AddItemToOrderTemplateInput(\n orderTemplateId,\n config.product.RecordId,\n config.quantity,\n config.product.DefaultUnitOfMeasure || 'ea'\n );\n\n const result = await addItemToOrderTemplate(input, actionContext);\n\n this.setState({\n reloadPage: true\n });\n\n return result;\n };\n\n private _getSearchResults(searchText: string): Promise<ProductSearchResult[]> {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const searchCriteriaInput: ProductSearchCriteria = {};\n\n searchCriteriaInput.Context = {\n ChannelId: channelId,\n CatalogId: getCatalogId(this.props.context.request)\n };\n searchCriteriaInput.IncludeAttributes = true;\n searchCriteriaInput.SearchCondition = searchText;\n\n return searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\n }\n\n private async _getProductDimensions(product: SimpleProduct): Promise<ProductDimensionFull[]> {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const id = product.MasterProductId ? product.MasterProductId : product.RecordId;\n\n return getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(id, channelId, [],\n this.props.context.request),\n actionContext\n );\n }\n\n private readonly _toggleModalHandler = () => {\n\n if (this.state.isOpen) {\n this.addLineButtonRef.current!.focus();\n }\n\n this.setState({\n isOpen: !this.state.isOpen,\n content: CONTENT.Search\n });\n\n if (this.state.reloadPage) {\n window.location.reload();\n this.setState({\n reloadPage: false\n });\n }\n };\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\ninterface IDropdownState {\n\n /**\n * @friendlyName selectedIndex\n * @description Selected index.\n */\n selectedIndex: string;\n}\n\nexport interface IDropdownProps {\n dropdownId: number;\n dropdownName: string;\n dropdownList: IDropdownItemProps[];\n telemetryContent?: ITelemetryContent;\n onChange?(selection: IDropdownOnSelection): void;\n}\n\nexport interface IDropdownItemProps {\n value: string;\n id: number;\n}\n\nexport interface IDropdownOnSelection {\n dropdownId: number;\n selectId: string;\n selectedValue: string;\n}\n\n/**\n *\n * DropDown component.\n * @extends {React.PureComponent<IDropdownProps, IDropdownState>}\n */\nexport class Dropdown extends React.PureComponent<IDropdownProps, IDropdownState> {\n private readonly selectMenu: React.RefObject<HTMLSelectElement> = React.createRef<HTMLSelectElement>();\n\n constructor(props: IDropdownProps, state: IDropdownState) {\n super(props);\n this.state = {\n selectedIndex: ''\n };\n }\n\n public componentDidMount(): void {\n if (this.selectMenu.current) {\n this.selectMenu.current.selectedIndex = 0;\n }\n }\n\n public render(): JSX.Element {\n const { dropdownId, dropdownList, dropdownName } = this.props;\n\n return (\n <select\n id={`msc-dropdown__entry-${dropdownId}`}\n ref={this.selectMenu}\n aria-label={dropdownName}\n className='msc-dropdown__select'\n onChange={this._onChanged}\n >\n {dropdownList.map((item: IDropdownItemProps) => (item &&\n <option\n value={item.id}\n key={item.id}\n selected={+this.state.selectedIndex === +item.id}\n aria-selected={+this.state.selectedIndex === +item.id}\n >\n {item.value}\n </option>\n ))}\n </select>\n );\n }\n\n private readonly _onChanged = (event: React.ChangeEvent<HTMLSelectElement>): void => {\n this.setState({ selectedIndex: event.target.value });\n\n if (this.props.onChange) {\n this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: event.target.value,\n selectedValue: event.target.innerText\n });\n }\n };\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport const NotFoundComponent = (props: { error: string; msg: string }) => (\n <>\n <div className='msc-add-line-to-template__not-found__icon' />\n <div className='msc-add-line-to-template__not-found__msg'>\n {props.error}\n </div>\n <div className='msc-add-line-to-template__not-found__remediation-instructions'>\n {props.msg}\n </div>\n </>\n);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { debounce } from 'lodash';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\ninterface IQuantityProps {\n min?: number;\n max: number;\n currentCount?: number;\n disabled?: boolean;\n incrementGlyphClass?: string;\n decrementGlyphClass?: string;\n decrementButtonAriaLabel?: string;\n incrementButtonAriaLabel?: string;\n inputQuantityAriaLabel?: string;\n id?: string;\n onChange?(newValue: number): void;\n}\n\ninterface IQuantityState {\n currentInput: number;\n}\n\n/**\n * Quantity Component - This component is used to add or remove quantity.\n */\n@observer\nexport default class OrderTemplateQuantity extends React.PureComponent<IQuantityProps, IQuantityState> {\n public static defaultProps: Partial<IQuantityProps> = {\n min: 1,\n decrementGlyphClass: 'fas fa-minus',\n incrementGlyphClass: 'fas fa-plus'\n };\n\n private readonly inputRef: React.RefObject<HTMLInputElement> = React.createRef<HTMLInputElement>();\n\n constructor(props: IQuantityProps) {\n super(props);\n this.state = { currentInput: props.currentCount || 1 };\n this._handleChange = this._handleChange.bind(this);\n\n reaction(\n () => this.props.currentCount,\n () => {\n this.setState({ currentInput: this.props.currentCount || 1 });\n }\n );\n }\n\n public render(): JSX.Element {\n const glyphMinusClassName: string = `${this.props.decrementGlyphClass!} quantity__controls-glyph`;\n const glyphPlusClassName: string = `${this.props.incrementGlyphClass!} quantity__controls-glyph`;\n const disabled = this.props.currentCount === this.props.min;\n const incDisabled = this.props.currentCount === this.props.max;\n const currentValue = this.state.currentInput;\n let extraClass = '';\n if (disabled) {\n // The quantity has reached its boundaries (max or min)\n extraClass = 'disabled';\n\n } else if (this.props.disabled) {\n // This.props.disabled shows if the state is not succeded yet\n extraClass = 'transition';\n }\n const getChangeHandler = (amount: number) => () => {\n this._onIncrementalChange(amount);\n };\n\n return (\n <div className='quantity'/* Id={this.props.id}*/>\n <button\n disabled={this.props.disabled || disabled}\n title={disabled ? '' : this.props.decrementButtonAriaLabel}\n className={`decrement quantity__controls ${extraClass}`}\n onClick={getChangeHandler(-1)}\n aria-hidden\n aria-label={`${this.props.decrementButtonAriaLabel}`}\n tabIndex={-1}\n color='secondary'\n >\n <span className={glyphMinusClassName} />\n </button>\n <input\n type='number'\n className='quantity-input'\n pattern='[0-9]*'\n value={currentValue}\n onChange={this._handleChange}\n onBlur={this._validateMin}\n aria-live='polite'\n aria-label={`${this.props.inputQuantityAriaLabel}`}\n role='spinbutton'\n aria-valuemin={1}\n aria-valuemax={this.props.max}\n aria-valuenow={currentValue}\n ref={this.inputRef}\n disabled={this.props.disabled}\n />\n <button\n disabled={this.props.disabled || incDisabled}\n title={incDisabled ? '' : this.props.incrementButtonAriaLabel}\n className={`increment quantity__controls ${incDisabled ? 'disabled' : ''}`}\n onClick={getChangeHandler(1)}\n aria-hidden\n aria-label={`${this.props.incrementButtonAriaLabel}`}\n tabIndex={-1}\n color='secondary'\n >\n <span className={glyphPlusClassName} />\n </button>\n </div>\n );\n }\n\n private _onIncrementalChange(amount: number): void {\n const updatedQuantity = this.state.currentInput + amount;\n\n if (updatedQuantity >= 1 && updatedQuantity <= this.props.max) {\n this.props.onChange && this.props.onChange(updatedQuantity);\n }\n }\n\n private _handleChange(e: React.ChangeEvent<HTMLInputElement>): void {\n const currentValue = Number.parseInt((e.target.value), 10);\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n const inputElement = this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\n\n if (currentValue > this.props.max) {\n this.setState(\n { currentInput: this.props.max }\n );\n } else {\n this.setState(\n { currentInput: currentValue },\n () => {\n debounce(\n () => {\n if (!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n },\n 200)();\n }\n );\n }\n }\n\n private readonly _validateMin = (): void => {\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n\n if (isNaN(this.state.currentInput) || (this.state.currentInput < minValue)) {\n this.props.onChange && this.props.onChange(minValue);\n } else {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n }\n };\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductDimensionValue, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getFallbackImageUrl,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getSelectedVariant,\n IProductInventoryInformation,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent, ModalBody, ModalFooter } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport OrderTemplateQuantity from '../common/order-template-quantity';\nimport { Dropdown, IAddLineToTemplateProps, IAddLineToTemplateResources, IDropdownItemProps, IDropdownOnSelection } from '.';\n\nexport interface IProductCnnfigurationProps extends IAddLineToTemplateProps {\n product: SimpleProduct;\n dimensions: ProductDimensionFull[];\n imageSettings: IImageSettings;\n telemetryContent?: ITelemetryContent;\n searchForm: React.ReactNode;\n addToTemplateHandler(params: IProductConfigurationState): Promise<ProductListLine>;\n highlightSearchTerm(name: string): React.ReactNode;\n}\n\nexport interface IProductConfigurationState {\n quantity: number;\n unitPrice: number;\n totalPrice: number;\n product: SimpleProduct;\n dimensions: ProductDimensionFull[];\n selectedDimensions: {};\n productAvailableQuantity?: IProductInventoryInformation;\n buttonDisabled: boolean;\n showAddConfirmation: boolean;\n errorMessage?: string;\n isBusy: boolean;\n errors: { dimension?: string[]; add?: string };\n}\n\n/**\n * Configure selected product for addition to order template.\n */\nexport class ProductConfiguration extends React.Component<IProductCnnfigurationProps, IProductConfigurationState> {\n private selectedDimensions: {} = {};\n\n constructor(props: IProductCnnfigurationProps) {\n super(props);\n\n this.state = {\n quantity: 1,\n unitPrice: props.product.Price,\n totalPrice: props.product.Price,\n product: props.product,\n dimensions: props.dimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\n selectedDimensions: {},\n buttonDisabled: false,\n showAddConfirmation: false\n } as IProductConfigurationState;\n }\n\n public shouldComponentUpdate(nextProps: IProductCnnfigurationProps,\n nextState: IProductConfigurationState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const {\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: { gridSettings }\n },\n resources: {\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n totalPriceLabel\n },\n imageSettings,\n highlightSearchTerm\n } = this.props;\n const { buttonDisabled, product, quantity, unitPrice, totalPrice, showAddConfirmation, errors } = this.state;\n\n return (\n <>\n <ModalBody>\n {this.props.searchForm}\n <div className='msc-add-line-to-template__product-config'>\n <div className='msc-add-line-to-template__product__positioning-container-2'>\n <div className='msc-add-line-to-template__product__positioning-container-1'>\n <Image\n altText={product.Name ?? 'image'}\n requestContext={this.props.context.actionContext.requestContext}\n src={product?.PrimaryImageUrl ?? ''}\n fallBackSrc={getFallbackImageUrl(product?.ItemId, apiSettings) ?? ''}\n className='thumbnail'\n imageSettings={imageSettings}\n gridSettings={gridSettings!}\n loadFailureBehavior='empty'\n />\n <div className='msc-add-line-to-template__product__attributes'>\n <div className='msc-add-line-to-template__product__id'>\n {product?.ItemId}\n </div>\n {highlightSearchTerm(product?.Name ?? '')}\n <div className='msc-add-line-to-template__product__unit-price'>\n {addLineProductUnitPricePrefix}\n {' '}\n {this._formatPrice(unitPrice)}\n </div>\n <div className='msc-add-line-to-template__product__uom'>\n {addLineProductUnitOfMeasurePrefix}\n {' '}\n {product?.DefaultUnitOfMeasure}\n </div>\n </div>\n </div>\n <div className='msc-add-line-to-template__product-config__dimensions'>\n {this._getDimensionsNodes()}\n </div>\n </div>\n <div className='quantity-container'>\n <div>\n {quantitySelectLabel}\n </div>\n <OrderTemplateQuantity\n id='msc-add-line-to-template__product-config__quantity'\n currentCount={quantity}\n onChange={this._onQuantityChange}\n inputQuantityAriaLabel='Press to increment quantity by 1'\n max={10_000_000}\n decrementButtonAriaLabel={decrementButtonAriaLabel}\n incrementButtonAriaLabel={incrementButtonAriaLabel}\n />\n </div>\n </div>\n <div className='msc-add-line-to-template__product__total-price'>\n {totalPriceLabel}\n {' '}\n {this._formatPrice(totalPrice)}\n </div>\n </ModalBody>\n <ModalFooter>\n {showAddConfirmation && <div\n className='msc-add-line-to-template__add-success msc-alert-success msc-alert'\n aria-live='assertive'\n role='alert'>\n <span aria-hidden='true' />\n {this._getConfirmationMessage()}\n </div>}\n {errors?.add && <div className='msc-add-line-to-template__add-error msc-alert-danger msc-alert'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n {errors.add}\n </div>}\n <Button\n className={classnames('msc-add-line-to-template__add-configured-product-button', { 'is-busy': this.state.isBusy })}\n aria-label={addItemToTemplateText}\n onClick={this._addToTemplateHandler}\n disabled={buttonDisabled}\n >\n {addItemToTemplateText}\n </Button>\n </ModalFooter>\n </>\n );\n }\n\n private _getConfirmationMessage(): string {\n const selectedDimensionNames = this.state.dimensions.map(dimension => {\n let variant = dimension.DimensionValues?.find(value => value.RecordId === this.selectedDimensions[dimension.DimensionTypeValue])?.Value;\n if (dimension.DimensionTypeValue === 3) {\n variant = `size ${variant}`;\n }\n return variant;\n }).filter(value => value);\n\n return this.props.resources.addToTemplateConfirmation\n .replace('{count}', this.state.quantity.toString())\n .replace('{productAndDimensions}', `${this.state.product.Name}, ${Object.values(selectedDimensionNames).join(', ')}`);\n\n }\n\n private _getDimensionsNodes(): React.ReactElement[] {\n const { dimensions } = this.state;\n const { resources } = this.props;\n\n return dimensions?.map((dimension: ProductDimensionFull) => {\n const { DimensionValues, DimensionTypeValue } = dimension;\n const mapDimensions = (value: ProductDimensionValue): IDropdownItemProps => ({\n id: value.RecordId,\n value: value.Value || ''\n });\n const dimensionName = this._getDropdownName(DimensionTypeValue, resources);\n const dropdownList: IDropdownItemProps[] = DimensionValues ? DimensionValues.map<IDropdownItemProps>(mapDimensions) : [];\n dropdownList.unshift({ id: 0, value: `Choose a ${dimensionName}` });\n\n return (\n <div key={DimensionTypeValue}>\n <div>\n {dimensionName}\n </div>\n {this.state.errors?.dimension?.includes(DimensionTypeValue.toString()) && (\n <Alert color='danger' assertive aria-label={this._getDimensionsError(dimensionName)}>\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>\n {this._getDimensionsError(dimensionName)}\n </span>\n </div>\n </Alert>\n )}\n <Dropdown\n dropdownId={DimensionTypeValue}\n dropdownName={this._getDropdownName(DimensionTypeValue, resources)}\n dropdownList={dropdownList}\n onChange={this._onDimensionChanged}\n />\n </div>\n );\n });\n }\n\n private readonly _getDimensionsError = (dimensionName: string) => this.props.resources.dimensionMissingError.replace(/{dimensionName}/g, dimensionName);\n\n private readonly _addToTemplateHandler = async (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n // Hide confirmation of previous addition when adding multiple items\n this.setState({\n isBusy: true,\n showAddConfirmation: false,\n errors: { ...this.state.errors, add: undefined }\n });\n\n const missingDimensions = this.state.dimensions.map(dimension => dimension.DimensionTypeValue.toString()).filter(type => !this.selectedDimensions[type]);\n\n this.setState({\n errors: { dimension: missingDimensions }\n });\n if (missingDimensions.length > 0) {\n this.setState({\n isBusy: false\n });\n return;\n }\n\n this.props.addToTemplateHandler({ ...this.state })\n .then(status => {\n // Validate against the existance of a ProductListId\n if (status.ProductListId) {\n this.setState({\n isBusy: false,\n showAddConfirmation: true\n });\n }\n })\n .catch(error => {\n const { addToTemplateDuplicateError, addToTemplateGenericError } = this.props.resources;\n let errorMessage;\n\n if (error.error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n errorMessage = addToTemplateDuplicateError;\n } else {\n errorMessage = addToTemplateGenericError;\n }\n\n this.setState({\n isBusy: false,\n errors: { ...this.state.errors, add: errorMessage }\n });\n this.props.context.telemetry.error('Error adding item to order template');\n });\n };\n\n private readonly _onQuantityChange = (newValue: number) => {\n this.setState({\n quantity: newValue,\n totalPrice: newValue * this.props.product.Price\n });\n };\n\n private readonly _updateDimensionValue = (productDimensionFull: ProductDimensionFull, newValueId: string | undefined): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n // Rehydrate the selected variants price, available dimensions & sizes\n private readonly _onDimensionChanged = async (selection: IDropdownOnSelection): Promise<void> => {\n const { product, dimensions, context } = this.props;\n const {\n actionContext,\n request: { apiSettings: { channelId } }\n } = context;\n\n // Remaining error notifications for missing dimensions\n const remainingDimensionsErrors = this.state.errors?.dimension?.filter(id => id !== selection.dropdownId.toString());\n\n this.setState({\n isBusy: false,\n showAddConfirmation: false,\n buttonDisabled: true,\n errors: { add: undefined, dimension: remainingDimensionsErrors }\n });\n\n // Update currently selected dimensions\n this.selectedDimensions[selection.dropdownId] = +selection.selectId;\n\n const mappedDimensions = dimensions?.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue: this._updateDimensionValue(dimension, this.selectedDimensions[dimension.DimensionTypeValue]) || dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n }).filter(dimension => {\n return dimension && dimension.DimensionValue;\n });\n\n const variantProduct = (await getSelectedVariant(\n new SelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId,\n mappedDimensions, undefined,\n this.props.context.request\n ),\n actionContext\n ));\n\n if (!variantProduct) {\n this.props.context.telemetry.error(`Error retrieving variant product for product ${product.MasterProductId ? product.MasterProductId : product.RecordId}`);\n return;\n }\n\n const dimensionInput = new GetDimensionsForSelectedVariantInput(\n variantProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n );\n const variantDimensions = await getDimensionsForSelectedVariant(dimensionInput, actionContext);\n\n if (!variantDimensions) {\n this.props.context.telemetry.error('Error retrieving dimensions for reconfigured product variant');\n this.setState({\n buttonDisabled: false\n });\n return;\n }\n\n const availabilityInput = new ProductAvailabilitiesForSelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId\n );\n\n // @TODO sync UX quantity w/ actual availability\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(availabilityInput, actionContext);\n const priceInput = new PriceForSelectedVariantInput(product.RecordId, channelId);\n const productPrice = await getPriceForSelectedVariant(priceInput, actionContext);\n\n if (!productPrice) {\n this.props.context.telemetry.error('Error retrieving price for reconfigured product variant');\n this.setState({\n buttonDisabled: false\n });\n return;\n }\n\n this.setState({\n buttonDisabled: false,\n productAvailableQuantity: newAvailableQuantity && newAvailableQuantity[0] || undefined,\n unitPrice: +(productPrice.BasePrice || product.Price),\n dimensions: variantDimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\n product: variantProduct\n });\n };\n\n private readonly _getDropdownName = (dimensionType: number, resources: IAddLineToTemplateResources): string => {\n switch (dimensionType) {\n case 1: // Color\n return resources.productDimensionTypeColor;\n case 2: // Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // Size\n return resources.productDimensionTypeSize;\n case 4: // Style\n return resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private _formatPrice(price: number): string {\n const {\n context: {\n cultureFormatter: {\n formatCurrency,\n\n // @ts-expect-error\n currencyCode\n }\n }\n } = this.props;\n\n return formatCurrency(price.toFixed(2), currencyCode);\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport { IAddLineToTemplateProps } from '.';\n\nexport interface IProductListProps extends IAddLineToTemplateProps {\n products: ProductSearchResult[];\n imageSettings: IImageSettings;\n searchForm: React.ReactNode;\n clickHandler(product: ProductSearchResult): Promise<ProductDimensionFull[]>;\n highlightSearchTerm(name: string): React.ReactNode;\n renderResultCountText(): string;\n}\n\nexport const ProductList = (props: IProductListProps) => {\n const {\n products,\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: {\n gridSettings\n },\n cultureFormatter: {\n formatCurrency,\n\n // @ts-expect-error\n currencyCode\n }\n },\n clickHandler,\n highlightSearchTerm,\n renderResultCountText,\n resources: { selectProductButtonText },\n imageSettings\n } = props;\n\n return (\n <>\n <p className='msc-add-line-to-template__search-result-count' aria-live='assertive'>\n {renderResultCountText()}\n </p>\n {props.searchForm}\n <div className='msc-add-line-to-template__product-list'>\n {products.map((product: ProductSearchResult, index: number) => {\n const { Price, ItemId, Name, PrimaryImageUrl } = product;\n const price = formatCurrency(Price.toFixed(2), currencyCode);\n const fallBackImg = getFallbackImageUrl(ItemId, apiSettings) ?? '';\n\n return (\n <div key={`product-${index}`} className='msc-add-line-to-template__product'>\n <div className='msc-add-line-to-template__product__positioning-container-1'>\n <Image\n altText={Name ?? 'image'}\n requestContext={props.context.actionContext.requestContext}\n src={PrimaryImageUrl ?? ''}\n fallBackSrc={fallBackImg}\n className='thumbnail'\n gridSettings={gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n <div className='msc-add-line-to-template__product__attributes' aria-live='polite'>\n <div className='msc-add-line-to-template__product__id'>\n {ItemId}\n </div>\n {highlightSearchTerm(Name ?? '')}\n </div>\n </div>\n <div className='msc-add-line-to-template__product__price-container'>\n <span>\n {price}\n </span>\n <ProductSelectButton product={product} buttonText={selectProductButtonText} clickHandler={clickHandler} />\n </div>\n </div>\n );\n })}\n </div>\n </>\n );\n};\n\ninterface IProductSelectButton {\n product: ProductSearchResult;\n buttonText: string;\n clickHandler(product: ProductSearchResult): Promise<ProductDimensionFull[]>;\n}\n\nconst ProductSelectButton = (props: IProductSelectButton) => {\n const [isBusy, setBusy] = useState(false);\n const { product, buttonText, clickHandler } = props;\n const getClickHandler = React.useCallback(async () => {\n setBusy(!isBusy);\n await clickHandler(product);\n setBusy(!isBusy);\n }, [clickHandler, isBusy, product]);\n\n return (\n <Button\n className={classnames('msc-add-line-to-template__product__select-button', { 'is-busy': isBusy })}\n aria-label={`${product.Name!} ${buttonText}`} // Announce as: 'Nooks surfboard' select product button\n onClick={getClickHandler}\n >\n {buttonText}\n </Button>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { AddOrderTemplateToCartComponent, ILinesAddedToCartDialogResources, IOrderTemplateNameDialogResources, RenameOrderTemplateComponent } from '@msdyn365-commerce/components';\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IOrderTemplateActionsData {\n orderTemplate: OrderTemplate;\n}\n\nexport interface IOrderTemplateActionsProps extends IComponentProps<IOrderTemplateActionsData> {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onRemoveTemplate(orderTemplateId: string): void;\n onRenameTemplate(orderTemplate: ProductList): Promise<void>;\n };\n renameOrderTemplateDialogStrings: IOrderTemplateNameDialogResources;\n resources: {\n addTemplateToBagButtonText: string;\n renameTemplateButtonText: string;\n deleteTemplateButtonText: string;\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n}\n\nexport interface IOrderTemplateActionsViewProps {\n addTemplateToBag: React.ReactNode;\n renameTemplate?: React.ReactNode;\n removeTemplate?: React.ReactNode;\n}\n\n/**\n * Remove Order Action.\n * @param props -Order template action props.\n * @returns Remove order template.\n */\nconst removeOrderActionHandler = (props: IOrderTemplateActionsProps) => () => {\n _removeOrderTemplate(props);\n};\n\nexport const OrderTemplateActionsView = (props: IOrderTemplateActionsProps): IOrderTemplateActionsViewProps => {\n const { resources } = props;\n const { deleteTemplateButtonText } = resources;\n\n return {\n addTemplateToBag: _getOrderTemplateAddToCartDialog(props),\n renameTemplate: _getOrderTemplateRenameControl(props),\n removeTemplate: (\n <Button className='ms-order-template-action-bar__delete-template-button' onClick={removeOrderActionHandler(props)}>\n {deleteTemplateButtonText}\n </Button>\n )\n };\n};\n\nconst _removeOrderTemplate = (props: IOrderTemplateActionsProps): void => {\n const { data: { orderTemplate }, handlers } = props;\n const { onRemoveTemplate } = handlers;\n\n if (onRemoveTemplate) {\n onRemoveTemplate(orderTemplate.productList.Id);\n }\n};\n\nconst _getOrderTemplateAddToCartDialog = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const { data: { orderTemplate }, typeName, id, context, telemetryContent, resources } = props;\n const {\n addTemplateToBagButtonText,\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n linesAddedToCartDialogResources\n } = resources;\n\n const dialogStrings = {\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n linesAddedToCartDialogResources\n };\n\n return (\n <AddOrderTemplateToCartComponent\n context={context}\n id={id}\n typeName={typeName}\n data={{ orderTemplate }}\n className=''\n addToCartText={addTemplateToBagButtonText}\n dialogStrings={dialogStrings}\n telemetryContent={telemetryContent}\n />\n );\n};\n\nconst _getOrderTemplateRenameControl = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const { renameOrderTemplateDialogStrings, resources, context, handlers } = props;\n return (\n <RenameOrderTemplateComponent\n onRenameTemplate={handlers.onRenameTemplate}\n className='msc-order-template-name-dialog'\n context={context}\n id={props.id}\n data={{ orderTemplate: props.data.orderTemplate.productList }}\n typeName={props.typeName}\n renameOrderTemplateDialogStrings={renameOrderTemplateDialogStrings}\n renameOrderTemplateButtonText={resources.renameTemplateButtonText}\n />\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\nimport OrderTemplateQuantity from './common/order-template-quantity';\n\nexport interface IOrderTemplateLineProps extends ProductListLine {\n orderTemplateLine: IOrderTemplateLineViewModel;\n productListLine: ProductListLine;\n price?: ProductPrice;\n context: ICoreContext;\n productUrl: string;\n imageSettings?: IImageSettings;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n quantity: number;\n isQuantityDisabledForUpdate?: boolean;\n handlers: {\n onAddToBag(product: SimpleProduct, quantity: number, itemKey: string): void;\n onRemoveItem(line: IOrderTemplateLineViewModel): void | undefined;\n onChangeQuantity(orderTemplateLineId: string, quantity: number, props?: IOrderTemplateLineProps): void;\n onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void;\n };\n resources: {\n selectOneRowText?: string;\n moreButtonText?: string;\n viewProductDetailsText?: string;\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n inputQuantityAriaLabel: string;\n removeFromOrderTemplateLinesText: string;\n addToBagButtonText: string;\n deleteButtonText: string;\n incrementButtonAriaLabel?: string;\n decrementButtonAriaLabel?: string;\n editOrderTemplateLineQuantityError?: string;\n };\n index: number;\n isMobile: boolean;\n productQuantityView?: React.ReactNode;\n addToBagButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n toggleDetailsDisplayed(props: IOrderTemplateLineProps): void;\n}\n\nexport interface IOrderTemplateLineViewProps {\n key?: string;\n productImage: React.ReactNode;\n productPrice?: React.ReactNode;\n addToBagButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productName?: string;\n productNumber?: React.ReactNode;\n productInfo?: React.ReactNode;\n productLabel?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n productQuantity?: number;\n productQuantityView?: React.ReactNode;\n productListId?: string;\n selectLine?: React.ReactNode;\n popUp?: JSX.Element;\n isMobile?: boolean;\n}\n\ninterface IEventHandlerFactory {\n getAddToBag(): (event: React.MouseEvent<HTMLElement>) => void;\n getRemoveItem(): (event: React.MouseEvent<HTMLElement>) => void;\n}\n\nconst OrderTemplateLineActions = (props: IOrderTemplateLineProps): IEventHandlerFactory => {\n const { orderTemplateLine, productListLine, quantity, handlers } = props;\n const { LineId } = productListLine;\n const { onAddToBag, onRemoveItem } = handlers;\n\n return {\n getAddToBag: () => (event: React.MouseEvent<HTMLElement>) => {\n LineId && orderTemplateLine.fullProduct && onAddToBag(orderTemplateLine.fullProduct.ProductDetails, quantity, LineId);\n },\n getRemoveItem: () => (event: React.MouseEvent<HTMLElement>) => LineId && onRemoveItem(props.orderTemplateLine)\n };\n};\n\ninterface IPopupProps extends IOrderTemplateLineProps {\n addButtonClassName: string;\n removeButtonClassName: string;\n}\n\nconst PopUp = (props: IPopupProps): JSX.Element | null => {\n const { addToBagButtonText, removeFromOrderTemplateLinesText, moreButtonText, viewProductDetailsText } = props.resources;\n const [showMobile, setShowMobile] = useState(false);\n const componentClassName = 'ms-table';\n\n const getViewHandler = () => (event: React.MouseEvent<HTMLElement>) => {\n props.toggleDetailsDisplayed(props);\n };\n\n const toggle = React.useCallback(() => {\n setShowMobile(!showMobile);\n }, [showMobile]);\n\n return (\n <div className={`${componentClassName}__row-links-minified`}>\n <Button\n className={`${componentClassName}__row-links-toggle`}\n aria-label={moreButtonText}\n data-type={props.index}\n onClick={toggle}\n />\n {showMobile &&\n <div className={`${componentClassName}__row-links`}>\n <Button\n className='ms-table__row-links-view'\n onClick={getViewHandler()}\n title={viewProductDetailsText}\n aria-label={viewProductDetailsText}\n >\n View\n </Button>\n {getActionButton(props.isMobile, props.removeButtonClassName,\n removeFromOrderTemplateLinesText, OrderTemplateLineActions(props).getRemoveItem())}\n {getActionButton(props.isMobile, props.addButtonClassName, addToBagButtonText, OrderTemplateLineActions(props).getAddToBag())}\n </div>}\n </div>\n );\n};\n\nconst getActionButton = (isMobile: boolean, className: string, buttonText: string, clickHandler: (event: React.MouseEvent<HTMLElement>) => void): React.ReactNode => (\n <Button\n aria-label={buttonText}\n className={className}\n onClick={clickHandler}\n title={buttonText}\n >\n {isMobile ? buttonText : ''}\n </Button>\n);\n\n/**\n * On Select line function.\n * @param orderTemplateLine -Order template line.\n * @param input -Order template line props.\n * @returns Set on select order template.\n */\nconst onSelectLineHandler = (\n orderTemplateLine: IOrderTemplateLineViewModel,\n input: IOrderTemplateLineProps) => (event: React.ChangeEvent<HTMLInputElement>) => {\n orderTemplateLine.isChecked = !orderTemplateLine.isChecked;\n\n input.handlers.onSelect(orderTemplateLine, event.target.checked);\n};\n\nexport const OrderTemplateLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | null => {\n const { orderTemplateLine, productListLine, price, context, imageSettings, quantity, resources, isMobile } = input;\n const product = orderTemplateLine.fullProduct;\n const { LineId, UnitOfMeasure } = productListLine;\n const { removeFromOrderTemplateLinesText, addToBagButtonText, selectOneRowText } = resources;\n if (!product) {\n return null;\n }\n\n const { ItemId, Name, PrimaryImageUrl } = product.ProductDetails;\n const fallbackImage = getFallbackImageUrl(ItemId, context.actionContext.requestContext.apiSettings);\n const addButtonClassName = input.isMobile ? 'ms-table__row-links-add' : 'ms-order-template-table-line__product-add-button';\n const removeButtonClassName = input.isMobile ? 'ms-table__row-links-delete' : 'ms-order-template-table-line__product-remove-button';\n\n return {\n isMobile,\n selectLine: (\n <label className='checkbox-container'>\n <input\n aria-label={selectOneRowText} className='checkbox-input'\n type='checkbox' checked={orderTemplateLine.isChecked} aria-checked={orderTemplateLine.isChecked}\n onChange={onSelectLineHandler(orderTemplateLine, input)} />\n <span className='checkmark' />\n </label>\n ),\n key: LineId!,\n productImage: PrimaryImageUrl && Name && (\n _renderProductImage('ms-order-template-table-line__product-image', context, product.ProductDetails.Name!, PrimaryImageUrl, fallbackImage, imageSettings)\n ),\n productInfo: renderProductInfo(input),\n productPrice: price && _renderPrice(input),\n productNumber: product && <div className='ms-order-template-table-line__product-number'>\n {ItemId}\n </div>,\n productUnitOfMeasure: price ? (\n <div className='ms-order-template-table-line__product-unit-of-measure'>\n {UnitOfMeasure || price.UnitOfMeasure}\n </div>\n ) : (\n undefined\n ),\n productListId: LineId!,\n removeButton: getActionButton(input.isMobile, removeButtonClassName, removeFromOrderTemplateLinesText, OrderTemplateLineActions(input).getRemoveItem()),\n productQuantityView: <div>\n {_generateQuantity(input, LineId!)}\n </div>,\n productQuantity: quantity,\n addToBagButton: getActionButton(input.isMobile, addButtonClassName, addToBagButtonText, OrderTemplateLineActions(input).getAddToBag()),\n popUp: (\n <PopUp\n {...input}\n addButtonClassName={addButtonClassName}\n removeButtonClassName={removeButtonClassName}\n />\n )\n };\n};\n\nexport const OrderTemplateMobileLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | undefined => {\n const { orderTemplateLine, productListLine, price, context, imageSettings } = input;\n const product = orderTemplateLine.fullProduct;\n const { LineId, UnitOfMeasure } = productListLine;\n if (!product) {\n return;\n }\n const { ItemId, Name, PrimaryImageUrl } = product.ProductDetails;\n const fallbackImage = getFallbackImageUrl(ItemId, context.actionContext.requestContext.apiSettings);\n\n return {\n productImage: PrimaryImageUrl && Name && (\n _renderProductImage('thumbnail', context, product.ProductDetails.Name!, PrimaryImageUrl, fallbackImage, imageSettings)\n ),\n productInfo: renderProductInfo(input),\n productPrice: price && _renderPrice(input),\n productNumber: ItemId,\n productUnitOfMeasure: UnitOfMeasure || price?.UnitOfMeasure,\n productQuantityView: _generateQuantity(input, LineId!)\n };\n};\n\nexport interface IOrderTemplateProductQuantityViewProps {\n ContainerProps: INodeProps;\n input: React.ReactNode;\n}\n\n/**\n * On Change function.\n * @param onChangeQuantity -On change quantity function.\n * @param itemKey -String.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onChangeHandler = (onChangeQuantity: (orderTemplateLineId: string,\n quantity: number, props?: IOrderTemplateLineProps | undefined) => void,\nitemKey: string, props: IOrderTemplateLineProps) => (newValue: number) => {\n if (onChangeQuantity) {\n onChangeQuantity(itemKey, newValue, props);\n }\n};\n\nconst _generateQuantity = (props: IOrderTemplateLineProps, itemKey: string): React.ReactNode => {\n const { handlers, resources, quantity } = props;\n const { onChangeQuantity } = handlers;\n return (\n <OrderTemplateQuantity\n currentCount={quantity}\n onChange={onChangeHandler(onChangeQuantity, itemKey, props)}\n max={999_999_999}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n disabled={props.isQuantityDisabledForUpdate}\n />\n );\n};\n\nexport const _renderProductImage = (\n className: string,\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n if (image) {\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className={className}\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n tabIndex={0}\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IOrderTemplateLineProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-order-template-table-line__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IOrderTemplateLineProps): (string | undefined)[] => {\n const { orderTemplateLine } = props;\n\n if (!orderTemplateLine.fullProduct || !orderTemplateLine.fullProduct.ProductDetails.Dimensions) {\n return [];\n }\n\n return orderTemplateLine.fullProduct.ProductDetails.Dimensions.map((dimension) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n return dimension.DimensionValue.Value;\n });\n};\n\nexport const renderProductInfo = (props: IOrderTemplateLineProps): React.ReactNode | undefined => {\n const { orderTemplateLine, productUrl } = props;\n const name = orderTemplateLine.fullProduct?.ProductDetails.Name;\n\n const dimensions = _renderProductDimensions(props);\n if (!orderTemplateLine.fullProduct) {\n return [];\n }\n\n const productName = productUrl ? (\n <a className='ms-order-template-table-line__product-info-name' href={productUrl}>\n {name}\n </a>\n ) : (\n <div className='ms-order-template-table-line__product-info-name'>\n {name}\n </div>\n );\n\n const dimensionsLine: string = dimensions.join(', ');\n\n return (\n <div className='ms-order-template-table-line__product-info'>\n <div className='ms-order-template-table-line__product-info-name'>\n {productName}\n </div>\n <div className='ms-order-template-table-line__product-info-dimension'>\n {dimensionsLine}\n </div>\n </div>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { orderTemplateLinesStatus } from '../order-template';\n\nexport interface IOrderTemplateLinesStatusMessageProps {\n className?: string;\n errorType: orderTemplateLinesStatus;\n text?: string;\n}\n\nexport const OrderTemplateLinesStatusMessage: React.FC<IOrderTemplateLinesStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return (\n <p className={classnames('ms-order-template-lines__message-empty', className)}>\n { text }\n </p>\n );\n case 'FAILED':\n return (\n <p className={classnames('ms-order-template-lines__message-failed', className)}>\n { text }\n </p>\n );\n case 'LOADING':\n default:\n return (\n <p className='ms-order-template-lines__message-waiting'>\n { text }\n </p>\n );\n }\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\n\nexport interface IOrderTemplateTableHeadingProps {\n selectAllRowsText?: string;\n productNumber: string;\n productName: string;\n productUnitPrice: string;\n productUOM: string;\n productQuantity: string;\n productActions: string;\n lines: IOrderTemplateLineViewModel[];\n isMobile: boolean;\n clickHandler(isChecked: boolean): void;\n}\n\n/**\n * Order Template's table state.\n */\nexport interface IOrderTemplateTableHeadingState {\n isChecked: boolean;\n}\n\nexport interface IOrderTemplateTableShortHeading {\n productNumber: string;\n productActions: string;\n}\n\n/**\n * Order Template's table heading.\n */\nexport class OrderTemplateTableHeading extends React.PureComponent<IOrderTemplateTableHeadingProps> {\n public state: IOrderTemplateTableHeadingState = {\n isChecked: false\n };\n\n private readonly componentClassName: string = 'ms-table';\n\n public static getDerivedStateFromProps(props: IOrderTemplateTableHeadingProps, state: IOrderTemplateTableHeadingState): IOrderTemplateTableHeadingState {\n const checkedLines = props.lines.filter(line => !line.isChecked).length;\n let nextState = { ...state };\n nextState = { isChecked: checkedLines === 0 };\n return nextState;\n }\n\n public getOnChange = () => (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n isChecked: this.state.isChecked\n }, () => {\n this.props.clickHandler(!this.state.isChecked);\n });\n };\n\n public render(): JSX.Element {\n return (\n <thead>\n <tr className={`${this.componentClassName}__heading-row`}>\n <th scope='col' aria-label={this.props.selectAllRowsText}>\n <label className='checkbox-container'>\n <input\n aria-label={this.props.selectAllRowsText} className='checkbox-input'\n type='checkbox' aria-checked={this.state.isChecked} checked={this.state.isChecked}\n onChange={this.getOnChange()} />\n <span className='checkmark' />\n </label>\n </th>\n <td>\n  \n </td>\n <th scope='col'>\n {this.props.productNumber}\n </th>\n {!this.props.isMobile ? <th scope='col'>\n {this.props.productName}\n </th> : null}\n {!this.props.isMobile ? <th scope='col'>\n {this.props.productUnitPrice}\n </th> : null}\n {!this.props.isMobile ? <th scope='col'>\n {this.props.productUOM}\n </th> : null}\n {!this.props.isMobile ? <th scope='col'>\n {this.props.productQuantity}\n </th> : null}\n {!this.props.isMobile ? <th scope='col'>\n {this.props.productActions}\n </th> : <td />}\n </tr>\n </thead>\n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\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","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport * from './choice-summary';\nexport * from './choice-summary.props';\nexport * from './error-message';\nexport * from './feature-search-result-item';\nexport * from './link';\nexport * from './modal';\nexport * from './product-search-result-items';\nexport * from './range-refine-item';\nexport * from './refine-item';\nexport * from './refine-item.props.common';\nexport * from './refine-item-toggle-notification';\nexport * from './refine-submenu';\nexport * from './separator';\nexport * from './title';\nexport * from './utilities';\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartIconViewProps } from './cart-icon';\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\n\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n return cartLines.map((cartLine, index) => {\n return (\n <Node {...props.miniCartItemWrapper} key={index}>\n {cartLine.cartline}\n {cartLine.storeLocation}\n {cartLine.remove}\n </Node>\n );\n });\n};\n\nconst CartIconView: React.FC<ICartIconViewProps> = (props: ICartIconViewProps) => (\n <Node {...props.miniCartWrapper} {...props.renderModuleAttributes(props)}>\n {props.cartIcon}\n {props.FlyoutContainer ? (\n <Node {...props.FlyoutContainer}>\n {props.flyoutTitle}\n <Node {...props.CartlinesWrapper}>\n {_renderCartlines(props.cartlines, props)}\n </Node>\n {props.totalPrice}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.goToCartButton}\n </Node>\n ) : false }\n </Node>\n);\n\nexport default CartIconView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, ChannelDeliveryOptionConfiguration, DiscountLine, DiscountLineType,\n ProductCatalog,\n ProductDimensionType, SalesLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\n\n/**\n * ICartlineResourceString: Interface for specifying the\n * resource strings that the component needs.\n */\nexport interface ICartlineResourceString {\n\n /**\n * Display string for discount label.\n */\n discountStringText: string;\n\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n\n /**\n * Display string for quantity label.\n */\n quantityDisplayString: string;\n\n /**\n * Display string for quantity label.\n */\n inputQuantityAriaLabel: string;\n\n /**\n * Aria label for the decrement button in quantity component.\n */\n decrementButtonAriaLabel: string;\n\n /**\n * Aria label for the increment button in quantity component.\n */\n incrementButtonAriaLabel: string;\n\n /**\n * Original text screenreader.\n */\n originalPriceText: string;\n\n /**\n * Current text screenreader.\n */\n currentPriceText: string;\n\n /**\n * Shipping Charges Text.\n */\n shippingChargesText: string;\n\n /**\n * Price Editor Charges Text.\n */\n priceEditorResources?: ICartLinePriceEditorResources;\n}\n\n/**\n * Represents cart line data interface.\n */\ninterface ICartLineData {\n cartLine: CartLine | SalesLine;\n cartState?: ICartState;\n product?: SimpleProduct;\n catalogs?: ProductCatalog[];\n}\n\n/**\n * ICartLineProps: The props required to render cartLineitem.\n */\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\n\n /**\n * The flag to change the quantity component from interactible to static.\n */\n disableQuantityInteractivity?: boolean;\n\n /**\n * The primary image url.\n */\n primaryImageUrl?: string;\n\n /**\n * The product url.\n */\n productUrl?: string;\n\n /**\n * GridSettings for the product image in cartLine.\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartLine.\n */\n imageSettings: IImageSettings;\n\n /**\n * Boolean flag to indicate if the item is out of stock.\n */\n isOutOfStock?: boolean;\n\n /**\n * Flag to make quantity section editable.\n */\n isQuantityEditable?: boolean;\n\n /**\n * Max quantity for line item.\n */\n maxQuantity?: number;\n\n /**\n * Current quantity for line item.\n */\n currentQuantity?: number;\n\n /**\n * Resource string for the component.\n */\n resources: ICartlineResourceString;\n\n /**\n * SalesLine flag.\n */\n isSalesLine?: boolean;\n\n /**\n * Error message to show in place of quantity.\n */\n errorMessage?: string;\n\n /**\n * Inventory information label.\n */\n inventoryInformationLabel?: string;\n\n /**\n * Inventory information class name.\n */\n inventoryLabelClassName?: string;\n\n /**\n * Flag to show/hide shipping charges for line items.\n */\n showShippingChargesForLineItems?: boolean;\n\n /**\n * Boolean flag to indicate if cart state status is ready.\n */\n isCartStateReady?: boolean;\n\n /**\n * Chanel Delivery Option configuration is from api.\n */\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n /**\n * The telemetry content.\n */\n telemetryContent?: ITelemetryContent;\n\n /**\n * Quantity onChange callback.\n */\n quantityOnChange?(cartLine: CartLine, newQuantity: number): boolean;\n}\n\n/**\n * Represents dimensions strings.\n */\ninterface IDimensionStrings {\n\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n}\n\n/**\n * Renders catalog label for the cart line.\n * @param props - Cart line props.\n * @returns Catalog label.\n */\nconst CatalogLabelComponent: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const catalogId = props.data.cartLine.CatalogId;\n\n if (!props.context.request.user.isB2b || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\n return null;\n }\n\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\n\n if (!catalog || !catalog.Name) {\n return null;\n }\n\n return (\n <div className='msc-cart-line__catalog-label'>\n {catalog.Name}\n </div>\n );\n};\n\nconst cartLineItemFunctions = {\n\n /**\n * Render product dimensions.\n * @param product - Product data.\n * @param dimensionStrings - Dimension strings interface.\n * @returns JSX Element.\n */\n renderProductDimensions: (product: SimpleProduct, dimensionStrings: IDimensionStrings) => {\n if (!product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map(productDimension => {\n\n if (productDimension.DimensionTypeValue === ProductDimensionType.Color) {\n return (\n <div key={`${product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-color'>\n {dimensionStrings.colorString}\n {': '}\n <span className='name'>\n {productDimension.DimensionValue?.Value}\n </span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === ProductDimensionType.Configuration) {\n return (\n <div key={`${product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-configuration'>\n {dimensionStrings.configString}\n {': '}\n <span className='name'>\n {productDimension.DimensionValue?.Value}\n </span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === ProductDimensionType.Size) {\n return (\n <div key={`${product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-size'>\n {dimensionStrings.sizeString}\n {': '}\n <span className='name'>\n {productDimension.DimensionValue?.Value}\n </span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === ProductDimensionType.Style) {\n return (\n <div key={`${product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-style'>\n {product.IsGiftCard ? dimensionStrings.amountString : dimensionStrings.styleString}\n {': '}\n <span className='name'>\n {productDimension.DimensionValue?.Value}\n </span>\n </span>\n </div>\n );\n }\n return null;\n });\n },\n\n /**\n * Gets the react node for product unit of price display.\n * @param props - The cart line props.\n * @returns The node representing markup for unit of measure component.\n */\n renderProductUnitPrice: (props: ICartLineProps) => {\n if (!props.data.cartLine.Price) {\n return null;\n }\n const zeroQuantity: number = 0;\n return (\n <div className='msc-cart-line__product-unit-price'>\n <span>\n <PriceComponent\n data={props.data.cartLine.Quantity && props.data.cartLine.Quantity > zeroQuantity ? {\n price: {\n CustomerContextualPrice: props.data.cartLine.Price\n }\n } : {\n price: {\n CustomerContextualPrice: props.data.cartLine.Price\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n />\n </span>\n </div>\n );\n },\n\n /**\n * Render discount lines.\n * @param props - The cart line props.\n * @returns JSX element.\n */\n renderDiscountLines: (props: ICartLineProps) => {\n\n if (!props.data.cartLine.DiscountLines || !ArrayExtensions.hasElements(props.data.cartLine.DiscountLines)) {\n return null;\n }\n\n /**\n * Get the updated discount percentage.\n * @param discountLine - The discount line.\n * @param cartLine - The cart line.\n * @returns The updated discount percentage.\n */\n const discountPercent = (discountLine: DiscountLine, cartLine: CartLine): number => {\n const numberZero = 0;\n const decimalPrecision = 2;\n const fullPercentage = 100;\n let updatedPercent: number = discountLine.Percentage ?? numberZero;\n\n if ((discountLine.Percentage === numberZero ||\n (discountLine.DiscountLineTypeValue && discountLine.DiscountLineTypeValue === DiscountLineType.TenderTypeDiscount)) &&\n cartLine.Price && cartLine.Price > numberZero && cartLine.Quantity && cartLine.Quantity !== numberZero) {\n const effectiveAmount = discountLine.EffectiveAmount ?? numberZero;\n updatedPercent = Number(((effectiveAmount / (cartLine.Price * cartLine.Quantity)) * fullPercentage).toFixed(decimalPrecision));\n }\n\n return updatedPercent;\n };\n\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n return (\n <div key={discountLine.OfferId ?? index} className='msc-cart-line__product-discount'>\n <span>\n {discountLine.OfferName ? discountLine.OfferName : ''}\n </span>\n <span className='msc-cart-line-item-product-discount-price'>\n <PriceComponent\n data={props.isSalesLine ? {\n price: {\n // @ts-expect-error -- Auto suppressed.\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n } : {\n price: {\n CustomerContextualPrice: discountLine.EffectiveAmount,\n BasePrice: discountLine.EffectiveAmount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n />\n </span>\n <span className='msc-cart-line__product-discount-percentage'>\n {` (${discountLine.Percentage !== undefined ? discountPercent(discountLine, props.data.cartLine) : ''}%)`}\n </span>\n </div>\n );\n });\n },\n\n /**\n * Render inventory label.\n * @param props - The cart line props.\n * @returns JSX element.\n */\n renderInventoryLabel: (props: ICartLineProps) => {\n const inventoryCssName = props.inventoryLabelClassName ? (\n `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`) : 'msc-cart-line__product-inventory-label';\n\n return (\n <p className={inventoryCssName}>\n {props.inventoryInformationLabel}\n </p>\n );\n },\n\n /**\n * Render shipping label.\n * @param props - The cart line props.\n * @returns JSX element.\n */\n renderShippingLabel: (props: ICartLineProps) => {\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\n const cartline = props.data.cartLine;\n let hasShippingMethod = false;\n if (channelDeliveryOptionConfig !== undefined) {\n hasShippingMethod = !!(cartline.DeliveryMode && channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(\n deliveryMode => deliveryMode !== cartline.DeliveryMode));\n } else {\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\n }\n if (!hasShippingMethod) {\n return undefined;\n }\n\n const shippingChargeLines = (cartline.ChargeLines ?? []).filter(chargeLine => chargeLine.IsShipping);\n\n if (!ArrayExtensions.hasElements(shippingChargeLines)) {\n return undefined;\n }\n\n const defaultCharge: number = 0;\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n return chargeTotal + (chargeLine.CalculatedAmount ?? defaultCharge);\n }, defaultCharge);\n\n const priceComponent = (\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: freightFee\n }\n }}\n freePriceText='Free'\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__freight-actual'\n />\n );\n return (\n <>\n <label className='msc-cart-line__freight-label'>\n {`${props.resources.shippingChargesText}:`}\n </label>\n <span className='shipping-value'>\n {priceComponent}\n </span>\n </>\n );\n },\n\n /**\n * Render other charges.\n * @param props - The cart line props.\n * @returns JSX element.\n */\n renderOtherCharges: (props: ICartLineProps) => {\n const cartline = props.data.cartLine;\n const otherCharges = cartline.ChargeLines?.filter((chargeline) => !chargeline.IsShipping);\n\n return otherCharges?.map((otherCharge, index) => {\n const itemIndex = index;\n return otherCharge.CalculatedAmount ? (\n <div className='msc-cart-line__other-charges' key={itemIndex}>\n <label className='msc-cart-line__other-charges-label'>\n {`${String(otherCharge.Description)}:`}\n </label>\n <span className='other-charge-value'>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: otherCharge.CalculatedAmount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__other-charges-actual'\n />\n </span>\n </div>\n ) : '';\n }) ?? undefined;\n }\n};\n\n/**\n * Render cartline component.\n * @param props - The cart line props.\n * @returns JSX element.\n */\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const { isSalesLine, productUrl, resources } = props;\n const { product, cartLine } = props.data;\n\n const destructDimensionStrings = {\n sizeString: resources.sizeString,\n colorString: resources.colorString,\n styleString: resources.styleString,\n configString: resources.configString,\n amountString: resources.amountString\n };\n\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\n const productDimensions = product && cartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n const renderProductUnitPrice = cartLineItemFunctions.renderProductUnitPrice(props);\n const imageSettings = props.imageSettings;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const renderDiscountLines = cartLineItemFunctions.renderDiscountLines(props);\n const renderInventoryLabel = cartLineItemFunctions.renderInventoryLabel(props);\n const renderShippingLabel = cartLineItemFunctions.renderShippingLabel(props);\n const renderOtherCharges = cartLineItemFunctions.renderOtherCharges(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\n const productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const productName = product?.Name ?? cartLine.Description;\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\n const cartLineContentClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-content' : 'msc-cart-line__content';\n\n /**\n * Render other charges.\n * @param newValue - The cart line props.\n * @returns Boolean.\n */\n const onChange = (newValue: number): boolean => {\n if (props.quantityOnChange) {\n return props.quantityOnChange(props.data.cartLine, newValue);\n }\n return true;\n };\n\n /**\n * Generate error message.\n * @returns JSX element.\n */\n const generateErrorMessage = (): JSX.Element | null => {\n if (props.errorMessage) {\n return (\n <div className='msc-alert__header'>\n <span className='msi-exclamation-triangle' />\n <span>\n {props.errorMessage}\n </span>\n </div>\n );\n }\n\n return null;\n };\n\n /**\n * Render Saving component.\n * @returns JSX element.\n */\n const renderSaving = (): JSX.Element | null => {\n\n if (!props.data.cartLine.DiscountAmount) {\n return null;\n }\n const discountAmountZero: number = 0;\n\n if (props.data.cartLine.DiscountAmount > discountAmountZero) {\n return (\n <>\n <span className='msc-cart-line__product-savings-label'>\n {`${props.resources.discountStringText || 'Discount'}`}\n </span>\n <PriceComponent\n data={props.isSalesLine ? {\n price: {\n // @ts-expect-error -- Auto suppressed.\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n } : {\n price: {\n CustomerContextualPrice: props.data.cartLine.DiscountAmountWithoutTax,\n BasePrice: props.data.cartLine.DiscountAmount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-text'\n />\n </>\n );\n }\n return null;\n };\n\n /**\n * Gets the react node for product unit of measure display.\n * @returns The node representing markup for unit of measure component.\n */\n const renderUnitOfMeasure = () => {\n\n if (props.data.cartLine.IsInvoiceLine) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\n return undefined;\n }\n\n if (!product || !product.DefaultUnitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-cart-line__product-unit-of-measure'>\n <span>\n {product.DefaultUnitOfMeasure}\n </span>\n </div>\n );\n };\n\n /**\n * Generate quantity and price component.\n * @returns JSX element.\n */\n const generateQuantityAndPrice = (): JSX.Element[] | null => {\n const nodes = [];\n const defaultMaxQuantity: number = 10;\n const singleQuantity: number = 1;\n const unitOfMeasure = renderUnitOfMeasure();\n\n // No quantity selector for invoice line\n if (!props.data.cartLine.IsInvoiceLine) {\n if (props.data.product && props.isQuantityEditable) {\n nodes.push(\n <div className='msc-cart-line__product-quantity'>\n <div className='msc-cart-line__product-quantity-label'>\n {resources.quantityDisplayString}\n </div>\n\n {generateErrorMessage()}\n\n <IncrementalQuantity\n id={`msc-cart-line__quantity_${props.data.product.RecordId}-\n ${String(props.data.cartLine.DeliveryMode)}-${String(props.data.cartLine.LineId)}`}\n max={props.maxQuantity ?? defaultMaxQuantity}\n currentCount={props.currentQuantity}\n onChange={onChange}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n key={props.data.cartLine.LineId}\n disabled={!props.isCartStateReady}\n isGiftCard={props.data.product.IsGiftCard ?? props.isOutOfStock}\n telemetryContent={props.telemetryContent}\n />\n {unitOfMeasure}\n </div>\n );\n } else {\n nodes.push(\n <div className={classNames('msc-cart-line__quantity', { 'single-quantity': props.data.cartLine.Quantity === singleQuantity })}>\n {unitOfMeasure}\n <label className='quantity-label'>\n {resources.quantityDisplayString}\n {': '}\n </label>\n\n {generateErrorMessage()}\n\n <span className='quantity-value'>\n {props.data.cartLine.Quantity}\n </span>\n </div>\n );\n }\n }\n\n nodes.push(\n <div className='msc-cart-line__product-savings'>\n <PriceComponent\n data={isSalesLine ? {\n price: {\n // @ts-expect-error -- Auto suppressed.\n CustomerContextualPrice: props.data.cartLine.NetAmount,\n BasePrice: props.data.cartLine.Price\n }\n } : {\n price: {\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\n BasePrice: props.data.cartLine.NetPrice\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-actual'\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n />\n {\n renderSaving()\n }\n {props.isOutOfStock ? renderInventoryLabel : null}\n </div>\n );\n\n return nodes;\n };\n\n return (\n <div className='msc-cart-line'>\n {\n MsDyn365.isBrowser ? <a className={imgeClassName} href={productUrl} aria-label={productName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n aria-hidden='true'\n src={props.primaryImageUrl ?? 'empty'} fallBackSrc={fallbackImageUrl} altText={productName}\n gridSettings={props.gridSettings} imageSettings={imageSettings} loadFailureBehavior='empty' />\n </a> : null\n }\n <div className={cartLineContentClassName}>\n <div className='msc-cart-line__product'>\n <CatalogLabelComponent\n {...props}\n />\n {\n MsDyn365.isBrowser ? <a className='msc-cart-line__product-title' href={productUrl} {...productAttribute} >\n {productName}\n </a> : null\n }\n {ArrayExtensions.hasElements(productDimensions) ? <div className='msc-cart-line__product-variants'>\n {productDimensions}\n </div> : ''}\n <div className='msc-cart-line__product-price'>\n <PriceComponent\n data={isSalesLine ? {\n price: {\n // @ts-expect-error -- Auto suppressed.\n CustomerContextualPrice: props.data.cartLine.NetAmount,\n BasePrice: props.data.cartLine.Price\n }\n } : {\n price: {\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\n BasePrice: props.data.cartLine.NetPrice\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-discount-value'\n />\n {renderUnitOfMeasure()}\n </div>\n {renderProductUnitPrice}\n {renderInventoryLabel}\n {renderDiscountLines}\n {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>\n {renderShippingLabel}\n </div>}\n {renderOtherCharges}\n </div>\n {\n generateQuantityAndPrice()\n }\n {\n props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && <CartLinePriceEditor\n className='msc-cart-line__price-editor-container'\n context={props.context}\n resources={props.resources.priceEditorResources}\n cartState={props.data.cartState}\n cartLine={props.data.cartLine}\n />\n }\n </div>\n </div>\n );\n};\n\nexport default CartLine;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore } from './checkout';\nimport { IEmailDelivery } from './components';\nimport { IInvoicePaymentSummary } from './components/get-invoice-payment-summary';\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 </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 PaymentSummaryComponent: React.FC<IInvoicePaymentSummary> = ({ heading, lines }) => (\n <div className='msc-invoice-summary-wrapper'>\n {heading}\n <div className='msc-invoice-summary__items'>\n {lines && (\n <>\n {lines.invoices}\n {lines.giftCard}\n {lines.loyalty}\n {lines.orderTotal}\n </>\n )}\n </div>\n </div>\n);\n\nconst CheckoutView: React.FC<ICheckoutViewProps> = props => {\n const {\n isPaymentVerificationRedirection,\n shouldEnableSinglePaymentAuthorizationCheckout,\n canShow,\n checkoutProps,\n headerProps,\n hasSalesOrder,\n hasInvoiceLine,\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 invoicePaymentSummary,\n lineItems,\n placeOrderButton,\n termsAndConditions,\n keepShoppingButton\n } = props;\n\n return (\n <Module {...checkoutProps}>\n {!hasSalesOrder && <Node {...headerProps}>\n {title}\n </Node>}\n {!hasSalesOrder && isPaymentVerificationRedirection && shouldEnableSinglePaymentAuthorizationCheckout && !alert && !loading &&\n <Waiting className='msc-waiting-circular msc-waiting-lg' />}\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 {!hasInvoiceLine ? orderSummary && <OrderSummaryComponent {...orderSummary} /> : invoicePaymentSummary && <PaymentSummaryComponent {...invoicePaymentSummary} />}\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 {hasSalesOrder && orderConfirmation}\n </Module>\n );\n};\n\nexport default CheckoutView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getRnrAuthEndpointId, getRnrPartnerId } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert, Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, Modal, ModalBody, ModalFooter, ModalHeader, TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { GetUserReviewInput } from '../actions/inputs/get-user-review-input';\nimport { SubmitUserReviewInput } from '../actions/inputs/submit-user-review-input';\nimport submitUserReview from '../actions/submit-user-review';\n\nexport interface IReviewModalProps {\n userReview?: Review;\n product?: SimpleProduct;\n renderContextId: string;\n resources: IReviewModalResources;\n context: ICoreContext<IGeneric<IAny>>;\n parentId: string;\n parentType: string;\n isOpen: boolean;\n rating: number;\n reviewTitle: string;\n reviewText: string;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onTitleChange(event: React.ChangeEvent<HTMLInputElement>): void;\n onTextChange(event: React.ChangeEvent<HTMLTextAreaElement>): void;\n onRatingChange(value: number): void;\n onReviewComplete?(isSuccess: boolean): void;\n}\n\nexport interface IReviewModalResources {\n selectRatingAriaLabel: string;\n selectRatingLabel: string;\n reviewTitleLabel: string;\n reviewTextLabel: string;\n privacyPolicyTitle: string;\n privacyPolicyTextFormat: string;\n writeReviewModalTitle: string;\n editReviewModalTitle: string;\n submitReviewButtonText: string;\n discardReviewButtonText: string;\n errorMessageText: string;\n reviewTitleAriaLabel?: string;\n reviewAriaLabel?: string;\n}\n\nexport interface IReviewModalViewProps {\n modal: INodeProps;\n modalHeader: React.ReactElement;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n rating: React.ReactElement;\n ratingLabel: React.ReactElement;\n titleInput: React.ReactElement;\n titleLabel: React.ReactElement;\n textInput: React.ReactElement;\n textLabel: React.ReactElement;\n privacyPolicyUrl: React.ReactElement;\n form: INodeProps;\n inputRow: INodeProps;\n error: React.ReactElement;\n}\n\n/**\n * On Click Submit.\n * @param props -Review Modal props.\n * @returns On submit.\n */\nconst onClickSubmit = (props: IReviewModalProps) => () => {\n onSubmit(props);\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const ReviewModal = (props: IReviewModalProps): IReviewModalViewProps => {\n\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return {\n modal: { tag: Modal, className: 'ms-review-modal msc-modal-input-required', toggle: props.onModalToggle, applicationNode: 'renderPage', isOpen: props.isOpen, returnFocusRef: props.returnRef },\n modalHeader: modalHeaderNode(props),\n modalFooter: { tag: ModalFooter, className: 'ms-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-review-modal-body' },\n cancelButton: <Button className='ms-review-modal-cancel' onClick={props.onModalToggle} {...submitButtonAttribute} >\n {props.resources.discardReviewButtonText}\n </Button>,\n submitButton: <Button\n className='ms-review-modal-submit' onClick={onClickSubmit(props)} {...cancelButtonAttribute}\n disabled={submitDisabled(props)}>\n {props.resources.submitReviewButtonText}\n </Button>,\n rating: ratingsInput(props),\n ratingLabel: ratingsLabel(props),\n titleInput: titleInput(props),\n titleLabel: titleLabel(props),\n textInput: textInput(props),\n textLabel: textLabel(props),\n privacyPolicyUrl: privacyPolicyLink(props),\n form: { tag: 'form', className: 'ms-review-modal-form', autoComplete: 'off' },\n inputRow: { tag: 'div', className: 'ms-review-modal-row', autoComplete: 'off' },\n error: <Alert className='ms-review-modal-error' isOpen={props.hasError} color='danger'>\n {props.resources.errorMessageText}\n </Alert>\n };\n};\n\nconst modalHeaderNode = (props: IReviewModalProps) => {\n return (\n <ModalHeader toggle={props.onModalToggle} className='ms-review-modal-header'>\n { props.userReview && props.userReview.reviewId ? props.resources.editReviewModalTitle : props.resources.writeReviewModalTitle }\n </ModalHeader>\n );\n};\n\nconst submitDisabled = (props: IReviewModalProps) => {\n return !props.rating || !stripWhiteSpacesFromString(props.reviewText) || !stripWhiteSpacesFromString(props.reviewTitle);\n};\n\nconst ratingsInput = (props: IReviewModalProps) => {\n return (\n <RatingComponent\n readOnly={false}\n avgRating={0}\n ariaLabel={props.resources.selectRatingAriaLabel}\n initialRating={props.rating}\n context={props.context}\n id={props.parentId}\n typeName={props.parentType}\n data={{}}\n key='ratings'\n onChange={props.onRatingChange}\n />\n );\n};\n\nconst ratingsLabel = (props: IReviewModalProps) => {\n return (<label className='ms-review-modal-rating-label' key='ratingsLabel'>\n {props.resources.selectRatingLabel}\n *\n </label>);\n};\n\nconst titleInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTitleMaxLength;\n\n return (\n <input\n maxLength={maxLength}\n id={`reviewTitle-${props.renderContextId}`}\n onChange={props.onTitleChange}\n value={props.reviewTitle}\n aria-required='true'\n className='ms-review-modal-title'\n aria-label={props.resources.reviewTitleAriaLabel}\n />\n );\n};\n\nconst titleLabel = (props: IReviewModalProps) => {\n return (<label className='ms-review-modal-title-label' htmlFor={`reviewTitle-${props.renderContextId}`}>\n {props.resources.reviewTitleLabel}\n </label>);\n};\n\nconst reviewTextWidth: number = 50;\n\nconst textInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTextMaxLength;\n return (\n <textarea\n maxLength={maxLength}\n className='ms-review-modal-text'\n id={`reviewTextArea-${props.renderContextId}`}\n onChange={props.onTextChange}\n rows={maxLength / reviewTextWidth}\n value={props.reviewText}\n aria-required='true'\n aria-label={props.resources.reviewAriaLabel}\n />\n );\n};\n\nconst textLabel = (props: IReviewModalProps) => {\n return (<label htmlFor={`reviewTextArea-${props.renderContextId}`} className='ms-review-modal-text-label'>\n {props.resources.reviewTextLabel}\n </label>);\n};\n\nconst privacyPolicyLink = (props: IReviewModalProps) => {\n const policyTextBlocks = props.resources.privacyPolicyTextFormat.split('{0}');\n const isSeparatorAtStart = props.resources.privacyPolicyTextFormat.startsWith('{0}');\n const isSeparatorAtEnd = props.resources.privacyPolicyTextFormat.endsWith('{0}');\n const privacyPolicyUrl = getUrlSync('rnrPrivacyPolicy', props.context.actionContext);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.PrivacyPolicy);\n const privacyPolicyAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n <p className='ms-review-modal-policy'>\n {isSeparatorAtStart ? '' : policyTextBlocks[0]}\n <a\n href={privacyPolicyUrl} target='_blank' className='msc-link'\n {...privacyPolicyAttribute}>\n {props.resources.privacyPolicyTitle}\n </a>\n {isSeparatorAtEnd ? '' : (isSeparatorAtStart ? policyTextBlocks[0] : policyTextBlocks[1]) }\n </p>\n );\n};\n\nconst onSubmit = (props: IReviewModalProps): void => {\n if (props.product) {\n submitReview(props.product, props.reviewTitle, props.reviewText, props.rating, props.context, props.userReview, props.onReviewComplete);\n }\n};\n\n/**\n * This method strips content of extra white spaces.\n * @param text The text to be stripped of extra white spaces.\n */\nconst stripWhiteSpacesFromString = (text: string): string => {\n return text\n .replace(new RegExp('\\\\r?\\\\n|\\\\r+', 'g'), ' ')\n .replace(new RegExp('\\\\s+', 'g'), ' ')\n .trim();\n};\n\nexport const submitReview = (product: SimpleProduct, title: string, text: string, rating: number, context: ICoreContext, userReview?: Review, onReviewSubmission?: (isSuccessful: boolean) => void) => {\n const { request } = context;\n const { user } = request;\n if (user && request) {\n const input = new SubmitUserReviewInput(\n product.RecordId.toString(),\n getRnrPartnerId(context.actionContext),\n request.apiSettings.channelId.toString(),\n request.locale,\n {\n productName: product && product.Name,\n rating,\n reviewText: stripWhiteSpacesFromString(text),\n title: stripWhiteSpacesFromString(title),\n userEmail: user.emailAddress,\n userName: user.name\n },\n request.user.token,\n getRnrAuthEndpointId(context.actionContext)\n );\n\n submitUserReview(input, context.actionContext).then(reviewId => {\n const review = reviewId ? {\n rating,\n title: stripWhiteSpacesFromString(title),\n reviewText: stripWhiteSpacesFromString(text),\n submittedDateTime: new Date(),\n helpfulPositive: userReview ? userReview.helpfulPositive : 0,\n helpfulNegative: userReview ? userReview.helpfulNegative : 0,\n reviewId,\n userName: request.user.firstName || request.user.name\n } : userReview;\n\n const getReviewInput = new GetUserReviewInput(input.productId!, input.tenantId, input.authorization, input.serviceEndpoint);\n context.actionContext.update(getReviewInput, review);\n\n if (onReviewSubmission) {\n onReviewSubmission(!!reviewId);\n }\n }).catch(() => {\n const productId = product.RecordId;\n context.telemetry.error(`Failed to submit review for product with recordId: ${productId}`);\n context.telemetry.debug(`Failed to submit review for product with recordId: ${productId}`);\n if (onReviewSubmission) {\n onReviewSubmission(false);\n }\n });\n }\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport get from 'lodash/get';\nimport * as React from 'react';\n\nimport { ICheckoutData } from '../checkout.data';\nimport { ICheckoutProps } from '../checkout.props.autogenerated';\n\nexport interface IInvoicePaymentSummary {\n heading?: React.ReactNode;\n lines?: IInvoiceSummaryLines;\n}\nexport const getInvoicePaymentSummary = (input: ICheckoutProps<ICheckoutData>): IInvoicePaymentSummary => {\n const {\n data: { checkout },\n resources: {\n totalAmountLabel,\n invoiceLabel,\n invoiceSummaryTitle\n },\n context,\n typeName,\n id,\n telemetry\n } = input;\n\n const checkoutCart = get(checkout, 'result.checkoutCart');\n const cart = get(checkout, 'result.checkoutCart.cart');\n\n return {\n heading: <h2 className='msc-invoice-summary__heading'>\n { invoiceSummaryTitle }\n </h2>,\n lines: checkoutCart?.hasInvoiceLine ? InvoiceSummary({\n orderTotalLabel: totalAmountLabel,\n invoiceLabel,\n cart,\n context,\n typeName,\n telemetry,\n id,\n checkoutState: checkout.result\n }) : undefined\n };\n\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { Cart, CartLineValidationResults } from '@msdyn365-commerce/retail-proxy';\nimport { updateLineDeliverySpecificationsAsync, validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n DeliveryPreferenceType,\n LineDeliverySpecification,\n SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IModuleStateManager, IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport {\n ArrayExtensions,\n getAvailabilitiesForCartLineItems,\n IProductInventoryInformation,\n ProductAvailabilitiesForCartLineItems,\n validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant,\n Waiting } from '@msdyn365-commerce-modules/utilities';\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';\n\nimport { ICheckoutData } from './checkout.data';\nimport { ICheckoutHeadingData, ICheckoutProps } from './checkout.props.autogenerated';\nimport AlertComponent from './components/alert';\nimport { getInvoicePaymentSummary, IInvoicePaymentSummary } from './components/get-invoice-payment-summary';\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\n/**\n * Device type.\n */\ntype DeviceType = 'Mobile';\n\n/**\n * The Checkout state.\n */\ninterface ICheckoutState {\n errorMessage: string;\n isValidationPassed: boolean;\n isPlaceOrderLoading?: boolean;\n}\n\n/**\n * The Checkout view props.\n * @extends ICheckoutProps<ICheckoutData>\n */\nexport interface ICheckoutViewProps extends ICheckoutProps<ICheckoutData> {\n className: string;\n canShow?: boolean;\n isEmptyCart?: boolean;\n isConsentGiven?: boolean;\n hasError?: boolean;\n isPaymentVerificationRedirection?: boolean;\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\n cartStatus?: string;\n isMobile?: boolean;\n isEditorialMode?: boolean;\n backToShoppingUrl?: string;\n editCartLink?: string;\n hasSalesOrder: boolean;\n hasInvoiceLine?: 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 invoicePaymentSummary?: IInvoicePaymentSummary;\n lineItems?: ILineItems;\n placeOrderButton?: React.ReactNode;\n termsAndConditions?: React.ReactNode;\n keepShoppingButton?: React.ReactNode;\n orderConfirmation?: React.ReactNode;\n}\n\n/**\n * The checkout module props interface.\n */\nexport interface ICheckoutModuleProps extends ICheckoutProps<ICheckoutData>, IModuleStateProps { }\n\nconst expressPaymentSectionClassName = 'msc-express-payment-container';\n\n/**\n *\n * CheckoutContainer component.\n * @extends {React.Component<ICheckoutModuleProps>}\n */\n// @ts-expect-error\n@withModuleState\n@observer\nclass Checkout extends React.PureComponent<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\n const shouldEnableSinglePaymentAuthorizationCheckout = this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout ?? false;\n\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 &&\n (isTermsAndConditionAccepted === undefined ||\n isTermsAndConditionAccepted ||\n shouldEnableSinglePaymentAuthorizationCheckout) &&\n ((this.state.errorMessage === '' || shouldEnableSinglePaymentAuthorizationCheckout) || (this.props.data.checkout.result?.isPaymentVerificationRedirection ?? false));\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 isPlaceOrderLoading: false\n };\n\n private readonly 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\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 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 // Reaction to call place order when isPaymentSectionContainerReady is true for new checkout flow.\n reaction(\n () => this.props.data.checkout.result?.isPaymentSectionContainerReady,\n async (isReady) => {\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && isReady &&\n !this.props.data.checkout.result?.redirectAdditionalContext &&\n (!this.props.data.checkout.result?.isExpressCheckoutApplied || this.props.data.checkout.result?.isPaymentVerificationRedirection)) {\n if (!this.state.isPlaceOrderLoading) {\n this.setState({ isPlaceOrderLoading: true });\n }\n\n await this.onPlaceOrder();\n\n // If 3D authentication redirection, don't update isPlaceOrderLoading\n if (!this.props.data.checkout.result.isPaymentVerificationRequired) {\n this.setState({ isPlaceOrderLoading: false });\n }\n }\n }\n );\n\n // Reaction to enable place order button when isPaymentSectionContainerHasError is true for new checkout flow.\n reaction(\n () => this.props.data.checkout.result?.isPaymentSectionContainerHasError,\n (hasError) => {\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && hasError) {\n this.setState({ isPlaceOrderLoading: false });\n }\n }\n );\n\n // Reaction to enable place order button when redirection is true for new checkout flow.\n reaction(\n () => this.canPlaceOrder,\n async () => {\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && this.canPlaceOrder) {\n if (this.props.data.checkout.result?.isPaymentVerificationRedirection) {\n await this.props.data.checkout.result.updateIsPlaceOrderEnabledInRedirection({\n newIsPlaceOrderEnabledInRedirection: true\n });\n }\n }\n }\n );\n }\n\n // eslint-disable-next-line complexity -- ignore the complexity.\n public render(): JSX.Element {\n const {\n moduleState,\n config: { className, checkoutHeading, disableGuidedCheckoutFlow },\n resources,\n context: {\n request: {\n user: {\n isAuthenticated\n }\n }\n }\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const shouldEnableSinglePaymentAuthorizationCheckout = this.props.data.checkout?.result?.shouldEnableSinglePaymentAuthorizationCheckout ?? false;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const isExpressCheckoutApplied = this.props.data.checkout?.result?.isExpressCheckoutApplied ?? false;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const hasShippingAddress = this.props.data.checkout?.result?.hasShippingAddress;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const hasCartDeliveryMode = this.props.data.checkout?.result?.hasCartDeliveryMode;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const hasGuestCheckoutEmail = this.props.data.checkout?.result?.hasGuestCheckoutEmail;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const isTermsAndConditionAccepted = this.props.data.checkout?.result?.isTermsAndConditionAccepted;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const isPaymentVerificationRedirection = this.props.data.checkout?.result?.isPaymentVerificationRedirection ?? false;\n\n let hasExpressPaymentContainer = false;\n\n if (typeof window !== 'undefined' &&\n (document?.getElementsByClassName(expressPaymentSectionClassName) as HTMLCollectionOf<HTMLElement>)[0]?.style.display === '') {\n hasExpressPaymentContainer = true;\n }\n\n let viewProps: ICheckoutViewProps = {\n ...this.props,\n className: checkoutClass,\n isEmptyCart: this.isEmptyCart,\n isConsentGiven,\n hasError: this.hasError,\n isPaymentVerificationRedirection: this.props.data.checkout?.result?.isPaymentVerificationRedirection,\n shouldEnableSinglePaymentAuthorizationCheckout,\n hasSalesOrder: this.props.data.checkout && this.props.data.checkout.result !== undefined && this.props.data.checkout.result.salesOrder !== undefined,\n hasInvoiceLine,\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: hasExpressPaymentContainer ? 'ms-checkout__has-express-side' : '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 && isAuthenticated) {\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,\n disableGuidedCheckoutFlow,\n resource: resources,\n requestContext: this.props.context,\n isMobile,\n isEditor: this.isEditorialMode,\n telemetryContent: this.telemetryContent,\n isPaymentVerificationRedirection: this.props.data.checkout?.result?.isPaymentVerificationRedirection,\n shouldEnableSinglePaymentAuthorizationCheckout,\n hasError: !!errorMessage,\n hasShippingAddress,\n hasCartDeliveryMode,\n hasGuestCheckoutEmail,\n isTermsAndConditionAccepted\n }}\n />\n ) : (\n undefined\n ),\n orderSummary: getOrderSummary(this.props),\n invoicePaymentSummary: getInvoicePaymentSummary(this.props),\n lineItems: hasInvoiceLine ? undefined : getLineItems(this.props, this.telemetryContent),\n placeOrderButton: (\n <PlaceOrderButtonComponent {...{\n checkoutBtnText,\n placeOrder: (\n !isExpressCheckoutApplied && shouldEnableSinglePaymentAuthorizationCheckout\n ) ? this.triggerPaymentWithPlaceOrder : this.onPlaceOrder,\n\n canPlaceOrder: this.canPlaceOrder,\n telemetryContent: this.telemetryContent,\n shouldEnableSinglePaymentAuthorizationCheckout: this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout,\n isPlaceOrderLoading: this.state.isPlaceOrderLoading,\n isExpressCheckoutApplied,\n isPaymentVerificationRedirection\n }} />\n ),\n 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 /**\n * Renders heading.\n * @param checkoutHeading - The checkout heading.\n * @returns React node.\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 /**\n * Event handler for heading change event.\n * @param event - The content change event in heading element.\n * @returns The new heading value.\n */\n public handleCheckoutHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.checkoutHeading!.text = event.target.value;\n\n /**\n * Checks if cart is loading.\n * @returns True if is loading, false otherwise.\n */\n private readonly isLoading = (): boolean => {\n return !this.cartStatus || this.cartStatus === 'LOADING' || this.isEmptyCart || !this.state.isValidationPassed;\n };\n\n /**\n * Get slot items.\n * @param key - The slot key.\n * @returns React node or undefined.\n */\n private readonly getSlotItems = (key: string): React.ReactNode[] | undefined => {\n const { slots } = this.props;\n return slots && slots[key] && slots[key].length > 0 ? slots[key] : undefined;\n };\n\n /**\n * Trigger the payment section container submit when placing order.\n */\n private readonly triggerPaymentWithPlaceOrder = async (): Promise<void> => {\n this.setState({ isPlaceOrderLoading: true });\n\n await this.props.data.checkout.result?.updateShouldTriggerPaymentWithPlaceOrder(\n { newShouldTriggerPaymentWithPlaceOrder: !this.props.data.checkout.result.shouldTriggerPaymentWithPlaceOrder });\n };\n\n /**\n * On place order.\n * @returns Void promise.\n */\n private readonly onPlaceOrder = async (): Promise<void> => {\n const {\n resources: { checkoutOutOfStockErrorMessage, genericErrorMessage, invalidCartVersionErrorMessage, missingRequiredCartTenderLinesErrorMessage },\n context: { actionContext, app: { config: { enableStockCheck = false } } },\n slots: { orderConfirmation },\n data: { checkout, products }\n } = this.props;\n\n // If hasInvoiceLine is true, no inventory check\n if (!this.props.data.checkout.result?.checkoutCart.hasInvoiceLine && enableStockCheck &&\n await this.isOverMaxQuantity((await checkout).checkoutCart.cart, (await products))) {\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\n await placeOrder(actionContext, this.props.data.checkout.result, this.props.data.products.result,\n !hasOrderConfirmation, updatedCartVersion, this.props.data.checkout.result?.isPaymentVerificationRedirection).catch(error => {\n let errorMessage = genericErrorMessage;\n\n if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n errorMessage = invalidCartVersionErrorMessage;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown error type.\n } else if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines') {\n errorMessage = missingRequiredCartTenderLinesErrorMessage;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown error type.\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && error.data?.AdditionalContext &&\n !this.props.data.checkout.result?.isPaymentVerificationRedirection) {\n return;\n }\n\n this.setState({\n errorMessage\n });\n this.props.telemetry.exception(error);\n });\n\n await checkout.result?.updateIsPaymentSectionContainerReady({ newIsPaymentSectionContainerReady: false });\n }\n };\n\n /**\n * Update receipt email address for electronic cart line.\n * @param newGuestCheckoutEmail - The guest checkout email.\n * @returns The updated cart version.\n */\n private readonly 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 /**\n * Return true if any product in the cart is over its max quantity.\n * @param cart -- The checkout cart.\n * @param products -- The checkout products.\n * @returns - Is any product in the cart is over max quantity.\n */\n private readonly isOverMaxQuantity = async (cart: Cart, products: SimpleProduct[]): 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 const productsThatShouldValidateInventory: IProductInventoryInformation [] = [];\n\n cart.CartLines?.map((cartline) => {\n\n const cartlineProduct = products.find(product => product.RecordId === cartline.ProductId);\n\n // If product is non-stocked or cartline is electronic delivery, then no inventory check\n const isStockedItem = cartlineProduct?.Behavior?.IsStockedProduct;\n const isEmailDelivery = (cartline.DeliveryMode && cartline.DeliveryMode !== '') ? cartline.DeliveryMode === emailDeliveryModeCode : false;\n const shouldSkipInventoryCheck = !isStockedItem || isEmailDelivery;\n if (!shouldSkipInventoryCheck && ArrayExtensions.hasElements(productInventoryInformation)) {\n const foundProductAvailability = productInventoryInformation.find((productInventory) => {\n return productInventory.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n if (foundProductAvailability) {\n productsThatShouldValidateInventory.push(foundProductAvailability);\n }\n }\n });\n\n const cartLinesInventoryValidation = validateCartLinesInventory(\n cart.CartLines ?? [],\n productsThatShouldValidateInventory,\n this.props.context.actionContext,\n products,\n emailDeliveryModeCode);\n\n // If is invalid then exceeds the available quantity\n isOverMaxQuantity = !cartLinesInventoryValidation.isValid;\n return isOverMaxQuantity;\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 /**\n * Gets active child in module state.\n * @returns - The module state manager collection.\n */\n private readonly 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 /**\n * On container ready.\n */\n private readonly onContainerReady = (): void => {\n this.getActiveChildModuleStates().forEach(state => {\n state.isReady && state.onContainerReady && state.onContainerReady();\n });\n };\n\n /**\n * Redirects to cart page.\n * @param notFoundEditCartLinkMessage - Not found edit cart link message.\n */\n private readonly 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 /**\n * Validates for checkout.\n * @param retry - Retry flag.\n */\n private readonly 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, bypassCache: 'none' }, 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(() => {\n this.validateForCheckout(false);\n })\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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\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 quickviewSlot?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(\n channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent,\n quickviewSlot,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) => (\n <li className='ms-product-search-result__item' key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={allowBackNavigation}\n id={moduleId}\n key={product.RecordId}\n typeName={moduleType}\n data={{ product }}\n quickViewButton={quickviewSlot}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability => ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId)}\n />\n </li>\n ))}\n </ul>\n );\n\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\n/**\n * The payment error.\n */\nexport interface IPaymentError {\n title: string;\n message: string;\n className?: string;\n}\n\n/**\n * The payment error.\n * @param param0 - First param.\n * @param param0.title - Title.\n * @param param0.message - Message.\n * @param param0.className - ClassName.\n * @returns React node.\n */\nexport const ErrorComponent: React.FC<IPaymentError> = ({ title, message, className = 'ms-checkout-payment-instrument' }) => (\n <div className={`${className}__error`} role='alert' aria-live='assertive'>\n <p className={`${className}__error-title`}>\n {title}\n </p>\n <p className={`${className}__error-message`}>\n {message}\n </p>\n </div>\n);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\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.PureComponent<IChoiceSummaryProps> {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n // eslint-disable-next-line unicorn/prefer-array-some, max-len -- Existing code\n (hierarchy: IProductRefinerHierarchy) => !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\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<IChoiceSummaryProps>) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = 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 <div className='msc-choice-summary'>\n {items.length > 0 && label && <span className='msc-choice-summary__label'>\n {label}\n </span>}\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\n {items.map((item: IRefinerMap) => {\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <li className='msc-choice-summary__list-item' key={item.key}>\n <a\n className='msc-choice-summary__item'\n href={this.props.urlBuilder(item.value, false)}\n aria-label={`${item.key} ${choiceAriaLabel}`}\n onClick={this._onClick}\n role='button'\n {...attribute}\n >\n {item.key}\n <span className={`${this.closeButtonGlyph} msc-choice-summary__glyph`} role='button' aria-label={closeAriaLabel} />\n </a>\n </li>\n );\n })}\n </ul>\n {items.length > 0 && clearAllText && <a\n href={this.props.urlBuilder({}, true)} className='msc-choice-summary__clear-all' {...clearAllAttributes}\n onClick={this._onClick}>\n {clearAllText}\n </a>}\n </div>\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 // eslint-disable-next-line unicorn/prefer-array-some, max-len -- Existing code\n (hierarchy: IProductRefinerHierarchy) => !!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 let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n 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.textContent && itemClicked.textContent.trim()) === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\nimport { ISearchViewProps } from './search';\n\nconst SearchView: React.FC<ISearchViewProps> = props => {\n const {\n Search,\n AutoSuggestAriaLabel,\n AutoSuggestAriaLabelText,\n searchText,\n AutoSuggest,\n KeywordSuggest,\n ProductSuggest,\n CategorySuggest,\n UlKeyword,\n UlProduct,\n UlCategory,\n form,\n autosuggestCategory,\n autosuggestKeyword,\n autosuggestProduct,\n SearchForm,\n FormWrapper,\n label,\n isLoadingAutoSuggest,\n isLoadingNode\n } = props;\n\n return (\n <Module {...Search}>\n {label}\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\n <Node {...AutoSuggest}>\n {searchText && searchText.length > 0 ? <Node {...AutoSuggestAriaLabel}>\n {AutoSuggestAriaLabelText}\n </Node> : ''}\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\n </Node>\n </Module>\n );\n};\n\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\n return (\n <Node {...SearchForm}>\n <Node {...FormWrapper}>\n {form.input}\n {form.cancelBtn}\n {form.submitBtn}\n </Node>\n </Node>\n );\n};\n\nconst _renderKeywordSuggestions = (\n KeywordSuggest: INodeProps,\n UlKeyword: INodeProps,\n keywordSuggestions?: ISearchKeywordViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n keywordSuggestions && (\n <Node {...KeywordSuggest}>\n <Node {...UlKeyword}>\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest && keywordSuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderProductSuggestions = (\n ProductSuggest: INodeProps,\n UlProduct: INodeProps,\n productSuggestions?: ISearchProductViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n productSuggestions && (\n <Node {...ProductSuggest}>\n <Node {...UlProduct}>\n {productSuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest && productSuggestions.items.map((item, index) => {\n return (\n <Node {...item.LiProduct} key={item.id || index}>\n <Node {...item.AProduct}>\n {item.thumbnail}\n {item.text}\n {item.price}\n </Node>\n </Node>\n );\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderCategorySuggestions = (\n CategorySuggest: INodeProps,\n UlCategory: INodeProps,\n categorySuggestions?: ISearchCategoryViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n categorySuggestions && (\n <Node {...CategorySuggest}>\n <Node {...UlCategory}>\n {categorySuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest && categorySuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nexport default SearchView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Alert, Button, INodeProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\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/**\n * On apply function.\n * @param onApplyGiftCard -On apply gift card.\n * @returns Apply gift card.\n */\nconst onApplyHandler = (onApplyGiftCard: () => Promise<void>) => async (event: React.SyntheticEvent): Promise<void> => {\n event.preventDefault();\n await onApplyGiftCard();\n};\n\n/**\n * On change number function.\n * @param onEnterGiftCardNumber -On enter gift card number.\n * @returns On gift card enter pin function result.\n */\nconst onChangeNumberHandler = (onEnterGiftCardNumber: (giftCardNumber: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardNumber(value);\n};\n\n/**\n * On change pin function.\n * @param onEnterGiftCardPin -On enter gift card pin.\n * @returns On enter gift card pin function result.\n */\nconst onChangePinHandler = (onEnterGiftCardPin: (giftCardPin: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardPin(value);\n};\n\n/**\n * On change exp function.\n * @param onEnterGiftCardExp -On enter gift card.\n * @returns On enter gift card function result.\n */\nconst onChangeExpHandler = (onEnterGiftCardExp: (giftCardExp: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardExp(value);\n};\n\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 formProps = {\n className: classnames('ms-gift-card-balance-check__form', { 'is-invalid': !!errorMessage }),\n onSubmit: onApplyHandler(onApplyGiftCard),\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={onChangeNumberHandler(onEnterGiftCardNumber)}\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={onChangePinHandler(onEnterGiftCardPin)}\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={onChangeExpHandler(onEnterGiftCardExp)}\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={onApplyHandler(onApplyGiftCard)}\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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { GiftCard } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\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 * GiftCardItem component.\n * @param root0\n * @param root0.giftCard\n * @param root0.getFormattedPrice\n * @param root0.resources\n * @param root0.resources.enteredGiftCardLabel\n * @param root0.resources.giftCardAvailableBalanceLabel\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}\n {' '}\n {giftCardLast4Digit}\n {' '}\n (\n {giftCardAvailableBalanceLabel}\n {' '}\n <span className='ms-gift-card-balance-check__balance'>\n {balance}\n </span>\n )\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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\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 { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport * as React from 'react';\n\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\nenum 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 readonly inputRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private readonly inputPinRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private readonly inputExpRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n public shouldComponentUpdate(nextProps: IGiftCardBalanceCheckModuleProps,\n nextState: IGiftCardBalanceCheckState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | 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;\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 readonly _isEnabled = (): boolean => {\n if (!this.props.context.request.user.isAuthenticated &&\n this.props.context.app.config.giftCardSupported !== SupportedGiftCardType.External &&\n !this.props.config.shouldBeEnabledForGuest) {\n return false;\n }\n return true;\n };\n\n private readonly _getFormattedPrice = (price: number = 0, currencyCode: string = 'USD'): string => {\n return this.props.context.cultureFormatter.formatCurrency(price, currencyCode);\n };\n\n private readonly _enterGiftCardNumber = (giftCardNumber: string): void => {\n this.setState({\n giftCardNumber\n });\n this._clearError();\n };\n\n private readonly _enterGiftCardPin = (giftCardPin: string): void => {\n this.setState({\n giftCardPin\n });\n this._clearError();\n };\n\n private readonly _enterGiftCardExp = (giftCardExp: string): void => {\n this.setState({\n giftCardExp\n });\n this._clearError();\n };\n\n private readonly _clearError = (): void => {\n this.setState({\n errorMessage: ''\n });\n };\n\n private readonly _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 readonly _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\n });\n return Promise.resolve();\n }\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 readonly _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 readonly _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 = Number.parseInt(giftCardExp.split('/')[0], 10);\n const year = Number.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 readonly _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 return resolveCardTypesAsync({ callerContext: this.props.context.actionContext }, giftCardNumber, CardType.GiftCard)\n .then(giftCardTypes => {\n if (!giftCardTypes || giftCardTypes.length === 0 || giftCardTypes[0] === undefined) {\n this._setError(invalidCodeError);\n return;\n }\n return giftCardTypes;\n })\n .catch(error => {\n this._setError(invalidCodeError);\n return undefined;\n });\n };\n}\n\nexport default GiftCardBalanceCheck;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\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 { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\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<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): 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<IRefineSubmenuProps>}\n */\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\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\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps,\n nextState: IRefineSubmenuState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\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 <div className={`ms-refine-submenu list-group ${productRefinerHierarchy.KeyName}`}>\n <Button\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\n aria-label={productRefinerHierarchy.KeyName || 'refiner.Name'}\n onClick={this._onToggleSubmenu}\n aria-expanded={this.state.expanded}\n >\n {productRefinerHierarchy.KeyName}\n </Button>\n <Collapse isOpen={this.state.expanded} timeout={350}>\n {this._renderChildItems(productRefinerHierarchy)}\n </Collapse>\n </div>\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,\n productCountAriaLabel, singleProductCountAriaLabel, refineItemAriaLabel, refineItemsAriaLabel, isMobile } = this.props;\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\n const role = isSingleSelect ? { role: 'listbox' } : 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 <RefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue => 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 productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n <ul className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`} {...role} aria-label={productRefinerHierarchy.KeyName}>\n {listItems}\n </ul>\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 <li className={`${submenuClassNamePrefix}--range`} key={index}>\n <RangeRefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n rangeType={rangeType}\n key={key}\n sliderKey={key}\n context={context}\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n />\n </li>\n );\n });\n return (<ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>\n {listItems}\n </ul>);\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;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, IActionContext, IActionInput } from '@msdyn365-commerce/core';\n\nimport { IModuleStates } from './module-state.data';\n\n/**\n * GetModulesInput.\n */\nexport class ModuleStatesCacheKey implements IActionInput {\n public getCacheKey = () => 'ModuleState';\n\n public getCacheObjectType = () => 'ModuleState';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nexport function getModuleStates(ctx: IActionContext): IModuleStates {\n const cacheKey = new ModuleStatesCacheKey();\n\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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (<span>\n {' '}\n {separator}\n {' '}\n</span>);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport ReviewsList from './reviews-list';\nimport ReviewsListView from './reviews-list.view';\n\nexport * from './components/components';\nexport * from './components/report-review-modal';\nexport * from './components/review-card';\nexport * from './reviews-list';\nexport * from './reviews-list.data';\nexport * from './reviews-list.props.autogenerated';\nexport * from './reviews-list.view';\n\nexport {\n ReviewsList,\n ReviewsListView\n};\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\r\nimport { IComponentProps } from '@msdyn365-commerce/core';\r\nimport React, { useState } from 'react';\r\n\r\nconst modalCloseButtonReference: React.RefObject<HTMLButtonElement> = React.createRef();\r\n\r\n/**\r\n * The Create Order Template Button Props.\r\n */\r\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\r\n\r\n /**\r\n * The label for create order template.\r\n */\r\n createOrderTemplateText: string;\r\n\r\n /**\r\n * The create order template dialog resources.\r\n */\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n\r\n /**\r\n * The delegate to fire when dialog captured any user entry.\r\n */\r\n onOrderTemplateCreated(): Promise<void>;\r\n}\r\n\r\nconst CreateOrderTemplateButton: React.FC<ICreateOrderTemplateButtonProps> = (props) => {\r\n const onCancelHandler = React.useCallback(() => {\r\n return;\r\n }, []);\r\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\r\n const onCreateButtonClick = React.useCallback(() => {\r\n setOrderTemplateNameDialogOpen(true);\r\n }, []);\r\n\r\n return (\r\n <>\r\n <button\r\n className='ms-order-template__add-template-button msc-btn btn-primary'\r\n color='primary'\r\n onClick={onCreateButtonClick}\r\n ref={modalCloseButtonReference}\r\n aria-label={props.createOrderTemplateText}\r\n >\r\n {props.createOrderTemplateText}\r\n </button>\r\n <OrderTemplateNameDialog\r\n className='msc-order-template-name-dialog'\r\n modalOpen={isCreateOrderTemplateDialogOpen}\r\n isUpdateDialog={false}\r\n setModalOpen={setOrderTemplateNameDialogOpen}\r\n context={props.context}\r\n id={props.id}\r\n data={{}}\r\n typeName={props.typeName}\r\n dialogStrings={props.createOrderTemplateDialogResources}\r\n onCancel={onCancelHandler}\r\n onSuccess={props.onOrderTemplateCreated}\r\n parentElementRef={modalCloseButtonReference}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default CreateOrderTemplateButton;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport const SignInMessage: React.FC<{ text: string }> = (props: { text: string }) => {\n return (<p className='ms-write-review__sign-in'>\n {props.text}\n </p>);\n};\n\nexport const SignInButton: React.FC<{ text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent }> = (props: { text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent }) => {\n const { text, href, ariaLabel, telemetryContent } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (<a\n href={href} className='ms-write-review__sign-in-btn msc-btn' aria-label={ariaLabel}\n {...attributes}>\n {text}\n </a>);\n};\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, telemetryContent, id } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.WriteReview);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (<button\n id={id} className='ms-write-review__toggle msc-btn' aria-label={ariaLabel}\n onClick={onClick} ref={innerRef} {...attributes}>\n {text}\n </button>);\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { TOGGLE_REVIEW_MODAL_BUTTON_ID } from '../../common/rnrInterface';\nimport { ModalToggle, SignInButton, SignInMessage } from './components/components';\nimport { IWriteReviewData } from './write-review.data';\nimport { IWriteReviewProps } from './write-review.props.autogenerated';\n\nexport interface IWriteReviewCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(product: SimpleProduct, title: string, text: string, rating: number, context: Msdyn365.ICoreContext, userReview?: Review, onReviewSubmission?: (isSuccessful: boolean) => void): void;\n}\n\nexport interface IWriteReviewState {\n rating: number;\n reviewTitle: string;\n reviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n}\n\nexport interface IWriteReviewViewProps extends IWriteReviewProps<IWriteReviewData> {\n state: IWriteReviewState;\n className: string;\n callbacks: IWriteReviewCallbacks;\n signInMessage: React.ReactNode;\n signInButton: React.ReactNode;\n modalToggle: React.ReactNode;\n reviewModal: IReviewModalViewProps;\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n}\n\n/**\n * This module is enables user's to leave ratings and reviews on a specific product\n * WriteReview module.\n * @extends {React.PureComponent<IWriteReviewProps<IWriteReviewData>>}\n */\nclass WriteReview extends React.PureComponent<IWriteReviewProps<IWriteReviewData>, IWriteReviewState> {\n private readonly _modalToggleRef: React.RefObject<HTMLButtonElement> | undefined;\n\n private readonly telemetryContent: ITelemetryContent;\n\n public constructor(props: IWriteReviewProps<IWriteReviewData>) {\n super(props);\n const { userReview: { result: userReview } } = this.props.data;\n this._toggleReviewModal = this._toggleReviewModal.bind(this);\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\n const rating = userReview ? userReview.rating : 0;\n const reviewTitle = userReview ? userReview.title : '';\n const reviewText = userReview ? userReview.reviewText : '';\n\n this.state = {\n isReviewModalOpen: false,\n rating,\n reviewTitle,\n reviewText,\n hasReviewError: false\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public render(): JSX.Element {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const { product: { result: product }, userReview: { result: userReview } } = this.props.data;\n\n const userInfo = this.props.context && this.props.context.request && this.props.context.request.user;\n const completeClass = classnames('ms-write-review', 'msc-modal-input-required', className);\n const viewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass,\n id: null\n },\n callbacks: this.writeReviewCallbacks,\n signInMessage: <SignInMessage text={resources.signInMessage} />,\n signInButton: <SignInButton\n text={resources.signInLabel} ariaLabel={resources.signInAriaLabel} href={userInfo.signInUrl!}\n telemetryContent={this.telemetryContent} />,\n modalToggle: product && (\n <ModalToggle\n text={userReview ? resources.editReviewButtonText : resources.reviewButtonLabel}\n ariaLabel={resources.reviewButtonLabel}\n innerRef={this._modalToggleRef}\n onClick={this._toggleReviewModal}\n id={TOGGLE_REVIEW_MODAL_BUTTON_ID}\n telemetryContent={this.telemetryContent}\n />\n ),\n reviewModal: this._buildUserReviewModal(),\n heading: heading && heading.text && (\n <Msdyn365.Text\n className='ms-write-review__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n )\n } as IWriteReviewViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private readonly _onTitleChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n this.writeReviewCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent<HTMLTextAreaElement>): void => {\n this.writeReviewCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.writeReviewCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else if (userReview) {\n this.setState({\n isReviewModalOpen: true,\n reviewText: userReview.reviewText,\n reviewTitle: userReview.title,\n rating: userReview.rating\n });\n } else {\n this.setState({\n isReviewModalOpen: true,\n reviewText: '',\n reviewTitle: '',\n rating: 0\n });\n }\n };\n\n /**\n * This method builds the user review modal.\n * @param config The module config.\n */\n private _buildUserReviewModal(): IReviewModalViewProps {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.rating,\n reviewTitle: this.state.reviewTitle,\n reviewText: this.state.reviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this.writeReviewCallbacks.onReviewSubmitted,\n renderContextId: 'writeReview',\n returnRef: this._modalToggleRef,\n hasError: this.state.hasReviewError,\n telemetryContent: this.telemetryContent\n });\n }\n\n private readonly writeReviewCallbacks: IWriteReviewCallbacks = {\n toggleModal: this._toggleReviewModal,\n updateReviewTitle: (title: string): void => {\n this.setState({ reviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ reviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview\n };\n}\n\nexport default WriteReview;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n <Module {...MediaGallery}>\n <Node {...CarouselProps} />\n {Modal}\n {_renderThumbnails(Thumbnails)}\n </Module>\n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n <Node {...ThumbnailsContainerProps}>\n <Node {...SingleSlideCarouselComponentProps}>\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","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent, RatingComponent } from '@msdyn365-commerce/components';\nimport { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * IActiveProductProps interface.\n */\nexport interface IActiveProductProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n}\n\n/**\n * IActiveProduct interface.\n */\nexport interface IActiveProduct extends IComponent<IActiveProductProps> { }\n\n/**\n * RenderDescription function.\n * @param description - Product description string.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderDescription(description?: string): JSX.Element | null {\n return (\n <p className='msc-active-image-product__text'>\n {description}\n </p>\n );\n}\n\n/**\n * GetRatingAriaLabel function.\n * @param rating - Product rating number.\n * @param ratingAriaLabel - Product rating aria label.\n * @returns - Returns string.\n */\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n const numberTwo: number = 2;\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(numberTwo);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\n/**\n * RenderRating function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param ratingId - The rating id.\n * @param avgRating - The average rating.\n * @param totalRatings - The total ratings.\n * @param ariaLabel - The rating aria label.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderRating(context: ICoreContext, typeName: string, ratingId: string,\n avgRating?: number, totalRatings?: number, ariaLabel?: string): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = (totalRatings?.toString()) ?? undefined;\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\n\n return (\n <RatingComponent\n context={context}\n id={ratingId}\n typeName={typeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabel}\n data={{}}\n />\n );\n}\n\n/**\n * RenderPrice function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param productId - The product id.\n * @param basePrice - The base price of the product.\n * @param adjustedPrice - The adjusted price of the product.\n * @param savingsText - The savings text of the product.\n * @param freePriceText - The free price text.\n * @param originalPriceText - The original price text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderPrice(context: ICoreContext, typeName: string, productId: string,\n basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string,\n originalPriceText?: string): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n <PriceComponent\n context={context}\n id={productId}\n typeName={typeName}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n />\n );\n}\n\n/**\n * RenderProductPlacementImage function.\n * @param requestContext - RequestContext.\n * @param imageSettings - The product image settings.\n * @param gridSettings - The viewport gird settings.\n * @param imageUrl - The product image url.\n * @param altText - The product image alt text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderProductPlacementImage(\n requestContext: IRequestContext,\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const imgData: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n <Image\n {...imgData}\n {...imageProps}\n requestContext={requestContext}\n loadFailureBehavior='empty' />\n );\n}\n\n/**\n * ActiveProduct constant.\n * @param props - The active product props.\n * @param props.data - The product search result data.\n * @param props.context - The core context.\n * @param props.imageSettings - The prodcut image settings.\n * @param props.savingsText - The product savings text.\n * @param props.freePriceText - The free price text.\n * @param props.originalPriceText - The original price text.\n * @param props.ratingAriaLabel - The product rating aria label.\n * @param props.typeName - The type name of the module.\n * @param props.id - The id of the product.\n * @returns - Returns JSX.Element | null.\n */\nexport const ActiveProductComponent: React.FC<IActiveProductProps> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n ratingAriaLabel,\n typeName,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Do not need naming convention check for library prameters\n id\n}) => {\n const product = data.product;\n if (!product) {\n return null;\n }\n\n return (\n <>\n <div className='msc-active-image-product'>\n <div className='msc-active-image-product__image'>\n {renderProductPlacementImage(\n context.actionContext.requestContext,\n imageSettings, context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name)}\n </div>\n <div className='msc-active-image-product__details'>\n <h4 className='msc-active-image-product__title'>\n {product.Name}\n </h4>\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText)}\n {renderDescription(product.Description)}\n {\n !context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)\n }\n </div>\n </div>\n </>\n );\n};\n\nexport default ActiveProductComponent;\n\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * ILinksData: Interface for\n * Additional content.\n */\ninterface ILinksData {\n linkText?: string;\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n isOpenInNewTab?: boolean;\n}\n\n/**\n * IAdditionalContentData: Interface for\n * Active content.\n */\ninterface IAdditionalContentData {\n heading?: string;\n subtext?: string;\n links?: ILinksData[];\n}\n\n/**\n * IActiveImageAdditionalContentProps: Interface for\n * Active Image Additional Content Component props.\n */\nexport interface IActiveImageAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IActiveImageAdditionalContentViewProps: Interface for\n * Active Image Additional Content view props.\n */\nexport interface IActiveImageAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Active Image Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='msc-active-image__details__additional-content__text'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: (event) => {\n props.handleAdditionalTextChange(event);\n }, requestContext\n }}\n />);\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Active Image Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='msc-active-image__details__additional-content__paragraph'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: (event) => {\n props.handleAdditionalTextChange(event);\n }, requestContext\n }}\n />);\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Active Image Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IActiveImageAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'msc-active-image__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.isOpenInNewTab,\n role: 'button'\n };\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Link\n key={linkIndex}\n link={editableLink}\n editProps={{\n /**\n * Handle additional Link Text change.\n * @param event - The keyboard event.\n */\n onTextChange: (event) => {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Active Image additonal content item props.\n * @param props - Active Image Additional content component props.\n * @returns IActiveImageAdditionalContentItemViewProps.\n */\nconst assembleNode = (\n item: IAdditionalContentData,\n props: IActiveImageAdditionalContentProps\n): IActiveImageAdditionalContentViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n additionalContentNode: { className: 'msc-active-image__details__additional-content' },\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentContainer: { className: 'msc-active-image__details__additional-content__container' },\n additionalContentItemLinks: { className: 'msc-active-image__details__additional__content__cta' }\n };\n};\n\n/**\n * ActiveImageAdditionalContent component.\n * @param props - Active Image Additional content component props.\n * @returns Active Image Additional content view props.\n */\nexport const activeImageAdditionalContent = (props: IActiveImageAdditionalContentProps): IActiveImageAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n return assembleNode(additionalContent, props);\n};\n\nexport default activeImageAdditionalContent;\n\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365, { IImageData, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent<HTMLAreaElement, MouseEvent> | React.FocusEvent<HTMLAreaElement>;\n\n/**\n * @interface IRgbColor\n * @description - The IRgbColor interface contract.\n */\nexport interface IRgbColor {\n rValue: number;\n gValue: number;\n bValue: number;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IArea {\n areaId: string;\n coords: number[];\n href?: string;\n center?: number[];\n primaryImageUrl?: string;\n productUrl: string;\n productSearchResult?: ProductSearchResult;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IAreaMap {\n name: string;\n areas: IArea[];\n}\n\n/**\n * @enum CanvasCalculations\n * @description - The canvas calculations enum.\n */\nexport enum CanvasCalculations {\n defaultWidth = 0,\n defaultHeight = 0,\n defaultPositionX = 0,\n defaultPositionY = 0,\n defaultScale = 1,\n halfDivisor = 2,\n doubleMultiplier = 2,\n buttonHeight = 30,\n buttonPadding = 30,\n paddingAdjustment = 3,\n expandAnimationStartWidth = 10,\n expandAnimationEndWidth = 40,\n collapseAnimationStartWidth = 40,\n collapseAnimationEndWidth = 8,\n expandRadius = 12,\n collapseRadius = 8,\n rotation = 1.57,\n startAngle = 0,\n endAngle = 7,\n clearMargin = 50,\n clearHeight = 100,\n clearWidth = 100,\n textFadeInStartValue = 0,\n textFadeOutStartValue = 0.5,\n textFadeInterval = 0.01\n}\n\n/**\n * @enum CanvasStyles\n * @description - The canvas styles enum.\n */\nexport enum CanvasStyles {\n color = '#FFFFFF',\n buttonTextClor = '#000000'\n}\n\n/**\n * @enum\n * @description - The canvas styles enum.\n */\nexport interface IImageMapperResources {\n buttonText?: string;\n altText?: string;\n}\n\n/**\n * @interface IImageMapperProps\n * @description - The IImageMapperProps interface contract.\n */\nexport interface IImageMapperProps {\n imageData: IImageData;\n areaMap: IAreaMap;\n viewPort: string;\n requestContext: IRequestContext;\n color?: string;\n buttonTextClor?: string;\n width?: number;\n imgWidth?: number;\n activeImageRefs: React.RefObject<HTMLDivElement>;\n imageMapperResources?: IImageMapperResources;\n onLoad?(): void;\n onClick?(area: IArea, index: number, event: AreaEvent): void;\n onFocus?(area: IArea, index: number, event: AreaEvent): void;\n onMouseEnter?(area: IArea, index: number, event: AreaEvent): void;\n onMouseLeave?(area: IArea, index: number, event: AreaEvent): void;\n}\n\n/**\n * ImageMapper.\n */\nexport class ImageMapper extends React.Component<IImageMapperProps> {\n private readonly _backgroundImage: React.RefObject<Image>;\n\n private readonly _container: React.RefObject<HTMLDivElement>;\n\n private readonly _canvas: React.RefObject<HTMLCanvasElement>;\n\n private _isDesktopViewPort: boolean = false;\n\n private _context: CanvasRenderingContext2D | null | undefined = null;\n\n public constructor(props: IImageMapperProps) {\n super(props);\n this._backgroundImage = React.createRef();\n this._container = React.createRef();\n this._canvas = React.createRef();\n }\n\n /**\n * ComponentDidMount method.\n */\n public componentDidMount(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n this.renderAreas();\n this._context = null;\n }\n\n /**\n * ComponentDidUpdate method.\n */\n public componentDidUpdate(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n }\n\n /**\n * ShouldComponentUpdate method.\n * @param nextProps - Next props.\n * @returns Returns boolean.\n */\n public shouldComponentUpdate(nextProps: IImageMapperProps): boolean {\n let shouldRender = false;\n if (nextProps !== this.props) {\n shouldRender = true;\n }\n return shouldRender;\n }\n\n /**\n * GetActiveImageWidth method - Gets the active image width.\n * @returns Returns number | undefined.\n */\n public getActiveImageWidth = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return undefined;\n };\n\n /**\n * GetActiveImageHeight method - Gets the active image height.\n * @returns Returns number | undefined.\n */\n public getActiveImageHeight = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return undefined;\n };\n\n /**\n * ConvertHexToRgb method - This method takes color in HEX format and returns IRgbColor color object.\n * @param hexColor -The color hex value.\n * @returns -Returns IRgbColor object.\n */\n public convertHexToRgb = (hexColor: string): IRgbColor => {\n // RegEx used to execute the conversion of the hex color to rgb value.\n const regEx = new RegExp('^#?([a-f\\\\d]{2})([a-f\\\\d]{2})([a-f\\\\d]{2})$', 'u');\n\n // RegEx.exec method executes a search for a match in a specified string. Returns a result array, or null.\n const result = regEx.exec(hexColor);\n const defaultValue = 0;\n return result ? {\n rValue: Number.parseInt(result[1], 16),\n gValue: Number.parseInt(result[2], 16),\n bValue: Number.parseInt(result[3], 16)\n } : {\n rValue: defaultValue,\n gValue: defaultValue,\n bValue: defaultValue\n };\n };\n\n /**\n * ApplyFadingTransition method - Applys fading transition to button text.\n * @param text -The button text.\n * @param coords -The coordinates.\n * @param rgbColor -The RGB color object.\n * @param alpha -The alpha value of the button text.\n */\n public applyFadingTransition = (text: string, coords: number[], rgbColor: IRgbColor, alpha: number): void => {\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n context.fillStyle = `rgba(${rgbColor.rValue}, ${rgbColor.gValue}, ${rgbColor.bValue}, ${alpha} )`;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + (buttonWidth / halfDivisor) - (buttonPadding / halfDivisor), coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - (buttonWidth / halfDivisor) + (buttonPadding / halfDivisor), coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * Draw button method - Draws button and contains fixed hight, padding values.\n * @param text -The button text.\n * @param coords -The coordinates.\n */\n public drawButton = (text: string, coords: number[]): void => {\n const {\n color = CanvasStyles.color,\n buttonTextClor = CanvasStyles.buttonTextClor\n } = this.props;\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonHeight = CanvasCalculations.buttonHeight;\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n const buttonPositionX = coords[0] - (buttonWidth / halfDivisor);\n const buttonPositionY = coords[1] - (buttonHeight / halfDivisor);\n const arcsize = buttonHeight / halfDivisor;\n\n context.beginPath();\n context.moveTo(buttonPositionX + arcsize, buttonPositionY);\n context.lineTo(buttonPositionX + buttonWidth - arcsize, buttonPositionY);\n context.arcTo(buttonPositionX + buttonWidth, buttonPositionY, buttonPositionX + buttonWidth, buttonPositionY + arcsize, arcsize);\n context.lineTo(buttonPositionX + buttonWidth, buttonPositionY + buttonHeight - arcsize);\n context.arcTo(buttonPositionX + buttonWidth, buttonPositionY + buttonHeight,\n buttonPositionX + buttonWidth - arcsize, buttonPositionY + buttonHeight, arcsize);\n context.lineTo(buttonPositionX + arcsize, buttonPositionY + buttonHeight);\n context.arcTo(buttonPositionX, buttonPositionY + buttonHeight, buttonPositionX, buttonPositionY - arcsize, arcsize);\n context.lineTo(buttonPositionX, buttonPositionY + arcsize);\n context.arcTo(buttonPositionX, buttonPositionY, buttonPositionX + arcsize, buttonPositionY, arcsize);\n context.lineTo(buttonPositionX + arcsize, buttonPositionY);\n context.stroke();\n context.closePath();\n context.fillStyle = color;\n context.fill();\n context.fillStyle = buttonTextClor;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + (buttonWidth / halfDivisor) - (buttonPadding / halfDivisor), coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - (buttonWidth / halfDivisor) + (buttonPadding / halfDivisor), coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * ExpandAnimation method - Shows expand animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public expandAnimation = (coords: number[]): void => {\n const {\n color = CanvasStyles.color,\n buttonTextClor = CanvasStyles.buttonTextClor\n } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.expandAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.expandAnimationEndWidth;\n const radius = CanvasCalculations.expandRadius;\n const rotation = CanvasCalculations.rotation;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeInValue = CanvasCalculations.textFadeInStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Reders expand animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n context.fillStyle = color;\n if (buttonText) {\n if (animationStartWidth < animationEndWidth) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeInValue);\n textFadeInValue += CanvasCalculations.textFadeInterval;\n animationStartWidth++;\n } else {\n this.drawButton(buttonText, [pointPositionX, pointPositionY]);\n }\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n\n };\n\n /**\n * CollapseAnimation method - Shows collapse animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public collapseAnimation = (coords: number[]): void => {\n const {\n color = CanvasStyles.color,\n buttonTextClor = CanvasStyles.buttonTextClor\n } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.collapseAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.collapseAnimationEndWidth;\n const rotation = CanvasCalculations.rotation;\n const clearMargin = CanvasCalculations.clearMargin;\n const clearHeight = CanvasCalculations.clearHeight;\n const clearWidth = CanvasCalculations.clearWidth;\n const radius = CanvasCalculations.collapseRadius;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeOutValue = CanvasCalculations.textFadeOutStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Renders collapse animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.clearRect(pointPositionX - clearMargin, pointPositionY - clearMargin, clearWidth, clearHeight);\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n if (animationEndWidth < animationStartWidth && buttonText) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeOutValue);\n textFadeOutValue -= CanvasCalculations.textFadeInterval;\n animationStartWidth--;\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n\n };\n\n /**\n * DrawCircle method - Renders active points.\n * @param coords -Coordinates.\n */\n public drawCircle = (coords: number[]): void => {\n const {\n color = CanvasStyles.color,\n viewPort\n } = this.props;\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n const startAngle: number = CanvasCalculations.startAngle;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n const radius = (viewPort === 'xs' || viewPort === 'sm') ? coords[2] * doubleMultiplier : coords[2];\n if (!context) {\n return;\n }\n context.fillStyle = color;\n context.beginPath();\n context.strokeStyle = color;\n context.arc(coords[0], coords[1], radius, startAngle, Math.PI * doubleMultiplier);\n context.closePath();\n context.stroke();\n context.fill();\n };\n\n /**\n * ScaleCoords method - To scale the active point coordinates based on the window size.\n * @param coords -Coordinates.\n * @returns -Returns number[].\n */\n public scaleCoords = (coords: number[]): number[] => {\n const {\n imgWidth\n } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultScale: number = CanvasCalculations.defaultScale;\n\n // Calculate scale based on current 'width' and the original 'imgWidth'\n const width = this.getActiveImageWidth();\n const scale = width && imgWidth && imgWidth > defaultWidth ? width / imgWidth : defaultScale;\n return coords.map(coord => coord * scale);\n };\n\n /**\n * RenderPrefilledAreas method - To render active points in case of events.\n */\n public renderPrefilledAreas = (): void => {\n const {\n areaMap\n } = this.props;\n areaMap.areas.map(area => {\n this.drawCircle(this.scaleCoords(area.coords));\n return null;\n });\n };\n\n /**\n * ComputeCenter method - To re-calculate the center of active point based on window size.\n * @param area -IArea.\n * @returns -Returns number[].\n */\n public computeCenter = (area: IArea): number[] => {\n const scaledCoords = this.scaleCoords(area.coords);\n return [scaledCoords[0], scaledCoords[1]];\n };\n\n /**\n * HandleHoverOn method - To handle mouse hover on event.\n * @param area -IArea.\n */\n public handleHoverOn = (area: IArea): void => {\n if (area.center && this._canvas.current) {\n this.drawCircle(this.scaleCoords(area.coords));\n this.expandAnimation(area.center);\n }\n };\n\n /**\n * HandleHoverOff method - To handle mouse hover off event.\n * @param area -IArea.\n */\n public handleHoverOff = (area: IArea): void => {\n if (this._canvas.current) {\n const context = this._canvas.current.getContext('2d') ?? this._context;\n const canvasPositionX: number = CanvasCalculations.defaultPositionX;\n const canvasPositionY: number = CanvasCalculations.defaultPositionY;\n\n if (!context) {\n return;\n }\n context.clearRect(canvasPositionX, canvasPositionY, this._canvas.current.width, this._canvas.current.height);\n this.renderPrefilledAreas();\n if (area.center) {\n this.collapseAnimation(area.center);\n }\n }\n };\n\n /**\n * Click method - Mouse click event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public click = (area: IArea, index: number) => (event: AreaEvent): void => {\n const {\n onClick\n } = this.props;\n if (onClick) {\n event.preventDefault();\n onClick(area, index, event);\n }\n };\n\n /**\n * HoverOn method - Mouse hover on event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOn = (area: IArea, index: number) => (event: AreaEvent): void => {\n const {\n onMouseEnter\n } = this.props;\n this.handleHoverOn(area);\n if (onMouseEnter) {\n onMouseEnter(area, index, event);\n }\n };\n\n /**\n * HoverOff method - Mouse hover off event.\n * @param area - IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOff = (area: IArea, index: number) => (event: AreaEvent): void => {\n const {\n onMouseLeave\n } = this.props;\n\n this.handleHoverOff(area);\n\n if (onMouseLeave) {\n onMouseLeave(area, index, event);\n }\n };\n\n /**\n * RenderAreas method - Renders active points at given coordinates.\n * @returns -Returns JSX.Element[].\n */\n public renderAreas = (): JSX.Element[] => {\n const {\n areaMap,\n viewPort\n } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText ? this.props.imageMapperResources.buttonText : '';\n const altText = this.props.imageMapperResources?.altText ? this.props.imageMapperResources.altText : '';\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n\n return areaMap.areas.map((area, index) => {\n const scaledCoords = this.scaleCoords(area.coords);\n const xsRadius = area.coords[2] * doubleMultiplier;\n if (viewPort === 'xs') {\n scaledCoords[2] = xsRadius;\n }\n const center = this.computeCenter(area);\n const extendedArea = { ...area, scaledCoords, center };\n const areaKey = `area-${index}`;\n const altTextWithProductName = altText.replace('{buttonText}', buttonText ? buttonText : '')\n .replace('{productName}', area.productSearchResult?.Name ? area.productSearchResult.Name : '');\n return (\n <area\n key={areaKey}\n shape='circle'\n coords={scaledCoords.join(',')}\n onMouseEnter={this.hoverOn(extendedArea, index)}\n onMouseLeave={this.hoverOff(extendedArea, index)}\n onClick={this.click(extendedArea, index)}\n onFocus={this.hoverOn(extendedArea, index)}\n onBlur={this.hoverOff(extendedArea, index)}\n href={area.productUrl}\n tabIndex={0}\n alt={altTextWithProductName}\n aria-label={altTextWithProductName}\n />\n );\n });\n };\n\n /**\n * InitCanvas method - To render the canvas.\n */\n public initCanvas = (): void => {\n if (!this._canvas.current || !this._backgroundImage.current || !this._container.current) {\n return;\n }\n\n const {\n color,\n onLoad\n } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultHeight: number = CanvasCalculations.defaultHeight;\n\n const canvasWidth = this.getActiveImageWidth() ?? defaultWidth;\n const canvasHeight = this.getActiveImageHeight() ?? defaultHeight;\n\n this._canvas.current.width = canvasWidth;\n this._canvas.current.height = canvasHeight;\n this._container.current.style.width = `${canvasWidth}px`;\n\n const context = this._canvas.current.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.fillStyle = color ?? '';\n\n if (onLoad) {\n onLoad();\n }\n\n this.renderPrefilledAreas();\n };\n\n /**\n * Render method - To render the image mapper component with active image, canvas and active points.\n * @returns -Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n\n const {\n imageData,\n areaMap,\n requestContext\n } = this.props;\n\n return (\n <div className='msc-active-image-container' ref={this._container}>\n <Image\n src={imageData.src}\n useMap={`#${areaMap.name}`}\n alt={areaMap.name}\n ref={this._backgroundImage}\n height={imageData.height}\n width={imageData.width}\n className='msc-active-image-img'\n imageSettings={imageData.imageSettings}\n gridSettings={requestContext.gridSettings ?? {}}\n requestContext={requestContext}\n />\n <canvas ref={this._canvas} className='msc-active-image-canvas' />\n <map name={areaMap.name} className='msc-active-image-map'>\n {this.renderAreas()}\n </map>\n </div>\n );\n }\n}\n\nexport default ImageMapper;\n\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject, getTelemetryAttributes, getTelemetryObject,\n IModuleProps, INodeProps, isMobile, ITelemetryContent, VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n activeImageAdditionalContent,\n ActiveProductComponent,\n IActiveImageAdditionalContentViewProps,\n IArea,\n IAreaMap,\n IImageMapperProps,\n ImageMapper\n} from '../active-image-utilities';\nimport { IActiveImageData } from './active-image.data';\nimport { IActiveImageProps } from './active-image.props.autogenerated';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent<HTMLAreaElement, MouseEvent> | React.FocusEvent<HTMLAreaElement>;\n\n/**\n * @interface IActiveImageViewProps\n * @classdesc - The IActiveImageViewProps interface contract.\n */\nexport interface IActiveImageViewProps extends IActiveImageProps<{}>, IImageMapperProps {\n activePointContainer: IModuleProps;\n activePointDetailsContainer: INodeProps;\n imageMapper: React.ReactNode;\n overlay: React.ReactNode;\n productCard: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IActiveImageAdditionalContentViewProps;\n productCardleftPosition: number;\n productCardtopPosition: number;\n handleAdditionalText?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalParagraph?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalLinkText?(event: MsDyn365.ContentEditableEvent): void;\n}\n\n/**\n * @interface IActiveImageLinksData\n * @classdesc - The IActiveImageLinksData interface contract.\n */\nexport interface IActiveImageLinksData {\n linkText?: string;\n linkUrl: MsDyn365.ILinkData;\n ariaLabel?: string;\n willOpenInNewTab?: boolean;\n}\n\n/**\n * @interface IActiveImageState\n * @classdesc - The IActiveImageState interface contract.\n */\ninterface IActiveImageState {\n clientWidth: number;\n area: IArea | null;\n viewport: string;\n overlayClass: string;\n}\n\n/**\n * @enum ActiveImageConstants\n * @description - The active image constants enum.\n */\nexport enum ActiveImageConstants {\n timeoutInterval = 200,\n enterKey = 'Enter',\n escKey = 'Escape'\n}\n\n/**\n *\n * ActiveImage class.\n * @extends {React.PureComponent<IActiveImageProps<{}> & IImageMapperProps, IActiveImageState>}\n */\nexport class ActiveImage extends React.PureComponent<IActiveImageProps<IActiveImageData> & IImageMapperProps, IActiveImageState> {\n private readonly _telemetryContent: ITelemetryContent;\n\n private _isDesktopViewPort: boolean;\n\n private readonly _defaultProductCardWidth: number = 315;\n\n private readonly _defaultProdutCardHight: number = 490;\n\n private readonly _activePoints: IArea[] = [];\n\n private readonly _activeImageRefs: React.RefObject<HTMLDivElement>;\n\n private readonly _activeImageClass: string;\n\n private readonly _productCardDivRef: React.RefObject<HTMLDivElement>;\n\n public constructor(props: IActiveImageProps<IActiveImageData> & IImageMapperProps) {\n super(props);\n this._telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this._activeImageClass = `msc-active-image-${this.getActiveImageId()}`;\n this.state = {\n clientWidth: 0,\n area: null,\n viewport,\n overlayClass: ''\n };\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n this._activeImageRefs = React.createRef();\n this._productCardDivRef = React.createRef();\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('resize', this.updateClientWidth);\n document.addEventListener('keydown', this.keyDown, false);\n document.addEventListener('mousedown', this._handleOutsideClick);\n }\n setTimeout(() => {\n this.updateClientWidth();\n }, ActiveImageConstants.timeoutInterval);\n\n if (MsDyn365.msdyn365Commerce.isBrowser && this._activeImageRefs.current) {\n const images: HTMLCollectionOf<Element> =\n this._activeImageRefs.current.getElementsByClassName('msc-thumbnail_image msc-active-image-img');\n if (ArrayExtensions.hasElements(Array.from(images))) {\n images[0].removeAttribute('usemap');\n }\n }\n }\n\n /**\n * AddActivePoints method - To handle add Active Points.\n * @param area - IArea.\n * @param product - ProductSearchResult.\n * @param coords - Coords.\n * @param productUrl - String.\n */\n public addActivePoints = (area: IArea | undefined, product: ProductSearchResult, coords: number[], productUrl: string): void => {\n if (!area) {\n this._activePoints.push({\n areaId: product.RecordId.toString(),\n coords,\n primaryImageUrl: product.PrimaryImageUrl ?? '',\n productUrl,\n productSearchResult: product\n });\n }\n };\n\n /**\n * ComponentWillUnmount method.\n */\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('resize', this.updateClientWidth);\n document.removeEventListener('keydown', (this.keyDown as unknown) as EventListener, false);\n document.removeEventListener('mousedown', this._handleOutsideClick, false);\n }\n }\n\n /**\n * UpdateClientWidth method to update client width in state.\n */\n public updateClientWidth = (): void => {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this.setState({ clientWidth: this.getActiveImageWidth(), viewport });\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n };\n\n /**\n * Render method.\n * @returns - Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const viewProps: IActiveImageViewProps = {\n ...(this.props as IImageMapperProps & IActiveImageProps<{}>),\n activePointContainer: {\n moduleProps: this.props,\n className: classnames('msc-active-image', this._activeImageClass, this.props.config.className)\n },\n activePointDetailsContainer: {\n tag: 'div',\n className: classnames('msc-active-image-wrapper', this._activeImageClass, this.props.config.className),\n ref: this._activeImageRefs\n },\n imgWidth: this.props.config.canvasWidth,\n imageMapper: this.renderImageMapper(),\n overlay: this.renderOverlay(),\n productCard: this.renderProductCard(),\n productCardleftPosition: this.getProductCardPositionX(),\n productCardtopPosition: this.getProductCardPositionY(),\n title: this.renderActiveImageDetailsHeading(),\n text: this.renderActiveImageDetailsParagraph(),\n links: this.renderActiveImageDetailsLinks(),\n detailsContainer: { className: 'msc-active-image__details' },\n detailsContainerCta: { className: 'msc-active-image__details__cta' },\n additionalContent: activeImageAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleAdditionalLinkText: this.handleAdditionalTextChange\n };\n\n return this.props.renderView(viewProps);\n }\n\n /**\n * RenderImageMapper method - To render image mapper.\n * @returns - Returns React.ReactNode | null.\n */\n public renderImageMapper = (): React.ReactNode | null => {\n const { config, context } = this.props;\n const defaultPosition: number = 0;\n const defaultLength: number = 0;\n const productResults = this.props.data.products.result;\n if (config.activePoints && productResults) {\n for (const product of productResults) {\n for (const configProduct of config.activePoints) {\n if (product.ItemId === configProduct.itemId) {\n const productUrl = getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined);\n const coords = [\n configProduct.xPosition ?? defaultPosition,\n configProduct.yPosition ?? defaultPosition,\n configProduct.radius ?? defaultPosition\n ];\n const area = this._activePoints.find((activePoint) => JSON.stringify(activePoint.coords) === JSON.stringify(coords));\n this.addActivePoints(area, product, coords, productUrl);\n }\n }\n }\n }\n const mappedArea: IAreaMap = {\n name: `map-${this._activeImageClass}`,\n areas: this._activePoints.length > defaultLength ? this._activePoints : []\n };\n\n // If image is null, we want to render the placeholder SVG - by passing image data with empty src\n return (\n <ImageMapper\n viewPort={this.state.viewport}\n requestContext={this.props.context.actionContext.requestContext}\n width={this.state.clientWidth}\n imgWidth={this.props.config.canvasWidth}\n onClick={this.enterArea}\n onFocus={this.enterArea}\n onMouseEnter={this.enterArea}\n onMouseLeave={this.leaveArea}\n imageData={this.props.config.activeImage ?? {}}\n areaMap={mappedArea}\n activeImageRefs={this._activeImageRefs}\n imageMapperResources={{\n altText: this.props.resources.altTextForSeeMoreButtonWithProductName,\n buttonText: this.props.resources.seeMoreButtonText\n }}\n />\n );\n };\n\n /**\n * EnterArea method - To handle mouse enter event.\n * @param area - Active point area.\n * @param index - Active point index.\n * @param event - Active point AreaEvent.\n */\n public enterArea = (area: IArea, index: number, event: AreaEvent): void => {\n this.setState({ area, overlayClass: 'msc-active-image-overlay' });\n if (this.props.onMouseEnter) {\n this.props.onMouseEnter(area, index, event);\n }\n if (event.type.toLocaleLowerCase() === 'click' && this._isDesktopViewPort) {\n window.open(area.productUrl, '_self');\n }\n };\n\n /**\n * LeaveArea method - To handle mouse leave event.\n */\n public leaveArea = (): void => {\n if (this._isDesktopViewPort) {\n this.resetState();\n }\n };\n\n /**\n * ResetState method - To reset the state for area and overlayclass.\n */\n public resetState = (): void => {\n this.setState({ area: null, overlayClass: '' });\n };\n\n /**\n * RenderProductComponent method - To render the product card with product information.\n * @returns - Returns React.ReactNode.\n */\n public renderProductComponent = (): React.ReactNode => {\n if (this.state.area?.productSearchResult) {\n const baseImageUrl: string = this.props.context.request.apiSettings.baseImageUrl;\n const imageUrl: string = this.state.area.primaryImageUrl ?? '';\n const primaryImageUrl: string = `${baseImageUrl}${imageUrl}`;\n const product: ProductSearchResult = this.state.area.productSearchResult;\n product.PrimaryImageUrl = primaryImageUrl;\n\n return (\n <ActiveProductComponent\n context={this.props.context}\n imageSettings={this.props.config.productImageSettings}\n id={product.ItemId ?? ''}\n typeName={this.props.typeName || ''}\n data={{ product }}\n />\n );\n }\n return React.Fragment;\n };\n\n /**\n * RenderProductCard method - To render product cards.\n * @returns - Returns React.ReactNode.\n */\n public renderProductCard = (): React.ReactNode => {\n const { area } = this.state;\n\n return (\n <>\n {area?.center && (\n <div className='msc-active-image-product-card' ref={this._productCardDivRef}>\n <div className='msc-active-image-product-card-wrapper' key={area.areaId}>\n {!this._isDesktopViewPort && <button onClick={this.resetState} className='close-button' />}\n {area.productSearchResult && this.renderProductComponent()}\n {!this._isDesktopViewPort && <a href={area.productUrl} className='see-more-button'>\n {this.props.resources.seeMoreButtonText}\n </a>}\n </div>\n </div>\n )}\n </>\n );\n };\n\n /**\n * RenderOverlay method - To render overlay for non desktop viewports.\n * @returns - Returns React.ReactNode.\n */\n public renderOverlay = (): React.ReactNode => {\n return (\n <>\n {!this._isDesktopViewPort && <div className={this.state.overlayClass} />}\n </>\n );\n };\n\n /**\n * GetProductCardPositionX method - Provides product card x position to the left or right of active point based on available space.\n * For xs, sm and md viewports it provides x position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionX = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsWidth =\n this.props.config.productImageSettings?.viewports ? this.props.config.productImageSettings.viewports.lg?.w : defaultImageSettings.viewports.lg?.w;\n const defaultPositionX: number = 0;\n const halfDivisor: number = 2;\n const productCardWidth: number =\n productImageSettingsWidth ? productImageSettingsWidth : this._defaultProductCardWidth;\n const { area, clientWidth, viewport } = this.state;\n const pointPositionX = area?.center?.[0] ?? clientWidth / halfDivisor;\n const leftAllignPosition = pointPositionX - productCardWidth - (productCardWidth / halfDivisor);\n const rightAllignPosition = pointPositionX + (productCardWidth / halfDivisor);\n let position: number = (clientWidth - productCardWidth) / halfDivisor;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n if (leftAllignPosition < defaultPositionX) {\n position = rightAllignPosition;\n } else {\n position = leftAllignPosition;\n }\n }\n return position;\n };\n\n /**\n * GetProductCardPositionY method - Provides product card y position in center with respect to active point.\n * For xs, sm and md viewports it provides y position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionY = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsHeight =\n this.props.config.productImageSettings?.viewports ? this.props.config.productImageSettings.viewports.lg?.h : defaultImageSettings.viewports.lg?.h;\n const halfDivisor: number = 2;\n const { area, viewport } = this.state;\n const produtCardHight: number =\n productImageSettingsHeight ? productImageSettingsHeight : this._defaultProdutCardHight;\n const pointPositionY = (this.getActiveImageHeight() - produtCardHight) / halfDivisor;\n let position: number = pointPositionY;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n position = (area?.center?.[1] ?? this.getActiveImageHeight() / halfDivisor) - (produtCardHight / halfDivisor);\n }\n return position;\n };\n\n /**\n * GetDefaultImageSettings method.\n * @returns MsDyn365.IImageSettings.\n */\n public getDefaultImageSettings = (): MsDyn365.IImageSettings => {\n const defaultImageSettings: MsDyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n lg: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n xl: { q: 'w=275&h=275&m=6', w: 275, h: 275 }\n },\n lazyload: true\n };\n\n return defaultImageSettings;\n };\n\n /**\n * KeyDown method - To handle keydown event.\n * @param event - KeyboardEvent.\n */\n public keyDown = (event: KeyboardEvent): void => {\n if (event.key === ActiveImageConstants.enterKey) {\n const target: HTMLElement = event.target as HTMLElement;\n if (target.nodeName === 'AREA') {\n const area: HTMLAreaElement = target as HTMLAreaElement;\n if (area.href) {\n window.open(area.href, '_self');\n }\n }\n }\n if (event.key === ActiveImageConstants.escKey) {\n this.resetState();\n }\n };\n\n /**\n * GetActiveImageWidth method - To get active image width.\n * @returns Returns number.\n */\n public getActiveImageWidth = (): number => {\n const defaultWidth: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return defaultWidth;\n };\n\n /**\n * GetActiveImageHeight method - To get active image height.\n * @returns Returns number.\n */\n public getActiveImageHeight = (): number => {\n const defaultHeight: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return defaultHeight;\n };\n\n /**\n * HandleLinkTextChange method - To handle link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleTextChange method - To handle text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * HandleParagraphChange method - To handle paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * HandleAdditionalTextChange method - To handle additional text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalLinkTextChange method - To handle additional link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalParagraphChange method - To handle additional paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * RenderActiveImageDetailsLinks method - To render active image details links.\n * @returns - React node.\n */\n public renderActiveImageDetailsLinks = (): React.ReactNode[] | undefined => {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this._telemetryContent, '');\n\n return (\n links?.map((linkData: IActiveImageLinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this._telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'msc-active-image__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.willOpenInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={linkId}\n link={editableLink}\n editProps={{\n /**\n * Handle additional paragraph change.\n * @param event - The keyboard event.\n */\n onTextChange: (event) => {\n this.handleLinkTextChange(index, event);\n }, requestContext: this.props.context.request\n }}\n />\n );\n })\n );\n };\n\n /**\n * RenderActiveImageDetailsHeading method - To render active image details heading.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsHeading = (): React.ReactNode | undefined => {\n const { heading } = this.props.config;\n\n return (\n heading && (\n <MsDyn365.Text\n className='msc-active-image__details__title'\n tag={heading.tag ?? 'h1'}\n text={heading.text}\n editProps={{ onEdit: this.handleTextChange, requestContext: this.props.context.request }}\n />\n )\n );\n };\n\n /**\n * RenderActiveImageDetailsParagraph method - To render active image details paragraph.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsParagraph = (): React.ReactNode | undefined => {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n <MsDyn365.RichTextComponent\n text={paragraph}\n className='msc-active-image__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\n />\n )\n );\n };\n\n /**\n * GetActiveImageId - To get active image id from src.\n * @returns - String.\n */\n public getActiveImageId = (): string => {\n const { activeImage } = this.props.config;\n let activeImageId: string = '';\n if (activeImage?.src) {\n const activeImageSource = activeImage.src.split('/');\n const decrementOne: number = 1;\n const activeImageIdPart = (activeImageSource[activeImageSource.length - decrementOne]).split('?');\n activeImageId = activeImageIdPart[0] ?? '';\n }\n return activeImageId;\n };\n\n /**\n * Handle outside click method - To handle outside click of the active image product.\n * @param event - Mouse event.\n */\n private readonly _handleOutsideClick = (event: MouseEvent) => {\n if (this._productCardDivRef.current?.contains(event.target as Node)) {\n return;\n }\n this.resetState();\n };\n}\nexport default ActiveImage;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport React, { useState } from 'react';\n\nconst modalCloseButtonReference: React.RefObject<HTMLButtonElement> = React.createRef();\n\n/**\n * The Create Order Template Button Props.\n */\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\n\n /**\n * The label for create order template.\n */\n createOrderTemplateText: string;\n\n /**\n * The create order template dialog resources.\n */\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n\n /**\n * The delegate to fire when dialog captured any user entry.\n */\n onOrderTemplateCreated(): Promise<void>;\n}\n\nconst CreateOrderTemplateButton: React.FC<ICreateOrderTemplateButtonProps> = (props) => {\n const onCancelHandler = React.useCallback(() => {\n return;\n }, []);\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\n const onCreateButtonClick = React.useCallback(() => {\n setOrderTemplateNameDialogOpen(true);\n }, []);\n\n return (\n <>\n <button\n className='ms-order-template__add-template-button msc-btn btn-primary'\n color='primary'\n onClick={onCreateButtonClick}\n ref={modalCloseButtonReference}\n aria-label={props.createOrderTemplateText}\n >\n {props.createOrderTemplateText}\n </button>\n <OrderTemplateNameDialog\n className='msc-order-template-name-dialog'\n modalOpen={isCreateOrderTemplateDialogOpen}\n isUpdateDialog={false}\n setModalOpen={setOrderTemplateNameDialogOpen}\n context={props.context}\n id={props.id}\n data={{}}\n typeName={props.typeName}\n dialogStrings={props.createOrderTemplateDialogResources}\n onCancel={onCancelHandler}\n onSuccess={props.onOrderTemplateCreated}\n parentElementRef={modalCloseButtonReference}\n />\n </>\n );\n};\n\nexport default CreateOrderTemplateButton;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IOrderTemplateNameDialogResources } from '@msdyn365-commerce/components';\nimport { deleteAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport Spinner from '../order-template/components/add-line/spinner';\nimport {\n ISingleOrderTemplateProps,\n ISingleOrderTemplateViewProps,\n OrderTemplateListStatusMessage,\n OrderTemplateRender\n} from './components';\n\nimport CreateNewTemplateButtonComponent from './components/create-order-template';\nimport { IOrderTemplateListData } from './order-template-list.data';\nimport { HeadingTag, IOrderTemplateListProps, IOrderTemplateListResources } from './order-template-list.props.autogenerated';\n\nexport interface IOrderTemplateActionMessageState {\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n headerStatusMessage: string;\n}\n\nexport type orderTemplateListStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IOrderTemplateListViewProps extends IOrderTemplateListProps<IOrderTemplateListData> {\n OrderTemplateList: IModuleProps;\n status?: orderTemplateListStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n OrderTemplates?: INodeProps;\n OrderTemplate?: INodeProps;\n orderTemplates?: ISingleOrderTemplateViewProps[];\n createOrderTemplateButton?: React.ReactNode;\n templateHeaderStatusMessage?: React.ReactNode;\n}\n\n/**\n *\n * OrderTemplateList component.\n * @extends {React.PureComponent<IOrderTemplateListProps<IOrderTemplateListData>, IOrderTemplateListActionMessageState>}\n */\n@observer\nclass OrderTemplateList extends React.Component<IOrderTemplateListProps<IOrderTemplateListData>, IOrderTemplateActionMessageState> {\n constructor(props: IOrderTemplateListProps<IOrderTemplateListData>) {\n super(props);\n this.state = {\n itemKey: '',\n userMessage: '',\n headerStatusMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false\n };\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({});\n }\n\n public shouldComponentUpdate(\n nextProps: IOrderTemplateListProps<IOrderTemplateListData>,\n nextState: IOrderTemplateActionMessageState\n ): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { className, heading } = this.props.config;\n const { emptyOrderTemplateText, createNewTemplateButtonText } = this.props.resources;\n const { orderTemplates } = this.props.data;\n const orderTemplatesData = orderTemplates && orderTemplates.result;\n const orderTemplateListHeading = heading?.text ?? this.props.resources.orderTemplateListTitle;\n\n if (orderTemplates.status === 'LOADING') {\n const errorProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'LOADING',\n statusMessage: <Spinner className='ms-order-template' msg={this.props.resources.progressNotificationText} />,\n heading: (\n <Heading className='ms-order-template__heading' tag={heading?.tag ?? HeadingTag.h2} text={orderTemplateListHeading} />\n )\n };\n return this.props.renderView(errorProps);\n }\n\n if (orderTemplatesData && orderTemplatesData.length === 0) {\n // When no order templates are found for customer\n const emptyViewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'EMPTY',\n statusMessage: <OrderTemplateListStatusMessage errorType='EMPTY' text={emptyOrderTemplateText} />,\n heading: (\n <Heading className='ms-order-template__heading' tag={heading?.tag ?? HeadingTag.h2} text={orderTemplateListHeading} />\n )\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'SUCCESS',\n heading: <Heading className='ms-order-template__heading' tag={heading?.tag ?? HeadingTag.h2} text={orderTemplateListHeading} />,\n createOrderTemplateButton: (\n <CreateNewTemplateButtonComponent\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n createOrderTemplateText={createNewTemplateButtonText}\n onOrderTemplateCreated={this._reloadPage}\n createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(this.props.resources)}\n />\n ),\n templateHeaderStatusMessage: this.state.isOpen && this.state.headerStatusMessage && (\n <div className='ms-order-template__products-status'>\n <Alert color={this.state.statusCssString} isOpen={this.state.isOpen} toggle={this._onDismiss}>\n <span>{this.state.headerStatusMessage}</span>\n </Alert>\n </div>\n ),\n OrderTemplates: {\n className: 'ms-order-template__list-item',\n tag: 'ul'\n },\n OrderTemplate: {\n className: 'ms-order-template__tile',\n tag: 'li'\n },\n orderTemplates: orderTemplatesData && this._renderOrderTemplateList(orderTemplatesData)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _generateOrderTemplateNameDialogResources(resources: IOrderTemplateListResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n private _renderOrderTemplateList(orderTemplates: OrderTemplate[]): ISingleOrderTemplateViewProps[] {\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n return orderTemplates.map((orderTemplate: OrderTemplate, index) => {\n const currentTemplateProps: ISingleOrderTemplateProps = {\n orderTemplateState: this.state,\n Id: orderTemplate.productList.Id,\n name: orderTemplate.productList.Name,\n orderTemplate,\n context,\n imageSettings,\n enableImageProductLink,\n removeFromOrderTemplateListText: 'remove',\n addToBagText: this.props.resources.addToBagButtonText,\n index,\n itemKey: orderTemplate.productList.Id,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n handlers: {\n onRemoveOrderTemplate: this._onRemoveFromOrderTemplateList,\n onDismiss: this._onDismiss\n },\n resources: {\n closeWindowButtonText: this.props.resources.closeWindowButtonText,\n addToCartFailureMessage: this.props.resources.addToCartFailureMessage,\n addToCartSuccessMessage: this.props.resources.addToCartSuccessMessage,\n addToCartProcessMessage: this.props.resources.addToCartProcessMessage,\n linesAddedToCartDialogResources: {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\n }\n }\n };\n\n return OrderTemplateRender(currentTemplateProps)!;\n });\n }\n\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _reloadPage = async () => {\n window.location.reload();\n };\n\n private readonly _onRemoveFromOrderTemplateList = (productListId: string): void | undefined => {\n const { context, data, telemetry, resources } = this.props;\n const { orderTemplates } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplates.result && orderTemplates.result[0] && productListId) {\n const orderTemplate = orderTemplates.result.find(p => p.productList.Id === productListId);\n if (orderTemplate) {\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.productList)\n .then()\n .catch((error: string) => {\n telemetry.warning('[order-template-list] Unable to delete order template.');\n telemetry.error(error);\n this.setState({\n itemKey: productListId,\n headerStatusMessage: resources.deleteOrderTemplateFailedText,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n })\n .then(this._reloadPage);\n } else {\n telemetry.warning('[order-template-list] Failed to delete order template. Order template was not found');\n }\n } else {\n telemetry.warning('[order-template-list] Failed to delete order template.');\n }\n }\n };\n}\n\nexport default OrderTemplateList;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nexport enum ReviewConcernCategory {\n OffensiveContent = '1',\n ReviewResponse = '7',\n SpamAdvertising = '8',\n Profanity = '9'\n}\n\n/**\n * ReportReviewConcern Input Action.\n */\nexport class ReportReviewConcernInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public concernCategory: string;\n\n public authToken: string;\n\n constructor(\n reviewId: string,\n tenantId: string,\n locale: string,\n concernCategory: string,\n authToken: string,\n serviceEndpoint: string\n ) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.concernCategory = concernCategory;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'ReportReviewConcern';\n\n public getCacheObjectType = () => 'ReportReviewConcern';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport {\n format,\n INodeProps,\n Progress\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IHistogramItemsProps {\n ratingsSummary: RatingsSummary;\n resources: IHistogramItemsResources;\n locale: string;\n onClick(stars: number): void;\n}\n\nexport interface IHistogramItemsResources {\n barItemAriaLabel: string;\n}\n\nexport interface IHistogramItemViewProps {\n starLabel: React.ReactElement;\n bar: React.ReactElement;\n percentage: React.ReactElement;\n buttonProps: INodeProps;\n}\n\n/**\n * CartLineItems component.\n */\n\nexport const HistogramItems = (props: IHistogramItemsProps): IHistogramItemViewProps[] => {\n const { ratingsSummary } = props;\n const totalRatingsCount: number = ratingsSummary.totalRatingsCount || 0;\n if (totalRatingsCount === 0) {\n return [];\n }\n return [\n renderItem(props, 5, ratingsSummary.star5Count, totalRatingsCount),\n renderItem(props, 4, ratingsSummary.star4Count, totalRatingsCount),\n renderItem(props, 3, ratingsSummary.star3Count, totalRatingsCount),\n renderItem(props, 2, ratingsSummary.star2Count, totalRatingsCount),\n renderItem(props, 1, ratingsSummary.star1Count, totalRatingsCount)\n ];\n};\n\nconst renderItem = (props: IHistogramItemsProps, stars: number, count?: number, totalCount?: number): IHistogramItemViewProps => {\n count = count || 0;\n totalCount = totalCount || 0;\n const percentage = totalCount === 0 ? 0 : count / totalCount;\n const formattedPercent = new Intl.NumberFormat(props.locale, { style: 'percent' }).format(percentage);\n const ariaLabel = format(props.resources.barItemAriaLabel, stars, formattedPercent);\n\n return {\n starLabel: <span aria-hidden='true' className='ms-ratings-histogram__star'>\n {stars}\n </span>,\n percentage: <span aria-hidden='true' className='ms-ratings-histogram__percentage'>\n {formattedPercent}\n </span>,\n bar: <Progress\n value={percentage * 100} max={100} ariaLabel={ariaLabel}\n className='ms-ratings-histogram__bar' />,\n buttonProps: { tag: 'button', className: 'ms-ratings-histogram__item', onClick: () => {\n props.onClick(stars);\n } }\n };\n};\n\nexport const AverageRatingNumber: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (<p className='ms-ratings-histogram__average'>\n {props.summary.averageRating}\n {' '}\n / 5\n </p>);\n};\n\nexport const TotalReviews: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (<p className='ms-ratings-histogram__total'>\n {props.summary.totalRatingsCount}\n </p>);\n};\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { IHistogramItemViewProps,\r\n IRatingsHistogramData,\r\n IRatingsHistogramViewProps } from '@msdyn365-commerce-modules/ratings-reviews';\r\nimport { format, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRatingsHistogramProps, IRatingsHistogramResources } from '../definition-extensions/ratings-histogram.ext.props.autogenerated';\r\n\r\n/**\r\n * Histogram item.\r\n * @param props - Histogram Item ViewProps.\r\n * @returns Histogram Item node.\r\n */\r\nconst histogramItem = (props: IHistogramItemViewProps) => {\r\n return (\r\n <Node {...props.buttonProps} >\r\n {props.starLabel}\r\n {props.bar}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Average ratings.\r\n * @param data - Props data.\r\n * @param context - Histogram Item ViewProps.\r\n * @param typeName - Histogram Item ViewProps.\r\n * @param componentId - Histogram Item ViewProps.\r\n * @param resources - Module resource strings.\r\n * @returns Average ratings.\r\n */\r\nconst averageRating = (data: IRatingsHistogramData, context: ICoreContext, typeName: string, componentId: string, resources: IRatingsHistogramResources) => {\r\n const defaultAverageRating: number = 0;\r\n const reviewsCount = data.ratingsSummary.result?.reviewsCount ?? defaultAverageRating;\r\n const reviewsCountString = resources.numberOfReviewsString ? format(resources.numberOfReviewsString, reviewsCount) : `${reviewsCount} reviews`;\r\n\r\n return (\r\n <div className='ms-ratings-histogram__ratings'>\r\n <div className='ms-ratings-histogram__ratings__heading'>\r\n {data.ratingsSummary.result?.averageRating}\r\n </div>\r\n <div>\r\n <RatingComponent\r\n context={context}\r\n id={componentId}\r\n typeName={typeName}\r\n avgRating={data.ratingsSummary.result?.averageRating ?? defaultAverageRating}\r\n readOnly\r\n ariaLabel={format(resources.averageRatingAriaLabel, data.ratingsSummary.result?.averageRating, '5')}\r\n data={{}}\r\n />\r\n </div>\r\n <div className='ms-ratings-histogram__ratings__reviews'>\r\n {reviewsCountString}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n * Histogram view.\r\n * @param props - Ratings HistogramV iewProps.\r\n * @returns Histogram view module.\r\n */\r\nconst RatingsHistogramView: React.FC<IRatingsHistogramViewProps & IRatingsHistogramProps<{}>> = props => {\r\n const { heading, histogramItems, histogramProps, moduleProps, data, resources } = props;\r\n const context = props.context;\r\n const typeName = props.typeName;\r\n const moduleId = props.id;\r\n\r\n return (\r\n <Module {...moduleProps}>\r\n {heading}\r\n <div className='ms-ratings-histogram__container'>\r\n {averageRating(data, context, typeName, moduleId, resources)}\r\n <Node {...histogramProps}>\r\n {histogramItems.map(item => {\r\n return histogramItem(item);\r\n })}\r\n </Node>\r\n </div>\r\n </Module>\r\n );\r\n};\r\n\r\nexport default RatingsHistogramView;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ISliderLabel, ISliderThumbProps, 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';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\ntype InputType = 'Min' | 'Max';\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 sliderKey?: 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 sliderId: string;\n minValue: string | undefined;\n maxValue: string | undefined;\n labels: ISliderLabel[];\n sliderThumbs: ISliderThumbProps[];\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n public 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<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\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 sliderId,\n minValue,\n maxValue,\n labels,\n sliderThumbs\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps,\n nextState: IRangeRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\n if (previousProps !== this.props) {\n this.updateSliderProps();\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 /**\n * Function to update slider props.\n */\n private updateSliderProps(): void {\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\n }\n\n /**\n * Function to create the labels for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param minPrice - Slider min value.\n * @param maxPrice - Slider max value.\n * @returns Array labels.\n */\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return ([\n {\n labelId: `${sliderId}_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderId}_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ]);\n };\n\n /**\n * Function to create the slider thumbs for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param sliderKey - Unique key for slider.\n * @param selectedMin - Slider selected min value.\n * @param selectedMinPrice - Slider selected min price.\n * @param selectedMax - Slider selected max value.\n * @param selectedMaxPrice - Slider selected max price..\n * @param maxPrice - Slider max price..\n * @returns Slider Thumb Props.\n */\n private readonly getSliderThumbs = (sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string): ISliderThumbProps[] => {\n const sliderThumbDefaultValue = 0;\n return ([\n {\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ]);\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 <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\n <label className={minLabelClassName}>\n {refineItemCommonProps.minLabel}\n <input\n className={minInputClassName}\n onChange={this._changeMin}\n onFocus={this._changeMin}\n onBlur={this._finishChangeMin}\n value={formattedSelectedMin}\n ref={this.minInput}\n />\n </label>\n <label className={maxLabelClassName}>\n {refineItemCommonProps.maxLabel}\n <input\n className={maxInputClassName}\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\n onChange={this._changeMax}\n onFocus={this._changeMax}\n onBlur={this._finishChangeMax}\n value={formattedSelectedMax}\n ref={this.maxInput}\n />\n </label>\n {validationErrorMin &&\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>}\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>}\n </form>\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, sliderKey } = this.props;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n return (\n <Slider\n className='ms-refine-submenu__range-refiner'\n key={this.state.sliderId}\n sliderKey={sliderKey}\n id={this.state.sliderId}\n inForm={false}\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\n step={1}\n orientation='horizontal'\n labels={this.state.labels}\n showLabels\n showTooltip\n sliderThumbs={this.state.sliderThumbs}\n onChangeEnd={this._onRangeUpdateEnd}\n onChange={debounce(this._onRangeUpdate, 500)}\n handleTooltipText={this._handleRangeTooltipText}\n {...ariaAttributes}\n />\n );\n }\n\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, 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<HTMLInputElement>): 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,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n }\n this._focus('Min');\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): 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,\n 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 result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\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 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,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\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}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IReportReviewModalViewProps } from './components/report-review-modal';\nimport { IReviewCardViewProps } from './components/review-card';\nimport { IReviewsListState, IReviewsListViewProps } from './reviews-list';\n\nconst ReviewsListview: React.FC<IReviewsListViewProps> = props => {\n const {\n averageRating,\n filterByDropdown,\n heading,\n moduleProps,\n noReviewsMessage,\n noReviewsWithFilterMessage,\n pageControls,\n refineReviewsProps,\n reportReviewModal,\n reviewsListProps,\n reviewCards,\n reviewCount,\n reviewModal,\n sortByDropdown,\n state,\n userReview\n } = props;\n\n if (!userReview && reviewCards.length === 0 && !state.isFilterApplied) {\n return (<Module {...moduleProps}>\n {noReviewsMessage}\n </Module>);\n }\n\n return (\n <Module {...moduleProps}>\n {heading}\n {averageRating}\n {reviewCount}\n <Node {...refineReviewsProps} >\n {sortByDropdown}\n {filterByDropdown}\n </Node>\n <Node {...reviewsListProps}>\n {userReview && buildReviewCard(userReview)}\n {reviewCards.map(review => {\n return buildReviewCard(review);\n })}\n </Node>\n { reviewCards.length === 0 && state.isFilterApplied && noReviewsWithFilterMessage}\n {pageControls}\n {createReviewModal(reviewModal, moduleProps)}\n {createReportModal(reportReviewModal, state)}\n </Module>\n );\n};\n\nconst buildReviewCard = (props: IReviewCardViewProps) => {\n return (\n <Node {...props.cardProps}>\n <Node {...props.headerProps}>\n {props.rating}\n {props.name}\n </Node>\n <Node {...props.cardBodyProps}>\n <Node {...props.reviewProps}>\n {props.reviewTitle}\n {props.date}\n {props.reviewText}\n </Node>\n <Node {...props.responseProps}>\n {props.responseName}\n {props.responseDate}\n {props.responseText}\n </Node>\n <Node {...props.controlsProps}>\n {props.ratingHelpfulLabel}\n {props.like}\n {props.dislike}\n {props.edit}\n {props.report}\n </Node>\n </Node>\n </Node>\n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n <Module {...props.modal} {...moduleProps}>\n {props.modalHeader}\n <Node {...props.modalBody}>\n <Node {...props.form}>\n <Node {...props.inputRow}>\n {props.rating}\n {props.ratingLabel}\n </Node>\n <Node {...props.inputRow}>\n {props.titleLabel}\n {props.titleInput}\n </Node>\n <Node {...props.inputRow}>\n {props.textLabel}\n {props.textInput}\n </Node>\n {props.privacyPolicyUrl}\n {props.error}\n </Node>\n </Node>\n <Node {...props.modalFooter}>\n {props.submitButton}\n {props.cancelButton}\n </Node>\n </Module>\n );\n};\n\nconst createReportModal = (props: IReportReviewModalViewProps, state: IReviewsListState): JSX.Element => {\n return (\n <Node {...props.modal}>\n <Node {...props.modalHeader}>\n {state.reported ? props.headerSubmitted : props.header}\n </Node>\n <Node {...props.modalBody}>\n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n </Node>\n <Node {...props.modalFooter}>\n {state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}\n </Node>\n </Node>\n );\n};\n\nexport default ReviewsListview;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport * from './get-product-reviews';\nexport * from './get-user-review';\nexport * from './inputs/get-product-reviews-input';\nexport * from './inputs/get-user-review-input';\nexport * from './inputs/report-review-concern-input';\nexport * from './inputs/submit-helpfulness-vote-input';\nexport * from './inputs/submit-user-review-input';\nexport * from './inputs/submit-user-review-input-data';\nexport * from './ratings-reviews-state-data-action';\nexport * from './report-review-concern';\nexport * from './submit-helpfulness-vote';\nexport * from './submit-user-review';\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC<IWishlistItemsViewProps> = props => {\n const { WishlistItems, status, statusMessage, heading, Products, products, Product, ProductDetails, ProductDimensions, telemetryContent } = props;\n\n return (\n <Module {...WishlistItems}>\n {heading}\n {status !== 'SUCCESS' && statusMessage}\n { Products && products && products.length > 0 &&\n <Node {...Products}>\n {products && products.map((product) => {\n return _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n </Node>}\n </Module>\n );\n};\n\nconst _renderItem = (product: IWishlistItemViewProps, Product?: INodeProps, ProductDimensions?: INodeProps, ProductDetails?: INodeProps, telemetryContent?: ITelemetryContent): JSX.Element | null => {\n\n const { key, productImage, productLink, productPrice, productDimensions, addToCartButton, removeButton,\n productStatusMessage, entireProductLink, productName, productAriaLabel, inventoryInformation, productUnitOfMeasure } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n <Node key={key} className={Product!.className} {...Product}>\n <Node\n href={entireProductLink} className={classnames('entire-product-link ', ProductDetails!.className)} {...productAttributes}\n aria-label={productAriaLabel} tag={ProductDetails!.tag}>\n {productImage}\n {productName}\n {productDimensions && ProductDimensions &&\n <Node {...ProductDimensions}>\n {\n productDimensions.map((dimension) => {\n return dimension;\n })\n }\n </Node>}\n {productPrice}\n {productUnitOfMeasure}\n </Node>\n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n }\n return (\n <Node key={key} className={Product!.className} {...Product}>\n { productImage }\n { productLink }\n { productDimensions && ProductDimensions &&\n <Node {...ProductDimensions}>\n {\n productDimensions.map((dimension) => {\n return dimension;\n })\n }\n </Node>}\n { productPrice }\n { addToCartButton }\n { removeButton }\n { productStatusMessage }\n </Node>\n );\n\n};\n\nexport default WishlistItemsView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\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 ? <Node {...inputProps}>\n <Node {...inputNumProps}>\n {label}\n {inputNumber}\n </Node>\n {showGiftCardPinInput &&\n <Node {...inputPinProps}>\n {inputPinLabel}\n {inputPin}\n </Node>}\n {showGiftCardExpInput &&\n <Node {...inputExpProps}>\n {inputExpLabel}\n {inputExp}\n </Node>}\n {(showGiftCardPinInput || showGiftCardExpInput) && alertFieldLabel}\n </Node> : <>\n {label}\n {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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Button, INodeProps, Modal, ModalBody, ModalFooter, ModalHeader, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewProps } from './components';\nimport { IOrderTemplateViewProps } from './order-template';\n\nconst OrderTemplateLinesView: React.FC<IOrderTemplateViewProps> = (props: IOrderTemplateViewProps) => {\n const {\n OrderTemplateLines,\n status,\n statusMessage,\n heading,\n ProductsTable,\n ProductsTableHeading,\n orderLines,\n ProductsTableRow,\n productsStatusMessage,\n OrderTemplateActions,\n orderActions,\n pagination,\n itemAddedToCartDialog,\n bulkOrderLineActions,\n isDetailsDisplayed,\n detailedProductView,\n toggleDetailsDisplayed,\n resources: {\n cancelBtnLabel,\n productNumberText,\n productText,\n productUnitPriceText,\n productUOMText,\n productQuantityText\n }\n } = props;\n\n const toggleDetails = React.useCallback(() => {\n toggleDetailsDisplayed && toggleDetailsDisplayed(undefined);\n }, [toggleDetailsDisplayed]);\n\n return (\n <Module {...OrderTemplateLines}>\n {heading}\n {OrderTemplateActions && (\n <Node {...OrderTemplateActions}>\n {orderActions?.addTemplateToBag}\n {orderActions?.renameTemplate}\n {orderActions?.removeTemplate}\n {!isDetailsDisplayed && productsStatusMessage}\n </Node>\n )}\n {bulkOrderLineActions}\n {status !== 'SUCCESS' && statusMessage}\n {ProductsTable && orderLines && orderLines.length > 0 && (\n <Node className='ms-order-template__content'>\n <Node {...ProductsTable}>\n {ProductsTableHeading}\n <tbody>\n {orderLines &&\n orderLines.map(product => {\n return _renderItem(product, productQuantityText, ProductsTableRow);\n })}\n </tbody>\n </Node>\n {pagination}\n </Node>\n )}\n {itemAddedToCartDialog}\n <Modal\n wrapClassName='ms-order-template-mobile-view-modal'\n autoFocus\n fade={false}\n applicationNode='renderPage'\n isOpen={isDetailsDisplayed}\n toggle={toggleDetails}\n >\n <ModalHeader toggle={toggleDetails}>\n Product Details\n </ModalHeader>\n <ModalBody>\n <ul>\n <li>\n {detailedProductView?.productImage}\n </li>\n <li className='product-info'>\n <span>\n {productText}\n :\n </span>\n {detailedProductView?.productInfo}\n </li>\n <li>\n <span>\n {productNumberText}\n :\n </span>\n {detailedProductView?.productNumber}\n </li>\n <li>\n <span>\n {productUnitPriceText}\n :\n </span>\n {' '}\n {detailedProductView?.productPrice}\n </li>\n <li>\n <span>\n {productUOMText}\n :\n </span>\n {' '}\n {detailedProductView?.productUnitOfMeasure}\n </li>\n <li>\n <span>\n {productQuantityText}\n :\n </span>\n {detailedProductView?.productQuantityView}\n </li>\n {productsStatusMessage && <li>\n {productsStatusMessage}\n </li>}\n </ul>\n </ModalBody>\n <ModalFooter>\n <Button onClick={toggleDetails}>\n {cancelBtnLabel}\n </Button>\n </ModalFooter>\n </Modal>\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IOrderTemplateLineViewProps,\n quantityLabel: string,\n ProductsTableRow?: INodeProps\n): JSX.Element | null => {\n if (!product) {\n return null;\n }\n\n const {\n key,\n selectLine,\n productImage,\n productPrice,\n productNumber,\n addToBagButton,\n removeButton,\n productInfo,\n productUnitOfMeasure,\n productQuantityView,\n productQuantity,\n popUp,\n isMobile\n } = product;\n\n return (\n <Node key={key} className={ProductsTableRow!.className} {...ProductsTableRow}>\n <td>\n {selectLine}\n </td>\n <td>\n {productImage}\n </td>\n {isMobile ? <td>\n <div>\n {productNumber}\n </div>\n <div>\n {quantityLabel}\n :\n {' '}\n {productQuantity}\n </div>\n </td> : <td>\n {productNumber}\n </td>}\n {!isMobile && <td>\n {productInfo}\n </td>}\n {!isMobile && <td>\n {productPrice}\n </td>}\n {!isMobile && <td>\n {productUnitOfMeasure}\n </td>}\n {!isMobile && <td>\n {productQuantityView}\n </td>}\n {isMobile && <td>\n {popUp}\n </td> }\n {!isMobile &&\n <td>\n {addToBagButton}\n {removeButton}\n </td>}\n </Node>\n );\n};\n\nexport default OrderTemplateLinesView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (<a className={className} href={href} aria-label={ariaLabel}>\n {' '}\n {text}\n {' '}\n</a>);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\nimport { ProductDimensionsMatrix } from '@msdyn365-commerce/components';\nimport { RichTextComponent } from '@msdyn365-commerce/core';\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions, IDimensionsApp } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Collapse, IModuleProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IBulkPurchaseData } from './bulk-purchase.data';\nimport { IBulkPurchaseProps } from './bulk-purchase.props.autogenerated';\n\n/**\n * Additional optional props for the bulk purchase.\n */\nexport interface IBulkPurchaseExtendedProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n productDimensions?: IProductDimensionsWithAvailabilitiesFull[];\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseViewProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n container: IModuleProps;\n content: React.ReactElement;\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseState {\n isExpanded: boolean;\n}\n\n/**\n * Bulk-purchase module.\n */\nexport class BulkPurchase extends React.PureComponent<IBulkPurchaseExtendedProps, IBulkPurchaseState> {\n public static readonly className = 'ms-bulk-purchase';\n\n public constructor(props: IBulkPurchaseExtendedProps) {\n super(props);\n\n this.state = {\n isExpanded: false\n };\n }\n\n public render(): React.ReactElement | null {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const hasDimensionsInData = ArrayExtensions.hasElements(this.props.data.productDimensions?.result);\n if (!hasDimensionsInProps && !hasDimensionsInData) {\n return null;\n }\n\n const viewProps: IBulkPurchaseViewProps = {\n ...this.props,\n container: {\n moduleProps: this.props,\n className: classnames(BulkPurchase.className, this.props.config.className)\n },\n content: this._renderCollapseContent(`${BulkPurchase.className}__content`)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderCollapseContent(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderCollapseButton(`${className}__collapse-button`)}\n {this._renderCollapse(`${className}__collapse`)}\n </div>\n );\n }\n\n private _renderCollapseButton(className: string): React.ReactElement {\n return (\n <Button\n className={className}\n onClick={this._toggleCollapse}\n aria-expanded={this.state.isExpanded}\n title={this.props.resources.bulkPurchaseHeaderTitle}\n >\n {this.props.resources.bulkPurchaseHeaderTitle}\n </Button>\n );\n }\n\n private _renderCollapse(className: string): React.ReactElement {\n return (\n <Collapse\n className={className}\n isOpen={this.state.isExpanded}\n >\n {this._renderMainContent(`${className}__main-content`)}\n </Collapse>\n );\n }\n\n private _renderMainContent(className: string): React.ReactElement {\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n return (\n <div className={className}>\n {\n !isMobileDevice &&\n <div className={`${className}__description`}>\n <RichTextComponent\n text={this.props.resources.bulkPurchaseDescriptionText}\n />\n </div>\n }\n {this._renderMatrix(`${className}__matrix-container`)}\n </div>\n );\n }\n\n private _renderMatrix(className: string): React.ReactElement {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n\n return (\n <ProductDimensionsMatrix\n className={className}\n context={this.props.context as ICoreContext<IDimensionsApp>}\n data={{\n dimensions: hasDimensionsInProps ? this.props.productDimensions! : this.props.data.productDimensions!.result!,\n orderTemplates: this.props.data.orderTemplates?.result,\n customerInformation: this.props.data.customerInformation?.result\n }}\n resources={this.props.resources}\n />\n );\n }\n\n /**\n * Callback which toggles collapse mode.\n */\n private readonly _toggleCollapse = () => {\n this.setState(state => ({\n isExpanded: !state.isExpanded\n }));\n };\n}\n\nexport default BulkPurchase;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { TelemetryEvent } from '@msdyn365-commerce/core';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\ninterface ICheckoutPlaceOrderButtonProps {\n canPlaceOrder: boolean;\n checkoutBtnText: string;\n telemetryContent?: ITelemetryContent;\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\n isPlaceOrderLoading?: boolean;\n isExpressCheckoutApplied?: boolean;\n isPaymentVerificationRedirection?: boolean;\n placeOrder(): Promise<void>;\n}\n\nconst buttonsStates: React.Dispatch<React.SetStateAction<boolean>>[] = [];\n\n/**\n * On place order function.\n * @param isBusy -Check is busy.\n * @param canPlaceOrder -Check can place order.\n * @param placeOrder -Place order function.\n * @returns Set state of button.\n */\nconst onPlaceOrderHandler = (isBusy: boolean, canPlaceOrder: boolean, placeOrder: () => Promise<void>) => async () => {\n if (isBusy || !canPlaceOrder) {\n return;\n }\n buttonsStates.map(buttonSetState => {\n buttonSetState(true);\n return true;\n });\n await placeOrder();\n};\n\nconst CheckoutPlaceOrderButton: React.FC<ICheckoutPlaceOrderButtonProps> = ({\n checkoutBtnText, canPlaceOrder, placeOrder, telemetryContent,\n shouldEnableSinglePaymentAuthorizationCheckout, isPlaceOrderLoading, isExpressCheckoutApplied, isPaymentVerificationRedirection }) => {\n const [isBusy, setIsBusy] = useState(false);\n buttonsStates.push(setIsBusy);\n const payload = getPayloadObject(TelemetryEvent.Purchase, telemetryContent!, checkoutBtnText, '');\n const attributes = getTelemetryAttributes(telemetryContent!, payload);\n\n if (shouldEnableSinglePaymentAuthorizationCheckout && \n (!isExpressCheckoutApplied || isPaymentVerificationRedirection)) {\n return (\n <Button\n className={classnames('ms-checkout__btn-place-order', { 'is-busy': isPlaceOrderLoading ?? false })}\n color='primary'\n onClick={placeOrder}\n title={checkoutBtnText}\n {...attributes}\n disabled={!canPlaceOrder || isPlaceOrderLoading}\n >\n {checkoutBtnText}\n </Button>\n );\n }\n\n return (\n <Button\n className={classnames('ms-checkout__btn-place-order', { 'is-busy': isBusy })}\n color='primary'\n onClick={onPlaceOrderHandler(isBusy, canPlaceOrder, placeOrder)}\n title={checkoutBtnText}\n {...attributes}\n disabled={!canPlaceOrder || isBusy}\n >\n {checkoutBtnText}\n </Button>\n );\n};\n\nexport default CheckoutPlaceOrderButton;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport withModuleState from './with-module-state';\n\nexport * from './module-state';\nexport * from './module-state.data';\n\nexport { withModuleState };\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\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\n private readonly 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 readonly _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 readonly _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 readonly _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 readonly _onExiting = (): void => {\n this.animating = true;\n };\n\n private readonly _onExited = (): void => {\n this.animating = false;\n this.setState({ closeNow: false });\n };\n\n /**\n * Function implementation to move to a given slide.\n * @param newIndex\n */\n private readonly _goToIndex = (newIndex: number): void => {\n if (this.animating) {\n return;\n }\n this.setState({ activeIndex: newIndex });\n };\n}\n\nexport default CarouselModule;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHistogramItemViewProps } from './component/components';\nimport { IRatingsHistogramViewProps } from './ratings-histogram';\n\nconst RatingsHistogramView: React.FC<IRatingsHistogramViewProps> = props => {\n const { heading, histogramItems, histogramProps, moduleProps } = props;\n\n return (\n <Module {...moduleProps}>\n {heading}\n <Node {...histogramProps}>\n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n </Node>\n </Module>\n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n <Node {...props.buttonProps} >\n {props.starLabel}\n {props.bar}\n {props.percentage}\n </Node>\n );\n};\n\nexport default RatingsHistogramView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport getCollectionProducts, {\n GetFullProductsByCollectionInput, IFullProductsSearchResultsWithCount, ProductListInventoryFilteringOptions\n} from './get-full-products-by-collection';\nimport getMappedSearchConfiguration, { MappedSearchConfiguration, MappedSearchInput, sortOptions } from './get-mapped-search-configuration';\nimport getCollectionRefinersAction, { RefinersByCollectionInput } from './get-refiners-for-collection';\n\nexport * from './base-collection-action';\nexport * from './url-utils';\n\nexport {\n getCollectionProducts,\n getCollectionRefinersAction,\n GetFullProductsByCollectionInput,\n getMappedSearchConfiguration,\n IFullProductsSearchResultsWithCount,\n MappedSearchConfiguration,\n MappedSearchInput,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n};\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IOrderTemplateListViewProps, ISingleOrderTemplateViewProps } from '@msdyn365-commerce-modules/order-template';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport CreateNewTemplateButtonComponent from './components/create-order-template.component';\r\nimport * as React from 'react';\r\n\r\nimport { IOrderTemplateListProps, IOrderTemplateListResources } from '../definition-extensions/order-template-list.ext.props.autogenerated';\r\nimport { IOrderTemplateNameDialogResources } from \"@msdyn365-commerce/components\";\r\n\r\n/**\r\n * Interface for OrderTemplateImage.\r\n */\r\ninterface IOrderTemplateImage {\r\n props: {\r\n children: React.ReactElement[];\r\n };\r\n}\r\n\r\n/**\r\n * To render order template.\r\n * @param orderTemplate - The order template view props.\r\n * @param orderTemplateNodeProps - The order template node props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderOrderTemplate = (orderTemplate: ISingleOrderTemplateViewProps, orderTemplateNodeProps?: INodeProps): JSX.Element | null => {\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file\r\n const { key, addToCartButton, orderTemplateImage, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\r\n\r\n const orderTemplateImageElement: IOrderTemplateImage = orderTemplateImage as React.ReactElement;\r\n const currentImageListLength = orderTemplateImageElement.props.children.length;\r\n const defaultNumberImagesInTile = 4;\r\n\r\n if (currentImageListLength < defaultNumberImagesInTile) {\r\n for (let index = 0; index < defaultNumberImagesInTile - currentImageListLength; index++) {\r\n orderTemplateImageElement.props.children.push(<picture />);\r\n }\r\n }\r\n\r\n return (\r\n <Node key={key} className={orderTemplateNodeProps!.className} {...orderTemplateNodeProps}>\r\n {orderTemplateName}\r\n {orderTemplateImage}\r\n {addToCartButton}\r\n {removeButton}\r\n {orderTemplateStatusMessage}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _reloadPage = async () => {\r\n window.location.reload();\r\n};\r\n\r\nconst _generateOrderTemplateNameDialogResources = (resources: IOrderTemplateListResources): IOrderTemplateNameDialogResources => {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n}\r\n\r\n/**\r\n * Order Template List View.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nexport const OrderTemplateListViewComponent: React.FC<IOrderTemplateListViewProps & IOrderTemplateListProps<IOrderTemplateListResources>> = props => {\r\n const {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file\r\n OrderTemplateList, OrderTemplates, OrderTemplate,\r\n status,\r\n statusMessage,\r\n heading,\r\n orderTemplates,\r\n createOrderTemplateButton,\r\n templateHeaderStatusMessage\r\n } = props;\r\n console.log(createOrderTemplateButton)\r\n return (\r\n <Module {...OrderTemplateList}>\r\n {heading}\r\n {status !== 'SUCCESS' && statusMessage}\r\n {status === 'EMPTY' && (\r\n <CreateNewTemplateButtonComponent\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{}}\r\n createOrderTemplateText={props.resources.createNewTemplateButtonText}\r\n onOrderTemplateCreated={_reloadPage}\r\n createOrderTemplateDialogResources={_generateOrderTemplateNameDialogResources(props.resources)}\r\n />\r\n )}\r\n <Node className=''>\r\n {status === 'SUCCESS' &&\r\n (!OrderTemplates || !orderTemplates ||\r\n !ArrayExtensions.hasElements(orderTemplates)) ? (\r\n <div className='ms-order-template__empty-list'>\r\n <h2 className='ms-order-template__empty-list-heading'>\r\n {props.resources.headingForEmptyOrderTemplateList}\r\n </h2>\r\n <p className='ms-order-template__empty-list-text'>\r\n {props.resources.textForEmptyOrderTemplateList}\r\n </p>\r\n {createOrderTemplateButton}\r\n </div>\r\n ) : createOrderTemplateButton}\r\n {templateHeaderStatusMessage}\r\n </Node>\r\n { OrderTemplates && orderTemplates && ArrayExtensions.hasElements(orderTemplates) &&\r\n <Node {...OrderTemplates}>\r\n {orderTemplates.map((orderTemplate) => {\r\n return renderOrderTemplate(orderTemplate, OrderTemplate);\r\n })}\r\n </Node>}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default OrderTemplateListViewComponent;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport get from 'lodash/get';\nimport * as React from 'react';\n\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = context.request.app.config.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n const handleOrderSummaryHeadingChange = (event: Msdyn365.ContentEditableEvent) => {\n const {\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 ? 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,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- existing property.\n isTaxIncludedInPrice: cart.IsTaxIncludedInPrice,\n isShowTaxBreakup: isShowOrHideTaxEnabled\n }) : undefined\n };\n\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport * from './checkout';\nexport * from './empty-active-cart';\nexport * from './place-order';\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\r\nimport { IComponentProps } from '@msdyn365-commerce/core';\r\nimport React, { useState } from 'react';\r\n\r\nconst modalCloseButtonReference: React.RefObject<HTMLButtonElement> = React.createRef();\r\n\r\n/**\r\n * The Create Order Template Button Props.\r\n */\r\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\r\n\r\n /**\r\n * The label for create order template.\r\n */\r\n createOrderTemplateText: string;\r\n\r\n /**\r\n * The create order template dialog resources.\r\n */\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n\r\n /**\r\n * The delegate to fire when dialog captured any user entry.\r\n */\r\n onOrderTemplateCreated(): Promise<void>;\r\n}\r\n\r\nconst CreateOrderTemplateButton: React.FC<ICreateOrderTemplateButtonProps> = (props) => {\r\n const onCancelHandler = React.useCallback(() => {\r\n return;\r\n }, []);\r\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\r\n const onCreateButtonClick = React.useCallback(() => {\r\n setOrderTemplateNameDialogOpen(true);\r\n }, []);\r\n\r\n return (\r\n <>\r\n <button\r\n className='ms-order-template__add-template-button msc-btn btn-primary'\r\n color='primary'\r\n onClick={onCreateButtonClick}\r\n ref={modalCloseButtonReference}\r\n aria-label={props.createOrderTemplateText}\r\n >\r\n {props.createOrderTemplateText}\r\n </button>\r\n <OrderTemplateNameDialog\r\n className='msc-order-template-name-dialog'\r\n modalOpen={isCreateOrderTemplateDialogOpen}\r\n isUpdateDialog={false}\r\n setModalOpen={setOrderTemplateNameDialogOpen}\r\n context={props.context}\r\n id={props.id}\r\n data={{}}\r\n typeName={props.typeName}\r\n dialogStrings={props.createOrderTemplateDialogResources}\r\n onCancel={onCancelHandler}\r\n onSuccess={props.onOrderTemplateCreated}\r\n parentElementRef={modalCloseButtonReference}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default CreateOrderTemplateButton;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IComponent, IComponentProps } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\n/**\r\n * IPromoCodeProps: Interface for promo code component.\r\n */\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n\r\n /** The telemetry content. */\r\n telemetryContent?: ITelemetryContent;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\n/**\r\n * IPromoCodeProps: Interface for promo code component.\r\n */\r\nexport interface IPromoCodeComponent extends IComponent<IPromoCodeProps> { }\r\n\r\n/**\r\n * IPromoCodeProps: Interface for promo code state.\r\n */\r\ninterface IPromoCodeState {\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass PromoCode extends React.PureComponent<IPromoCodeProps, IPromoCodeState> {\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IPromoCodeProps) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\r\n this.state = {\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <div>\r\n <div className='msc-promo-code-heading'>\r\n {this.props.promoCodeHeadingText}\r\n </div>\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n <p className={this.state.error ? 'msc-alert-danger' : ''} aria-live='assertive'>\r\n {this.state.error}\r\n </p>\r\n {this._renderAppliedPromoCode(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * On input change method.\r\n * @param event - Change event.\r\n */\r\n private readonly _onInputChangeHandler = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const error = event.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: event.target.value, error,\r\n canApply: !!event.target.value\r\n });\r\n };\r\n\r\n /**\r\n * Apply promo code method.\r\n * @param cartState - Cart state interface.\r\n */\r\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState) {\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(() => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n };\r\n\r\n /**\r\n * On submit action.\r\n * @param cartState - Cart state.\r\n * @returns Apply promotion.\r\n */\r\n private readonly _onSubmitHandler = (cartState: ICartState | undefined) => (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n this._applyPromotion(cartState);\r\n };\r\n\r\n /**\r\n * On apply promotion.\r\n * @param cartState - Cart state.\r\n * @returns Apply promotion.\r\n */\r\n private readonly applyPromotionHandler = (cartState: ICartState | undefined) => () => {\r\n this._applyPromotion(cartState);\r\n };\r\n\r\n /**\r\n * Renders promo code form.\r\n * @param promoPlaceholderText - Promo code input box placeholder string.\r\n * @param promoCodeApplyButtonText - Promo code button text string.\r\n * @param cartState - Cart state interface.\r\n * @returns Promo code form.\r\n */\r\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n\r\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n <form onSubmit={this._onSubmitHandler(cartState)} className='msc-promo-code__form-container'>\r\n <div className='msc-promo-code__group'>\r\n <input\r\n className='msc-promo-code__input-box'\r\n onChange={this._onInputChangeHandler}\r\n value={this.state.promoCodeInputValue}\r\n placeholder={promoPlaceholderText}\r\n />\r\n <Button\r\n title={promoCodeApplyButtonText}\r\n className='msc-promo-code__apply-btn btn'\r\n onClick={this.applyPromotionHandler(cartState)}\r\n disabled={!this.state.canApply}\r\n {...attributes}\r\n />\r\n </div>\r\n </form>\r\n );\r\n };\r\n\r\n /**\r\n * Remove promo code method.\r\n * @param cartState - Cart state interface.\r\n * @param event - Mouse event.\r\n */\r\n private readonly _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: [code]\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\r\n /**\r\n * Renders applied promo code form.\r\n * @param props - Promo code component props.\r\n * @returns Applied promo code.\r\n */\r\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart.Coupons || !ArrayExtensions.hasElements(props.cart.cart.Coupons)) {\r\n return;\r\n }\r\n\r\n /**\r\n * On remove promotion action.\r\n * @param event - Mouse event.\r\n */\r\n const removePromotionHandler = (event: React.MouseEvent<HTMLElement>) => {\r\n this._removePromotion(props.cart, event);\r\n };\r\n\r\n return (\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\r\n return (\r\n <div key={coupon.Code} className='msc-promo-code__line-container'>\r\n <div className='msc-promo-code__line-value'>\r\n {'Code '}\r\n <span className='msc-promo-code__line-value-code'>\r\n {coupon.Code}\r\n </span>\r\n {'Applied '}\r\n\r\n </div>\r\n <Button\r\n title={props.removePromoText}\r\n className='msc-promo-code__line__btn-remove'\r\n onClick={removePromotionHandler}\r\n data-value={coupon.Code}\r\n aria-label={ariaLabel}\r\n />\r\n </div>\r\n );\r\n })\r\n }\r\n </>\r\n );\r\n };\r\n}\r\n\r\nexport default PromoCode;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport RatingsHistogram from './ratings-histogram';\nimport RatingsHistogramView from './ratings-histogram.view';\n\nexport * from './component/components';\nexport * from './ratings-histogram';\nexport * from './ratings-histogram.data';\nexport { IRatingsHistogramConfig, IRatingsHistogramProps, IRatingsHistogramResources } from './ratings-histogram.props.autogenerated';\nexport * from './ratings-histogram.view';\n\nexport {\n RatingsHistogram,\n RatingsHistogramView\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport {\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<HTMLButtonElement> | 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<HTMLButtonElement> | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (<button\n id={id} className='msc-button' aria-label={ariaLabel}\n onClick={onClick} ref={innerRef}>\n {text}\n </button>);\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: <ModalBody className='msc-review-modal-body' />\n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n <Modal\n autoFocus\n applicationNode='renderPage'\n returnFocusRef={props.returnRef}\n isOpen={props.isOpen}\n toggle={props.onModalToggle}\n className='msc-search-result-modal'\n zIndex={1050}\n />\n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return (\n <ModalHeader toggle={props.onModalToggle}>\n {props.resources.modalTitle}\n </ModalHeader>\n );\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n <ModalFooter>\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\n {props.resources.modalCloseButtonText}\n </Button>\n </ModalFooter>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\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 ? <Node {...inputProps}>\n <Node {...inputNumProps}>\n {label}\n {inputNumber}\n </Node>\n {showGiftCardPinInput &&\n <Node {...inputPinProps}>\n {inputPinLabel}\n {inputPin}\n </Node>}\n {showGiftCardExpInput &&\n <Node {...inputExpProps}>\n {inputExpLabel}\n {inputExp}\n </Node>}\n {(showGiftCardPinInput || showGiftCardExpInput) && alertFieldLabel}\n </Node> : <>\n {label}\n {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 * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\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\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 * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyLabelProps {\n className: string;\n text: string;\n htmlFor: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.className\n * @param root0.text\n * @param root0.htmlFor\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}>\n {text}\n </label>);\n};\n\nexport default CheckoutLoyaltyLabel;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyTextProps {\n className: string;\n text?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.className\n * @param root0.text\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}>\n {text}\n </span>);\n};\n\nexport default CheckoutLoyaltyText;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { 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';\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 classnames from 'classnames';\nimport { computed, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\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-expect-error\n\n@withModuleState\n@observer\nclass CheckoutLoyalty extends React.Component<ICheckoutLoyaltyModuleProps, ICheckoutLoyaltyState> {\n private readonly _dialogToggleRef: React.RefObject<HTMLButtonElement> | undefined;\n\n private readonly moduleClassName: string = 'ms-checkout-loyalty';\n\n private readonly _defaultLoyaltyPoints: number = 0;\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\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 ? this.props.data.loyaltyTransactionEstimation.result.MaxCurrencyValueOfLoyaltyPoints : 0;\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 public shouldComponentUpdate(nextProps: ICheckoutLoyaltyModuleProps,\n nextState: ICheckoutLoyaltyState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | 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 }\n isShowLoyalty = true;\n\n }\n\n const viewProps = {\n ...this.props,\n viewState: {\n 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 || isNaN(this.state.dollarsApplied) ||\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 <>\n <p className={`${this.moduleClassName}__covered-text`}>\n {this.props.resources.loyaltyCoveredAmountText}\n </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 </>\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 readonly 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.props.data.checkout.result?.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 readonly onEdit = () => {\n this.props.moduleState.onUpdating();\n };\n\n private readonly onCancel = () => {\n this.handleCancelOrSubmit();\n };\n\n private readonly onSubmit = () => {\n this.handleCancelOrSubmit();\n };\n\n private readonly 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 readonly 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: Number.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 > 0 ? Number(value) : Number.parseFloat(value), isFetchingLoyaltyCard: false });\n }\n\n private _onBlur(event: React.FocusEvent<HTMLInputElement>): void {\n const num = Number.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: Number.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 checkout = this.props.data.checkout.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-expect-error\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.MaxCurrencyValueOfLoyaltyPoints ?? this._defaultLoyaltyPoints;\n\n // If points are already applied, ensure you don't apply more points than max\n if (checkout && (checkout.loyaltyAmount > newMaxPoints)) {\n await checkout.updateLoyaltyAmount({ newAmount: newMaxPoints });\n }\n\n this.setState({ dollarsApplied: newMaxPoints, isFetchingLoyaltyCard: false });\n })\n .catch(error => {\n this.props.context.actionContext.telemetry.exception(error);\n this.props.context.actionContext.telemetry.debug('Error getting Loyalty Point Redemption Estimate');\n });\n }\n }\n}\n\nexport default CheckoutLoyalty;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\nimport { IOrderTemplateData } from '../order-template.data';\nimport { IOrderTemplateProps } from '../order-template.props.autogenerated';\nimport { AddLineToTemplate } from '.';\n\ninterface IOrderTemplateBulkActionsProps extends IOrderTemplateProps<IOrderTemplateData> {\n orderTemplateId: string;\n selectedLines: IOrderTemplateLineViewModel[];\n isMinifiedView: boolean;\n onAddSelectionToBag(): void;\n onRemoveSelection(): void;\n}\n\ninterface IOrderTemplateBulkActionsState {\n isAddDisabled: boolean;\n isRemoveDisabled: boolean;\n}\n\n/**\n * Bulk Order Template line actions.\n */\nexport class OrderTemplateBulkActions extends React.PureComponent<IOrderTemplateBulkActionsProps, IOrderTemplateBulkActionsState> {\n\n public state: IOrderTemplateBulkActionsState = {\n isAddDisabled: true,\n isRemoveDisabled: true\n };\n\n public static getDerivedStateFromProps(props: IOrderTemplateBulkActionsProps,\n state: IOrderTemplateBulkActionsState): IOrderTemplateBulkActionsState {\n const selectedLines = props.selectedLines.length;\n let nextState = { ...state };\n nextState = {\n isAddDisabled: selectedLines === 0,\n isRemoveDisabled: selectedLines === 0\n };\n return nextState;\n }\n\n public render(): JSX.Element {\n const { addLineModalLinkText,\n searchButtonAriaLabel,\n searchInputAriaLabel,\n searchModalPlaceholderText,\n selectProductButtonText,\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n backButtonText,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n notFoundSearchErrorNotice,\n notFoundSearchErrorRedediation,\n searchErrorMessage,\n productDimensionTypeColor,\n productDimensionTypeConfiguration,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n addSelectedToBagButtonText,\n removeSelectedToBagButtonText,\n searchResultsCountVerbage,\n searchResultsCountSubject,\n addToTemplateConfirmation,\n totalPriceLabel,\n progressNotificationText,\n addToTemplateDuplicateError,\n addToTemplateGenericError,\n dimensionMissingError\n } = this.props.resources;\n const addLineProps = {\n context: this.props.context,\n resources: {\n addLineModalLinkText,\n searchButtonAriaLabel,\n searchInputAriaLabel,\n searchModalPlaceholderText,\n selectProductButtonText,\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n backButtonText,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n notFoundSearchErrorNotice,\n notFoundSearchErrorRedediation,\n searchErrorMessage,\n productDimensionTypeColor,\n productDimensionTypeConfiguration,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n searchResultsCountVerbage,\n searchResultsCountSubject,\n addToTemplateConfirmation,\n totalPriceLabel,\n progressNotificationText,\n addToTemplateDuplicateError,\n addToTemplateGenericError,\n dimensionMissingError\n },\n imageSettings: this.props.config.imageSettings,\n orderTemplateId: this.props.orderTemplateId\n };\n\n return (\n <>\n <AddLineToTemplate {...addLineProps} />\n <Button\n onClick={this.addHandler}\n disabled={this.state.isAddDisabled}\n className='add-selected-to-bag'\n aria-label={addSelectedToBagButtonText}\n >\n <span />\n {!this.props.isMinifiedView && addSelectedToBagButtonText}\n </Button>\n <Button\n onClick={this.removeHandler}\n disabled={this.state.isRemoveDisabled}\n className='remove-selected'\n aria-label={removeSelectedToBagButtonText}\n >\n <span />\n {!this.props.isMinifiedView && removeSelectedToBagButtonText}\n </Button>\n </>\n );\n }\n\n private readonly addHandler = (event: React.MouseEvent<HTMLElement>) => {\n this.setState({\n isAddDisabled: true\n });\n\n this.props.onAddSelectionToBag();\n\n this.setState({\n isAddDisabled: false\n });\n };\n\n private readonly removeHandler = (event: React.MouseEvent<HTMLElement>) => {\n this.setState({\n isRemoveDisabled: true\n });\n\n this.props.onRemoveSelection();\n };\n\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICheckoutDeliveryOption, ICheckoutDeliveryOptionEdit, 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} aria-label='Please select a delivery option.'>\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 CheckoutDeliveryOptionsView: React.FC<ICheckoutDeliveryOptionsViewProps> = props => {\n const { CheckoutDeliveryOptions,\n viewState,\n deliveryOptions,\n deliveryOptionSelected,\n alert,\n waiting,\n saveButton,\n editButton,\n cancelButton } = props;\n\n return (\n\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 && alert}\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","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\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 recommendation?: string;\n}\n\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent,\n recommendation\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 const heading = recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\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 <div className='ms-feature-search-result__item'>\n <a\n href={productUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)} {...attribute}\n aria-label={product.Name}>\n <div className='msc-feature-search-result__item__image'>\n {renderProductPlacementImage(\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\n product.Name, fallbackImage, context.actionContext.requestContext)}\n </div>\n </a>\n <div className='msc-feature-search-result__item__detail'>\n <p className='msc-feature-search-result__item__heading'>\n {heading}\n </p>\n {renderProductTitle(product?.Name)}\n </div>\n </div>\n );\n\n};\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string,\n altText?: string, fallbackImage?: string, context?: IRequestContext): JSX.Element | null {\n\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,\n imageSettings,\n fallBackSrc: fallbackImage\n };\n return (\n <Image\n {...img} {...imageProps} loadFailureBehavior='empty'\n requestContext={context}\n />\n );\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return (<h1 className='msc-feature-search-result__item__product-title'>\n {title}\n </h1>);\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\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';\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 readonly editButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n private readonly formCardRef: React.RefObject<HTMLDivElement> = React.createRef();\n\n private readonly 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,\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 role='link'\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'>\n {children}\n </div>\n\n {this.renderFooder()}\n </div>\n </div>\n );\n }\n\n private readonly 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 readonly focusOnFirstFocusableElement = (): void => {\n const node = this.formCardRef.current 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 readonly 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 readonly 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 readonly 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'>\n {step + 1}\n .\n {' '}\n </span>\n {text && <span className='ms-checkout__guided-card-title-text'>\n {text}\n </span>}\n </Tag>\n );\n };\n}\n\nexport default CheckoutGuidedCard;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType, createObservableDataAction, getCatalogId, IAction, IActionContext, IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\nimport {\n getSearchSuggestionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\n\nexport enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * Input class for auto suggest search input.\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n\n public topResultsCount?: number;\n\n public suggestionType?: string;\n\n public hitPrefix?: string;\n\n public hitSuffix?: string;\n\n public constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\n\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions.\n * @param input\n * @param ctx\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise<Autosuggestions | null> {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\nasync function _getAutoSuggest(\n input: AutoSuggestInput,\n autosuggest: Autosuggestions,\n ctx: IActionContext\n): Promise<void> {\n const catalogId = getCatalogId(ctx.requestContext);\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n },\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) => (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\n );\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(`[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`);\n }\n}\n\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: <IAction<Autosuggestions>>getSearchSuggestionsAction,\n input: createInput\n});\n\nexport default getSearchSuggestionsActionDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * CategorySuggestionsComponent.\n * @param props\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading ? format(categorySuggestionHeading, searchText) : `Search \"${searchText}\" in categories`;\n\n return (<li className='msc-autoSuggest__categoryResults-title'>\n {categoryAutoSuggestionHeading}\n </li>);\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix, shouldShowFullPath } = props;\n\n const splitValue = shouldShowFullPath ? item.Value : item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '') : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__categoryResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, searchText, props)} {...attribute}>\n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n\n if (searchQsp && searchText) {\n queryUrl.searchParams.set(searchQsp, searchText);\n }\n\n const categoryRefiners = searchRefiners?.find(refiners => {\n return refiners.SourceValue === ProductRefinerSource.Category;\n });\n const refiner = categoryRefiners?.Values?.find(item => {\n return item.RefinerRecordId === Number.parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\n if (encodedRefiner) {\n queryUrl.searchParams.set('refiners', encodedRefiner);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach((refiner) => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach((refinerKey) => {\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchFormProps {\n hideSearchLabel: boolean | undefined;\n isSearchFormExpanded?: boolean | undefined;\n disableSubmitSearch: boolean | undefined;\n searchTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n searchQsp: string;\n searchPlaceholder: string;\n query: string;\n ariaLabelCancel: string;\n ariaLabelSearch: string;\n ariaLabelSubmit: string;\n handleCancelSearchChange(): void;\n handleInputChange(query: string): void;\n}\n\nexport interface ISearchFormViewProps {\n input: React.ReactNode;\n submitBtn: React.ReactNode;\n cancelBtn: React.ReactNode;\n\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Set updated input value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\n const {\n searchQsp,\n searchPlaceholder,\n hideSearchLabel,\n searchTextInput,\n handleInputChange,\n maxChars,\n disableSubmitSearch,\n handleCancelSearchChange,\n query,\n ariaLabelCancel,\n ariaLabelSearch,\n ariaLabelSubmit\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const inputNode = !hideSearchLabel ? (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n maxLength={maxChars}\n value={query}\n />\n ) : (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n value={query}\n />\n );\n\n const submitBtnNode = !disableSubmitSearch && (\n <Button className='ms-search__form-submitSearch' aria-label={ariaLabelSubmit} />\n );\n\n const cancelBtNoden = (\n <Button\n className={!disableSubmitSearch ? 'ms-search__form-cancelSearch' : 'ms-search__form-cancelSearchNoSumbit'}\n aria-label={ariaLabelCancel}\n onClick={handleCancelSearchChange}\n type='button'\n />\n );\n\n return { input: inputNode, cancelBtn: cancelBtNoden, submitBtn: submitBtnNode };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchKeywordSuggestProps {\n searchKeywordSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchKeywordViewProps {\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * KeywordSuggestionsComponent.\n * @param props\n */\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\n const {\n suggestions,\n hitPrefix,\n hitSuffix\n } = props;\n\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n const reactNodes: React.ReactNode[] = [];\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\n });\n\n return { text: reactNodes };\n};\n\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\n const ariaLabel = item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = ariaLabel;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__keywordResults-item' key={item.Id}>\n <a\n aria-label={ariaLabel}\n href={_generateLink(item, hitPrefix, hitSuffix, props)}\n {...attribute}\n >\n {_generateLink(item, hitPrefix, hitSuffix, props) &&\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\n const { searchPageURL, searchQsp } = props;\n\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n if (searchQsp && formattedLink) {\n queryUrl.searchParams.set(searchQsp, formattedLink);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchLabelProps {\n isSearchFormExpanded: boolean;\n searchLabelClass: string;\n searchLabelArialLabel: string;\n searchtext: string;\n searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n hideSearchLabel?: boolean;\n telemetryContent: ITelemetryContent;\n handleCancelSearchChange(): void;\n}\n\nexport const LabelComponent = (props: ISearchLabelProps) => {\n const { searchLabelClass, searchLabelArialLabel, isSearchFormExpanded, searchtext, searchCollapsedLabel, hideSearchLabel, handleCancelSearchChange, telemetryContent } = props;\n const payLoad = getPayloadObject('click', telemetryContent, searchtext, '');\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n\n return (\n <div className={searchLabelClass}>\n <Button\n className='ms-search__icon'\n aria-expanded={isSearchFormExpanded}\n aria-label={searchLabelArialLabel}\n onClick={handleCancelSearchChange}\n innerRef={searchCollapsedLabel}\n {...attributes}\n >\n {!hideSearchLabel && <span className='ms-search__icon-text' aria-hidden>\n {searchtext}\n </span>}\n </Button>\n </div>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getProductPageUrlSync, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, INodeProps, IPayLoad, ITelemetryContent, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\n/**\n * Search product suggest resources.\n */\nexport interface ISearchProductSuggestResources {\n freePriceText: string;\n}\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n resources?: ISearchProductSuggestResources;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n * ProductSuggestionsComponent.\n * @param props\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return (<li className='msc-autoSuggest__productResults-title'>\n {productAutoSuggestionHeading}\n </li>);\n};\n\nconst _assembleNode = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps,\n moduleType: string,\n moduleId: string\n): ISearchProductItemViewProps => {\n const altText =\n item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n const price = item.Value3?.Value?.DecimalValue;\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price: !ObjectExtensions.isNullOrUndefined(price) &&\n _renderPrice(price, price, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext, props: ISearchProductSuggestProps) => {\n const {\n autoSuggestProps: { context }\n } = props;\n const ariaLabel = item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n payLoad.contentAction.recid = item.Id;\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPrice = context.cultureFormatter.formatCurrency(item.Value3!.Value!.DecimalValue!);\n\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'a' as NodeTag,\n 'aria-label': `${ariaLabel!} ${productPrice}`,\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\n ...attribute\n };\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const formattedLink = (suggestion.Value as string).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id ? getProductPageUrlSync(formattedLink, suggestion.Id as unknown as number, actionContext, undefined) : '';\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n return <span className='msc-price msc-autoSuggest__productResults-item-text' dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n\nconst _renderPrice = (adjustedPrice: number, basePrice: number, moduleId: string, moduleType: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleType}\n context={context}\n data={{\n price: {\n CustomerContextualPrice: adjustedPrice,\n BasePrice: basePrice\n }\n }}\n className='msc-autoSuggest__productResults-item-price'\n freePriceText={props.resources?.freePriceText}\n />\n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\n <Image\n requestContext={props.autoSuggestProps.context.actionContext.requestContext}\n altText={altText}\n className='msc-autoSuggest__productResults-item-img'\n src={suggestion.ImageUrl}\n gridSettings={gridSettings!}\n imageSettings={imageSettings ? imageSettings : defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, ObjectExtensions, Random } from '@msdyn365-commerce-modules/retail-actions';\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData, SuggestionTypeCriterionSuggestionType } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n isLoadingAutoSuggest?: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps<ISearchData> {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n };\n isSearchFormExpanded: boolean;\n isLoadingAutoSuggest?: boolean;\n isLoadingNode?: React.ReactNode;\n}\n\n/**\n *\n * Search module.\n * @extends {React.Component<ISearchProps<ISearchData>, ISearchState>}\n */\nclass Search extends React.Component<ISearchProps<ISearchData>, ISearchState> {\n private readonly searchTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n\n private readonly formReference: React.RefObject<HTMLButtonElement>;\n\n private readonly maxChars: number;\n\n private readonly topResultsCount?: number;\n\n private readonly hitPrefix: string = '{';\n\n private readonly hitSuffix: string = '}';\n\n private readonly waitTime: number = 500;\n\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject<HTMLDivElement>;\n\n private readonly autoSuggestResultDiv: React.RefObject<HTMLDivElement>;\n\n private readonly searchFormClass: string;\n\n private readonly searchLabelClass: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private loadSuggestionsRequestId?: string;\n\n private inputSuggestionType: ISuggestionTypeCriterionData[];\n\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n public constructor(props: ISearchProps<ISearchData>) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true,\n isLoadingAutoSuggest: false\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n\n this.inputSuggestionType = [];\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n\n this._initSuggestionTypes();\n }\n\n public async componentDidMount(): Promise<void> {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n public shouldComponentUpdate(nextProps: ISearchProps<ISearchData>,\n nextState: ISearchState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- ignore complexity.\n public render(): JSX.Element {\n const {\n context,\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\n } = this.props;\n\n const {\n isSearchFormExpanded,\n searchText,\n searchKeywordSuggestClass,\n searchProductSuggestClass,\n searchCategorySuggestClass,\n suggestions,\n searchRefiners,\n isLoadingAutoSuggest\n } = this.state;\n\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\n\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\n );\n const productSuggestions = suggestions?.AllSearchResults?.filter(suggestion => suggestion.SuggestionType === SuggestionType.Product);\n const categoryRefiners = searchRefiners?.find(refiner => {\n return refiner.SourceValue === ProductRefinerSource.Category;\n });\n const categorySuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => {\n if (suggestion.SuggestionType !== SuggestionType.Category) {\n return false;\n }\n const refiner = categoryRefiners?.Values?.find(item => {\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\n });\n\n return !ObjectExtensions.isNullOrUndefined(refiner);\n });\n\n const viewProps: ISearchViewProps = {\n ...(this.props as ISearchProps<ISearchData>),\n\n Search: {\n moduleProps: this.props,\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\n },\n AutoSuggestAriaLabel: {\n tag: 'div',\n className: 'msc-autoSuggest__screen-reader',\n 'aria-live': 'assertive',\n ref: this.autoSuggestResultScreenReaderDiv\n },\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\n searchText: this.state.searchText,\n AutoSuggest: {\n ref: this.autoSuggestResultDiv,\n className: 'ms-search__autoSuggest'\n },\n KeywordSuggest: {\n className: searchKeywordSuggestClass\n },\n ProductSuggest: {\n className: searchProductSuggestClass\n },\n CategorySuggest: {\n className: searchCategorySuggestClass\n },\n SearchForm: {\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\n },\n FormWrapper: {\n tag: 'form',\n ref: this.formReference,\n className: 'ms-search__searchForm',\n 'aria-label': 'Search',\n name: 'searchForm',\n role: 'search',\n action: searchURL,\n autoComplete: 'off',\n onSubmit: this._handleSubmit\n },\n UlKeyword: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__keywordResults-items', className)\n },\n UlProduct: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__productResults-items', className)\n },\n UlCategory: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__categoryResults-items', className)\n },\n label: LabelComponent({\n isSearchFormExpanded,\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\n searchtext,\n searchLabelArialLabel,\n searchCollapsedLabel: this.searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange: this._handleCancelSearchChange,\n telemetryContent: this.telemetryContent\n }),\n form: FormComponent({\n ariaLabelCancel: cancelBtnAriaLabel,\n ariaLabelSearch: searchBtnAriaLabel,\n ariaLabelSubmit: submitBtnAriaLabel,\n hideSearchLabel,\n searchTextInput: this.searchTextInput,\n disableSubmitSearch,\n handleInputChange: this._handleInputChange,\n handleCancelSearchChange: this._handleCancelSearchChange,\n maxChars: this.maxChars,\n searchQsp,\n searchPlaceholder,\n query: searchText\n }),\n autosuggestKeyword:\n searchText && searchText.length > 0 &&\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions))) ? KeywordSuggestionsComponent({\n searchKeywordSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: keywordSuggestions,\n telemetryContent: this.telemetryContent\n }) : undefined,\n autosuggestProduct:\n searchText && searchText.length > 0 &&\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions))) ? ProductSuggestionsComponent({\n searchProductSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent,\n resources: this.props.resources\n }) : undefined,\n autosuggestCategory:\n searchText && searchText.length > 0 &&\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions))) ? CategorySuggestionsComponent({\n searchCategorySuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: categorySuggestions,\n searchRefiners,\n telemetryContent: this.telemetryContent,\n shouldShowFullPath: shouldShowFullCategoryPath\n }) : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded,\n isLoadingAutoSuggest,\n isLoadingNode: this._isLoadingNode()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _initSuggestionTypes() {\n const suggestionTypes = this.props.config.suggestionTypeCriterion;\n\n const suggestions = ArrayExtensions.unique(ArrayExtensions.validValues(suggestionTypes));\n if (!ArrayExtensions.hasElements(suggestions)) {\n this.inputSuggestionType = [\n { SuggestionType: SuggestionTypeCriterionSuggestionType.keyword },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.product },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.scopedCategory }\n ];\n return;\n }\n\n const validSuggestions = suggestions.filter(suggestion => suggestion.SuggestionType);\n if (ArrayExtensions.hasElements(validSuggestions)) {\n this.inputSuggestionType = validSuggestions;\n return;\n }\n\n this.inputSuggestionType = [];\n }\n\n /**\n * Function to create the ReactNode for loading Autosuggest result.\n * @returns ReachNode for loading Autosuggest result.\n */\n private readonly _isLoadingNode = (): React.ReactNode => {\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\n return (<Spinner\n className='msc-autoSuggest__loadingResult'\n label={loadingText}\n size={SpinnerSize.medium}\n labelPosition='right'\n />);\n };\n\n private readonly _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (\n suggestions &&\n suggestions.AllSearchResults &&\n e.target.closest('.ms-search') === null\n ) {\n this._clearAutoSuggestState();\n }\n };\n\n private readonly _keyup = (e: KeyboardEvent): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\n this._clearAutoSuggestState();\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n\n if (!((this.formReference.current && this.formReference.current.contains(e.target as unknown as Node)) ||\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains(e.target as unknown as Node)))) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private readonly _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private async _getSearchSuggestions(loadSuggestionsRequestId: string, query: string) {\n try {\n const searchSuggestions = await getSearchSuggestionsAction(\n new AutoSuggestInput(\n query,\n this.topResultsCount,\n this._getSuggestionType(),\n this.hitPrefix,\n this.hitSuffix\n ),\n this.props.context.actionContext\n );\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n return searchSuggestions;\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n this.setState({ suggestions: undefined, searchRefiners: undefined,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get auto suggest results');\n return undefined;\n }\n }\n\n private async _updateSearchRefiners(loadSuggestionsRequestId: string, query: string, suggestions: Autosuggestions | undefined) {\n try {\n const refiners = await this._getSearchRefiners(query);\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({ suggestions, searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions), isLoadingAutoSuggest: false });\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({ suggestions, searchRefiners: undefined,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions) });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get refiners results');\n }\n }\n\n private _loadSuggestions(query: string) {\n this.cancellabelDebounce = debounce(async () => {\n this.setState({ isLoadingAutoSuggest: true });\n const loadSuggestionsRequestId = Random.Guid.generateGuid();\n this.loadSuggestionsRequestId = loadSuggestionsRequestId;\n const searchSuggestions = await this._getSearchSuggestions(loadSuggestionsRequestId, query);\n await this._updateSearchRefiners(loadSuggestionsRequestId, query, searchSuggestions);\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n }\n\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length <= this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n if (ArrayExtensions.hasElements(this.inputSuggestionType)) {\n this._loadSuggestions(query);\n }\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private _getSuggestionType(): string {\n const distinctSuggestionTypes: string[] = this.inputSuggestionType.map(\n suggestionTypeItem => suggestionTypeItem.SuggestionType!.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType!.slice(1));\n return distinctSuggestionTypes.join(',');\n }\n\n private async _getSearchRefiners(searchText: string): Promise<ProductRefiner[]> {\n const { actionContext: ctx } = this.props.context;\n const catalogId = getCatalogId(ctx.requestContext);\n return ProductsDataActions.getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n }\n );\n }\n\n private readonly _handleSubmit = (\n e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement> | React.FormEvent<HTMLFormElement>\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private readonly _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(route, window.location.href);\n if (qsp && query) {\n queryUrl.searchParams.set(qsp, query);\n }\n\n return queryUrl.href;\n };\n\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\n ariaLiveRegion.innerText = result && (result.AllSearchResults && result.AllSearchResults.length > 0) ? suggestResultString : emptyResultString;\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\n return ariaLiveRegion.innerText;\n }\n return '';\n\n };\n}\n\nexport default Search;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISingleOrderTemplateViewProps } from './components';\nimport { IOrderTemplateListViewProps } from './order-template-list';\n\nexport const OrderTemplateListView: React.FC<IOrderTemplateListViewProps> = props => {\n const { OrderTemplateList, status, statusMessage, heading, OrderTemplates, orderTemplates, OrderTemplate, createOrderTemplateButton, templateHeaderStatusMessage } = props;\n\n return (\n <Module {...OrderTemplateList}>\n {heading}\n {status !== 'SUCCESS' && statusMessage}\n <Node className=''>\n {createOrderTemplateButton}\n {templateHeaderStatusMessage}\n </Node>\n { OrderTemplates && orderTemplates && orderTemplates.length > 0 &&\n <Node {...OrderTemplates}>\n {orderTemplates && orderTemplates.map((orderTemplate) => {\n return _renderOrderTemplate(orderTemplate, OrderTemplate);\n })}\n </Node>}\n </Module>\n );\n};\n\nconst _renderOrderTemplate = (orderTemplate: ISingleOrderTemplateViewProps, OrderTemplate?: INodeProps): JSX.Element | null => {\n\n const { key, addToCartButton, orderTemplateImage, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\n return (\n <Node key={key} className={OrderTemplate!.className} {...OrderTemplate}>\n {orderTemplateName}\n {orderTemplateImage}\n {addToCartButton}\n {removeButton}\n {orderTemplateStatusMessage}\n </Node>\n );\n};\n\nexport default OrderTemplateListView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IModuleStateManager } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { Heading } from '@msdyn365-commerce-modules/data-types';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport get from 'lodash/get';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport GuidedCard from './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 isPaymentVerificationRedirection?: boolean;\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\n hasError?: boolean;\n hasShippingAddress?: boolean | undefined;\n hasCartDeliveryMode?: boolean | undefined;\n hasGuestCheckoutEmail?: boolean | undefined;\n isTermsAndConditionAccepted?: boolean | undefined;\n}\n\ninterface ICheckoutGuidedFormState {\n currentStep: number;\n}\n\nconst paymentInstrumentModuleId = 'payment-instrument';\n\n/**\n *\n * CheckoutGuidedForm component.\n * @extends {React.Component<ICheckoutGuidedFormProps>}\n */\n@observer\nclass CheckoutGuidedForm extends React.PureComponent<ICheckoutGuidedFormProps> {\n\n @computed public get hasMissingInfo(): boolean {\n if (this.props.hasShippingAddress === false || this.props.hasCartDeliveryMode === false ||\n this.props.hasGuestCheckoutEmail === false || this.props.isTermsAndConditionAccepted === false) {\n return true;\n }\n\n return false;\n }\n\n @computed public get hasOrderError(): boolean {\n for (const item of this.props.items) {\n const childId = this.getId(item);\n const state = this.props.moduleState.getModule(childId);\n\n const isPaymentSectionContainer = ArrayExtensions.hasElements(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n state.childIds?.filter(currentId => currentId?.includes(paymentInstrumentModuleId)));\n\n if (!isPaymentSectionContainer && !state.isDisabled && state.hasError) {\n return true;\n }\n }\n\n return false;\n }\n\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 const shouldCollapseAfterRedirect = this.props.isPaymentVerificationRedirection &&\n this.props.shouldEnableSinglePaymentAuthorizationCheckout &&\n !this.props.hasError && !this.hasMissingInfo && !this.hasOrderError;\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={!shouldCollapseAfterRedirect && this.isActive(step)}\n isVisted={!shouldCollapseAfterRedirect && this.isVisted(step)}\n isExpanded={!shouldCollapseAfterRedirect && 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 readonly 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 readonly getStep = (id: string): number => {\n return this.getEnabledModules().indexOf(id);\n };\n\n private readonly getId = (item: React.ReactNode): string => {\n return get(item, 'props.id') || '';\n };\n\n private readonly getHeading = (item: React.ReactNode): Heading => {\n return get(item, 'props.config.heading') || '';\n };\n\n private readonly 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 readonly isActive = (step: number): boolean => {\n return step === this.state.currentStep;\n };\n\n private readonly isVisted = (step: number): boolean => {\n return step > -1 && step < this.state.currentStep;\n };\n\n private readonly onNext = (): void => {\n this.setState({\n currentStep: this.state.currentStep + 1\n });\n };\n}\n\nexport default CheckoutGuidedForm;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IInvoiceSummaryProps {\n orderTotalLabel: string;\n invoiceLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n id: string;\n typeName: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n}\n\nexport interface IInvoiceSummaryLines {\n orderTotal: React.ReactNode;\n invoices: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IInvoiceSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\nconst InvoiceSummaryLine: React.FC<IInvoiceSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n <p className={`msc-invoice-summary__line-${cssLabel}`}>\n <span className='msc-invoice-summary__label'>\n {label}\n </span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className='msc-invoice-summary__value'\n />\n ) : (\n <span className='msc-invoice-summary__value'>\n {toBeCalculatedText}\n </span>\n )}\n </p>\n );\n};\n\nconst _buildPaymentSummarySection = (\n props: IInvoiceSummaryProps,\n price: number | undefined,\n label: string,\n cssLabel: string\n): React.ReactNode => {\n return (\n <InvoiceSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nexport const InvoiceSummary = (props: IInvoiceSummaryProps) => {\n const { TotalAmount, CartLines } = props.cart;\n const invoiceLines = CartLines?.filter(cartLine => cartLine.IsInvoiceLine);\n const reactNodes: IInvoiceSummaryLines = {\n invoices: invoiceLines?.map((invoiceLine: CartLine) => {\n return _buildPaymentSummarySection(props, invoiceLine.InvoiceAmount, format(props.invoiceLabel, invoiceLine.InvoiceId), 'invoice');\n }),\n orderTotal: _buildPaymentSummarySection(props, TotalAmount, props.orderTotalLabel, 'total')\n };\n\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildPaymentSummarySection(props, -loyaltyAmount, props.loyaltyLabel || 'Loyalty amount', 'loyalty');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildPaymentSummarySection(props, -giftCardAmount, props.giftcardLabel || 'Gift card amount', 'gift-card');\n }\n\n reactNodes.orderTotal = _buildPaymentSummarySection({ ...props, freeText: undefined }, totalAmountAfterGiftCard, props.orderTotalLabel, 'total');\n }\n\n return reactNodes;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { CheckoutState } from './checkout-state';\n\n/**\n * CheckoutState - action input.\n */\nexport class CheckoutStateInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('CheckoutState', this.apiSettings);\n\n public getCacheObjectType = () => 'CheckoutState';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CheckoutState - action.\n * @param input\n * @param ctx\n */\nexport async function checkoutStateAction(input: CheckoutStateInput, ctx: IActionContext): Promise<CheckoutState> {\n return new CheckoutState();\n}\n\n/**\n * CheckoutState - create new input for create action.\n * @param inputData\n */\nconst createInput = (inputData: ICreateActionContext<IGeneric<IAny>>): IActionInput => {\n return new CheckoutStateInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * CheckoutState - create action.\n */\nexport const checkoutStateActionDataAction = createObservableDataAction<CheckoutState>({\n action: <IAction<CheckoutState>>checkoutStateAction,\n input: createInput\n});\n\nexport default checkoutStateActionDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitUserReviewInput } from './inputs/submit-user-review-input';\n\n/**\n * This data action allows submitting review to the reviews service.\n * @param input This user review submission text.\n * @param ctx The data action context.\n */\nasync function submitReview(input: SubmitUserReviewInput, ctx: IActionContext): Promise<string> {\n if (!inputIsValid(input)) {\n ctx.trace(`[SubmitUserReview] Failed to submit reviews for product due to bad input ${input}`);\n return '';\n }\n\n const requestUrl = `${input.serviceEndpoint}/v2.0/reviews/product/${input.productId}/user?` +\n `tenantId=${input.tenantId}&` +\n `channelId=${input.channelId}&` +\n `locale=${input.locale}`;\n\n return sendRequest<string>(requestUrl, 'post', input.userReviewData, { headers: { Authorization: `id_token ${input.authorization}` } }).then((response) => {\n if (response.status !== 200 && response.status !== 201) {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(response.data);\n return '';\n }\n return response.data;\n }).catch((error) => {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(error);\n return '';\n });\n}\n\nfunction inputIsValid(input: SubmitUserReviewInput): boolean {\n return input && !!input.productId && !!input.tenantId;\n}\n\nexport const submitReviewDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-user-review',\n action: <IAction<string>>submitReview\n});\n\nexport default submitReviewDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, CartLineValidationResults, CartsDataActions, LineDataValidationFailure, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cart: AsyncResult<ICartState>,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true): Promise<LineDataValidationFailure[] | undefined> {\n\n if (!isQuantityLimitsFeatureEnabled) {\n return AsyncResult.resolve();\n }\n\n let cartResult: ICartState;\n let cartVersion: number | undefined;\n try {\n cartResult = await cart;\n cartVersion = cartResult.cart.Version;\n } catch (error) {\n telemetry.warning(error);\n telemetry.debug('Unable to get cart or cart version.');\n return AsyncResult.resolve();\n }\n\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: propsContext.actionContext, bypassCache: 'none' },\n cartResult.cart.Id, cartVersion\n );\n\n return await AsyncResult.resolve(validationResult.ValidationFailuresByCartLines ?? []);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- error type is not defined.\n if (shouldRetry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n telemetry.warning(refreshError);\n telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await validateCartAsync(isQuantityLimitsFeatureEnabled, cart, telemetry, propsContext, false);\n return AsyncResult.resolve();\n } catch (validateError) {\n telemetry.warning(validateError);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n telemetry.warning(error);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n}\n\n/**\n * Check if cart line quantity update is success.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function isCartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number): Promise<boolean> {\n\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find((product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId);\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult.status === 'SUCCESS');\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve(false);\n}\n\n/**\n * Update cart line with cart action result.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function cartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number): Promise<ICartActionResult | undefined> {\n\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find((product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId);\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\nimport { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\nimport checkout from './checkout';\nimport emptyActiveCart from './empty-active-cart';\n\nexport default async (ctx: IActionContext, checkoutState: ICheckoutState | undefined, orderedProducts: SimpleProduct[] | undefined,\n redirect: boolean, updatedCartVersion?: number, isPaymentVerificationRedirection?: boolean) => {\n return new Promise(async (resolve: () => void, reject: (reason?: Error) => void) => {\n let salesOrder: SalesOrder;\n\n // Proceed checkout\n try {\n salesOrder = await checkout(ctx, updatedCartVersion, isPaymentVerificationRedirection);\n } catch (error) {\n reject(error); return;\n }\n\n // Remove purchased items from the active cart\n try {\n await emptyActiveCart(ctx);\n } catch (error) {\n reject(error); return;\n }\n\n if (redirect) {\n // Redirect to the order confirmation page\n const orderConfirmationUrl = getUrlSync('orderConfirmation', ctx) || '';\n if (!orderConfirmationUrl) {\n reject(new Error('Error: No orderConfirmationUrl')); return;\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 reject(new Error('Error: Updating error state failed')); return;\n }\n } else {\n reject(new Error('Error: No checkout state')); return;\n }\n resolve();\n }\n });\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IWriteReviewViewProps } from './write-review';\n\nconst WriteReviewView: React.FC<IWriteReviewViewProps> = props => {\n const { heading, signInMessage, signInButton, modalToggle, reviewModal, moduleProps } = props;\n const isAuthenticated = props.context.request.user.isAuthenticated;\n return (\n <Module {...moduleProps}>\n {heading}\n {!isAuthenticated ? <>\n {signInMessage}\n {signInButton}\n </> : <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n </>}\n </Module>\n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n <Module {...props.modal} {...moduleProps}>\n {props.modalHeader}\n <Node {...props.modalBody}>\n <Node {...props.form}>\n <Node {...props.inputRow}>\n {props.rating}\n {props.ratingLabel}\n </Node>\n <Node {...props.inputRow}>\n {props.titleLabel}\n {props.titleInput}\n </Node>\n <Node {...props.inputRow}>\n {props.textLabel}\n {props.textInput}\n </Node>\n {props.privacyPolicyUrl}\n {props.error}\n </Node>\n </Node>\n <Node {...props.modalFooter}>\n {props.submitButton}\n {props.cancelButton}\n </Node>\n </Module>\n );\n};\n\nexport default WriteReviewView;\n"],"sourceRoot":""}