{"version":3,"sources":["webpack:///src/modules/search-result-container/actions/get-mapped-search-configuration.ts?978c","webpack:///src/modules/search-result-container/components/title.tsx?365d","webpack:///./src/themes/sheikhzayedfestival/views/search-result-container.view.tsx?fd60","webpack:///src/modules/search-result-container/components/utilities.ts?41e3","webpack:///src/modules/search-result-container/actions/get-product-refiner-hierarchy.ts?bc3c","webpack:///src/modules/search-result-container/search-result-container.tsx?97e0","webpack:///src/modules/search-result-container/components/error-message.tsx?c0c2","webpack:///src/modules/fabrikam/views/search-result-container.view.tsx?f8ea","webpack:///src/modules/adventureworks/views/components/product.component.tsx?f602","webpack:///src/modules/search-result-container/actions/url-utils.ts?6091","webpack:///src/modules/adventureworks/views/search-result-container.view.tsx?18e4","webpack:///src/modules/search-result-container/actions/base-collection-action.ts?32fc","webpack:///src/modules/search-result-container/search-result-container.view.tsx?3d61","webpack:///src/modules/search-result-container/components/refine-item.tsx?b232","webpack:///src/modules/search-result-container/components/index.ts?cc7a","webpack:///src/modules/search-result-container/components/product-search-result-items.tsx?1766","webpack:///external \"React\"?c481","webpack:///src/modules/search-result-container/components/choice-summary.tsx?f4a7","webpack:///src/modules/search-result-container/components/refine-submenu.tsx?1e62","webpack:///src/modules/search-result-container/components/separator.tsx?7b76","webpack:///src/modules/search-result-container/actions/get-refiners-for-collection.ts?3c89","webpack:///external \"ReactDOM\"?4b2d","webpack:///src/modules/search-result-container/actions/get-full-products-by-collection.ts?5cc2","webpack:///./lib/search-result-container/module-registration.js?8625","webpack:///src/modules/search-result-container/components/range-refine-item.tsx?6e24","webpack:///src/modules/search-result-container/components/link.tsx?d3ce","webpack:///src/modules/search-result-container/actions/index.ts?3dfa","webpack:///src/modules/search-result-container/components/modal.tsx?afdd","webpack:///src/modules/search-result-container/list-page-state.ts?90c8","webpack:///src/modules/search-result-container/components/feature-search-result-item.tsx?98c1","webpack:///src/modules/search-result-container/actions/get-inventory-refiners.ts?a682"],"names":["sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","MappedSearchInput","constructor","apiSettings","getCacheKey","buildCacheKey","this","getCacheObjectType","dataCacheType","async","getMappedSearchConfiguration","input","ctx","getSearchConfigurationAsync","callerContext","then","searchConfiguration","ProductSortColumns","map","sortColumn","key","ColumnName","toUpperCase","IsDescending","telemetry","warning","filter","Boolean","createInput","inputData","requestContext","getMappedSearchConfigurationDataAction","createObservableDataAction","id","action","Title","_ref","text","className","React","createSearchResultModal","modalProps","refineMenu","sortByDropDown","isRecoSearchPage","modal","modalHeader","createModalBody","modalFooter","props","modalBody","renderSort","renderRefiner","refiners","RefineMenuContainer","RefinerSectionContainer","Node","Object","assign","submenu","index","SortingContainer","renderCategoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryHierarchySeparator","category","renderTitle","title","TitleContainer","titlePrefix","titleText","titleCount","SearchResultContainerView","_props$context$action","SearchResultContainer","products","pagination","ProductsContainer","ProductSectionContainer","choiceSummary","isMobile","modalToggle","searchResultModal","TitleViewProps","categoryHierarchy","sortByOptions","CategoryNavContainer","RefineAndProductSectionContainer","errorMessage","FeatureSearchContainer","similarLookProduct","context","actionContext","query","recommendation","merchandisingCategoryID","config","Number","request","urlTokens","recordId","Module","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","next","_objectSpread","undefined","rangeStart","RightValueBoundString","rangeEnd","push","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","getProductRefinerHierarchy","searchCriteria","queryResultSettings","getProductSearchRefinersAsync","productRefiners","trace","result","productRefiner","length","SearchResultContainer_1","state","_props$context$reques","super","sortByDropdownOptions","value","resources","_pageType","pageType","_viewport","expandrefinerCount","defaultPageNumber","catalogId","getCatalogId","isListPageStateUpdated","_isMounted","_updateListPageState","listPageState","_this$props$context$r","_this$props$config$it","_this$props$config$it2","_this$props$context$r2","querySorting","sorting","JSON","parse","decodeURIComponent","currentPageNumber","skip","itemsPerPage","sortingCritera","Columns","pageSize","activeProducts","totalProductCount","count","activeFilters","hydrateRefinersFromUrl","productId","featureProduct","data","_getProductsDimensionsAvailabilities","_this$props$data$list","_this$props$data$list2","productsList","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","ArrayExtensions","hasElements","setState","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","SearchResultModal","modalCloseButtonText","modalTitle","isOpen","modalIsOpen","returnRef","_modalToggleRef","onModalToggle","_toggleModal","_getCollectionTitle","collectionTitle","_this$props$context$r3","q","getFriendlyName","locale","NameTranslations","Name","productCountNumber","productCountText","format","numberOfProducts","oneProduct","telemetryPageName","toLowerCase","searchTextPrefix","_getCategoryHierarchy","tag","Link","ariaLabel","categoryLinkAriaLabel","href","Url","Separator","separator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","app","hideRating","dropdownOption","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","ref","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","skipCount","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","role","paginationAriaLabel","url","qsp","items","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","telemetryContent","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiner","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","productRefinerHierarchy","RefineSubmenu","selectedRefinerValues","refineItemCommonProps","_refineItemCommonProps","minValueSliderThumbAriaLabel","maxValueSliderThumbAriaLabel","onUpdateRefiners","_onUpdateRefiners","urlBuilder","_buildRefinerUrl","isDisabled","isExpandedOnInitialLoad","moduleId","moduleTypeName","typeName","productCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","singleProductCountAriaLabel","_this$props$data$prod","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","RecordId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","channelInventoryConfigurationId","InventoryProductAttributeRecordId","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","_getInventoryRefiner","baseCollectionInput","BaseCollectionInput","inventoryInStockRefinerValueInput","InventoryInStockRefinerValueInput","getInventoryRefinerAction","Promise","resolve","_getChoiceSummary","_this$props$data$refi","selectedRefiners","refinerValueName","rating","KeyName","ChoiceSummary","classNames","clearAllText","label","choiceSummaryLabel","closeAriaLabel","selectedChoices","refinerHierarchy","choiceFormat","choiceRangeValueFormat","onChoiceClicked","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","choiceAriaLabel","refinerValues","_getProducts","_this$props$slots","_this$props$data$feat","_this$props$data$prod5","imageSettings","allowBackNavigation","shouldAllowBackNavigation","breadCrumbType","breadcrumbType","shouldAllowBack","quickviewSlot","slots","quickview","productComparisonButton","isPriceMinMaxFeatureState","featureState","ProductSearchResultItems","moduleType","isPriceMinMaxEnabled","IsEnabled","notification","window","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","error","option","mappedConfiguration","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","item","validValues","activeSortColumn","activeMappedConfig","_this$props$data$list6","newRefinementCriteria","clearAll","dropdownElementId","current","dropdownElement","document","getElementById","setTimeout","focus","selectedChoice","choiceClicked","selectedRefiner","isClearAll","refinerCount","paginationPreviousText","paginationNextText","device","Type","bind","_updateViewport","productPrices","pending","placeholderTextMax","minLabel","maxLabel","rangeNameFormat","validationErrorNaN","validationErrorNotNumber","validationErrorRange","validationErrorNotRange","getTelemetryObject","friendlyName","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a2","MsDyn365","isBrowser","addEventListener","StoreOperationsDataActions","getInventoryConfigurationAsync","inventoryRefiner","reaction","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r4","_this$props$context$r5","_this$props$context$r6","_this$props","_this$props$context$a","newListPageState","GetFullProductsByCollectionInput","Paging","Top","Skip","Math","max","Sorting","stringify","ProductId","Recommendation","includeAttributes","productResults","getCollectionProducts","enableAffiliationBasedPricing","user","isAuthenticated","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r7","_this$props$context$r8","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","includes","DimensionTypes","none","componentWillUnmount","removeEventListener","render","_listPageState$result","_listPageState$result2","_this$props$context$r9","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","FeatureSearchResultItem","product","searchResultContainerViewProps","disableHierarchy","classnames","moduleProps","ModalToggle","innerRef","onClick","ErrorMessage","renderView","_getViewport","variant","VariantType","Browser","Viewport","__decorate","computed","observable","observer","getDefaultSwatchSelected","coreContext","productData","_productData$Attribut","_attributeSwatches$fi","AttributeValues","dimensionToPreSelectInProductCard","attributeSwatches","attributeValue","_attributeValue$KeyNa","toLocaleLowerCase","Swatches","IsDefault","updateProductUrl","productDetailsPageUrl","queryString","sourceUrl","URL","baseUrl","search","pathname","renderProductUnitOfMeasure","unitOfMeasure","createElement","renderLabel","name","price","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","ratingAriaLabel","roundedRating","toFixed","renderPrice","basePrice","adjustedPrice","savingsText","freePriceText","originalPriceText","currentPriceText","priceResources","BasePrice","AdjustedPrice","CustomerContextualPrice","PriceComponent","renderProductPlacementImage","gridSettings","imageUrl","fallbackImageUrl","altText","_context$app$config","contextConfig","placeholderImageName","fallbackImageSource","img","src","fallBackSrc","imageProps","cropFocalRegion","Image","loadFailureBehavior","bypassHideOnFailure","ProductComponent","msdyn365Commerce","createComponentOverride","component","_product$Name","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","ratingCountAriaLabel","allowBack","quickViewButton","isEnabledProductDescription","inventoryLabel","dimensionAvailabilities","swatchItemAriaLabel","productUrl","getProductPageUrlSync","MIN_VALUE","productImageUrlFromSwatch","defaultSwatch","swatchProductImageUrls","ProductImageUrls","generateImageUrl","PrimaryImageUrl","getProductImageUrlFromDefaultSwatch","productPageUrlFromSwatch","SwatchValue","encodeURIComponent","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","useState","productImageUrl","setProductImageUrl","useEffect","selectedSwatchItems","Dictionary","enableStockCheck","updatePageAndImageUrl","useCallback","swatchItem","dimensionType","setValue","StringExtensions","isNullOrWhitespace","productPageUrlWithSwatch","newUrl","searchParams","delete","toString","swatchProductImageUrl","productImageUrls","newImageUrl","payLoad","getPayloadObject","attribute","getTelemetryAttributes","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","Fragment","onTelemetryClick","cultureFormatter","formatCurrency","Price","AverageRating","TotalRatings","DefaultUnitOfMeasure","description","Description","attributeValues","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","itemId","colorHexCode","SwatchColorHexCode","SwatchImageUrl","isDefault","dimensionAvailability","_swatchItem$SwatchVal3","some","swatch","ProductComponentSwatchComponent","onSelectDimension","avgRating","totalRatings","numberRatings","RatingComponent","ratingCount","readOnly","renderRating","inventoryAvailabilityLabel","selectedDimensions","getValues","DimensionTypeValue","convertDimensionTypeToProductDimensionType","DimensionValue","Value","cloneElement","selectedProductId","renderQuickView","validateCatalogId","renderProductComparisonButton","compressedRefinerKeys","compressedRefinerArray","compressedRefiner","parsedRefiner","refinerKey","_unused","sortingColumns","sortedRefiners","sort","first","second","set","compressedRefiners","compressRefiners","location","requestUrl","DescriptionInterval","renderProductCards","getInventoryLabel","inventoryAttribute","TextValue","renderProductCardsDescription","_props$data$products$","_props$data$featureSt","isAllowBack","classname","quickviewslot","priceRangeSeparator","priceFree","masterProductId","MasterProductId","renderProducts","_props$data$listPageS","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","renderTitleCount","configureStickyFilter","isStickyHeader","headerContainer","querySelector","headerHeight","offsetHeight","bannerHeights","headerElement","defaultContainer","refinerElement","documentElement","scrollTop","classList","add","setAttribute","clientHeight","remove","removeAttribute","renderRefinerMobile","renderRefinerFooter","handler","doneAriaLabel","tabIndex","doneText","useStickyFilter","stickyFilterSetup","enableStickyHeader","isExpanded","setIsExpanded","toggle","wrapperRefiner","useRef","refinerRefernce","handleClickOutside","event","element","contains","target","useOutsideClick","enableProdutDescription","Button","filterText","searchText","isUpdateRefinerPanel","toJS","generateCacheKey","convertToString","createBaseCollectionInput","args","inputClassConstuctor","categoryId","QueryResultSettingsProxy","fromInputData","QueryResultSettings","queryRefiners","_inputData$config","getUpdateRefinerPanel","Error","RefineItem","_onClick","e","preventDefault","selectedRefinementCriterion","onToggle","anchorType","isChecked","shouldComponentUpdate","nextProps","nextState","_productRefinerValue$","_this$props$parentPro","_this$props$parentPro2","children","attrs","_objectWithoutProperties","_excluded","isSingleSelect","itemTypeClassName","inputType","SourceValue","Rating","_renderRating","contentAction","etext","LeftValueBoundLocalizedString","productText","productCount","Count","refineMenuItemAriaLabel","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","hasImage","hasContentSwatch","_getRefinerUrl","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_this$props$selectedR","_productRefinerValue$3","refinerRating","parseInt","ratingRefiner","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","hideCount","module","exports","closeButtonGlyph","stopPropagation","currentTarget","getAttribute","_getSelectedRefinerChoice","itemClicked","nextItemToFocus","nextSibling","_this$props$context","choice","parent","hierarchy","_getKeyForRefinerValue","selectedRefinersMap","clearAllAttributes","overallFormat","rangeFormat","refinerName","replace","_formatPrice","UnitText","filterValue","amount","currency","selected","_onToggleItem","_onToggleSubmenu","expanded","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","Slider","SliderWithBars","rangeType","RangeRefineItem","sliderKey","prevState","DefaultValues","actionDataAction","_context$requestConte","searchProductId","channelInventoryConfigurationPromise","AsyncResult","inventoryInStockRefinerValue","_inventoryRefiner$Val","_inventoryRefiner","InventoryOutOfStockAttributeValueText","getInventoryInStockRefinerValueAsync","CategoryIds","defaultCategoryIdValue","Context","ChannelId","channelId","CatalogId","Refinement","SearchCondition","searchObject","isNaN","searchCriteriaInput","RecommendationListId","Ids","defaultProductIdValue","ReactDOM","returnProducts","productSearchResults","metadataCount","productSearchResultsWithImages","productSearchResult","generateProductImageUrl","inventoryLevel","InventoryLevels","threshold","inventoryRanges","_context$requestConte2","_context$requestConte3","_context$requestConte4","promise","IncludeAttributes","SkipVariantExpansion","SortOOS","_input$queryResultSet","_input$queryResultSet2","sortColumnName","column","searchByCriteriaAsync","metadata","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","md","__bindings__","viewDictionary","cn","_selectedRefinementCr","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","currencyCode","ariaValueText","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","initialMin","initialMax","String","minValue","maxValue","labels","sliderKeyString","sliderThumbs","validationErrorMin","validationErrorMax","touchedMin","touchedMax","componentDidUpdate","previousProps","updateSliderProps","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","formAttrs","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","onChange","onFocus","onBlur","placeholder","ariaAttributes","inForm","min","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","_changeValue","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","maxNum","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","touched","validationError","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","tooltip","modalNode","modalHeaderNode","modalFooterNode","ModalBody","Modal","autoFocus","applicationNode","returnFocusRef","zIndex","ModalHeader","ModalFooter","ListPageState","ListPageStateInput","listPageStateAction","createListPageInput","productName","productRecordId","fallbackImage","getFallbackImageUrl","ItemId","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","_input$channelInvento","inventoryProductAttributeRecordId","arguments","_input$channelInvento2","_input$channelInvento3"],"mappings":"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","file":"static/js/134.94d9d7b67adaa13bf995.chunk.js","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\nimport { getSearchConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\n\n// TODO: import from commerce entities when available\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name change will require many modifications\ninterface SearchConfiguration {\n ProductSortColumns?: SortColumn[];\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name change will require many modifications\nexport interface MappedSearchConfiguration {\n key: string;\n sortColumn: SortColumn;\n}\n\nexport const sortOptions = {\n sortByOptionRelevanceDesc: 'Ranking-Desc',\n sortByOptionRatingAsc: 'AverageRating-Asc',\n sortByOptionRatingDesc: 'AverageRating-Desc',\n sortByOptionNameAsc: 'Name-Asc',\n sortByOptionNameDesc: 'Name-Desc',\n sortByOptionPriceAsc: 'Price-Asc',\n sortByOptionPriceDesc: 'Price-Desc',\n sortByOptionBestSelling: 'BestSelling',\n sortByOptionNewScore: 'NewScore',\n sortByOptionTrendingScore: 'TrendingScore'\n};\n\n/**\n * ActionInput class for the get-mapped-search-configuration Data Action.\n */\nexport class MappedSearchInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('MappedSearchInput', this.apiSettings);\n\n public getCacheObjectType = () => 'MappedSearchInput';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * Get a mapped search configuration that is easy to use for sorting.\n * @param input\n * @param ctx\n */\nexport async function getMappedSearchConfiguration(input: MappedSearchInput, ctx: IActionContext): Promise {\n return getSearchConfigurationAsync({ callerContext: ctx }).then((searchConfiguration: SearchConfiguration) => {\n return (searchConfiguration.ProductSortColumns || [])\n .map((sortColumn: SortColumn) => {\n let key = '';\n if (sortColumn.ColumnName) {\n switch (sortColumn.ColumnName.toUpperCase()) {\n case 'NAME':\n key = sortColumn.IsDescending ? sortOptions.sortByOptionNameDesc : sortOptions.sortByOptionNameAsc;\n break;\n case 'PRICE':\n key = sortColumn.IsDescending ? sortOptions.sortByOptionPriceDesc : sortOptions.sortByOptionPriceAsc;\n break;\n case 'AVERAGERATING':\n key = sortColumn.IsDescending ? sortOptions.sortByOptionRatingDesc : sortOptions.sortByOptionRatingAsc;\n break;\n case 'RANKING':\n key = sortOptions.sortByOptionRelevanceDesc;\n break;\n case 'BESTSELLINGSCORE':\n key = sortOptions.sortByOptionBestSelling;\n break;\n case 'NEWSCORE':\n key = sortOptions.sortByOptionNewScore;\n break;\n case 'TRENDINGSCORE':\n key = sortOptions.sortByOptionTrendingScore;\n break;\n default:\n }\n } else {\n ctx.telemetry.warning('[get-mapped-search-configuration] unknown search option');\n }\n if (key) {\n return {\n key,\n sortColumn\n };\n }\n return undefined;\n })\n .filter(Boolean);\n });\n}\n\nexport const createInput = (inputData: ICreateActionContext>): IActionInput => {\n return new MappedSearchInput(inputData.requestContext.apiSettings);\n};\n\nexport const getMappedSearchConfigurationDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search-result-container/get-mapped-search-configuration',\n action: >getMappedSearchConfiguration,\n input: createInput\n});\n\nexport default getMappedSearchConfigurationDataAction;\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 ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC = ({ text, className }) => (\n \n {` `}\n {text}\n {` `}\n \n);\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\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\n/* ZOHAIB | VSI | CUSTOMJIZATION | START */\r\nimport { ISearchResultContainerProps as ISearchResultContainerExtensionProps } from './../definition-extensions/search-result-container.ext.props.autogenerated';\r\nconst SearchResultContainerView: React.FC > = props => {\r\n /* ZOHAIB | VSI | CUSTOMJIZATION | END */\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage,\r\n FeatureSearchContainer,\r\n similarLookProduct\r\n } = props;\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n /* ZOHAIB | VSI | CUSTOMJIZATION | START */\r\n const merchandisingCategoryID = props.config.merchandisingCategoryID!;\r\n const merchandisingURLID = Number(props.context.request.urlTokens.recordId!);\r\n if(merchandisingURLID !== merchandisingCategoryID){\r\n return null\r\n }\r\n /* ZOHAIB | VSI | CUSTOMJIZATION | END */\r\n if (isMobile) {\r\n return (\r\n \r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n {similarLookProduct}\r\n \r\n {errorMessage}\r\n {products}\r\n \r\n {pagination}\r\n \r\n );\r\n }\r\n return (\r\n \r\n {categoryHierarchy && {renderCategoryHierarchy(categoryHierarchy)}}\r\n \r\n {refineMenu && renderRefiner(refineMenu)}\r\n \r\n {similarLookProduct}\r\n
\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n
\r\n
\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n
\r\n \r\n {errorMessage}\r\n {products}\r\n \r\n {pagination}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n \r\n \r\n {refiners.map((submenu, index) => (\r\n {submenu}\r\n ))}\r\n \r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return {sortByDropDown};\r\n }\r\n return null;\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 \r\n {categoryHierarchyList.map((category, index) => (\r\n \r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n \r\n ))}\r\n \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 \r\n

