{"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/themes/gardner-theme/views/cart-icon.view.tsx?d575","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-b2c/views/cart-icon.view.tsx?3dd0","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/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","CartIconView","PureComponent","getExtensionPropertyValueByKey","properties","valueType","_properties$find","property","p","Key","_modalContainer","Modal","placement","hideArrow","wrapClassName","isModalOpen","closeModal","_openModal","onTelemetryClick","_modalErrContainer","isErrModalOpen","closeErrModal","isAutoDisplayTriggered","_renderCartCloseIcon","_renderCartItemCount","cartItemCount","cartlines","tabIndex","_escFunction","keyCode","KeyCodes","Escape","isErrAutoDisplayTriggered","isAddressCheckComplete","iProductsPresentVersion","componentDidMount","_removeCommentFromCartLine","_cartState$cart$CartL","Comment","_clonedCart","customer","readAsync","customerAccountNumber","_customer$Addresses","Addresses","add","IsPrimary","ShippingAddress","primaryAddress","getAddresses","updateShippingAddress","newShippingAddress","_this$props$data$cart","_cart$cart","_this$props$data$cart2","_this$props$data$cart3","_this$props$data$cart4","ippContent","iProductsPresent","CommercePropertyValueEnum","string","ineligibleProductsText","JSON","parse","r","Barcode","err","handleCartAddress","isProductAddedToCart","AddToCartBehavior","showMiniCart","miniCartWrapper","renderModuleAttributes","cartIcon","flyoutTitle","slots","allowableFreight","isEmpty","emptyCart","CartlinesWrapper","_props$data$cart$resu","miniCartItemWrapper","invoiceInCartMessage","document","_data$detail$Products","detail","Products","cartLineIndex","storeLocation","remove","promoContentItem","_props$data$cart$resu2","_props$resources$tota","totalPrice","cultureFormatter","formatCurrency","emptyPrice","totalPriceFormatString","renderTotalPrice","subTotalMessage","checkoutAsSignInUserButton","checkoutAsGuestButton","goToCartButton","continueShoppingButtonTitle","renderCartlines","ReviewsList","sortByDropdownOptions","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","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","decodeURIComponent","currentPageNumber","sortingCritera","Columns","pageSize","activeProducts","totalProductCount","activeFilters","hydrateRefinersFromUrl","featureProduct","_getProductsDimensionsAvailabilities","_this$props$data$list","_this$props$data$list2","productsList","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","toLowerCase","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","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","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","recordId","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","image","isInPopup","fallbackImage","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","_refHandler","divRef","which","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","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","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","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","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","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","wishlists","defaultWishlistName","nameOfWishlist","availableQuantityInStock","isStockCheckEnabled","productAvailability","IsProductAvailable","_getCartItemAvailableQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","isQuantityLimitsFeatureEnabled","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","MaximumQuantity","shouldSkipStockCheck","ItemTypeValue","ReleasedProductType","Service","_getErrorMessage","_props$productAvailab","finalErrorMessages","productAvailabilites","shouldIgnoreWarehouse","InventLocationId","includeErrors","outOfStockText","outOfRangeOneText","outOfRangeFormatText","cartlinesErrors","LineIndex","_i$DataValidationFail","DataValidationFailure","ErrorContext","onRemoveClickHandler","onRemoveClickFunction","payload","TelemetryEvent","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","isCustomPriceSelected","_cartline$CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","updateCartLinesQuantitySuccessHandler","pickUpInStore","pickitUpText","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","assembleCartlines","_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","getOrderQuantityLimitsFeatureFlag","showAvailablePromotions","guestCheckoutUrl","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","RetailMultiplePickupFeatureState","multiplePickUpEnabled","getCartLinesGroup","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","cartTitle","OrderSummaryWrapper","OrderSummaryItems","_getPromoCode","_getPromotions","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutButtonTitle","guestCheckoutButtonTitle","expressCheckoutButton","paymentExpress","ExpressCheckoutSectionWrapper","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","storeSelector","waitingComponent","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","OrderSummaryErrors","_getOrderSummaryErrors","_this$props$data$feat2","_this$props$data$cust","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","_this$props$context","_featureStatuses$find","featureStatuses","_this$props$data$feat4","_this$props$data$cata2","_this$props$data$chan2","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","unitOfMeasure","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","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","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","isServiceItem","RemoveCartItem","removeCartItemAttribute","displayMode","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","includeFlyout","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","flyoutTooltip","UncontrolledTooltip","trigger","shouldShowCloseButton","cartPageUrl","priceString","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","_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","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","productImage","_renderProductImage","productInfo","renderProductInfo","_renderPrice","productUnitOfMeasure","productQuantityView","_generateQuantity","addToBagButton","popUp","onChangeHandler","_orderTemplateLine$fu","_renderProductDimensions","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","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","productInventoryInformation","_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","_renderGuestCheckout","modalCloseButtonReference","CreateOrderTemplateButton","onCancelHandler","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","onCreateButtonClick","OrderTemplateNameDialog","isUpdateDialog","setModalOpen","parentElementRef","SignInMessage","SignInButton","SignIn","WriteReview","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","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","From","SelectedGiftCard","GiftCardList","AddResource","ShowResource","CheckoutGiftCardView","_renderItem","quantityLabel","OrderTemplateLinesView","toggleDetails","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","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/6.34635725e2aa3d248f87.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","/*--------------------------------------------------------------\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 { AddToCartBehavior } from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync } from '@msdyn365-commerce/core';\r\n// @ts-ignore\r\nimport { ICartIconViewProps, ICartViewProps, IFlyoutCartLineItemViewProps } from '@mdsdyn365-commerce-modules/cart';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, INodeProps, KeyCodes, Modal, Node, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\n\r\n\r\nimport { ICartIconProps as ICartIconExtensionProps, ICartIconResources } from '../definition-extensions/cart-icon.ext.props.autogenerated';\r\nimport { readAsync } from \"@msdyn365-commerce/retail-proxy/dist/DataActions/CustomersDataActions.g\";\r\nimport { Address } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { CartLine, CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport { CommercePropertyValueEnum } from '../../../modules/allowable-freight/utils/CommercePropertyValueEnum';\r\n\r\n/**\r\n * ICartIconViewState: Interface for Cart Icon View State.\r\n */\r\ninterface ICartIconViewState {\r\n isModalOpen: boolean;\r\n isAddressCheckComplete: boolean;\r\n isErrModalOpen: boolean;\r\n iProductsPresentVersion: number;\r\n}\r\n\r\nconst renderInvoiceInCartMsg = (resources: ICartIconResources): JSX.Element | null => {\r\n\r\n return (\r\n \r\n \r\n {resources.invoiceInCartMessage}\r\n \r\n ) \r\n\r\n}\r\n\r\n/**\r\n * Render Cart lines.\r\n * @param cartLines - Flyout cart line view props.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\nconst renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element[] | null => {\r\n if (props.data.cart.result?.hasInvoiceLine) {\r\n\r\n return (\r\n [\r\n {renderInvoiceInCartMsg(props.resources)}\r\n \r\n ]);\r\n }\r\n\r\n if (!cartLines ) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n \r\n if (MsDyn365.isBrowser) {\r\n document.addEventListener('UPDATE_CART', (data: any) => {\r\n if (data.detail.Products?.length) {\r\n const cartState = props.data.cart.result;\r\n cartState?.removeCartLines({ cartLineIds: data.detail.Products.map((p: any) => p.LineId) });\r\n }\r\n });\r\n }\r\n\r\n return cartLines.map((cartLine, index) => {\r\n const cartLineIndex = index;\r\n return (\r\n \r\n \r\n {cartLine.cartline}\r\n \r\n {cartLine.remove}\r\n {cartLine.storeLocation}\r\n \r\n );\r\n });\r\n};\r\n\r\n/**\r\n * Initiate total price.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\nconst renderTotalPrice = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\r\n const cart = props.data.cart.result ?? undefined;\r\n const price = cart && !cart.hasInvoiceLine && (cart.cart.TotalAmount || undefined);\r\n const totalPrice = price ? props.context.cultureFormatter.formatCurrency(price) : props.context.cultureFormatter.formatCurrency(props.resources.emptyPrice);\r\n return (\r\n
\r\n \r\n {props.resources.totalPriceFormatString?.replace('{price}', '')}\r\n \r\n {totalPrice}\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\n/**\r\n *\r\n * CartIconView component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class CartIconView extends React.PureComponent, ICartIconViewState> {\r\n\r\n private isAutoDisplayTriggered: boolean;\r\n private isErrAutoDisplayTriggered: boolean;\r\n\r\n public constructor(props: ICartViewProps & ICartIconViewState & ICartIconViewProps & ICartIconExtensionProps<{}>) {\r\n super(props);\r\n this.isAutoDisplayTriggered = false;\r\n this.isErrAutoDisplayTriggered = false;\r\n this.state = {\r\n isModalOpen: false,\r\n isAddressCheckComplete: false,\r\n isErrModalOpen: false,\r\n iProductsPresentVersion: 0\r\n };\r\n\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('keydown', this._escFunction, false);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.removeEventListener('keydown', this._escFunction, false);\r\n }\r\n }\r\n\r\n private _removeCommentFromCartLine(): void {\r\n const cartState = this.props.data.cart.result || undefined;\r\n\r\n if (cartState) {\r\n if ((!cartState.cart.CartLines || cartState.cart.CartLines?.length === 0) && cartState.cart.Comment) {\r\n const _clonedCart = { ...cartState.cart };\r\n _clonedCart.Comment = \"\";\r\n\r\n void cartState.updateCart({ newCartObject: _clonedCart });\r\n }\r\n }\r\n }\r\n\r\n private async getAddresses(): Promise
{\r\n if (this.props.context.request.user.isAuthenticated) {\r\n const customer = await readAsync({ callerContext: this.props.context.actionContext }, this.props.context.request.user.customerAccountNumber!)\r\n if (customer) {\r\n return customer.Addresses?.find(add => add.IsPrimary)\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private async handleCartAddress(): Promise {\r\n const cartState = this.props.data.cart.result;\r\n if (cartState) {\r\n this.setState({ isAddressCheckComplete: true })\r\n const hasAddress = !!cartState.cart.ShippingAddress\r\n // console.log(hasAddress, 'has address')\r\n if (!hasAddress) {\r\n const primaryAddress = await this.getAddresses()\r\n // console.log(primaryAddress, 'primary address')\r\n\r\n if (!!primaryAddress) {\r\n void await cartState.updateShippingAddress({ newShippingAddress: primaryAddress });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private getExtensionPropertyValueByKey = (\r\n properties: CommerceProperty[] | undefined,\r\n key: string,\r\n valueType: CommercePropertyValueEnum\r\n ) => {\r\n const property = properties?.find(p => p.Key === key)?.Value;\r\n\r\n // eslint-disable-next-line security/detect-object-injection\r\n const val = property ? property[valueType] : null;\r\n return val;\r\n };\r\n\r\n\r\n /**\r\n * Render Cart Item count.\r\n * @returns JSX Element.\r\n */\r\n public render(): JSX.Element | null {\r\n this._removeCommentFromCartLine();\r\n const cart = this.props.data.cart.result ?? undefined;\r\n\r\n\r\n let iProductsPresent = this.getExtensionPropertyValueByKey(cart?.cart?.ExtensionProperties, \"not-eligible\", CommercePropertyValueEnum.string);\r\n // console.log(iProductsPresent)\r\n // console.log(this.state.iProductsPresentVersion, !!this.state.iProductsPresentVersion)\r\n if (!this.isErrAutoDisplayTriggered && typeof iProductsPresent === \"string\" && iProductsPresent !== \"[]\") {\r\n\r\n this.setState({ isErrModalOpen: true, iProductsPresentVersion: cart?.cart.Version || 0 })\r\n this.isErrAutoDisplayTriggered = true;\r\n }\r\n else if (!this.state.isErrModalOpen && cart?.cart.Version !== this.state.iProductsPresentVersion) {\r\n this.isErrAutoDisplayTriggered = false;\r\n\r\n }\r\n\r\n if (this.state.isErrModalOpen) {\r\n this.isAutoDisplayTriggered = true;\r\n }\r\n\r\n let ippContent;\r\n\r\n if (!!iProductsPresent) {\r\n try {\r\n ippContent =\r\n <>\r\n

{this.props.resources.ineligibleProductsText}

\r\n {(JSON.parse(iProductsPresent as string) as CartLine[]).map(r =>
  • {r.Barcode}: {r.Description}
  • )}\r\n ;\r\n } catch (err) {\r\n\r\n }\r\n }\r\n\r\n if (cart && !this.state.isAddressCheckComplete) {\r\n this.handleCartAddress();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\r\n const shouldShowMiniCart = cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\r\n\r\n if (shouldShowMiniCart) {\r\n if (!this.isAutoDisplayTriggered) {\r\n // First time trigger auto mini cart.\r\n this.setState({ isModalOpen: true });\r\n this.isAutoDisplayTriggered = true;\r\n }\r\n else if (!this.state.isModalOpen) {\r\n // If modal is closed, reset the flag.\r\n this.isAutoDisplayTriggered = false;\r\n }\r\n }\r\n return (\r\n \r\n \r\n {this.props.cartIcon}\r\n \r\n \r\n {ippContent && ippContent}\r\n \r\n \r\n \r\n {this.props.flyoutTitle}\r\n {this._renderCartItemCount(this.props)}\r\n {this._renderCartCloseIcon()}\r\n \r\n \r\n {this.props.slots.allowableFreight}\r\n {this.props.data.cart.result?.isEmpty ? this.props.slots.emptyCart : null}\r\n \r\n {renderCartlines(this.props.cartlines, this.props)}\r\n \r\n \r\n \r\n {this.props.slots.promoContentItem}\r\n {renderTotalPrice(this.props)}\r\n

    \r\n {this.props.resources.subTotalMessage}\r\n

    \r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.checkoutAsGuestButton}\r\n {this.props.data.cart.result?.isEmpty ? null : this.props.goToCartButton}\r\n \r\n {\r\n this.props.data.cart.result?.isEmpty ? \r\n {this.props.resources.continueShoppingButtonTitle}\r\n : null\r\n }\r\n \r\n
    \r\n \r\n \r\n );\r\n }\r\n\r\n /**\r\n * Initiate modal container.\r\n * @returns Inode props.\r\n */\r\n private readonly _modalContainer = (): INodeProps => {\r\n return {\r\n tag: Modal,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__minicartmodal-container',\r\n wrapClassName: 'ms-cart-icon__minicartmodal',\r\n isOpen: this.state.isModalOpen,\r\n toggle: this.closeModal\r\n };\r\n };\r\n\r\n /**\r\n * Initiate open modal.\r\n */\r\n private readonly _openModal = (): void => {\r\n const payLoad = getPayloadObject('click', this.props.telemetryContent!, 'cart-icon', '');\r\n onTelemetryClick(this.props.telemetryContent!, payLoad, 'cart-icon');\r\n this.setState({\r\n isModalOpen: true\r\n });\r\n };\r\n\r\n\r\n private readonly _modalErrContainer = (): INodeProps => {\r\n return {\r\n tag: Modal,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__minicarterrmodal-container',\r\n wrapClassName: 'ms-cart-icon__minicarterrmodal',\r\n isOpen: this.state.isErrModalOpen,\r\n toggle: this.closeErrModal\r\n };\r\n };\r\n\r\n private readonly closeErrModal = (): void => {\r\n this.setState({\r\n isErrModalOpen: false\r\n });\r\n\r\n this.isAutoDisplayTriggered = true;\r\n\r\n };\r\n\r\n /**\r\n * Initiate close modal.\r\n */\r\n private readonly closeModal = (): void => {\r\n this.setState({\r\n isModalOpen: false\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Initiate cart close Icon.\r\n * @returns JSX Element.\r\n */\r\n private readonly _renderCartCloseIcon = (): JSX.Element | null => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Render Cart Item count.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\n private readonly _renderCartItemCount = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\r\n let cartItemCount;\r\n const defaultCartItemCount: number = 0;\r\n const defaultCartItemCountOne: number = 1;\r\n\r\n if (ArrayExtensions.hasElements(props.cartlines)) {\r\n if (props.cartlines.length === defaultCartItemCountOne) {\r\n cartItemCount = `${defaultCartItemCountOne} ${props.resources.item}`;\r\n } else {\r\n cartItemCount = `${props.cartlines.length} ${props.resources.items}`;\r\n }\r\n } else {\r\n cartItemCount = `${defaultCartItemCount} ${props.resources.items}`;\r\n }\r\n return (\r\n \r\n {cartItemCount}\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Handle escape click to close modal.\r\n * @param event - On press of any key.\r\n */\r\n private readonly _escFunction = (event: KeyboardEvent) => {\r\n if (event.keyCode === KeyCodes.Escape && this.state.isModalOpen) {\r\n this.closeModal();\r\n }\r\n };\r\n\r\n}\r\n\r\nexport default CartIconView;\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 * 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 { AddToCartBehavior } from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync, IDictionary, TelemetryEvent } from '@msdyn365-commerce/core';\r\n// @ts-ignore\r\nimport { ICartIconViewProps, ICartViewProps, IFlyoutCartLineItemViewProps } from '@msdyn365-commerce-modules/cart';\r\nimport { LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, INodeProps, KeyCodes, Modal, Node, onTelemetryClick,getTelemetryAttributes, getTelemetryObject, \r\n ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\n\r\nimport { ICartIconProps as ICartIconExtensionProps } from '../definition-extensions/cart-icon.ext.props.autogenerated';\r\n\r\n/**\r\n * ICartIconViewState: Interface for Cart Icon View State.\r\n */\r\ninterface ICartIconViewState {\r\n isModalOpen: boolean;\r\n isCartValid: boolean;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n}\r\n\r\n/**\r\n * Render Cart lines.\r\n * @param cartLines - Flyout cart line view props.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\nconst renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\r\n if (!cartLines) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n return cartLines.map((cartLine, index) => {\r\n const cartLineIndex = index;\r\n return (\r\n <Node {...props.miniCartItemWrapper} key={cartLineIndex}>\r\n <Node className={classnames(cartLine.storeLocation ? 'msc-cart-line__set-net-price' : '')} >\r\n {cartLine.cartline}\r\n </Node>\r\n {cartLine.remove}\r\n {cartLine.storeLocation}\r\n </Node>\r\n );\r\n });\r\n};\r\n\r\n/**\r\n * Initiate total price.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\nconst renderTotalPrice = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\r\n const cart = props.data.cart.result ?? undefined;\r\n const price = cart && !cart.hasInvoiceLine && (cart.cart.TotalAmount || undefined);\r\n const totalPrice = price ? props.context.cultureFormatter.formatCurrency(price) : props.context.cultureFormatter.formatCurrency(props.resources.emptyPrice);\r\n return (\r\n <div className='ms-cart-icon__subTotalText'>\r\n <span className='ms-cart-icon__subTotalPriceText'>\r\n {props.resources.totalPriceFormatString?.replace('{price}' , '')}\r\n <span className='ms-cart-icon__subTotalPrice'>\r\n {totalPrice}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n *\r\n * CartIconView component.\r\n * @extends {React.PureComponent<ICartIconViewProps>}\r\n */\r\nexport class CartIconView extends React.PureComponent<ICartViewProps & ICartIconViewProps & ICartIconExtensionProps<{}>, ICartIconViewState> {\r\n\r\n private isAutoDisplayTriggered: boolean;\r\n private readonly checkoutByGuestAttributes: IDictionary<string> | undefined;\r\n private lastValidatedCartVersion: number | undefined;\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n public constructor(props: ICartViewProps & ICartIconViewState & ICartIconViewProps & ICartIconExtensionProps<{}>) {\r\n super(props);\r\n this.isAutoDisplayTriggered = false;\r\n this.state = {\r\n isModalOpen: false,\r\n isCartValid: true,\r\n isQuantityLimitsFeatureEnabled: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\r\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('keydown', this._escFunction, false);\r\n }\r\n this._validateCart();\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n this._validateCart();\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.removeEventListener('keydown', this._escFunction, false);\r\n }\r\n }\r\n\r\n private _removeCommentFromCartLine(): void {\r\n const cartState = this.props.data.cart.result || undefined;\r\n\r\n if (cartState) {\r\n if ((!cartState.cart.CartLines || cartState.cart.CartLines?.length === 0) && cartState.cart.Comment) {\r\n const _clonedCart = { ...cartState.cart };\r\n _clonedCart.Comment = \"\";\r\n\r\n void cartState.updateCart({newCartObject: _clonedCart});\r\n }\r\n }\r\n }\r\n\r\n private _renderGuestCheckout(hasError: boolean,guestCheckoutUrl: string) {\r\n return(\r\n <Button\r\n disabled={hasError} className='ms-cart-icon__btn-checkout' href={guestCheckoutUrl}\r\n title={this.props.resources.guestCheckoutButtonTitle} {...this.checkoutByGuestAttributes}>\r\n {this.props.resources.guestCheckoutButtonTitle}\r\n </Button>\r\n );\r\n }\r\n\r\n private _validateCart(): void {\r\n const {\r\n data: { cart }\r\n } = this.props;\r\n const cartVersion = cart.result?.cart?.Version ?? undefined;\r\n if (this.lastValidatedCartVersion === cartVersion) {\r\n return;\r\n }\r\n\r\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\r\n validateCartAsync(this.state.isQuantityLimitsFeatureEnabled, cart, this.props.telemetry, this.props.context)\r\n .then((result: LineDataValidationFailure[] | undefined) => {\r\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result) });\r\n })\r\n .catch(() => {\r\n this.setState({ isCartValid: false });\r\n });\r\n }\r\n\r\n /**\r\n * Render Cart Item count.\r\n * @returns JSX Element.\r\n */\r\n public render(): JSX.Element | null {\r\n this._removeCommentFromCartLine();\r\n const cart = this.props.data.cart.result ?? undefined;\r\n const cartlines = this.props.cartlines;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\r\n const shouldShowMiniCart = cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const hasError = !this.state.isCartValid || (cartlines ? cartlines.some(cartline => cartline.hasError) : false);\r\n if (shouldShowMiniCart) {\r\n if (!this.isAutoDisplayTriggered) {\r\n // First time trigger auto mini cart.\r\n this.setState({ isModalOpen: true });\r\n this.isAutoDisplayTriggered = true;\r\n } else if (!this.state.isModalOpen) {\r\n // If modal is closed, reset the flag.\r\n this.isAutoDisplayTriggered = false;\r\n }\r\n }\r\n return (\r\n <Node{...this.props.miniCartWrapper} {...this.props.renderModuleAttributes(this.props)}>\r\n <button\r\n onClick={this._openModal} className='ms-cart-icon-wrapper msc-btn'>\r\n {this.props.cartIcon}\r\n </button>\r\n <Node{...this._modalContainer()}>\r\n <Node className='ms-cart-icon__header msc-modal__header'>\r\n {this.props.flyoutTitle}\r\n {this._renderCartItemCount(this.props)}\r\n {this._renderCartCloseIcon()}\r\n </Node>\r\n <Node className='ms-cart-icon__body msc-modal__body'>\r\n {this.props.data.cart.result?.isEmpty ? this.props.slots.emptyCart : null}\r\n <Node {...this.props.CartlinesWrapper}>\r\n {renderCartlines(cartlines, this.props)}\r\n </Node>\r\n </Node>\r\n <Node className='ms-cart-icon__footer msc-modal__footer'>\r\n {this.props.slots.promoContentItem}\r\n {renderTotalPrice(this.props)}\r\n <p className='ms-cart-icon__subtotal-message'>\r\n {this.props.resources.subTotalMessage}\r\n </p>\r\n {/* {this.props.checkoutAsSignInUserButton} */}\r\n {/* {this.props.checkoutAsGuestButton} */}\r\n {cartlines && cartlines.length > 0 ? this._renderGuestCheckout(hasError, guestCheckoutUrl) : null}\r\n \r\n {this.props.data.cart.result?.isEmpty ? null : this.props.goToCartButton}\r\n <Node className='ms-cart-icon__btn-section'>\r\n {\r\n this.props.data.cart.result?.isEmpty ? <Button\r\n className='ms-cart-icon__btn-backtoshopping'\r\n href={getUrlSync('home', this.props.context.actionContext)}\r\n >\r\n {this.props.resources.continueShoppingButtonTitle}\r\n </Button> : null\r\n }\r\n </Node>\r\n </Node>\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n\r\n /**\r\n * Initiate modal container.\r\n * @returns Inode props.\r\n */\r\n private readonly _modalContainer = (): INodeProps => {\r\n return {\r\n tag: Modal,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__minicartmodal-container',\r\n wrapClassName: 'ms-cart-icon__minicartmodal',\r\n isOpen: this.state.isModalOpen,\r\n toggle: this.closeModal\r\n };\r\n };\r\n\r\n /**\r\n * Initiate open modal.\r\n */\r\n private readonly _openModal = (): void => {\r\n const payLoad = getPayloadObject('click', this.props.telemetryContent!, 'cart-icon', '');\r\n onTelemetryClick(this.props.telemetryContent!, payLoad, 'cart-icon');\r\n this.setState({\r\n isModalOpen: true\r\n });\r\n };\r\n\r\n /**\r\n * Initiate close modal.\r\n */\r\n private readonly closeModal = (): void => {\r\n this.setState({\r\n isModalOpen: false\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Initiate cart close Icon.\r\n * @returns JSX Element.\r\n */\r\n private readonly _renderCartCloseIcon = (): JSX.Element | null => {\r\n return (\r\n <Button\r\n className='ms-cart-icon__btn-close'\r\n aria-label='Close' onClick={this.closeModal} />\r\n );\r\n };\r\n\r\n /**\r\n * Render Cart Item count.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\n private readonly _renderCartItemCount = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\r\n let cartItemCount;\r\n const defaultCartItemCount: number = 0;\r\n const defaultCartItemCountOne: number = 1;\r\n\r\n if (ArrayExtensions.hasElements(props.cartlines)) {\r\n if (props.cartlines.length === defaultCartItemCountOne) {\r\n cartItemCount = `${defaultCartItemCountOne} ${props.resources.item}`;\r\n } else {\r\n cartItemCount = `${props.cartlines.length} ${props.resources.items}`;\r\n }\r\n } else {\r\n cartItemCount = `${defaultCartItemCount} ${props.resources.items}`;\r\n }\r\n return (\r\n <Node className='ms-cart-icon__count' tabIndex='0'>\r\n {cartItemCount}\r\n </Node>\r\n );\r\n };\r\n\r\n /**\r\n * Handle escape click to close modal.\r\n * @param event - On press of any key.\r\n */\r\n private readonly _escFunction = (event: KeyboardEvent) => {\r\n if (event.keyCode === KeyCodes.Escape && this.state.isModalOpen) {\r\n this.closeModal();\r\n }\r\n };\r\n\r\n}\r\n\r\nexport default CartIconView;\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 { 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 { 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":""}