{"version":3,"sources":["webpack:///src/actions/submit-helpfulness-vote.ts?be08","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/actions/inputs/submit-user-review-input.ts?921c","webpack:///src/modules/social-share-item/social-share-item.tsx?e01b","webpack:///./src/modules/citta-search-result-container/components/feature-search-result-item.tsx?c704","webpack:///./src/modules/citta-search-result-container/components/refine-item.tsx?0922","webpack:///src/modules/product-comparison/actions/index.ts?f094","webpack:///src/modules/video-player/components/additional-content.tsx?22a8","webpack:///src/modules/video-player/video-player.tsx?cfb9","webpack:///./src/modules/citta-search-result-container/components/utilities.ts?37d1","webpack:///./src/modules/citta-search-result-container/components/range-refine-item.tsx?0819","webpack:///src/modules/product-comparison/base/product-specification.tsx?6f75","webpack:///src/modules/product-comparison/base/remove-from-comparison-button.tsx?caa4","webpack:///src/modules/search-result-container/components/title.tsx?365d","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/citta-search-result-container/components/link.tsx?7f27","webpack:///src/modules/product-comparison-preview/product-comparison-preview.tsx?b807","webpack:///./src/modules/citta-search-result-container/components/product-search-result-items.tsx?2856","webpack:///src/modules/search-result-container/components/utilities.ts?41e3","webpack:///src/modules/quick-order/quick-order.view.tsx?2242","webpack:///./src/modules/citta-b2b-wishlist-items/citta-b2b-wishlist-items.view.tsx?8250","webpack:///src/modules/ratings-histogram/ratings-histogram.tsx?4c32","webpack:///src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?671e","webpack:///src/modules/wishlist-items/components/wishlist-item.tsx?1fe2","webpack:///src/modules/wishlist-items/components/wishlist-items-status-message.tsx?7062","webpack:///src/modules/wishlist-items/wishlist-items.tsx?3721","webpack:///./src/modules/citta-search-result-container/components/modal.tsx?a3fb","webpack:///src/modules/reviews-list/reviews-list.tsx?b5d0","webpack:///src/modules/search-result-container/search-result-container.tsx?97e0","webpack:///src/common/index.ts?ee63","webpack:///./src/modules/citta-search-result-container/components/refine-submenu.tsx?172f","webpack:///src/modules/search-result-container/components/error-message.tsx?c0c2","webpack:///./src/components/citta-search-result/utilities.ts?cb33","webpack:///./src/components/citta-search-result/range-refine-item.tsx?10eb","webpack:///./src/components/citta-search-result/refine-item.tsx?3ec9","webpack:///./src/components/citta-search-result/refine-submenu.tsx?1667","webpack:///./src/components/citta-search-result/url-utils.ts?ca72","webpack:///./src/components/citta-search-result/citta-refiners.tsx?659a","webpack:///./src/components/citta-picture.tsx?35a7","webpack:///./src/modules/citta-search-result-container/components/product-component.tsx?eb6e","webpack:///./src/modules/citta-search-result-container/citta-search-result-container.view.tsx?cec4","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/citta-search-result-container/components/separator.tsx?4727","webpack:///src/actions/report-review-concern.ts?11eb","webpack:///./src/modules/citta-search-result-container/components/error-message.tsx?4e5a","webpack:///./src/modules/citta-search-result-container/components/title.tsx?fb91","webpack:///src/modules/product-comparison-preview/product-comparison-preview.view.tsx?6cfd","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/search-result-container/components/index.ts?cc7a","webpack:///src/common/review-modal.tsx?7ef9","webpack:///src/modules/search-result-container/components/product-search-result-items.tsx?1766","webpack:///./src/modules/citta-search-result-container/citta-search-result-container.props.autogenerated.ts?e82e","webpack:///./src/modules/citta-search-result-container/citta-search-result-container.tsx?f5a0","webpack:///./src/modules/citta-search-result-container/components/choice-summary.tsx?b1cc","webpack:///src/modules/search-result-container/components/choice-summary.tsx?f4a7","webpack:///src/modules/search/search.view.tsx?e62d","webpack:///src/modules/product-comparison/product-comparison.view.tsx?af5e","webpack:///src/modules/search-result-container/components/refine-submenu.tsx?1e62","webpack:///src/modules/search-result-container/components/separator.tsx?7b76","webpack:///src/modules/reviews-list/index.ts?51cb","webpack:///src/modules/write-review/components/components.tsx?ead4","webpack:///src/modules/write-review/write-review.tsx?dea3","webpack:///./src/modules/citta-search-result-container/components/index.ts?4cab","webpack:///src/modules/product-comparison/product-comparison.tsx?5d0f","webpack:///src/actions/inputs/report-review-concern-input.ts?c9d1","webpack:///src/modules/product-comparison/index.ts?09f2","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/wishlist-items/wishlist-items.view.tsx?caf1","webpack:///src/modules/search-result-container/components/link.tsx?d3ce","webpack:///src/modules/carousel/carousel.tsx?bfbb","webpack:///src/modules/ratings-histogram/ratings-histogram.view.tsx?4481","webpack:///./src/modules/citta-b2b-wishlist-items/components/citta-b2b-wishlist-items-dimensions.tsx?b748","webpack:///./src/modules/citta-b2b-wishlist-items/components/wishlist-item.tsx?738e","webpack:///./src/modules/citta-b2b-wishlist-items/components/citta-b2b-wishlist-items-status-message.tsx?01e9","webpack:///./src/modules/citta-b2b-wishlist-items/citta-b2b-wishlist-items.tsx?80fc","webpack:///src/modules/ratings-histogram/index.ts?834d","webpack:///src/modules/search-result-container/components/modal.tsx?afdd","webpack:///./src/components/price-component.tsx?ebb9","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/actions/submit-user-review.ts?d4c7","webpack:///src/modules/write-review/write-review.view.tsx?9069"],"names":["submitHelpfulnessVoteDataAction","createObservableDataAction","id","action","async","input","ctx","reviewId","length","tenantId","locale","authToken","inputIsValid","Error","requestUrl","serviceEndpoint","requestBody","isHelpful","requestHeader","headers","Authorization","sendRequest","then","response","status","catch","error","trace","telemetry","exception","debug","QuickOrderDrawer","React","constructor","props","super","this","_toggle","bind","isManuallyToggled","state","isOpen","collapseProps","drawerGlyphClass","classnames","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","shouldComponentUpdate","nextProps","nextState","render","_objectSpread","undefined","children","drawerClass","className","Button","Object","assign","toggleButtonProps","onClick","block","disabled","color","_generateDrawerButtonInnerMarkup","Collapse","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","location","glyphClass","e","preventDefault","setState","onToggle","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxChars","maxQuantity","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","addQuantityPlaceholderText","handleQuantityChange","handleInputChange","handleAddToCartClick","onInputChange","event","target","value","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","type","ref","onChange","quantityNode","pattern","maxLength","quantity","placeholder","product","addToCartBtn","userMessage","stateMessage","Alert","statusCssString","messageGlyph","messageText","QuickOrderProduct","cartLine","simpleProduct","isSelected","__decorate","observable","QuickOrderDesktopHeaderCellsComponent","resources","columnWithNumberClassName","createElement","Fragment","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","rowClassName","headerCells","isMobile","defaultImageSettings","viewports","xs","q","w","h","lg","lazyload","cropFocalRegion","QuickOrderTableRowProductImageComponent","_props$context$reques","_props$data$product$P","_props$imageSettings","fallbackImageUrl","getFallbackImageUrl","data","ItemId","context","actionContext","requestContext","apiSettings","request","app","config","OmniChannelMedia","containerClassName","Image","altText","Name","src","PrimaryImageUrl","fallBackSrc","gridSettings","imageSettings","loadFailureBehavior","QuickOrderExtraActionsPopupComponent","productUrl","StringExtensions","isNullOrWhitespace","ObjectExtensions","isNullOrUndefined","RecordId","getProductPageUrlSync","QuickOrderDesktopTableRowCellComponent","_product$Dimensions","_cartLine$LineId","href","Dimensions","map","dimension","_dimension$DimensionV","DimensionValue","Value","filter","dimensionValue","join","quickOrderProductDimensionsSeparator","Price","UnitOfMeasureSymbol","IncrementalQuantity","LineId","max","currentCount","Quantity","inputQuantityAriaLabel","quickOrderInputQuantityAriaLabel","decrementButtonAriaLabel","quickOrderDecrementButtonAriaLabel","incrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","key","isGiftCard","IsGiftCard","TotalAmount","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","format","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","useState","isMobileView","quickOrderProducts","updateViewport","MsDyn365","isBrowser","window","addEventListener","headerClassName","typeName","quickOrderProduct","index","QuickOrder","waitTime","dimensionUpdateQueue","FinitePromiseQueue","dimensions","cssClassNameConfigure","quickOrderCallbacks","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","query","productText","productResponse","productDimensions","inputQuantityText","quantityInput","current","HTMLInputElement","cancellableDebounce","cancel","isQuickOrderFormExpanded","_debounce","getScanResult","GetScanResultInput","channelId","results","Product","ProductDimensionFull","setTimeout","_addItemToCart","cart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","result","_this$props$data$feat","_this$props$data$feat2","_this$props$context$r","_this$props$context$a","isOrderQuantityLimitsFeatureEnabledInHq","featureState","find","IsEnabled","isChannelQuantityLimitsFeatureEnabledInHq","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","deliveryOptions","getDeliveryOptionsAsync","callerContext","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","emailDeliveryModeCode","channel","EmailDeliveryModeCode","defaultDeliveryOption","ArrayExtensions","hasElements","DeliveryOptions","Code","isQuantityLimitsFeatureEnabled","productAvailableQuantity","_updateAvailability","addProductToCartInput","count","enableStockCheck","availableQuantity","ProductAvailableQuantity","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","deliveryMode","addProductToCart","inputProductText","substatus","maxQtyLimitReachedMessage","_getMaxQtyMessage","_result$errorDetails","errorDetails","LocalizedMessage","warning","_getConcatenatedMaxQtyMessage","currentQuantity","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","replace","_handleQuantityChange","currentValue","Number","parseInt","inputElement","isNaN","setAttribute","toString","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_this$state$productRe","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","_updateProductAvailability","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","quickOrderOutofStockErrorMsg","viewport","device","Type","telemetryContent","getTelemetryObject","telemetryPageName","friendlyName","products","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","quickAddQuantityPlaceholderText","productConfigureResources","selectDimensionFormatString","viewProps","quickOrderProps","moduleProps","contentProps","isB2B","drawer","tag","quickOrderForm","quickOrderList","_renderQuickOrderTable","form","configure","getProductConfigure","renderView","_initQuickOrderProducts","_cart$cart$CartLines","CartLines","validValues","tableClassName","productInventoryInfo","_cart$result","maxQuantityForLineItem","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","addedQuantity","item","_item$ItemId","_this$state$productRe2","minInventory","Math","min","computed","SubmitUserReviewInput","productId","userReviewData","authorization","getCacheKey","getCacheObjectType","dataCacheType","SocialShareItem","_getSocialShareItem","viewprops","SocialShareItemElement","icon","socialMedia","SocialMediaComponent","SocialMedia","Facebook","postUrl","document","URL","Twitter","Pinterest","Linkedin","Mail","FeatureSearchResultItem","_ref","productName","productRecordId","fallbackImage","payLoad","getPayloadObject","attribute","getTelemetryAttributes","onTelemetryClick","imageUrl","img","imageProps","renderProductPlacementImage","featureSimilarLooksTitle","title","RefineItem","_onClick","parentProductRefinerHierarchy","productRefinerValue","selectedRefinementCriterion","isSelecting","anchorType","focus","isChecked","_this$props","isDisabled","refineItemCommonProps","attrs","_objectWithoutProperties","_excluded","LeftValueBoundString","JSON","stringify","isSingleSelect","RefinerTypeValue","RefinerType","SingleSelect","itemTypeClassName","inputType","SourceValue","ProductRefinerSource","Rating","contentAction","etext","LeftValueBoundLocalizedString","KeyName","_getRefinerUrl","tabIndex","role","Count","_this$props$selectedR","_productRefinerValue$","refinerRating","ratingRefiner","selectedRefinerValues","DataTypeValue","selectedRating","ratingComponentClass","RatingComponent","avgRating","ratingCount","hideCount","readOnly","ariaLabel","moduleId","moduleTypeName","urlBuilder","getAdditionalContentItems","_item$links","heading","renderHeading","additionalContentHeading","Msdyn365","text","editProps","onEdit","handleAdditionalTextChange","subtext","renderParagraph","additionalContentParagraphText","handleAdditionalParagraphChange","links","ctaLink","renderLinks","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","link","onTextChange","handleAdditionalLinkTextChange","additionalContentItemContainer","additionalContentItemLinks","videoPlayerAdditionalContent","additionalContent","additionalContentNode","additionalContentItems","VideoPlayer","handleTextChange","handleParagraphChange","paragraph","isMobileDevice","variant","VariantType","Viewport","options","video","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","_video$_links","videoId","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","player","Player","playerData","isEditor","params","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainer","detailsContainerCTA","handleText","handleParagraph","handleAdditionalText","handleAdditionalParagraph","handleLink","handleLinkTextChange","handleAdditionalLink","_this$props$config$ad","linkData","attributes","linkId","_heading$tag","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","next","rangeStart","RightValueBoundString","rangeEnd","push","Text","TrueFalse","Values","child","matchingIndex","findIndex","criterion","splice","formatPrice","amount","currency","priceAmount","Intl","NumberFormat","style","currencyDisplay","minimumFractionDigits","RangeRefineItem","_formattedPriceReverseLookup","Map","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","initialMin","initialMax","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","UnitText","rangeType","_renderInputFields","_renderSlider","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onFocus","onBlur","maxLabel","placeholderTextMax","sliderId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","step","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","debounce","handleTooltipText","_changeValue","selectedKey","touchedKey","_getInputWithoutFormatting","currentTarget","selectedMinValue","minTouched","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","selected","touched","validationError","validationErrorRange","has","set","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","getElementById","tooltip","observer","SpecificationDataTypeValues","ProductSpecification","PureComponent","CurrencyValue","CurrencyCode","_product$DateTimeOffs","isFunction","DateTimeOffsetValue","toUTCString","IntegerValue","FloatValue","TextValue","dangerouslySetInnerHTML","getRichTextHtml","_specification$DataTy","specification","none","_renderCurrencyCell","dateTime","_renderDateTimeCell","decimal","_renderDecimalCell","integer","_renderIntegerCell","_renderTextCell","boolean","_renderTrueFalseCell","image","BooleanValue","productComparisonProductItemSpecificationTrue","productComparisonProductItemSpecificationFalse","RemoveFromComparisonButtonFunctionalComponent","useCallback","onClickHandler","itemId","productComparisonRemoveProductFromListAriaLabel","RemoveFromComparisonButtonComponent","Title","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","ReviewCard","cardProps","isUserReview","review","name","userName","rating","date","renderDate","submittedDateTime","reviewTitle","reviewText","ratingHelpfulLabel","wasReviewHelpfulText","like","voteHelpfulButton","dislike","edit","editButton","report","reportToggle","responseName","userResponse","responderName","responseText","responseDate","cardBodyProps","responseProps","reviewProps","controlsProps","headerProps","reviewRatingNarratorText","parentId","parentType","isVoted","isVotedFor","i","votedReviews","approved","isOboRequest","label","yesButtonText","noButtonText","voteCount","helpfulPositive","helpfulNegative","user","onClickMethod","updateReviewHelpfulness","isAuthenticated","signInUrl","toggleWriteReviewModal","editReviewCardText","DateTimeFormat","month","day","year","Date","_unused","toggleReportReviewModal","reportConcernText","reportedReviews","includes","reportedText","reportedReviewId","returnRef","innerRef","ReviewCount","currentPage","reviewsCount","reviewsShownOnEachPage","pageReviewCountText","_getReviewStartNumber","_getReviewEndNumber","PageControls","previousPageClick","_getPreviousPageData","nextPageClick","_getNextPageData","TelemetryConstant","Next","nextAttribute","Previous","previousAttribute","_hasPreviousPage","_paginationAriaLabel","pageReviewAriaLabel","previousButtonText","_hasNextPage","nextButtonText","_getPagesCount","_getReviewsShown","ceil","isNextPage","page","pageModifier","pageReviewCount","updateReviews","selectedSortByOption","selectedFilterByOption","Link","ProductComparisonPreview","_renderGreyPlaceHolders","productData","counts","greyPlaceHoldersCount","displayGreyPlaceHolders","elements","_removeProductFromList","_this$props$data$acco","ProductComparisonState","instance","accountInformation","removeItemById","previousState","_previousState$produc","productsData","_handleCollapseClick","_previousState$isExpa","isExpanded","_hasUserInteractedWithComparison","_clearAllProductsFromTheComparison","_this$props$data$acco2","clearAll","_instanceId","Random","Guid","generateGuid","_displayedInstanceId","componentDidMount","_this$props$data$acco3","_loadProducts","listModifiedEvent","subscribe","instanceId","handler","componentWillUnmount","_this$props$data$acco4","unsubscribe","_this$state$productsD","_this$props$data$prod","collapseButton","_renderCollapseButton","isMainContentReady","hasUserInteractedWithComparison","_getProdutComparisonDataByCatalogId","productsLimit","_getProductsLimit","subheaderText","productComparisonPreviewHeaderTextWithLimit","handleCollapseClick","productsMainInfo","_getProductsMainInfo","previewGreyPlaceHolders","productComparisonLink","getUrlSync","clearAllProductsFromTheComparison","removeProductFromList","goToComparisonButton","_renderGoToComparisonButton","clearAllButton","_renderClearAllButton","_productData$filter","catalogId","getCatalogId","validateCatalogId","_this$props$data$acco5","items","GetProductsInPreviewProductComparisonInput","getProductsInPreviewProductComparisonAction","productDataByCatalogId","_getGreyPlaceHoldersCount","limit","placeHolder","productImageContainerClassName","tableRowClassName","productImageClassName","productNameClassName","productNameLink","msdyn365Commerce","getProductUrlSync","fullUrl","isChannelTypeB2B","searchParams","dimensionName","convertProductDimensionTypeToDimensionTypes","removeFromComparisonButton","productImage","_renderProductImage","productLink","Browser","productComparisonMobileProductsLimit","productComparisonDesktopProductsLimit","_product$PrimaryImage","_getFallbackImageUrl","xl","_this$state$isExpande","shouldBeExpanded","headerContainerClassName","mainContainerClassName","collapseClassName","collapseButtonClassName","footerClassName","productComparisonCompareProductsButtonText","productComparisonClearAllProductsButtonText","headerLabelClassName","ProductSearchResultItems","moduleType","allowBackNavigation","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","renderConfigure","containerProps","dropdowns","Node","renderConfigureDropdown","dropdown","labelContainerProps","errors","select","quickOrderView","Module","renderForm","quickOrderProductContent","quickOrderMsgContent","_renderItem","ProductDimensions","ProductDetails","productPrice","addToCartButton","removeButton","productStatusMessage","entireProductLink","productAriaLabel","inventoryInformation","productUnitOfMeasure","productAttributes","WishlistItemsView","WishlistItems","statusMessage","Products","statusNotExistsMessage","RatingsHistogram","handleHeadingChange","selectFilterBy","ratingsSummary","totalRatingsCount","completeClass","classname","callbacks","histogramItems","HistogramItems","averageRating","averageRatingAriaLabel","averageNumber","AverageRatingNumber","summary","totalReviews","TotalReviews","ratingsSummaryProps","histogramProps","stars","filterKey","update","createRatingsReviewsStateInput","WishlistItemDimension","WishListItemActions","itemKey","handlers","onAddToCart","onRemoveItem","_renderAriaLabel","price","formattedPrice","BasePrice","cultureFormatter","formatCurrency","productDimension","renderProductLink","recordId","productPageUrlWithSwatch","renderInventoryInformationLabel","inventoryInformationLabel","inventoryLabelClassName","inventoryCssName","WishlistItemAddToCartButtonComponent","isInStock","addToCartText","outOfStockText","isServiceItem","ItemTypeValue","ReleasedProductType","Service","addItemAction","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","renderUnitOfMeasure","unitOfMeasure","unitOfMeasureDisplayType","WishlistItem","wishlistState","enableImageProductLink","_context$request$app","_props$product$Dimens","_getFullProductLink","_renderProductDimensions","_renderPrice","DefaultUnitOfMeasure","toggle","onDismiss","PriceComponent","WishlistItemsStatusMessage","errorType","_onDismiss","_renderHeading","productAvailability","addedToCartSuccessMessage","addedToCartFailureMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","_product$Behavior$Min","_product$Behavior","validateQuantity","isQuantityValidationRequired","respectQuantityLimits","Behavior","MinimumQuantity","_await$cart$cart","curQuantity","_getInventoryValueMessage","_result$errorDetails2","isOrderQuantityLimitsFeatureEnabled","_this$props$data$cart","_this$props$data$cart2","validateLimitsPerLine","cartConfiguration","ValidateDefaultOrderSettingsPerLine","_this$props$context","_removeItemFromWishlist","wishlists","noLongerLineExist","userToken","token","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","Id","commerceList","castCommerceList","_getProductsNoLongerExists","_removeNoLongerExistsLines","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","castSimpleProducts","isError","_inventoryLabel","StockLevelLabel","_inventoryClassName","StockLevelCode","toLowerCase","_isProductInStock","productResult","IsProductAvailable","CommerceListLines","foundWishlistItem","commerceListLine","_castCommerceList$Com","noLongerExist","line","emptyWishlistText","wishlistErrorGettingWishlist","noLongerExitsWishlistItemText","errorProps","productsList","emptyViewProps","_renderProductList","_getProductNotExists","emptytext","noLongerExisttext","addToCartButtonText","removeButtonText","currentProductProps","ProductPrice","maxQuantityLimitText","productInventoryCollection","ModalToggle","SearchResultModal","modal","modalNode","modalHeader","modalHeaderNode","modalFooter","modalFooterNode","modalBody","ModalBody","Modal","autoFocus","applicationNode","returnFocusRef","onModalToggle","zIndex","ModalHeader","modalTitle","ModalFooter","modalCloseButtonText","ReviewsList","sortByDropdownOptions","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","reviewsListCallbacks","updateReviewTitle","userReviewTitle","updateReviewText","userReviewText","updateRating","userReviewRating","onReviewSubmitted","isSuccessful","isReviewModalOpen","hasReviewError","submitReview","toggleModal","_toggleReviewModal","updateReviewHelpfulnessVote","toggleReportModal","isReportModalOpen","_onReportModalOpen","_onReportModalClose","reportReview","_reportReviewCallback","updateFilterByDropdown","updateSortByDropdown","reviewsList","pagingInfo","totalItems","listOfReviews","isFilterApplied","reaction","ratingsReviewsState","filterKeyValue","dropdownItemsCount","filterByOption","option","selectedIndex","_userReview","userReview","_reviewCard","_reviewCards","reviewList","reviewElements","isTakenDown","isPublished","_userReportModalToggle","reportingReviewId","_userReviewModal","ReviewModal","onTitleChange","_onTitleChange","_onTextChange","onRatingChange","_onRatingChange","onReviewComplete","_onReviewComplete","renderContextId","_userReviewModalToggle","hasError","modalCSS","isSuccess","_reportReviewModal","ReportReviewModal","reportedKey","onRadioChange","_onRadioChange","_reportReview","hasReportError","reported","ReviewConcernCategory","SpamAdvertising","getAttribute","reportReviewConcern","ReportReviewConcernInput","getRnrPartnerId","getUserToken","getRnrAuthEndpointId","_value","reportedReview","notification","selectedOption","skipItems","getSelectedProductIdFromActionInput","getReviewsForGivenProduct","GetProductReviewsInput","getRnrEndpointId","_updateVoteUi","alreadyExists","list","concat","submitHelpfulnessVote","SubmitHelpfulnessVoteInput","showSpinner","reviewModal","reportReviewModal","filterByDropdown","LabeledDropdown","labelText","filterByDropdownText","dropdownId","dropdownOptions","onSelectOption","controlledByParent","sortByDropdown","sortByDropdownText","reviewCount","refineReviewsProps","reviewsListProps","reviewCards","pageControls","noReviewsMessage","noReviewsWithFilterMessage","noReviewsWithSelectedFilterMessage","sortByOptions","filterByOptions","SearchResultContainer","SearchResultContainer_1","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","_viewport","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","_isMounted","_updateVariantAvailability","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","includeAttributes","_getProductsDimensionsAvailabilities","_updateListPageState","listPageState","_this$props$config$it","_this$props$config$it2","_this$props$context$r2","querySorting","sorting","parse","decodeURIComponent","currentPageNumber","skip","itemsPerPage","sortingCritera","Columns","pageSize","activeProducts","totalProductCount","activeFilters","hydrateRefinersFromUrl","featureProduct","_this$props$data$list","_this$props$data$list2","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","_this$props$context$r3","category","getFriendlyName","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","Separator","separator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","_getAllSortByOptions","hideRating","dropdownOption","SortingContainer","sortByDropDown","labelClassname","sortByDropdownLabel","dropdownClassname","toggleColor","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","skipCount","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","productRefinerHierarchy","RefineSubmenu","_refineItemCommonProps","onUpdateRefiners","_onUpdateRefiners","_buildRefinerUrl","isExpandedOnInitialLoad","productCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","singleProductCountAriaLabel","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","channelInventoryConfigurationId","InventoryProductAttributeRecordId","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","_getChoiceSummary","_this$props$data$refi","selectedRefiners","refinerValueName","ChoiceSummary","classNames","clearAllText","choiceSummaryLabel","closeAriaLabel","selectedChoices","refinerHierarchy","choiceFormat","choiceRangeValueFormat","onChoiceClicked","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","choiceAriaLabel","refinerValues","_getProducts","_this$props$slots","_this$props$data$prod5","shouldAllowBackNavigation","breadCrumbType","breadcrumbType","shouldAllowBack","quickviewSlot","slots","quickview","productComparisonButton","isPriceMinMaxFeatureState","isPriceMinMaxEnabled","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","_this$props$data$list6","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","choiceClicked","selectedRefiner","isClearAll","refinerCount","paginationPreviousText","paginationNextText","_updateViewport","productPrices","pending","validationErrorNotNumber","validationErrorNotRange","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a2","StoreOperationsDataActions","getInventoryConfigurationAsync","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r4","_this$props$context$r5","_this$props$context$r6","newListPageState","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","Recommendation","recommendation","productResults","getCollectionProducts","enableAffiliationBasedPricing","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r7","_this$props$context$r8","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","removeEventListener","_listPageState$result","_listPageState$result2","_this$props$context$r9","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","ErrorMessage","FeatureSearchContainer","similarLookProduct","_getViewport","_onToggleItem","_onToggleSubmenu","expanded","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","prevState","slice","keyId","Single","refinersToBeUpdated","refinersLists","split","refinerName","_refinerName","RangeInput","sortingCriteraValues","sort","a","b","localeCompare","indexOf","compressedRefinerKeys","sortingColumns","compressedRefiners","compressedRefiner","refinerKey","compressRefiners","delete","CittaRefiners","_onClearRefiners","_getSortingRefiner","sortByValues","_sortingCritera$Colum","sortingC","sortBy","DataValueType","RowNumber","_updateDropDown","dropdownOpen","_renderRefiners","expandedMenusOnLoad","refinersHeader","orderedRefiners","refinerCat","hiddenRefinersList","refinersToBeHidden","sortRefiner","submenu","CittaPicture","handleMoveHover","showHoverImg","handleMoveOut","_this$state","image1","image2","img1","img2","onMouseOver","onMouseOut","imageOrientation","onlineTags","salesLineTag","productImage1","productImage2","stockAvailabilities","property","Key","StringValue","_property$Value","_property$Value2","AttributeValues","tagsToIgnore","salesLineTagKey","generateImageUrl","setTelemetryAttribute","pid","pname","mname","productImageSettings","_getLandscapeImageSettings","_renderLabel","AverageRating","toLocaleLowerCase","backgroundColor","_renderProductPlacementImage","savingsText","_renderSalesLineTag","_renderDescription","Description","_renderRating","TotalRatings","_renderAvailabilities","sA","match","ratingLabel","roundedRating","toFixed","description","totalRatings","numRatings","basePrice","adjustedPrice","AdjustedPrice","CustomerContextualPrice","cmsImageSettings","sm","md","disableLazyLoad","getImageOrientation","createSearchResultModal","modalProps","createModalBody","renderRefineMenu","renderCategoryHierarchy","renderTitle","display","SearchResultContainerView","_props$context","renderProducts","SearchState","retrieveItems","content","CarouselView","carouselContainer","renderModuleAttributes","Carousel","closeAnimation","activeIndex","previous","pause","pauseOnHover","ride","autoplay","interval","transitionType","hideFlipper","dismissEnabled","onIndicatorsClickHandler","handleDismissCarousel","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","directionTextPrev","directionTextNext","handleOnExited","handleOnExiting","keyboard","reportReviewConcernDataAction","concernCategory","ProductComparisonPreviewViewFunctionalComponent","_props$isExpanded","_props$productsMainIn","_props$productsMainIn2","productComparisonPreviewHeaderText","info","isRecoSearchPage","renderSort","renderRefiner","renderTitleCount","_props$context$action","VideoPlayerView","detailsContainerCta","_this$props$parentPro","_this$props$parentPro2","productCount","refineMenuItemAriaLabel","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","colorHexCode","SwatchComponent","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","defaultChkProductCount","productCountAriaLabelValue","reportConcernDropdownOptions","SubmitReview","submitReviewAttribute","SuccessButton","successAttribute","Cancel","cancelAttribute","reportSpamText","OffensiveContent","offensiveContentText","Profanity","profanityContentText","header","headerSubmitted","feedbackThankYouText","cancelButton","cancelReportReviewText","submitButton","reportReviewButtonText","succesfulButton","okReportReviewText","reportMessage","reportModalMessage","reportSubmittedMessage","radioButtons","radioPairs","errorMessageText","pairs","inputId","checked","htmlFor","onClickSubmit","onSubmit","submitButtonAttribute","cancelButtonAttribute","discardReviewButtonText","submitDisabled","submitReviewButtonText","ratingsInput","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","autoComplete","inputRow","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","selectRatingAriaLabel","initialRating","selectRatingLabel","reviewTitleMaxLength","reviewTitleAriaLabel","reviewTitleLabel","reviewTextMaxLength","rows","reviewAriaLabel","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","PrivacyPolicy","privacyPolicyAttribute","rel","privacyPolicyTitle","RegExp","trim","onReviewSubmission","userEmail","emailAddress","submitUserReview","firstName","getReviewInput","GetUserReviewInput","getInventoryLabel","inventoryAttribute","priceResources","priceRangeSeparator","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","productRecIds","prod","projectDomain","ChannelId","CatalogId","affliations","customerInput","GetCustomerInput","customer","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","CustomerId","AccountNumber","getActivePricesAsync","activePricesResponse","activePrice","_activePrice$Customer","TradeAgreementPrice","message","all","one","two","three","four","ex","listPageStateFeature","breaCrumbType","innerWidth","closeButtonGlyph","stopPropagation","_getSelectedRefinerChoice","itemClicked","nextItemToFocus","nextSibling","_getKeyForRefinerValue","selectedRefinersMap","clearAllAttributes","listItemProps","overallFormat","rangeFormat","parent","hierarchy","_get","innerText","choice","filterValue","_renderForm","SearchForm","FormWrapper","cancelBtn","submitBtn","_renderKeywordSuggestions","KeywordSuggest","UlKeyword","keywordSuggestions","isLoadingAutoSuggest","isLoadingNode","_renderProductSuggestions","ProductSuggest","UlProduct","productSuggestions","LiProduct","AProduct","_renderCategorySuggestions","CategorySuggest","UlCategory","categorySuggestions","SearchView","Search","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","searchText","AutoSuggest","autosuggestCategory","autosuggestKeyword","autosuggestProduct","renderDynamicHeaderCells","values","headerName","currentClickerPosition","productMainInfo","tableHeaderProps","tabindex","cellContainerProps","renderDynamicCells","hoveringCellItemId","tableCellProps","node","ProductComparisonViewFunctionalComponent","_props$productsMainIn5","_props$dimensionsProp","_props$specifications","_props$productsMainIn8","_props$productsMainIn9","backToShopping","ProductComparison","isEmptyContent","loading","emptyComparison","actionBarContainerProps","tableReference","tableHeaderClassName","tableHeaderReference","shouldShowPreviousClicker","previousClicker","isFromCurrentCatalog","actionsClassName","productRowClassName","quickView","goToProductDetailsButton","shouldShowNextClicker","nextClicker","tableBodyClassName","onScroll","handleScroll","tableBodyReference","_props$productsMainIn3","_props$productsMainIn4","productRating","tableRowContentClassName","productComparisonProductItemRating","tableRowContentInformationClassName","_props$productsMainIn6","_props$productsMainIn7","productDescription","productComparisonProductItemDescription","dimensionsProps","dimensionProps","dimensionsRowClassName","dimensionClassName","productDimensionValues","specificationsProps","specificationProps","isNullOrEmpty","specificationsRowClassName","specificationClassName","specificationValues","productComparisonProductItemSku","productInfo","sliderKey","SignInMessage","SignInButton","SignIn","WriteReview","writeReviewCallbacks","createRef","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","SelectionType","ProductClickerDirections","Component","_clearAllProductsFromComparison","_configureBoxShadowOnScroll","_this$_tableReference","_tableReference","comparisonProductCardHeader","getElementsByClassName","Array","from","documentElement","scrollTop","classList","add","tableHeaderLockedClassName","remove","_handleScroll","_this$_tableHeaderRef","_tableHeaderReference","scrollTo","top","left","scrollLeft","_checkClickersState","_handleScrollClick","direction","_this$_tableBodyRefer","_this$_tableCellRefer","_document$body$parent","tableBody","_tableBodyReference","newLeftPosition","cellWidth","_tableCellReference","clientWidth","_getCellWidth","scrollPosition","minLeftPosition","maxScroll","scrollWidth","body","parentElement","change","hoverStateLastUpdate","now","_handlePreviousClick","_document$body$parent2","right","_handleNextClick","_document$body$parent3","_this$_tableBodyRefer2","floor","_this$_tableBodyRefer3","_document$body$parent4","_shouldShowNextClicker","forceUpdate","_shouldShowPreviousClicker","newClickerPosition","_handleHoverIn","_hoveringCellItemId","_handleHoverOut","_goBack","backToShoppingUrl","referrer","back","specifications","_product$specificatio","specificationsList","allSpecifications","flatten","specificationNames","AttributeValueId","uniqueSpecificationNames","unique","allDimensions","dimensionIds","actionBarClassName","clearAllProductsFromComparison","_renderLoading","_getActionBarContainerProps","_renderPreviousClicker","_renderNextClicker","_renderBackToShoppingButton","emptyComparisonContentSlots","_getProductComparisonDataByCatalogId","cookies","isConsentGiven","productComparisonCountText","productsMainInfoData","allUniqueDimensionIds","getProductsDimensionsIds","updatedDimensionProps","getUpdatedDimensionsProps","tableCellReference","handlePreviousClick","handleNextClick","handleHoverIn","handleHoverOut","uniqueDimensionIds","_getProductsDimensions","uniqueSpecifications","_getProductsSpecifications","_getSpecificationProps","GetProductsInProductComparisonInput","getProductsInProductComparisonAction","_renderQuickView","_product$productInfo$","quickViewSlot","quickViews","selectedDimensions","cloneElement","selectedProductId","_getTableHeaderProps","isHoverModeEnabled","tableHeaderCellClassName","onMouseEnter","onMouseLeave","_getTableCellProps","cellClassName","tableCellClassName","_renderProductRating","_ratingValue$reviewsC","ratingValue","productComparisonProductItemRatingAriaLabel","shouldShowFullRatingDescription","backToShoppingLabel","_getDimensionName","dimensionId","ProductDimensionType","Color","productComparisonProductItemColorDimension","Size","productComparisonProductItemSizeDimension","Style","productComparisonProductItemStyleDimension","dimensionDescription","dimensionSelectionType","dimensionsAsSwatchConfiguration","swatch","renderSwatch","textValue","productsDimension","_productsDimension$di","_productsDimension$di2","dimensionItems","dimensionItem","_dimensionItem$map","currentDimensionId","swatches","swatchItem","_productMainInfo$prod","_swatchItem$Dimension2","_swatchItem$Dimension3","_swatchItem$Dimension4","_swatchItem$Dimension5","_swatchItem$Dimension6","_swatchItem$Dimension7","_swatchItem$Dimension8","_swatchItem$Dimension9","isDefaultDimension","selectedDimension","_swatchItem$Dimension","DimensionId","ColorHexCode","ImageUrl","isDefault","_dimensionItem$Dimens","_dimensionItem$Dimens2","productDimensionSeperatorValue","productDimensionSeparator","_productMainInfo$prod2","productSpecification","productSpecifications","Heading","productComparisonTitle","productComparisonLoadingText","productComparisonClearAllButtonAriaLabel","productComparisonClearAllButtonText","tableClickerClassName","onKeyUp","productComparisonPreviousProduct","productComparisonNextProduct","_renderRemoveFromComparisonButton","currentCatalogId","productUrlLink","_product$productInfo$2","_dimension$DimensionV2","productPriceClassName","cellNewWidth","width","minWidth","maxWidth","productComparisonProductItemFreePrice","productComparisonProductItemOriginalPrice","productComparisonProductItemCurrentPrice","productComparisonGoToProductDetailsButtonText","_renderProductDescription","SocialShareItemView","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","totalCount","percentage","formattedPercent","barItemAriaLabel","starLabel","bar","Progress","buttonProps","_selectedRefinementCr","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","getLabels","getSliderThumbs","_this$props$minValueS","_this$props$maxValueS","String","minValue","maxValue","sliderKeyString","componentDidUpdate","previousProps","updateSliderProps","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","buildReviewCard","createReviewModal","createReportModal","ReviewsListview","CarouselModule","_handleDismissCarousel","dismissCarousel","_next","nextIndex","animating","closeNow","_previous","_onExiting","_onExited","_goToIndex","newIndex","histogramItem","RatingsHistogramView","eoqCount","MultipleOfQuantity","showStrikethroughPricing","originalPrice","getOriginalPrice","renderCurrentPrice","initialPrice","itemProp","returnPrice","renderCurrentPriceWithOriginalPrice","createComponent","component","__assign","featureSimilarDescriptionTitle","SuggestionType","AutoSuggestInput","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","searchCriteria","ProductSearchCriteria","SearchCondition","Context","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","AllSearchResults","getSearchSuggestionsActionDataAction","autoSuggestPromises","inputData","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","reactNodes","_assembleNode","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","queryUrl","categoryRefiners","Category","encodedRefiner","formattedText","FormComponent","searchPlaceholder","hideSearchLabel","searchTextInput","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","inputNode","submitBtnNode","KeywordSuggestionsComponent","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","ProductSuggestionsComponent","productSuggestionHeading","productAutoSuggestionHeading","_item$Value","Value3","DecimalValue","_renderThumbnail","_getLiWrapper","_getAWrapper","recid","_props$resources","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","Spinner","size","SpinnerSize","medium","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","formReference","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","cancellabelDebounce","inputSuggestionType","_loadSuggestions","_handleSubmit","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","route","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","autoSuggestAriaLabel","searchInputMaxLength","searchFormClass","_initSuggestionTypes","_suggestions$AllSearc","_suggestions$AllSearc2","_suggestions$AllSearc3","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","Keyword","None","_item$RefinerRecordId","handleCancelSearchFocused","suggestionTypes","suggestionTypeCriterion","validSuggestions","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","_getSearchRefiners","_getSearchSuggestions","_updateSearchRefiners","suggestionTypeItem","charAt","toUpperCase","ProductsDataActions","getProductSearchRefinersAsync","submitReviewDataAction","WriteReviewView"],"mappings":"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","file":"static/js/6.efc1d20ffdffa7a3ad58.chunk.js","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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= ${input.locale},`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/votes/review/${input.reviewId}` + `?tenantId=${input.tenantId}` + `&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 input && input.reviewId.length > 0 && input.tenantId.length > 0 && input.locale.length > 0 && input.authToken.length > 0;\n}\n\nexport const submitHelpfulnessVoteDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-helpfulness-vote',\n action: >submitHelpfulnessVote\n});\n\nexport default submitHelpfulnessVoteDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport listPageStateAction, { ListPageState, ListPageStateInput } from './modules/search-result-container/list-page-state';\nimport SearchResultContainerModule from './modules/search-result-container/search-result-container';\nimport SearchResultContainerView from './modules/search-result-container/search-result-container.view';\n\nexport * from './modules/search-result-container/components';\nexport * from './modules/search-result-container/list-page-state';\nexport * from './modules/search-result-container/search-result-container';\nexport * from './modules/search-result-container/search-result-container.data';\nexport * from './modules/search-result-container/search-result-container.props.autogenerated';\nexport * from './modules/search-result-container/search-result-container.view';\n\nexport { ListPageState, listPageStateAction, ListPageStateInput, SearchResultContainerModule, SearchResultContainerView };\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n\n if (this.props.animateGlyph) {\n this.drawerOpenGlyph = classnames(\n this.drawerGlyphClass,\n this.props.openGlyph ? this.props.openGlyph : this.props.closeGlyph ? this.props.closeGlyph : ''\n );\n this.drawerCloseGlyph = this.drawerOpenGlyph;\n } else {\n this.drawerOpenGlyph = classnames(this.drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : '');\n this.drawerCloseGlyph = classnames(this.drawerGlyphClass, this.props.closeGlyph ? this.props.closeGlyph : '');\n }\n }\n\n public shouldComponentUpdate(nextProps: IQuickOrderDrawerProps, 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 // eslint-disable-next-line react/no-direct-mutation-state\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(\n 'drawer__buttontext',\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n return (\n <>\n

{this.props.moduleHeadingText}

\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 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.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderState } from '../quick-order';\n\nexport interface IQuickOrderFormProps {\n disableAddtoCart: boolean | undefined;\n productTextInput: React.RefObject;\n quantityTextInput: React.RefObject;\n maxChars: number;\n maxQuantity?: number;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n addQuantityPlaceholderText: string;\n quickOrderState: IQuickOrderState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddToCartClick(): Promise;\n}\n\nexport interface IQuickOrderFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToCartBtn: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Input change value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent) => {\n handleInputChange(event.target.value || '');\n};\n\n/**\n * On Quantity Change functionality.\n * @param handleQuantityChange -Quantity change function.\n * @returns Quantity change value.\n */\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent) => {\n handleQuantityChange(event.target.value || '');\n};\n\nexport const QuickOrderFormComponent = (props: IQuickOrderFormProps): IQuickOrderFormViewProps => {\n const {\n productTextInput,\n quantityTextInput,\n quickOrderState,\n maxChars,\n maxQuantity,\n disableAddtoCart,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n addQuantityPlaceholderText,\n handleQuantityChange,\n handleInputChange,\n handleAddToCartClick\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n const productNode = (\n
\n

\n {ariaLabelProduct}\n

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

\n {ariaLabelQuantity}\n

\n \n
\n );\n\n const addtoCartNode = (\n
\n \n {ariaLabelAddtoCart}\n \n
\n );\n\n const userMessageNode =\n quickOrderState && quickOrderState.stateMessage ? (\n \n \n {quickOrderState.stateMessage.messageText}\n \n ) : (\n undefined\n );\n\n return {\n product: productNode,\n addToCartBtn: addtoCartNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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.\n * All rights reserved. See LICENSE 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 * 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 {resources.quickOrderProductNumberText}\n {resources.quickOrderProductText}\n {resources.quickOrderUnitPriceText}\n {resources.quickOrderUnitOfMeasureText}\n {resources.quickOrderQuantityText}\n {resources.quickOrderTotalText}\n {resources.quickOrderActionsText}\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 {resources.quickOrderProductNumberText}\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 {headerCells}\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 const fallbackImageUrl = getFallbackImageUrl(\n props.data.product.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\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 {product.ItemId}\n \n
\n \n {product.Name}\n \n \n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.quickOrderProductDimensionsSeparator)}\n \n
\n \n {cartLine.Price}\n {cartLine.UnitOfMeasureSymbol}\n \n \n \n {cartLine.TotalAmount}\n \n \n );\n }\n return (\n \n );\n};\n\nconst editButton = (props: IReviewCardProps) => {\n if (props.isUserReview && !isOboRequest(props.context.request)) {\n return (\n \n );\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(\n new Date(date)\n );\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 || isOboRequest(props.context.request)) {\n return undefined;\n } else if (!user.isAuthenticated) {\n return (\n \n );\n }\n\n if (props.reportedReviews.includes(props.review.reviewId!)) {\n return

{props.resources.reportedText}

;\n }\n\n const ref = props.review.reviewId === props.reportedReviewId ? props.returnRef : undefined;\n\n return (\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ILabeledDropdownOption,\n ITelemetryContent,\n TelemetryConstant\n} 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(\n skipItems: number,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ): 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 = (\n pageReviewAriaLabel: string,\n currentPage: number,\n reviewsCount: number,\n reviewsShownOnEachPage: number,\n isNextPage: boolean,\n page?: number\n): 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 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","import * as React from 'react';\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => ( {text} );","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce, { getCatalogId, getUrlSync, IImageSettings, Image, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n getProductUrlSync,\n ObjectExtensions,\n Random,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IModuleProps, isMobile, VariantType, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { RemoveFromComparisonButtonComponent } from '../product-comparison';\nimport { ProductComparisonState } from '../product-comparison-state';\nimport {\n getProductsInPreviewProductComparisonAction,\n GetProductsInPreviewProductComparisonInput,\n IProductComparisonProductData\n} from './actions';\nimport { IProductComparisonPreviewData } from './product-comparison-preview.data';\nimport { IProductComparisonPreviewProps } from './product-comparison-preview.props.autogenerated';\n\n/**\n * Represents product comparison view props for main product info.\n */\nexport interface IProductComparisonPreviewProductMainInfo {\n productData: IProductComparisonProductData;\n productNameLink?: string;\n\n removeFromComparisonButton: React.ReactNode;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n}\n\n/**\n * Represents product comparison view props.\n */\nexport interface IProductComparisonPreviewViewProps extends IProductComparisonPreviewProps<{}> {\n moduleProps: IModuleProps;\n collapseButton: INodeProps;\n isMainContentReady: boolean;\n\n hasUserInteractedWithComparison?: boolean;\n isExpanded?: boolean;\n subheaderText?: string;\n productsMainInfo?: IProductComparisonPreviewProductMainInfo[];\n previewGreyPlaceHolders?: React.ReactNode;\n\n productComparisonLink?: string;\n goToComparisonButton?: React.ReactNode;\n clearAllButton?: React.ReactNode;\n\n handleCollapseClick?(): void;\n clearAllProductsFromTheComparison?(): void;\n removeProductFromList?(itemId: string): void;\n}\n\n/**\n * Extended props for the module including info about the product.\n */\nexport interface IProductComparisonPreviewState {\n isExpanded?: boolean;\n productsData?: IProductComparisonProductData[];\n greyPlaceHoldersCount?: number;\n}\n\n/**\n * Extended props for the module including info about the product.\n */\nexport interface IProductComparisonPreviewFullProps extends IProductComparisonPreviewProps {}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductComparisonPreview extends React.PureComponent {\n public static readonly className = 'ms-product-comparison-preview';\n\n public static readonly containerClassName = `${ProductComparisonPreview.className}__container`;\n\n public static readonly mainContainerClassName = `${ProductComparisonPreview.containerClassName}__main-container`;\n\n public static readonly headerClassName = `${ProductComparisonPreview.mainContainerClassName}__header`;\n\n public static readonly headerLabelClassName = `${ProductComparisonPreview.headerClassName}__label`;\n\n public static readonly tableClassName = `${ProductComparisonPreview.mainContainerClassName}__table`;\n\n public static readonly tableRowClassName = `${ProductComparisonPreview.tableClassName}__product-row`;\n\n public static readonly footerClassName = `${ProductComparisonPreview.mainContainerClassName}__footer`;\n\n public static readonly collapseButtonClassName = `${ProductComparisonPreview.headerClassName}__collapse`;\n\n public static _displayedInstanceId?: string;\n\n private readonly _instanceId: string;\n\n private _hasUserInteractedWithComparison: boolean;\n\n public constructor(props: IProductComparisonPreviewFullProps) {\n super(props);\n\n this.state = {};\n\n this._instanceId = `${ProductComparisonPreview.className}-${this.props.id}-${Random.Guid.generateGuid()}`;\n ProductComparisonPreview._displayedInstanceId = this._instanceId;\n\n this._hasUserInteractedWithComparison = false;\n }\n\n public componentDidMount(): void {\n if (this._instanceId !== ProductComparisonPreview._displayedInstanceId) {\n return;\n }\n\n this._loadProducts();\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).listModifiedEvent.subscribe(\n {\n instanceId: this._instanceId,\n\n /**\n * Updates the state in case the state for the particular product was changed.\n */\n handler: () => {\n this._hasUserInteractedWithComparison = true;\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data downloading.\n this._loadProducts();\n }\n }\n );\n }\n\n public componentWillUnmount(): void {\n ProductComparisonState.instance(\n this.props.context.request,\n this.props.data.accountInformation?.result\n ).listModifiedEvent.unsubscribe(this._instanceId);\n }\n\n public render(): React.ReactNode {\n if (this._instanceId !== ProductComparisonPreview._displayedInstanceId) {\n return null;\n }\n\n const viewProps: IProductComparisonPreviewViewProps = {\n ...this.props,\n moduleProps: {\n moduleProps: this.props,\n className: ProductComparisonPreview.className,\n id: this._instanceId\n },\n collapseButton: this._renderCollapseButton(),\n isMainContentReady: false,\n hasUserInteractedWithComparison: this._hasUserInteractedWithComparison\n };\n\n const productData = this._getProdutComparisonDataByCatalogId(this.state.productsData ?? this.props.data.productsData?.result);\n\n if (!ArrayExtensions.hasElements(productData)) {\n return this.props.renderView(viewProps);\n }\n\n viewProps.isMainContentReady = true;\n\n const productsLimit = this._getProductsLimit();\n if (!ObjectExtensions.isNullOrUndefined(productsLimit)) {\n viewProps.subheaderText = this.props.resources.productComparisonPreviewHeaderTextWithLimit\n .replace('{0}', productData.length.toString())\n .replace('{1}', productsLimit.toString());\n }\n\n viewProps.isExpanded = this.state.isExpanded;\n viewProps.handleCollapseClick = this._handleCollapseClick;\n viewProps.productsMainInfo = this._getProductsMainInfo(productData);\n viewProps.previewGreyPlaceHolders = this._renderGreyPlaceHolders(productData);\n viewProps.productComparisonLink = getUrlSync('product-comparison', this.props.context.actionContext);\n viewProps.clearAllProductsFromTheComparison = this._clearAllProductsFromTheComparison;\n viewProps.removeProductFromList = this._removeProductFromList;\n viewProps.goToComparisonButton = this._renderGoToComparisonButton(viewProps.productComparisonLink);\n viewProps.clearAllButton = this._renderClearAllButton();\n\n return this.props.renderView(viewProps);\n }\n private _getProdutComparisonDataByCatalogId(productData: IProductComparisonProductData[] | undefined): IProductComparisonProductData[] {\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const productByCatalogId = productData?.filter(product => product.catalogId === catalogId) ?? [];\n return productByCatalogId;\n }\n private async _loadProducts(): Promise {\n const items = ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).items;\n const input = new GetProductsInPreviewProductComparisonInput(items);\n const productData = await getProductsInPreviewProductComparisonAction(input, this.props.context.actionContext);\n const productDataByCatalogId = this._getProdutComparisonDataByCatalogId(productData);\n this.setState({ productsData: productDataByCatalogId });\n this._getGreyPlaceHoldersCount(productDataByCatalogId);\n }\n\n private _getGreyPlaceHoldersCount(productData: IProductComparisonProductData[]): number | undefined {\n if (productData && ArrayExtensions.hasElements(productData)) {\n const limit = this._getProductsLimit();\n if (limit && this.props.context.app.config.displayGreyPlaceHolders) {\n const placeHolder = limit - productData.length;\n this.setState({ greyPlaceHoldersCount: placeHolder });\n return placeHolder;\n }\n }\n return;\n }\n\n private _getProductsMainInfo(products: IProductComparisonProductData[]): IProductComparisonPreviewProductMainInfo[] {\n const productImageContainerClassName = `${ProductComparisonPreview.tableRowClassName}__product-image-container`;\n const productImageClassName = `${productImageContainerClassName}__product-image`;\n const productNameClassName = `${ProductComparisonPreview.tableRowClassName}__product-name`;\n\n return products.map(productData => {\n const product = productData.product;\n\n let productNameLink: string | undefined;\n if (msdyn365Commerce.isBrowser) {\n const productUrl = getProductUrlSync(product, this.props.context.actionContext);\n const fullUrl = new URL(productUrl, window.location.href);\n if (isChannelTypeB2B(this.props.context.actionContext.requestContext)) {\n fullUrl.searchParams.set('catalogid', `${productData.catalogId}`);\n }\n product.Dimensions?.map(dimension => {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n });\n productNameLink = fullUrl.href;\n }\n\n return {\n productNameLink,\n productData,\n removeFromComparisonButton: (\n \n ),\n productImage: (\n \n {this._renderProductImage(productImageClassName, productData.product)}\n \n ),\n productLink: (\n \n {productData.product.Name}\n \n )\n };\n });\n }\n\n /**\n * Represents product comparison preview view.\n * @returns Elements.\n */\n private _renderGreyPlaceHolders = (productData: IProductComparisonProductData[]): React.ReactNode[] | undefined => {\n const counts = this.state.greyPlaceHoldersCount;\n if (this.props.context.app.config.displayGreyPlaceHolders && counts! > 0) {\n const elements = [];\n for (let index = 0; index < counts!; index++) {\n elements.push(\n \n
\n \n );\n }\n return elements;\n }\n return;\n };\n\n /**\n * Removes the product from a list.\n * @param itemId - The id of a product to remove.\n */\n private readonly _removeProductFromList = (itemId: string): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).removeItemById(itemId);\n this.setState(previousState => {\n return {\n productsData: previousState.productsData?.filter(item => item.itemId !== itemId)\n };\n });\n };\n\n /**\n * Toggle collapsing.\n */\n private readonly _handleCollapseClick: () => void = () => {\n this.setState(previousState => {\n return {\n isExpanded: !(previousState.isExpanded ?? this._hasUserInteractedWithComparison)\n };\n });\n };\n\n /**\n * Removes all products from the comparison.\n */\n private readonly _clearAllProductsFromTheComparison = () => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).clearAll();\n this.setState({ productsData: [] });\n };\n\n private _getProductsLimit(): number | undefined {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n if (viewport === 'xs' || viewport === 'sm') {\n return this.props.context.app.config.productComparisonMobileProductsLimit;\n }\n return this.props.context.app.config.productComparisonDesktopProductsLimit;\n }\n\n /**\n * Retrieves product image react node.\n * @param className - Class name to use.\n * @param product - Product info.\n * @returns React node.\n */\n private _renderProductImage(className: string, product?: SimpleProduct): React.ReactNode | undefined {\n if (ObjectExtensions.isNullOrUndefined(product)) {\n return undefined;\n }\n\n const defaultImageSettingQ = 'w=140&h=140&m=6';\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: defaultImageSettingQ, w: 0, h: 0 },\n lg: { q: defaultImageSettingQ, w: 0, h: 0 },\n xl: { q: defaultImageSettingQ, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n \n );\n }\n\n private _renderCollapseButton(): INodeProps {\n const shouldBeExpanded = this.state.isExpanded ?? this._hasUserInteractedWithComparison;\n const headerContainerClassName = `${ProductComparisonPreview.mainContainerClassName}__header_button`;\n let collapseClassName = `${ProductComparisonPreview.collapseButtonClassName}__expanded`;\n if (!shouldBeExpanded) {\n collapseClassName = `${ProductComparisonPreview.collapseButtonClassName}__collapsed`;\n }\n\n return {\n className: classnames(headerContainerClassName, ProductComparisonPreview.collapseButtonClassName, collapseClassName),\n onClick: this._handleCollapseClick,\n role: 'button',\n tabIndex: 0\n };\n }\n\n private _renderGoToComparisonButton(productComparisonLink: string | undefined): React.ReactNode {\n return (\n \n {this.props.resources.productComparisonCompareProductsButtonText}\n \n );\n }\n\n private _renderClearAllButton(): React.ReactNode {\n return (\n \n {this.props.resources.productComparisonClearAllProductsButtonText}\n \n );\n }\n}\n\nexport default ProductComparisonPreview;\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICittaSearchResultContainerResources } from '../citta-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: ICittaSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent\r\n}) => {\r\n\r\n return (\r\n\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n \r\n
  • \r\n ))}\r\n