\r\n {title.titlePrefix}\r\n {title.titleText}({title.titleCount})\r\n

\r\n
\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { IQueryResultSettings, ProductRefiner, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\n/**\n * Uses Bulk refiner API to get refiners and child refiner values.\n * @param searchCriteria Product search criteria.\n * @param maxItems Max items.\n * @param queryResultSettings\n * @param ctx Action context.\n */\nexport async function getProductRefinerHierarchy(\n searchCriteria: ProductSearchCriteria,\n queryResultSettings: IQueryResultSettings,\n ctx: IActionContext\n): Promise {\n return getProductSearchRefinersAsync({ callerContext: ctx, queryResultSettings }, searchCriteria).then(\n (productRefiners: ProductRefiner[]) => {\n if (!productRefiners) {\n ctx.trace('[getRefinersByCriteriaAction] returned no refiners');\n return [];\n }\n\n const result = (productRefiners || []).map((productRefiner: ProductRefiner) => productRefiner);\n\n if (result.length === 0) {\n ctx.trace('[getRefinersByCriteriaAction] returned no IProductRefinerHierarchy objects');\n return [];\n }\n\n return result;\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 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 BaseCollectionInput,\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n getInventoryRefinerAction,\n IFullProductsSearchResultsWithCount,\n InventoryInStockRefinerValueInput,\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 // Push inventory in stock refiner when productListInventoryDisplay is hide oos\n const inventoryRefiner = await this._getInventoryRefiner(listPageState, channelInventoryConfiguration);\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 inventoryRefiner\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 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 inventoryRefiner\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\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 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 * 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 /**\n * Get inventory refiners.\n * @param listPageState The listPageState\n * @returns inventory refiner.\n */\n private readonly _getInventoryRefiner = async (\n listPageState: ListPageState,\n channelInventoryConfiguration: ChannelInventoryConfiguration\n ): Promise<IProductRefinerHierarchy | undefined> => {\n if (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n const baseCollectionInput = new BaseCollectionInput(\n listPageState.pageType,\n this.props.context.request.apiSettings,\n {\n count: true\n },\n\n // Parameter - refiners\n [],\n\n // Parameter - category\n undefined,\n\n // Parameter - searchText\n '',\n\n // Parameter - includeAttributes\n false,\n\n // Parameter - isUpdateRefinerPanel\n false,\n\n // Parameter - locale\n undefined,\n this.catalogId,\n channelInventoryConfiguration\n );\n const inventoryInStockRefinerValueInput = new InventoryInStockRefinerValueInput(\n baseCollectionInput,\n channelInventoryConfiguration?.InventoryProductAttributeRecordId\n );\n return getInventoryRefinerAction(inventoryInStockRefinerValueInput, this.props.context.actionContext);\n }\n return Promise.resolve(undefined);\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\nimport * as React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\n return (\n <span className='ms-search-result-container__no-results-message'>\n <h5 className='error-text'>\n {` `}\n {text}\n {` `}\n </h5>\n </span>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISearchResultModalViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from '@msdyn365-commerce-modules/search-result-container';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\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 {categoryHierarchy && 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 {categoryHierarchy && <Node {...CategoryNavContainer}>{renderCategoryHierarchy(categoryHierarchy)}</Node>}\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <div className='ms-search-result-wrapper-title-choice-summary'>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n </div>\n <div className='ms-search-result-wrapper-sort-by-category'>\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n </div>\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}({title.titleCount})\n </h2>\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 { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n IPriceComponentResources,\n ISwatchItem,\n PriceComponent,\n ProductComponentSwatchComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport {\n getCatalogId,\n IAny,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport { AttributeSwatch, AttributeValue, ProductDimension, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultSwatchSelected(coreContext: ICoreContext, productData?: ProductSearchResult): AttributeSwatch | null {\n if (!productData || !productData.AttributeValues) {\n return null;\n }\n\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const attributeSwatches = productData.AttributeValues.find(\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\n )?.Swatches;\n\n if (!ArrayExtensions.hasElements(attributeSwatches)) {\n return null;\n }\n\n const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[0];\n return defaultSwatch;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\n if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\n return productData?.PrimaryImageUrl;\n }\n\n return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n <div className='msc-product__unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n <div className='msc-product__availability'>\n <span>{inventoryAvailabilityLabel}</span>\n </div>\n );\n}\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: ProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: ProductSearchResult\n): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n if (!defaultSwatch?.SwatchValue) {\n return productUrl;\n }\n\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\n const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCard: React.FC<IProductComponentProps> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === dimensionToPreSelectInProductCard) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n <div className='msc-product__dimensions'>\n {attributeValues.map((item: AttributeValue) => {\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.Swatches?.map<ISwatchItem>(swatchItem => {\n return {\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\n value: swatchItem.SwatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.SwatchColorHexCode,\n imageUrl: swatchItem.SwatchImageUrl,\n productImageUrls: swatchItem.ProductImageUrls,\n isDefault: swatchItem.IsDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionType === dimensionToPreSelectInProductCard &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault)\n ) {\n swatches[0].isDefault = true;\n }\n return (\n <ProductComponentSwatchComponent\n context={context}\n swatches={swatches}\n onSelectDimension={updatePageAndImageUrl}\n key={item.RecordId}\n />\n );\n })}\n </div>\n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\n return {\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n DimensionValue: {\n RecordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(\n product.Name,\n context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating,\n ratingAriaLabel,\n product.TotalRatings,\n ratingCountAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image__description'>\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n </div>\n <div className='msc-product__title_description'>\n <h5 className='msc-product__title__text'>{product.Name}</h5>\n {renderPrice(\n context,\n typeName,\n id,\n product.BasePrice,\n product.Price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n {renderDescription(product.Description)}\n </div>\n </div>\n </a>\n ) : (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(\n product.Name,\n context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating,\n ratingAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n </div>\n <div className='msc-product__details'>\n <h5 className='msc-product__title'>{product.Name}</h5>\n {renderPrice(\n context,\n typeName,\n id,\n product.BasePrice,\n product.Price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n </div>\n </a>\n )}\n {renderProductDimensions(product.AttributeValues)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n </>\n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string\n): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n }`;\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-product__text'>{description}</p>;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n <RatingComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabelText}\n ratingCountAriaLabel={ratingCountAriaLabelText}\n data={{}}\n />\n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources\n): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n <PriceComponent\n context={context}\n id={id}\n typeName={typeName}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n />\n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext<IGeneric<IAny>>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n <Image\n requestContext={context?.actionContext.requestContext}\n {...img}\n {...imageProps}\n loadFailureBehavior='empty'\n bypassHideOnFailure\n />\n );\n}\n\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<\n IProductComponent\n>('Product', { component: ProductCard, ...PriceComponentActions });\n\nexport default ProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Refiner Compression:\n * Refiners contains a non-trivial amount of data that is required to successfully make\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\n * the following array style index-based format:\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText].\n */\nconst compressedRefinerKeys = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\n\n/**\n * Hydrates compressed refiner data from URL.\n * @param fullUrl The full URL of the page.\n * @param requestContext\n */\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\n if (!compressedRefinerArray || compressedRefinerArray.length === 0) {\n return [];\n }\n\n return <ProductRefinerValue[]>compressedRefinerArray\n .map(compressedRefiner => {\n try {\n const parsedRefiner: ProductRefinerValue = {};\n compressedRefinerKeys.forEach((refinerKey, index) => {\n parsedRefiner[refinerKey] = compressedRefiner[index];\n });\n return parsedRefiner;\n } catch {\n return undefined;\n }\n })\n .filter(Boolean);\n};\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nexport const 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/**\n * Method which creates a URL contiaining serialized active refiners.\n * @param fullUrl The Current URL of the page.\n * @param refiners The refiners which should be added to the URL.\n * @param sortingColumns\n * @param skipCount\n */\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\n // Refiner Change flow\n if (refiners !== undefined) {\n if (refiners.length === 0) {\n fullUrl.searchParams.delete('refiners');\n } else {\n const sortedRefiners = refiners.sort((first, second) =>\n first.RefinerRecordId && second.RefinerRecordId && first.RefinerRecordId > second.RefinerRecordId ? 1 : -1\n );\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(sortedRefiners)));\n }\n\n // Adding or removing a refiner means we want to always load page 1\n fullUrl.searchParams.delete('skip');\n return fullUrl.href;\n }\n\n if (sortingColumns !== undefined) {\n if (sortingColumns.length === 0) {\n fullUrl.searchParams.delete('sorting');\n } else {\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\n }\n\n // Changing the sort means always load page 1\n fullUrl.searchParams.delete('skip');\n return fullUrl.href;\n }\n\n if (skipCount) {\n fullUrl.searchParams.set('skip', skipCount.toString());\n }\n\n return fullUrl.href;\n};\n\n/**\n * Parses a query param from the query object of the request context.\n * @param key The query parameter key.\n * @param requestContext The request context.\n */\nexport const parseQueryParam = <T>(key: string, requestContext: IRequestContext): T | null => {\n if (requestContext.query && requestContext.query[key]) {\n return <T>JSON.parse(decodeURIComponent(requestContext.query[key]));\n }\n return null;\n};\n\n/**\n * Gets the current URL of the page from the request context.\n * @param requestContext The request context.\n */\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\n if (MsDyn365.isBrowser) {\n return new URL(window.location.href);\n }\n\n // NOTE: Typing on requestURL is incorrect\n if (requestContext.url.requestUrl.href) {\n return new URL(requestContext.url.requestUrl.href);\n }\n return new URL(<string>(<unknown>requestContext.url.requestUrl));\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISearchResultModalViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from '@msdyn365-commerce-modules/search-result-container';\nimport { Button, getTelemetryObject, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport React, { MouseEventHandler, useEffect, useState } from 'react';\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n ISearchResultContainerProps,\n ISearchResultContainerResources\n} from '../definition-extensions/search-result-container.ext.props.autogenerated';\nimport { ProductComponent } from './components/product.component';\n\n/**\n * DescriptionInterval.\n */\nenum DescriptionInterval {\n productDescriptionInterval = 14,\n productDescriptionIntervalRemainder0 = 0,\n productDescriptionIntervalRemainder9 = 9\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProductCards = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n return <Node {...props.ProductsContainer}>{props.products}</Node>;\n};\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @param product - The product item data.\n * @param index - The index of each product item.\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\n * @returns The JSX Element.\n */\nconst renderProductCardsDescription = (\n props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>,\n product: ProductSearchResult,\n index: number,\n isEnabledProductDescription?: boolean\n): JSX.Element | null => {\n const { config, context, resources, productsDimensionAvailabilities } = props;\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n const breadCrumbType = props.context.app.config.breadcrumbType;\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n const classname = isEnabledProductDescription\n ? 'ms-product-search-result__item product__description'\n : 'ms-product-search-result__item';\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n\n const productComparisonButton = ArrayExtensions.hasElements(props.slots.productComparisonButton)\n ? props.slots.productComparisonButton[0]\n : null;\n\n return (\n <li className={classname} key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={config.imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={isAllowBack}\n id={props.id}\n key={product.RecordId}\n typeName={props.typeName}\n data={{ product }}\n quickViewButton={quickviewslot}\n productComparisonButton={productComparisonButton}\n isEnabledProductDescription={isEnabledProductDescription}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n (dimensionAvailability: IProductsDimensionsAvailabilities[]) =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n );\n};\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProducts = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n const products = props.data.listPageState.result?.activeProducts;\n if (!products || !ArrayExtensions.hasElements(products)) {\n return null;\n }\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\n return (\n <Node {...props.ProductsContainer}>\n {props.errorMessage}\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) =>\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\n ? renderProductCardsDescription(props, product, index, true)\n : renderProductCardsDescription(props, product, index, false)\n )}\n </ul>\n </Node>\n );\n};\n\n/**\n * Render Title Count.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return <Node {...TitleContainer}>{title.titleCount}</Node>;\n }\n return null;\n};\n\n/**\n * Render Category Hierarchy.\n * @param props - The category hierarchy view props.\n * @returns The JSX Element.\n */\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\n/**\n * Function to make filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\n // Get heights of cookie and promotion banners\n const defaultValue = 0;\n const defaultOffset = 28;\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\n\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\n const containerHeight: number = headerHeight ?? defaultOffset;\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\n const headerElement = document.querySelector('header .lock-opaque');\n const defaultContainer = document.querySelector('header .default-container');\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\n if (refinerElement && headerElement && defaultContainer) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-Filter');\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\n } else {\n refinerElement.classList.remove('lock-Filter');\n }\n } else if (refinerElement) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-top');\n } else {\n refinerElement.classList.remove('lock-top');\n refinerElement.classList.remove('lock-Filter');\n refinerElement.removeAttribute('style');\n }\n }\n};\n\n/**\n * Function to setup filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\n window.addEventListener('scroll', () => {\n configureStickyFilter(isMobile, isStickyHeader);\n });\n configureStickyFilter(isMobile, isStickyHeader);\n}\n\n/**\n * Function to make filter sticky.\n * @param refinerRefernce - Ref prop for filter.\n * @param toggle - Toggle function for filter menu.\n */\nfunction useOutsideClick(refinerRefernce: React.RefObject<HTMLElement>, toggle: (event: Event) => void) {\n React.useEffect(() => {\n /**\n * Function to make filter sticky.\n * @param event - Event prop for filter.\n */\n function handleClickOutside(event: Event) {\n const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\n if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\n toggle(event);\n }\n }\n if (MsDyn365.isBrowser) {\n document.addEventListener('click', handleClickOutside);\n }\n return () => {\n if (MsDyn365.isBrowser) {\n document.removeEventListener('click', handleClickOutside);\n }\n };\n }, [refinerRefernce, toggle]);\n}\n\n/**\n * Render the category page items.\n * @param props - The view props.\n * @returns The search Result container module view.\n */\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>> = props => {\n const {\n SearchResultContainer,\n pagination,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n FeatureSearchContainer,\n similarLookProduct,\n errorMessage,\n resources\n } = props;\n useEffect(() => {\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\n }\n }, [props]);\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\n const toggle = () => {\n setIsExpanded(!isExpanded);\n };\n const wrapperRefiner = React.useRef(null);\n useOutsideClick(wrapperRefiner, toggle);\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...CategoryNavContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {renderTitleCount(TitleViewProps)}\n </Node>\n )}\n {choiceSummary}\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitle(TitleViewProps)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n )}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...RefineAndProductSectionContainer}>\n <Node ref={wrapperRefiner} className='ms-refiner-heading'>\n <Node className='ms-refiner-heading_title'>\n <Button\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\n aria-label='Filter'\n onClick={toggle}\n aria-expanded={isExpanded}\n tabIndex={0}\n >\n {resources.filterText}\n </Button>\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\n <div className='ms-search-result-wrapper-sort-by-category'>\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n </div>\n </Node>\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\n <Node className='ms-refine__footer'>\n {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}\n </Node>\n </Node>\n\n <Node {...ProductSectionContainer}>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\n/**\n * Render Search result Modal.\n * @param modalProps - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createSearchResultModal = (\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\n/**\n * Render Refiner Mobile.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Search result Body.\n * @param props - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createModalBody = (\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), renderRefinerMobile(refineMenu));\n }\n return null;\n};\n\n/**\n * Render Refiner.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Refiner Footer.\n * @param props - The Refine Menu view props.\n * @param handler - The Refine menu toggle function.\n * @param resources - Resources to get the done text and aria label.\n * @returns The JSX Element.\n */\nconst renderRefinerFooter = (\n props: IRefineMenuViewProps,\n handler: MouseEventHandler,\n resources: ISearchResultContainerResources\n): JSX.Element | null => {\n const { refiners } = props;\n if (refiners) {\n return (\n <Node className='ms-refine__footer__done'>\n <Node tag='button' className='ms-refine-filter-done' aria-label={resources.doneAriaLabel} tabIndex={0} onClick={handler}>\n {resources.doneText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render sort by drop down.\n * @param props - The sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\n/**\n * Render Title.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <Node tag='h1' className=''>\n {title.titlePrefix}\n {title.titleText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, getCatalogId, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {\n convertToString,\n ChannelInventoryConfiguration,\n IQueryResultSettings,\n ProductRefinerValue,\n SortColumn\n} from '@msdyn365-commerce/retail-proxy';\nimport { generateCacheKey, QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\nimport { toJS } from 'mobx';\n\nimport { hydrateRefinersFromUrl } from './url-utils';\n\n/**\n * Export listPageType.\n */\nexport type listPageType = 'Category' | 'Search' | 'Unknown';\n\n/**\n * Get include attributes from config.\n * @param inputData - ICreateActionContext.\n * @returns Boolean.\n */\nfunction getIncludeAttributes(inputData: ICreateActionContext<IGeneric<IAny>, IGeneric<IAny>>): boolean {\n if (inputData && inputData.config && inputData.config.includeAttributes !== undefined && inputData.config.includeAttributes === true) {\n return true;\n }\n return false;\n}\n\n/**\n * Get updateRefinerPanel from config.\n * @param inputData - ICreateActionContext.\n * @returns Boolean.\n */\nfunction getUpdateRefinerPanel(inputData: ICreateActionContext<IGeneric<IAny>, IGeneric<IAny>>): boolean {\n return !!inputData.config?.updateRefinerPanel;\n}\n\n/**\n * BaseCollection Action Input.\n */\nexport class BaseCollectionInput implements IActionInput {\n public pageType: listPageType;\n\n public category: number | undefined;\n\n public searchText: string | undefined;\n\n public refiners: ProductRefinerValue[];\n\n public queryResultSettings: IQueryResultSettings;\n\n public apiSettings: ICommerceApiSettings;\n\n public includeAttributes: boolean | undefined;\n\n public locale?: string;\n\n public isUpdateRefinerPanel?: boolean;\n\n public catalogId?: number;\n\n public channelInventoryConfiguration?: ChannelInventoryConfiguration;\n\n public inventoryRefiner?: IProductRefinerHierarchy;\n\n public constructor(\n pageType: listPageType,\n apiSettings: ICommerceApiSettings,\n queryResultSettings: IQueryResultSettings,\n refiners: ProductRefinerValue[],\n category: number | undefined,\n searchText: string | undefined,\n includeAttributes: boolean | undefined,\n isUpdateRefinerPanel?: boolean | undefined,\n locale?: string,\n catalogId?: number,\n channelInventoryConfiguration?: ChannelInventoryConfiguration,\n inventoryRefiner?: IProductRefinerHierarchy\n ) {\n this.pageType = pageType;\n this.apiSettings = apiSettings;\n this.category = category;\n this.searchText = searchText;\n this.queryResultSettings = queryResultSettings;\n this.refiners = refiners;\n this.includeAttributes = includeAttributes;\n this.isUpdateRefinerPanel = isUpdateRefinerPanel;\n this.locale = locale;\n this.catalogId = catalogId ?? 0;\n this.channelInventoryConfiguration = channelInventoryConfiguration;\n this.inventoryRefiner = inventoryRefiner;\n }\n\n public getCacheKey = () => {\n const queryResultSettings = {\n ...this.queryResultSettings.Paging,\n ...toJS(this.queryResultSettings.Sorting)\n };\n\n const cacheKey = generateCacheKey(\n this.apiSettings,\n { key: 'PageType', value: this.pageType },\n { key: 'Category', value: this.category },\n { key: 'SearchText', value: this.searchText },\n { key: 'CatalogId', value: this.catalogId },\n {\n key: 'Refiners',\n value: this.refiners.map(\n refiner =>\n `RefinerRecordId:${refiner.RefinerRecordId}-LeftValueBoundString:${refiner.LeftValueBoundString ||\n ''}-RightValueBoundString:${refiner.RightValueBoundString || ''}`\n )\n },\n { key: 'QueryResultSettings', value: convertToString(queryResultSettings) },\n { key: 'Locale', value: this.locale }\n );\n return cacheKey;\n };\n\n public getCacheObjectType = () => 'CollectionActionResult';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n// TODO: Create a data model here or import one to capture the response of the action\nexport interface IGetFullProductsByCollectionData {\n text: string;\n}\n\nexport type CollectionClassConstructor = new (\n pageType: listPageType,\n apiSettings: ICommerceApiSettings,\n queryResultSettings: IQueryResultSettings,\n refiners: ProductRefinerValue[],\n category: number | undefined,\n searchText: string | undefined,\n includeAttributes: boolean | undefined,\n isUpdateRefinerPanel?: boolean | undefined,\n locale?: string,\n catalogId?: number,\n channelInventoryConfiguration?: ChannelInventoryConfiguration,\n inventoryRefiner?: IProductRefinerHierarchy\n) => BaseCollectionInput;\n\n/**\n * TODO: Use this function to create the input required to make the action call.\n * @param args\n * @param inputClassConstuctor\n */\nexport const createBaseCollectionInput = (\n args: ICreateActionContext,\n inputClassConstuctor: CollectionClassConstructor\n): BaseCollectionInput => {\n const pageType =\n args.requestContext.urlTokens.pageType === 'Category' || (args.requestContext.query && args.requestContext.query.categoryId)\n ? 'Category'\n : 'Search';\n\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(args).QueryResultSettings;\n const queryRefiners = hydrateRefinersFromUrl(args.requestContext);\n const includeAttributes = getIncludeAttributes(args);\n const isUpdateRefinerPanel = getUpdateRefinerPanel(args);\n const catalogId = getCatalogId(args.requestContext);\n\n if (args.requestContext.query && args.requestContext.query.sorting) {\n queryResultSettings.Sorting = { Columns: <SortColumn[]>JSON.parse(decodeURIComponent(args.requestContext.query.sorting)) };\n }\n\n if (pageType === 'Category') {\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n +(args.requestContext.urlTokens.itemId || (args.requestContext.query && args.requestContext.query.categoryId) || 0),\n undefined,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.q) {\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n undefined,\n args.requestContext.query.q,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.recommendation) {\n let searchText = '';\n if (args.requestContext.query.productId) {\n searchText = JSON.stringify({\n ProductId: args.requestContext.query.productId,\n Recommendation: args.requestContext.query.recommendation\n });\n } else {\n searchText = JSON.stringify({ Recommendation: args.requestContext.query.recommendation });\n }\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n undefined,\n searchText,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n }\n\n throw new Error('[getFullProductsForCollection]Unable to create input');\n};\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 { 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\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 { 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","module.exports = React;","/*!\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 { 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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, ICreateActionContext } from '@msdyn365-commerce/core';\nimport { AsyncResult, ChannelInventoryConfiguration, ProductRefinerValue, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\nimport { getInventoryConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\nimport { getInventoryRefinerAction, InventoryInStockRefinerValueInput, ProductListInventoryFilteringOptions } from '../actions';\n\n/**\n * Default Category/Product Id Values.\n */\nenum DefaultValues {\n defaultCategoryIdValue = 0,\n defaultProductIdValue = 0\n}\n\n/**\n * Refiners-by-Collection Input action.\n */\nexport class RefinersByCollectionInput extends BaseCollectionInput implements IActionInput {\n public getCacheObjectType = () => 'ProductRefiner';\n\n public dataCacheType = () => {\n if (\n this.pageType !== 'Category' ||\n (this.refiners && this.refiners.length > 0) ||\n (this.queryResultSettings &&\n this.queryResultSettings.Sorting &&\n this.queryResultSettings.Sorting.Columns &&\n this.queryResultSettings.Sorting.Columns.length > 0)\n ) {\n return 'request';\n }\n return 'application';\n };\n}\n\n/**\n * Create input method which creates an ActionInput for fetching list page refiners.\n * @param args\n */\nconst createInput = (args: ICreateActionContext): IActionInput => {\n return createBaseCollectionInput(args, RefinersByCollectionInput);\n};\n\n/**\n * Returns inventory in stock refiner value.\n * @param input - The inventory refiner input.\n * @param context - The request context.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @returns Refiners.\n */\nasync function getInventoryInStockRefinerValueAsync(\n input: RefinersByCollectionInput,\n context: IActionContext,\n channelInventoryConfiguration: ChannelInventoryConfiguration\n): Promise<ProductRefinerValue | null> {\n let inventoryRefiner = input.inventoryRefiner;\n // For hydrate, the inventory refiner is not added on input parameter, need to query the inventory refiner\n // For reaction in browser, the inventory refiner is added in componentDidMount of search-result-container\n if (!inventoryRefiner) {\n const refinerInput = new InventoryInStockRefinerValueInput(input, channelInventoryConfiguration.InventoryProductAttributeRecordId);\n inventoryRefiner = await getInventoryRefinerAction(refinerInput, context);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- inventoryRefiner may be null\n return (\n inventoryRefiner?.Values.find(\n value =>\n value.LeftValueBoundString !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText &&\n value.RightValueBoundString !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\n ) ?? null\n );\n}\n\n/**\n * Action method which fetches refiners for the given list page.\n * @param input\n * @param context\n */\nasync function action(input: RefinersByCollectionInput, context: IActionContext): Promise<IProductRefinerHierarchy[]> {\n let searchProductId;\n const refiners: ProductRefinerValue[] = input.refiners || [];\n\n if (context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n let channelInventoryConfigurationPromise: AsyncResult<ChannelInventoryConfiguration>;\n if (input.channelInventoryConfiguration) {\n channelInventoryConfigurationPromise = AsyncResult.resolve(input.channelInventoryConfiguration);\n } else {\n channelInventoryConfigurationPromise = getInventoryConfigurationAsync({ callerContext: context });\n }\n const channelInventoryConfiguration = await channelInventoryConfigurationPromise;\n const inventoryInStockRefinerValue = await getInventoryInStockRefinerValueAsync(input, context, channelInventoryConfiguration);\n\n const isInventoryInStockRefinerValueExist = refiners.some(\n refiner => refiner.RefinerRecordId === inventoryInStockRefinerValue?.RefinerRecordId\n );\n if (!isInventoryInStockRefinerValueExist && inventoryInStockRefinerValue) {\n refiners.push(inventoryInStockRefinerValue);\n }\n }\n\n if (input.pageType === 'Category') {\n if (input.category) {\n return getProductRefinerHierarchy(\n {\n CategoryIds: [input.category || DefaultValues.defaultCategoryIdValue],\n Context: {\n ChannelId: input.apiSettings.channelId,\n CatalogId: input.catalogId\n },\n Refinement: input.isUpdateRefinerPanel ? refiners : []\n },\n input.queryResultSettings,\n context\n );\n }\n throw new Error('[GetRefinersForCollection]Category Page Detected, but no global categoryId found');\n } else {\n if (input.searchText && context.requestContext.query && context.requestContext.query.q) {\n return getProductRefinerHierarchy(\n {\n SearchCondition: input.searchText,\n Context: {\n ChannelId: input.apiSettings.channelId,\n CatalogId: input.catalogId\n },\n Refinement: input.isUpdateRefinerPanel ? refiners : []\n },\n input.queryResultSettings,\n context\n );\n }\n if (input.searchText && context.requestContext.query && context.requestContext.query.recommendation) {\n const searchObject = JSON.parse(input.searchText);\n if (context.requestContext.query.productId) {\n searchProductId = Number(searchObject.ProductId);\n }\n if (Number.isNaN(searchProductId)) {\n throw new Error('Failed to cast search product id into a number.');\n } else if (!searchObject.Recommendation) {\n throw new Error('Failed to retrieve the Recommendation.');\n } else {\n const searchCriteriaInput: ProductSearchCriteria = {};\n searchCriteriaInput.Context = {\n ChannelId: input.apiSettings.channelId,\n CatalogId: input.catalogId\n };\n searchCriteriaInput.Refinement = input.isUpdateRefinerPanel ? refiners : [];\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\n if (searchProductId) {\n searchCriteriaInput.Ids = [searchProductId || DefaultValues.defaultProductIdValue];\n }\n return getProductRefinerHierarchy(searchCriteriaInput, input.queryResultSettings, context);\n }\n } else {\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\n }\n }\n}\n\nexport const actionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search-result-container/get-refiners-for-collection',\n action: <IAction<IProductRefinerHierarchy[]>>action,\n input: createInput\n});\n\nexport default actionDataAction;\n","module.exports = ReactDOM;","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport {\n AsyncResult,\n ChannelInventoryConfiguration,\n ProductRefinerValue,\n ProductSearchCriteria,\n ProductSearchResult\n} from '@msdyn365-commerce/retail-proxy';\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { getInventoryConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { ArrayExtensions, generateProductImageUrl, InventoryLevels } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\nimport getInventoryRefinerAction, { InventoryInStockRefinerValueInput } from './get-inventory-refiners';\n\n/**\n * GetFullProductsByCollection Action Input.\n */\nexport class GetFullProductsByCollectionInput extends BaseCollectionInput implements IActionInput {\n /**\n * The cache object type.\n * @returns The cache object type.\n */\n public getCacheObjectType = (): string => 'FullProductSearchResult';\n\n /**\n * The data cache type.\n * @returns The data cache type.\n */\n public dataCacheType = (): CacheType => {\n if (\n this.pageType !== 'Category' ||\n (this.refiners && this.refiners.length > 0) ||\n (this.queryResultSettings &&\n this.queryResultSettings.Sorting &&\n this.queryResultSettings.Sorting.Columns &&\n this.queryResultSettings.Sorting.Columns.length > 0)\n ) {\n return 'request';\n }\n return 'application';\n };\n}\n\n/**\n * This setting defines inventory filtering options.\n */\nexport enum ProductListInventoryFilteringOptions {\n /**\n * Filter out all products out of stock.\n */\n HideOOS = 'hideOOS',\n\n /**\n * Sort products by availability, OOS goes last.\n */\n SortOOS = 'sortOOS',\n\n /**\n * No filtering selected.\n */\n Default = 'default'\n}\n\n/**\n * The full product search result with count interface.\n */\nexport interface IFullProductsSearchResultsWithCount {\n products: ProductSearchResult[];\n count: number;\n channelInventoryConfigurationId?: number;\n inventoryAwareSortableAttributeId?: number;\n}\n\n/**\n * CreateInput function which creates and actionInput used to fetch products for a list page.\n * @param args - The API arguments.\n * @returns IActionInput - The action input.\n */\nconst createInput = (args: ICreateActionContext<{ itemsPerPage: number; includedAttributes: boolean | undefined }>): IActionInput => {\n const input = createBaseCollectionInput(args, GetFullProductsByCollectionInput);\n\n // Set Top\n if (input.queryResultSettings.Paging && args.config) {\n input.queryResultSettings.Paging.Top = args.config.itemsPerPage || 1;\n }\n\n // Set Skip\n if (input.queryResultSettings.Paging && args.requestContext.query && args.requestContext.query.skip) {\n input.queryResultSettings.Paging.Skip = +args.requestContext.query.skip;\n }\n\n input.queryResultSettings.count = true;\n\n return input;\n};\n\n/**\n * Returns inventory in stock refiner value.\n * @param input - The inventory refiner input.\n * @param context - The request context.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @returns Refiners.\n */\nasync function getInventoryInStockRefinerValueAsync(\n input: GetFullProductsByCollectionInput,\n context: IActionContext,\n channelInventoryConfiguration: ChannelInventoryConfiguration\n): Promise<ProductRefinerValue | null> {\n let inventoryRefiner = input.inventoryRefiner;\n // For hydrate, the inventory refiner is not added on input parameter, need to query the inventory refiner\n // For reaction in browser, the inventory refiner is added in componentDidMount of search-result-container\n if (!inventoryRefiner) {\n const refinerInput = new InventoryInStockRefinerValueInput(input, channelInventoryConfiguration.InventoryProductAttributeRecordId);\n inventoryRefiner = await getInventoryRefinerAction(refinerInput, context);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- inventoryRefiner may be null\n return (\n inventoryRefiner?.Values.find(\n value =>\n value.LeftValueBoundString !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText &&\n value.RightValueBoundString !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\n ) ?? null\n );\n}\n\n/**\n * Returns list of products based on inventory information.\n * @param productSearchResults - The products.\n * @param context - The context.\n * @param metadataCount - The metadata count.\n * @param channelInventoryConfiguration - The channel inventory configuration.\n * @returns List of product based on the inventory information.\n */\nexport async function returnProducts(\n productSearchResults: ProductSearchResult[],\n context: IActionContext,\n metadataCount: number | undefined,\n channelInventoryConfiguration?: ChannelInventoryConfiguration\n): Promise<IFullProductsSearchResultsWithCount> {\n const defaultProductCount: number = 0;\n\n const productSearchResultsWithImages = productSearchResults.map(productSearchResult => {\n const newImageUrl = generateProductImageUrl(productSearchResult, context.requestContext.apiSettings);\n\n if (newImageUrl) {\n productSearchResult.PrimaryImageUrl = newImageUrl;\n }\n\n return productSearchResult;\n });\n\n // If inventory level is threshold or inventory check is disabled then return the list of products without the inventory configuration\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\n if (\n context.requestContext.app.config.inventoryLevel === InventoryLevels.threshold ||\n context.requestContext.app.config.enableStockCheck === false\n ) {\n return {\n products: productSearchResultsWithImages,\n count: metadataCount ?? defaultProductCount\n };\n }\n\n const mappedProducts = productSearchResultsWithImages.map(productSearchResult => {\n if (ArrayExtensions.hasElements(productSearchResult.AttributeValues)) {\n for (const element of productSearchResult.AttributeValues) {\n if (\n channelInventoryConfiguration &&\n element.RecordId !== undefined &&\n element.RecordId === channelInventoryConfiguration.InventoryProductAttributeRecordId &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\n context.requestContext.app.config.inventoryRanges !== 'all' &&\n element.TextValue !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\n ) {\n // If same RecordId then it means that is the Inventory attribute\n // Based on the inventory range (and filtering options), the inventory label will be displayed\n // If Inventory range is 'All' then in stock and out of stock labels are shown, else only OOS\n // if the text value is different that the channelInventoryConfiguration.InventoryOutOfStockAttributeValueText then is in stock\n element.TextValue = '';\n }\n }\n }\n\n return productSearchResult;\n });\n\n return {\n products: mappedProducts,\n count: metadataCount ?? defaultProductCount,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check config.\n channelInventoryConfigurationId: channelInventoryConfiguration\n ? channelInventoryConfiguration.InventoryProductAttributeRecordId\n : undefined,\n inventoryAwareSortableAttributeId: channelInventoryConfiguration\n ? channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\n : undefined\n };\n}\n\n/**\n * Action function to fetch products for a list page.\n * @param input - The input.\n * @param context - The context.\n * @returns IFullProductsSearchResultsWithCount - The full product search result with count.\n */\n// eslint-disable-next-line complexity -- ignore the complexity.\nasync function action(input: GetFullProductsByCollectionInput, context: IActionContext): Promise<IFullProductsSearchResultsWithCount> {\n let promise: AsyncResult<ProductSearchResult[]>;\n let channelInventoryConfigurationPromise: AsyncResult<ChannelInventoryConfiguration>;\n let searchProductId;\n const searchCriteriaInput: ProductSearchCriteria = {};\n searchCriteriaInput.Context = { ChannelId: context.requestContext.apiSettings.channelId, CatalogId: input.catalogId };\n searchCriteriaInput.Refinement = input.refiners;\n searchCriteriaInput.IncludeAttributes = input.includeAttributes;\n searchCriteriaInput.SkipVariantExpansion = true;\n const defaultNumber: number = 0;\n\n if (input.channelInventoryConfiguration) {\n channelInventoryConfigurationPromise = AsyncResult.resolve(input.channelInventoryConfiguration);\n } else {\n channelInventoryConfigurationPromise = getInventoryConfigurationAsync({ callerContext: context });\n }\n const channelInventoryConfiguration = await channelInventoryConfigurationPromise;\n\n if (context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n const inventoryInStockRefinerValue = await getInventoryInStockRefinerValueAsync(input, context, channelInventoryConfiguration);\n\n const isInventoryInStockRefinerValueExist = searchCriteriaInput.Refinement.some(\n refiner => refiner.RefinerRecordId === inventoryInStockRefinerValue?.RefinerRecordId\n );\n if (!isInventoryInStockRefinerValueExist && inventoryInStockRefinerValue) {\n searchCriteriaInput.Refinement.push(inventoryInStockRefinerValue);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (\n context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.SortOOS &&\n channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\n ) {\n input.queryResultSettings.Sorting = input.queryResultSettings.Sorting ?? {};\n input.queryResultSettings.Sorting.Columns = input.queryResultSettings.Sorting.Columns ?? [];\n const sortColumnName = `Attr_${channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId}`;\n const isSortAttributeExist = input.queryResultSettings.Sorting.Columns.some(column => column.ColumnName === sortColumnName);\n if (!isSortAttributeExist) {\n input.queryResultSettings.Sorting.Columns.push({\n ColumnName: sortColumnName,\n IsDescending: true\n });\n }\n }\n\n if (input.pageType === 'Category' || context.requestContext.query?.categoryId) {\n if (input.category) {\n searchCriteriaInput.CategoryIds = [input.category || defaultNumber];\n promise = searchByCriteriaAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings\n },\n searchCriteriaInput\n );\n } else {\n throw new Error('[GetFullProductsForCollection]Category Page Detected, but no global categoryId found');\n }\n } else if (input.searchText && context.requestContext.query?.q) {\n searchCriteriaInput.SearchCondition = input.searchText;\n promise = searchByCriteriaAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings\n },\n searchCriteriaInput\n );\n } else if (input.searchText && context.requestContext.query && context.requestContext.query.recommendation) {\n const searchObject = JSON.parse(input.searchText);\n if (context.requestContext.query.productId) {\n searchProductId = Number(searchObject.ProductId);\n }\n if (Number.isNaN(searchProductId)) {\n throw new Error('Failed to cast search product id into a number.');\n } else if (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Existing code\n !searchObject.Recommendation\n ) {\n throw new Error('Failed to retrieve the Recommendation.');\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Existing code\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\n if (searchProductId) {\n searchCriteriaInput.Ids = [searchProductId || defaultNumber];\n }\n promise = searchByCriteriaAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings\n },\n searchCriteriaInput\n );\n }\n } else {\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\n }\n\n const productSearchResults = await promise;\n return returnProducts(productSearchResults, context, promise.metadata.count, channelInventoryConfiguration);\n}\n\nexport const actionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search-result-container/get-full-products-by-collection',\n action: action as IAction<IFullProductsSearchResultsWithCount>,\n input: createInput\n});\n\nexport default actionDataAction;\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['search-result-container'] = {\n c: () => require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/search-result-container'),\n $type: 'containerModule',\n da: [{name:'category', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category', runOn: 0},{name:'categoryHierarchy', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy', runOn: 0},{name:'featureProduct', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0},{name:'featureState', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state', runOn: 0},{name:'listPageState', path:'@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/list-page-state', runOn: 0},{name:'products', path:'@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-full-products-by-collection', runOn: 0},{name:'refiners', path:'@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-refiners-for-collection', runOn: 0},{name:'searchConfiguration', path:'@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-mapped-search-configuration', runOn: 0}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'search-result-container',\n p: 'search-result-container',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-full-products-by-collection';\n let dataAction = require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-full-products-by-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-mapped-search-configuration';\n let dataAction = require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-mapped-search-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-refiners-for-collection';\n let dataAction = require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-refiners-for-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/list-page-state';\n let dataAction = require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/list-page-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|themes|sheikhzayedfestival|views|search-result-container'] = {\n c: () => require('partner/themes/sheikhzayedfestival/views/search-result-container.view.tsx'),\n cn: '__local__-__local__-search-result-container'\n };\nviewDictionary['@msdyn365-commerce-modules|fabrikam-design-kit|modules|fabrikam|views|search-result-container'] = {\n c: () => require('@msdyn365-commerce-modules/fabrikam-design-kit/dist/lib/modules/fabrikam/views/search-result-container.view.js'),\n cn: '@msdyn365-commerce-modules-fabrikam-design-kit-search-result-container'\n };\nviewDictionary['@msdyn365-commerce-modules|search-result-container|modules|search-result-container|search-result-container'] = {\n c: () => require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/search-result-container.view.js'),\n cn: '@msdyn365-commerce-modules-search-result-container-search-result-container'\n };\nviewDictionary['@msdyn365-commerce-theme|adventureworks-theme-kit|modules|adventureworks|views|search-result-container'] = {\n c: () => require('@msdyn365-commerce-theme/adventureworks-theme-kit/dist/lib/modules/adventureworks/views/search-result-container.view.js'),\n cn: '@msdyn365-commerce-theme-adventureworks-theme-kit-search-result-container'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\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 * 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 getCollectionProducts, {\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n ProductListInventoryFilteringOptions\n} from './get-full-products-by-collection';\nimport getMappedSearchConfiguration, { MappedSearchConfiguration, MappedSearchInput, sortOptions } from './get-mapped-search-configuration';\nimport getInventoryRefinerAction, { InventoryInStockRefinerValueInput } from './get-inventory-refiners';\nimport getCollectionRefinersAction, { RefinersByCollectionInput } from './get-refiners-for-collection';\nimport { BaseCollectionInput } from './base-collection-action';\n\nexport * from './base-collection-action';\nexport * from './url-utils';\n\nexport {\n BaseCollectionInput,\n getCollectionProducts,\n getCollectionRefinersAction,\n GetFullProductsByCollectionInput,\n getMappedSearchConfiguration,\n getInventoryRefinerAction,\n IFullProductsSearchResultsWithCount,\n InventoryInStockRefinerValueInput,\n MappedSearchConfiguration,\n MappedSearchInput,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n};\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","/*!\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 {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductRefinerValue, ProductSearchResult, SimpleProduct, SortingInfo } from '@msdyn365-commerce/retail-proxy';\nimport { observable } from 'mobx';\n\nimport { listPageType } from './actions';\n\n/**\n * ListPageState class.\n */\nexport class ListPageState {\n @observable public activeFilters: ProductRefinerValue[] | null = null;\n\n @observable public activeProducts: ProductSearchResult[] = [];\n\n @observable public sortingCritera: SortingInfo | null = null;\n\n @observable public currentPageNumber: number | null = null;\n\n @observable public refiners: IProductRefinerHierarchy[] | null = null;\n\n @observable public totalProductCount: number | undefined;\n\n @observable public pageSize: number = 10;\n\n @observable public pageType: listPageType = 'Unknown';\n\n @observable public featureProduct: SimpleProduct | null = null;\n\n @observable public productPrices: ProductPrice[] | undefined = [];\n}\n\n/**\n * ListPageStateInput - action input.\n */\nexport class ListPageStateInput implements IActionInput {\n public getCacheKey = () => 'ListPageState';\n\n public getCacheObjectType = () => 'ListPageState';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nexport async function listPageStateAction(input: ListPageStateInput, ctx: IActionContext): Promise<ListPageState> {\n return new ListPageState();\n}\n\n/**\n * Create new input for create action.\n * @param inputData\n */\nexport const createListPageInput = (inputData: ICreateActionContext<IGeneric<IAny>>): IActionInput => {\n return new ListPageStateInput();\n};\n\n/**\n * ListPageState - create action.\n */\nexport default createObservableDataAction<ListPageState>({\n action: <IAction<ListPageState>>listPageStateAction,\n input: createListPageInput\n});\n","/*!\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(product.ItemId, context.actionContext.requestContext.apiSettings);\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { BaseCollectionInput } from './base-collection-action';\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\n\n/**\n * InventoryInStockRefinerValue Input action.\n */\nexport class InventoryInStockRefinerValueInput extends BaseCollectionInput implements IActionInput {\n public inventoryProductAttributeRecordId: number;\n\n public constructor(input: BaseCollectionInput, inventoryProductAttributeRecordId: number = 0) {\n super(\n input.pageType,\n input.apiSettings,\n {\n count: true\n },\n\n // Parameter - refiners\n [],\n\n // Parameter - category\n undefined,\n\n // Parameter - searchText\n '',\n\n // Parameter - includeAttributes\n false,\n\n // Parameter - isUpdateRefinerPanel\n false,\n\n // Parameter - locale\n undefined,\n input.catalogId,\n input.channelInventoryConfiguration,\n input.inventoryRefiner\n );\n\n this.inventoryProductAttributeRecordId =\n inventoryProductAttributeRecordId || input.channelInventoryConfiguration?.InventoryProductAttributeRecordId || 0;\n }\n\n /**\n * GetCacheKey.\n * @returns - Returns string.\n */\n public getCacheKey = (): string => buildCacheKey('RefinerList', this.apiSettings);\n\n /**\n * GetCacheObjectType.\n * @returns - Returns string.\n */\n public getCacheObjectType = (): string => 'RefinerList';\n\n /**\n * DataCacheType.\n * @returns - CacheType string.\n */\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * Action method returns inventory in stock refiners.\n * @param input - InventoryInStockRefinerValueInput.\n * @param context - IActionContext.\n * @returns - Promise<IProductRefinerHierarchy | null>.\n */\nasync function action(input: InventoryInStockRefinerValueInput, context: IActionContext): Promise<IProductRefinerHierarchy | null> {\n const refiners = await getProductRefinerHierarchy(\n {\n Context: {\n ChannelId: input.apiSettings.channelId,\n CatalogId: input.catalogId\n }\n },\n input.queryResultSettings,\n context\n );\n\n // InventoryProductAttributeRecordId may be 0, and recId of default refiner Category/Price/Rating is always 0 by design. In this case, we should not return refiner\n // Why recId of default refiner Category/Price/Rating is 0: see GetChannelProductRefiners.sql\n return (\n (input.channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiners.find(refiner => refiner.RecordId === input.channelInventoryConfiguration?.InventoryProductAttributeRecordId)) ||\n // keep legacy logic to avoid break existing customers usage from this file\n (input.inventoryProductAttributeRecordId !== 0 &&\n refiners.find(refiner => refiner.RecordId === input.inventoryProductAttributeRecordId)) ||\n null\n );\n}\n\n/**\n * Action.\n * @param id - Id.\n * @param action - Action.\n * @returns - Results.\n */\nexport const actionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search-result-container/get-inventory-refiners',\n action: action as IAction<IProductRefinerHierarchy>\n});\n\nexport default actionDataAction;\n"],"sourceRoot":""}