{"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/cart-icon/cart-icon.view.tsx?2929","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/themes/henrys/views/components/price.component.tsx?a8fb","webpack:///./src/modules/cart/components/cart-pick-up-in-store.tsx?44c1","webpack:///./src/modules/cart/components/cart-line-items.tsx?6c90","webpack:///./src/modules/cart/components/cart-line-groups.tsx?5661","webpack:///./src/modules/cart/utils/get-promotion-in-cart.ts?40f7","webpack:///./src/modules/cart/cart.tsx?012c","webpack:///./src/modules/cart/components/cart-line-items-promotion.tsx?4f67","webpack:///src/modules/fabrikam/views/components/promocode.component.tsx?7eef","webpack:///src/Common/get-product.ts?5f1d","webpack:///src/modules/header/header.view.tsx?40e5","webpack:///src/actions/inputs/submit-user-review-input.ts?921c","webpack:///src/modules/social-share-item/social-share-item.tsx?e01b","webpack:///./src/modules/cart/cart.view.tsx?5cc1","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/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/modules/reviews-list/components/review-card.tsx?2d16","webpack:///src/modules/reviews-list/components/components.tsx?c96f","webpack:///src/modules/cart-icon/components/flyout-cart-line-items.tsx?a0df","webpack:///src/modules/header/components/header-preferred-store.tsx?9138","webpack:///src/modules/header/components/logo.tsx?be23","webpack:///src/modules/header/components/nav-icon.tsx?49a1","webpack:///src/modules/header/header.tsx?4703","webpack:///src/modules/order-template/order-template.tsx?4281","webpack:///./src/themes/henrys/views/components/ProductStockStatus.tsx?8e2c","webpack:///./src/themes/henrys/views/components/product.component.tsx?2973","webpack:///./src/themes/henrys/views/cart.view.tsx?3783","webpack:///src/modules/search-result-container/components/utilities.ts?41e3","webpack:///src/modules/quick-order/quick-order.view.tsx?2242","webpack:///src/modules/cart/components/cart-line-items-promotion.tsx?6882","webpack:///src/modules/ratings-histogram/ratings-histogram.tsx?4c32","webpack:///./src/themes/henrys/utilities/productListExtensionHelpers.ts?949a","webpack:///src/modules/cart/components/cart-line-items.tsx?a1e3","webpack:///src/modules/reviews-list/reviews-list.tsx?b5d0","webpack:///src/modules/search-result-container/search-result-container.tsx?97e0","webpack:///./src/modules/bazzarvoice-widget/components/Bazzarvoice.tsx?5bb4","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/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/product-collection/product-collection.view.tsx?9eb3","webpack:///src/search-state.ts?b5d7","webpack:///src/actions/inputs/submit-helpfulness-vote-input.ts?cfb5","webpack:///src/modules/carousel/carousel.view.tsx?b19a","webpack:///./src/modules/bazzarvoice-widget/bazzarvoice-widget.props.autogenerated.ts?f6be","webpack:///src/modules/active-image/active-image.view.tsx?b3e2","webpack:///src/actions/report-review-concern.ts?11eb","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/cart-icon/cart-icon.props.autogenerated.ts?07d0","webpack:///./src/modules/cart-icon/components/flyout-cart-line-items.tsx?66aa","webpack:///./src/modules/cart-icon/utils/get-products-in-mini-cart.ts?ccc8","webpack:///./src/modules/cart-icon/cart-icon.tsx?576d","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/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/spinner.tsx?28dd","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/common/review-modal.tsx?7ef9","webpack:///src/modules/search-result-container/components/product-search-result-items.tsx?1766","webpack:///./src/modules/cart-icon/components/cart-icon.component.tsx?f681","webpack:///src/modules/search-result-container/components/choice-summary.tsx?f4a7","webpack:///src/modules/search/search.view.tsx?e62d","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/modules/cart/components/cart-pick-up-in-store.tsx?f7bf","webpack:///src/modules/write-review/components/components.tsx?ead4","webpack:///src/modules/write-review/write-review.tsx?dea3","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/social-share-item/social-share-item.view.tsx?ce9b","webpack:///src/modules/ratings-histogram/component/components.tsx?2a0b","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/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/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/ratings-histogram/index.ts?834d","webpack:///./src/themes/henrys/utilities/localisation/translationUtilities.ts?5234","webpack:///src/modules/search-result-container/components/modal.tsx?afdd","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/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/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/write-review/write-review.view.tsx?9069"],"names":["CheckoutDeliveryOptionsDescription","description","React","className","CheckoutDeliveryOptionsErrorMessage","message","CheckoutDeliveryOptionsErrorTitle","title","CheckoutDeliveryOptionsRadioButton","isChecked","value","ariaSetSize","ariaPosInSet","ariaLabel","telemetryContent","onChange","payLoad","getPayloadObject","TelemetryConstant","DeliveryOptions","attributes","getTelemetryAttributes","checked","type","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","data","checkout","result","checkoutCart","hasInvoiceLine","getCartLinesForShipping","length","isDeliveryModeExists","deliveryMode","find","deliveryOption","Code","getDeliveryOptionSelected","selectedItem","context","telemetry","error","id","typeName","priceFree","resources","price","get","DeliveryOption","DescriptionComponent","Object","Description","PriceComponent","CustomerContextualPrice","freePriceText","getErrorMessage","errorMessageTitle","CheckoutDeliveryOptionsError","tag","role","ErrorTitleComponent","ErrorMessageComponent","errorMessage","getDeliveryOptionList","count","map","index","code","radioButton","RadioButtonComponent","onDeliveryOptionChange","getSaveButton","saveBtnLabel","Button","color","disabled","onClick","onSave","getEditButton","editBtnLabel","getCancelButton","cancelBtnLabel","setError","setHasError","onUpdating","clearError","shouldEnableSinglePaymentAuthorizationCheckout","updateShouldCollapsePaymentSection","newShouldCollapsePaymentSection","updateCartDeliverySpecification","savedDeliveryOption","onReady","cartLinesForShipping","DeliveryMode","deliveryModeId","trim","checkoutState","updateCartDeliverySpecificationInput","shippingAddress","channelDeliveryOptionConfig","onPending","then","response","genericErrorMessage","setIsCancellable","catch","request","pickupDeliveryModeCode","channel","PickupDeliveryModeCode","emailDeliveryModeCode","EmailDeliveryModeCode","cart","CartLines","filter","cartLine","PickupDeliveryModeCodes","getDeliveryOptions","cartState","cartId","Id","originalDeliveryMode","shippingCartLines","hasShippingDeliveryLines","clearCartLinesDeliveryInformation","channelDeliveryOptionConfiguration","deliveryOptionFilter","filterDeliveryModeOption","FilterDeliveryModeOption","None","FilterOutNonCarrierDeliveryMode","getDeliveryOptionsAsync","callerContext","actionContext","queryResultSettings","deliveryOptionsNotFound","isPaymentVerificationRedirection","isExpressCheckoutApplied","event","currentTarget","getTelemetryObject","telemetryPageName","friendlyName","requestFormData","query","pv","when","isDataReady","reaction","shouldComponentUpdate","nextProps","nextState","state","render","isReady","isUpdating","hasError","isError","isShowList","isShowSelected","featureState","feature","Name","IsEnabled","deliveryOptionAriaLabel","viewProps","deliveryOptionsData","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","CartIconView","Node","miniCartWrapper","renderModuleAttributes","cartIcon","FlyoutContainer","flyoutTitle","CartlinesWrapper","cartLines","miniCartItemWrapper","key","cartline","storeLocation","remove","_renderCartlines","cartlines","totalPrice","checkoutAsSignInUserButton","checkoutAsGuestButton","goToCartButton","QuickOrderDrawer","_toggle","bind","isManuallyToggled","isOpen","collapseProps","drawerGlyphClass","classnames","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","children","drawerClass","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","Collapse","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","location","glyphClass","e","preventDefault","setState","onToggle","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxChars","maxQuantity","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","handleQuantityChange","handleInputChange","handleAddToCartClick","onInputChange","target","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","ref","quantityNode","pattern","maxLength","quantity","product","addToCartBtn","userMessage","stateMessage","Alert","statusCssString","messageGlyph","messageText","QuickOrderProduct","simpleProduct","isSelected","QuickOrderDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","rowClassName","headerCells","isMobile","defaultImageSettings","viewports","xs","q","w","h","lg","lazyload","cropFocalRegion","QuickOrderTableRowProductImageComponent","fallbackImageUrl","getFallbackImageUrl","ItemId","requestContext","apiSettings","containerClassName","Image","altText","src","PrimaryImageUrl","fallBackSrc","gridSettings","imageSettings","loadFailureBehavior","QuickOrderExtraActionsPopupComponent","productUrl","StringExtensions","isNullOrWhitespace","ObjectExtensions","isNullOrUndefined","RecordId","getProductPageUrlSync","QuickOrderDesktopTableRowCellComponent","href","Dimensions","dimension","DimensionValue","Value","dimensionValue","join","quickOrderProductDimensionsSeparator","Price","UnitOfMeasureSymbol","IncrementalQuantity","LineId","max","currentCount","Quantity","inputQuantityAriaLabel","quickOrderInputQuantityAriaLabel","decrementButtonAriaLabel","quickOrderDecrementButtonAriaLabel","incrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","isGiftCard","IsGiftCard","TotalAmount","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","format","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","useState","isMobileView","quickOrderProducts","updateViewport","MsDyn365","isBrowser","window","addEventListener","headerClassName","quickOrderProduct","QuickOrder","waitTime","dimensionUpdateQueue","FinitePromiseQueue","dimensions","cssClassNameConfigure","quickOrderCallbacks","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","productText","productResponse","productDimensions","cancellabelDebounce","cancel","isQuickOrderFormExpanded","getScanResult","GetScanResultInput","channelId","results","Product","ProductDimensionFull","setTimeout","_addItemToCart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","isOrderQuantityLimitsFeatureEnabledInHq","defaultOrderQuantityLimitsFeatureConfig","app","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","defaultDeliveryOption","ArrayExtensions","hasElements","isOrderQuantityLimitsFeatureEnabled","productAvailableQuantity","_updateAvailablity","addProductToCartInput","enableStockCheck","availableQuantity","ProductAvailableQuantity","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","addProductToCart","substatus","maxQtyLimitReachedMessage","_getMaxQtyMessage","errorDetails","LocalizedMessage","warning","_handleQuantityChange","currentValue","Number","parseInt","inputElement","quantityInput","current","HTMLInputElement","isNaN","setAttribute","toString","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeSize","productDimensionTypeAmount","productDimensionTypeStyle","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","keys","configureErrors","errorState","mappedDimensions","DimensionTypeValue","ExtensionProperties","selectedProduct","Promise","resolve","reject","newProduct","getSelectedVariant","SelectedVariantInput","MasterProductId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","productAvailable","ProductId","_getDimensionErrorString","dimensionTypeValue","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","missingDimensions","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","viewport","device","Type","products","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","productConfigureResources","selectDimensionFormatString","quickOrderProps","contentProps","isB2B","drawer","quickOrderForm","quickOrderList","_renderQuickOrderTable","form","configure","getProductConfigure","_initQuickOrderProducts","validValues","tableClassName","productInventoryInfo","currentQuantity","quickOrderMaxQuantityLimitText","maxQuantityForLineItem","maxQuantityForCartLineItem","replace","minInventory","Math","min","showStrikethroughPricing","originalPrice","getOriginalPrice","TradeAgreementPrice","BasePrice","renderCurrentPrice","initialPrice","formatCurrency","itemProp","cultureFormatter","renderCurrentPriceWithOriginalPrice","discountAmount","DiscountAmount","discountPrice","saveAmtFmt","translate","originalPriceText","currentPriceText","msdyn365Commerce","createComponentOverride","component","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","storeSelectorModuleId","openDialog","alreadySelectedLocation","OrgUnitNumber","FulfillmentStoreId","onLocationSelected","orgUnitLocation","updateCartLinePickupLocation","cartLineId","locationChangedHandler","_onLocationChangedCallback","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","orgUnitLocations","foundLocation","OrgUnitName","option","callbacks","toggleBopis","defaultComponent","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","toggleBOPIS","_renderShippingMethod","shipitText","pickUpInStoreText","pickupStore","delivery","_getDeliveryOption","ContainerProps","assembleCartlines","reactNodes","foundProductAvailability","foundProductDeliveryOption","isQuantityLimitsFeatureEnabled","getProductByProductIdAndWarehouse","WarehouseId","getProductByProductId","productAvailabilites","productAvailability","shouldIgnoreWarehouse","InventLocationId","productDeliveryOptions","push","foundProductDeliveryOptions","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","wishlists","defaultWishlistName","isAuthenticated","user","nameOfWishlist","availableQuantityInStock","isStockCheckEnabled","IsProductAvailable","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","_getCartItemMaxQuantity","maxCartlineQuantity","Behavior","MaximumQuantity","isServiceItem","ItemTypeValue","ReleasedProductType","Service","lineIndex","finalErrorMessages","includeErrors","outOfStockText","outOfRangeOneText","outOfRangeFormatText","cartlinesErrors","i","LineIndex","forEach","DataValidationFailure","ErrorContext","_getErrorMessage","onRemoveClickHandler","onRemoveClickFunction","payload","TelemetryEvent","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","toLowerCase","isCustomPriceSelected","isQuantityEditable","HasSerialNumber","ItemServiceTypeValue","gtmJson","productInfo","gtmProduct","ExtendedPrice","JSON","stringify","cartlineId","CartLineItemComponent","isOutOfStock","getProductUrlSync","getInvoiceDetailsPageUrlSync","quantityOnChange","updateCartLinesQuantitySuccessHandler","primaryImageUrl","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","showShippingChargesForLineItems","pickUpInStore","pickitUpText","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","_assembleNode","CartLineGroupItems","getGroupByStorePickup","items","groupBy","item","groupDelivery","cartLinesGroup","entries","deliveryType","groupByDeliveryType","carLineViewProps","_assembleGroupCartlines","getPromotionData","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","promotionOptions","Cart","Component","showPromotionDialog","isCartValid","_isMounted","promotionPopupId","promotionLinkClick","promotionCloseButtonclick","_hidePromotionDialog","_getImageSettings","sm","_removeItemFromCartHandler","cartlineToRemove","cartLineIds","removeCartLines","_moveToWishlistSuccessHandler","_updateCartlineQuantity","cartlineToUpdate","cartLineQuantityUpdatedAsync","cartActionResult","defaultIndex","lineUpdateFailure","validationResults","previousState","currentErrors","_fulfillmentStoreIdUpdated","getActiveCartProductsAction","ActiveCartProductsInput","_getOrderQuantityLimitsFeatureFlag","showAvailablePromotions","componentWillUnmount","signInUrl","_ensureProductListUpdateToDate","guestCheckoutUrl","getUrlSync","backToShoppingUrl","checkoutURL","_getCheckoutURL","isCartEmpty","_getCartLines","some","RetailMultiplePickupFeatureState","multiplePickUpEnabled","_getCartLinesGroup","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartTitle","OrderSummaryWrapper","OrderSummaryItems","promoCode","_getPromoCode","_getPromotions","removePromoAriaLabelFormat","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutButtonTitle","guestCheckoutButtonTitle","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","_generateOrderTemplateNameDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","storeSelector","slots","waitingComponent","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","RetailB2BEcommerceFeatureState","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","promotionStringHeading","promotionSeeAllLink","tabIndex","promotionDialog","Modal","toggle","ModalHeader","ModalBody","_promotion","Promotion","OfferName","ModalFooter","cartPromotions","promotionCloseButtonAriaLabel","allErrors","fullError","line","Wrapper","assertive","outOfStockErrorMessageHeader","header","errors","InvoiceSummary","orderTotalLabel","totalAmountLabel","invoiceLabel","channelConfiguration","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","otherChargeLabel","otherCharges","taxLabel","estimatedTaxLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","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","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","modules","storeSelectorId","CartLineItems","warehouseAggregation","sizeString","colorString","configString","styleString","amountString","quantityDisplayString","quantityDisplayText","discountStringText","shippingChargesText","shippingCharges","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","outOfStockErrorMessage","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","RegExp","test","returnURL","origin","includes","validateCartAsync","isValid","AsyncResult","featureStatuses","PromoCode","_onInputChangeHandler","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","_onSubmitHandler","_applyPromotionHandler","_renderForm","placeholder","_removePromotion","getAttribute","removePromoCodes","promoCodes","_calculateDiscount","DiscountLines","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","removePromotionHandler","promoCodTotalDiscount","reduce","coupon","ApplyPromoCode","isCollapseOpen","productId","warehouseId","targetWarehouseValue","InventoryLocationId","_renderReactFragment","slot","headerView","HeaderTag","HeaderContainer","HeaderTopBarContainer","MobileMenuContainer","MobileMenuBodyContainer","MobileMenuLinksContainer","Divider","Module","navIcon","logo","search","preferredStore","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","accountInfoDropdownButton","signOutLink","signInLink","accountLinks","link","_renderDesktopAccountBlock","wishListIconDesktop","siteOptions","MobileMenuHeader","menuBar","wishListIconMobile","SubmitUserReviewInput","userReviewData","authorization","getCacheKey","getCacheObjectType","dataCacheType","SocialShareItem","_getSocialShareItem","viewprops","SocialShareItemElement","icon","socialMedia","SocialMediaComponent","SocialMedia","Facebook","postUrl","document","URL","Twitter","Pinterest","Linkedin","Mail","cartEmptyText","renderCartLinesGroupHeader","pickUpText","shippingText","emailShippingText","titleSeparate","groupTitle","renderCartLinesGroupTitle","CartView","errorData","emailshippingText","emptyCartText","renderCartLinesGroup","invoiceSummaryLines","invoices","giftCard","loyalty","_renderInvoiceSummarylines","orderSummaryLines","subtotal","shipping","otherCharge","tax","totalDiscounts","_renderOrderSummarylines","OrderTemplateActions","onRemoveOrderTemplate","handlers","itemKey","removeOrderTemplateActionHandler","OrderTemplateRender","orderTemplate","removeFromOrderTemplateListText","orderTemplateState","enableImageProductLink","onDismiss","orderTemplateImage","_renderOrderTemplateImages","orderTemplateLines","orderTemplateAriaLabel","_renderAriaLabel","orderTemplateName","url","separator","_getOrderTemplatePageUrl","totalLines","addToCartButton","AddOrderTemplateToCartComponent","moduleTypeName","addToCartText","addToBagText","dialogStrings","removeButton","orderTemplateStatusMessage","onClickHandler","assign","xl","slice","fullProduct","ProductDetails","alt","OrderTemplateListStatusMessage","errorType","text","getAdditionalContentItems","heading","additionalContentHeading","Msdyn365","editProps","handleAdditionalTextChange","renderHeading","subtext","additionalContentParagraphText","handleAdditionalParagraphChange","renderParagraph","links","ctaLink","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","onTextChange","handleAdditionalLinkTextChange","renderLinks","additionalContentItemContainer","additionalContentItemLinks","videoPlayerAdditionalContent","additionalContent","additionalContentNode","additionalContentItems","VideoPlayer","handleTextChange","handleParagraphChange","paragraph","options","video","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","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","linkData","linkId","Title","BulkPurchaseViewComponent","container","content","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","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","RatingComponent","readOnly","avgRating","reviewRatingNarratorText","parentId","parentType","isVoted","votedReviews","approved","isVotedFor","isDisabled","label","yesButtonText","noButtonText","voteCount","helpfulPositive","helpfulNegative","updateReviewHelpfulness","toggleWriteReviewModal","editReviewCardText","Intl","DateTimeFormat","month","day","year","Date","toggleReportReviewModal","reportConcernText","reportedReviews","reportedText","reportedReviewId","returnRef","innerRef","ReviewCount","currentPage","reviewsCount","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","_renderStoreLocation","_assembleCartlines","outOfStockThreshold","RemoveCartItem","removeCartItemAttribute","displayMode","FlyoutCartLineItems","HeaderPreferredStore","modalCloseButtonRef","handleClick","_findPreferredStoreOnClick","storeName","StoreName","headerPreferredStoreText","headerPreferredStoreAriaLabel","showMapViewLink","parentElementRef","Logo","_renderLogo","_renderImage","image","moduleType","imagePropertyName","shouldSkipToMainImage","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","isExpanded","targetId","Header","myAccountLinks","popOverRef","_toggleNavbar","_togglePopover","_keydown","mobileMenuCollapsed","signinPopoverOpen","hasSigninerror","customer","accountInformation","FirstName","componentDidMount","signUpCustomerNotFoundTitle","signUpMultipleCustomerFoundTitle","closeNotificationLabel","signinNotificationError","_getSigninNotification","NotificationsManager","instance","addNotification","ErrorNotification","removeEventListener","cartLabel","cartQtyLabel","logoLink","logoImage","shouldShowWishlistCount","headerToggleClass","cartIconSlot","_getSlot","menuBarSlot","searchSlot","wishlistCount","siteOptionsSlot","preferredStoreSlot","CommerceListLines","WishListIconComponent","wishlistTooltipText","wishlistCountLabel","isDispayWishlistCount","CartIconComponent","wrapClassName","displayName","Popover","placement","_getSigninButton","_getSignOutButton","_getAccountInfoDropdownButton","_getAccountLinks","slotName","SignIn","signInLinkText","signInLinkAriaText","onTelemetryClick","SignOut","signOutLinkText","signOutUrl","signOutLinkAriaText","signUpCustomerNotFound","signUpMultipleCustomerFound","retailServerErrorCode","MyProfile","cta","keyCode","KeyCodes","Escape","OrderTemplateLines","_onRemoveSelection","removeSelectedFailureMessage","removeSelectedSuccessMessage","lines","productSelection","productListLines","productListLine","productListId","ProductListId","removeProductListLinesAsync","reload","substr","indexOf","productList","_onAddSelectionToBag","addedToCartFailureMessage","addedToCartSuccessMessage","getCartState","selectedLines","productLine","TrackingId","UnitOfMeasure","DefaultUnitOfMeasure","addCartLinesAsync","Version","refreshCart","_getCurrentUrl","reqContext","onCloseHandler","isItemAddedToOrderTemplateOpen","_renderItemAddedToCartDialog","itemAddedToCartDialogData","ItemAddedToCartDialog","_generateItemAddedToCartDialogResources","modalOpen","onClose","_renderPagination","fullUrl","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","isQuantityDisabledForUpdate","updateProductListLinesAsync","newLine","updatedLines","updatedOrderTemplate","ProductListLines","update","ActiveOrderTemplateLinesInput","editOrderTemplateLineQuantityError","_addItemToBag","maxQuantityLimitText","getPriceForSelectedVariant","PriceForSelectedVariantInput","priceResult","isMiniCart","addToCartBehavior","productPrice","maxQuantityForProductListLineItem","_removeItemFromOrderTemplateLines","token","userToken","_renameTemplate","_removeTemplate","deleteAsync","deleteOrderTemplateFailedText","newLink","_getViewport","innerWidth","md","paginationPreviousText","paginationNextText","_viewport","_updateViewport","isConfirmAddSelectionToBagModalOpen","emptyOrderTemplateLinesText","errorGettingOrderTemplateLines","errorProps","statusMessage","OrderTemplateLinesStatusMessage","Heading","orderTemplateResult","_isFirstPage","emptyViewProps","productsStatusMessage","ProductsTable","ProductsTableRow","ProductsTableHeading","_renderProductListHeader","orderLines","_renderProductList","updateQuantity","debounce","orderActions","_renderOrderTemplateActions","pagination","itemAddedToCartDialog","bulkOrderLineActions","_getOrderTemplateLineActions","toggleDetailsDisplayed","onSelect","updated","onSelectAll","productNumberText","productUnitPriceText","productUOMText","productQuantityText","productActionsText","selectAllRowsText","productNumber","productName","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","linesAddedToCartDialogResources","OrderTemplateActionsView","renameOrderTemplateTitleText","renameOrderTemplateButtonText","skip","selectOneRowText","moreButtonText","viewProductDetailsText","addOrderTemplateItemToBagButtonText","removeItemFromOrderTemplateButtonText","deleteButtonText","currentProductProps","orderTemplateLine","ProductPrice","moduleId","onAddToBag","onRemoveItem","onChangeQuantity","removeFromOrderTemplateLinesText","addToBagButtonText","OrderTemplateLineView","ProductStockStatus","availabilityStatus","ProductStockStatusEnum","ONLINE","IN_STORE","OUT_OF_STOCK","renderLabel","ratingAriaLabel","roundedRating","toFixed","getRatingAriaLabel","ProductComponent","savingsText","allowBack","quickViewButton","shouldHidePrice","setShouldHidePrice","srcUrl","baseUrl","pathname","updateProductUrl","attribute","baseImageUrl","productBadgeStatus","getProductBadgeUrl","useEffect","showPriceInCartAttributeArray","findAllAttributes","AttributeValues","attributeValue","findAttributeValue","useMemo","AverageRating","imageUrl","img","imageProps","renderProductPlacementImage","badgeName","mfrAttr","findAttribute","mfrValue","String","fromCharCode","_renderProductSkuMFR","Bazzarvoice","widgetType","inline_rating","renderRating","seePriceInCart","basePrice","adjustedPrice","AdjustedPrice","renderPrice","getProductStockStatus","quickview","cloneElement","selectedProductId","renderQuickView","_renderCustomRemove","cartLinesToRemove","cartlinesToRemove","getPairedCartLine","extensionProperties","prop","ep","Key","strValue","StringValue","linkedItemId","split","linkedCartLine","cl","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","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","select","quickOrderView","quickOrderProductContent","quickOrderMsgContent","renderForm","RatingsHistogram","handleHeadingChange","selectFilterBy","ratingsSummary","ratingCount","totalRatingsCount","completeClass","histogramItems","HistogramItems","averageRating","averageRatingAriaLabel","hideCount","averageNumber","AverageRatingNumber","summary","totalReviews","TotalReviews","ratingsSummaryProps","histogramProps","stars","filterKey","createRatingsReviewsStateInput","attributeName","attr","CurrencyCode","DateTimeOffsetValue","FloatValue","IntegerValue","TextValue","BooleanValue","buildProductBadgeUrl","suffix","badgeAttributeArray","badgeStatus","badgeValue","availableProperty","xt","shouldSkipStockCheck","IsInvoiceLine","ReviewsList","sortByDropdownOptions","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","reviewsList","pagingInfo","listOfReviews","isFilterApplied","ratingsReviewsState","filterKeyValue","dropdownItemsCount","filterByOption","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","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","expandrefinerCount","defaultPageNumber","catalogId","getCatalogId","_getProductsDimensionsAvailabilities","productsList","listPageState","activeProducts","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","_getActivePrice","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","SearchResultModal","modalCloseButtonText","modalTitle","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","category","SearchResultContainer_1","getFriendlyName","NameTranslations","productCountNumber","productCountText","totalProductCount","numberOfProducts","oneProduct","pageName","titlePrefix","searchTextPrefix","titleText","titleCount","TitleContainer","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","Link","categoryLinkAriaLabel","Url","categoryHierarchySeparator","Separator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","dropdwonOptions","hideRating","dropdownOption","SortingContainer","sortByDropDown","labelClassname","sortByDropdownLabel","dropdownClassname","toggleColor","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","currentPageNumber","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","activeRefiners","activeFilters","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","productRefinerHierarchy","RefineSubmenu","selectedRefinerValues","refineItemCommonProps","_refineItemCommonProps","minValueSliderThumbAriaLabel","maxValueSliderThumbAriaLabel","onUpdateRefiners","_onUpdateRefiners","urlBuilder","_buildRefinerUrl","isExpandedOnInitialLoad","productCountAriaLabel","singleProductCountAriaLabel","_getChoiceSummary","selectedRefiners","ChoiceSummary","classNames","clearAllText","choiceSummaryLabel","closeAriaLabel","selectedChoices","refinerHierarchy","choiceFormat","choiceRangeValueFormat","onChoiceClicked","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","choiceAriaLabel","_getProducts","allowBackNavigation","breaCrumbType","breadcrumbType","quickviewslot","isPriceMinMaxFeatureState","ProductSearchResultItems","quickviewSlot","channelInventoryConfigurationId","isPriceMinMaxEnabled","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","sortCriteria","queryColumns","parseQueryParam","activeSortColumn","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","newRefinementCriteria","clearAll","dropdownElementId","dropdownElement","getElementById","focus","selectedChoice","choiceClicked","selectedRefiner","isClearAll","refinerCount","productPrices","pending","placeholderTextMax","minLabel","maxLabel","rangeNameFormat","validationErrorNaN","validationErrorNotNumber","validationErrorRange","validationErrorNotRange","querySorting","sorting","parse","decodeURIComponent","pageSize","hydrateRefinersFromUrl","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","itemId","Recommendation","recommendation","includeAttributes","getCollectionProducts","productResults","enableAffiliationBasedPricing","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","FeatureSearchResultItem","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","ModalToggle","searchResultModal","ErrorMessage","FeatureSearchContainer","similarLookProduct","createElement","OrderSummaryLine","cssLabel","_buildOrderSummarySection","_computedLoyaltyAmount","loyaltyAmount","getDeliveryMode","featureSate","pickupDeliveryMode","dM","SubtotalAmount","TaxAmount","DiscountAmountWithoutTax","OtherChargeAmount","hasDeliveryMethod","hasShippingMethod","freightFee","deliveryModes","ShippingChargeAmount","getDeliveryConfiguration","giftCardAmount","giftCardTotalValue","giftCardExtends","Balance","amount","_computeGiftCardAmount","totalAmountAfterGiftCard","loyaltyLabel","giftcardLabel","getImageSettings","removeItemFromCartHandler","validateCart","updateCartlineQuantity","fulfillmentStoreIdUpdated","getOrderQuantityLimitsFeatureFlag","getCheckoutURL","validInventoryAcrossCartLines","validateCartLinesInventory","getCartLinesGroup","cartLineGroup","_updateCartLineErrorForInvalidInventory","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","element","priceEditorResources","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","ProductContainer","productComponent","ProductCollectionView","ProductCollectionContainer","SingleSlideCarouselComponentProps","GridComponentProps","isCarousel","SearchState","retrieveItems","CarouselView","Carousel","closeAnimation","activeIndex","previous","pause","pauseOnHover","ride","autoplay","interval","transitionType","hideFlipper","dismissEnabled","onIndicatorsClickHandler","handleDismissCarousel","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","directionTextPrev","directionTextNext","handleOnExited","handleOnExiting","activeImageView","activePointContainer","activePointDetailsContainer","imageMapper","additionalContentContainer","detailsContainerCta","style","top","productCardtopPosition","left","productCardleftPosition","overlay","productCard","reportReviewConcernDataAction","concernCategory","getMiniCartData","miniCartData","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","CartIcon","getSortedCartLines","sortOrder","sort","item1","item2","LineNumber","CheckOut","ViewShoppingBag","viewShoppingBagAttributes","_setOrderQuantityLimitsFeatureFlag","componentDidUpdate","prevProps","enableHoverCart","isAnonymousCheckout","cartUrl","shouldShowMiniCart","isProductAddedToCart","AddToCartBehavior","showMiniCart","includeFlyout","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","flyoutTooltip","UncontrolledTooltip","hideArrow","trigger","shouldShowCloseButton","cartPageUrl","priceString","totalPriceFormatString","cartVersion","lastValidatedCartVersion","cartLinesSortOrder","ProductCollection","validProducts","initProductState","productCollectionProducts","productCollection","equals","_getProduct","reviewCountAriaLabelValue","TotalRatings","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","priceResources","priceRangeSeparator","dimensionAvailabilities","dimensionAvailability","masterProductId","layout","headingLabel","headingComponent","updatedProducts","getProductData","productCollectionViewProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","WrappedComponent","_super","_this","states","getModuleStates","updateModuleStates","_a","hasInitialized","isRequired","isCancellable","isSubmitContainer","childIds","validate","isPending","isSkipped","isCancelAllowed","shouldSubmitContainer","hasModuleState","setIsRequired","setIsSubmitContainer","onSkip","onDisable","getModule","getModuleStateManager","getModuleByTypeName","getModuleStateManagerByTypeName","__assign","moduleStates","values","_moduleState","source","module","isMatch","allMatched","skipSkippableItem","_validateLeaf","childId","_isPaymentSectionContainer","_validateContainer","enableControl","initializeState","__extends","ModuleState","descending","_giftCards","_giftCardExtends","_loyaltyAmount","_guestCheckoutEmail","_isTermsAndConditionAccepted","_customerAccountAmount","CheckoutState","_tokenizedPaymentCard","_tenderLine","_billingAddress","_shippingAddress","_cardPrefix","_loyaltyCardNumber","newTokenizedPaymentCard","newTenderLine","newShippingAddress","newBillingAddress","newCardPrefix","giftCardNumber","__spreadArrays","newLoyaltyCardNumber","newAmount","newGuestCheckoutEmail","newIsTermsAndConditionAccepted","createSearchResultModal","modalProps","isRecoSearchPage","modal","modalHeader","createModalBody","modalFooter","modalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","SearchResultContainerView","VideoPlayerView","RefineItem","_onClick","selectedRefinementCriterion","anchorType","attrs","isSingleSelect","itemTypeClassName","inputType","SourceValue","Rating","_renderRating","LeftValueBoundLocalizedString","KeyName","_getRefinerUrl","_renderSwatch","Count","toLocaleLowerCase","hasColor","SwatchColorHexCode","hasImage","SwatchImageUrl","swatchItems","checkIfShouldDisplayAsSwatch","colorHexCode","SwatchComponent","isSelectionEnabled","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","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","pairs","inputId","htmlFor","CONTENT","msg","AddLineToTemplate","Search","searchTextInput","createRef","addLineButtonRef","_renderSearchForm","searchButtonAriaLabel","searchModalPlaceholderText","autoComplete","_onSearchSubmit","autoFocus","_onInputChange","Loading","_getSearchResults","NotFound","ProductList","_onQuantityChangeHandler","selectedQuantity","_onSelectItem","varianteInput","productVariant","_getProductDimensions","selectedProductDimensions","ProductConfiguration","_onBackButtonClickHandler","_highlightSearchTerm","parsedName","unescape","dangerouslySetInnerHTML","__html","_resultCountText","searchResultsCountVerbage","searchResultsCountSubject","_addItemToTemplateHandler","AddItemToOrderTemplateInput","addItemToOrderTemplate","reloadPage","_toggleModalHandler","onComponentDidMount","onComponentDidUpdate","addLineModalLinkText","backToResultsText","showBackArrow","_renderContent","addToTemplateHandler","onQuantityChangeHandler","highlightSearchTerm","searchForm","productProps","renderResultCountText","Spinner","progressNotificationText","notFoundSearchErrorNotice","notFoundSearchErrorRedediation","NotFoundComponent","searchErrorMessage","searchText","searchCriteriaInput","Context","ChannelId","CatalogId","IncludeAttributes","SearchCondition","searchByCriteriaAsync","Dropdown","selectMenu","_onChanged","selectId","selectedValue","innerText","dropdownList","dropdownName","selected","OrderTemplateQuantity","inputRef","_validateMin","minValue","currentInput","_handleChange","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","incDisabled","extraClass","getChangeHandler","_onIncrementalChange","onBlur","updatedQuantity","selectedDimensions","_getDimensionsError","dimensionName","dimensionMissingError","_addToTemplateHandler","isBusy","showAddConfirmation","add","addToTemplateDuplicateError","addToTemplateGenericError","_onQuantityChange","newValue","_onDimensionChanged","remainingDimensionsErrors","selection","buttonDisabled","dimensionInput","variantDimensions","availabilityInput","priceInput","unitPrice","a","b","addItemToTemplateText","addLineProductUnitPricePrefix","quantitySelectLabel","addLineProductUnitOfMeasurePrefix","totalPriceLabel","_formatPrice","_getDimensionsNodes","_getConfirmationMessage","selectedDimensionNames","variant","addToTemplateConfirmation","unshift","currencyCode","selectProductButtonText","fallBackImg","ProductSelectButton","buttonText","setBusy","getClickHandler","useCallback","removeOrderActionHandler","_removeOrderTemplate","addTemplateToBag","_getOrderTemplateAddToCartDialog","renameTemplate","_getOrderTemplateRenameControl","removeTemplate","RenameOrderTemplateComponent","OrderTemplateLineActions","getAddToBag","getRemoveItem","PopUp","showMobile","setShowMobile","getActionButton","removeButtonClassName","addButtonClassName","onSelectLineHandler","fallbackImage","selectLine","productImage","_renderProductImage","renderProductInfo","_renderPrice","productUnitOfMeasure","productQuantityView","_generateQuantity","addToBagButton","popUp","onChangeHandler","_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","coveredAmountText","CheckoutLoyaltyView","checkoutLoyalty","showLoyalty","addLoyalty","isShowLoyalty","isShowAddLoyalty","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","getInventoryLabel","inventoryAttribute","inventoryLabel","cartLink","cartItem","createComponent","closeButtonGlyph","stopPropagation","_getSelectedRefinerChoice","itemClicked","nextItemToFocus","nextSibling","_getKeyForRefinerValue","selectedRefinersMap","clearAllAttributes","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","UnitText","currency","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","_onToggleItem","_onToggleSubmenu","expanded","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","Slider","SliderWithBars","rangeType","RangeRefineItem","sliderKey","prevState","cacheKey","ModuleStatesCacheKey","SignInMessage","SignInButton","WriteReview","PureComponent","writeReviewCallbacks","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","ratingId","totalRatings","numberRatings","ActiveProductComponent","imgData","assembleNode","isOpenInNewTab","activeImageAdditionalContent","CanvasCalculations","CanvasStyles","ImageMapper","_isDesktopViewPort","_context","getActiveImageWidth","activeImageReferenceValue","activeImageRefs","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","exec","rValue","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","width","fillStyle","body","parentElement","fillText","drawButton","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","radius","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","animate","ellipse","requestAnimationFrame","textFadeInterval","collapseAnimation","collapseAnimationStartWidth","collapseAnimationEndWidth","clearMargin","clearHeight","clearWidth","collapseRadius","textFadeOutValue","textFadeOutStartValue","clearRect","drawCircle","viewPort","doubleMultiplier","strokeStyle","arc","PI","scaleCoords","imgWidth","defaultWidth","defaultScale","scale","coord","renderPrefilledAreas","areaMap","areas","area","computeCenter","scaledCoords","handleHoverOn","center","handleHoverOff","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","height","click","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","xsRadius","extendedArea","areaKey","altTextWithProductName","productSearchResult","shape","onFocus","initCanvas","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","shouldRender","imageData","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","areaId","updateClientWidth","VariantType","Browser","renderImageMapper","configProduct","xPosition","yPosition","activePoint","mappedArea","_activeImageClass","activeImage","enterArea","leaveArea","_activeImageRefs","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","open","resetState","renderProductComponent","productImageSettings","renderProductCard","_productCardDivRef","renderOverlay","getProductCardPositionX","getDefaultImageSettings","productImageSettingsWidth","productCardWidth","leftAllignPosition","position","getProductCardPositionY","productImageSettingsHeight","produtCardHight","keyDown","enterKey","nodeName","escKey","renderActiveImageDetailsLinks","_telemetryContent","willOpenInNewTab","renderActiveImageDetailsHeading","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","activeImageSource","decrementOne","_handleOutsideClick","contains","timeoutInterval","images","getElementsByClassName","Array","from","removeAttribute","handleAdditionalLinkText","modalCloseButtonReference","CreateOrderTemplateButton","onCancelHandler","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","onCreateButtonClick","createOrderTemplateText","OrderTemplateNameDialog","isUpdateDialog","setModalOpen","onOrderTemplateCreated","OrderTemplateList","_reloadPage","_onRemoveFromOrderTemplateList","p","headerStatusMessage","emptyOrderTemplateText","createNewTemplateButtonText","orderTemplatesData","orderTemplateListHeading","orderTemplateListTitle","createOrderTemplateButton","CreateNewTemplateButtonComponent","templateHeaderStatusMessage","OrderTemplates","OrderTemplate","_renderOrderTemplateList","currentTemplateProps","SocialShareItemView","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","totalCount","percentage","formattedPercent","NumberFormat","barItemAriaLabel","starLabel","bar","Progress","buttonProps","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","ariaValueText","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","initialMin","initialMax","maxValue","labels","sliderKeyString","sliderThumbs","validationErrorMin","validationErrorMax","touchedMin","touchedMax","previousProps","updateSliderProps","_renderInputFields","_renderSlider","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","_renderItem","quantityLabel","OrderTemplateLinesView","toggleDetails","fade","BulkPurchase","_toggleCollapse","hasDimensionsInProps","hasDimensionsInData","_renderCollapseContent","_renderCollapseButton","_renderCollapse","bulkPurchaseHeaderTitle","_renderMainContent","isMobileDevice","Viewport","RichTextComponent","bulkPurchaseDescriptionText","_renderMatrix","ProductDimensionsMatrix","CarouselModule","_handleDismissCarousel","cookies","set","dismissCarousel","_next","nextIndex","animating","closeNow","_previous","_onExiting","_onExited","_goToIndex","newIndex","histogramItem","RatingsHistogramView","translationPath","fallback","translation","translations","splitString","console","warn","modalNode","modalFooterNode","zIndex","AdressInput","ariaValueMax","ariaValueMin","ariaValueNow","CheckoutLoyaltyLabel","CheckoutLoyaltyText","CheckoutLoyalty","moduleClassName","_defaultLoyaltyPoints","isEnabled","loyaltyCard","CardNumber","LoyaltyCardId","updateLoyaltyCardId","loyaltyCardNumber","handleCancelOrSubmit","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","updateLoyaltyAmount","parseFloat","num","card","channelConfig","loyalPointsRequest","createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput","_query","bypassCache","callActionOrExecute","GetLoyaltyTransactionEstimationInput","newMaxPoints","isAddDisabled","isRemoveDisabled","addHandler","removeHandler","searchInputAriaLabel","backButtonText","addSelectedToBagButtonText","removeSelectedToBagButtonText","addLineProps","DeliveryOptionList","DeliveryOptionSelected","CheckoutDeliveryOptionsView","productRecordId","featureSimilarDescriptionTitle","featureSimilarLooksTitle","SuggestionType","AutoSuggestInput","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","searchCriteria","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","ImageUrl","generateImageUrl","AllSearchResults","getSearchSuggestionsActionDataAction","autoSuggestPromises","all","inputData","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","searchPageURL","searchQsp","searchRefiners","queryUrl","searchParams","categoryRefiners","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","_renderThumbnail","Value3","DecimalValue","_getLiWrapper","_getAWrapper","recid","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","size","SpinnerSize","medium","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","formReference","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","getSearchSuggestionsAction","_getSuggestionType","inputSuggestionType","_getSearchRefiners","autoSuggestAriaLabel","_setAutoSuggestResultCount","suggestionTypes","distinctSuggestionTypes","suggestionTypeItem","charAt","toUpperCase","_handleSubmit","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","route","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","searchInputMaxLength","suggestionTypeCriterion","searchFormClass","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","Keyword","Category","getProductSearchRefinersAsync","OrderTemplateListView","_renderOrderTemplate","InvoiceSummaryLine","_buildPaymentSummarySection","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","CheckoutStateInput","submitReviewDataAction","propsContext","cartResult","shouldRetry","validationResult","CartsDataActions","validateForCheckoutAsync","ValidationFailuresByCartLines","refreshError","validateError","cartLineToUpdate","isUsingDefaultOrderSettingsMax","modifiedProduct","newQuantity","updateLineResult","updateCartLineQuantity","WriteReviewView"],"mappings":"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","file":"static/js/6.c9db34cf8de932c8529d.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 { 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 { 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 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 @computed private get isPaymentVerificationRedirection(): boolean {\n const { requestFormData, query } = this.props.context.request;\n return !!((requestFormData && query && query.pv === '1'));\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 && this.props.data.checkout.result.shippingAddress,\n async () => {\n await this.loadDeliveryOptions();\n this.props.moduleState.setIsCancellable(false);\n\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout) {\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 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 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 { 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 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\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\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n }\n };\n\n private readonly onSubmit = async (): Promise => {\n await this.updateCartDeliverySpecification(this.selectedItemId);\n\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\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 if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n\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({ callerContext: context.actionContext, queryResultSettings: {} }, 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 // For new checkout flow, when this module is ready, update the flag to call GetCardPaymentAcceptPoint with amountDue.\n if (this.props.data.checkout.result.shouldEnableSinglePaymentAuthorizationCheckout &&\n !this.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\n this.isLoading = false;\n }\n };\n\n private readonly loadDeliveryOptions = async (): Promise => {\n const shippingAddress = this.props.data.checkout.result && this.props.data.checkout.result.shippingAddress;\n\n if (this.canShip() && shippingAddress) {\n await this.getDeliveryOptions(shippingAddress);\n\n if (this.isSelectDefaultOptionEnabled || this.props.data.checkout.result?.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","/*--------------------------------------------------------------\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 { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartIconViewProps } from './cart-icon';\r\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\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 return (\r\n \r\n {cartLine.cartline}\r\n {cartLine.storeLocation}\r\n {cartLine.remove}\r\n \r\n );\r\n });\r\n};\r\n\r\nconst CartIconView: React.FC = (props: ICartIconViewProps) => (\r\n \r\n {props.cartIcon}\r\n {props.FlyoutContainer ? (\r\n \r\n {props.flyoutTitle}\r\n {_renderCartlines(props.cartlines, props)}\r\n {props.totalPrice}\r\n {props.checkoutAsSignInUserButton}\r\n {props.checkoutAsGuestButton}\r\n {props.goToCartButton}\r\n \r\n ) : (\r\n false\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\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 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 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 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\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 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 } 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 { callerContext: this.props.context.actionContext, queryResultSettings: {} },\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\n this.setState({ 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, resources } = this.props;\n const { quickOrderMaxQuantityLimitText } = resources;\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\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 quickOrderMaxQuantityLimitText.replace(\n '{maxQuantity}',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n maxQuantityForLineItem.toString()).replace('{curQuantity}',\n currentQuantity.toString()\n );\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, productInventoryInfo.ProductAvailableQuantity.AvailableQuantity);\n\n return quickOrderMaxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', currentQuantity.toString());\n }\n\n /**\n * Method to handle quantity change.\n * @param value - Quantity.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n const currentValue = Number.parseInt((value), 10);\n const inputElement = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\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\n ),\n actionContext\n ));\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\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","import classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { translate } from '../../utilities/localisation/translationUtilities';\r\n\r\n/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ProductPrice } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport interface IPriceComponentProps extends IComponentProps<{ price: ProductPrice }> {\r\n className?: string;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n}\r\nexport interface IPriceComponent extends IComponent {\r\n}\r\n\r\nconst PriceComponentActions = {\r\n};\r\n\r\nconst Price: React.FC = (props: IPriceComponentProps) => {\r\n // CustomerContextualPrice could be 0\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n return (\r\n \r\n {showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)}\r\n \r\n );\r\n};\r\n\r\nconst showStrikethroughPricing = (props: IPriceComponentProps) => {\r\n const originalPrice = getOriginalPrice(props);\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getOriginalPrice = (props: IPriceComponentProps) => {\r\n return props.data.price.TradeAgreementPrice || props.data.price.BasePrice || 0;\r\n};\r\n\r\nconst renderCurrentPrice = (props: IPriceComponentProps): JSX.Element | undefined => {\r\n const initialPrice = formatCurrency(props, props.data.price.CustomerContextualPrice);\r\n return {initialPrice};\r\n};\r\n\r\nconst formatCurrency = (props: IPriceComponentProps, price: number | undefined): string | undefined => {\r\n if (price === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (price === 0 && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n\r\n return props.context.cultureFormatter.formatCurrency(price);\r\n};\r\n\r\nconst renderCurrentPriceWithOriginalPrice = (props: IPriceComponentProps): JSX.Element | null => {\r\n const locale = props.context.request.locale;\r\n const originalPrice = getOriginalPrice(props);\r\n const initialPrice = formatCurrency(props, originalPrice);\r\n let discountAmount = formatCurrency(props, props.data.price.DiscountAmount);\r\n let discountPrice = 0;\r\n if (props.data.price.CustomerContextualPrice && initialPrice !== undefined) {\r\n discountPrice = originalPrice - props.data.price.CustomerContextualPrice\r\n discountAmount = formatCurrency(props, originalPrice - props.data.price.CustomerContextualPrice);\r\n }\r\n\r\n const saveAmtFmt = translate(locale, 'price-component.save-amt', 'Save {0}');\r\n\r\n\r\n return (\r\n <>\r\n {props.originalPriceText} {initialPrice} {props.currentPriceText} {renderCurrentPrice(props)}\r\n {discountPrice > 0 ? {saveAmtFmt.replace('{0}', discountAmount || '')} : null}\r\n {initialPrice}\r\n {renderCurrentPrice(props)}\r\n \r\n );\r\n};\r\n\r\n// @ts-ignore\r\nexport const PriceComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'Price',\r\n { component: Price, ...PriceComponentActions }\r\n);\r\n\r\nexport default PriceComponent;\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 { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IPickUpInStoreViewProps {\r\n callbacks: {\r\n toggleBopis(isBopisSelected: boolean): void;\r\n };\r\n defaultComponent?: React.ReactNode;\r\n orgUnitName?: string;\r\n isBopisSelected: boolean;\r\n ContainerProps: INodeProps;\r\n deliveryOption?: string;\r\n}\r\n\r\nexport interface IPickUpInStoreProps {\r\n cartline: CartLine;\r\n product: SimpleProduct;\r\n shipitText: string;\r\n pickUpInStoreText: string;\r\n changeStoreText: string;\r\n cartState: ICartState | undefined;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n orgUnitLocations?: OrgUnitLocation[] | undefined;\r\n deliveryOptions?: ProductDeliveryOptions;\r\n pickupDeliveryModeCode?: string;\r\n storeSelectorModuleId?: string;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\r\n const _onLocationChangedCallback = async (\r\n orgUnitLocation: OrgUnitLocation,\r\n cartState: ICartState | undefined,\r\n cartline: CartLine,\r\n deliveryMode?: string\r\n ) => {\r\n if (!cartState) {\r\n return Promise.resolve();\r\n }\r\n return cartState\r\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n props.locationChangedHandler();\r\n }\r\n })\r\n .catch(error => {});\r\n };\r\n\r\n const _toggleBOPIS = (isBopisSelected: boolean) => {\r\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\r\n\r\n if (isBopisSelected) {\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n storeSelectorStateManager\r\n .openDialog({\r\n id: storeSelectorModuleId,\r\n product,\r\n alreadySelectedLocation: {\r\n OrgUnitNumber: cartline.FulfillmentStoreId\r\n },\r\n deliveryOptions: props.deliveryOptions,\r\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\r\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\r\n }\r\n })\r\n .catch(error => {});\r\n } else {\r\n if (!cartState) {\r\n return;\r\n }\r\n cartline.DeliveryMode = '';\r\n cartline.FulfillmentStoreId = '';\r\n cartline.ShippingAddress = {};\r\n cartState\r\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n props.locationChangedHandler();\r\n }\r\n })\r\n .catch(error => {});\r\n }\r\n };\r\n\r\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n }\r\n return fulfillmentStoreId;\r\n };\r\n\r\n const _renderShippingMethod = (\r\n cartLine: CartLine,\r\n shipItText: string,\r\n pickupInStoretext: string,\r\n changeStoreText: string,\r\n orgUnitLocations: OrgUnitLocation[] | undefined\r\n ): JSX.Element => {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\r\n const bopisSelected = !!cartLine.FulfillmentStoreId;\r\n\r\n const toggleBOPIS = (isBopisSelected: boolean) => {\r\n return () => {\r\n _toggleBOPIS(isBopisSelected);\r\n };\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {cartLine.FulfillmentStoreId ? (\r\n
\r\n {orgUnitName}\r\n \r\n
\r\n ) : null}\r\n \r\n );\r\n };\r\n\r\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\r\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\r\n return delivery?.Description;\r\n };\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (\r\n !props.deliveryOptions ||\r\n !props.deliveryOptions.DeliveryOptions ||\r\n !props.pickupDeliveryModeCode ||\r\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n callbacks: {\r\n toggleBopis: _toggleBOPIS\r\n },\r\n defaultComponent: _renderShippingMethod(\r\n props.cartline,\r\n props.shipitText,\r\n props.pickUpInStoreText,\r\n props.changeStoreText,\r\n props.orgUnitLocations\r\n ),\r\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\r\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\r\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\r\n ContainerProps: {\r\n className: 'msc-cart-line__bopis-container'\r\n }\r\n };\r\n};\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 {\r\n AddToOrderTemplateComponent,\r\n AddToWishlistComponent,\r\n CartLineItemComponent,\r\n IAddToOrderTemplateDialogResources,\r\n ICartlineResourceString,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n CommerceList,\r\n Customer,\r\n LineDataValidationFailure,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport {\r\n ArrayExtensions,\r\n getInvoiceDetailsPageUrlSync,\r\n getProductUrlSync,\r\n IProductInventoryInformation,\r\n ObjectExtensions,\r\n OrderTemplate\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '@msdyn365-commerce-modules/cart';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartlinesErrors: LineDataValidationFailure[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n\r\n /**\r\n * GridSettings for the product image in cartline\r\n */\r\n gridSettings: IGridSettings;\r\n\r\n /**\r\n * ImageSettings for the product image in cartline\r\n */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext>;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n includeErrors?: boolean;\r\n showShippingChargesForLineItems?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n storeSelectorModuleId?: string;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n addToOrderTemplateButtonText: string;\r\n addToOrderTemplateButtonTooltip: string;\r\n addToOrderTemplateMessage: string;\r\n addItemToOrderTemplateError: string;\r\n orderTemplates: OrderTemplate[] | undefined;\r\n customerInformation: Customer | undefined;\r\n shouldIgnoreWarehouse: boolean | undefined;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n error?: string;\r\n cartlineId?: string;\r\n hasError?: boolean;\r\n data?: {\r\n product?: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getCartItemAvailableQuantity = (\r\n isStockCheckEnabled: boolean,\r\n productAvailability: IProductInventoryInformation | undefined\r\n): number => {\r\n if (\r\n !isStockCheckEnabled ||\r\n !productAvailability ||\r\n !productAvailability.ProductAvailableQuantity ||\r\n !productAvailability.IsProductAvailable ||\r\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\r\n ) {\r\n return 0;\r\n }\r\n\r\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxQuantityByConfig: number,\r\n isStockCheckEnabled: boolean,\r\n availableQuantityInStock: number,\r\n isQuantityLimitsFeatureEnabled: boolean,\r\n maxByQuantityLimitsFeature: number\r\n) => {\r\n if (isQuantityLimitsFeatureEnabled) {\r\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\r\n\r\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\r\n // and consider available qty if stock check enabled and max from config in site settings.\r\n if (!maxByQuantityLimitsFeature) {\r\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\r\n }\r\n\r\n return isStockCheckEnabled\r\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\r\n ? maxByQuantityLimitsFeatureResult\r\n : availableQuantityInStock\r\n : maxByQuantityLimitsFeatureResult;\r\n }\r\n if (isStockCheckEnabled) {\r\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\r\n }\r\n return maxQuantityByConfig;\r\n};\r\n\r\nconst _getErrorMessage = (\r\n availableQuantityInStock: number,\r\n currentQuantity: number,\r\n props: ICartLineItemsProps,\r\n lineIndex: number,\r\n isServiceItem: boolean,\r\n productAvailability: IProductInventoryInformation | undefined\r\n): string | undefined => {\r\n const finalErrorMessages: string[] = [];\r\n if (props.includeErrors) {\r\n if (props.isStockCheckEnabled && !isServiceItem) {\r\n if (availableQuantityInStock <= 0) {\r\n // Show OOS only if we have checked product availability\r\n if (productAvailability) {\r\n finalErrorMessages.push(props.outOfStockText);\r\n }\r\n } else if (availableQuantityInStock < currentQuantity) {\r\n if (availableQuantityInStock === 1) {\r\n finalErrorMessages.push(props.outOfRangeOneText);\r\n } else {\r\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Server-side validation\r\n props.cartlinesErrors\r\n .filter(i => i.LineIndex === lineIndex)\r\n .forEach(i => {\r\n if (i.DataValidationFailure?.ErrorContext) {\r\n finalErrorMessages.push(i.DataValidationFailure.ErrorContext);\r\n }\r\n });\r\n\r\n if (finalErrorMessages.length > 0) {\r\n return finalErrorMessages.join(' ');\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n/**\r\n * On Remove Click functionality.\r\n * @param removeItemClickHandler -Remove item click function.\r\n * @param cartline -CartLine.\r\n * @returns Remove change value.\r\n */\r\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\r\n removeItemClickHandler(cartline);\r\n};\r\n\r\n// eslint-disable-next-line complexity -- Auto-suppressed.\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct | undefined,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: IProductInventoryInformation,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions\r\n): ICartlinesViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n moveToWishlistSuccessHandler,\r\n addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateDialogResources,\r\n createOrderTemplateDialogResources,\r\n itemAddedToOrderTemplateDialogResources,\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n addToWishlistButtonText,\r\n removeFromWishlistButtonText,\r\n orderTemplates,\r\n customerInformation,\r\n wishlists,\r\n defaultWishlistName,\r\n storeSelectorModuleId\r\n } = props;\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\r\n\r\n const defaultMaxQuantity = 0;\r\n const maxQuantity =\r\n product &&\r\n _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n availableQuantityInStock,\r\n props.isQuantityLimitsFeatureEnabled,\r\n product?.Behavior?.MaximumQuantity ?? defaultMaxQuantity\r\n );\r\n\r\n // Check if the product is service or not by product type\r\n const isServiceItem = product?.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\r\n ? undefined\r\n : _getErrorMessage(availableQuantityInStock, cartline.Quantity!, props, index, isServiceItem, foundProductAvailability);\r\n\r\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\r\n\r\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n const inventoryCode = foundProductAvailability\r\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\r\n : undefined;\r\n const productDimension = 4;\r\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\r\n const isCustomPriceSelected =\r\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\r\n 'Custom';\r\n\r\n let isQuantityEditable = !ObjectExtensions.isNullOrUndefined(product) && !product?.Behavior?.HasSerialNumber;\r\n\r\n if (product?.ItemTypeValue === 2 && product.ItemServiceTypeValue === 1) {\r\n // make quantity readonly for warranty\r\n isQuantityEditable = false;\r\n }\r\n\r\n let gtmJson: string | null = null;\r\n if (product) {\r\n const productInfo = product;\r\n const gtmProduct = {\r\n name: productInfo.Name,\r\n id: productInfo.ItemId,\r\n price: cartline.ExtendedPrice ?? productInfo.Price,\r\n quantity: cartline.Quantity ?? 1\r\n };\r\n\r\n process.env.NODE_ENV === 'development' &&\r\n console.log('heiGtmProduct', 'cart-line-items', gtmProduct, JSON.parse(JSON.stringify(cartline)));\r\n gtmJson = JSON.stringify(gtmProduct);\r\n }\r\n\r\n return {\r\n data: {\r\n product,\r\n cartline\r\n },\r\n cartlineId: cartline.LineId,\r\n error: errorMessage,\r\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? defaultMaxQuantity) : false,\r\n cartline: (\r\n \r\n ),\r\n pickUpInStore: product\r\n ? PickUpInStore({\r\n storeSelectorModuleId,\r\n cartState: props.cartState,\r\n cartline,\r\n product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: foundProductDeliveryOptions,\r\n pickupDeliveryModeCode:\r\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\r\n locationChangedHandler: props.locationChangedHandler\r\n })\r\n : undefined,\r\n remove: (\r\n \r\n ),\r\n addToWishlist:\r\n isAuthenticated && product && !isCustomPriceSelected ? (\r\n \r\n ) : (\r\n undefined\r\n ),\r\n addToOrderTemplate:\r\n isAuthenticated && orderTemplates && product ? (\r\n \r\n ) : (\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nexport const assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n cartlines.map((cartline, index) => {\r\n let product;\r\n if (props.isQuantityLimitsFeatureEnabled) {\r\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\r\n // to check productId and WarehouseId for identification.\r\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\r\n } else {\r\n product = getProductByProductId(cartline.ProductId, products);\r\n }\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n if (props.shouldIgnoreWarehouse) {\r\n return productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId;\r\n }\r\n return (\r\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\r\n productAvailability.InventLocationId === cartline.WarehouseId\r\n );\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component.\r\n * @param props\r\n */\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return assembleCartlines(cartlines, products, props);\r\n};\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 { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport groupBy from 'lodash/groupBy';\r\n\r\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './cart-line-items';\r\n\r\nconst _assembleGroupCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n const reactNodes: ICartlinesViewProps[][] = [];\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Products content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\r\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\r\n const groupDelivery = getGroupByDelivery(cartlines);\r\n const cartLinesGroup: CartLine[] = [];\r\n\r\n // 1) Group by store and pick up mode\r\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\r\n // @ts-expect-error\r\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\r\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\r\n });\r\n\r\n // 2) Create cartlines group\r\n Object.keys(cartLinesGroup).forEach(key => {\r\n const cartLines = cartLinesGroup[key];\r\n Object.keys(cartLines).forEach(index => {\r\n const cartLine = cartLines[index];\r\n const carLineViewProps = assembleCartlines(cartLine, products, props);\r\n if (carLineViewProps !== null) {\r\n reactNodes.push(carLineViewProps);\r\n }\r\n });\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLine Group component.\r\n * @param props\r\n */\r\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return _assembleGroupCartlines(cartlines, products, props);\r\n};\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 { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n * IPromotionData entity interface.\r\n */\r\nexport interface IPromotionData {\r\n promotionOptions?: CartPromotionLine[];\r\n}\r\n\r\n/**\r\n * Calls the Retail API and returns a promotion data.\r\n * @param ctx\r\n */\r\nexport async function getPromotionData(ctx: IActionContext): Promise {\r\n const promotionData: IPromotionData = {};\r\n\r\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(promotionOptions => {\r\n if (promotionOptions) {\r\n promotionData.promotionOptions = promotionOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n return {};\r\n });\r\n\r\n return promotionData;\r\n}\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 {\r\n IAddToOrderTemplateDialogResources,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n ILinesAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionSuccessResult,\r\n PromoCodeComponent,\r\n SaveCartToOrderTemplateComponent\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, LineDataValidationFailure, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport {\r\n ActiveCartProductsInput,\r\n ArrayExtensions,\r\n getActiveCartProductsAction,\r\n ObjectExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Alert,\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n INodeProps,\r\n IPayLoad,\r\n ITelemetryContent,\r\n TelemetryConstant,\r\n Waiting\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\n\r\nimport { ICartData } from './cart.data';\r\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\r\nimport { CartLineGroupItems } from './components/cart-line-groups';\r\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\r\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\r\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\r\n\r\nexport interface ICartViewProps extends ICartProps {\r\n className: string;\r\n title?: React.ReactNode;\r\n CartlinesWrapper: INodeProps;\r\n cartlines?: ICartlinesViewProps[];\r\n cartLinesGroup?: ICartlinesViewProps[][];\r\n cart: ICartState | undefined;\r\n orderSummaryHeading: React.ReactNode;\r\n orderSummaryLineitems?: IOrderSummaryLines;\r\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\r\n OrderSummaryWrapper: INodeProps;\r\n OrderSummaryItems: INodeProps;\r\n OrderSummaryErrors?: IOrderSummaryErrors;\r\n checkoutAsGuestButton: React.ReactNode;\r\n checkoutAsSignInUserButton: React.ReactNode;\r\n storeSelector?: React.ReactNode;\r\n backToShoppingButton: React.ReactNode;\r\n waitingComponent: React.ReactNode;\r\n promotionOptions?: ICartLineItemViewProps;\r\n promoCode: React.ReactNode;\r\n cartLoadingStatus: string;\r\n cartDataResult: boolean;\r\n multiplePickUpEnabled?: boolean;\r\n createTemplateFromCartButton: React.ReactNode;\r\n telemetryContent?: ITelemetryContent;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n}\r\n\r\nexport interface IOrderSummaryErrors {\r\n Wrapper: INodeProps;\r\n\r\n header: React.ReactNode;\r\n errors: React.ReactNode[];\r\n}\r\n\r\ninterface ICartComponentState {\r\n showPromotionDialog: boolean;\r\n cartlinesErrors: LineDataValidationFailure[];\r\n promotionData: IPromotionData;\r\n products: SimpleProduct[];\r\n isCartValid: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * Cart component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass Cart extends React.Component> {\r\n public state: ICartComponentState = {\r\n cartlinesErrors: [],\r\n showPromotionDialog: false,\r\n promotionData: {},\r\n products: [],\r\n isCartValid: true\r\n };\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n private _isMounted: boolean = false;\r\n\r\n private readonly promotionPopupId: string = 'cart-promotion-popup';\r\n\r\n constructor(props: ICartProps) {\r\n super(props);\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\r\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n this._isMounted = true;\r\n const {\r\n config,\r\n context: { actionContext }\r\n } = this.props;\r\n\r\n this.isQuantityLimitsFeatureEnabled = await this._getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this._validateCart();\r\n }\r\n\r\n try {\r\n const products = await this.props.data.products;\r\n if (this._isMounted) {\r\n this.setState({ products });\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get cart');\r\n }\r\n\r\n if (config.showAvailablePromotions) {\r\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\r\n this.setState({ promotionData: await getPromotionData(actionContext) });\r\n }\r\n\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n if (this._isMounted) {\r\n this.setState({ promotionData: await getPromotionData(actionContext) });\r\n }\r\n }\r\n );\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n this._isMounted = false;\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: ICartProps, nextState: ICartComponentState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n products: { result: products }\r\n },\r\n context: {\r\n request: {\r\n user: { isAuthenticated, signInUrl }\r\n }\r\n },\r\n resources\r\n } = this.props;\r\n\r\n this._ensureProductListUpdateToDate();\r\n\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\r\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n const cartLines = this._getCartLines();\r\n const hasError = !this.state.isCartValid || (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = !cart?.hasInvoiceLine && RetailMultiplePickupFeatureState?.IsEnabled;\r\n const cartLinesGroup = multiplePickUpEnabled ? this._getCartLinesGroup() : null;\r\n\r\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\r\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\r\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n\r\n const viewProps = {\r\n ...this.props,\r\n className: classnames('ms-cart'),\r\n title:

{resources.cartTitle}

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

{resources.invoiceSummaryTitle}

\r\n ) : (\r\n

{resources.orderSummaryTitle}

\r\n )\r\n ) : null,\r\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\r\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\r\n checkoutAsSignInUserButton: !isCartEmpty ? (\r\n \r\n {resources.checkoutButtonTitle}\r\n \r\n ) : null,\r\n checkoutAsGuestButton:\r\n !isCartEmpty && !isAuthenticated ? (\r\n \r\n {resources.guestCheckoutButtonTitle}\r\n \r\n ) : null,\r\n backToShoppingButton: (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n ),\r\n createTemplateFromCartButton:\r\n this._displayAddCartToTemplate() && products ? (\r\n \r\n ) : null,\r\n storeSelector:\r\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n waitingComponent: ,\r\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\r\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\r\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\r\n telemetryContent: this.telemetryContent\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private readonly promotionLinkClick = (event: React.MouseEvent) => {\r\n this.setState({\r\n showPromotionDialog: !this.state.showPromotionDialog\r\n });\r\n };\r\n\r\n private readonly promotionCloseButtonclick = () => {\r\n this._hidePromotionDialog();\r\n };\r\n\r\n private _hidePromotionDialog(): void {\r\n this.setState({\r\n showPromotionDialog: false\r\n });\r\n }\r\n\r\n private _displayAddCartToTemplate(): boolean {\r\n const cart = this.props.data.cart?.result;\r\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\r\n return false;\r\n }\r\n\r\n const RetailB2BEcommerceFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailB2BEcommerceFeature'\r\n );\r\n if (\r\n RetailB2BEcommerceFeatureState?.IsEnabled &&\r\n this.props.data.customerInformation.result?.IsB2b &&\r\n this.props.data.orderTemplates.result &&\r\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\r\n this.props.data.customerInformation.result\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _getPromotions(): React.ReactNode {\r\n return (\r\n this.props.config.showAvailablePromotions &&\r\n cartPromotions({\r\n id: this.promotionPopupId,\r\n showPromotionPopup: this.state.showPromotionDialog,\r\n onSeeAllClick: this.promotionLinkClick,\r\n onCloseButtonClick: this.promotionCloseButtonclick,\r\n promotions: this.state.promotionData.promotionOptions,\r\n resources: {\r\n promotionStringHeading: this.props.resources.promotionStringHeading,\r\n promotionLinkText: this.props.resources.promotionLinkText,\r\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\r\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\r\n }\r\n })\r\n );\r\n }\r\n\r\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\r\n const allErrors =\r\n (cartLines &&\r\n cartLines\r\n .map(cartline => {\r\n // Check if the product is service or not by product type\r\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n if (!isServiceItem && cartline.error) {\r\n const fullError =\r\n cartline.data && cartline.data.product?.Name\r\n ? `${cartline.data.product.Name}: ${cartline.error}`\r\n : cartline.error;\r\n\r\n return
{fullError}
;\r\n }\r\n\r\n return null;\r\n })\r\n .filter((line): line is JSX.Element => !!line)) ||\r\n [];\r\n\r\n return {\r\n Wrapper: {\r\n tag: Alert,\r\n className: 'msc-alert',\r\n isOpen: allErrors.length > 0,\r\n color: 'danger',\r\n assertive: true,\r\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\r\n },\r\n header: (\r\n \r\n ),\r\n errors: allErrors\r\n };\r\n }\r\n\r\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n return cart?.hasInvoiceLine\r\n ? InvoiceSummary({\r\n orderTotalLabel: resources.totalAmountLabel,\r\n invoiceLabel: resources.invoiceLabel,\r\n cart: cart.cart,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry,\r\n id: this.props.id\r\n })\r\n : undefined;\r\n }\r\n\r\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n channelDeliveryOptionConfig\r\n },\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const featureState = this.props?.data?.featureState;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\r\n ?.IsEnabled;\r\n\r\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\r\n ? OrderSummary({\r\n cart: cart!.cart,\r\n subTotalLabel: resources.itemsWithCountLabel,\r\n shippingLabel: resources.estimatedShippingLabel,\r\n otherChargeLabel: resources.otherCharges,\r\n taxLabel: resources.estimatedTaxLabel,\r\n orderTotalLabel: resources.orderTotal,\r\n totalDiscountsLabel: resources.totalDiscountsLabel,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n toBeCalculatedText: resources.yetToBeCalculatedText,\r\n freeText: resources.priceFree,\r\n channelConfiguration,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\r\n telemetry\r\n })\r\n : undefined;\r\n }\r\n\r\n private _getPromoCode(): React.ReactNode {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n resources\r\n } = this.props;\r\n\r\n return (\r\n cart && (\r\n \r\n )\r\n );\r\n }\r\n\r\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n }\r\n\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\r\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\r\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\r\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\r\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\r\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\r\n };\r\n }\r\n\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources: ICartResources\r\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n }\r\n\r\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): 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 private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\r\n ? CartLineItems({\r\n cartlines: cart!.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors,\r\n products: this.state.products,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n amountString: resources.productDimensionTypeAmount,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges\r\n },\r\n telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources\r\n ),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates,\r\n customerInformation\r\n })\r\n : null;\r\n }\r\n\r\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\r\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n private readonly _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return (\r\n imageSettings || {\r\n viewports: {\r\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\r\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n }\r\n );\r\n };\r\n\r\n private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result\r\n .removeCartLines(input)\r\n .then(() => {\r\n this._validateCart().catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n private readonly _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n };\r\n\r\n private readonly _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\r\n cartLineQuantityUpdatedAsync(\r\n this.isQuantityLimitsFeatureEnabled,\r\n this.props.data.cart.result,\r\n this.props.telemetry,\r\n this.state.products,\r\n cartlineToUpdate,\r\n quantity\r\n )\r\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\r\n if (cartActionResult?.status === 'SUCCESS') {\r\n this._validateCart().catch(error => {\r\n this.props.telemetry.warning((error as Error).message);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n\r\n return true;\r\n }\r\n\r\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\r\n // Show update line error message.\r\n const defaultIndex = 0;\r\n const lineUpdateFailure: LineDataValidationFailure = {\r\n LineIndex: ObjectExtensions.isNullOrUndefined(lineIndex) ? defaultIndex : lineIndex,\r\n DataValidationFailure: {\r\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\r\n ? cartActionResult.validationResults[0].ErrorContext\r\n : '',\r\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\r\n }\r\n };\r\n\r\n this.setState((previousState: Readonly) => {\r\n const currentErrors: LineDataValidationFailure[] = previousState.cartlinesErrors.filter(\r\n error => error.LineIndex !== lineIndex\r\n );\r\n currentErrors.push(lineUpdateFailure);\r\n return { cartlinesErrors: currentErrors };\r\n });\r\n }\r\n\r\n return false;\r\n })\r\n .catch(() => {\r\n return false;\r\n });\r\n\r\n return false;\r\n };\r\n\r\n private readonly _fulfillmentStoreIdUpdated = () => {\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\r\n .then(products => {\r\n this.setState({ products });\r\n })\r\n .then(async () => this._validateCart())\r\n .catch((error: Error) => {\r\n this.props.telemetry.warning(error.message);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n };\r\n\r\n private async _validateCart(): Promise {\r\n const {\r\n data: { cart },\r\n telemetry,\r\n context\r\n } = this.props;\r\n\r\n const validationResults: LineDataValidationFailure[] | undefined = await validateCartAsync(\r\n this.isQuantityLimitsFeatureEnabled,\r\n cart,\r\n telemetry,\r\n context,\r\n true\r\n );\r\n\r\n if (validationResults) {\r\n const isValid = !ArrayExtensions.hasElements(validationResults);\r\n this.setState({\r\n cartlinesErrors: validationResults,\r\n isCartValid: isValid\r\n });\r\n } else {\r\n this.setState({ isCartValid: true });\r\n }\r\n\r\n return AsyncResult.resolve();\r\n }\r\n\r\n private async _getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n return false;\r\n }\r\n }\r\n\r\n private _getCartLinesGroup(): ICartlinesViewProps[][] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n\r\n return this.props.data.products &&\r\n this.props.data.products.result &&\r\n cart &&\r\n cart.cart.CartLines &&\r\n cart.cart.CartLines.length > 0 &&\r\n this.props.data.channelDeliveryOptionConfig?.result\r\n ? CartLineGroupItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n amountString: resources.productDimensionTypeAmount,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges\r\n },\r\n telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources\r\n ),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates,\r\n customerInformation,\r\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\r\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple'\r\n })\r\n : null;\r\n }\r\n\r\n private _ensureProductListUpdateToDate() {\r\n const products = this.props.data.products.result;\r\n if (products && products.length !== this.state.products.length && this._isMounted) {\r\n this.setState({\r\n products\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport default Cart;\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 { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ICartLineItemPromotion {\r\n id: string;\r\n showPromotionPopup: boolean;\r\n promotions: CartPromotionLine[] | undefined;\r\n resources: ICartLineItemPromotionResourceString;\r\n onSeeAllClick(event: React.MouseEvent): void;\r\n onCloseButtonClick(): void;\r\n}\r\n\r\nexport interface ICartLineItemViewProps {\r\n promotionMessageWrapper: INodeProps;\r\n promotionMessage: React.ReactNode;\r\n promotionSeeAllLink: React.ReactElement;\r\n promotionDialog: React.ReactNode;\r\n}\r\n\r\nexport interface ICartLineItemPromotionResourceString {\r\n promotionLinkText: string;\r\n promotionStringHeading: string;\r\n promotionPopupHeading: string;\r\n promotionCloseButtonAriaLabel: string;\r\n}\r\n\r\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\r\n const {\r\n id,\r\n showPromotionPopup,\r\n promotions,\r\n resources: { promotionLinkText, promotionPopupHeading },\r\n onCloseButtonClick,\r\n onSeeAllClick\r\n } = props;\r\n\r\n if (!ArrayExtensions.hasElements(promotions)) {\r\n return;\r\n }\r\n\r\n const titleId = `${id}_title`;\r\n const className = 'msc-cart__promotion';\r\n return {\r\n promotionMessageWrapper: {\r\n className: 'msc-cart__promotion'\r\n },\r\n promotionMessage: (\r\n <>\r\n \r\n {props.resources.promotionStringHeading}\r\n \r\n ),\r\n promotionSeeAllLink: (\r\n \r\n {' '}\r\n {promotionLinkText}{' '}\r\n \r\n ),\r\n promotionDialog: (\r\n \r\n \r\n
\r\n {promotionPopupHeading}\r\n
\r\n
\r\n \r\n
    \r\n {promotions.map(_promotion => {\r\n return (\r\n
  • \r\n {_promotion.Promotion?.OfferName}{' '}\r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n \r\n
\r\n )\r\n };\r\n};\r\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHeaderViewProps } from './header';\n\nconst headerView: React.FC = props => {\n const {\n HeaderTag,\n HeaderContainer,\n HeaderTopBarContainer,\n MobileMenuContainer,\n MobileMenuBodyContainer,\n MobileMenuLinksContainer,\n Divider\n } = props;\n return (\n \n \n \n {props.navIcon}\n {props.logo}\n {_renderReactFragment(props.search)}\n {props.preferredStore}\n {_renderDesktopAccountBlock(props)}\n {props.wishListIconDesktop}\n \n {props.cartIcon}\n {_renderReactFragment(props.siteOptions)}\n \n \n \n { props.MobileMenuHeader }\n {_renderReactFragment(props.menuBar)}\n \n { props.accountLinks ? props.accountLinks.map(link => link) : false }\n { props.siteOptions }\n { props.wishListIconMobile }\n { props.signInLink }\n { props.signOutLink }\n \n \n \n {_renderReactFragment(props.menuBar)}\n \n \n );\n};\n\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\n const {\n AccountInfoDropdownParentContainer,\n AccountInfoDropdownPopoverConentContainer,\n accountInfoDropdownButton,\n signOutLink,\n signInLink,\n accountLinks\n } = props;\n\n if (AccountInfoDropdownParentContainer) {\n if (AccountInfoDropdownPopoverConentContainer) {\n return (\n \n {accountInfoDropdownButton}\n \n { accountLinks ? accountLinks.map(link => link) : false }\n {signOutLink}\n \n \n );\n } else if (signInLink) {\n return (\n \n {signInLink}\n \n );\n }\n }\n props.context.telemetry.error('Header content is empty, module wont render.');\n return null;\n}\n\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\n return (\n <>\n {items && items.length > 0 ? items.map((slot: React.ReactNode, index: number) => {\n return (\n {slot}\n );\n }) : null}\n \n );\n}\n\nexport default headerView;\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 { SocialMedia, SocialMediaComponent } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISocialShareItemConfig, ISocialShareItemProps, socialMedia } from './social-share-item.props.autogenerated';\n\nexport interface ISocialShareItemViewProps extends ISocialShareItemProps {\n SocialShareItemElement: React.ReactNode | null;\n SocialShareItem: IModuleProps;\n}\n\n/**\n *\n * SocialShareItem component.\n * @extends {React.PureComponent>}\n */\nclass SocialShareItem extends React.PureComponent> {\n constructor(props: ISocialShareItemProps) {\n super(props);\n\n this._getSocialShareItem = this._getSocialShareItem.bind(this);\n }\n\n public render(): JSX.Element | null {\n const viewprops = {\n ...this.props,\n SocialShareItem: {\n moduleProps: this.props,\n className: 'ms-social-share-item'\n },\n SocialShareItemElement: this._getSocialShareItem()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n private _getSocialShareItem(): React.ReactNode | null {\n const src = this.props.config.icon;\n if (MsDyn365.isBrowser) {\n switch (this.props.config.socialMedia) {\n case socialMedia.facebook:\n return ();\n case socialMedia.twitter:\n return ();\n case socialMedia.pinterest:\n return ();\n case socialMedia.linkedin:\n return ();\n case socialMedia.mail:\n return ();\n default:\n return null;\n }\n }\n return null;\n }\n}\n\nexport default SocialShareItem;\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 { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\r\nimport { ICartlinesViewProps } from './components/cart-line-items';\r\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus};\r\n }\r\n if (cartLines) {\r\n return cartLines.map(cartLine => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n {cartLine.pickUpInStore.defaultComponent}\r\n ) : null}\r\n {cartLine.addToOrderTemplate ? (\r\n \r\n {cartLine.remove}\r\n {cartLine.addToWishlist}\r\n {cartLine.addToOrderTemplate}\r\n \r\n ) : (\r\n <>\r\n {cartLine.remove}\r\n {cartLine.addToWishlist}\r\n \r\n )}\r\n
\r\n );\r\n });\r\n }\r\n return cartDataResult ? (\r\n
\r\n

{cartEmptyText}

\r\n {backToShoppingButton}\r\n
\r\n ) : (\r\n <>{waitingComponent}\r\n );\r\n};\r\n\r\n/**\r\n * Method will render error block.\r\n * @param errorData -The order summary errors interface.\r\n * @returns Jsx element.\r\n */\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\r\n return null;\r\n }\r\n return (\r\n \r\n {errorData.header}\r\n {errorData.errors}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render invoice summary lines.\r\n * @param invoiceSummaryLines -The invoicesummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderInvoiceSummarylines = (\r\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!invoiceSummaryLines) {\r\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {invoiceSummaryLines.invoices}\r\n {invoiceSummaryLines.giftCard}\r\n {invoiceSummaryLines.loyalty}\r\n {invoiceSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render order summary lines.\r\n * @param orderSummaryLines -The ordersummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {props.promoCode}\r\n {orderSummaryLines.subtotal}\r\n {orderSummaryLines.shipping}\r\n {orderSummaryLines.otherCharge}\r\n {orderSummaryLines.tax}\r\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n {orderSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cart promotions.\r\n * @param promotions -The cartline item view props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\r\n return (\r\n <>\r\n \r\n {promotions.promotionMessage}\r\n {promotions.promotionSeeAllLink}\r\n {promotions.promotionDialog}\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines group title.\r\n * @param cartLine -The cartline view props.\r\n * @param titleSeparate -The title separate.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n return (\r\n <>\r\n \r\n {isBopisSelected ? (\r\n

\r\n {cartLine.pickUpInStore?.deliveryOption}\r\n {titleSeparate}\r\n {cartLine.pickUpInStore?.orgUnitName}\r\n

\r\n ) : null}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines groups header title.\r\n * @param pickUpText -The pickup text for group.\r\n * @param shippingText -The shipping text for group.\r\n * @param emailShippingText -The email shipping text for group.\r\n * @param titleSeparate -The title separator.\r\n * @param cartLine -The cartline view props.\r\n * @param emailDeliveryModeCode -The email delivery code from channel.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupHeader = (\r\n pickUpText: string,\r\n shippingText: string,\r\n emailShippingText: string,\r\n titleSeparate: string,\r\n cartLine: ICartlinesViewProps,\r\n emailDeliveryModeCode?: string\r\n) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n let groupTitle: string;\r\n\r\n groupTitle = isBopisSelected ? pickUpText : shippingText;\r\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\r\n\r\n return (\r\n <>\r\n
\r\n

\r\n

{groupTitle}

\r\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines in groups.\r\n * @param props -The cartline.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\r\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\r\n return (\r\n
\r\n {props.cartLinesGroup.map(cartlines => {\r\n return (\r\n
\r\n {renderCartLinesGroupHeader(\r\n props.resources.pickUpText,\r\n props.resources.shippingText,\r\n props.resources.emailshippingText,\r\n props.resources.titleSeparate,\r\n cartlines[0],\r\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\r\n )}\r\n {_renderCartlines(\r\n cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult\r\n )}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n return props.cartDataResult ? (\r\n
\r\n
\r\n

{props.resources.emptyCartText}

\r\n {props.backToShoppingButton}\r\n
\r\n
\r\n ) : (\r\n <>{props.waitingComponent}\r\n );\r\n};\r\n\r\nconst CartView: React.FC = (props: ICartViewProps) => (\r\n
\r\n {props.title}\r\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\r\n {props.multiplePickUpEnabled ? (\r\n renderCartLinesGroup(props)\r\n ) : (\r\n \r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult\r\n )}\r\n \r\n )}\r\n {props.orderSummaryHeading && (\r\n \r\n {props.orderSummaryHeading}\r\n {props.cart?.hasInvoiceLine\r\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\r\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\r\n {_renderErrorBlock(props.OrderSummaryErrors)}\r\n {props.checkoutAsSignInUserButton}\r\n {props.checkoutAsGuestButton}\r\n {props.backToShoppingButton}\r\n {props.createTemplateFromCartButton}\r\n \r\n )}\r\n {props.storeSelector}\r\n
\r\n);\r\n\r\nexport default CartView;\r\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, ITelemetryContent } 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 public constructor(props: IVideoPlayerProps) {\n super(props);\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: IPlayerOptions = this.props.config;\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, 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 * 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","/*--------------------------------------------------------------\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 { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, ChannelDeliveryOptionConfiguration, OrgUnitLocation, ProductAvailableQuantity, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { 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 return {\n data: {\n product,\n cartline\n },\n hasError: (!isServiceItem && props.isStockCheckEnabled) ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n ),\n remove: (\n \n {removeButtonText}\n \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
\n \n {orgUnitName}\n \n
\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 { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderData } from '../header.data';\nimport { IHeaderProps } from '../header.props.autogenerated';\n\n/**\n * The header preferred store component.\n */\n@observer\nexport class HeaderPreferredStore extends React.PureComponent> {\n private readonly modalCloseButtonRef: React.RefObject = React.createRef();\n\n /**\n * Handle click on the store selector.\n * @returns : Promise void.\n */\n public handleClick = () => {\n return this._findPreferredStoreOnClick(this.props);\n };\n\n public render(): JSX.Element | undefined {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n slots,\n resources\n } = this.props;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- slots can be undefined.\n if (ArrayExtensions.hasElements(slots?.storeSelector)) {\n const storeName = storeSelectorStateManager?.preferredStore &&\n storeSelectorStateManager.preferredStore.StoreName ? storeSelectorStateManager.preferredStore.StoreName : resources.headerPreferredStoreText;\n\n return (\n
\n \n \n {storeName}\n \n \n {slots.storeSelector}\n
\n );\n }\n\n return undefined;\n }\n\n private async _findPreferredStoreOnClick(props: IHeaderProps): Promise {\n const { data: { storeSelectorStateManager: { result: storeSelectorStateManager } }, modules } = props;\n if (!storeSelectorStateManager) {\n return;\n }\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && ArrayExtensions.hasElements(modules.storeSelector)) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n await storeSelectorStateManager.openDialog({\n id: storeSelectorId,\n showMapViewLink: true,\n parentElementRef: this.modalCloseButtonRef,\n onLocationSelected: orgUnitLocation => {\n return Promise.resolve();\n }\n }).catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to set preferred store');\n }\n });\n }\n}\n\nexport default HeaderPreferredStore;\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 { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ILogoProps {\n image: Msdyn365.IImageData;\n gridSettings?: Msdyn365.IGridSettings;\n link?: ILinkData;\n className?: string;\n telemetryContent?: ITelemetryContent;\n requestContext: Msdyn365.IRequestContext;\n typeName?: string;\n}\n\nexport interface ILinkData {\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n openInNewTab?: boolean;\n linkText?: string;\n}\n\n/**\n *\n * Logo component.\n * @extends {React.PureComponent}\n */\nexport class Logo extends React.PureComponent {\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n constructor(props: ILogoProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return (\n
\n {this._renderLogo(this.props)}\n
\n );\n }\n\n private _renderLogo(config: ILogoProps): JSX.Element {\n if (config.link && config.link.linkUrl.destinationUrl) {\n return (\n \n {this._renderImage(config)}\n \n );\n }\n return (\n this._renderImage(config)\n );\n }\n\n private _renderImage(config: ILogoProps): JSX.Element {\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=132&h=28&m=6', w: 0, h: 0 },\n lg: { q: 'w=160&h=48&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n \n );\n }\n}\n\nexport default Logo;\n","/*--------------------------------------------------------------\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 { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderResources } from '../header.props.autogenerated';\n\nexport interface INavIconProps {\n resources: IHeaderResources;\n isExpanded: boolean;\n targetId: string;\n telemetryContent?: ITelemetryContent;\n toggleNavBar(): void;\n}\n\n/**\n *\n * NavIcon component.\n * @extends {React.PureComponent}\n */\n\n@observer\nexport class NavIcon extends React.PureComponent {\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n constructor(props: INavIconProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return (\n \n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\n ModalBody, ModalHeader, onTelemetryClick, Popover, TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\nimport { IHeaderData } from './header.data';\nimport { IHeaderProps, IHeaderResources, IMyAccountLinksData } from './header.props.autogenerated';\n\nexport interface IHeaderState {\n mobileMenuCollapsed: boolean;\n signinPopoverOpen: boolean;\n hasSigninerror?: boolean;\n}\n\nexport interface IHeaderViewProps extends IHeaderProps, IHeaderState {\n logo: React.ReactNode;\n wishListIconDesktop: React.ReactNode;\n wishListIconMobile: React.ReactNode;\n cartIcon: React.ReactNode;\n navIcon: React.ReactNode;\n className: string;\n menuBar: React.ReactNode[];\n search: React.ReactNode[];\n siteOptions: React.ReactNode[];\n HeaderTag: IModuleProps;\n HeaderContainer: INodeProps;\n MobileMenuContainer: INodeProps;\n MobileMenuHeader: React.ReactNode;\n MobileMenuBodyContainer: INodeProps;\n MobileMenuLinksContainer: INodeProps;\n HeaderTopBarContainer: INodeProps;\n Divider: INodeProps;\n\n AccountInfoDropdownParentContainer?: INodeProps;\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\n accountInfoDropdownButton?: React.ReactNode;\n\n signOutLink?: React.ReactNode;\n signInLink?: React.ReactNode;\n accountLinks?: React.ReactNode[];\n preferredStore?: React.ReactNode;\n}\n\n/**\n *\n * Header component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass Header extends React.PureComponent, IHeaderState> {\n private readonly popOverRef: React.RefObject;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private cart: ICartState | undefined;\n\n @computed public get displayName(): Readonly {\n const customer = this.props.data.accountInformation?.result;\n return customer ? customer.FirstName || customer.Name : undefined;\n }\n\n public constructor(props: IHeaderProps) {\n super(props);\n this.popOverRef = React.createRef();\n this._toggleNavbar = this._toggleNavbar.bind(this);\n this._togglePopover = this._togglePopover.bind(this);\n this._keydown = this._keydown.bind(this);\n this.state = {\n mobileMenuCollapsed: true,\n signinPopoverOpen: false,\n hasSigninerror: false\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('keydown', this._keydown);\n }\n reaction(\n () => this.props.data.cart.result,\n () => {\n this.cart = this.props.data.cart.result;\n }\n );\n\n const {\n context: {\n request: {\n user\n }\n },\n resources: {\n signUpCustomerNotFoundTitle,\n signUpMultipleCustomerFoundTitle,\n closeNotificationLabel\n }\n } = this.props;\n\n const signinNotificationError = this._getSigninNotification(user, signUpMultipleCustomerFoundTitle, signUpCustomerNotFoundTitle);\n if (signinNotificationError !== undefined && this.state.hasSigninerror === false) {\n // For signup show simple error notification.\n NotificationsManager.instance().addNotification(new ErrorNotification(\n signinNotificationError, closeNotificationLabel));\n }\n\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('keydown', this._keydown, false);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n data: { accountInformation,\n wishlists\n },\n context: {\n request: {\n user\n }\n },\n context,\n resources: {\n cartLabel,\n cartQtyLabel\n }\n } = this.props;\n const { logoLink, logoImage, shouldShowWishlistCount } = this.props.config;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- app config is generic\n const disableTooltip = this.props.context.app.config.disableTooltip || false;\n const headerToggleClass = this.state.mobileMenuCollapsed ? '' : 'ms-header-open';\n const headerClassName = classnames('ms-header', this.props.config.className, headerToggleClass);\n const navbarKey = 'header-nav-mobile';\n const customer = accountInformation && accountInformation.result;\n const cartIconSlot = this._getSlot('cartIcon');\n const menuBarSlot = this._getSlot('menuBar');\n const searchSlot = this._getSlot('search');\n let wishlistCount = 0;\n const siteOptionsSlot = this._getSlot('siteOptions');\n const preferredStoreSlot = this._getSlot('storeSelector');\n if (wishlists !== undefined) {\n if (!wishlists.result || !ArrayExtensions.hasElements(wishlists.result) ||\n !wishlists.result[0].CommerceListLines || !ArrayExtensions.hasElements(wishlists.result[0].CommerceListLines)) {\n wishlistCount = 0;\n } else {\n wishlistCount = wishlists.result[0].CommerceListLines.length;\n }\n }\n const viewProps: IHeaderViewProps = {\n ...(this.props as IHeaderProps),\n ...(this.state),\n logo: ,\n wishListIconDesktop: (\n \n ),\n wishListIconMobile: (\n \n ),\n cartIcon: (ArrayExtensions.hasElements(cartIconSlot)) ? cartIconSlot[0] : ,\n navIcon: ,\n menuBar: ArrayExtensions.hasElements(menuBarSlot) ? menuBarSlot : [],\n search: ArrayExtensions.hasElements(searchSlot) ? searchSlot : [],\n siteOptions: ArrayExtensions.hasElements(siteOptionsSlot) ? siteOptionsSlot : [],\n className: headerClassName,\n HeaderTag: {\n moduleProps: this.props,\n className: classnames(headerClassName),\n tag: 'header'\n },\n HeaderContainer: {\n className: classnames('ms-header__container')\n },\n HeaderTopBarContainer: {\n className: classnames('ms-header__topbar')\n },\n Divider: {\n className: classnames('ms-header__divider')\n },\n MobileMenuContainer: {\n tag: Modal,\n id: navbarKey,\n className: 'ms-header__mobile-hamburger',\n isOpen: !this.state.mobileMenuCollapsed,\n wrapClassName: 'ms-header__modal',\n toggle: this._toggleNavbar\n },\n MobileMenuHeader: (\n \n ),\n MobileMenuBodyContainer: {\n tag: ModalBody,\n className: 'ms-header__mobile-hamburger-menu-body'\n },\n MobileMenuLinksContainer: {\n className: 'ms-header__mobile-hamburger-menu-links'\n },\n AccountInfoDropdownParentContainer: {\n className: 'ms-header__account-info'\n },\n AccountInfoDropdownPopoverConentContainer: customer && this.displayName ? {\n tag: Popover,\n id: 'myprofilePopover',\n className: 'ms-header__account-info-content',\n placement: 'bottom',\n isOpen: this.state.signinPopoverOpen,\n target: this.popOverRef,\n toggle: this._togglePopover\n } : undefined,\n signInLink: this._getSigninButton(customer, user, this.props.resources),\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\n accountLinks: this._getAccountLinks(customer),\n preferredStore: ArrayExtensions.hasElements(preferredStoreSlot) &&\n ()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - Link Index.\n * @returns : Void.\n */\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent): void => {\n if (this.props.config.myAccountLinks?.[linkIndex]) {\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\n }\n };\n\n /**\n * Get the slot.\n * @param slotName - Name of the slot.\n * @returns The slot.\n */\n private _getSlot(slotName: string): React.ReactNode[] | null {\n const { slots } = this.props;\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\n }\n\n /**\n * Renders the sign in button.\n * @param customer - Customer object.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSigninButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources):\n React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return !customer && (\n \n \n {resources.signInLinkText}\n \n \n );\n }\n\n /**\n * Renders the sign out button.\n * @param customer - Customer object.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSignOutButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources):\n React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return customer && this.displayName && (\n \n \n {resources.signOutLinkText}\n \n \n );\n }\n\n private _getSigninNotification(user: MsDyn365.IRequestContextUser | undefined,\n signUpMultipleCustomerFoundTitle: string, signUpCustomerNotFoundTitle: string): string | undefined {\n const { signUpCustomerNotFound, signUpMultipleCustomerFound } = this.props.config;\n const notFoundError = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\n const multipleAccountError = 'Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountsFoundWithSameEmailAddress';\n\n if (user?.retailServerErrorCode === notFoundError) {\n return signUpCustomerNotFound !== undefined ? signUpCustomerNotFound : signUpCustomerNotFoundTitle;\n } else if (user?.retailServerErrorCode === multipleAccountError) {\n return signUpMultipleCustomerFound !== undefined ? signUpMultipleCustomerFound : signUpMultipleCustomerFoundTitle;\n }\n return undefined;\n }\n\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return customer && this.displayName && (\n \n \n {this.displayName}\n \n \n );\n }\n\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\n const { myAccountLinks } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n if (!customer || !this.displayName || !myAccountLinks || !ArrayExtensions.hasElements(myAccountLinks)) {\n return undefined;\n }\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\n payLoad.contentAction.etext = cta.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: cta.ariaLabel,\n className: 'ms-signin-info__account-link-button',\n linkText: cta.linkText,\n linkUrl: cta.linkUrl.destinationUrl,\n openInNewTab: cta.openInNewTab,\n role: 'link',\n additionalProperties: attributes\n };\n\n return (\n \n );\n });\n }\n\n private _toggleNavbar(): void {\n this.setState({\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\n });\n }\n\n private _togglePopover(): void {\n this.setState({\n signinPopoverOpen: !this.state.signinPopoverOpen\n });\n }\n\n private _keydown(event: KeyboardEvent): void {\n if (event.keyCode === KeyCodes.Escape) {\n this.setState({ mobileMenuCollapsed: true });\n }\n }\n}\n\nexport default Header;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IItemAddedToCartDialogData, IItemAddedToCartDialogResources, ILinesAddedToCartDialogResources, IOrderTemplateNameDialogResources, ItemAddedToCartDialog } from '@msdyn365-commerce/components';\nimport MsDyn365, { AsyncResult, getUrlSync, IRequestContext } from '@msdyn365-commerce/core';\nimport { getCartState, ICartActionResult } from '@msdyn365-commerce/global-state';\nimport { CartLine, ProductList, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { addCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\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 { IOrderTemplateActionsProps, IOrderTemplateActionsViewProps, IOrderTemplateLineProps, IOrderTemplateLineViewProps, IOrderTemplateTableHeadingProps, OrderTemplateActionsView, OrderTemplateLinesStatusMessage, OrderTemplateLineView, OrderTemplateMobileLineView, OrderTemplateTableHeading } 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';\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 removeProductListLinesAsync({ callerContext: context.actionContext }, productListId!, productListLines)\n .then(() => {\n this.setState({\n userMessage: removeSelectedSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\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 { context, resources } = this.props;\n const { addedToCartFailureMessage, addedToCartSuccessMessage } = resources;\n const lines = this.state.productSelection;\n const cartState = await getCartState(context.actionContext);\n const selectedLines = lines.filter(line => line.isChecked);\n\n if (selectedLines.length > 0) {\n const cartLines = selectedLines.map(productLine => {\n return {\n ItemId: productLine.fullProduct?.ProductDetails.ItemId,\n ProductId: productLine.productListLine.ProductId,\n Quantity: productLine.productListLine.Quantity || 1,\n TrackingId: '',\n UnitOfMeasureSymbol: productLine.productListLine.UnitOfMeasure || productLine.fullProduct?.ProductDetails.DefaultUnitOfMeasure\n } as CartLine;\n }) || [];\n\n return addCartLinesAsync({ callerContext: context.actionContext }, cartState.cart.Id, cartLines, cartState.cart.Version)\n .then(async res => {\n context.telemetry.trace(`Order template; selected line items (${cartLines.map(line => line.ItemId).join(',')}) added to cart: ${cartState.cart.Id}`);\n await cartState.refreshCart({});\n this.setState({\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n })\n .catch(error => {\n context.telemetry.trace('Unable to add order template to cart.');\n this.setState({\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\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 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(() => {\n window.location.reload(false);\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","import React from 'react';\r\nimport {ProductStockStatusEnum} from '../../utilities/productListExtensionHelpers';\r\nimport {translate} from '../../utilities/localisation/translationUtilities';\r\n\r\ninterface IProductStockStatusProps {\r\n availabilityStatus: ProductStockStatusEnum;\r\n locale: string;\r\n}\r\n\r\nexport const ProductStockStatus:React.FC = ({availabilityStatus, locale}) => {\r\n switch (availabilityStatus) {\r\n case ProductStockStatusEnum.ONLINE:\r\n return (\r\n

\r\n \r\n {' '}\r\n {translate(locale, 'product-list.in-stock', 'In Stock Online')}\r\n

\r\n );\r\n case ProductStockStatusEnum.IN_STORE:\r\n return (\r\n <>\r\n

\r\n \r\n {' '}\r\n {translate(locale, 'product-list.out-of-stock' , 'Out of Stock online')}\r\n

\r\n

\r\n {translate(locale, 'product-list.available-in-store', 'Available in select Stores')}\r\n

\r\n \r\n );\r\n case ProductStockStatusEnum.OUT_OF_STOCK:\r\n default:\r\n return (\r\n <>\r\n

\r\n \r\n {' '}\r\n {translate(locale, 'product-list.out-of-stock', 'Out of Stock online')}\r\n

\r\n \r\n );\r\n }\r\n};\r\n","import { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport React, { useMemo } from 'react';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport Bazzarvoice from '../../../../modules/bazzarvoice-widget/components/Bazzarvoice';\r\nimport { widgetType } from '../../../../modules/bazzarvoice-widget/bazzarvoice-widget.props.autogenerated';\r\nimport { ProductStockStatus } from './ProductStockStatus';\r\nimport {\r\n findAllAttributes,\r\n findAttribute,\r\n findAttributeValue,\r\n getProductBadgeUrl,\r\n getProductStockStatus\r\n} from '../../utilities/productListExtensionHelpers';\r\nimport { translate } from '../../utilities/localisation/translationUtilities';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent { }\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst ProductCard: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton\r\n}) => {\r\n const product = data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n const [shouldHidePrice, setShouldHidePrice] = React.useState(null);\r\n let productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, context && context.actionContext, undefined);\r\n if (allowBack) {\r\n productUrl = updateProductUrl(productUrl, context);\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n const baseUrl = context.request.apiSettings.baseImageUrl;\r\n const locale = context.request.locale;\r\n const productBadgeStatus = getProductBadgeUrl(product, locale, baseUrl, '_PLP');\r\n React.useEffect(() => {\r\n const showPriceInCartAttributeArray = findAllAttributes(product.AttributeValues, 'See Price In Cart');\r\n if (showPriceInCartAttributeArray && showPriceInCartAttributeArray.length) {\r\n for (let i = 0; i < showPriceInCartAttributeArray.length; i++) {\r\n // have to find all attributes for this and loop through\r\n const attributeValue = findAttributeValue(showPriceInCartAttributeArray[i]);\r\n if (typeof attributeValue === 'boolean' && attributeValue) {\r\n setShouldHidePrice(true);\r\n break;\r\n }\r\n if (shouldHidePrice === null) {\r\n setShouldHidePrice(false);\r\n }\r\n }\r\n } else {\r\n setShouldHidePrice(false);\r\n }\r\n }, []);\r\n\r\n\r\n const gtmJson = useMemo(() => {\r\n const gtmProduct: any = {\r\n name: product?.Name,\r\n id: product.ItemId,\r\n price: product.Price\r\n };\r\n\r\n // console.log('GTM', gtmProduct);\r\n return JSON.stringify(gtmProduct);\r\n }, [product])\r\n return (\r\n <>\r\n \r\n
\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, product.PrimaryImageUrl, product.Name, context.actionContext.requestContext)}\r\n {productBadgeStatus && {productBadgeStatus.badgeName}}\r\n
\r\n {_renderProductSkuMFR(product)}\r\n
\r\n
{product.Name}
\r\n {renderRating(product)}\r\n {shouldHidePrice === null ? null : renderPrice(context,\r\n typeName,\r\n id,\r\n shouldHidePrice ?\r\n translate(locale, 'product-list.see-price-in-cart', 'See Price In Cart')\r\n : null,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText)}\r\n {renderDescription(product.Description)}\r\n {product.ExtensionProperties?.length ? : null}\r\n
\r\n
\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n \r\n \r\n );\r\n};\r\n\r\nfunction _renderProductSkuMFR(product: ProductSearchResult): JSX.Element {\r\n const mfrAttr = findAttribute(product.AttributeValues, 'MFR');\r\n let mfrValue;\r\n if (mfrAttr) {\r\n mfrValue = findAttributeValue(mfrAttr);\r\n }\r\n return (\r\n

SKU: {product.ItemId} {mfrValue ? `${String.fromCharCode(183)} MFR Code: ${mfrValue}` : null}

\r\n );\r\n}\r\n\r\nfunction renderLabel(name?: string, price?: string, rating?: number, ratingAriaLabel?: string): string {\r\n name = name || '';\r\n price = price || '';\r\n return (`${name} ${price} ${getRatingAriaLabel(rating, ratingAriaLabel)}`);\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return (

\r\n {description}\r\n

);\r\n}\r\n\r\nfunction renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n}\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction updateProductUrl(productUrl: string, context: ICoreContext): string {\r\n const srcUrl = new URL(productUrl, context.request.apiSettings.baseUrl);\r\n const queryString = 'back=true';\r\n if (srcUrl.search) {\r\n srcUrl.search += `&${queryString}`;\r\n } else {\r\n srcUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(srcUrl.href);\r\n return updatedUrl.pathname + srcUrl.search;\r\n}\r\n\r\nfunction renderRating(product?: ProductSearchResult): JSX.Element | null {\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderPrice(context: ICoreContext, typeName: string, id: string,\r\n seePriceInCart?: string | null, basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string, originalPriceText?: string, currentPriceText?: string): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n\r\n if (seePriceInCart) {\r\n return (

{seePriceInCart}

);\r\n }\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, altText?: string, context?: IRequestContext): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings\r\n };\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\n\r\nexport default ProductComponent;","/*--------------------------------------------------------------\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 { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n INodeProps, ITelemetryContent,\r\n Node\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartViewProps, IOrderSummaryErrors } from '../../../modules/cart/./cart';\r\nimport { ICartlinesViewProps } from '../../../modules/cart/./components/cart-line-items';\r\nimport { ICartLineItemViewProps } from '../../../modules/cart/./components/cart-line-items-promotion';\r\nimport { TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { IDictionary } from '@msdyn365-commerce/retail-proxy';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\n\r\n\r\nconst _removeItemFromCartHandler = async (cartlinesToRemove: string[], cartState: ICartState) => {\r\n if (cartState) {\r\n const input = {\r\n cartLineIds: cartlinesToRemove\r\n };\r\n await cartState.removeCartLines(input)\r\n }\r\n};\r\n\r\nconst _renderCustomRemove = (removeButtonText: string,\r\n attributes: IDictionary | undefined,\r\n cartLinesToRemove: string[],\r\n cartState: ICartState,\r\n gtmJson: string | null,\r\n) => (\r\n _removeItemFromCartHandler(cartLinesToRemove, cartState)}\r\n title={removeButtonText}\r\n {...attributes}\r\n >\r\n {removeButtonText}\r\n {gtmJson && (\r\n \r\n )}\r\n \r\n)\r\n\r\nconst _renderCartlines = (\r\n telemetryContent: ITelemetryContent | undefined,\r\n removeButtonText: string,\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean,\r\n cartState: ICartState | undefined\r\n): JSX.Element[] | JSX.Element => {\r\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, telemetryContent!, removeButtonText, '');\r\n const attributes = getTelemetryAttributes(telemetryContent!, payload);\r\n\r\n const getPairedCartLine = (cartLine: ICartlinesViewProps) => {\r\n const extensionProperties = cartState?.cart?.ExtensionProperties;\r\n const cartLinesToRemove: string[] = [cartLine.cartlineId!];\r\n if (extensionProperties && extensionProperties.length) {\r\n const prop = extensionProperties.find(ep => ep.Key === 'linked-' + cartLine.data?.product?.RecordId)\r\n if (prop && cartLines) {\r\n const strValue = prop.Value?.StringValue;\r\n if (strValue) {\r\n const linkedItemId = strValue.split('-')[1];\r\n const linkedCartLine = cartLines.find(cl => cl.data?.product?.RecordId.toString() === linkedItemId)\r\n if (linkedCartLine) {\r\n cartLinesToRemove.push(linkedCartLine.cartlineId!)\r\n }\r\n }\r\n }\r\n }\r\n\r\n return cartLinesToRemove;\r\n }\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus};\r\n }\r\n if (cartLines) {\r\n return cartLines.map(cartLine => {\r\n let product = cartLine.data?.product;\r\n let cartline = cartLine.data?.cartline;\r\n\r\n let gtmJson: string | null = null;\r\n if (product) {\r\n const productInfo = product;\r\n const gtmProduct = {\r\n name: productInfo.Name,\r\n id: productInfo.ItemId,\r\n price: cartline?.ExtendedPrice ?? productInfo.Price,\r\n quantity: cartline?.Quantity ?? 1,\r\n };\r\n\r\n gtmJson = JSON.stringify(gtmProduct);\r\n }\r\n\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n {cartLine.pickUpInStore.defaultComponent}\r\n ) : null}\r\n {cartLine.addToOrderTemplate ? (\r\n \r\n {/*{cartLine.remove}*/}\r\n {cartState && _renderCustomRemove(removeButtonText, attributes, getPairedCartLine(cartLine), cartState, gtmJson)}\r\n {cartLine.addToWishlist}\r\n {cartLine.addToOrderTemplate}\r\n \r\n ) : (\r\n <>\r\n {/*{cartLine.remove}*/}\r\n {cartState && _renderCustomRemove(removeButtonText, attributes, getPairedCartLine(cartLine), cartState, gtmJson)}\r\n {cartLine.addToWishlist}\r\n \r\n )}\r\n
\r\n );\r\n });\r\n }\r\n return cartDataResult ? (\r\n
\r\n

{cartEmptyText}

\r\n {backToShoppingButton}\r\n
\r\n ) : (\r\n <>{waitingComponent}\r\n );\r\n};\r\n\r\n/**\r\n * Method will render error block.\r\n * @param errorData -The order summary errors interface.\r\n * @returns Jsx element.\r\n */\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\r\n return null;\r\n }\r\n return (\r\n \r\n {errorData.header}\r\n {errorData.errors}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render invoice summary lines.\r\n * @param invoiceSummaryLines -The invoicesummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderInvoiceSummarylines = (\r\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!invoiceSummaryLines) {\r\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {invoiceSummaryLines.invoices}\r\n {invoiceSummaryLines.giftCard}\r\n {invoiceSummaryLines.loyalty}\r\n {invoiceSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render order summary lines.\r\n * @param orderSummaryLines -The ordersummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {props.promoCode}\r\n {orderSummaryLines.subtotal}\r\n {orderSummaryLines.shipping}\r\n {orderSummaryLines.otherCharge}\r\n {orderSummaryLines.tax}\r\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n {orderSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cart promotions.\r\n * @param promotions -The cartline item view props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\r\n return (\r\n <>\r\n \r\n {promotions.promotionMessage}\r\n {promotions.promotionSeeAllLink}\r\n {promotions.promotionDialog}\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines group title.\r\n * @param cartLine -The cartline view props.\r\n * @param titleSeparate -The title separate.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n return (\r\n <>\r\n \r\n {isBopisSelected ? (\r\n

\r\n {cartLine.pickUpInStore?.deliveryOption}\r\n {titleSeparate}\r\n {cartLine.pickUpInStore?.orgUnitName}\r\n

\r\n ) : null}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines groups header title.\r\n * @param pickUpText -The pickup text for group.\r\n * @param shippingText -The shipping text for group.\r\n * @param emailShippingText -The email shipping text for group.\r\n * @param titleSeparate -The title separator.\r\n * @param cartLine -The cartline view props.\r\n * @param emailDeliveryModeCode -The email delivery code from channel.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupHeader = (\r\n pickUpText: string,\r\n shippingText: string,\r\n emailShippingText: string,\r\n titleSeparate: string,\r\n cartLine: ICartlinesViewProps,\r\n emailDeliveryModeCode?: string\r\n) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n let groupTitle: string;\r\n\r\n groupTitle = isBopisSelected ? pickUpText : shippingText;\r\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\r\n\r\n return (\r\n <>\r\n
\r\n

\r\n

{groupTitle}

\r\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines in groups.\r\n * @param props -The cartline.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\r\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\r\n return (\r\n
\r\n {props.cartLinesGroup.map(cartlines => {\r\n return (\r\n
\r\n {renderCartLinesGroupHeader(\r\n props.resources.pickUpText,\r\n props.resources.shippingText,\r\n props.resources.emailshippingText,\r\n props.resources.titleSeparate,\r\n cartlines[0],\r\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\r\n )}\r\n {_renderCartlines(\r\n props.telemetryContent,\r\n props.resources.removeCartButtonText,\r\n cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult,\r\n props.data.cart.result\r\n )}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n return props.cartDataResult ? (\r\n
\r\n
\r\n

{props.resources.emptyCartText}

\r\n {props.backToShoppingButton}\r\n
\r\n
\r\n ) : (\r\n <>{props.waitingComponent}\r\n );\r\n};\r\n\r\nconst CartView: React.FC = (props: ICartViewProps) => (\r\n
\r\n {props.title}\r\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\r\n {props.multiplePickUpEnabled ? (\r\n renderCartLinesGroup(props)\r\n ) : (\r\n \r\n {_renderCartlines(\r\n props.telemetryContent,\r\n props.resources.removeCartButtonText,\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult,\r\n props.data.cart.result\r\n )}\r\n \r\n )}\r\n {props.orderSummaryHeading && (\r\n \r\n {props.orderSummaryHeading}\r\n {props.cart?.hasInvoiceLine\r\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\r\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\r\n {_renderErrorBlock(props.OrderSummaryErrors)}\r\n {props.checkoutAsSignInUserButton}\r\n {props.checkoutAsGuestButton}\r\n {props.backToShoppingButton}\r\n {props.createTemplateFromCartButton}\r\n \r\n )}\r\n {props.storeSelector}\r\n
\r\n);\r\n\r\nexport default CartView;\r\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","/*--------------------------------------------------------------\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): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n\n const {\n id,\n showPromotionPopup,\n promotions,\n resources: {\n promotionLinkText,\n promotionPopupHeading\n },\n onCloseButtonClick,\n onSeeAllClick\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n <>\n \n \n {' '}\n {props.resources.promotionStringHeading}\n \n \n ),\n promotionSeeAllLink: (\n \n {' '}\n {promotionLinkText}\n {' '}\n ),\n promotionDialog: (\n \n \n
\n {promotionPopupHeading}\n
\n
\n \n
    \n {promotions.map(_promotion => {\n return (\n
  • \n {_promotion.Promotion?.OfferName}\n {' '}\n
  • \n );\n }\n )}\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 { 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","import {AttributeValue, CommerceProperty, ProductSearchResult} from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport enum ProductStockStatusEnum {\r\n OUT_OF_STOCK,\r\n IN_STORE,\r\n ONLINE\r\n}\r\n\r\nexport interface IProductBadgeStatus {\r\n url: string;\r\n badgeName: string;\r\n}\r\n\r\n/**\r\n * Retrieves attribute from attribute list given the name of the attribute\r\n * @param attributes attribute list\r\n * @param attributeName name of the attribute to find\r\n */\r\nexport const findAttribute = (attributes: AttributeValue[] | undefined, attributeName: string): AttributeValue | undefined => {\r\n if (!attributes) {\r\n return undefined;\r\n }\r\n return attributes.find(attr => attr.Name?.toLowerCase() === attributeName.toLowerCase());\r\n};\r\n\r\nexport const findAllAttributes = (attributes: AttributeValue[] | undefined, attributeName: string): AttributeValue[] => {\r\n if (!attributes) {\r\n return [];\r\n }\r\n return attributes.filter(attr => attr.Name?.toLowerCase() === attributeName.toLowerCase());\r\n};\r\n\r\n/**\r\n * Gets value of given attribute based on its DataTypeValue enum.\r\n * @param attribute attribute to retrieve value from\r\n */\r\nexport const findAttributeValue = (attribute: AttributeValue): string | Date | number | boolean | undefined => {\r\n switch (attribute.DataTypeValue) {\r\n case 1:\r\n return attribute.CurrencyCode;\r\n case 2:\r\n return attribute.DateTimeOffsetValue;\r\n case 3:\r\n return attribute.FloatValue;\r\n case 4:\r\n return attribute.IntegerValue;\r\n case 5:\r\n return attribute.TextValue;\r\n case 6:\r\n return attribute.BooleanValue;\r\n default:\r\n return undefined;\r\n }\r\n};\r\n\r\n/**\r\n * Builds URL to the product badge\r\n * @param locale current locale\r\n * @param badgeName name of the badge\r\n * @param baseUrl base url for images\r\n */\r\nexport const buildProductBadgeUrl = (locale: string, badgeName: string, baseUrl: string, suffix?: string): string => {\r\n return `${baseUrl}Catalogs/${locale}/${badgeName.toLowerCase().replace(/ /g , '_')}_${locale}${suffix || ''}.png`;\r\n};\r\n\r\n/**\r\n * Gets the correct product badge status from the product\r\n * @param product Product to get the badge for\r\n * @param locale current locale\r\n * @param baseUrl image base url\r\n * @returns product badge url\r\n */\r\nexport const getProductBadgeUrl = (product: ProductSearchResult, locale: string, baseUrl: string, suffix?: string): IProductBadgeStatus | null => {\r\n const badgeAttributeArray = findAllAttributes(product.AttributeValues, 'Product Badge Status');\r\n let badgeStatus: IProductBadgeStatus | null = null;\r\n if (badgeAttributeArray) {\r\n badgeAttributeArray.forEach(attr => {\r\n let badgeValue = findAttributeValue(attr);\r\n if (badgeValue && typeof badgeValue === 'string' && badgeValue !== 'None') {\r\n badgeStatus = {url: buildProductBadgeUrl(locale, badgeValue, baseUrl, suffix), badgeName: badgeValue.replace(/_/, ' ')};\r\n }\r\n })\r\n }\r\n if (badgeStatus) {\r\n return badgeStatus;\r\n } else if (product.BasePrice && product.Price !== product.BasePrice) {\r\n return {url: buildProductBadgeUrl(locale, 'on_sale', baseUrl, suffix), badgeName: 'On Sale'};\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * gets product stock status value from extension properties\r\n * @param extensionProperties extension properties from product\r\n */\r\nexport const getProductStockStatus = (extensionProperties: CommerceProperty[]): ProductStockStatusEnum => {\r\n if (extensionProperties?.length) {\r\n const availableProperty = extensionProperties.find(xt => xt.Key === 'AvailabilityStatus');\r\n if (availableProperty && availableProperty.Value && availableProperty.Value.IntegerValue) {\r\n return availableProperty.Value.IntegerValue;\r\n }\r\n }\r\n return ProductStockStatusEnum.OUT_OF_STOCK;\r\n};\r\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 { 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 { 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\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>;\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;\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 foundProductDeliveryOptions?: 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 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 ),\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: foundProductDeliveryOptions,\n pickupDeliveryModeCode: cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\n locationChangedHandler: props.locationChangedHandler\n })\n ) : undefined,\n remove: (\n \n {removeButtonText}\n \n ),\n addToWishlist: (\n isAuthenticated && product && !isCustomPriceSelected ? (\n \n ) : undefined\n ),\n addToOrderTemplate: (\n isAuthenticated && orderTemplates && product ? (\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 === cartline.WarehouseId;\n });\n }\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n * @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 { 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, ITelemetryContent, LabeledDropdown, UncontrolledPagination } 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, parseQueryParam, 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 { 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;\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 public constructor(props: ISearchResultContainerProps, state: ISearchResultContainerState) {\n super(props);\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef();\n this._sortAndFilterContainerRef = React.createRef();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n 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\n // Initalization of list page\n this.props.data.products.then((products) => {\n this.props.data.listPageState.then((listPageState) => {\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n let querySorting: SortColumn[] = [];\n\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\n },\n () => {\n const input = new GetFullProductsByCollectionInput(\n listPageState.pageType,\n this.props.context.request.apiSettings,\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\n listPageState.activeFilters || [],\n +(this.props.context.request.urlTokens.itemId || 0),\n\n this.props.context.request.query && 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 !!(this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes),\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId\n );\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\n listPageState.activeProducts = productResults.products;\n listPageState.totalProductCount = productResults.count;\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\n this._getActivePrice();\n }\n });\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n listPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber ?? this.defaultPageNumber)),\n this.defaultPageNumber)\n },\n count: true, Sorting: listPageState.sortingCritera ?? {}\n },\n listPageState.activeFilters ?? [],\n +(this.props.context.request.urlTokens.itemId ?? 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 getCollectionRefinersAction(refinerInput, this.props.context.actionContext).then((refiners) => {\n this.setState({ refiners });\n }).catch(error => {\n this.props.telemetry.error(error);\n });\n }\n }\n );\n\n });\n });\n\n if (this.props.context.request.query?.productId) {\n this.props.data.featureProduct.then((products) => {\n this.props.data.listPageState.then((listPageStateFeature) => {\n listPageStateFeature.featureProduct = products;\n });\n });\n }\n 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 if (this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\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 { imageSettings, className } = this.props.config;\n const { resources } = this.props;\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\n let errorText = '';\n if (!products || products.length === 0) {\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 && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\n \n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && (\n \n ),\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\n productPrices: this.productPrices\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\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 dropdwonOptions = this.sortByDropdownOptions;\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 dropdwonOptions = this.sortByDropdownOptions.filter((dropdownOption) => dropdownOption.key !== 'AverageRating-Desc');\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={dropdwonOptions}\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 && data.listPageState && data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n const skipCount = listPageState && listPageState.currentPageNumber !== null ? (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) : ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\n const totalItems = listPageState && listPageState.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\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);\n }) : data.refiners.result && data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values);\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 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 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 />\n );\n\n };\n\n private readonly _getProducts = (): JSX.Element => {\n const { imageSettings, allowBackNavigation } = this.props.config;\n const { resources } = this.props;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewslot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview[0];\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={allowBack}\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 { context } = this.props;\n const requestContext = context && context.request;\n const actionContext = context && context.actionContext;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n }\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\n });\n };\n\n private 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 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 { context } = this.props;\n const requestContext = context && context.request;\n const actionContext = context && context.actionContext;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n }\n\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private 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 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 'lg';\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private 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","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { widgetType as WidgetType } from '../bazzarvoice-widget.props.autogenerated';\r\n\r\n// tslint:disable-next-line: no-typeof-undefined\r\nconst IsClientSide = () => !!(typeof window !== 'undefined' && window.document && window.document.createElement);\r\n\r\ntype BazzarvoiceProps = {\r\n productInfo?: ProductSearchResult;\r\n widgetType?: WidgetType;\r\n className?: string;\r\n};\r\n\r\nconst Bazzarvoice = (props: BazzarvoiceProps) => {\r\n const { productInfo, widgetType, className } = props;\r\n\r\n // Bazaarvoice doesn't render on server side\r\n if (!IsClientSide()) {\r\n return null;\r\n }\r\n\r\n const itemId = productInfo?.ItemId;\r\n if (!itemId || !widgetType) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className={`hei-bazzarvoice-widget ${className || ''}`}>\r\n <div data-bv-show={widgetType} data-bv-product-id={itemId} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default Bazzarvoice;\r\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}\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, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, retailMultiplePickUpOptionEnabled?: boolean): IShippingOrderLine => {\n\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\n const emailDeliveryModeCode = channelConfiguration && channelConfiguration.EmailDeliveryModeCode;\n const cartLines = cart.CartLines || [];\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\n\n const freightFee = cart.ShippingChargeAmount;\n const canShip = deliveryModes.some(deliveryMode => (!((deliveryMode !== '' && (deliveryMode === getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) || deliveryMode === emailDeliveryModeCode)))));\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, TaxAmount, DiscountAmountWithoutTax = 0, TotalAmount, OtherChargeAmount } = props.cart;\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(props.cart, props.channelConfiguration, props.channelDeliveryOptionConfig, props.retailMultiplePickUpOptionEnabled);\n const reactNodes: IOrderSummaryLines = {\n subtotal: _buildOrderSummarySection(props, SubtotalAmount, 'sub-total', props.subTotalLabel),\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount : undefined, 'tax-amount', props.taxLabel),\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge: OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount, 'other-charges', props.otherChargeLabel) || undefined\n };\n\n if (canShip) {\n reactNodes.shipping = _buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection({ ...props, freeText: undefined }, totalAmountAfterGiftCard, 'total', props.orderTotalLabel);\n }\n\n if (DiscountAmountWithoutTax > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmountWithoutTax, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\n};\n","/*--------------------------------------------------------------\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 { 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, SimpleProduct } 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 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 products: SimpleProduct[];\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 products: [],\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 try {\n const products = await this.props.data.products;\n if (this._isMounted) {\n this.setState({ products });\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get cart');\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 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\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 })\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 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.state.products,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.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 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 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.state.products,\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 getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\n .then(products => {\n this.setState({ products });\n })\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 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 imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n 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 })\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 { 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 { 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 { 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 { 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 />\n </Module>\n);\n\nexport default CarouselView;\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IBazzarvoiceWidget contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum widgetType {\r\n reviews = 'reviews',\r\n questions = 'questions',\r\n rating_summary = 'rating_summary',\r\n inline_rating = 'inline_rating'\r\n}\r\n\r\nexport interface IBazzarvoiceWidgetConfig extends Msdyn365.IModuleConfig {\r\n widgetType?: widgetType;\r\n}\r\n\r\nexport interface IBazzarvoiceWidgetResources {}\r\n\r\nexport interface IBazzarvoiceWidgetProps<T> extends Msdyn365.IModule<T> {\r\n resources: IBazzarvoiceWidgetResources;\r\n config: IBazzarvoiceWidgetConfig;\r\n}\r\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 { 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 componentDidMount(): void {\n if (this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext.user.isAuthenticated) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data loading.\n this._getActivePrice();\n }\n }\n\n public render(): JSX.Element | null {\n\n // Initiallize 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 { heading, className } = this.props.config;\n const { resources } = this.props;\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 (!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 await this._getProductsDimensionsAvailabilities(products);\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\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 { 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}>\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.backToShoppingButton}\n {props.createTemplateFromCartButton}\n </Node>}\n {props.storeSelector}\n </div>\n);\n\nexport default CartView;\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * ICartIcon containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum cartLinesSortOrder {\r\n ascending = 'ascending',\r\n descending = 'descending'\r\n}\r\n\r\nexport interface ICartIconConfig extends Msdyn365.IModuleConfig {\r\n imageSettings?: Msdyn365.IImageSettings;\r\n enableHoverCart?: boolean;\r\n cartLinesSortOrder?: cartLinesSortOrder;\r\n isAnonymousCheckout?: boolean;\r\n}\r\n\r\nexport interface ICartIconResources {\r\n goToCartButtonTitle: string;\r\n totalPriceFormatString: string;\r\n guestCheckoutButtonTitle: string;\r\n checkoutButtonTitle: string;\r\n productDimensionTypeColor: string;\r\n productDimensionTypeSize: string;\r\n productDimensionTypeStyle: string;\r\n productDimensionTypeConfiguration: string;\r\n quantityDisplayText: string;\r\n removeCartButtonText: string;\r\n cartLabel: string;\r\n cartQtyLabel: string;\r\n flyoutTitle: string;\r\n}\r\n\r\nexport interface ICartIconProps<T> extends Msdyn365.IModule<T> {\r\n resources: ICartIconResources;\r\n config: ICartIconConfig;\r\n}\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 { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n OrgUnitLocation,\r\n ProductAvailableQuantity,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '@msdyn365-commerce-modules/cart';\r\n\r\nexport interface IFlyoutCartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n\r\n /**\r\n * GridSettings for the product image in cartline\r\n */\r\n gridSettings: IGridSettings;\r\n\r\n /**\r\n * ImageSettings for the product image in cartline\r\n */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n maxCartlineQuantity: number;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n\r\n outOfStockThreshold: number;\r\n isStockCheckEnabled: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n}\r\n\r\nexport interface IFlyoutCartLineItemViewProps {\r\n cartline: React.ReactNode;\r\n remove: React.ReactNode;\r\n storeLocation: React.ReactNode;\r\n hasError: boolean;\r\n\r\n data: {\r\n product: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getCartItemAvailableQuantity = (\r\n isStockCheckEnabled: boolean,\r\n outOfStockThreshold: number,\r\n productAvailability?: ProductAvailableQuantity\r\n): number => {\r\n if (isStockCheckEnabled) {\r\n if (\r\n !productAvailability ||\r\n !productAvailability.AvailableQuantity ||\r\n productAvailability.AvailableQuantity <= 0 ||\r\n productAvailability.AvailableQuantity <= outOfStockThreshold\r\n ) {\r\n return 0;\r\n }\r\n return productAvailability.AvailableQuantity - outOfStockThreshold;\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxQuantityByConfig: number,\r\n isStockCheckEnabled: boolean,\r\n availableQuantityInStock: number,\r\n isQuantityLimitsFeatureEnabled: boolean,\r\n maxByQuantityLimitsFeature: number\r\n) => {\r\n if (isQuantityLimitsFeatureEnabled) {\r\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\r\n\r\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\r\n // and consider available qty if stock check enabled and max from config in site settings.\r\n if (!maxByQuantityLimitsFeature) {\r\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\r\n }\r\n\r\n return isStockCheckEnabled\r\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\r\n ? maxByQuantityLimitsFeatureResult\r\n : availableQuantityInStock\r\n : maxByQuantityLimitsFeatureResult;\r\n }\r\n if (isStockCheckEnabled) {\r\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\r\n }\r\n return maxQuantityByConfig;\r\n};\r\n\r\n/**\r\n * On Remove Click functionality.\r\n * @param removeItemClickHandler -Remove item click function.\r\n * @param cartline -CartLine.\r\n * @returns Remove change value.\r\n */\r\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\r\n removeItemClickHandler(cartline);\r\n};\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: IFlyoutCartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: ProductAvailableQuantity,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions\r\n): IFlyoutCartLineItemViewProps => {\r\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText, removeItemClickHandler } = props;\r\n\r\n const availableQuantityInStock = _getCartItemAvailableQuantity(\r\n props.isStockCheckEnabled,\r\n props.outOfStockThreshold,\r\n foundProductAvailability\r\n );\r\n const maxQuantity =\r\n product &&\r\n _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n availableQuantityInStock,\r\n props.isQuantityLimitsFeatureEnabled,\r\n product?.Behavior?.MaximumQuantity || 0\r\n );\r\n\r\n // Check if the product is service or not by product type\r\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\r\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n\r\n return {\r\n data: {\r\n product,\r\n cartline\r\n },\r\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\r\n cartline: (\r\n <CartLineItemComponent\r\n data={{\r\n cartLine: cartline,\r\n product\r\n }}\r\n currentQuantity={cartline.Quantity}\r\n maxQuantity={maxQuantity}\r\n isOutOfStock={!isServiceItem && props.isStockCheckEnabled ? availableQuantityInStock <= 0 : false}\r\n gridSettings={gridSettings}\r\n imageSettings={imageSettings}\r\n id={id}\r\n typeName={typeName}\r\n productUrl={getProductUrlSync(product, props.context.actionContext, undefined)}\r\n context={context}\r\n resources={resources}\r\n key={index}\r\n isQuantityEditable={false}\r\n primaryImageUrl={product.PrimaryImageUrl}\r\n displayMode='COMPACT'\r\n telemetryContent={props.telemetryContent}\r\n channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\r\n />\r\n ),\r\n remove: (\r\n <Button\r\n className='msc-cart-line__remove-item'\r\n onClick={onRemoveClickHandler}\r\n title={removeButtonText}\r\n {...removeCartItemAttribute}\r\n >\r\n {removeButtonText}\r\n </Button>\r\n ),\r\n storeLocation: _renderStoreLocation(cartline, props)\r\n };\r\n};\r\n\r\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\r\n if (cartLine && cartLine.FulfillmentStoreId) {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\r\n\r\n if (orgUnitName) {\r\n return (\r\n <div className='msc-cart-line__bopis-method'>\r\n <span className='pick-up'>{orgUnitName}</span>\r\n </div>\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n }\r\n return fulfillmentStoreId;\r\n};\r\n\r\nconst _assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: IFlyoutCartLineItemsProps\r\n): IFlyoutCartLineItemViewProps[] | null => {\r\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n cartlines.map((cartline, index) => {\r\n let product;\r\n if (props.isQuantityLimitsFeatureEnabled) {\r\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\r\n // to check productId and WarehouseId for identification.\r\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\r\n } else {\r\n product = getProductByProductId(cartline.ProductId, products);\r\n }\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n if (product) {\r\n reactNodes.push(\r\n _assembleNode(\r\n cartline,\r\n product,\r\n props,\r\n index,\r\n foundProductAvailability?.ProductAvailableQuantity,\r\n foundProductDeliveryOption\r\n )\r\n );\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component.\r\n */\r\n\r\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return _assembleCartlines(cartlines, products, props);\r\n};\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 { IActionContext } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ActiveCartProductsInput,\r\n getActiveCartProductsAction,\r\n getAvailabilitiesForCartLineItems,\r\n getDeliveryOptionsForCartLineItems,\r\n IProductInventoryInformation,\r\n ProductAvailabilitiesForCartLineItems,\r\n ProductDeliveryOptionsForCartLineItems\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n * IMiniCartData entity interface.\r\n */\r\nexport interface IMiniCartData {\r\n products?: SimpleProduct[];\r\n productAvailabilites?: IProductInventoryInformation[];\r\n deliveryOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\nexport const createInput = () => {\r\n return new ActiveCartProductsInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a mini cart data.\r\n * @param ctx\r\n * @param cartState\r\n */\r\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise<IMiniCartData> {\r\n const miniCartData: IMiniCartData = {};\r\n\r\n const cart = cartState.cart;\r\n\r\n // If there are cart lines, make call to get products\r\n // If there are invocie linese, then there is no products, so don't make call to get products\r\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\r\n await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\r\n .then(products => {\r\n if (products) {\r\n miniCartData.products = products;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n\r\n await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(availableQuantity => {\r\n if (availableQuantity) {\r\n miniCartData.productAvailabilites = availableQuantity;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n\r\n await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(deliveryOptions => {\r\n if (deliveryOptions) {\r\n miniCartData.deliveryOptions = deliveryOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n }\r\n\r\n return miniCartData;\r\n}\r\n","/*--------------------------------------------------------------\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, CartIconComponent } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { CartLine, ChannelDeliveryOptionConfiguration, LineDataValidationFailure, OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n INodeProps,\r\n ITelemetryContent,\r\n TelemetryConstant,\r\n UncontrolledTooltip\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\n\r\nimport { ICartIconData } from './cart-icon.data';\r\nimport { cartLinesSortOrder, ICartIconProps } from './cart-icon.props.autogenerated';\r\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\r\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\r\n\r\nexport interface IMiniCartState {\r\n miniCartData: IMiniCartData;\r\n orgUnitLocations?: OrgUnitLocation[];\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n isCartValid: boolean;\r\n}\r\n\r\nexport interface ICartIconViewProps extends ICartIconProps<ICartIconData> {\r\n className: string;\r\n cartIcon: React.ReactNode;\r\n FlyoutContainer?: INodeProps;\r\n CartlinesWrapper: INodeProps;\r\n miniCartWrapper: INodeProps;\r\n miniCartItemWrapper: INodeProps;\r\n cartlines?: IFlyoutCartLineItemViewProps[];\r\n flyoutTitle: React.ReactNode;\r\n totalPrice: React.ReactNode;\r\n checkoutAsGuestButton?: React.ReactNode;\r\n checkoutAsSignInUserButton?: React.ReactNode;\r\n goToCartButton?: React.ReactNode;\r\n waitingComponent?: React.ReactNode;\r\n isCartLoading: boolean;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n}\r\n\r\n/**\r\n *\r\n * Cart component.\r\n * @extends {React.PureComponent<ICartProps<ICartData>>}\r\n */\r\n@observer\r\nclass CartIcon extends React.Component<ICartIconProps<ICartIconData>, IMiniCartState> {\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly checkoutBySignInAttributes: IDictionary<string> | undefined;\r\n\r\n private readonly checkoutByGuestAttributes: IDictionary<string> | undefined;\r\n\r\n private readonly viewShoppingBagAttributes: IDictionary<string> | undefined;\r\n\r\n private retailMultiplePickUpOptionEnabled?: boolean = false;\r\n\r\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n private lastValidatedCartVersion: number | undefined;\r\n\r\n constructor(props: ICartIconProps<ICartIconData>) {\r\n super(props);\r\n this.state = {\r\n miniCartData: {},\r\n isCartValid: true,\r\n isQuantityLimitsFeatureEnabled: false\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\r\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n\r\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n\r\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\r\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n }\r\n\r\n public async componentDidMount(): Promise<void> {\r\n const context = this.props.context.actionContext;\r\n\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n this.setState({\r\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\r\n });\r\n }\r\n );\r\n\r\n this.setState({\r\n orgUnitLocations: this.props.data.orgUnitLocations?.result\r\n });\r\n await this._setOrderQuantityLimitsFeatureFlag();\r\n this._validateCart();\r\n }\r\n\r\n public componentDidUpdate(prevProps: ICartIconProps<ICartIconData>): void {\r\n this._validateCart();\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: ICartIconProps<ICartIconData>, nextState: IMiniCartState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n config: { enableHoverCart, isAnonymousCheckout },\r\n context: {\r\n request: {\r\n user: { isAuthenticated, signInUrl }\r\n }\r\n },\r\n context,\r\n resources\r\n } = this.props;\r\n\r\n const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\r\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\r\n const shouldShowMiniCart =\r\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\r\n const hasInvoiceLine = cart?.hasInvoiceLine;\r\n const cartLines = this._getCartLines();\r\n const hasError = !this.state.isCartValid || (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\r\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\r\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\r\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\r\n const flyoutTitle = resources.flyoutTitle;\r\n const flyoutTooltip = {\r\n tag: UncontrolledTooltip,\r\n shouldShowMiniCart,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__flyout-container',\r\n trigger: 'hover',\r\n displayMode: 'FLYOUT',\r\n target: id,\r\n shouldShowCloseButton: true,\r\n cartPageUrl: cartUrl\r\n };\r\n\r\n // If there are invoice lines, don't update mini cart price\r\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\r\n const priceString = price\r\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\r\n : '';\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\r\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\r\n feature => feature.Name === multiplePickupStoreSwitchName\r\n )?.IsEnabled;\r\n\r\n const viewProps = {\r\n ...this.props,\r\n cartIcon: (\r\n <CartIconComponent\r\n cartLabel={resources.cartLabel}\r\n cartQtyLabel={resources.cartQtyLabel}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ cart }}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n ),\r\n cartlines: cartLines,\r\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\r\n CartlinesWrapper: {\r\n className: 'ms-cart-icon__cart-lines'\r\n },\r\n miniCartWrapper: {\r\n className: classnames('ms-cart-icon'),\r\n id: this.props.id\r\n },\r\n miniCartItemWrapper: {\r\n className: classnames('msc-cart-lines-item')\r\n },\r\n\r\n // If there are invoice lines, don't update mini cart checkout button\r\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\r\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\r\n checkoutAsSignInUserButton:\r\n !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\r\n <Button\r\n disabled={hasError}\r\n className='ms-cart-icon__btn-checkout'\r\n href={checkoutURL}\r\n title={resources.checkoutButtonTitle}\r\n {...this.checkoutBySignInAttributes}\r\n >\r\n {resources.checkoutButtonTitle}\r\n </Button>\r\n ) : null,\r\n checkoutAsGuestButton:\r\n isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\r\n <Button\r\n disabled={hasError}\r\n className='ms-cart-icon__btn-guestcheckout'\r\n href={guestCheckoutUrl}\r\n title={resources.guestCheckoutButtonTitle}\r\n {...this.checkoutByGuestAttributes}\r\n >\r\n {resources.guestCheckoutButtonTitle}\r\n </Button>\r\n ) : null,\r\n goToCartButton: (\r\n <Button\r\n className='ms-cart-icon__btn-gotocart'\r\n href={cartUrl}\r\n title={goToCartButtonText}\r\n {...this.viewShoppingBagAttributes}\r\n >\r\n {goToCartButtonText}\r\n </Button>\r\n ),\r\n flyoutTitle: <span className='ms-cart-icon__flyout-title'>{flyoutTitle}</span>,\r\n totalPrice: <div className='ms-cart-icon__subtotal'>{priceString}</div>\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\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 private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\r\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n /**\r\n * Sort cartline items.\r\n * @param cartlines - Cartlines to be sorted.\r\n * @param sortOrder - Ascending or descending.\r\n * @returns - Sorted cartlines.\r\n */\r\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\r\n const lines: CartLine[] = [...cartlines];\r\n const zero: number = 0;\r\n\r\n if (sortOrder === cartLinesSortOrder.descending) {\r\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\r\n }\r\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\r\n };\r\n\r\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\r\n const {\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n const cart = this.props.data.cart && this.props.data.cart.result;\r\n\r\n // Cart-icon could be placed in each page\r\n // so we check cart content to reduce number of RS calls\r\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\r\n ? FlyoutCartLineItems({\r\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\r\n products: this.state.miniCartData.products,\r\n productAvailabilites: this.state.miniCartData.productAvailabilites,\r\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\r\n imageSettings,\r\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: '', // Not used\r\n discountStringText: '', // Not used\r\n originalPriceText: '',\r\n currentPriceText: '',\r\n shippingChargesText: ''\r\n },\r\n telemetry,\r\n removeButtonText: resources.removeCartButtonText,\r\n outOfStockText: '', // Not used\r\n outOfRangeOneText: '', // Not used\r\n outOfRangeFormatText: '', // Not used\r\n cartState: cart,\r\n orgUnitLocations: this.state.orgUnitLocations,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n telemetryContent: this.telemetryContent,\r\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\r\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled\r\n })\r\n : null;\r\n }\r\n\r\n private readonly _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return (\r\n imageSettings || {\r\n viewports: {\r\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\r\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n }\r\n );\r\n };\r\n\r\n private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input).catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n private async _setOrderQuantityLimitsFeatureFlag(): Promise<void> {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n this.setState({ isQuantityLimitsFeatureEnabled: true });\r\n } else {\r\n this.props.data.customerInformation\r\n .then(customerInfo => {\r\n const result =\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\r\n this.setState({ isQuantityLimitsFeatureEnabled: result });\r\n })\r\n .catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport default CartIcon;\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 { 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 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 ...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\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-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {this._renderSwatch()}\n <span className='ms-refine-submenu-item__label'>\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 />\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 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='radio'\n aria-checked={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 { 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, []);\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, catalogId }\n }\n }\n } = this.props;\n const searchCriteriaInput: ProductSearchCriteria = {};\n\n searchCriteriaInput.Context = {\n ChannelId: channelId,\n CatalogId: catalogId\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 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 * 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 { 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 debounce(\n () => {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n },\n 200)();\n }\n );\n } else {\n this.setState(\n { currentInput: currentValue },\n () => {\n debounce(\n () => {\n if (!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue)) {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n\n if (inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\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\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 );\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 { 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 { 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 */\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\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 dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability => ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId)}\n />\n </li>\n ))}\n </ul>\n );\n\n};\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { getUrlSync, IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nexport interface ICartIconData {\r\n cart: ICartState;\r\n}\r\n\r\nexport interface ICartIconComponentProps extends IComponentProps<ICartIconData> {\r\n className?: string;\r\n cartLabel: string;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ICartIconComponent extends IComponent<ICartIconComponentProps> {}\r\n\r\nconst CartIconComponentActions = {};\r\n\r\n/**\r\n *\r\n * CartIcon component\r\n * @extends {React.FC<ICartIconComponentProps>}\r\n */\r\nconst CartIcon: React.FC<ICartIconComponentProps> = observer((props: ICartIconComponentProps) => {\r\n const {\r\n cartLabel,\r\n data: { cart }\r\n } = props;\r\n const cartLink = getUrlSync('cart', props.context.actionContext);\r\n const cartItem = `${cart.totalItemsInCart}`;\r\n const label = format(cartLabel, cartItem) || `Shopping bag, ${cartItem} items`;\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, 'cart-icon', '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n <a\r\n title={label}\r\n className='msc-cart-icon msc-btn'\r\n href={cartLink}\r\n aria-label={label}\r\n {...attributes}\r\n onClick={onTelemetryClick(props.telemetryContent!, payLoad, 'cart-icon')}\r\n >\r\n <div className='msc-cart-icon__count' aria-hidden={true}>\r\n {cartItem}\r\n </div>\r\n </a>\r\n );\r\n});\r\n\r\n// @ts-ignore\r\nexport const CartIconComponent: React.FunctionComponent<ICartIconComponentProps> = msdyn365Commerce.createComponent<ICartIconComponent>(\r\n 'CartIcon',\r\n { component: CartIcon, ...CartIconComponentActions }\r\n);\r\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 { 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 const { selectedChoices } = this.props;\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\n return {\n key: this._getKeyForRefinerValue(selectedRefiner),\n value: selectedRefiner\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly<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 (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 { 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 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, productCountAriaLabel, singleProductCountAriaLabel, isMobile } = this.props;\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\n const refinerValuesList = (productRefinerHierarchy.Values || []);\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n return (\n <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 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","/*--------------------------------------------------------------\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 { CartLine, 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 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 const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions ||\n !props.deliveryOptions.DeliveryOptions ||\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(props.cartline, props.shipitText, props.pickUpInStoreText, props.changeStoreText, props.orgUnitLocations),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\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 { 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 { 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\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 { getPayloadObject, getTelemetryAttributes, getTelemetryObject,\n IModuleProps, INodeProps, isMobile, ITelemetryContent, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { activeImageAdditionalContent,\n ActiveProductComponent,\n IActiveImageAdditionalContentViewProps,\n IArea,\n IAreaMap,\n IImageMapperProps,\n ImageMapper } 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 if (this.props.config.activeImage) {\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 return null;\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 * 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. All rights reserved.\n * See License.txt 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 { ISingleOrderTemplateProps, ISingleOrderTemplateViewProps, OrderTemplateListStatusMessage, OrderTemplateRender } from './components';\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\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(nextProps: IOrderTemplateListProps<IOrderTemplateListData>,\n nextState: IOrderTemplateActionMessageState): 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: <OrderTemplateListStatusMessage errorType='LOADING' text='Loading...' />,\n heading: (\n <Heading\n className='ms-order-template__heading'\n tag={heading?.tag ?? HeadingTag.h2}\n text={orderTemplateListHeading}\n />\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\n className='ms-order-template__heading'\n tag={heading?.tag ?? HeadingTag.h2}\n text={orderTemplateListHeading}\n />\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: (\n <Heading\n className='ms-order-template__heading'\n tag={heading?.tag ?? HeadingTag.h2}\n text={orderTemplateListHeading}\n />\n ),\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>\n {this.state.headerStatusMessage}\n </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 (\n OrderTemplateRender(currentTemplateProps)!\n );\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 }).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}\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 { Module } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISocialShareItemViewProps } from './social-share-item';\n\nexport const SocialShareItemView: React.FC<ISocialShareItemViewProps> = props => {\n const { SocialShareItem, SocialShareItemElement } = props;\n\n if (!SocialShareItemElement) {\n props.context.telemetry.error('Social media is not valid, module wont render');\n return null;\n }\n return (\n <Module {...SocialShareItem}>\n {SocialShareItemElement}\n </Module>\n );\n};\n\nexport default SocialShareItemView;\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 className='ms-ratings-histogram__star'>\n {stars}\n </span>,\n percentage: <span 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","/*--------------------------------------------------------------\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 { 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 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 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","import translations from './translation.json';\r\n\r\nexport const translate = (locale: string, translationPath: string, fallback: string): string => {\r\n try {\r\n let translation = translations[(locale || '').toLowerCase()];\r\n if (!translation) {\r\n translation = translations['en-us'];\r\n }\r\n const splitString = translationPath.split('.');\r\n for (let i = 0; i < splitString.length; i++) {\r\n translation = translation[splitString[i]];\r\n if (!translation) {\r\n break;\r\n }\r\n }\r\n if (translation) {\r\n return translation;\r\n } else {\r\n console.warn(`Translation path [${translationPath}] for [${locale}] missing`);\r\n return translation || fallback;\r\n }\r\n } catch (e) {\r\n console.warn('Translation key missing');\r\n return fallback;\r\n }\r\n};\r\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 * 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 @computed get isPaymentVerificationRedirection(): boolean {\n const { requestFormData, query } = this.props.context.request;\n return !!(requestFormData && query && query.pv === '1');\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.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, ICheckoutDeliveryOptionsError, ICheckoutDeliveryOptionsList, ICheckoutDeliveryOptionsViewProps } from './checkout-delivery-options';\n\nconst DeliveryOptionList: React.FC<ICheckoutDeliveryOptionsList> = ({\n DeliveryOptionsList,\n list\n}) => {\n if (!list || list.length === 0) {\n return null;\n }\n\n return (\n <Node {...DeliveryOptionsList}>\n {list.map((deliveryOption: ICheckoutDeliveryOptionEdit) => {\n return (<Node {...deliveryOption.DeliveryOption} key={deliveryOption.code} 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 ErrorMessage: React.FC<ICheckoutDeliveryOptionsError> = ({\n Error,\n title,\n message\n}) => {\n\n return (\n <Node {...Error}>\n {title}\n {message}\n </Node>\n );\n};\n\nconst CheckoutDeliveryOptionsView: React.FC<ICheckoutDeliveryOptionsViewProps> = props => {\n const { CheckoutDeliveryOptions,\n viewState,\n deliveryOptions,\n deliveryOptionSelected,\n errorMessage,\n waiting,\n saveButton,\n editButton,\n cancelButton } = props;\n\n return (\n\n // TODO: All wrapper div should be provided by viewProps. Once SDK provide the sln, update markup.\n <Module {...CheckoutDeliveryOptions}>\n {viewState.isLoading && waiting}\n {viewState.isError && errorMessage && <ErrorMessage {...errorMessage} />}\n {viewState.isShowList && deliveryOptions && <DeliveryOptionList {...deliveryOptions} />}\n {viewState.isShowSelected && deliveryOptionSelected && <DeliveryOptionSelected {...deliveryOptionSelected} />}\n {viewState.isShowSaveButton && saveButton}\n {viewState.isShowEditButton && editButton}\n {viewState.isShowCancelButton && cancelButton}\n </Module>\n );\n};\n\nexport default CheckoutDeliveryOptionsView;\n","/*--------------------------------------------------------------\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 { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType, createObservableDataAction, IAction, IActionContext, IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\nimport {\n getSearchSuggestionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\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 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 searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: +ctx.requestContext.apiSettings.catalogId\n }\n },\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) => (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, 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.KeyName === '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 } 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\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}\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 return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price:\n item.Id &&\n item.Value3 &&\n item.Value3.Value &&\n item.Value3.Value.DecimalValue &&\n _renderPrice(item.Value3.Value.DecimalValue, item.Value3.Value.DecimalValue, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, 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 />\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='hide'\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, { getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ArrayExtensions, ObjectExtensions } 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 } 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 inputSuggestionType?: ISuggestionTypeCriterionData[];\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 // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n 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 this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public async componentDidMount(): Promise<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.KeyName === '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 }) : 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 /**\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 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 telemetry,\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n this.cancellabelDebounce = debounce(() => {\n this.setState({ isLoadingAutoSuggest: true });\n getSearchSuggestionsAction(\n new AutoSuggestInput(\n query,\n this.topResultsCount,\n this._getSuggestionType(this.inputSuggestionType),\n this.hitPrefix,\n this.hitSuffix\n ),\n context.actionContext\n )\n .then(results => {\n this._getSearchRefiners(query)\n .then(refiners => {\n this.setState({ suggestions: results, searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results), isLoadingAutoSuggest: false });\n })\n .catch(error => {\n this.setState({ suggestions: results, searchRefiners: undefined,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results) });\n telemetry.exception(error);\n telemetry.debug('Unable to get refiners results');\n });\n })\n .catch(error => {\n this.setState({ suggestions: undefined, searchRefiners: undefined,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n telemetry.exception(error);\n telemetry.debug('Unable to get auto suggest results');\n });\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private readonly _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\n if (suggestionTypes && suggestionTypes.length > 0) {\n const distinctSuggestionTypes: string[] = [];\n suggestionTypes && suggestionTypes.forEach((suggestionTypeItem, index) => {\n suggestionTypeItem.SuggestionType && distinctSuggestionTypes.push(suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType.slice(1));\n });\n return distinctSuggestionTypes.join(',');\n }\n return 'Keyword, Product, ScopedCategory';\n };\n\n private async _getSearchRefiners(searchText: string): Promise<ProductRefiner[]> {\n const { actionContext: ctx } = this.props.context;\n return getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: +ctx.requestContext.apiSettings.catalogId\n }\n }\n );\n }\n\n private 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 { 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 { 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":""}