\r\n );\r\n\r\n};","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 * 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 * 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 * 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 (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function 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((refinementCriterion: ProductRefinerValue) =>\n 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(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n (isRangeType(refinementCriterion.DataTypeValue) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): 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:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n selectedCriterion.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\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:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\n ) {\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) =>\n isMatchingRefinementCriterion(child, criterion)\n );\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\n): 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.\n * All rights reserved. See LICENSE 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 {dropdowns.map(renderConfigureDropdown)};\n }\n return null;\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 {heading}\n {errors}\n {select}\n \n );\n};\n\nconst renderForm = (\n form: IQuickOrderFormViewProps,\n isMobileView: boolean,\n quickOrderForm: INodeProps,\n quickOrderProductContent: INodeProps,\n quickOrderMsgContent: INodeProps,\n configure?: IProductDimensionConfigureViewProps\n) => {\n return isMobileView ? (\n \n \n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.userMessage}\n {form.addToCartBtn}\n \n \n ) : (\n \n {form.userMessage}\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 quickOrderProps,\n contentProps,\n form,\n quickOrderForm,\n drawer,\n configure,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n quickOrderList,\n isMobileView\n } = props;\n\n return (\n \n \n \n {renderForm(\n form as IQuickOrderFormViewProps,\n isMobileView,\n quickOrderForm,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n configure\n )}\n \n \n\n {quickOrderList}\n \n );\n};\nexport default quickOrderView;\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\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n INodeProps,\r\n ITelemetryContent,\r\n Module,\r\n Node\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IWishlistItemViewProps } from '@msdyn365-commerce-modules/wishlist';\r\nimport { IWishlistItemsViewProps } from './citta-b2b-wishlist-items';\r\n\r\nconst WishlistItemsView: React.FC = props => {\r\n const {\r\n WishlistItems,\r\n status,\r\n statusMessage,\r\n heading,\r\n Products,\r\n products,\r\n Product,\r\n ProductDetails,\r\n ProductDimensions,\r\n telemetryContent,\r\n statusNotExistsMessage\r\n } = props;\r\n\r\n return (\r\n \r\n {heading}\r\n {statusNotExistsMessage}\r\n {status !== 'SUCCESS' && statusMessage}\r\n {Products && products && products.length > 0 && (\r\n \r\n {products &&\r\n products.map(product => {\r\n return product && _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\r\n })}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst _renderItem = (\r\n product: IWishlistItemViewProps,\r\n Product?: INodeProps,\r\n ProductDimensions?: INodeProps,\r\n ProductDetails?: INodeProps,\r\n telemetryContent?: ITelemetryContent\r\n): JSX.Element | null => {\r\n const {\r\n key,\r\n productImage,\r\n productLink,\r\n productPrice,\r\n productDimensions,\r\n addToCartButton,\r\n removeButton,\r\n productStatusMessage,\r\n entireProductLink,\r\n productName,\r\n productAriaLabel,\r\n inventoryInformation,\r\n productUnitOfMeasure\r\n } = product;\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\r\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\r\n if (entireProductLink) {\r\n return (\r\n \r\n \r\n {productImage}\r\n {productName}\r\n {productDimensions && ProductDimensions && (\r\n \r\n {productDimensions.map(dimension => {\r\n return dimension;\r\n })}\r\n \r\n )}\r\n {productPrice}\r\n {productUnitOfMeasure}\r\n \r\n {inventoryInformation}\r\n {addToCartButton}\r\n {removeButton}\r\n {productStatusMessage}\r\n \r\n );\r\n }\r\n return (\r\n \r\n {productImage}\r\n {productLink}\r\n {productDimensions && ProductDimensions && (\r\n \r\n {productDimensions.map(dimension => {\r\n return dimension;\r\n })}\r\n \r\n )}\r\n {productPrice}\r\n {addToCartButton}\r\n {removeButton}\r\n {productStatusMessage}\r\n \r\n );\r\n};\r\n\r\nexport default WishlistItemsView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 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 {\n ratingsSummary: { result: ratingsSummary }\n } = 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\n ? HistogramItems({\n ratingsSummary,\n resources: { ...resources },\n locale: this.props.context.request.locale,\n onClick: this.selectFilterBy\n })\n : [],\n averageRating: ratingsSummary && (\n \n ),\n averageNumber: ratingsSummary && ,\n totalReviews: ratingsSummary && ,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\n \n ),\n histogramProps: { className: 'ms-ratings-histogram__histogram' }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({ filterKey }), { filterKey });\n }\n}\n\nexport default RatingsHistogram;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC = ({ key, className, dimensionType, dimensionValue }) => (\n
\n {dimensionType}:\n {dimensionValue}\n
\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n CommerceListLine,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext>;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nconst _getFullProductLink = (props: IWishlistItemProps): string => {\n if (!msdyn365Commerce.isBrowser) {\n return '';\n }\n\n const fullUrl = new URL(props.productUrl, window.location.href);\n for (const dimension of props.product.Dimensions ?? []) {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n }\n return fullUrl.href;\n // return updateProductUrl(productUrl, context, swatch);\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice =\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 3:\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 4:\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n default:\n return '';\n }\n });\n }\n\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\n};\n\n/**\n * Renders a link to a product based on the given props.\n * @param input - Wishlist item props with the info about the product.\n * @param productUrl - The url to the product.\n * @returns React component with a link to a product.\n */\nconst renderProductLink = (input: IWishlistItemProps, productUrl: string) => {\n const { telemetryContent } = input;\n const { RecordId: recordId, Name: productName } = input.product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPageUrlWithSwatch = productUrl;\n return (\n !StringExtensions.isNullOrWhitespace(productPageUrlWithSwatch) && (\n \n {productName}\n \n )\n );\n};\n\n/**\n * Renders a product name box.\n * @param productName - The text to display.\n * @returns React component with a name of a product.\n */\nconst renderProductName = (productName: string) => {\n return
{productName}
;\n};\n\n/**\n * Renders inventory information.\n * @param inventoryInformationLabel - The text to display.\n * @param inventoryLabelClassName - The component class name.\n * @returns React component.\n */\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\n const inventoryCssName = inventoryLabelClassName\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\n : 'ms-wishlist-items__inventory-label';\n return (\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\n {inventoryInformationLabel}\n )\n );\n};\n\n/**\n * Renders add to cart button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\n const { isInStock, addToCartText, outOfStockText } = input;\n\n // Check if the product is service or not by product type.\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n const addItemAction = React.useCallback(() => {\n WishListItemActions.addToCart(input);\n }, [input]);\n\n return (\n \n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n \n );\n};\n\n/**\n * Renders remove from wishlist button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\n const { removeFromWishlistText } = input;\n\n const removeItemAction = React.useCallback(() => {\n WishListItemActions.removeItem(input);\n }, [input]);\n\n return ;\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps):ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n {props.resources.modalTitle}\r\n \r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 {\n getRnrAuthEndpointId,\n getRnrEndpointId,\n getRnrPartnerId,\n getSelectedProductIdFromActionInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n LabeledDropdown\n} 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(\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: Msdyn365.ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n ): 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(\n skipItems: number,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ): 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 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 // @ts-expect-error\n toggleModal: this._toggleReviewModal,\n // @ts-expect-error\n updateReviewHelpfulnessVote: this.updateReviewHelpfulnessVote,\n toggleReportModal: (reviewId: string): void => {\n this.state.isReportModalOpen ? this._onReportModalOpen(reviewId) : this._onReportModalClose();\n },\n // @ts-expect-error\n reportReview: this._reportReviewCallback,\n // @ts-expect-error\n updateFilterByDropdown: this.updateFilterByDropdown,\n // @ts-expect-error\n updateSortByDropdown: this.updateSortByDropdown,\n // @ts-expect-error\n updateReviews: this.updateReviews\n };\n constructor(props: IReviewsListProps) {\n super(props);\n const {\n userReview: { result: userReview }\n } = 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(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public shouldComponentUpdate(nextProps: IReviewsListProps, nextState: IReviewsListState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\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 (filterKey && !isNaN(filterKeyValue) && filterKeyValue < dropdownItemsCount) {\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 public render(): JSX.Element | null {\n const { className, heading, reviewsShownOnEachPage } = this.props.config;\n const { currentPage, reviewsCount, selectedFilterByOption, selectedSortByOption } = this.state;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = 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 \n ),\n averageRating: ratingsSummary && (\n \n ),\n reviewCount: (\n \n ),\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 ),\n noReviewsMessage: (\n \n {resources.noReviewsMessage}\n \n ),\n noReviewsWithFilterMessage: (\n \n {resources.noReviewsWithSelectedFilterMessage}\n \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 public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\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 modalCSS: 'ms-reviews-list'\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 } 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({\n isReportModalOpen: true,\n reportingReviewId: reviewId,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising\n });\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 )\n .then((_value: boolean) => {\n const reportedReview = this.state.reportedReviews;\n reportedReview.push(reviewId);\n this.setState({ reported: true, reportedReviews: reportedReview, hasReportError: false });\n })\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 // 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 )\n .then(() => {\n this._updateVoteUi(reviewId, isHelpful);\n })\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\nexport default ReviewsList;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CategoryHierarchy as CategoryHierarchyData,\n IProductRefinerHierarchy,\n IProductsDimensionsAvailabilities\n} from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport {\n ChannelInventoryConfiguration,\n format,\n ProductPrice,\n ProductRefinerValue,\n SortColumn,\n StoreOperationsDataActions,\n TextValueTranslation\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n LabeledDropdown,\n UncontrolledPagination,\n VariantType\n} 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 {\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n parseQueryParam,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n} from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage,\n FeatureSearchResultItem,\n getUpdatedRefinementCriteria,\n IChoiceSummaryClickNotification,\n IRefineItemCommonProps,\n IRefineItemToggleNotification,\n ISearchResultModalViewProps,\n isMatchingRefinementCriterion,\n Link,\n ModalToggle,\n ProductSearchResultItems,\n SearchResultModal,\n Separator,\n Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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 channelInventoryConfiguration?: ChannelInventoryConfiguration;\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<\n ISearchResultContainerProps,\n ISearchResultContainerState\n> {\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject;\n\n private readonly _sortAndFilterContainerRef: React.RefObject;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n private isListPageStateUpdated: boolean = false;\n\n private _isMounted: boolean = false;\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 constructor(props: ISearchResultContainerProps, state: ISearchResultContainerState) {\n super(props);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef();\n this._sortAndFilterContainerRef = React.createRef();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n refiners: [],\n channelInventoryConfiguration: undefined\n };\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = 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(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n }\n public async componentDidMount(): Promise {\n this._isMounted = true;\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n const listPageState = await this.props.data.listPageState;\n const products = await this.props.data.products;\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\n callerContext: this.props.context.actionContext\n });\n if (this._isMounted) {\n this.setState({ channelInventoryConfiguration });\n }\n\n this._updateListPageState(listPageState, products);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [\n listPageState.activeFilters?.length,\n listPageState.currentPageNumber,\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\n ];\n },\n async () => {\n const newListPageState = await this.props.data.listPageState;\n const input = new GetFullProductsByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : JSON.stringify({\n ProductId: this.props.context.request.query?.productId,\n Recommendation: this.props.context.request.query?.recommendation\n }),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\n !!this.props?.config?.includeAttributes,\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\n newListPageState.totalProductCount = productResults.count;\n newListPageState.activeProducts = productResults.products;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\n if (\n this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n await this._updateVariantAvailability();\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\n this.defaultPageNumber\n )\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\n this.setState({ refiners });\n }\n }\n );\n\n if (\n this.props.config.enableAffiliationBasedPricing &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n await this._updateVariantAvailability();\n }\n\n public componentWillUnmount(): void {\n this._isMounted = false;\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { imageSettings, className },\n resources,\n data: { listPageState, products: productCollection, featureProduct }\n } = this.props;\n\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\n this._updateListPageState(listPageState.result, productCollection.result);\n this.isListPageStateUpdated = true;\n }\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\n let errorText = '';\n if (!ArrayExtensions.hasElements(products)) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n }\n const productsComponent = this._getProducts();\n const featureComponent = (\n \n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle:\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\n \n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && ,\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: searchProduct ? featureComponent : null,\n productPrices: this.productPrices,\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Get products variants dimension availabilities.\n * @returns Void.\n */\n private readonly _updateVariantAvailability = async (): Promise => {\n const context = this.props.context as ICoreContext;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes\n ) {\n await this._getProductsDimensionsAvailabilities();\n }\n };\n\n /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (this.props.context.request.query?.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber =\n (this.props.context.request.query &&\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\n 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request) || [];\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n productsList,\n this.props.context as ICoreContext,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\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\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 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 =\n (data.category.result &&\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name) ||\n this.props.context.request.query?.title ||\n '';\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 =\n productCountNumber !== 1\n ? format(this.props.resources.numberOfProducts, productCountNumber)\n : 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 private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy &&\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\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 private readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={dropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />\n );\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown: dropdown\n };\n };\n\n private readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = listPageState?.currentPageNumber\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.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\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 =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\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 // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\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(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\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 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 }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</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'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\n );\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './review-modal';\nexport * from './rnrInterface';\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {IAny, ICoreContext, IGeneric} from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n // if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\r\n return null;\r\n }\r\n return (\r\n <div className={`ms-refine-submenu list-group ${productRefinerHierarchy.KeyName}`}>\r\n <Button\r\n className={this.state.expanded? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label= {productRefinerHierarchy.KeyName || 'refiner.Name'}\r\n onClick={this._onToggleSubmenu}\r\n aria-expanded={this.state.expanded}\r\n >\r\n {productRefinerHierarchy.KeyName}\r\n </Button>\r\n <Collapse isOpen={this.state.expanded} timeout={350}>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue => refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index= {index}\r\n context = {context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n />\r\n );\r\n });\r\n return (\r\n <ul className= {`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`} {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>{listItems}</ul>;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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","import { IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Types of product refiner values\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n */\r\nexport const enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (refinementCriterion.DataTypeValue === ProductRefinerValueDataTypeValue.Range ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List || itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}","import { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\r\n private _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private minInput: React.RefObject<HTMLInputElement>;\r\n private maxInput: React.RefObject<HTMLInputElement>;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef<HTMLInputElement>();\r\n this.maxInput = React.createRef<HTMLInputElement>();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n const initialMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\r\n <label className={minLabelClassName}>\r\n {refineItemCommonProps.minLabel}\r\n <input\r\n className={minInputClassName}\r\n onChange={this._changeMin}\r\n onFocus={this._changeMin}\r\n onBlur={this._finishChangeMin}\r\n value={formattedSelectedMin}\r\n ref={this.minInput}\r\n />\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel}\r\n <input\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._changeMax}\r\n onFocus={this._changeMax}\r\n onBlur={this._finishChangeMax}\r\n value={formattedSelectedMax}\r\n ref={this.maxInput}\r\n />\r\n </label>\r\n {validationErrorMin &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>{validationErrorMin}</span>\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>{validationErrorMax}</span>\r\n }\r\n </form>\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\r\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n\r\n return (\r\n <Slider\r\n className={'ms-refine-submenu__range-refiner'}\r\n key={sliderId}\r\n id={sliderId}\r\n inForm={false}\r\n min={min && Number(min) || undefined}\r\n max={max && Number(max) || undefined}\r\n step={1}\r\n orientation={'horizontal'}\r\n labels={[\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]}\r\n showLabels={true}\r\n showTooltip={true}\r\n sliderThumbs={[\r\n {\r\n id: `${sliderId}_slider_thumb_start`,\r\n value: selectedMin && Number(selectedMin) || 0,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]}\r\n onChangeEnd={this._onRangeUpdateEnd}\r\n onChange={debounce(this._onRangeUpdate, 500)}\r\n handleTooltipText={this._handleRangeTooltipText}\r\n {...ariaAttributes}\r\n />\r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n if (this.props.productRefinerValue!.LeftValueBoundString === '0' && this.props.productRefinerValue!.RightValueBoundString === '0') {\r\n return result.slice(2);\r\n }\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // tslint:disable-next-line:no-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(sliderChangeNotification.id);\r\n if (!!element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n },\r\n 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}","import { IRefineItemCommonProps, IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n keyId: number;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\r\n private anchorType: React.RefObject<HTMLAnchorElement>;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n // @ts-ignore\r\n children,\r\n onToggle,\r\n context,\r\n keyId,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const role = isSingleSelect ? 'radio' : undefined;\r\n itemTypeClassName = !!selectedRefinementCriterion ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role='radio'\r\n aria-checked='false'\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n >\r\n <a\r\n href={this._getRefinerUrl()}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n onClick={this._onClick}\r\n >\r\n <RatingComponent\r\n avgRating={parseInt(productRefinerValue.LeftValueBoundString, 10)}\r\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ? productRefinerValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString}\r\n hideCount={false}\r\n readOnly={true}\r\n ariaLabel=''\r\n context={context}\r\n id={this.props.moduleId}\r\n typeName={this.props.moduleTypeName}\r\n data={{}}\r\n />\r\n <span className='refine-submenu-item__rating'>{productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}</span>\r\n </a>\r\n </li>\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n return (\r\n <li className='ms-refine-submenu-item' role={role} id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundString}_${keyId}`}>\r\n <a\r\n key={!!selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={0}\r\n onClick={this._onClick}\r\n className={itemTypeClassName}\r\n role={inputType}\r\n aria-checked={!!selectedRefinementCriterion}\r\n {...attrs}\r\n >\r\n <span className='checkmark'/>\r\n <span className='ms-refine-submenu-item__label'>\r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n }\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { findMatchingRefinementCriterion, IRefineItemCommonProps, IRefineItemToggleNotification, RangeRefineItemType } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button, Collapse } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport RangeRefineItem from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n sortingCriteraValues?: string[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n refinersToBeUpdated: string;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n let isExpanded = this.props.isExpandedOnInitialLoad;\r\n if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n isExpanded = true;\r\n }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps, refinersToBeUpdated } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n const refinersLists = refinersToBeUpdated && refinersToBeUpdated.split(',');\r\n let refinerName = productRefinerHierarchy.KeyName || '';\r\n refinersLists && refinersLists.map((refiners: string) => {\r\n if (refiners.split('|').length > 1 && refiners.split('|')[0].toLowerCase() === refinerName?.toLowerCase()) {\r\n refinerName = refiners.split('|')[1] && refiners.split('|')[1] || refinerName;\r\n }\r\n });\r\n\r\n return (\r\n <div className='ms-refine-submenu list-group'>\r\n <Button\r\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label={refinerName || 'refiner.Name'}\r\n onClick={this._onToggleSubmenu}\r\n aria-expanded={this.state.expanded}\r\n >\r\n {refinerName}\r\n </Button>\r\n <Collapse isOpen={this.state.expanded} timeout={350}>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n switch (productRefinerHierarchy.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n return this._renderRange(productRefinerHierarchy);\r\n default:\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, sortingCriteraValues, context } = this.props;\r\n const isSingleSelect = productRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n // const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const refinerValuesList = (productRefinerHierarchy.Values || []).sort(function (a:ProductRefinerValue,b:ProductRefinerValue){\r\n if(a.LeftValueBoundString && b.LeftValueBoundString){ return a.LeftValueBoundString.localeCompare(b.LeftValueBoundString)}\r\n return 0;\r\n });\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n let selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n if (child.RightValueBoundString && sortingCriteraValues && sortingCriteraValues?.indexOf(child.RightValueBoundString) !== -1) {\r\n selectedRefinementCriterion = child;\r\n }\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n keyId = {index}\r\n />\r\n );\r\n });\r\n return (\r\n <ul className='ms-refine-submenu__list' {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n // TODO BUGBUG 22424559 determine only from the DataTypeValue once live example is working (can test with the tempRangeTypeTODO derived from QSP until then)\r\n const rangeType = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput || this.props.tempRangeTypeTODO === 'input') ?\r\n 'input' :\r\n 'slider';\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n keyId = {index}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className='ms-refine-submenu__list list-unstyled'>{listItems}</ul>;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText]\r\n */\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL\r\n * @param fullUrl The full URL of the page\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || !compressedRefinerArray.length) {\r\n return [];\r\n }\r\n\r\n return <ProductRefinerValue[]>compressedRefinerArray.map((compressedRefiner) => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch (e) {\r\n return undefined;\r\n }\r\n }).filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs\r\n * @param refiners The uncompressed refiners\r\n */\r\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach((refiner) => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach((refinerKey) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners\r\n * @param fullUrl The Current URL of the page\r\n * @param refiners The refiners which should be added to the URL\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (!refiners.length) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(refiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if (!sortingColumns.length) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context\r\n * @param key The query parameter key\r\n * @param requestContext The request context\r\n */\r\nexport const parseQueryParam = <T>(key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return <T>JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context\r\n * @param requestContext The request context\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n } else {\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n } else {\r\n return new URL(<string><unknown>(requestContext.url.requestUrl));\r\n }\r\n }\r\n};\r\n","import { getUpdatedRefinementCriteria, IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultContainerViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button,ILabeledDropdownOption, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { transaction } from 'mobx';\r\nimport * as React from 'react';\r\nimport { ICittaSearchResultContainerProps } from '../../modules/citta-search-result-container/citta-search-result-container.props.autogenerated';\r\nimport RefineSubmenu from './refine-submenu';\r\nimport { buildListPageUrl, getCurrentUrl } from './url-utils';\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport interface ISortByProps {\r\n props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>;\r\n}\r\n\r\nexport interface ISortByOptionsState {\r\n sortingState: ISortByCollectionState;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n dropdownOpen: boolean;\r\n pending: boolean;\r\n}\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refinersHeader: React.ReactNode;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nconst sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc'\r\n};\r\n\r\nexport interface IRefinerProps {\r\n props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>;\r\n toggleModal: Function;\r\n}\r\n/** This component will be used to render Refiners on Citta category and search results page */\r\nexport default class CittaRefiners extends React.PureComponent<IRefinerProps> {\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n \r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.props.resources.sortByOptionPriceDesc },\r\n ];\r\n\r\n\r\n constructor(props: IRefinerProps) {\r\n super(props);\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = props.props.resources;\r\n\r\n const locale = props.props.context.request.locale;\r\n const telemetry = props.props.telemetry;\r\n const validationErrorNaN = props.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = props.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n dropdownOpen: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n }\r\n };\r\n\r\n this._renderRefiners = this._renderRefiners.bind(this);\r\n this._onClearRefiners = this._onClearRefiners.bind(this);\r\n this._getSortColumnFromSelectedOption = this._getSortColumnFromSelectedOption.bind(this);\r\n this._getSortingRefiner = this._getSortingRefiner.bind(this);\r\n\r\n }\r\n public render(): JSX.Element | null {\r\n const refineMenu: IRefineMenuViewProps = this._renderRefiners();\r\n const sortRefiner = this._getSortingRefiner();\r\n\r\n if (refineMenu.refiners) {\r\n return (\r\n \r\n <Node {...refineMenu.RefinerSectionContainer}>\r\n <Node {...refineMenu.RefineMenuContainer}>\r\n {refineMenu.refinersHeader}\r\n {sortRefiner.sortByDropDown}\r\n {refineMenu.refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _onClearRefiners = (): void => {\r\n const { context } = this.props.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(requestContext), []));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.activeFilters = [];\r\n });\r\n }\r\n\r\n private _getSortingRefiner = (): ISortByViewProps => {\r\n const { data, context, config } = this.props.props;\r\n\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const sortingCritera = (data.listPageState.result && data.listPageState.result.sortingCritera) || undefined;\r\n \r\n let sortByValues:string[] = [];\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (data.searchConfiguration.result) {\r\n if (sortingCritera && sortingCritera.Columns?.length) {\r\n data.searchConfiguration!.result!.forEach((searchConfiguration) => { \r\n sortingCritera.Columns!.forEach (sortingC => {\r\n if (searchConfiguration.sortColumn.ColumnName === sortingC.ColumnName && searchConfiguration.sortColumn.IsDescending === sortingC.IsDescending) {\r\n sortByValues.push(searchConfiguration.key);\r\n }\r\n })\r\n });\r\n }\r\n }\r\n\r\n let sortByDropdownOptions = [\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionRelevanceDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionRelevanceDesc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionNameAsc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionNameAsc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionNameDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionNameDesc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionPriceAsc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionPriceAsc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionPriceDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionPriceDesc\r\n }\r\n ];\r\n\r\n let sortBy: IProductRefinerHierarchy = {\r\n KeyName: 'SortBy',\r\n Values: sortByDropdownOptions\r\n } ;\r\n const dropdown = (\r\n <RefineSubmenu\r\n productRefinerHierarchy={sortBy}\r\n sortingCriteraValues={sortByValues}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.props.resources.maxValueSliderThumbAriaLabel}\r\n key={'sort-by-1'}\r\n onUpdateRefiners={this._updateDropDown}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.props.id}\r\n moduleTypeName={this.props.props.typeName}\r\n refinersToBeUpdated={config.refinersToBeUpdated || ''}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n }\r\n\r\n private _updateDropDown = (notification: IRefineItemToggleNotification): void => {\r\n let sortColumn = this._getSortColumnFromSelectedOption(notification.productRefinerValue.RightValueBoundString || '')\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.props.context.request), undefined, [sortColumn], undefined));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.sortingCritera = { Columns: [sortColumn] };\r\n });\r\n\r\n this.setState({\r\n sortingState: {\r\n dropdownOpen: false,\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n }\r\n });\r\n }\r\n\r\n private _getSortColumnFromSelectedOption = (type: string): SortColumn => {\r\n const { data } = this.props.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === type; });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private _renderRefiners = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props.props;\r\n\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n const expandedMenusOnLoad = config.expandedMenusOnLoad || 'all';\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinersHeader =\r\n (\r\n <div className='refine-menu-header'>\r\n <div className='refine-menu-close'>\r\n <Button\r\n className={'refine-menu-close-button'}\r\n // @ts-ignore\r\n onClick={this.props.toggleModal}\r\n >{'x'}\r\n </Button>\r\n </div>\r\n\r\n <div className='refine-menu-header-text'>Refine</div>\r\n <div className='refine-menu-header-action'>\r\n <Button\r\n className={'refine-menu-header-action-link'}\r\n aria-label={'Clear'}\r\n // tslint:disable-next-line: react-this-binding-issue\r\n onClick={this._onClearRefiners}\r\n >{'Clear'}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n\r\n \r\n let orderedRefiners: IProductRefinerHierarchy[] = [];\r\n\r\n if (validRefiners && validRefiners.length){\r\n let refinerCat = validRefiners.find(refiner => refiner.KeyName === 'Refiner Category');\r\n refinerCat && orderedRefiners.push(refinerCat)\r\n \r\n validRefiners.forEach(refiner => {\r\n \r\n if (refiner.KeyName !== 'Refiner Category') {\r\n orderedRefiners.push(refiner)\r\n }\r\n })\r\n }\r\n const subMenus = orderedRefiners && orderedRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n const hiddenRefinersList = config.refinersToBeHidden && config.refinersToBeHidden.toLowerCase().split(',');\r\n if (productRefinerHierarchy.KeyName !== 'Category' && (hiddenRefinersList ? (hiddenRefinersList.indexOf(productRefinerHierarchy.KeyName!.toLowerCase()) === -1 && productRefinerHierarchy.KeyName!.toLowerCase() !== 'rating') : true)) {\r\n let isExpanded: boolean;\r\n switch (expandedMenusOnLoad) {\r\n case 'none':\r\n isExpanded = false;\r\n break;\r\n case 'first':\r\n isExpanded = index === 0;\r\n break;\r\n case 'all':\r\n default:\r\n isExpanded = true;\r\n }\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n if (productRefinerHierarchy.KeyName === \"Refiner Category\") {\r\n isExpanded = true;\r\n }\r\n }\r\n\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={isExpanded}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.props.id}\r\n moduleTypeName={this.props.props.typeName}\r\n refinersToBeUpdated={config.refinersToBeUpdated || ''}\r\n />\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n });\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refinersHeader: refinersHeader,\r\n refiners: subMenus\r\n };\r\n }\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n }\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.props.data.listPageState.result && this.props.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n }\r\n}\r\n","import { IGridSettings, IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nexport type PictureLoadFailureBehavior = 'default' | 'hide' | 'empty';\r\n\r\nexport interface IPictureState extends React.ComponentState {\r\n showHoverImg: boolean;\r\n}\r\nexport interface IPictureProps {\r\n loadFailureBehavior?: PictureLoadFailureBehavior;\r\n image1?: string;\r\n image2?: string;\r\n emptyImageUrl?: string;\r\n altText?: string;\r\n gridSettings: IGridSettings;\r\n imageSettings?: IImageSettings;\r\n className?: string;\r\n}\r\n/** The Picture component will return picture tag for an image based on ImageResize properties and settings needed to resize the image */\r\nexport default class CittaPicture extends React.PureComponent<IPictureProps, IPictureState> {\r\n\r\n public render(): JSX.Element | null {\r\n const { image1 = '', image2 = '', altText, gridSettings, imageSettings } = this.props;\r\n const img1: IImageData = {\r\n src: image1,\r\n altText: altText ? altText : ''\r\n };\r\n const img2: IImageData = {\r\n src: image2,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings\r\n };\r\n return (\r\n <div className='images-container'>\r\n <Image\r\n {...img1}\r\n {...imageProps}\r\n loadFailureBehavior='empty'\r\n className={classnames('image1', this.props.className)}\r\n onMouseOver={this.handleMoveHover}\r\n />\r\n <Image\r\n {...img2}\r\n {...imageProps}\r\n loadFailureBehavior='hide'\r\n className={classnames((this.state?.showHoverImg ? 'image2 hoverImg ' : 'image2 hoverImg hideImg '), this.props.className)}\r\n onMouseOut={this.handleMoveOut}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private handleMoveHover = () => {\r\n this.setState({ showHoverImg: true });\r\n }\r\n\r\n private handleMoveOut = () => {\r\n this.setState({ showHoverImg: false });\r\n }\r\n}\r\n","import { generateImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, ICoreContext, IGridSettings, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport CittaPicture from '../../../components/citta-picture';\r\n\r\nimport PriceComponent from '../../../components/price-component';\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 salesLineTagKey?: string;\r\n tagsToIgnore?: string;\r\n}\r\n\r\n/**\r\n *\r\n * The ProductComponent renders the products.\r\n * @extends {React.PureComponent<IProductComponentProps>}\r\n */\r\nclass ProductComponent extends React.Component<IProductComponentProps> {\r\n\r\n constructor(props: IProductComponentProps) {\r\n super(props);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const product = this.props.data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n let imageOrientation: string = '';\r\n let onlineTags: string = '';\r\n let salesLineTag: string = '';\r\n let productImage1: string = '';\r\n let productImage2: string = '';\r\n let stockAvailabilityPropertyText: string = '';\r\n let stockAvailabilities: any[] = [];\r\n\r\n if (product.ExtensionProperties!.length > 0) {\r\n product.ExtensionProperties!.map(property => {\r\n if (property.Key === 'ProductImage1') {\r\n productImage1 = property.Value!.StringValue!;\r\n } else if (property.Key === 'ProductImage2') {\r\n productImage2 = property.Value!.StringValue!;\r\n }\r\n else if (property.Key === 'ProductAvailability') {\r\n stockAvailabilities.push({name: property.Value?.StringValue, value: property.Value?.IntegerValue});\r\n }\r\n });\r\n }\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n } else if (property.Name === 'Online Tags' || property.Name === \"Online Tags B2BN\" || property.Name === \"Online Tags B2BA\") {\r\n onlineTags = property.TextValue!;\r\n if (this.props.tagsToIgnore && onlineTags) {\r\n let tags = this.props.tagsToIgnore.split('|');\r\n if (tags.includes(onlineTags)) {\r\n onlineTags = '';\r\n }\r\n }\r\n } else if (property.Name === this.props.salesLineTagKey) {\r\n salesLineTag = property.TextValue!;\r\n }\r\n });\r\n }\r\n\r\n const image1 = generateImageUrl(productImage1, this.props.context.request.apiSettings);\r\n const image2 = generateImageUrl(productImage2, this.props.context.request.apiSettings);\r\n\r\n const productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, this.props.context && this.props.context.actionContext, undefined);\r\n\r\n // Construct telemetry attribute to render\r\n const attribute = this.props.context\r\n && this.props.context.telemetry\r\n && this.props.context.telemetry.setTelemetryAttribute\r\n && this.props.context.telemetry.setTelemetryAttribute(product.RecordId.toString(), {\r\n pid: product.RecordId,\r\n pname: product.Name,\r\n mname: this.props.id\r\n }\r\n );\r\n const productImageSettings = imageOrientation === 'Landscape' ? this._getLandscapeImageSettings(this.props.imageSettings) : this.props.imageSettings;\r\n return (\r\n <a href={productUrl} aria-label={this._renderLabel(product.Name, this.props.context.cultureFormatter.formatCurrency(product.Price), product.AverageRating, this.props.ratingAriaLabel)} className='msc-product' {...attribute}>\r\n <div className={(onlineTags && onlineTags !== '') ? 'product-placement__item-imagetag' : 'product-placement__item-imagetagnone'} style={onlineTags.toLocaleLowerCase().includes('essentials') ? {backgroundColor: \"black\"}: {}}>{onlineTags}</div>\r\n <div className='msc-product__image'>\r\n {this._renderProductPlacementImage(productImageSettings, this.props.context.request.gridSettings, product.PrimaryImageUrl, image1, image2, product.Name)}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h4 className='msc-product__title'>{product.Name}</h4>\r\n {this._renderPrice(this.props.context, this.props.typeName, this.props.id, product.BasePrice, product.Price, this.props.savingsText, this.props.freePriceText, this.props.originalPriceText, this.props.currentPriceText)}\r\n {this._renderSalesLineTag(salesLineTag)}\r\n {this._renderDescription(product.Description)}\r\n {!this.props.context.app.config.hideRating && this._renderRating(this.props.context, this.props.typeName, this.props.id, product.AverageRating, product.TotalRatings, this.props.ratingAriaLabel)}\r\n {stockAvailabilityPropertyText}\r\n <div className=\"msc-product__availabilities\">\r\n {this._renderAvailabilities(stockAvailabilities)}\r\n </div>\r\n </div>\r\n </a>\r\n );\r\n }\r\n\r\n private _renderAvailabilities(stockAvailabilities: any[]) {\r\n return stockAvailabilities && stockAvailabilities.map(sA => <div className=\"msc-product__availabilities_product\">\r\n <span className={sA.value > 0 ? 'in-stock' : 'out-of-stock'}>{sA.name.match(/\\b(\\w)/g).join('')}</span>\r\n </div>\r\n )\r\n }\r\n\r\n private _renderLabel(name?: string, price?: string, rating?: number, ratingAriaLabel?: string): string {\r\n let ratingLabel = '';\r\n\r\n name = name || '';\r\n price = price || '';\r\n\r\n if (rating) {\r\n const roundedRating = rating.toFixed(2);\r\n ratingLabel = format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n\r\n return (`${name} ${price} ${ratingLabel}`);\r\n }\r\n\r\n private _renderSalesLineTag(salesLineTag?: string): JSX.Element | null {\r\n if (salesLineTag! && salesLineTag !== '') {\r\n return (\r\n <div className='product-placement__item-saleslinetag'>{salesLineTag}</div>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</p>;\r\n }\r\n\r\n private _renderRating(context: ICoreContext, typeName: string, id: string, avgRating?: number, totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numRatings = totalRatings && totalRatings.toString() || undefined;\r\n\r\n return (\r\n <RatingComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n avgRating={avgRating}\r\n ratingCount={numRatings}\r\n readOnly={true}\r\n ariaLabel={ariaLabel || ''}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n private _renderPrice(context: ICoreContext, typeName: string, id: string, 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 return (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price: price }}\r\n // @ts-ignore\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n />\r\n );\r\n }\r\n\r\n private _renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, image1?: string, image2?: string, altText?: string): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n return (\r\n <CittaPicture\r\n className='product-placement__item-image'\r\n image1={image1 ? image1 : imageUrl}\r\n image2={image2 ? image2 : ''}\r\n altText={altText}\r\n gridSettings={gridSettings}\r\n imageSettings={imageSettings}\r\n loadFailureBehavior='empty'\r\n />\r\n );\r\n }\r\n\r\n private _getLandscapeImageSettings(cmsImageSettings?: IImageSettings): IImageSettings {\r\n // tslint:disable-next-line: no-unnecessary-local-variable\r\n const landscapeImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=735&h=481&q=80&m=6&f=jpg', w: 735, h: 481 },\r\n sm: { q: 'w=467&h=303&q=80&m=6&f=jpg', w: 467, h: 303 },\r\n md: { q: 'w=563&h=366&q=80&m=6&f=jpg', w: 563, h: 366 },\r\n lg: { q: 'w=636&h=451&q=80&m=6&f=jpg', w: 636, h: 451 },\r\n xl: { q: 'w=974&h=693&q=80&m=6&f=jpg', w: 974, h: 693 }\r\n },\r\n disableLazyLoad: cmsImageSettings && cmsImageSettings.disableLazyLoad,\r\n lazyload: cmsImageSettings && cmsImageSettings.lazyload\r\n };\r\n\r\n return landscapeImageSettings;\r\n }\r\n}\r\n\r\nexport default ProductComponent;\r\n","import { ICategoryHierarchyViewProps, ISearchResultContainerViewProps, ITitleViewProps, ISearchResultModalViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport CittaRefiners from '../../components/citta-search-result/citta-refiners';\r\n// import CittaSortByOptions from '../../components/citta-search-result/citta-sortbyoptions';\r\nimport { ICittaSearchResultContainerProps } from './citta-search-result-container.props.autogenerated';\r\nimport ProductComponent from './components/product-component';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductsContainer,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n categoryHierarchy,\r\n errorMessage,\r\n // @ts-ignore\r\n toggleModal\r\n } = props;\r\n\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n <div className=\"filter-button-container\">\r\n {modalToggle}\r\n </div>\r\n {createSearchResultModal(searchResultModal, props, toggleModal)}\r\n {renderTitle(TitleViewProps)}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {renderProducts(props)}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n};\r\n\r\nfunction renderProducts(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>): JSX.Element | null {\r\n const { config, context, resources } = props;\r\n const liClass = 'ms-product-search-result__item';\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const products = (isB2B ? props.data.listPageState.result && props.data.listPageState.result.activeProducts && props.data.listPageState.result.activeProducts.filter((item) => item.ItemId !==\"GiftCard\") : props.data.listPageState.result && props.data.listPageState.result.activeProducts) || [];\r\n if (!products || products.length === 0) {\r\n return null;\r\n }\r\n return (\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n <li className={`${liClass} ${getImageOrientation(product) === 'Landscape' ? 'product-placement__item-limage' : 'product-placement__item-pimage'}`} key={index} >\r\n <ProductComponent\r\n context={context}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n id={props.id}\r\n salesLineTagKey={config.salesLineTagKey}\r\n typeName={props.typeName}\r\n data={{ product: product }}\r\n tagsToIgnore={config.tagsToIgnore}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction getImageOrientation(product: ProductSearchResult): string {\r\n let imageOrientation: string = '';\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n }\r\n });\r\n }\r\n return imageOrientation;\r\n}\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {className: \"category-refiner\"}, null, createModalBody(modalProps, props, toggleModal))\r\n};\r\n\r\nconst createModalBody = (modalProps: ISearchResultModalViewProps, props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element | null => {\r\n return React.cloneElement(modalProps.modalBody, {}, null, renderRefineMenu(props, toggleModal));\r\n};\r\n\r\nfunction renderRefineMenu(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element {\r\n return (\r\n <CittaRefiners\r\n props={props}\r\n toggleModal={toggleModal}\r\n />\r\n );\r\n}\r\n\r\n// function renderSort(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>): JSX.Element {\r\n// return (\r\n// <CittaSortByOptions\r\n// props={props}\r\n// />\r\n// );\r\n// }\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <label style={{display: 'none'}} className=\"hide emarsys-collection-name\">{title.titleText}</label>\r\n <h2>\r\n {title.titleCount}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n// const renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n// const { title, TitleContainer } = props;\r\n// if (title) {\r\n// return (\r\n// <Node {...TitleContainer}>\r\n// <label className=\"hide emarsys-collection-name\">{title.titleText}</label>\r\n// <h5>\r\n// {title.titleCount}\r\n// </h5>\r\n// </Node>\r\n// );\r\n// }\r\n// return null;\r\n// };\r\n\r\nexport default SearchResultContainerView;","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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.\n * All rights reserved. See LICENSE 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(reviewId: string, tenantId: string, locale: string, isHelpful: boolean, authToken: string, serviceEndpoint: string) {\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.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselViewProps } from './carousel';\n\n/**\n * Returns item slots.\n * @returns Array of item slots.\n * @param props -Props.\n */\nconst retrieveItems = (props: ICarouselViewProps): React.ReactNode[] => {\n let items = [];\n items = props.slots && props.slots.content && props.slots.content.length > 0 ? props.slots.content : [];\n return items;\n};\nconst CarouselView: React.FC<ICarouselViewProps> = props => (\n <Module {...props.carouselContainer} {...props.renderModuleAttributes(props)}>\n <Carousel\n className={classnames(props.closeAnimation)}\n activeIndex={props.activeIndex}\n next={props.next}\n previous={props.previous}\n pause={props.config.pauseOnHover ? 'hover' : false}\n ride={props.config.autoplay ? 'carousel' : undefined}\n autoplay={props.config.autoplay}\n interval={props.config.interval}\n transitionType={props.config.transitionType ? props.config.transitionType : undefined}\n items={retrieveItems(props)}\n hideFlipper={props.config.hideFlipper}\n dismissEnabled={props.config.dismissEnabled}\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\n handleDismissCarousel={props.handleDismissCarousel}\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\n directionTextPrev={props.resources && props.resources.flipperPrevious}\n directionTextNext={props.resources && props.resources.flipperNext}\n handleOnExited={props.handleOnExited}\n handleOnExiting={props.handleOnExiting}\n telemetryContent={props.telemetryContent}\n keyboard={props.config.keyboard}\n />\n </Module>\n);\n\nexport default CarouselView;\n","import * as React from 'react';\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (<span> {separator} </span>);","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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= ${input.locale},`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/concerns/review/${input.reviewId}` + `?tenantId=${input.tenantId}` + `&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 input && input.reviewId.length > 0 && input.tenantId.length > 0 && input.locale.length > 0 && input.authToken.length > 0;\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","import * as React from 'react';\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\r\n return (\r\n <span className='ms-search-result-container__no-results-message'>\r\n <h5 className='error-text'> {text} </h5>\r\n </span>\r\n );\r\n};","import * as React from 'react';\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC<ITitle> = ({ text, className }) => (<span className = {className}> {text} </span>);\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce from '@msdyn365-commerce/core';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductComparisonPreviewViewProps, ProductComparisonPreview } from './product-comparison-preview';\n\n/**\n * Represents product comparison preview view.\n * @param props - View props for product comparison preview.\n * @returns Functional component of product comparison preview.\n */\nexport const ProductComparisonPreviewViewFunctionalComponent: React.FC<IProductComparisonPreviewViewProps> = props => {\n if (!props.isMainContentReady) {\n return null;\n }\n\n const shouldBeExpanded = props.isExpanded ?? props.hasUserInteractedWithComparison;\n\n const containerClassName = classnames(\n ProductComparisonPreview.mainContainerClassName,\n shouldBeExpanded ? '' : `${ProductComparisonPreview.mainContainerClassName}__collapsed`\n );\n\n return (\n <Module {...props.moduleProps}>\n <Node className={ProductComparisonPreview.containerClassName}>\n <Node className={containerClassName}>\n <Node className={`${ProductComparisonPreview.mainContainerClassName}__header__section`}>\n <Node {...props.collapseButton}>\n <Node className={ProductComparisonPreview.headerClassName}>\n <Node className={ProductComparisonPreview.headerLabelClassName}>\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__icon`} />\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__main-text`}>\n {props.resources.productComparisonPreviewHeaderText}\n </Node>\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__sub-text`}>\n {props.subheaderText}\n </Node>\n </Node>\n </Node>\n </Node>\n <Node className={ProductComparisonPreview.tableClassName} tag='table'>\n <Node className='' tag='tbody'>\n <Node className={ProductComparisonPreview.tableRowClassName} tag='tr'>\n {props.productsMainInfo?.map(info => {\n return (\n <Node className='' tag='td' key={info.productData.itemId}>\n {info.removeFromComparisonButton}\n {info.productImage}\n </Node>\n );\n })}\n {props.previewGreyPlaceHolders}\n </Node>\n <Node className={ProductComparisonPreview.tableRowClassName} tag='tr'>\n {props.productsMainInfo?.map(info => {\n return (\n <Node className='' tag='td' key={info.productData.itemId}>\n {msdyn365Commerce.isBrowser ? info.productLink : undefined}\n </Node>\n );\n })}\n </Node>\n </Node>\n </Node>\n </Node>\n <Node className={ProductComparisonPreview.footerClassName}>\n {props.clearAllButton}\n {props.goToComparisonButton}\n </Node>\n </Node>\n </Node>\n </Module>\n );\n};\n\nexport default ProductComparisonPreviewViewFunctionalComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = 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}>{similarLookProduct}</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}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): 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}>{submenu}</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 <Node {...SortingContainer}>{sortByDropDown}</Node>;\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>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 id={props.id} className='ms-video-player' {...props.renderModuleAttributes(props)}>\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.\n * All rights reserved. See LICENSE 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 classnames from 'classnames';\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 parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state.\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\n */\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\n );\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(\n productRefinerValue,\n parentProductRefinerHierarchy,\n isChecked,\n context,\n index,\n telemetryContent,\n productCountAriaLabel,\n singleProductCountAriaLabel\n );\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\n : '';\n } else {\n refineMenuItemAriaLabel = refineItemsAriaLabel\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\n : '';\n }\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\n\n let className = 'ms-refine-submenu-item';\n if (shouldDisplayAsSwatch) {\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\n }\n\n // If the swatch has no color or image specified, it should be displayed as text.\n // We don't use swatch logic to display the number of the results found together with the text.\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasContentSwatch = hasColor || hasImage;\n\n return (\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={itemTypeClassName}\n role={inputType}\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\n return shouldDisplayAsSwatch;\n }\n\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n\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 const swatchItems = [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ];\n\n return (\n <SwatchComponent\n className='ms-refine-submenu-item__swatch'\n apiSettings={this.props.context.request.apiSettings}\n list={swatchItems}\n isSelectionEnabled={false}\n isRefineItem\n />\n );\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(() => {\n this.anchorType.current && this.anchorType.current.focus();\n }, 0);\n }\n };\n\n private _renderRating(\n productRefinerValue: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean,\n context: ICoreContext,\n index?: number,\n telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string,\n ratingSingleUserCountAriaLabel?: string\n ): 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(\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\n );\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n const productCountAriaLabelValue =\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\n return (\n <li\n className='ms-refine-submenu-item ms-refine-submenu-item__rating'\n role={!this.props.isMobileView ? 'presentation' : undefined}\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\n >\n <a\n href={this._getRefinerUrl()}\n role='option'\n aria-selected={isChecked}\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\n ${productCountAriaLabelValue!}`}\n onClick={this._onClick}\n {...attribute}\n >\n <RatingComponent\n className={ratingComponentClass}\n avgRating={refinerRating}\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\n hideCount={false}\n readOnly\n ariaLabel=''\n context={context}\n id={this.props.moduleId}\n typeName={this.props.moduleTypeName}\n data={{}}\n />\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n return undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n Alert,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n TelemetryConstant\n} 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 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: {\n tag: Modal,\n className: 'ms-report-review-modal msc-modal-input-required',\n toggle: props.onModalToggle,\n applicationNode: 'renderPage',\n isOpen: props.isOpen,\n returnFocusRef: props.returnRef\n },\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'>{props.resources.reportConcernText}</p>,\n headerSubmitted: <p className='ms-reviews-list__report-header'>{props.resources.feedbackThankYouText}</p>,\n cancelButton: (\n <button className='msc-btn ms-reviews-list__cancel' onClick={props.onModalToggle} {...cancelAttribute}>\n {props.resources.cancelReportReviewText}\n </button>\n ),\n submitButton: (\n <button className='msc-btn ms-reviews-list__submit' onClick={props.reportReview} {...submitReviewAttribute}>\n {' '}\n {props.resources.reportReviewButtonText || 'Report'}\n </button>\n ),\n succesfulButton: (\n <button className='msc-btn ms-reviews-list__success' onClick={props.onModalToggle} {...successAttribute}>\n {props.resources.okReportReviewText}\n </button>\n ),\n reportMessage: <p className='ms-reviews-list__report-message'>{props.resources.reportModalMessage}</p>,\n reportSubmittedMessage: <p className='ms-reviews-list__report-message'>{props.resources.reportSubmittedMessage}</p>,\n radioButtons: radioPairs(props),\n error: (\n <Alert className='ms-reviews-list__report-error' isOpen={props.hasError} color='danger'>\n {props.resources.errorMessageText}\n </Alert>\n )\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 <fieldset>{pairs}</fieldset>;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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.\n * All rights reserved. See LICENSE 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,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport classNames from 'classnames';\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 modalCSS?: string;\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 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: {\n tag: Modal,\n className: props.modalCSS ? classNames(props.modalCSS, 'msc-modal-input-required') : 'ms-review-modal msc-modal-input-required',\n toggle: props.onModalToggle,\n applicationNode: 'renderPage',\n isOpen: props.isOpen,\n returnFocusRef: props.returnRef\n },\n modalHeader: modalHeaderNode(props),\n modalFooter: { tag: ModalFooter, className: 'ms-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-review-modal-body' },\n cancelButton: (\n <Button className='ms-review-modal-cancel' onClick={props.onModalToggle} {...submitButtonAttribute}>\n {props.resources.discardReviewButtonText}\n </Button>\n ),\n submitButton: (\n <Button\n className='ms-review-modal-submit'\n onClick={onClickSubmit(props)}\n {...cancelButtonAttribute}\n disabled={submitDisabled(props)}\n >\n {props.resources.submitReviewButtonText}\n </Button>\n ),\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: (\n <Alert className='ms-review-modal-error' isOpen={props.hasError} color='danger'>\n {props.resources.errorMessageText}\n </Alert>\n )\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 (\n <label className='ms-review-modal-rating-label' key='ratingsLabel'>\n {props.resources.selectRatingLabel}*\n </label>\n );\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 (\n <label className='ms-review-modal-title-label' htmlFor={`reviewTitle-${props.renderContextId}`}>\n {props.resources.reviewTitleLabel}\n </label>\n );\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 (\n <label htmlFor={`reviewTextArea-${props.renderContextId}`} className='ms-review-modal-text-label'>\n {props.resources.reviewTextLabel}\n </label>\n );\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 href={privacyPolicyUrl} rel='noreferrer' target='_blank' className='msc-link' {...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(\n props.product,\n props.reviewTitle,\n props.reviewText,\n props.rating,\n props.context,\n props.userReview,\n props.onReviewComplete\n );\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 = (\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n) => {\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)\n .then(reviewId => {\n const review = reviewId\n ? {\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 }\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 })\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.\n * All rights reserved. See LICENSE 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 productComparisonButton?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(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 productComparisonButton,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\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 productComparisonButton={productComparisonButton}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n ))}\n </ul>\n );\n};\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * ICittaSearchResultContainer 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 expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport const enum expandedMenusOnLoad {\r\n none = 'none',\r\n first = 'first',\r\n all = 'all'\r\n}\r\n\r\nexport interface ICittaSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n className?: string;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n expandedMenusOnLoad?: expandedMenusOnLoad;\r\n refinersToBeHidden?: string;\r\n refinersToBeUpdated?: string;\r\n tagsToIgnore?: string;\r\n salesLineTagKey?: string;\r\n}\r\n\r\nexport interface ICittaSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n}\r\n\r\nexport interface ICittaSearchResultContainerProps<T> extends Msdyn365.IModule<T> {\r\n resources: ICittaSearchResultContainerResources;\r\n config: ICittaSearchResultContainerConfig;\r\n}\r\n"," /*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {ArrayExtensions, getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, ITelemetryContent, LabeledDropdown, UncontrolledPagination } from '@msdyn365-commerce-modules/utilities';\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice,ProductRefinerValue, ProjectionDomain, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getActivePricesAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { AffiliationLoyaltyTier, CustomerAffiliation } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { buildListPageUrl, getCollectionProducts, getCurrentUrl, GetFullProductsByCollectionInput, parseQueryParam, sortOptions } from './actions';\r\nimport { ICittaSearchResultContainerData } from './citta-search-result-container.data';\r\nimport { expandRefinersCount, ICittaSearchResultContainerProps } from './citta-search-result-container.props.autogenerated';\r\nimport {\r\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\n\r\nexport interface ISearchResultContainerViewProps extends ICittaSearchResultContainerProps<ICittaSearchResultContainerData> {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n toggleModal: Function;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title:ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?:React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component\r\n * @extends {React.PureComponent<ICittaSearchResultContainerProps<ICittaSearchResultContainerData>>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<ICittaSearchResultContainerProps<ICittaSearchResultContainerData>, ISearchResultContainerState> {\r\n\r\n @computed get isMobile(): boolean {\r\n return (this._viewport === 'xs' || this._viewport === 'sm');\r\n }\r\n\r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n ];\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private _modalToggleRef: React.RefObject<HTMLButtonElement>;\r\n private _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\r\n private expandrefinerCount: number | undefined = 0;\r\n private telemetryContent: ITelemetryContent;\r\n private productPrices: ProductPrice[];\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n constructor(props: ICittaSearchResultContainerProps<ICittaSearchResultContainerData>, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\r\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices=[];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n };\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry);\r\n\r\n // Initalization of list page\r\n this.props.data.products.then((products) => {\r\n this.props.data.listPageState.then((listPageState) => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n this.props.context.request.query && this.props.context.request.query.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\r\n this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes === true ? true : false,\r\n this.props.context.request.locale\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n this._getActivePrice().catch(ex=> {throw ex;});\r\n });\r\n }\r\n );\r\n\r\n });\r\n });\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then((products) => {\r\n this.props.data.listPageState.then((listPageStateFeature) => {\r\n listPageStateFeature.featureProduct = products;\r\n\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n // tslint:disable-next-line:no-floating-promises\r\n this._getActivePrice();\r\n }\r\n }\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n if(!products || products.length === 0) {\r\n errorText = this._pageType === 'Category'? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n\r\n }\r\n const productsComponent = (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation = {allowBack}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n\r\n const featureComponent = (\r\n <FeatureSearchResultItem\r\n product={searchProduct}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown(): null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: {className: 'ms-search-result-container__product-section'},\r\n CategoryNavContainer: {className: 'ms-search-result-container__category-nav-section'},\r\n RefineAndProductSectionContainer: {className: 'ms-search-result-container__refine-product-section'},\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ?\r\n (\r\n <ModalToggle\r\n text={resources.modalTitle}\r\n ariaLabel={resources.modalTitle}\r\n innerRef={this._modalToggleRef}\r\n onClick={this._toggleModal}\r\n id='search-result-modal'\r\n />\r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && (\r\n <ErrorMessage text={errorText} />\r\n ),\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n toggleModal: this._toggleModal\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private _getActivePrice = async (): Promise<void> => {\r\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = { ChannelId: this.props.context.request.apiSettings.channelId, CatalogId: this.props.context.request.apiSettings.catalogId };\r\n const affliations: AffiliationLoyaltyTier[] = [];\r\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\r\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\r\n\r\n if (customer && customer.CustomerAffiliations) {\r\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\r\n const aff: AffiliationLoyaltyTier = { AffiliationId: affliation.RetailAffiliationId, CustomerId: customer.AccountNumber };\r\n affliations.push(aff);\r\n });\r\n }\r\n \r\n await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n affliations,\r\n true\r\n ).then((activePricesResponse:ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n products = products.map(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(activePrice.BasePrice || 0, activePrice.TradeAgreementPrice || 0, activePrice.AdjustedPrice || 0);\r\n }\r\n return prod;\r\n });\r\n this.props.data.listPageState.then((listPageState) => {\r\n listPageState.activeProducts = products;\r\n });\r\n }).catch((error: Error) => {\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(`[get Affiliation based price on search result container ]Error executing action`);\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n }\r\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const {resources} = this.props;\r\n return SearchResultModal(\r\n {\r\n resources:{\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n className: \"tetete\",\r\n isOpen:this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n }\r\n\r\n private _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle = (data.category.result && SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: 'ms-search-result-container__title' },\r\n title:{\r\n titlePrefix: titlePrefix,\r\n titleText: titleText,\r\n titleCount: titleCount\r\n }\r\n };\r\n\r\n }\r\n private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n\r\n }\r\n\r\n private _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={this.sortByDropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />);\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown:dropdown\r\n };\r\n }\r\n\r\n private _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount = listPageState && listPageState.currentPageNumber !== null ?\r\n (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) :\r\n ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\r\n const totalItems = listPageState && listPageState.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp={'skip'}\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={<div className='msc-pagination__prev'><span className='ms-search-result__pagination-left' aria-hidden='true'/><span className='prev-text'>{previousText}</span></div>}\r\n nextText={<div className='msc-pagination__next'><span className='next-text'>{nextText}</span><span className='ms-search-result__pagination-right' aria-hidden='true'/></div>}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />);\r\n }\r\n\r\n private _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={expandedRefiners && expandedRefiners > index ? true : false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context = {context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n });\r\n \r\n return {\r\n RefineMenuContainer:{className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer:{className: 'ms-search-result-container__refiner-section'},\r\n refiners: subMenus\r\n };\r\n\r\n }\r\n\r\n private _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-ignore: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n\r\n }\r\n\r\n private _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\r\n });\r\n }\r\n\r\n private _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === option.key; });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find((mappedSearchConfig) => {\r\n return (mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName) &&\r\n (mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending);\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find((dropdownOption) => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n }\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n }\r\n\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n },\r\n 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n }\r\n\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n }\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n } else {\r\n return 'xl';\r\n }\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch(refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n }\r\n\r\n}\r\n","import { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { get } from 'lodash';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n /**\r\n * ChoiceSummary component\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.Component<IChoiceSummaryProps> {\r\n private closeButtonGlyph: string = 'msi-close-btn';\r\n private payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly<IChoiceSummaryProps>) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n <div className='msc-choice-summary'>\r\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\r\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\r\n {items.map((item: IRefinerMap, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n <li className='msc-choice-summary__list-item' key={item.key} {...listItemProps}>\r\n <a\r\n className='msc-choice-summary__item'\r\n href={this.props.urlBuilder(item.value, false)}\r\n aria-label={`${item.key} ${choiceAriaLabel}`}\r\n onClick={this._onClick}\r\n {...attribute}\r\n >\r\n {item.key}\r\n <span className={`${this.closeButtonGlyph} msc-choice-summary__glyph`} />\r\n </a>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n {items.length > 0 && clearAllText && <a href={this.props.urlBuilder({}, true)} className={'msc-choice-summary__clear-all'} {...clearAllAttributes} onClick={this._onClick}>{clearAllText}</a>}\r\n </div>\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll: clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n }\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => (itemClicked.innerText && itemClicked.innerText.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent<IChoiceSummaryProps> {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\n return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\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'>{label}</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.value.LeftValueBoundString} ${choiceAriaLabel}`}\n onClick={this._onClick}\n role='button'\n id={item.key}\n {...attribute}\n >\n {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString ||\n item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString}\n <span\n className={`${this.closeButtonGlyph} msc-choice-summary__glyph`}\n role='button'\n aria-label={closeAriaLabel}\n />\n </a>\n </li>\n );\n })}\n </ul>\n {items.length > 0 && clearAllText && (\n <a\n href={this.props.urlBuilder({}, true)}\n className='msc-choice-summary__clear-all'\n {...clearAllAttributes}\n onClick={this._onClick}\n >\n {clearAllText}\n </a>\n )}\n </div>\n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue, index: string): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n if (refinerHierarchy && refinerHierarchy.find) {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else if (productRefinerValue.RefinerRecordId === 0) {\n const filterValue = refinerValues?.Values.find(\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\n );\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n if (refinerName === 'Rating' || refinerName === 'Price') {\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\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.id === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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}>{AutoSuggestAriaLabelText}</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 &&\n 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 &&\n 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 &&\n 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.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce from '@msdyn365-commerce/core';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { IProductComparisonProductMainInfo, IProductComparisonViewProps, ProductComparison } from './product-comparison';\n\n/**\n * Renders dynamic header values.\n * @param values - cd..info.\n * @param headerName - Header Name.\n * @returns List of react nodes.\n */\nconst renderDynamicHeaderCells = (\n values: {\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[],\n headerName: string,\n currentClickerPosition?: number\n) => {\n return values.map((value, index) => {\n if (index === currentClickerPosition) {\n return (\n <Node\n key={value.productMainInfo.tableHeaderProps.key}\n {...value.productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={value.productMainInfo.cellContainerProps.style}\n >\n {headerName}\n </Node>\n );\n }\n return <Node key={index} {...value.productMainInfo.tableHeaderProps} style={value.productMainInfo.cellContainerProps.style}></Node>;\n });\n};\n\n/**\n * Renders dynamic cell values.\n * @param values - Cells info.\n * @param hoveringCellItemId - Currently hovered cell.\n * @returns List of react nodes.\n */\nconst renderDynamicCells = (\n values: {\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[],\n hoveringCellItemId: string\n) => {\n return values.map(value => {\n return (\n <Node\n {...value.productMainInfo.tableCellProps}\n key={`${value.productMainInfo.product.itemId}-${hoveringCellItemId}`}\n style={value.productMainInfo.cellContainerProps.style}\n >\n {value.node}\n </Node>\n );\n });\n};\n/**\n * Represents product comparison view.\n * @param props - View props for product comparison.\n * @returns Functional component of product comparison.\n */\nexport const ProductComparisonViewFunctionalComponent: React.FC<IProductComparisonViewProps> = props => {\n return (\n <Module {...props.moduleProps}>\n {props.backToShopping}\n {props.heading}\n <Node className={`${ProductComparison.className}__product_count_text`}>{props.productCountText}</Node>\n {props.isEmptyContent || props.isMainContentReady ? undefined : props.loading}\n {props.isEmptyContent ? props.emptyComparison : undefined}\n <Node {...props.actionBarContainerProps}>\n {!props.isEmptyContent && props.isMainContentReady ? props.clearAllButton : undefined}\n </Node>\n {props.isMainContentReady ? (\n <Node className={ProductComparison.mainContainerClassName}>\n <Node className={ProductComparison.containerClassName}>\n <Node className={ProductComparison.tableClassName} ref={props.tableReference}>\n <Node className={`${ProductComparison.tableHeaderClassName}`}>\n <Node\n className={`${ProductComparison.tableHeaderClassName}__header__container`}\n ref={props.tableHeaderReference}\n >\n {props.shouldShowPreviousClicker && props.previousClicker}\n <Node\n className={classnames(\n ProductComparison.tableRowClassName,\n `${ProductComparison.tableHeaderClassName}__product-row`\n )}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n const isFromCurrentCatalog = productMainInfo.isFromCurrentCatalog;\n const actionsClassName = `${ProductComparison.productRowClassName}__actions`;\n return (\n <Node\n {...productMainInfo.cellContainerProps}\n key={productMainInfo.cellContainerProps.key as string}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.removeFromComparisonButton}\n {productMainInfo.productImage}\n {msdyn365Commerce.isBrowser ? productMainInfo.productLink : undefined}\n {productMainInfo.productPrice}\n <Node className={actionsClassName} key={productMainInfo.product.itemId}>\n {isFromCurrentCatalog\n ? productMainInfo.quickView\n : productMainInfo.goToProductDetailsButton}\n </Node>\n </Node>\n );\n })}\n </Node>\n {props.shouldShowNextClicker && props.nextClicker}\n </Node>\n </Node>\n <Node\n className={ProductComparison.tableBodyClassName}\n onScroll={props.handleScroll}\n ref={props.tableBodyReference}\n >\n {props.productsMainInfo?.map((rating, key) => {\n return rating.productRating !== undefined && key === 0 ? (\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__rating-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`rating-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemRating}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='none'\n tabindex='-1'\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.productRating}\n </Node>\n );\n })}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n {props.productsMainInfo?.map((description, key) => {\n return description.productDescription !== undefined && key === 0 ? (\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__description-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`description-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemDescription}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='none'\n tabindex='-1'\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.productDescription}\n </Node>\n );\n })}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n {props.dimensionsProps?.map(dimensionProps => {\n return (\n dimensionProps?.dimensionName && (\n <Node\n className={classnames(\n ProductComparison.dimensionsRowClassName,\n ProductComparison.tableRowClassName,\n dimensionProps.dimensionClassName\n )}\n key={dimensionProps.dimensionClassName}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`${dimensionProps.dimensionName}-${props.currentClickerPosition}`}\n role='menu'\n >\n {renderDynamicHeaderCells(\n dimensionProps.productDimensionValues,\n dimensionProps.dimensionName,\n props.currentClickerPosition\n )}\n </Node>\n\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {renderDynamicCells(dimensionProps.productDimensionValues, props.hoveringCellItemId!)}\n </Node>\n </Node>\n )\n );\n })}\n {props.specificationsProps?.map(specificationProps => {\n return StringExtensions.isNullOrEmpty(specificationProps.specification.TextValue) === false ? (\n <Node\n className={classnames(\n ProductComparison.specificationsRowClassName,\n ProductComparison.tableRowClassName,\n specificationProps.specificationClassName\n )}\n key={specificationProps.specificationClassName}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`${specificationProps.specification.Name}-${props.currentClickerPosition}`}\n role='menu'\n >\n {renderDynamicHeaderCells(\n specificationProps.specificationValues,\n specificationProps.specification.Name!,\n props.currentClickerPosition\n )}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {renderDynamicCells(specificationProps.specificationValues, props.hoveringCellItemId!)}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__sku-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`sku-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemSku}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.product.productInfo.ItemId}\n </Node>\n );\n })}\n </Node>\n </Node>\n </Node>\n </Node>\n </Node>\n </Node>\n ) : (\n undefined\n )}\n </Module>\n );\n};\n\nexport default ProductComparisonViewFunctionalComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 classnames from 'classnames';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state.\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, 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\n const className = classnames(\n 'ms-refine-submenu',\n 'list-group',\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\n );\n\n return (\n <div className={className}>\n <Button\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\n aria-label={productRefinerHierarchy.KeyName}\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 {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n isMobile\n } = this.props;\n const isSingleSelect =\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n return (\n <RefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue =>\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\n )}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index={index}\n context={context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n <ul\n className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`}\n {...role}\n aria-label={productRefinerHierarchy.KeyName}\n >\n {listItems}\n </ul>\n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\n ) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n } = 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\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\n : `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}`}>{listItems}</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.\n * All rights reserved. See LICENSE 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 }) => (\n <span>\n {` `}\n {separator}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 { ReviewsList, ReviewsListView };\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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'>{props.text}</p>;\n};\n\nexport const SignInButton: React.FC<{ text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent }> = (props: {\n text: string;\n href: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n}) => {\n const { text, href, ariaLabel, telemetryContent } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <a href={href} className='ms-write-review__sign-in-btn msc-btn' aria-label={ariaLabel} {...attributes}>\n {text}\n </a>\n );\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 (\n <button id={id} className='ms-write-review__toggle msc-btn' aria-label={ariaLabel} onClick={onClick} ref={innerRef} {...attributes}>\n {text}\n </button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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(\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: Msdyn365.ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n ): 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 private readonly writeReviewCallbacks: IWriteReviewCallbacks = {\n // @ts-expect-error\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 public constructor(props: IWriteReviewProps<IWriteReviewData>) {\n super(props);\n const {\n userReview: { result: userReview }\n } = 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(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n product: { result: product },\n userReview: { result: userReview }\n } = 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: (\n <SignInButton\n text={resources.signInLabel}\n ariaLabel={resources.signInAriaLabel}\n href={userInfo.signInUrl!}\n telemetryContent={this.telemetryContent}\n />\n ),\n modalToggle: !Msdyn365.isOboRequest(this.props.context.request) && 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 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\nexport default WriteReview;\n","export * from './link';\r\nexport * from './product-search-result-items';\r\nexport * from './feature-search-result-item';\r\nexport * from './title';\r\nexport * from './separator';\r\nexport * from './range-refine-item';\r\nexport * from './refine-item';\r\nexport * from './refine-item-toggle-notification';\r\nexport * from './refine-item.props.common';\r\nexport * from './utilities';\r\nexport * from './choice-summary';\r\nexport * from './choice-summary.props';\r\nexport * from './modal';\r\nexport * from './refine-submenu';\r\nexport * from './error-message';\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { ISwatchItem, PriceComponent, RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, IImageSettings, Image, msdyn365Commerce, getUrlSync, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { AttributeValue, ProductDimension, ProductDimensionType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getFallbackImageUrl,\n getProductUrlSync,\n ObjectExtensions,\n Random,\n StringExtensions,\n convertProductDimensionTypeToDimensionTypes,\n DimensionTypes,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, format, Heading, IModuleProps, INodeProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { debounce } from 'lodash';\n\nimport { ProductComparisonState } from '../product-comparison-state';\nimport {\n getProductsInProductComparisonAction,\n GetProductsInProductComparisonInput,\n IDimensionResult,\n IProductComparisonItemData\n} from './actions';\nimport { ProductSpecification, RemoveFromComparisonButtonComponent } from './base';\nimport { IProductComparisonData } from './product-comparison.data';\nimport { IProductComparisonProps } from './product-comparison.props.autogenerated';\n\n/**\n * Represents product comparison view props for main product info.\n */\nexport interface IProductComparisonProductMainInfo {\n cellContainerProps: INodeProps;\n tableCellProps: INodeProps;\n tableHeaderProps: INodeProps;\n\n product: IProductComparisonItemData;\n productUrl?: string;\n\n isFromCurrentCatalog: boolean;\n\n removeFromComparisonButton: React.ReactNode;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productPrice: React.ReactNode;\n quickView: React.ReactNode;\n goToProductDetailsButton: React.ReactNode;\n productRating: React.ReactNode;\n productDescription: React.ReactNode;\n}\n\n/**\n * Specifies the type of selection.\n */\nexport enum SelectionType {\n text = 'text',\n swatch = 'swatch'\n}\n\n/**\n * Represents product comparison view props.\n */\nexport interface IProductComparisonViewProps extends IProductComparisonProps<{}> {\n moduleProps: IModuleProps;\n\n isMainContentReady: boolean;\n isEmptyContent: boolean;\n productCountText?: string;\n\n actionBarContainerProps: INodeProps;\n\n heading: React.ReactNode;\n loading: React.ReactNode;\n emptyComparison: React.ReactNode;\n clearAllButton: React.ReactNode;\n previousClicker: React.ReactNode;\n nextClicker: React.ReactNode;\n backToShopping: React.ReactNode;\n\n productsMainInfo?: IProductComparisonProductMainInfo[];\n\n tableReference?: React.RefObject<HTMLDivElement>;\n\n tableHeaderReference?: React.RefObject<HTMLDivElement>;\n\n tableBodyReference?: React.RefObject<HTMLDivElement>;\n\n tableCellReference?: React.RefObject<HTMLDivElement>;\n\n shouldShowPreviousClicker?: boolean;\n shouldShowNextClicker?: boolean;\n currentClickerPosition?: number;\n\n hoveringCellItemId?: string;\n hoverStateLastUpdate?: number;\n\n uniqueSpecifications?: AttributeValue[];\n uniqueDimensionIds?: number[];\n\n dimensionsProps?: (\n | {\n dimensionId: number;\n dimensionName: string | undefined;\n dimensionClassName: string;\n productDimensionValues: {\n dimensionProps: { RecordId: number; Value: string; DimensionId: number; ImageUrl: string | undefined };\n productMainInfo: IProductComparisonProductMainInfo;\n node: JSX.Element;\n }[];\n }\n | undefined\n )[];\n\n specificationsProps?: {\n specification: AttributeValue;\n specificationClassName: string;\n specificationValues: {\n productSpecification: AttributeValue | undefined;\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[];\n }[];\n\n clearAllProductsFromComparison(): void;\n removeProductFromList?(itemId: string): void;\n handleScroll?(event: React.UIEvent<HTMLDivElement>): void;\n handleHoverIn?(itemId: string): () => void;\n handleHoverOut?(itemId: string): () => void;\n handlePreviousClick?(): void;\n handleNextClick?(): void;\n}\n\n/**\n * Represents the state of the product comparison component.\n */\nexport interface IProductComparisonState {\n productsData?: IProductComparisonItemData[];\n hoverStateLastUpdate?: number;\n hoveringCellItemId?: string;\n currentClickerPosition?: number;\n}\n\n/**\n * Represents the direction of product clicker.\n */\nexport enum ProductClickerDirections {\n left = 0,\n right = 1\n}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductComparison extends React.Component<IProductComparisonProps<IProductComparisonData>, IProductComparisonState> {\n public static readonly className: string = 'msc-product-comparison';\n\n public static readonly mainContainerClassName = `${ProductComparison.className}__main-container`;\n\n public static readonly containerClassName = `${ProductComparison.mainContainerClassName}__container`;\n\n public static readonly tableClassName = `${ProductComparison.containerClassName}__table`;\n\n public static readonly tableHeaderClassName = `${ProductComparison.tableClassName}__header`;\n\n public static readonly productRowClassName = `${ProductComparison.tableHeaderClassName}__product-row`;\n\n public static readonly tableClickerClassName = `${ProductComparison.tableClassName}__clicker`;\n\n public static readonly tableBodyClassName = `${ProductComparison.tableClassName}__body`;\n\n public static readonly tableRowClassName = `${ProductComparison.tableClassName}__row`;\n\n public static readonly dimensionsRowClassName = `${ProductComparison.tableBodyClassName}__dimensions-row`;\n\n public static readonly specificationsRowClassName = `${ProductComparison.tableBodyClassName}__specifications-row`;\n\n public static readonly tableRowContentClassName = `${ProductComparison.tableClassName}__row-content`;\n\n public static readonly tableHeaderCellClassName = `${ProductComparison.tableRowClassName}__header-cell`;\n\n public static readonly tableCellClassName = `${ProductComparison.tableRowClassName}__cell`;\n\n public static readonly actionBarClassName = `${ProductComparison.className}__action-bar`;\n\n public static readonly tableHeaderLockedClassName = `${ProductComparison.tableHeaderClassName}__locked`;\n\n public static readonly tableRowContentInformationClassName = `${ProductComparison.tableRowContentClassName}__information`;\n\n private readonly _tableReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableHeaderReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableBodyReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableCellReference?: React.RefObject<HTMLDivElement>;\n\n private _shouldShowPreviousClicker?: boolean;\n\n private _shouldShowNextClicker?: boolean;\n\n private _hoveringCellItemId?: string;\n\n private readonly _instanceId: string;\n\n private static _getProductsSpecifications(products: IProductComparisonItemData[]): AttributeValue[] {\n const specifications = products.map(product => product.specifications?.specificationsList);\n const allSpecifications: AttributeValue[] = ArrayExtensions.flatten(specifications);\n\n const emptyAttributeValue = 0;\n const specificationNames = ArrayExtensions.validValues(\n allSpecifications\n .filter(specification => specification.AttributeValueId !== emptyAttributeValue)\n .map(specification => specification.Name)\n );\n const uniqueSpecificationNames = ArrayExtensions.unique(specificationNames);\n const uniqueSpecifications = ArrayExtensions.validValues(\n uniqueSpecificationNames.map(name => allSpecifications.find(specification => specification.Name === name))\n );\n\n return uniqueSpecifications;\n }\n\n private static _getProductsDimensions(products: IProductComparisonItemData[]): number[] {\n const dimensions = products.map(product => product.productInfo.Dimensions);\n const allDimensions: ProductDimension[] = ArrayExtensions.flatten(dimensions).filter(\n dimension => !ObjectExtensions.isNullOrUndefined(dimension.DimensionValue)\n );\n\n const dimensionIds = ArrayExtensions.validValues(allDimensions.map(dimension => dimension.DimensionTypeValue));\n const uniqueDimensionIds = ArrayExtensions.unique(dimensionIds);\n\n return uniqueDimensionIds;\n }\n\n private static _renderProductDescription(product?: SimpleProduct): React.ReactNode {\n if (StringExtensions.isNullOrWhitespace(product?.Description)) {\n return null;\n }\n return <p className={`${ProductComparison.className}__description`}>{product!.Description}</p>;\n }\n\n private static _getActionBarContainerProps(): INodeProps {\n return {\n className: ProductComparison.actionBarClassName\n };\n }\n\n public constructor(props: IProductComparisonProps<IProductComparisonData>) {\n super(props);\n\n this._instanceId = `${ProductComparison.className}-${this.props.id}-${Random.Guid.generateGuid()}`;\n\n this.state = {\n productsData: undefined,\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined,\n currentClickerPosition: 0\n };\n\n this._tableReference = React.createRef<HTMLDivElement>();\n this._tableHeaderReference = React.createRef<HTMLDivElement>();\n this._tableBodyReference = React.createRef<HTMLDivElement>();\n this._tableCellReference = React.createRef<HTMLDivElement>();\n }\n\n public componentDidMount(): void {\n this._loadProducts();\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).listModifiedEvent.subscribe(\n {\n instanceId: this._instanceId,\n\n /**\n * Updates the state in case the state for the particular product was changed.\n */\n handler: () => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data downloading.\n this._loadProducts();\n }\n }\n );\n if (MsDyn365.isBrowser) {\n window.addEventListener('scroll', () => {\n this._configureBoxShadowOnScroll();\n });\n }\n this._configureBoxShadowOnScroll();\n }\n\n public componentWillUnmount(): void {\n ProductComparisonState.instance(\n this.props.context.request,\n this.props.data.accountInformation?.result\n ).listModifiedEvent.unsubscribe(this._instanceId);\n }\n\n public shouldComponentUpdate(\n nextProps: Readonly<IProductComparisonProps<IProductComparisonData>>,\n nextState: Readonly<IProductComparisonState>\n ): boolean {\n if (this.state.productsData !== nextState.productsData || this.props !== nextProps) {\n return true;\n }\n\n return (\n this.state.hoveringCellItemId !== nextState.hoveringCellItemId ||\n this.state.currentClickerPosition !== nextState.currentClickerPosition\n );\n }\n\n public render(): React.ReactNode | null {\n const viewProps: IProductComparisonViewProps = {\n ...this.props,\n moduleProps: {\n moduleProps: this.props,\n className: ProductComparison.className\n },\n clearAllProductsFromComparison: this._clearAllProductsFromComparison,\n isMainContentReady: false,\n isEmptyContent: false,\n heading: this._renderHeading(),\n loading: this._renderLoading(),\n clearAllButton: this._renderClearAllButton(),\n actionBarContainerProps: ProductComparison._getActionBarContainerProps(),\n previousClicker: this._renderPreviousClicker(),\n nextClicker: this._renderNextClicker(),\n backToShopping: this._renderBackToShoppingButton(),\n emptyComparison: (\n <div className={`${ProductComparison.className}__empty-container`}>{this.props.slots.emptyComparisonContentSlots}</div>\n )\n };\n\n const productsData = this.state.productsData ?? this._getProductComparisonDataByCatalogId(this.props.data.productsData?.result);\n if (productsData === undefined) {\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n const isConsentGiven = this.props.context.request.cookies.isConsentGiven();\n if (!isConsentGiven || !ArrayExtensions.hasElements(productsData)) {\n viewProps.isEmptyContent = true;\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n if (ArrayExtensions.hasElements(productsData)) {\n viewProps.productCountText = this.props.resources.productComparisonCountText.replace('{0}', productsData.length.toString());\n }\n\n this._checkClickersState();\n const productsMainInfoData = this._getProductsMainInfo(productsData);\n const allUniqueDimensionIds = this.getProductsDimensionsIds(productsData);\n const updatedDimensionProps: (\n | {\n dimensionId: number;\n dimensionName: string | undefined;\n dimensionClassName: string;\n productDimensionValues: {\n dimensionProps: { RecordId: number; Value: string; DimensionId: number; ImageUrl: string | undefined };\n productMainInfo: IProductComparisonProductMainInfo;\n node: JSX.Element;\n }[];\n }\n | undefined\n )[] = [];\n allUniqueDimensionIds?.map(dimension => {\n const dimensionValue = this.getUpdatedDimensionsProps(dimension, productsMainInfoData);\n updatedDimensionProps.push(dimensionValue);\n return updatedDimensionProps;\n });\n viewProps.isMainContentReady = true;\n viewProps.tableReference = this._tableReference;\n viewProps.tableHeaderReference = this._tableHeaderReference;\n viewProps.tableBodyReference = this._tableBodyReference;\n viewProps.tableCellReference = this._tableCellReference;\n viewProps.hoverStateLastUpdate = this.state.hoverStateLastUpdate;\n viewProps.hoveringCellItemId = this.state.hoveringCellItemId;\n viewProps.shouldShowPreviousClicker = this._shouldShowPreviousClicker;\n viewProps.shouldShowNextClicker = this._shouldShowNextClicker;\n viewProps.currentClickerPosition = this.state.currentClickerPosition;\n viewProps.handlePreviousClick = this._handlePreviousClick;\n viewProps.handleNextClick = this._handleNextClick;\n viewProps.handleScroll = this._handleScroll;\n viewProps.handleHoverIn = this._handleHoverIn;\n viewProps.handleHoverOut = this._handleHoverOut;\n viewProps.removeProductFromList = this._removeProductFromList;\n viewProps.productsMainInfo = productsMainInfoData;\n viewProps.uniqueDimensionIds = ProductComparison._getProductsDimensions(productsData);\n viewProps.dimensionsProps = updatedDimensionProps;\n viewProps.uniqueSpecifications = ProductComparison._getProductsSpecifications(productsData);\n viewProps.specificationsProps = this._getSpecificationProps(viewProps.uniqueSpecifications, viewProps.productsMainInfo);\n\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n /**\n * Removes all product from the comparison list.\n */\n private readonly _clearAllProductsFromComparison = (): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).clearAll();\n this.setState({ productsData: [] });\n };\n\n /**\n * Configures box shadow on scroll.\n */\n private readonly _configureBoxShadowOnScroll = (): void => {\n const defaultValue = 0;\n if (this._tableReference?.current) {\n const comparisonProductCardHeader: HTMLCollectionOf<Element> = this._tableReference.current.getElementsByClassName(\n ProductComparison.tableHeaderClassName\n );\n if (ArrayExtensions.hasElements(Array.from(comparisonProductCardHeader))) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > defaultValue) {\n comparisonProductCardHeader[0].classList.add(ProductComparison.tableHeaderLockedClassName);\n } else {\n comparisonProductCardHeader[0].classList.remove(ProductComparison.tableHeaderLockedClassName);\n }\n }\n }\n };\n\n private _getProductComparisonDataByCatalogId(\n productData: IProductComparisonItemData[] | undefined\n ): IProductComparisonItemData[] | undefined {\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const productByCatalogId = productData?.filter(product => product.catalogId === catalogId) ?? undefined;\n return productByCatalogId;\n }\n\n private async _loadProducts(): Promise<void> {\n const items = ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).items;\n const input = new GetProductsInProductComparisonInput(items);\n let productData: IProductComparisonItemData[] | undefined;\n await getProductsInProductComparisonAction(input, this.props.context.actionContext).then(item => {\n productData = item;\n });\n const productDataByCatalogId = this._getProductComparisonDataByCatalogId(productData);\n this.setState({ productsData: productDataByCatalogId });\n }\n\n /**\n * Handles scroll inside table.\n * Used to update header position accordingly to the scroll in table body.\n * @param event - Scroll event.\n */\n private readonly _handleScroll = (event: React.UIEvent<HTMLDivElement>) => {\n this._tableHeaderReference?.current?.scrollTo({ top: event.currentTarget.scrollTop, left: event.currentTarget.scrollLeft });\n this._checkClickersState();\n };\n\n /**\n * Handles product clicker click.\n * Used to update table scroll position accordingly to the clicker.\n * @param direction - Direction of scrolling.\n */\n private readonly _handleScrollClick = (direction: ProductClickerDirections) => {\n const tableBody = this._tableBodyReference?.current;\n if (!tableBody) {\n return;\n }\n\n let cellWidth = this._tableCellReference?.current?.clientWidth;\n if (cellWidth === undefined) {\n cellWidth = this._getCellWidth();\n }\n\n let newLeftPosition: number | undefined;\n const scrollPosition = Math.ceil(tableBody.scrollLeft);\n if (direction === ProductClickerDirections.left) {\n newLeftPosition = scrollPosition - cellWidth;\n const minLeftPosition = 0;\n newLeftPosition = Math.max(newLeftPosition, minLeftPosition);\n } else {\n const maxScroll = tableBody.scrollWidth - tableBody.clientWidth;\n newLeftPosition = scrollPosition + cellWidth;\n newLeftPosition = Math.min(newLeftPosition, maxScroll);\n }\n\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n newLeftPosition = -newLeftPosition;\n }\n\n tableBody.scrollTo({\n top: tableBody.scrollTop,\n left: newLeftPosition\n });\n\n this.setState(previousState => {\n if (previousState.currentClickerPosition === undefined) {\n return {};\n }\n let change = 1;\n if (direction === ProductClickerDirections.left) {\n change = -1;\n }\n return {\n currentClickerPosition: previousState.currentClickerPosition + change,\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined\n };\n });\n\n this._checkClickersState();\n };\n\n /**\n * Handles previous product click.\n * Used to update table scroll position accordingly to the clicker.\n */\n private readonly _handlePreviousClick = () => {\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n this._handleScrollClick(ProductClickerDirections.right);\n } else {\n this._handleScrollClick(ProductClickerDirections.left);\n }\n };\n\n /**\n * Handles next product click.\n * Used to update table scroll position accordingly to the clicker.\n */\n private readonly _handleNextClick = () => {\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n this._handleScrollClick(ProductClickerDirections.left);\n } else {\n this._handleScrollClick(ProductClickerDirections.right);\n }\n };\n\n /**\n * Get set width.\n */\n private readonly _getCellWidth = (): number => {\n const tableBody = this._tableBodyReference?.current;\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n let cellWidth: number = 400;\n\n if (viewport === 'xs' && tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 2;\n } else if ((viewport === 'sm' || viewport === 'md') && tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 3;\n } else {\n if (tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 4;\n }\n }\n\n cellWidth = Math.floor(cellWidth);\n\n return cellWidth;\n };\n\n /**\n * Updates clickers state.\n */\n private readonly _checkClickersState = () => {\n const tableBody = this._tableBodyReference?.current;\n if (!tableBody) {\n return;\n }\n\n const previousScrollMinLimit = 0;\n const maxScroll = tableBody.scrollWidth - tableBody.clientWidth;\n const scrollPosition = Math.ceil(tableBody.scrollLeft);\n\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n if (scrollPosition <= previousScrollMinLimit) {\n if (this._shouldShowNextClicker) {\n this._shouldShowNextClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowNextClicker) {\n this._shouldShowNextClicker = true;\n this.forceUpdate();\n }\n\n if (scrollPosition >= maxScroll) {\n if (this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = true;\n this.forceUpdate();\n }\n } else {\n if (scrollPosition <= previousScrollMinLimit) {\n if (this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = true;\n this.forceUpdate();\n }\n\n if (scrollPosition >= maxScroll) {\n if (this._shouldShowNextClicker) {\n this._shouldShowNextClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowNextClicker) {\n this._shouldShowNextClicker = true;\n this.forceUpdate();\n }\n }\n };\n\n /**\n * Removes the product from a list.\n * @param itemId - The id of a product to remove.\n */\n private readonly _removeProductFromList = (itemId: string): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).removeItemById(itemId);\n this.setState(previousState => {\n let newClickerPosition = previousState.currentClickerPosition;\n if (newClickerPosition && !this._shouldShowNextClicker && this._shouldShowPreviousClicker) {\n newClickerPosition -= 1;\n }\n return {\n productsData: previousState.productsData?.filter(item => item.itemId !== itemId),\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined,\n currentClickerPosition: newClickerPosition\n };\n });\n };\n\n /**\n * Prepares quick view component for the given product.\n * @param product - Product information.\n * @returns The quick view component or null if no quick view info is provided.\n */\n private _renderQuickView(product: IProductComparisonItemData): React.ReactNode | null {\n const quickViewSlot = ArrayExtensions.hasElements(this.props.slots.quickViews) ? this.props.slots.quickViews[0] : null;\n if (ObjectExtensions.isNullOrUndefined(quickViewSlot)) {\n return null;\n }\n\n const selectedDimensions = product.productInfo.Dimensions?.filter(dimension => dimension.DimensionValue?.Value);\n\n return React.cloneElement(quickViewSlot as React.ReactElement, {\n selectedProductId: product.productInfo.RecordId,\n selectedDimensions\n });\n }\n\n /**\n * Handles entering into hover mode.\n * @param itemId - Item id of the cell which is hovered.\n * @returns Event handler.\n */\n private readonly _handleHoverIn = (itemId: string) => () => {\n this._hoveringCellItemId = itemId;\n\n this.setState({\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: itemId\n });\n };\n\n /**\n * Handles exiting from the hover mode.\n * @param itemId - Item id of the cell which is hovered.\n * @returns Event handler.\n */\n private readonly _handleHoverOut = (itemId: string) => () => {\n if (this._hoveringCellItemId !== itemId) {\n return;\n }\n\n this._hoveringCellItemId = undefined;\n debounce(() => {\n this.setState({\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined\n });\n }, 10);\n };\n\n /**\n * Retrieves product image react node.\n * @param className - Class name to use.\n * @param product - Product info.\n * @returns React node.\n */\n private _renderProductImage(className: string, product?: SimpleProduct): React.ReactNode | undefined {\n const {\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: {\n app: { OmniChannelMedia }\n }\n }\n } = this.props;\n\n if (ObjectExtensions.isNullOrUndefined(product)) {\n return undefined;\n }\n\n const defaultImageSettingsQ = 'w=140&h=140&m=6';\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: defaultImageSettingsQ, w: 0, h: 0 },\n lg: { q: defaultImageSettingsQ, w: 0, h: 0 },\n xl: { q: defaultImageSettingsQ, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Image\n altText={product?.Name}\n key={product.Name}\n src={product.PrimaryImageUrl ?? ''}\n fallBackSrc={getFallbackImageUrl(product.ItemId, apiSettings, OmniChannelMedia) ?? ''}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={defaultImageSettings}\n loadFailureBehavior='empty'\n className={className}\n requestContext={this.props.context.actionContext.requestContext}\n />\n );\n }\n\n private _getTableHeaderProps(itemId: string): INodeProps {\n const isHoverModeEnabled = this.state.hoveringCellItemId === itemId;\n let headerClassName = ProductComparison.tableHeaderCellClassName;\n if (isHoverModeEnabled) {\n headerClassName = classnames(headerClassName, 'msc-product-comparison__cell-hover');\n }\n return {\n className: headerClassName,\n key: `${headerClassName}__product-${itemId}-${this.state.hoveringCellItemId}-${this.state.currentClickerPosition}`,\n onMouseEnter: this._handleHoverIn(itemId),\n onMouseLeave: this._handleHoverOut(itemId)\n };\n }\n\n private _getTableCellProps(itemId: string): INodeProps {\n const isHoverModeEnabled = this.state.hoveringCellItemId === itemId;\n let cellClassName = ProductComparison.tableCellClassName;\n if (isHoverModeEnabled) {\n cellClassName = classnames(cellClassName, 'msc-product-comparison__cell-hover');\n }\n return {\n className: cellClassName,\n key: `${cellClassName}__product-${itemId}-${this.state.hoveringCellItemId}`,\n onMouseEnter: this._handleHoverIn(itemId),\n onMouseLeave: this._handleHoverOut(itemId),\n role: 'menuitem',\n tabIndex: 0\n };\n }\n\n private _renderProductRating(rating?: RatingsSummary): React.ReactNode {\n if (ObjectExtensions.isNullOrUndefined(rating?.averageRating)) {\n return null;\n }\n\n const ratingValue = rating!;\n\n const defaultReviewsCount = 0;\n\n return (\n <RatingComponent\n avgRating={ratingValue.averageRating!}\n readOnly\n ariaLabel={format(this.props.resources.productComparisonProductItemRatingAriaLabel, ratingValue.averageRating, '5')}\n ratingCount={`${ratingValue.reviewsCount ?? defaultReviewsCount}`}\n shouldShowFullRatingDescription\n data={{}}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n />\n );\n }\n\n private _renderBackToShoppingButton() {\n return (\n <Button\n className='msc-product-comparison__back-button'\n {...this.props.telemetry}\n role='button'\n href='#'\n onClick={this._goBack}\n title={this.props.resources.backToShoppingLabel}\n >\n {this.props.resources.backToShoppingLabel}\n </Button>\n );\n }\n\n private readonly _goBack = (): void => {\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n if (document.referrer === '') {\n window.location.href = backToShoppingUrl;\n } else {\n window.history.back();\n }\n };\n\n /**\n * Retrieves localized text for dimension.\n * @param dimensionId - Dimension id.\n * @returns Localized text.\n */\n private _getDimensionName(dimensionId: number): string | undefined {\n if (dimensionId === ProductDimensionType.Color) {\n return this.props.resources.productComparisonProductItemColorDimension;\n }\n if (dimensionId === ProductDimensionType.Size) {\n return this.props.resources.productComparisonProductItemSizeDimension;\n }\n\n if (dimensionId === ProductDimensionType.Style) {\n return this.props.resources.productComparisonProductItemStyleDimension;\n }\n return undefined;\n }\n\n private getUpdatedDimensionsProps(dimensionId: number, products: IProductComparisonProductMainInfo[]) {\n const dimensionClassName = `${ProductComparison.dimensionsRowClassName}__dimension-${dimensionId}`;\n const dimensionDescription = this._getDimensionName(dimensionId);\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimensionId);\n let dimensionSelectionType = SelectionType.text;\n\n const dimensionsAsSwatchConfiguration: DimensionTypes[] | undefined = this.props.context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsAsSwatchConfiguration) &&\n !dimensionsAsSwatchConfiguration?.includes(DimensionTypes.none) &&\n dimensionsAsSwatchConfiguration?.includes(dimensionName)\n ) {\n dimensionSelectionType = SelectionType.swatch;\n }\n\n const productDimensionValues = products.map(productMainInfo => {\n let dimension: IDimensionResult[] = [];\n let textValue: string = '';\n let renderSwatch: JSX.Element | undefined;\n this.props.data.productsData?.result?.map(productsDimension => {\n if (productsDimension.productInfo.RecordId === productMainInfo.product.productInfo.RecordId) {\n dimension = productsDimension.dimensions?.dimensions ?? [];\n }\n return dimension;\n });\n\n if (dimensionSelectionType === SelectionType.swatch) {\n renderSwatch = (\n <div className='msc-product__dimensions'>\n {dimension.map(dimensionItems => {\n return (\n <div\n className='msc-product__dimensions-item'\n key={`msc-product__dimensions-item-${productMainInfo.product.itemId}`}\n >\n {dimensionItems.result.map(dimensionItem => {\n let currentDimensionId: number | undefined;\n const swatches =\n dimensionItem.map<ISwatchItem>(swatchItem => {\n let isDefaultDimension: boolean = false;\n const selectedDimensions = productMainInfo.product.productInfo.Dimensions?.filter(\n item => item.DimensionTypeValue === swatchItem.DimensionTypeValue\n );\n selectedDimensions?.map(selectedDimension => {\n if (\n selectedDimension.DimensionValue !== undefined &&\n selectedDimension.DimensionValue.DimensionId ===\n swatchItem.DimensionValue?.DimensionId\n ) {\n isDefaultDimension = true;\n }\n return isDefaultDimension;\n });\n\n if (swatchItem.DimensionTypeValue === dimensionId) {\n currentDimensionId = swatchItem.DimensionTypeValue;\n }\n const dimensionType = dimensionName;\n return {\n itemId: `${swatchItem.DimensionValue?.RecordId ?? ''}-${swatchItem.DimensionValue\n ?.Value ?? ''}`,\n value: swatchItem.DimensionValue?.Value ?? '',\n dimensionType,\n colorHexCode: swatchItem.DimensionValue?.ColorHexCode,\n imageUrl: swatchItem.DimensionValue?.ImageUrl,\n isDefault: isDefaultDimension\n };\n }) ?? [];\n if (currentDimensionId && currentDimensionId === dimensionId) {\n return (\n <SwatchComponent\n key={dimensionId}\n apiSettings={this.props.context.request.apiSettings}\n list={swatches}\n isSelectionEnabled={false}\n />\n );\n }\n return null;\n })}\n </div>\n );\n })}\n </div>\n );\n }\n\n if (dimensionSelectionType === SelectionType.text) {\n dimension.map(item => {\n return item.result.map(items => {\n return items.map(dimensionItem => {\n if (dimensionItem.DimensionTypeValue === dimensionId) {\n const productDimensionSeperatorValue =\n textValue !== ''\n ? this.props.resources.productDimensionSeparator\n : this.props.resources.productDimensionSeparator.replace('/', '');\n textValue = textValue + format(productDimensionSeperatorValue, dimensionItem.DimensionValue?.Value ?? '');\n }\n return textValue;\n });\n });\n });\n }\n\n const dimensionProps = {\n RecordId: productMainInfo.product.productInfo.RecordId,\n Value: textValue,\n DimensionId: dimensionId,\n ImageUrl: productMainInfo.product.productInfo.PrimaryImageUrl\n };\n\n return {\n dimensionProps,\n productMainInfo,\n node: (\n <div key={`${productMainInfo.product.itemId}-${dimensionClassName}`}>\n {dimensionSelectionType === SelectionType.swatch ? renderSwatch : dimensionProps.Value}\n </div>\n )\n };\n });\n return {\n dimensionId,\n dimensionName: dimensionDescription,\n dimensionClassName,\n productDimensionValues\n };\n }\n private _getSpecificationProps(specifications: AttributeValue[], products: IProductComparisonProductMainInfo[]) {\n return specifications.map(specification => {\n const specificationClassName = `${ProductComparison.specificationsRowClassName}__specification-${specification.Name!}`;\n\n const specificationValues = products.map(productMainInfo => {\n const productSpecification = productMainInfo.product.specifications?.specificationsList.find(\n productSpecifications => productSpecifications.Name === specification.Name\n );\n\n return {\n productSpecification,\n productMainInfo,\n node: (\n <div key={`${productMainInfo.product.itemId}-${specificationClassName}`}>\n <ProductSpecification\n specification={productSpecification}\n telemetry={this.props.telemetry}\n context={this.props.context}\n resources={this.props.resources}\n />\n </div>\n )\n };\n });\n\n return {\n specification,\n specificationClassName,\n specificationValues\n };\n });\n }\n\n private _renderHeading(): React.ReactNode {\n return <Heading className={`${ProductComparison.className}__header`} text={this.props.resources.productComparisonTitle} />;\n }\n\n private _renderLoading(): React.ReactNode {\n return <div className={`${ProductComparison.className}__loading`}>{this.props.resources.productComparisonLoadingText}</div>;\n }\n\n private _renderClearAllButton(): React.ReactNode {\n return (\n <Button\n className={`${ProductComparison.actionBarClassName}__clear-all-button`}\n aria-label={this.props.resources.productComparisonClearAllButtonAriaLabel}\n onClick={this._clearAllProductsFromComparison}\n >\n {this.props.resources.productComparisonClearAllButtonText}\n </Button>\n );\n }\n\n /**\n * Retrieves unique dimension ids of product.\n * @param products - Product.\n * @returns Unique dimension ids.\n */\n private getProductsDimensionsIds(products: IProductComparisonItemData[]): number[] {\n const dimensions = products.map(product => product.productInfo.Dimensions);\n const allDimensions: ProductDimension[] = ArrayExtensions.flatten(dimensions);\n\n const dimensionIds = ArrayExtensions.validValues(allDimensions.map(dimension => dimension.DimensionTypeValue));\n const uniqueDimensionIds = ArrayExtensions.unique(dimensionIds);\n\n return uniqueDimensionIds;\n }\n\n private _renderPreviousClicker(): React.ReactNode {\n return (\n <Button\n className={classnames(ProductComparison.tableClickerClassName, `${ProductComparison.tableClickerClassName}__previous`)}\n role='button'\n onClick={this._handlePreviousClick}\n onKeyUp={this._handlePreviousClick}\n >\n <span className={`${ProductComparison.tableClickerClassName}__previous__icon`} aria-hidden='true' />\n <span className='screen-reader-only'>{this.props.resources.productComparisonPreviousProduct}</span>\n </Button>\n );\n }\n\n private _renderNextClicker(): React.ReactNode {\n return (\n <Button\n className={classnames(ProductComparison.tableClickerClassName, `${ProductComparison.tableClickerClassName}__next`)}\n role='button'\n onClick={this._handleNextClick}\n onKeyUp={this._handleNextClick}\n >\n <span className={`${ProductComparison.tableClickerClassName}__next__icon`} aria-hidden='true' />\n <span className='screen-reader-only'>{this.props.resources.productComparisonNextProduct}</span>\n </Button>\n );\n }\n\n private _renderRemoveFromComparisonButton(itemId: string): React.ReactNode {\n return (\n <RemoveFromComparisonButtonComponent\n className={`${ProductComparison.productRowClassName}__remove`}\n key={itemId}\n resources={this.props.resources}\n itemId={itemId}\n onClickHandler={this._removeProductFromList}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n );\n }\n\n private _getProductsMainInfo(products: IProductComparisonItemData[]): IProductComparisonProductMainInfo[] {\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n return products.map(product => {\n let productUrlLink: string | undefined;\n if (msdyn365Commerce.isBrowser) {\n const productUrl = getProductUrlSync(product.productInfo, this.props.context.actionContext);\n const fullUrl = new URL(productUrl, window.location.href);\n if (isChannelTypeB2B(this.props.context.actionContext.requestContext)) {\n fullUrl.searchParams.set('catalogid', `${product.catalogId}`);\n }\n product.productInfo.Dimensions?.map(dimension => {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n });\n productUrlLink = fullUrl.href;\n }\n const isHoverModeEnabled = this.state.hoveringCellItemId === product.itemId;\n let cellClassName = ProductComparison.tableHeaderCellClassName;\n if (isHoverModeEnabled) {\n cellClassName = classnames(cellClassName, 'msc-product-comparison__cell-hover');\n }\n const isFromCurrentCatalog = product.catalogId === currentCatalogId;\n\n const productImageContainerClassName = `${ProductComparison.productRowClassName}__product-image-container`;\n const productImageClassName = `${productImageContainerClassName}__product-image`;\n const productNameClassName = `${ProductComparison.productRowClassName}__product-name`;\n const productPriceClassName = `${ProductComparison.productRowClassName}__product-price`;\n const cellNewWidth = this._getCellWidth();\n const style = {\n width: `${cellNewWidth}px`,\n minWidth: `${cellNewWidth}px`,\n maxWidth: `${cellNewWidth}px`\n };\n return {\n cellContainerProps: {\n className: cellClassName,\n key: product.itemId,\n ref: this._tableCellReference,\n onMouseEnter: this._handleHoverIn(product.itemId),\n onMouseLeave: this._handleHoverOut(product.itemId),\n role: 'menuitem',\n tabIndex: 0,\n style: style\n },\n product,\n productUrl: productUrlLink,\n removeFromComparisonButton: this._renderRemoveFromComparisonButton(product.itemId),\n productImage: (\n <div className={productImageContainerClassName} key={product.itemId}>\n {this._renderProductImage(productImageClassName, product.productInfo)}\n </div>\n ),\n productLink: (\n <a className={productNameClassName} href={productUrlLink} key={product.itemId}>\n {product.productInfo.Name}\n </a>\n ),\n productPrice: (\n <div className={productPriceClassName} key={product.itemId}>\n {product.price && (\n <PriceComponent\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ price: product.price }}\n freePriceText={this.props.resources.productComparisonProductItemFreePrice}\n originalPriceText={this.props.resources.productComparisonProductItemOriginalPrice}\n currentPriceText={this.props.resources.productComparisonProductItemCurrentPrice}\n />\n )}\n </div>\n ),\n quickView: this._renderQuickView(product),\n isFromCurrentCatalog,\n goToProductDetailsButton: (\n <Button href={productUrlLink} title={this.props.resources.productComparisonGoToProductDetailsButtonText}>\n {this.props.resources.productComparisonGoToProductDetailsButtonText}\n </Button>\n ),\n tableCellProps: this._getTableCellProps(product.itemId),\n tableHeaderProps: this._getTableHeaderProps(product.itemId),\n productRating:\n product.rating !== undefined ? <div key={product.itemId}>{this._renderProductRating(product.rating)}</div> : undefined,\n productDescription:\n product.productInfo !== undefined ? (\n <div key={product.itemId}>{ProductComparison._renderProductDescription(product.productInfo)}</div>\n ) : (\n undefined\n )\n };\n });\n }\n}\n\nexport default ProductComparison;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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(reviewId: string, tenantId: string, locale: string, concernCategory: string, authToken: string, serviceEndpoint: string) {\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.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './actions';\nexport * from './base';\nexport * from './product-comparison';\nexport * from './product-comparison.props.autogenerated';\nexport * from './product-comparison.view';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 <Module {...SocialShareItem}>{SocialShareItemElement}</Module>;\n};\n\nexport default SocialShareItemView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { format, INodeProps, Progress } 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: (\n <span aria-hidden='true' className='ms-ratings-histogram__star'>\n {stars}\n </span>\n ),\n percentage: (\n <span aria-hidden='true' className='ms-ratings-histogram__percentage'>\n {formattedPercent}\n </span>\n ),\n bar: <Progress value={percentage * 100} max={100} ariaLabel={ariaLabel} className='ms-ratings-histogram__bar' />,\n buttonProps: {\n tag: 'button',\n className: 'ms-ratings-histogram__item',\n onClick: () => {\n props.onClick(stars);\n }\n }\n };\n};\n\nexport const AverageRatingNumber: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (\n <p className='ms-ratings-histogram__average'>\n {props.summary.averageRating}\n {` `}/ 5\n </p>\n );\n};\n\nexport const TotalReviews: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return <p className='ms-ratings-histogram__total'>{props.summary.totalRatingsCount}</p>;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\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 =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n 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(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\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, 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(\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\n );\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(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\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 =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n 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(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\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 = (\n sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string\n ): 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 ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\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 )}\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 )}\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 {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = 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 {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = 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(\n selected: string | undefined,\n touched: boolean,\n validationError: string | undefined\n ): 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 if (this.props.productRefinerValue.RefinerRecordId === 0) {\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\n return result;\n }\n return amount || '';\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (element) {\n setTimeout(() => {\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.\n * All rights reserved. See LICENSE 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}>{noReviewsMessage}</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}>{state.reported ? props.headerSubmitted : props.header}</Node>\n <Node {...props.modalBody}>\n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n </Node>\n <Node {...props.modalFooter}>{state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}</Node>\n </Node>\n );\n};\n\nexport default ReviewsListview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Module,\n Node\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC<IWishlistItemsViewProps> = props => {\n const {\n WishlistItems,\n status,\n statusMessage,\n heading,\n Products,\n products,\n Product,\n ProductDetails,\n ProductDimensions,\n telemetryContent,\n statusNotExistsMessage\n } = props;\n\n return (\n <Module {...WishlistItems}>\n {heading}\n {statusNotExistsMessage}\n {status !== 'SUCCESS' && statusMessage}\n {Products && products && products.length > 0 && (\n <Node {...Products}>\n {products &&\n products.map(product => {\n return product && _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n </Node>\n )}\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IWishlistItemViewProps,\n Product?: INodeProps,\n ProductDimensions?: INodeProps,\n ProductDetails?: INodeProps,\n telemetryContent?: ITelemetryContent\n): JSX.Element | null => {\n const {\n key,\n productImage,\n productLink,\n productPrice,\n productDimensions,\n addToCartButton,\n removeButton,\n productStatusMessage,\n entireProductLink,\n productName,\n productAriaLabel,\n inventoryInformation,\n productUnitOfMeasure\n } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n <Node key={key} className={Product!.className} {...Product}>\n <Node\n href={entireProductLink}\n className={classnames('entire-product-link ', ProductDetails!.className)}\n {...productAttributes}\n aria-label={productAriaLabel}\n tag={ProductDetails!.tag}\n >\n {productImage}\n {productName}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {productUnitOfMeasure}\n </Node>\n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n }\n return (\n <Node key={key} className={Product!.className} {...Product}>\n {productImage}\n {productLink}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n};\n\nexport default WishlistItemsView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 }) => (\n <a className={className} href={href} aria-label={ariaLabel}>\n {' '}\n {text}{' '}\n </a>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\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\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.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\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","/*!\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\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nexport interface IWishlistItemDimension {\r\n key: string;\r\n className?: string;\r\n dimensionType: string;\r\n dimensionValue: string;\r\n}\r\n\r\nexport const WishlistItemDimension: React.FC<IWishlistItemDimension> = ({ key, className, dimensionType, dimensionValue }) => (\r\n <div key={key} className={className}>\r\n <span className='msc-wishlist-dimension__label'>{dimensionType}:</span>\r\n <span className='msc-wishlist-dimension__value'>{dimensionValue}</span>\r\n </div>\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\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport {\r\n CommerceListLine,\r\n ProductPrice,\r\n ReleasedProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport {\r\n convertProductDimensionTypeToDimensionTypes,\r\n getFallbackImageUrl,\r\n StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IWishlistItemActionMessageState } from '../citta-b2b-wishlist-items';\r\nimport { WishlistItemDimension } from './citta-b2b-wishlist-items-dimensions';\r\n\r\nexport interface IWishlistItemProps extends CommerceListLine {\r\n product: SimpleProduct;\r\n wishlistState: IWishlistItemActionMessageState;\r\n price?: ProductPrice;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n productUrl: string;\r\n imageSettings?: IImageSettings;\r\n removeFromWishlistText: string;\r\n isInStock: boolean;\r\n addToCartText: string;\r\n outOfStockText: string;\r\n index: number;\r\n itemKey: string;\r\n telemetry: ITelemetry;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n enableImageProductLink?: boolean;\r\n inventoryInformationLabel?: string;\r\n inventoryLabelClassName?: string;\r\n telemetryContent?: ITelemetryContent;\r\n handlers: {\r\n onAddToCart(product: SimpleProduct, itemKey: string): void;\r\n onRemoveItem(productId: number): void | undefined;\r\n onDismiss(): void;\r\n };\r\n resources: {\r\n productDimensionTypeColor: string;\r\n productDimensionTypeSize: string;\r\n productDimensionTypeStyle: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n freePriceText: string;\r\n };\r\n}\r\n\r\nexport interface IWishlistItemViewProps {\r\n key: string;\r\n productImage: React.ReactNode;\r\n productLink: React.ReactNode;\r\n productDimensions?: React.ReactNode[];\r\n productPrice?: React.ReactNode;\r\n addToCartButton?: React.ReactNode;\r\n removeButton?: React.ReactNode;\r\n productStatusMessage?: React.ReactNode;\r\n productName?: React.ReactNode;\r\n productAriaLabel?: string;\r\n entireProductLink?: string;\r\n inventoryInformation?: React.ReactNode;\r\n productUnitOfMeasure?: React.ReactNode;\r\n}\r\n\r\nconst _addItemToCart = (props: IWishlistItemProps): void => {\r\n const { product, itemKey, handlers } = props;\r\n const { onAddToCart } = handlers;\r\n\r\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\r\n};\r\n\r\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\r\n const { onRemoveItem } = props.handlers;\r\n const { RecordId } = props.product;\r\n\r\n onRemoveItem && RecordId && onRemoveItem(RecordId);\r\n};\r\n\r\nconst WishListItemActions = {\r\n addToCart: _addItemToCart,\r\n removeItem: _removeItemFromWishlist\r\n};\r\n\r\nconst _getFullProductLink = (props: IWishlistItemProps): string => {\r\n if (!msdyn365Commerce.isBrowser) {\r\n return '';\r\n }\r\n\r\n const fullUrl = new URL(props.productUrl, window.location.href);\r\n for (const dimension of props.product.Dimensions ?? []) {\r\n const dimensionValue = dimension.DimensionValue?.Value;\r\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\r\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\r\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\r\n }\r\n }\r\n return fullUrl.href;\r\n // return updateProductUrl(productUrl, context, swatch);\r\n};\r\n\r\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\r\n const { product, price, context, resources } = props;\r\n\r\n const { Name, Dimensions } = product;\r\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\r\n\r\n let formattedPrice = 'Free';\r\n let dimensions = null;\r\n\r\n if (price) {\r\n formattedPrice =\r\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\r\n }\r\n\r\n if (Dimensions) {\r\n dimensions = Dimensions.map(productDimension => {\r\n switch (productDimension.DimensionTypeValue) {\r\n case 1:\r\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\r\n case 3:\r\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\r\n case 4:\r\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\r\n default:\r\n return '';\r\n }\r\n });\r\n }\r\n\r\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\r\n};\r\n\r\n/**\r\n * Renders a link to a product based on the given props.\r\n * @param input - Wishlist item props with the info about the product.\r\n * @param productUrl - The url to the product.\r\n * @returns React component with a link to a product.\r\n */\r\nconst renderProductLink = (input: IWishlistItemProps, productUrl: string) => {\r\n const { telemetryContent } = input;\r\n const { RecordId: recordId, Name: productName } = input.product;\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\r\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const productPageUrlWithSwatch = productUrl;\r\n return (\r\n !StringExtensions.isNullOrWhitespace(productPageUrlWithSwatch) && (\r\n <a\r\n href={productPageUrlWithSwatch}\r\n className='ms-wishlist-items__product-link'\r\n {...productAttributes}\r\n aria-label={_renderAriaLabel(input)}\r\n >\r\n {productName}\r\n </a>\r\n )\r\n );\r\n};\r\n\r\n/**\r\n * Renders a product name box.\r\n * @param productName - The text to display.\r\n * @returns React component with a name of a product.\r\n */\r\nconst renderProductName = (productName: string) => {\r\n return <div className='ms-wishlist-items__product-title'>{productName}</div>;\r\n};\r\n\r\n/**\r\n * Renders inventory information.\r\n * @param inventoryInformationLabel - The text to display.\r\n * @param inventoryLabelClassName - The component class name.\r\n * @returns React component.\r\n */\r\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\r\n const inventoryCssName = inventoryLabelClassName\r\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\r\n : 'ms-wishlist-items__inventory-label';\r\n return (\r\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\r\n <span className={inventoryCssName}>{inventoryInformationLabel}</span>\r\n )\r\n );\r\n};\r\n\r\n/**\r\n * Renders add to cart button.\r\n * @param input - Wishlist item props with the configuration.\r\n * @returns React component.\r\n */\r\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\r\n const { isInStock, addToCartText, outOfStockText } = input;\r\n\r\n // Check if the product is service or not by product type.\r\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n const addItemAction = React.useCallback(() => {\r\n WishListItemActions.addToCart(input);\r\n }, [input]);\r\n\r\n return (\r\n <Button\r\n className='ms-wishlist-items__product-add-button'\r\n title={((isServiceItem || isInStock) && addToCartText) || outOfStockText}\r\n onClick={addItemAction}\r\n disabled={!(isServiceItem || isInStock)}\r\n >\r\n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\r\n </Button>\r\n );\r\n};\r\n\r\n/**\r\n * Renders remove from wishlist button.\r\n * @param input - Wishlist item props with the configuration.\r\n * @returns React component.\r\n */\r\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\r\n const { removeFromWishlistText } = input;\r\n\r\n const removeItemAction = React.useCallback(() => {\r\n WishListItemActions.removeItem(input);\r\n }, [input]);\r\n\r\n return <button className='ms-wishlist-items__product-remove-button' aria-label={removeFromWishlistText} onClick={removeItemAction} />;\r\n};\r\n\r\n/**\r\n * Gets the react node for product unit of measure display.\r\n * @param context - Module context.\r\n * @param unitOfMeasure - Product unit of measure.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\nconst renderUnitOfMeasure = (context: ICoreContext<IGeneric<IAny>>, unitOfMeasure?: string) => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\r\n if (context.app.config && (!context.app.config.unitOfMeasureDisplayType || context.app.config.unitOfMeasureDisplayType === 'none')) {\r\n return undefined;\r\n }\r\n\r\n if (!unitOfMeasure) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n <div className='msc-wishlistitems__product-unit-of-measure'>\r\n <span>{unitOfMeasure}</span>\r\n </div>\r\n );\r\n};\r\n\r\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\r\n const {\r\n product,\r\n price,\r\n context,\r\n imageSettings,\r\n wishlistState,\r\n itemKey,\r\n handlers,\r\n inventoryInformationLabel,\r\n enableImageProductLink,\r\n inventoryLabelClassName\r\n } = input;\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\r\n if (product.RecordId) {\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const productUrl = _getFullProductLink(input);\r\n return {\r\n key: `${RecordId}-item`,\r\n productImage:\r\n PrimaryImageUrl && Name && _renderProductImage(context, product.Name!, PrimaryImageUrl, fallbackImage, imageSettings),\r\n productLink: renderProductLink(input, productUrl),\r\n productDimensions: Dimensions && _renderProductDimensions(input),\r\n productPrice: price && _renderPrice(input),\r\n productUnitOfMeasure: product.DefaultUnitOfMeasure && renderUnitOfMeasure(context, product.DefaultUnitOfMeasure),\r\n entireProductLink: enableImageProductLink ? productUrl : undefined,\r\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\r\n productName: enableImageProductLink && Name && renderProductName(Name),\r\n\r\n addToCartButton: <WishlistItemAddToCartButtonComponent {...input} />,\r\n inventoryInformation: renderInventoryInformationLabel(inventoryInformationLabel, inventoryLabelClassName),\r\n removeButton: <WishlistItemRemoveFromWishlistButtonComponent {...input} />,\r\n productStatusMessage: wishlistState &&\r\n wishlistState.isOpen &&\r\n wishlistState.productId === RecordId &&\r\n wishlistState.itemKey === itemKey && (\r\n <div className='ms-wishlist-items__product-status'>\r\n <Alert color={wishlistState.statusCssString} isOpen={wishlistState.isOpen} toggle={handlers.onDismiss}>\r\n <span>{wishlistState.userMessage}</span>\r\n </Alert>\r\n </div>\r\n )\r\n };\r\n }\r\n return null;\r\n};\r\n\r\nconst _renderProductImage = (\r\n context: ICoreContext,\r\n heading: string,\r\n image?: string,\r\n fallbackImage?: string,\r\n imageSettings?: IImageSettings\r\n): JSX.Element | null => {\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n\r\n if (image) {\r\n return (\r\n <Image\r\n requestContext={context.actionContext.requestContext}\r\n className='ms-wishlist-items__product-image'\r\n altText={heading}\r\n title={heading}\r\n src={image}\r\n fallBackSrc={fallbackImage}\r\n gridSettings={context.request.gridSettings!}\r\n imageSettings={imageSettings || defaultImageSettings}\r\n loadFailureBehavior='empty'\r\n />\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\r\n const { price, context, moduleId, moduleTypeName, resources } = props;\r\n\r\n if (price) {\r\n return (\r\n <PriceComponent\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n data={{ price }}\r\n className='ms-wishlist-items__product-price'\r\n freePriceText={resources.freePriceText}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n context={context}\r\n />\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\r\n const { product, resources } = props;\r\n\r\n if (!product || !product.Dimensions) {\r\n return [];\r\n }\r\n\r\n return product.Dimensions.map((dimension, index) => {\r\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\r\n return undefined;\r\n }\r\n\r\n let type = '';\r\n\r\n switch (dimension.DimensionTypeValue) {\r\n case 1: {\r\n type = resources.productDimensionTypeColor;\r\n break;\r\n }\r\n case 3: {\r\n type = resources.productDimensionTypeSize;\r\n break;\r\n }\r\n case 4: {\r\n type = resources.productDimensionTypeStyle;\r\n break;\r\n }\r\n default:\r\n return undefined;\r\n }\r\n\r\n return (\r\n <WishlistItemDimension\r\n key={`${product.RecordId}-dimensions-${index}`}\r\n className='msc-price ms-wishlist-items__product-dimension'\r\n dimensionType={type}\r\n dimensionValue={dimension.DimensionValue.Value}\r\n />\r\n );\r\n });\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\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { wishlistStatus } from '../citta-b2b-wishlist-items';\r\n\r\nexport interface IWishlistItemsStatusMessageProps {\r\n className?: string;\r\n errorType: wishlistStatus;\r\n text?: string;\r\n}\r\n\r\nexport const WishlistItemsStatusMessage: React.FC<IWishlistItemsStatusMessageProps> = ({ className, errorType, text }) => {\r\n switch (errorType) {\r\n case 'EMPTY':\r\n return <p className={classnames('ms-wishlist-items__message-empty', className)}>{text}</p>;\r\n case 'FAILED':\r\n return <p className={classnames('ms-wishlist-items__message-failed', className)}>{text}</p>;\r\n case 'LOADING':\r\n default:\r\n return <p className={className ? 'ms-wishlist-items__message-exists-product' : 'ms-wishlist-items__message-waiting'}>{text}</p>;\r\n }\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\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { AsyncResult, CommerceList, CommerceListLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\r\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport {\r\n ArrayExtensions,\r\n getProductUrlSync,\r\n IProductInventoryInformation,\r\n QueryResultSettingsProxy\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n updateMaxQuantityForCartLineItem\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\r\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\r\nimport { ICittaB2bWishlistItemsData } from './citta-b2b-wishlist-items.data';\r\nimport { IHeadingData, ICittaB2bWishlistItemsProps } from './citta-b2b-wishlist-items.props.autogenerated';\r\n\r\nexport interface IWishlistItemActionMessageState {\r\n productId: number;\r\n itemKey: string;\r\n userMessage: string;\r\n statusCssString: string;\r\n messageGlyph: string;\r\n isOpen: boolean;\r\n isError: boolean;\r\n}\r\n\r\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\r\n\r\nexport interface IWishlistItemsViewProps extends ICittaB2bWishlistItemsProps<ICittaB2bWishlistItemsData> {\r\n WishlistItems: IModuleProps;\r\n status?: wishlistStatus;\r\n statusMessage?: React.ReactNode;\r\n heading?: React.ReactNode;\r\n Products?: INodeProps;\r\n Product?: INodeProps;\r\n ProductDetails?: INodeProps;\r\n ProductDimensions?: INodeProps;\r\n products?: IWishlistItemViewProps[];\r\n telemetryContent?: ITelemetryContent;\r\n statusNotExistsMessage?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * WishlistItems component.\r\n * @extends {React.PureComponent<ICittaB2bWishlistItemsProps<ICittaB2bWishlistItemsData>, IWishlistItemActionMessageState>}\r\n */\r\n@observer\r\nclass WishlistItems extends React.Component<ICittaB2bWishlistItemsProps<ICittaB2bWishlistItemsData>, IWishlistItemActionMessageState> {\r\n private readonly telemetryContent: ITelemetryContent;\r\n constructor(props: ICittaB2bWishlistItemsProps<ICittaB2bWishlistItemsData>) {\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 }\r\n\r\n public async componentDidMount(): Promise<void> {\r\n this.setState({ isError: false });\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: ICittaB2bWishlistItemsProps<ICittaB2bWishlistItemsData>, nextState: IWishlistItemActionMessageState): 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 { heading, className } = this.props.config;\r\n const { emptyWishlistText, wishlistErrorGettingWishlist, noLongerExitsWishlistItemText } = this.props.resources;\r\n const { cart, productAvailability, wishlists, products } = this.props.data;\r\n\r\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\r\n const errorProps: IWishlistItemsViewProps = {\r\n ...(this.props as ICittaB2bWishlistItemsProps<ICittaB2bWishlistItemsData>),\r\n WishlistItems: {\r\n moduleProps: this.props,\r\n className: classnames('ms-wishlist-items', className)\r\n },\r\n status: 'LOADING',\r\n\r\n statusMessage: <WishlistItemsStatusMessage errorType='LOADING' text='Loading...' />,\r\n heading: this._renderHeading(heading)\r\n };\r\n return this.props.renderView(errorProps);\r\n }\r\n\r\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\r\n const errorProps: IWishlistItemsViewProps = {\r\n ...(this.props as ICittaB2bWishlistItemsProps<ICittaB2bWishlistItemsData>),\r\n WishlistItems: {\r\n moduleProps: this.props,\r\n className: classnames('ms-wishlist-items', className)\r\n },\r\n status: 'FAILED',\r\n statusMessage: <WishlistItemsStatusMessage errorType='FAILED' text={wishlistErrorGettingWishlist} />,\r\n heading: this._renderHeading(heading)\r\n };\r\n\r\n return this.props.renderView(errorProps);\r\n }\r\n\r\n const productsList = products && (products as AsyncResult<FullProduct[]>).result;\r\n\r\n if (productsList && productsList.length === 0) {\r\n const emptyViewProps: IWishlistItemsViewProps = {\r\n ...(this.props as ICittaB2bWishlistItemsProps<ICittaB2bWishlistItemsData>),\r\n WishlistItems: {\r\n moduleProps: this.props,\r\n className: classnames('ms-wishlist-items', className)\r\n },\r\n status: 'EMPTY',\r\n statusMessage: <WishlistItemsStatusMessage errorType='EMPTY' text={emptyWishlistText} />,\r\n heading: this._renderHeading(heading)\r\n };\r\n\r\n return this.props.renderView(emptyViewProps);\r\n }\r\n\r\n const viewProps: IWishlistItemsViewProps = {\r\n ...(this.props as ICittaB2bWishlistItemsProps<ICittaB2bWishlistItemsData>),\r\n WishlistItems: {\r\n moduleProps: this.props,\r\n className: classnames('ms-wishlist-items', className)\r\n },\r\n status: 'SUCCESS',\r\n heading: this._renderHeading(heading),\r\n Products: {\r\n className: 'ms-wishlist-items__products',\r\n tag: 'ul'\r\n },\r\n Product: {\r\n className: 'ms-wishlist-items__product',\r\n tag: 'li'\r\n },\r\n ProductDetails: {\r\n className: 'ms-wishlist-items__product-link',\r\n tag: 'a'\r\n },\r\n telemetryContent: this.telemetryContent,\r\n ProductDimensions: {\r\n className: 'ms-wishlist-items__product-dimensions'\r\n },\r\n products: productsList && this._renderProductList(productsList),\r\n statusNotExistsMessage:\r\n productsList && this._getProductNotExists(productsList, emptyWishlistText, noLongerExitsWishlistItemText)\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\r\n\r\n private _getProductNotExists(products: FullProduct[], emptytext: string, noLongerExisttext: string): JSX.Element | null {\r\n if (this.state && this.state.isError) {\r\n if (products.length === 0) {\r\n return <WishlistItemsStatusMessage errorType='SUCCESS' text={emptytext} />;\r\n }\r\n return (\r\n <WishlistItemsStatusMessage\r\n className={'ms-wishlist-items__message-exists-product'}\r\n errorType='SUCCESS'\r\n text={noLongerExisttext}\r\n />\r\n );\r\n }\r\n return null;\r\n }\r\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\r\n const {\r\n priceFree,\r\n originalPriceText,\r\n currentPriceText,\r\n addToCartButtonText,\r\n outOfStockText,\r\n removeButtonText,\r\n productDimensionTypeColor,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle,\r\n productDimensionTypeAmount\r\n } = this.props.resources;\r\n const { context, telemetry } = this.props;\r\n const { imageSettings, enableImageProductLink } = this.props.config;\r\n\r\n return products.map((product: FullProduct, index) => {\r\n const currentProductProps = {\r\n product: product.ProductDetails,\r\n price: product.ProductPrice,\r\n context,\r\n wishlistState: this.state,\r\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\r\n imageSettings,\r\n removeFromWishlistText: removeButtonText,\r\n isInStock: this._isProductInStock(product),\r\n addToCartText: addToCartButtonText,\r\n outOfStockText,\r\n index,\r\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\r\n telemetry,\r\n moduleId: this.props.id,\r\n moduleTypeName: this.props.typeName,\r\n enableImageProductLink,\r\n inventoryInformationLabel: this._inventoryLabel(product),\r\n inventoryLabelClassName: this._inventoryClassName(product),\r\n telemetryContent: this.telemetryContent,\r\n handlers: {\r\n onAddToCart: this._addItemToCart,\r\n onRemoveItem: this._removeItemFromWishlist,\r\n onDismiss: this._onDismiss\r\n },\r\n resources: {\r\n productDimensionTypeColor,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\r\n freePriceText: priceFree,\r\n originalPriceText,\r\n currentPriceText\r\n }\r\n };\r\n return WishlistItem(currentProductProps)!;\r\n });\r\n }\r\n\r\n // Dismiss alert when addingToCart/removeItem\r\n private readonly _onDismiss = () => {\r\n this.setState({\r\n isOpen: false\r\n });\r\n };\r\n\r\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\r\n if (!heading) {\r\n return undefined;\r\n }\r\n return (\r\n <MsDyn365.Text\r\n className='ms-wishlist-items__heading'\r\n tag={heading.tag || 'h2'}\r\n text={heading.text}\r\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\r\n />\r\n );\r\n };\r\n\r\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise<void> => {\r\n const { context, data, resources, telemetry } = this.props;\r\n const { cart, productAvailability } = data;\r\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\r\n\r\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\r\n\r\n if (context) {\r\n if (cart.result) {\r\n const isOrderQuantityLimitsFeatureEnabledInHq =\r\n this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform\r\n ?.enableDefaultOrderQuantityLimits;\r\n const customerInfo = this.props.data.customerInformation.result;\r\n\r\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\r\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\r\n (customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\r\n\r\n // Check if the product delivery mode is electronic\r\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\r\n\r\n const deliveryOptions = await getDeliveryOptionsAsync(\r\n {\r\n callerContext: this.props.context.actionContext,\r\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\r\n },\r\n [product.RecordId]\r\n );\r\n\r\n const isOrderQuantityLimitsFeatureEnabled =\r\n isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\r\n const eoqCount = product.Behavior?.MultipleOfQuantity || 1; \r\n\r\n const addProductToCartInput = {\r\n product,\r\n count: eoqCount,\r\n enableStockCheck: context.app.config.enableStockCheck,\r\n availableQuantity: productInventoryInformation\r\n ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity\r\n : 0,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: isOrderQuantityLimitsFeatureEnabled },\r\n isAddEmailDeliveryItemToCart:\r\n ArrayExtensions.hasElements(deliveryOptions) &&\r\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\r\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\r\n };\r\n\r\n cart.result\r\n .addProductToCart(addProductToCartInput)\r\n .then(async result => {\r\n if (result.status === 'SUCCESS') {\r\n this.setState({\r\n productId: product.RecordId,\r\n itemKey,\r\n userMessage: addedToCartSuccessMessage,\r\n statusCssString: 'success',\r\n messageGlyph: 'fas fa-check',\r\n isOpen: true\r\n });\r\n } else if (result.substatus === 'MAXQUANTITY') {\r\n const curQuantity =\r\n (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\r\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\r\n\r\n this.setState({\r\n productId: product.RecordId,\r\n itemKey,\r\n userMessage: maxQtyLimitReachedMessage,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n } else if (result.substatus === 'QUANTITYLIMITS' && isOrderQuantityLimitsFeatureEnabled) {\r\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\r\n\r\n this.setState({\r\n productId: product.RecordId,\r\n itemKey,\r\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n } else if (result.substatus === 'INVOICEINCART') {\r\n this.setState({\r\n productId: product.RecordId,\r\n itemKey,\r\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n } else {\r\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\r\n this.setState({\r\n productId: product.RecordId,\r\n itemKey,\r\n userMessage: addedToCartFailureMessage,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n telemetry.warning(error);\r\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\r\n this.setState({\r\n productId: product.RecordId,\r\n itemKey,\r\n userMessage: addedToCartFailureMessage,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n });\r\n }\r\n }\r\n };\r\n\r\n private readonly _removeItemFromWishlist = (productId: number): void => {\r\n const { context, data, telemetry } = this.props;\r\n const { wishlists } = data;\r\n let noLongerLineExist: CommerceListLine[] | undefined = [];\r\n if (context && context.actionContext) {\r\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\r\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\r\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\r\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\r\n .then(commerceList => {\r\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\r\n\r\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\r\n noLongerLineExist = this._getProductsNoLongerExists(castCommerceList);\r\n if (noLongerLineExist && noLongerLineExist.length > 0) {\r\n this._removeNoLongerExistsLines(noLongerLineExist);\r\n } else {\r\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\r\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\r\n .then(products => {\r\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\r\n if (castSimpleProducts && castSimpleProducts.length > 0) {\r\n this.setState({ isError: false });\r\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\r\n }\r\n })\r\n .catch(error => {\r\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\r\n telemetry.error(error);\r\n });\r\n }\r\n }\r\n })\r\n .catch(error => {\r\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\r\n telemetry.error(error);\r\n });\r\n } else {\r\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\r\n }\r\n }\r\n };\r\n\r\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\r\n const { context, resources } = this.props;\r\n const { maxQuantityLimitText } = resources;\r\n\r\n const maxQuantityForLineItem = updateMaxQuantityForCartLineItem(context.app.config.maxQuantityForCartLineItem);\r\n\r\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\r\n return maxQuantityLimitText\r\n .replace('{maxQuantity}', maxQuantityForLineItem.toString())\r\n .replace('{curQuantity}', curQuantity.toString());\r\n }\r\n\r\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\r\n\r\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\r\n }\r\n\r\n private _getProductInventory(\r\n product: FullProduct,\r\n productInventoryCollection: IProductInventoryInformation[] | undefined\r\n ): IProductInventoryInformation | undefined {\r\n if (productInventoryCollection && productInventoryCollection.length > 0) {\r\n for (const productResult of productInventoryCollection) {\r\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\r\n return productResult;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\r\n const { productAvailability } = this.props.data;\r\n if (productAvailability && productAvailability.result) {\r\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\r\n if (productInventoryInformation) {\r\n return productInventoryInformation.StockLevelLabel;\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\r\n const { productAvailability } = this.props.data;\r\n if (productAvailability && productAvailability.result) {\r\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\r\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\r\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n private readonly _isProductInStock = (product: FullProduct): boolean => {\r\n const { data, context } = this.props;\r\n const { productAvailability } = data;\r\n\r\n if (!context.app.config.enableStockCheck) {\r\n return true;\r\n }\r\n\r\n if (!productAvailability.result || !product.ProductDetails) {\r\n return false;\r\n }\r\n\r\n for (const productResult of productAvailability.result) {\r\n if (\r\n productResult.ProductAvailableQuantity &&\r\n productResult.ProductAvailableQuantity.ProductId &&\r\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId\r\n ) {\r\n return productResult.IsProductAvailable;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\r\n const { wishlists } = this.props.data;\r\n\r\n if (\r\n !wishlists.result ||\r\n wishlists.result.length === 0 ||\r\n !wishlists.result[0].CommerceListLines ||\r\n wishlists.result[0].CommerceListLines.length === 0\r\n ) {\r\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter(commerceListLine => {\r\n return commerceListLine.ProductId === productId;\r\n });\r\n\r\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\r\n return foundWishlistItem[0].LineId;\r\n }\r\n return null;\r\n };\r\n\r\n private readonly _getProductsNoLongerExists = (castCommerceList: CommerceList): CommerceListLine[] | undefined => {\r\n const noLongerExist: CommerceListLine[] | undefined = [];\r\n castCommerceList.CommerceListLines?.map(line => {\r\n const { products } = this.props.data;\r\n const productsList = products && (products as AsyncResult<FullProduct[]>).result!;\r\n\r\n const skipRemove = productsList.filter(product => product.ProductDetails.RecordId === line.ProductId);\r\n if (skipRemove.length === 0) {\r\n noLongerExist?.push({ LineId: line.LineId });\r\n }\r\n });\r\n return noLongerExist;\r\n };\r\n\r\n private readonly _removeNoLongerExistsLines = (noLongerLineExist: CommerceListLine[]) => {\r\n const { context, data, telemetry } = this.props;\r\n const { wishlists } = data;\r\n if (context && context.actionContext) {\r\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\r\n if (userToken && wishlists.result && wishlists.result[0]) {\r\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, noLongerLineExist)\r\n .then(commerceList => {\r\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\r\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\r\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\r\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\r\n .then(products => {\r\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\r\n if (castSimpleProducts && castSimpleProducts.length > 0) {\r\n this.setState({ isError: true });\r\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\r\n }\r\n })\r\n .catch(error => {\r\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\r\n telemetry.error(error);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\r\n telemetry.error(error);\r\n });\r\n } else {\r\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport default WishlistItems;","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 { RatingsHistogram, RatingsHistogramView };\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } 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 (\n <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\n {text}\n </button>\n );\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 <ModalHeader toggle={props.onModalToggle}>{props.resources.modalTitle}</ModalHeader>;\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","import { __assign } from \"tslib\";\r\nimport { msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nvar PriceComponentActions = {};\r\nvar Price = function (props: any) {\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n return (React.createElement(\"span\", { className: classnames('msc-price', props.className) }, showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)));\r\n};\r\nvar showStrikethroughPricing = function (props: any) {\r\n var originalPrice = getOriginalPrice(props);\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n return false;\r\n};\r\nvar getOriginalPrice = function (props: any) {\r\n return Math.max(props.data.price.BasePrice || 0, props.data.price.TradeAgreementPrice || 0, props.data.price.AdjustedPrice || 0);\r\n};\r\nvar renderCurrentPrice = function (props: any) {\r\n var initialPrice = formatCurrency(props, props.data.price.CustomerContextualPrice);\r\n return (React.createElement(\"span\", { className: 'msc-price__actual', itemProp: 'price' }, initialPrice));\r\n};\r\nvar formatCurrency = function (props: any, price: any) {\r\n if (price === undefined) {\r\n return undefined;\r\n }\r\n if (price === 0 && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n let returnPrice = `$${price}`;\r\n try {\r\n var formatter = new Intl.NumberFormat(props.context.cultureFormatter.locale, {\r\n style: 'currency',\r\n currency: props.context.cultureFormatter.currencyCode,\r\n currencyDisplay: 'narrowSymbol'\r\n });\r\n returnPrice = formatter.format(price)\r\n\r\n } catch {}\r\n return returnPrice;\r\n};\r\nvar renderCurrentPriceWithOriginalPrice = function (props: any) {\r\n var originalPrice = getOriginalPrice(props);\r\n var initialPrice = formatCurrency(props, originalPrice);\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(\"span\", { className: 'sr-only' },\r\n ' ',\r\n props.originalPriceText,\r\n ' ',\r\n initialPrice,\r\n ' ',\r\n props.currentPriceText,\r\n ' ',\r\n renderCurrentPrice(props)),\r\n React.createElement(\"span\", { className: 'msc-price__strikethrough', \"aria-hidden\": 'true' }, initialPrice),\r\n React.createElement(\"span\", { \"aria-hidden\": 'true' }, renderCurrentPrice(props)),\r\n props.savingsText && React.createElement(\"span\", { className: 'msc-price__savings' }, props.savingsText)));\r\n};\r\n\r\nconst PriceComponent: React.FunctionComponent<any> = msdyn365Commerce.createComponent<any>(\r\n 'Product',\r\n { component: msdyn365Commerce.createComponent('Price', __assign({ component: Price }, PriceComponentActions)) }\r\n);\r\n\r\nexport default PriceComponent","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const heading =\n 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}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n {...attribute}\n aria-label={product.Name}\n >\n <div className='msc-feature-search-result__item__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n </div>\n </a>\n <div className='msc-feature-search-result__item__detail'>\n <p className='msc-feature-search-result__item__heading'>{heading}</p>\n {renderProductTitle(product?.Name)}\n </div>\n </div>\n );\n};\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string,\n fallbackImage?: string,\n context?: IRequestContext\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings,\n fallBackSrc: fallbackImage\n };\n return <Image {...img} {...imageProps} loadFailureBehavior='empty' requestContext={context} />;\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return <h1 className='msc-feature-search-result__item__product-title'>{title}</h1>;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\nimport { getSearchSuggestionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\n\nexport enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * Input class for auto suggest search input.\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n\n public topResultsCount?: number;\n\n public suggestionType?: string;\n\n public hitPrefix?: string;\n\n public hitSuffix?: string;\n\n public constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\n\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions.\n * @param input\n * @param ctx\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise<Autosuggestions | null> {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\nasync function _getAutoSuggest(input: AutoSuggestInput, autosuggest: Autosuggestions, ctx: IActionContext): Promise<void> {\n const catalogId = getCatalogId(ctx.requestContext);\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n },\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) =>\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\n );\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(\n `[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`\n );\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.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * CategorySuggestionsComponent.\n * @param props\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading\n ? format(categorySuggestionHeading, searchText)\n : `Search \"${searchText}\" in categories`;\n\n return <li className='msc-autoSuggest__categoryResults-title'>{categoryAutoSuggestionHeading}</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\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__categoryResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, searchText, props)} {...attribute}>\n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n\n if (searchQsp && searchText) {\n queryUrl.searchParams.set(searchQsp, searchText);\n }\n\n const categoryRefiners = searchRefiners?.find(refiners => {\n return refiners.SourceValue === ProductRefinerSource.Category;\n });\n const refiner = categoryRefiners?.Values?.find(item => {\n return item.RefinerRecordId === Number.parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\n if (encodedRefiner) {\n queryUrl.searchParams.set('refiners', encodedRefiner);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n // eslint-disable-next-line react/no-danger\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 = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\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.\n * All rights reserved. See LICENSE 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 * 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 && <Button className='ms-search__form-submitSearch' aria-label={ariaLabelSubmit} />;\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.\n * All rights reserved. See LICENSE 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 { suggestions, hitPrefix, hitSuffix } = 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 =\n item.Value && 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 aria-label={ariaLabel} href={_generateLink(item, hitPrefix, hitSuffix, props)} {...attribute}>\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 // eslint-disable-next-line react/no-danger\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 {\n searchLabelClass,\n searchLabelArialLabel,\n isSearchFormExpanded,\n searchtext,\n searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange,\n telemetryContent\n } = 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 && (\n <span className='ms-search__icon-text' aria-hidden>\n {searchtext}\n </span>\n )}\n </Button>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getProductPageUrlSync, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n NodeTag\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\n/**\n * Search product suggest resources.\n */\nexport interface ISearchProductSuggestResources {\n freePriceText: string;\n}\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n resources?: ISearchProductSuggestResources;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n * ProductSuggestionsComponent.\n * @param props\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return <li className='msc-autoSuggest__productResults-title'>{productAutoSuggestionHeading}</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 && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n const price = item.Value3?.Value?.DecimalValue;\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price: !ObjectExtensions.isNullOrUndefined(price) && _renderPrice(price, price, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps\n) => {\n const {\n autoSuggestProps: { context }\n } = props;\n const ariaLabel =\n item.Value && 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)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\n : '';\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 (\n // eslint-disable-next-line react/no-danger\n <span className='msc-price msc-autoSuggest__productResults-item-text' dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />\n );\n};\n\nconst _renderPrice = (\n adjustedPrice: number,\n basePrice: number,\n moduleId: string,\n moduleType: string,\n props: ISearchProductSuggestProps\n): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleType}\n context={context}\n data={{\n price: {\n CustomerContextualPrice: adjustedPrice,\n BasePrice: basePrice\n }\n }}\n className='msc-autoSuggest__productResults-item-price'\n freePriceText={props.resources?.freePriceText}\n />\n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\n <Image\n requestContext={props.autoSuggestProps.context.actionContext.requestContext}\n altText={altText}\n className='msc-autoSuggest__productResults-item-img'\n src={suggestion.ImageUrl}\n gridSettings={gridSettings!}\n imageSettings={imageSettings ? imageSettings : defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, ObjectExtensions, Random, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData, SuggestionTypeCriterionSuggestionType } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n isLoadingAutoSuggest?: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps<ISearchData> {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n handleCancelSearchFocused?(): void;\n };\n isSearchFormExpanded: boolean;\n isLoadingAutoSuggest?: boolean;\n isLoadingNode?: React.ReactNode;\n}\n\n/**\n *\n * Search module.\n * @extends {React.Component<ISearchProps<ISearchData>, ISearchState>}\n */\nclass Search extends React.Component<ISearchProps<ISearchData>, ISearchState> {\n private readonly searchTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n\n private readonly formReference: React.RefObject<HTMLButtonElement>;\n\n private readonly maxChars: number;\n\n private readonly topResultsCount?: number;\n\n private readonly hitPrefix: string = '{';\n\n private readonly hitSuffix: string = '}';\n\n private readonly waitTime: number = 500;\n\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject<HTMLDivElement>;\n\n private readonly autoSuggestResultDiv: React.RefObject<HTMLDivElement>;\n\n private readonly searchFormClass: string;\n\n private readonly searchLabelClass: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private loadSuggestionsRequestId?: string;\n\n private inputSuggestionType: ISuggestionTypeCriterionData[];\n\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n public constructor(props: ISearchProps<ISearchData>) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true,\n isLoadingAutoSuggest: false\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n\n this.inputSuggestionType = [];\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n this._initSuggestionTypes();\n }\n\n public async componentDidMount(): Promise<void> {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n public shouldComponentUpdate(nextProps: ISearchProps<ISearchData>, 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(\n suggestion => suggestion.SuggestionType === SuggestionType.Product\n );\n const categoryRefiners = searchRefiners?.find(refiner => {\n return refiner.SourceValue === ProductRefinerSource.Category;\n });\n const categorySuggestions = suggestions?.AllSearchResults?.filter(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 &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions)))\n ? 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 })\n : undefined,\n autosuggestProduct:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions)))\n ? ProductSuggestionsComponent({\n searchProductSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent,\n resources: this.props.resources\n })\n : undefined,\n autosuggestCategory:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions)))\n ? 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 })\n : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange,\n handleCancelSearchFocused: this._handleCancelSearchFocused\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded,\n isLoadingAutoSuggest,\n isLoadingNode: this._isLoadingNode()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _initSuggestionTypes() {\n const suggestionTypes = this.props.config.suggestionTypeCriterion;\n\n const suggestions = ArrayExtensions.unique(ArrayExtensions.validValues(suggestionTypes));\n if (!ArrayExtensions.hasElements(suggestions)) {\n this.inputSuggestionType = [\n { SuggestionType: SuggestionTypeCriterionSuggestionType.keyword },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.product },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.scopedCategory }\n ];\n return;\n }\n\n const validSuggestions = suggestions.filter(suggestion => suggestion.SuggestionType);\n if (ArrayExtensions.hasElements(validSuggestions)) {\n this.inputSuggestionType = validSuggestions;\n return;\n }\n\n this.inputSuggestionType = [];\n }\n\n /**\n * Function to create the ReactNode for loading Autosuggest result.\n * @returns ReachNode for loading Autosuggest result.\n */\n private readonly _isLoadingNode = (): React.ReactNode => {\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\n return <Spinner className='msc-autoSuggest__loadingResult' label={loadingText} size={SpinnerSize.medium} labelPosition='right' />;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\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 (\n !(\n (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 )\n ) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private readonly _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private async _getSearchSuggestions(loadSuggestionsRequestId: string, query: string) {\n try {\n const searchSuggestions = await getSearchSuggestionsAction(\n new AutoSuggestInput(query, this.topResultsCount, this._getSuggestionType(), this.hitPrefix, this.hitSuffix),\n this.props.context.actionContext\n );\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n return searchSuggestions;\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n this.setState({ suggestions: undefined, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get auto suggest results');\n return undefined;\n }\n }\n\n private async _updateSearchRefiners(loadSuggestionsRequestId: string, query: string, suggestions: Autosuggestions | undefined) {\n try {\n const refiners = await this._getSearchRefiners(query);\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({\n suggestions,\n searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions),\n isLoadingAutoSuggest: false\n });\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({ suggestions, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions) });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get refiners results');\n }\n }\n\n private _loadSuggestions(query: string) {\n this.cancellabelDebounce = debounce(async () => {\n this.setState({ isLoadingAutoSuggest: true });\n const loadSuggestionsRequestId = Random.Guid.generateGuid();\n this.loadSuggestionsRequestId = loadSuggestionsRequestId;\n const searchSuggestions = await this._getSearchSuggestions(loadSuggestionsRequestId, query);\n await this._updateSearchRefiners(loadSuggestionsRequestId, query, searchSuggestions);\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n }\n\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length <= this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n if (ArrayExtensions.hasElements(this.inputSuggestionType)) {\n this._loadSuggestions(query);\n }\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private _getSuggestionType(): string {\n const distinctSuggestionTypes: string[] = this.inputSuggestionType.map(\n suggestionTypeItem => suggestionTypeItem.SuggestionType!.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType!.slice(1)\n );\n return distinctSuggestionTypes.join(',');\n }\n\n private async _getSearchRefiners(searchText: string): Promise<ProductRefiner[]> {\n const { actionContext: ctx } = this.props.context;\n const catalogId = getCatalogId(ctx.requestContext);\n validateCatalogId(catalogId);\n return ProductsDataActions.getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n }\n );\n }\n\n private readonly _handleSubmit = (\n e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement> | React.FormEvent<HTMLFormElement>\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private readonly _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _handleCancelSearchFocused = (): void => {\n const { suggestions } = this.state;\n if (!(suggestions && suggestions.AllSearchResults)) {\n this._clearAutoSuggestState();\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 =\n 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\nexport default Search;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE 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 =\n `${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}` } })\n .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 })\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.\n * All rights reserved. See LICENSE 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 <>\n {signInMessage}\n {signInButton}\n </>\n ) : (\n <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n </>\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":""}