{"version":3,"file":"static/js/c0204457c0aa77242ad6.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/components/common/product-inventory-utils.ts?8daa","webpack://Msdyn365.Commerce.Online/./src/components/product-list-component/components/product-list-view-mode.tsx?1dbb","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search-result-container/dlvry-search-result-container.props.autogenerated.ts?d84f","webpack://Msdyn365.Commerce.Online/./src/shared-utils/validate-product-access.ts?427b","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search-result-container/dlvry-search-result-container.tsx?a550","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search-result-container/dlvry-search-result-container.view.tsx?b71b","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search-result-container/list-page-state.ts?18e3","webpack://Msdyn365.Commerce.Online/./lib/dlvry-search-result-container/module-registration.js?b987","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["/*!\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 { IActionContext } from '@msdyn365-commerce/core';\r\nimport {\r\n InventoryAvailabilitySearchCriteria,\r\n ProductAvailableQuantity,\r\n ProductWarehouseInventoryAvailability,\r\n ProductWarehouseInventoryInformation,\r\n SearchArea\r\n} from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport enum DeliveryMode {\r\n allWareHouses = 0,\r\n shipping = 1,\r\n pickup = 2\r\n}\r\n\r\n/**\r\n * This setting defines the inventory levels supported.\r\n */\r\nexport enum InventoryLevels {\r\n physicalAvailable = 'physicalAvailable',\r\n totalAvailable = 'totalAvailable',\r\n threshold = 'inventoryThreshold'\r\n}\r\n\r\n/**\r\n * Product inventory information class.\r\n */\r\nexport interface IProductInventoryInformation {\r\n ProductAvailableQuantity: ProductAvailableQuantity;\r\n StockLevelCode?: string;\r\n StockLevelLabel?: string;\r\n IsProductAvailable: boolean;\r\n InventLocationId?: string;\r\n deliveryType?: DeliveryMode;\r\n}\r\n\r\n/**\r\n * This setting defines the inventory level values return by the API.\r\n */\r\nexport enum InventoryLevelValues {\r\n outOfStock = 'OOS',\r\n available = 'AVAIL'\r\n}\r\n/**\r\n * The function defines whether the inventory label should be displayed or not.\r\n * @param context - The action context.\r\n * @param inventoryCode - The inventory code.\r\n * @returns Boolean.\r\n */\r\nexport function displayLabelEnabled(context: IActionContext, inventoryCode?: string): boolean {\r\n if (!inventoryCode) {\r\n return false;\r\n }\r\n\r\n // eslint-disable-next-line default-case\r\n switch (context.requestContext.app.config.inventoryRanges) {\r\n case 'lowAndOutofStock':\r\n if (inventoryCode !== InventoryLevelValues.available) {\r\n return true;\r\n }\r\n break;\r\n case 'outOfStock':\r\n if (inventoryCode === InventoryLevelValues.outOfStock) {\r\n return true;\r\n }\r\n break;\r\n case 'all':\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * The function that maps a ProductWareHouse object into a ProductAvailabilityQuantity.\r\n * @param context - The action context.\r\n * @param productsWarehouseInventory - The product warehouse inventory information.\r\n * @returns IProductInventoryInformation[].\r\n */\r\nexport function mapProductInventoryInformation(\r\n context: IActionContext,\r\n productsWarehouseInventory?: ProductWarehouseInventoryAvailability[]\r\n): IProductInventoryInformation[] {\r\n const productInventoryInformation: IProductInventoryInformation[] = [];\r\n\r\n if (context.requestContext.app.config.enableStockCheck === undefined || context.requestContext.app.config.enableStockCheck === false) {\r\n return productInventoryInformation;\r\n }\r\n\r\n if (productsWarehouseInventory && productsWarehouseInventory.length > 0) {\r\n for (const product of productsWarehouseInventory) {\r\n switch (context.requestContext.app.config.inventoryLevel) {\r\n case InventoryLevels.physicalAvailable:\r\n // Inventory level is enabled with Physical inventory\r\n const physicalProductMap = mapInventoryWithPhysicalBufferEnabled(context, product);\r\n if (physicalProductMap) {\r\n productInventoryInformation.push(physicalProductMap);\r\n }\r\n break;\r\n case InventoryLevels.totalAvailable:\r\n // Inventory level is enabled with Total available inventory\r\n const totalAvailableProductMap = mapInventoryWithTotalAvailableBufferEnabled(context, product);\r\n if (totalAvailableProductMap) {\r\n productInventoryInformation.push(totalAvailableProductMap);\r\n }\r\n break;\r\n default:\r\n // When inventory level is inventoryThreshold or not defined\r\n const productMap = mapInventoryWithThresholdEnabled(context, product);\r\n if (productMap) {\r\n productInventoryInformation.push(productMap);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return productInventoryInformation;\r\n}\r\n\r\n/**\r\n * The function that maps inventory for when threshold is selected.\r\n * @param context - The action context.\r\n * @param productWarehouseInventoryAvailability - The product warehouse inventory information.\r\n * @returns IProductInventoryInformation.\r\n */\r\nexport function mapInventoryWithThresholdEnabled(\r\n context: IActionContext,\r\n productWarehouseInventoryAvailability: ProductWarehouseInventoryAvailability\r\n): IProductInventoryInformation | null {\r\n if (productWarehouseInventoryAvailability.ProductId && productWarehouseInventoryAvailability.TotalAvailable !== undefined) {\r\n const productQty = productWarehouseInventoryAvailability.TotalAvailable - context.requestContext.app.config.outOfStockThreshold;\r\n const productAvailableQuantity: ProductAvailableQuantity = {\r\n ProductId: productWarehouseInventoryAvailability.ProductId,\r\n AvailableQuantity: productQty > 0 ? productQty : 0\r\n };\r\n\r\n return {\r\n ProductAvailableQuantity: productAvailableQuantity,\r\n IsProductAvailable: !!(productAvailableQuantity.AvailableQuantity && productAvailableQuantity.AvailableQuantity > 0),\r\n InventLocationId: productWarehouseInventoryAvailability.InventLocationId\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * The function that maps inventory for when physical available is selected.\r\n * @param context - The action context.\r\n * @param productWarehouseInventoryAvailability - The product warehouse inventory information.\r\n * @returns IProductInventoryInformation.\r\n */\r\nexport function mapInventoryWithPhysicalBufferEnabled(\r\n context: IActionContext,\r\n productWarehouseInventoryAvailability: ProductWarehouseInventoryAvailability\r\n): IProductInventoryInformation | null {\r\n const shouldRenderLabel = displayLabelEnabled(context, productWarehouseInventoryAvailability.PhysicalAvailableInventoryLevelCode);\r\n\r\n if (productWarehouseInventoryAvailability.ProductId && productWarehouseInventoryAvailability.TotalAvailable !== undefined) {\r\n // As per the new buffer logic from RS,\r\n // if code is out of stock then we set the available quantity to 0 regardless of the actual value from API\r\n let productQuantity: number | undefined = 0;\r\n if (productWarehouseInventoryAvailability.PhysicalAvailableInventoryLevelCode !== InventoryLevelValues.outOfStock) {\r\n productQuantity =\r\n productWarehouseInventoryAvailability.MaximumPurchasablePhysicalAvailableQuantity ??\r\n productWarehouseInventoryAvailability.PhysicalAvailable;\r\n }\r\n\r\n const productAvailableQuantity: ProductAvailableQuantity = {\r\n ProductId: productWarehouseInventoryAvailability.ProductId,\r\n AvailableQuantity: productQuantity\r\n };\r\n return {\r\n ProductAvailableQuantity: productAvailableQuantity,\r\n StockLevelCode: shouldRenderLabel ? productWarehouseInventoryAvailability.PhysicalAvailableInventoryLevelCode : undefined,\r\n StockLevelLabel: shouldRenderLabel ? productWarehouseInventoryAvailability.PhysicalAvailableInventoryLevelLabel : undefined,\r\n IsProductAvailable: productAvailableQuantity.AvailableQuantity !== undefined && productAvailableQuantity.AvailableQuantity > 0,\r\n InventLocationId: productWarehouseInventoryAvailability.InventLocationId\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * The function that maps inventory for when total available is selected.\r\n * @param context - The action context.\r\n * @param productWarehouseInventoryAvailability - The product warehouse inventory information.\r\n * @returns IProductInventoryInformation.\r\n */\r\nexport function mapInventoryWithTotalAvailableBufferEnabled(\r\n context: IActionContext,\r\n productWarehouseInventoryAvailability: ProductWarehouseInventoryAvailability\r\n): IProductInventoryInformation | null {\r\n const shouldRenderLabel = displayLabelEnabled(context, productWarehouseInventoryAvailability.TotalAvailableInventoryLevelCode);\r\n if (productWarehouseInventoryAvailability.ProductId && productWarehouseInventoryAvailability.TotalAvailable !== undefined) {\r\n // As per the new buffer logic from RS,\r\n // if code is out of stock then we set the available quantity to 0 regardless of the actual value from API\r\n let productQuantity: number | undefined = 0;\r\n if (productWarehouseInventoryAvailability.TotalAvailableInventoryLevelCode !== InventoryLevelValues.outOfStock) {\r\n productQuantity =\r\n productWarehouseInventoryAvailability.MaximumPurchasableTotalAvailableQuantity ??\r\n productWarehouseInventoryAvailability.TotalAvailable;\r\n }\r\n\r\n const productAvailableQuantity: ProductAvailableQuantity = {\r\n ProductId: productWarehouseInventoryAvailability.ProductId,\r\n AvailableQuantity: productQuantity\r\n };\r\n return {\r\n ProductAvailableQuantity: productAvailableQuantity,\r\n StockLevelCode: shouldRenderLabel ? productWarehouseInventoryAvailability.TotalAvailableInventoryLevelCode : undefined,\r\n StockLevelLabel: shouldRenderLabel ? productWarehouseInventoryAvailability.TotalAvailableInventoryLevelLabel : undefined,\r\n // eslint-disable-next-line eqeqeq\r\n IsProductAvailable: productAvailableQuantity.AvailableQuantity != undefined && productAvailableQuantity.AvailableQuantity > 0,\r\n InventLocationId: productWarehouseInventoryAvailability.InventLocationId\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * The function created a InventoryAvailabilitySearchCriteria object for getEstimatedAvailability API.\r\n * @param context - The action context.\r\n * @returns Boolean.\r\n */\r\nexport function isAggregatedInventory(context: IActionContext): boolean {\r\n // If warehouse aggregated is true then query inventory from multiple warehouses\r\n // else query from single warehouse\r\n return (\r\n (context.requestContext.app.config.inventoryLevel === InventoryLevels.totalAvailable ||\r\n context.requestContext.app.config.inventoryLevel === InventoryLevels.physicalAvailable) &&\r\n context.requestContext.app.config.warehouseAggregation === 'multiple'\r\n );\r\n}\r\n\r\n/**\r\n * The function created a InventoryAvailabilitySearchCriteria object for getEstimatedAvailability API.\r\n * @param context - The action context.\r\n * @param productWarehouseInventoryInformation - The product ware house inventory information.\r\n * @returns ProductWarehouseInventoryInformation.\r\n */\r\nexport function mapAggregatedProductInventoryInformation(\r\n context: IActionContext,\r\n productWarehouseInventoryInformation: ProductWarehouseInventoryInformation\r\n): IProductInventoryInformation[] {\r\n if (isAggregatedInventory(context)) {\r\n const productInventoryMapping:\r\n | ProductWarehouseInventoryAvailability[]\r\n | undefined = productWarehouseInventoryInformation.AggregatedProductInventoryAvailabilities?.map(product => {\r\n return {\r\n DataAreaId: product.DataAreaId,\r\n MaximumPurchasablePhysicalAvailableQuantity:\r\n product.MaximumPurchasablePhysicalAvailableQuantity ?? product.PhysicalAvailableQuantity,\r\n MaximumPurchasableTotalAvailableQuantity:\r\n product.MaximumPurchasableTotalAvailableQuantity ?? product.TotalAvailableQuantity,\r\n ProductId: product.ProductId,\r\n PhysicalAvailable: product.PhysicalAvailableQuantity,\r\n PhysicalAvailableInventoryLevelCode: product.PhysicalAvailableInventoryLevelCode,\r\n PhysicalAvailableInventoryLevelLabel: product.PhysicalAvailableInventoryLevelLabel,\r\n TotalAvailable: product.TotalAvailableQuantity,\r\n TotalAvailableInventoryLevelCode: product.TotalAvailableInventoryLevelCode,\r\n TotalAvailableInventoryLevelLabel: product.TotalAvailableInventoryLevelLabel\r\n };\r\n });\r\n return mapProductInventoryInformation(context, productInventoryMapping);\r\n }\r\n\r\n return mapProductInventoryInformation(context, productWarehouseInventoryInformation.ProductWarehouseInventoryAvailabilities);\r\n}\r\n\r\n/**\r\n * The function created a InventoryAvailabilitySearchCriteria object for getEstimatedAvailability API.\r\n * @param context - The action context.\r\n * @param productIds - The product id collection.\r\n * @param isDefaultWareHouse - Flag to define whether inventory is from default warehouse or not.\r\n * @param isFilterByChannelFulfillmentGroup - Filter by fulfillment group.\r\n * @param searchArea - The search area.\r\n * @param defaultDeliveryMode - The delivery mode.\r\n * @returns InventoryAvailabilitySearchCriteria.\r\n */\r\nexport function createInventoryAvailabilitySearchCriteria(\r\n context: IActionContext,\r\n productIds: number[],\r\n isDefaultWareHouse?: boolean,\r\n isFilterByChannelFulfillmentGroup?: boolean,\r\n searchArea?: SearchArea,\r\n defaultDeliveryMode?: DeliveryMode\r\n): InventoryAvailabilitySearchCriteria {\r\n const salesUnitType = 2;\r\n const deliveryMode = defaultDeliveryMode ? defaultDeliveryMode : DeliveryMode.shipping;\r\n\r\n const inventoryAvailabilitySearchCriteria: InventoryAvailabilitySearchCriteria = {\r\n ProductIds: productIds,\r\n QuantityUnitTypeValue: salesUnitType,\r\n SearchArea: searchArea\r\n };\r\n\r\n if (isAggregatedInventory(context)) {\r\n inventoryAvailabilitySearchCriteria.FilterByChannelFulfillmentGroup = true;\r\n inventoryAvailabilitySearchCriteria.DeliveryModeTypeFilterValue = deliveryMode;\r\n } else {\r\n inventoryAvailabilitySearchCriteria.DefaultWarehouseOnly = isDefaultWareHouse;\r\n inventoryAvailabilitySearchCriteria.FilterByChannelFulfillmentGroup = isFilterByChannelFulfillmentGroup;\r\n }\r\n\r\n return inventoryAvailabilitySearchCriteria;\r\n}\r\n","import React from \"react\";\r\nimport Button from \"reactstrap/lib/Button\";\r\nimport classname from \"classnames\";\r\n\r\nexport enum ProductListViewMode {\r\n cardView = 0,\r\n listView = 1\r\n}\r\n\r\nexport interface IProductListViewModeProps {\r\n className: string;\r\n viewMode: ProductListViewMode | undefined;\r\n cardButtonTxt: string;\r\n listButtonTxt: string;\r\n setListViewMode: (() => void);\r\n setCardViewMode: (() => void);\r\n}\r\n\r\nexport const ProductListViewModeComponent: React.FC = (props: IProductListViewModeProps) => {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IDlvrySearchResultContainer containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport const enum preferredViewMode {\r\n cardView = 'cardView',\r\n listView = 'listView'\r\n}\r\n\r\nexport interface IDlvrySearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n enableProdutDescription?: boolean;\r\n useStickyFilter?: boolean;\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n disableAvailabilityCheckUnauthorized?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n alcoholRefinerRecordId?: string;\r\n transitRefinerRecordId?: string;\r\n tobaccoRefinerRecordId?: string;\r\n cocacolaRefinerRecordId?: string;\r\n bamaRefinerRecordId?: string;\r\n dutyFreeSugarRefinerRecordId?: string;\r\n norturaRefinerRecordId?: string;\r\n preferredViewMode?: preferredViewMode;\r\n}\r\n\r\nexport interface IDlvrySearchResultContainerResources {\r\n filterText: string;\r\n doneText: string;\r\n doneAriaLabel: string;\r\n productListOrderQuantityLabel: string;\r\n productListActionsLabel: string;\r\n productListItemText: string;\r\n discount: string;\r\n lineAmount: string;\r\n yes: string;\r\n no: string;\r\n productListItemNumberText: string;\r\n productListItemNameText: string;\r\n productListUnitNameText: string;\r\n productListPriceText: string;\r\n buyNowButtonText: string;\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n numberOfSearchResults: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n closeAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n productCountAriaLabel: string;\r\n singleProductCountAriaLabel: string;\r\n swatchItemAriaLabel: string;\r\n refineItemsAriaLabel: string;\r\n refineItemAriaLabel: string;\r\n addToCartText: string;\r\n updateCartText: string;\r\n removeFromCartText: string;\r\n outOfStockText: string;\r\n defaultWishlistName: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n addedProductToWishlistText: string;\r\n productsAddedToCart: string;\r\n productsRemovedFromCart: string;\r\n productsUpdatedInCart: string;\r\n toastErrorHeader: string;\r\n toastGoToCart: string;\r\n toastNoAccessToProduct: string;\r\n addToOrderTemplateHeader: string;\r\n noOrderTemplatesMessage: string;\r\n noOrderTemplatesDescription: string;\r\n createAnOrderTemplateButtonText: string;\r\n createNewOrderTemplateButtonText: string;\r\n cancelOrderTemplateCreationButtonText: string;\r\n selectTemplatesText: string;\r\n addToTemplateButtonText: string;\r\n lineItemsText: string;\r\n createOrderTemplateHeader: string;\r\n orderTemplateTitle: string;\r\n orderTemplateNameAriaLabel: string;\r\n createOrderTemplateDescription: string;\r\n defaultOrderTemplateName: string;\r\n createOrderTemplateButtonText: string;\r\n cancelNewOrderTemplateCreationButtonText: string;\r\n viewOrderTemplateButtonText: string;\r\n continueShoppingButtonText: string;\r\n itemAddedToOrderTemplateHeaderItemOneText: string;\r\n itemAddedToOrderTemplateHeaderItemFormatText: string;\r\n itemAddedToOrderTemplateHeaderMessageText: string;\r\n duplicatedProductsHeader: string;\r\n duplicatedProductsDescription: string;\r\n updateQuantityButtonText: string;\r\n cancelDuplicateItemsButtonText: string;\r\n addToOrderTemplateButtonText: string;\r\n addToOrderTemplateButtonTooltip: string;\r\n selectionActionsText: string;\r\n selectionActionsButtonText: string;\r\n selectionActionsMissingLicenseText: string;\r\n productListTotalPriceText: string;\r\n searchPlaceholderText: string;\r\n searchEmptySearchTermText: string;\r\n priceErrorText: string;\r\n availabilityError: string;\r\n inCartTooltipText: string;\r\n transitTooltip: string;\r\n}\r\n\r\nexport interface IDlvrySearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IDlvrySearchResultContainerResources;\r\n config: IDlvrySearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n productComparisonButton: React.ReactNode[];\r\n };\r\n}\r\n","import { AttributeValue, ProductSearchResult } from \"@msdyn365-commerce/retail-proxy\";\r\n\r\nconst AlcoholAttributeName = 'Alkoholvare';\r\nconst BamaAttributeName = 'Bama';\r\nconst CocaColaAttributeName = 'Coca-Cola';\r\nconst TobaccoAttributeName = 'Tobakk';\r\nconst TransitAttributeName = 'Transitt';\r\n\r\nexport type ValidateProductAccessResult = {\r\n RecordId: number;\r\n HasAccess: boolean;\r\n};\r\n\r\nexport function validateProductAccess(customerAttributes: AttributeValue[], productAttributes: AttributeValue[]) {\r\n const custAlcohol = Number(customerAttributes.find((attr) => attr.Name === AlcoholAttributeName)?.TextValue) || 0;\r\n const custBama = Number(customerAttributes.find((attr) => attr.Name === BamaAttributeName)?.TextValue) || 0;\r\n const custCocaCola = Number(customerAttributes.find((attr) => attr.Name === CocaColaAttributeName)?.TextValue) || 0;\r\n const custTobacco = Number(customerAttributes.find((attr) => attr.Name === TobaccoAttributeName)?.TextValue) || 0;\r\n const custTransit = Number(customerAttributes.find((attr) => attr.Name === TransitAttributeName)?.TextValue) || 0;\r\n\r\n const prodAlcohol = Number(productAttributes.find((attr) => attr.Name === AlcoholAttributeName)?.TextValue) || 0;\r\n const prodBama = Number(productAttributes.find((attr) => attr.Name === BamaAttributeName)?.TextValue) || 0;\r\n const prodCocaCola = Number(productAttributes.find((attr) => attr.Name === CocaColaAttributeName)?.TextValue) || 0;\r\n const prodTobacco = Number(productAttributes.find((attr) => attr.Name === TobaccoAttributeName)?.TextValue) || 0;\r\n const prodTransit = Number(productAttributes.find((attr) => attr.Name === TransitAttributeName)?.TextValue) || 0;\r\n\r\n return [\r\n custAlcohol >= prodAlcohol,\r\n custBama >= prodBama,\r\n custCocaCola >= prodCocaCola,\r\n custTobacco >= prodTobacco,\r\n custTransit >= prodTransit\r\n ].every(Boolean);\r\n}\r\n\r\nexport function validateProductAccessArray(\r\n customerAttributes: AttributeValue[] | undefined,\r\n products: ProductSearchResult[] | undefined\r\n): ValidateProductAccessResult[] {\r\n if (!products) {\r\n return [];\r\n }\r\n\r\n const results: ValidateProductAccessResult[] = [];\r\n const custAlcohol = Number(customerAttributes?.find((attr) => attr.Name === AlcoholAttributeName)?.TextValue) || 0;\r\n const custBama = Number(customerAttributes?.find((attr) => attr.Name === BamaAttributeName)?.TextValue) || 0;\r\n const custCocaCola = Number(customerAttributes?.find((attr) => attr.Name === CocaColaAttributeName)?.TextValue) || 0;\r\n const custTobacco = Number(customerAttributes?.find((attr) => attr.Name === TobaccoAttributeName)?.TextValue) || 0;\r\n const custTransit = Number(customerAttributes?.find((attr) => attr.Name === TransitAttributeName)?.TextValue) || 0;\r\n\r\n for (const product of products) {\r\n const productAttributes = product.AttributeValues;\r\n\r\n if (!productAttributes) {\r\n continue;\r\n }\r\n\r\n const prodAlcohol = Number(productAttributes.find((attr) => attr.Name === AlcoholAttributeName)?.TextValue) || 0;\r\n const prodBama = Number(productAttributes.find((attr) => attr.Name === BamaAttributeName)?.TextValue) || 0;\r\n const prodCocaCola = Number(productAttributes.find((attr) => attr.Name === CocaColaAttributeName)?.TextValue) || 0;\r\n const prodTobacco = Number(productAttributes.find((attr) => attr.Name === TobaccoAttributeName)?.TextValue) || 0;\r\n const prodTransit = Number(productAttributes.find((attr) => attr.Name === TransitAttributeName)?.TextValue) || 0;\r\n\r\n if (![\r\n custAlcohol >= prodAlcohol,\r\n custBama >= prodBama,\r\n custCocaCola >= prodCocaCola,\r\n custTobacco >= prodTobacco,\r\n custTransit >= prodTransit\r\n ].every(Boolean)) {\r\n results.push({\r\n RecordId: product.RecordId,\r\n HasAccess: false\r\n });\r\n } else {\r\n results.push({\r\n RecordId: product.RecordId,\r\n HasAccess: true\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n CategoryHierarchy as CategoryHierarchyData,\r\n IProductRefinerHierarchy,\r\n IProductsDimensionsAvailabilities\r\n} from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\nimport {\r\n ChannelInventoryConfiguration,\r\n ProductPrice,\r\n ProductRefinerValue, ProductsDataActions,\r\n SortColumn,\r\n StoreOperationsDataActions,\r\n TextValueTranslation,\r\n SimpleProduct,\r\n UnitOfMeasureConversion,\r\n format\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n DimensionSwatchDisplayTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n IDimensionsApp,\r\n ProductInput,\r\n getSimpleProducts,\r\n ObjectExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n isMobile,\r\n ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination,\r\n VariantType,\r\n Button,\r\n Tooltip\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { getCartStateData, GetCartStateDataInput, ICartActionResult } from '@msdyn365-commerce/global-state';\r\nimport classnames from 'classnames';\r\nimport { action, computed, observable, reaction, transaction, toJS } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { ProductListViewMode, IProductListViewModeProps } from '../../components/product-list-component/components/product-list-view-mode';\r\n\r\nimport {\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getRefinersForCollectionDataAction,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n parseQueryParam,\r\n ProductListInventoryFilteringOptions,\r\n RefinersByCollectionInput,\r\n sortOptions\r\n} from './actions';\r\nimport { IFullProductsSearchResultsWithCount } from './actions/get-full-products-by-collection';\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultExt,\r\n // @ts-ignore\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { ListPageState } from './list-page-state';\r\nimport { IDlvrySearchResultContainerData } from './dlvry-search-result-container.data';\r\nimport { IDlvrySearchResultContainerProps, preferredViewMode } from './dlvry-search-result-container.props.autogenerated';\r\nimport { IProductSelection, ProductListComponent, productSearchResults2ProductList } from '../../components/product-list-component/product-list-component';\r\nimport { GetCookie, SetCookie } from '../../shared-utils/cookie-utilities';\r\nimport {\r\n createInventoryAvailabilitySearchCriteria,\r\n mapAggregatedProductInventoryInformation,\r\n DeliveryMode,\r\n IProductInventoryInformation\r\n} from \"../../components/common/product-inventory-utils\";\r\nimport { toast, toasts } from '../../components/toast/toast';\r\nimport { validateProductAccessArray, ValidateProductAccessResult } from '../../shared-utils/validate-product-access';\r\nimport { getProductUnitOfMeasureOptionsAsync } from '../../actions/get-product-unit-of-measure-options.action';\r\nimport { getLocale } from '../../shared-utils/attributes/locale';\r\nimport { getActivePricesAsync, getByIdsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { getDiscountBadge } from '../../shared-utils/badge-utils';\r\nimport { onBuyHasAccessValidator } from '../../shared-utils/attributes/on-buy-access-validator';\r\nimport { getTemperatureZone } from '../../shared-utils/attributes/get-temperature-zone';\r\n\r\nexport interface ISearchResultContainerViewProps extends IDlvrySearchResultContainerProps {\r\n products?: React.ReactNode;\r\n totalProductCount?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n searchBar?: React.ReactNode;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n viewModesComponent: IProductListViewModeProps;\r\n selectedProductsActions?: React.ReactNode;\r\n productInventoryStatus?: IProductInventoryInformation[];\r\n simpleProducts: SimpleProduct[];\r\n unitConversions: UnitOfMeasureConversion[];\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title: ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container.\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n refiners: IProductRefinerHierarchy[] | undefined;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n channelInventoryConfiguration?: ChannelInventoryConfiguration;\r\n productInventoryStatus?: IProductInventoryInformation[];\r\n selectedProducts: IProductSelection;\r\n productQuantities: { [key: number]: number };\r\n working: boolean;\r\n retrievedActivePrices: boolean;\r\n validatedProductAccess?: ValidateProductAccessResult[];\r\n showEmptySearchBarTooltip: boolean;\r\n simpleProducts: SimpleProduct[];\r\n unitConversions: UnitOfMeasureConversion[];\r\n resetSelectedQuantities?: Set;\r\n breakoffProducts: { [key: number]: boolean };\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n IDlvrySearchResultContainerProps,\r\n ISearchResultContainerState\r\n> {\r\n\r\n private readonly _viewModeCookieName = 'i365_searchResultViewMode_cookie';\r\n private readonly BuyAlwaysAdd = true;\r\n\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n @computed get shouldShowAvailability(): boolean {\r\n return !this.props.config.disableAvailabilityCheckUnauthorized || this.props.context.request.user.isAuthenticated;\r\n }\r\n\r\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc }\r\n /* Removed until Microsoft improves this functionality */\r\n /* { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\r\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\r\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore } */\r\n ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize = 'lg';\r\n\r\n @observable\r\n private _viewMode: ProductListViewMode | undefined = undefined;\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n // private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n private isListPageStateUpdated: boolean = false;\r\n\r\n private _isMounted: boolean = false;\r\n\r\n private readonly attributeLocale: any;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation?.Text;\r\n }\r\n\r\n public constructor(props: IDlvrySearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\r\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n refiners: undefined,\r\n channelInventoryConfiguration: undefined,\r\n productInventoryStatus: undefined,\r\n validatedProductAccess: [],\r\n selectedProducts: {\r\n isAllSelected: false,\r\n isDisabled: false\r\n },\r\n productQuantities: {},\r\n working: false,\r\n retrievedActivePrices: false,\r\n showEmptySearchBarTooltip: false,\r\n simpleProducts: [],\r\n unitConversions: [],\r\n breakoffProducts: {}\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this._updateViewport();\r\n\r\n const savedViewMode = GetCookie(this.props.context.request.cookies, this._viewModeCookieName);\r\n if (savedViewMode) {\r\n this._viewMode = +savedViewMode;\r\n } else if (this.props.config.preferredViewMode) {\r\n this._viewMode = this.props.config.preferredViewMode === preferredViewMode.listView\r\n ? ProductListViewMode.listView\r\n : ProductListViewMode.cardView;\r\n } else {\r\n // Need to set here to trigger update\r\n this._viewMode = ProductListViewMode.listView;\r\n }\r\n\r\n this.attributeLocale = getLocale(this.props.context);\r\n }\r\n public async componentDidMount(): Promise {\r\n this._isMounted = true;\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n const products = await this.props.data.products;\r\n\r\n // @ts-expect-error -- window is not typed.\r\n if (window && !window.units) {\r\n // @ts-expect-error -- window is not typed.\r\n window.units = async (...productsId: any[]) => {\r\n const activeProducts = (await this.props.data.listPageState).activeProducts;\r\n const input = productsId.map(x => x ? x.toString() : undefined).filter(Boolean) as string[];\r\n const ids = activeProducts.filter(x => x.ItemId && input.includes(x.ItemId)).map(x => x.RecordId);\r\n\r\n if (!ids || ids.length === 0) {\r\n return;\r\n }\r\n\r\n const results = await getProductUnitOfMeasureOptionsAsync({ callerContext: this.props.context.actionContext }, ids);\r\n\r\n console.log('results', toJS(results));\r\n\r\n const conversions = [...new Set(results.map(x => x.ItemId))].map(x => {\r\n const defaultUOM = activeProducts.find(ap => ap.ItemId === x)?.DefaultUnitOfMeasure;\r\n const conversion = results.find(r =>\r\n r.ItemId === x\r\n && r.FromUnitOfMeasureSymbol === defaultUOM\r\n && (r.ToUnitOfMeasureSymbol === 'Kilogram' || r.ToUnitOfMeasureSymbol === 'Stykk' || r.ToUnitOfMeasureSymbol === 'Liter'));\r\n\r\n return {\r\n ItemId: x,\r\n DefaultUnitOfMeasure: defaultUOM,\r\n Conversion: conversion?.ToUnitOfMeasureSymbol,\r\n Value: conversion?.Factor,\r\n TextValue: conversion ? `${conversion?.Factor} ${conversion?.ToUnitOfMeasureSymbol}` : undefined\r\n };\r\n });\r\n\r\n return toJS(conversions);\r\n };\r\n }\r\n\r\n this._updateListPageState(listPageState, products);\r\n\r\n if (this.props.context.actionContext.requestContext?.user.isAuthenticated) {\r\n void this._getSimpleProducts();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n if (products.products.some(x => !x.PrefetchedPrice)) {\r\n void this._getActivePrice();\r\n } else {\r\n this.setState({ retrievedActivePrices: true });\r\n }\r\n }\r\n\r\n await this._updateVariantAvailability();\r\n\r\n void this._getUnitOfMeasureConversions();\r\n\r\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\r\n callerContext: this.props.context.actionContext\r\n });\r\n if (this._isMounted) {\r\n this.setState({ channelInventoryConfiguration });\r\n }\r\n\r\n let productInventoryStatus: IProductInventoryInformation[] | undefined;\r\n\r\n try {\r\n productInventoryStatus = await this._getAvailableQuantity();\r\n } catch {\r\n productInventoryStatus = this.props.data.listPageState.result?.activeProducts.map((p) => {\r\n return {\r\n IsProductAvailable: false,\r\n StockLevelCode: 'ERR',\r\n StockLevelLabel: this.props.resources.availabilityError,\r\n ProductAvailableQuantity: {\r\n ProductId: p.RecordId\r\n }\r\n };\r\n });\r\n }\r\n\r\n const validatedProductAccess = validateProductAccessArray(\r\n this.props.data.customerInformation.result?.Attributes,\r\n this.props.data.listPageState.result?.activeProducts);\r\n this.setState({ productInventoryStatus, validatedProductAccess });\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters?.length,\r\n listPageState.currentPageNumber,\r\n listPageState.searchText,\r\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\r\n ];\r\n },\r\n async () => {\r\n const newListPageState = await this.props.data.listPageState;\r\n const input = new GetFullProductsByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n (this.props.context.request.query?.productId || this.props.context.request.query?.recommendation)\r\n ? JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation,\r\n SearchText: listPageState.searchText\r\n })\r\n : listPageState.searchText,\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\r\n !!this.props?.config?.includeAttributes,\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId,\r\n channelInventoryConfiguration\r\n );\r\n\r\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\r\n newListPageState.totalProductCount = productResults?.count;\r\n newListPageState.activeProducts = productResults?.products;\r\n\r\n if (this.props.context.request.user.isAuthenticated) {\r\n void this._getSimpleProducts();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\r\n this._getActivePrice();\r\n }\r\n\r\n void this._getUnitOfMeasureConversions();\r\n\r\n await this._updateVariantAvailability();\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(\r\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n (this.props.context.request.query?.productId || this.props.context.request.query?.recommendation)\r\n ? JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation,\r\n SearchText: listPageState.searchText\r\n })\r\n : listPageState.searchText,\r\n false,\r\n this.props.config.updateRefinerPanel,\r\n undefined,\r\n this.catalogId,\r\n channelInventoryConfiguration\r\n );\r\n\r\n const refiners = await getRefinersForCollectionDataAction(refinerInput, this.props.context.actionContext);\r\n this.setState({ refiners });\r\n }\r\n }\r\n );\r\n\r\n reaction(\r\n () => {\r\n return [\r\n this.props.data.listPageState.result,\r\n this.props.data.listPageState.result?.activeProducts,\r\n this.props.data.listPageState.result?.activeProducts.length\r\n ];\r\n },\r\n async () => {\r\n let productInventoryStatus: IProductInventoryInformation[] | undefined;\r\n\r\n try {\r\n productInventoryStatus = await this._getAvailableQuantity();\r\n } catch {\r\n productInventoryStatus = this.props.data.listPageState.result?.activeProducts.map((p) => {\r\n return {\r\n IsProductAvailable: false,\r\n StockLevelCode: 'ERR',\r\n StockLevelLabel: this.props.resources.availabilityError,\r\n ProductAvailableQuantity: {\r\n ProductId: p.RecordId\r\n }\r\n };\r\n });\r\n }\r\n\r\n const validatedProductAccess = validateProductAccessArray(\r\n this.props.data.customerInformation.result?.Attributes,\r\n this.props.data.listPageState.result?.activeProducts);\r\n this.setState({ productInventoryStatus, validatedProductAccess });\r\n }\r\n );\r\n reaction(\r\n () => this._viewMode,\r\n () => {\r\n this.setState({ selectedProducts: { isAllSelected: false, isDisabled: false } });\r\n }\r\n );\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n this._isMounted = false;\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n config: { imageSettings, className },\r\n resources,\r\n data: { listPageState, products: productCollection, featureProduct }\r\n } = this.props;\r\n\r\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\r\n this._updateListPageState(listPageState.result, productCollection.result);\r\n this.isListPageStateUpdated = true;\r\n }\r\n\r\n //const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\r\n let errorText = '';\r\n // if (!ArrayExtensions.hasElements(products)) {\r\n if (listPageState.result && listPageState.result.activeProducts.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const viewModeProps = {\r\n viewMode: this._viewMode,\r\n cardButtonTxt: 'Varekort',\r\n listButtonTxt: 'Liste',\r\n className: 'ms-search-result-container__category-nav-section__view-modes',\r\n setCardViewMode: this.setCardViewMode,\r\n setListViewMode: this.setListViewMode\r\n };\r\n\r\n const searchResultContainerViewProps: Partial = {\r\n ...this.props,\r\n products: productsComponent,\r\n totalProductCount: this._getTotalProductCount(),\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy ? this._getCategoryHierarchy() : undefined,\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : undefined,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n searchBar: this._getSearchBar(),\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle:\r\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: searchProduct ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities,\r\n viewModesComponent: viewModeProps,\r\n selectedProductsActions: this._getSelectedProductsActions(),\r\n productInventoryStatus: this.state.productInventoryStatus,\r\n simpleProducts: this.state.simpleProducts,\r\n unitConversions: this.state.unitConversions\r\n };\r\n return this.props.renderView(searchResultContainerViewProps as any) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Get products variants dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _updateVariantAvailability = async (): Promise => {\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n if (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes\r\n ) {\r\n await this._getProductsDimensionsAvailabilities();\r\n }\r\n };\r\n\r\n public readonly setListViewMode = () => {\r\n this._viewMode = ProductListViewMode.listView;\r\n this._updateCurrentViewMode();\r\n };\r\n\r\n public readonly setCardViewMode = () => {\r\n this._viewMode = ProductListViewMode.cardView;\r\n this._updateCurrentViewMode();\r\n };\r\n\r\n private readonly _updateCurrentViewMode = () => {\r\n const cookieAge: number = 31536000000;\r\n const newCookieValue: string = String(this._viewMode);\r\n SetCookie(this.props.context.request.cookies, newCookieValue, this._viewModeCookieName, cookieAge);\r\n };\r\n\r\n /**\r\n * Update the list page state with initial data.\r\n * @param listPageState -- List page State.\r\n * @param products -- Products.\r\n */\r\n @action\r\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\r\n let querySorting: SortColumn[] = [];\r\n const defaultPageNumber: number = 10;\r\n\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n if (this.props.context.request.query?.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber =\r\n (this.props.context.request.query?.skip &&\r\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request) || [];\r\n listPageState.searchText = this.props.context.request.query?.q || '';\r\n if (this.props.context.request.query?.productId) {\r\n const featureProduct = this.props.data.featureProduct.result;\r\n if (featureProduct) {\r\n listPageState.featureProduct = featureProduct;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(\r\n productsList,\r\n this.props.context as ICoreContext,\r\n DimensionSwatchDisplayTypes.productCard\r\n ),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n };\r\n\r\n /**\r\n * Get the active price for the products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n // Hide prices when retrieving so we don't show base price\r\n this.setState({ retrievedActivePrices: false });\r\n\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n const missingPrices = productsList.filter((x) => !x.PrefetchedPrice);\r\n\r\n if (missingPrices.length > 0) {\r\n try {\r\n const prices = await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext },\r\n {\r\n CatalogId: this.catalogId,\r\n ChannelId: this.props.context.request.apiSettings.channelId\r\n },\r\n missingPrices.map((x) => x.RecordId),\r\n new Date(),\r\n null,\r\n undefined,\r\n true\r\n );\r\n const listPageState = await this.props.data.listPageState;\r\n\r\n prices.forEach((p) => {\r\n const indexOfProduct = listPageState.activeProducts.findIndex((x) => x.RecordId === p.ProductId);\r\n\r\n if (indexOfProduct !== -1) {\r\n listPageState.activeProducts[indexOfProduct].Price = p.CustomerContextualPrice || 0;\r\n listPageState.activeProducts[indexOfProduct].BasePrice = p.AdjustedPrice || 0;\r\n listPageState.activeProducts[indexOfProduct].Badge = getDiscountBadge(p);\r\n listPageState.activeProducts[indexOfProduct].ProductPrice = p;\r\n }\r\n });\r\n } catch (error) {\r\n missingPrices.forEach((product) => {\r\n product.PriceFailed = true;\r\n });\r\n console.error('Failed to retrieve active prices.', error);\r\n }\r\n }\r\n\r\n this.setState({ retrievedActivePrices: true });\r\n };\r\n\r\n private readonly _getSimpleProducts = async(): Promise => {\r\n const missing = this.props.data.listPageState.result?.activeProducts\r\n ?.filter(x => !this.state.simpleProducts.find(y => y.RecordId === x.RecordId));\r\n\r\n if (!missing) {\r\n return;\r\n }\r\n\r\n const simpleProducts = await getByIdsAsync(\r\n {callerContext:this.props.context.actionContext},\r\n this.props.context.request.apiSettings.channelId,\r\n missing?.map(x => x.RecordId)\r\n );\r\n\r\n const newSimpleProducts = [...this.state.simpleProducts ];\r\n\r\n simpleProducts.forEach(x => {\r\n if (!newSimpleProducts.find(y => y.RecordId === x.RecordId)) {\r\n newSimpleProducts.push(x);\r\n }\r\n });\r\n\r\n this.setState({ simpleProducts: newSimpleProducts });\r\n };\r\n\r\n private readonly _getUnitOfMeasureConversions = async (): Promise => {\r\n const { actionContext, request, app } = this.props.context;\r\n\r\n if (!request.user.isAuthenticated || app.config.unitOfMeasureConversions !== true) {\r\n return;\r\n }\r\n\r\n const activeProducts = (await this.props.data.listPageState).activeProducts;\r\n const ids = activeProducts.map(x => x.RecordId);\r\n\r\n if (!ids || ids.length === 0) {\r\n return;\r\n }\r\n\r\n const unitConversions = await getProductUnitOfMeasureOptionsAsync({ callerContext: actionContext }, ids);\r\n\r\n this.setState({ unitConversions });\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private readonly _getSelectedProductIds = (): number[] => {\r\n const { isDisabled, isAllSelected, ...selectedProducts } = this.state.selectedProducts || {};\r\n const selectedProductsIds = Object.entries(selectedProducts).map(([key, value]) => value ? Number(key) : 0).filter(x => x !== 0);\r\n\r\n return selectedProductsIds;\r\n };\r\n\r\n private readonly _getSelectedProductsActions = (): React.ReactNode => {\r\n const ids = this._getSelectedProductIds();\r\n\r\n if (ids.length === 0) {\r\n return null;\r\n }\r\n\r\n const { working } = this.state;\r\n const baseClassName = 'ms-search-result-container';\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n \r\n {this.props.resources.selectionActionsButtonText}\r\n \r\n
\r\n );\r\n };\r\n\r\n private readonly _onBuySelectedProducts = async (): Promise => {\r\n const { context, context: { actionContext, request } } = this.props;\r\n\r\n if (!context || !context.request.user.catalogId) {\r\n return;\r\n }\r\n\r\n this.setState({ working: true });\r\n\r\n const simpleInputs = this._getSelectedProductIds().map(id => {\r\n return new ProductInput(\r\n id,\r\n request.apiSettings,\r\n undefined, undefined,\r\n request,\r\n +request.user.catalogId!\r\n );\r\n });\r\n const simpleProducts = await getSimpleProducts(simpleInputs, actionContext);\r\n\r\n if (!simpleProducts || simpleProducts.length === 0) {\r\n this.setState({ working: false });\r\n return;\r\n }\r\n\r\n let cart = await getCartStateData(new GetCartStateDataInput(request.apiSettings, request), actionContext);\r\n\r\n if (!cart) {\r\n this.setState({ working: false });\r\n return;\r\n }\r\n\r\n while (cart.status === 'UPDATING') {\r\n console.log('Cart is updating, waiting for it to finish...');\r\n await new Promise((resolve) => setTimeout(resolve, 1000));\r\n cart = await getCartStateData(new GetCartStateDataInput(request.apiSettings, request), actionContext);\r\n\r\n if (!cart) {\r\n // Shouldn't happen, but just in case\r\n toast({\r\n header: 'Error',\r\n text: 'Cart is undefined. Please try again later.',\r\n autoClose: 30000,\r\n canClose: true,\r\n position: 'bottom-right',\r\n showProgress: true\r\n });\r\n this.setState({ working: false });\r\n return;\r\n }\r\n }\r\n\r\n // Divide products into groups of buy, update and remove\r\n const cartLineQuantities = Object.fromEntries(cart.cart.CartLines!.map(line => [line.ProductId, line.Quantity] ));\r\n const operations: {\r\n buy: { product: SimpleProduct, quantity: number }[],\r\n update: { product: SimpleProduct, quantity: number }[],\r\n remove: { product: SimpleProduct, quantity: number }[]\r\n } = {\r\n buy: [],\r\n update: [],\r\n remove: []\r\n };\r\n\r\n for (const product of simpleProducts) {\r\n const quantity = this.state.productQuantities[product.RecordId] ?? 1;\r\n const cartQuantity = cartLineQuantities[product.RecordId] ?? 0;\r\n\r\n if (this.BuyAlwaysAdd || cartQuantity === 0) {\r\n operations.buy.push({ product, quantity });\r\n } else if (quantity === 0) {\r\n operations.remove.push({ product, quantity });\r\n } else if (quantity === cartQuantity) {\r\n continue;\r\n } else {\r\n operations.update.push({ product, quantity });\r\n }\r\n }\r\n\r\n const { customerInformation, listPageState } = this.props.data;\r\n const result = validateProductAccessArray(\r\n customerInformation.result?.Attributes,\r\n operations.buy.concat(operations.update)\r\n .map(x => listPageState.result?.activeProducts.find(p => p.RecordId === x.product.RecordId)!)\r\n );\r\n\r\n // TODO: Remove this to re-enable license check\r\n result.forEach(x => x.HasAccess = true);\r\n\r\n // Check if any of the products require an alcohol license\r\n if (result.some(x => x.HasAccess === false)) {\r\n toasts.error(this.props.resources.toastErrorHeader, this.props.resources.selectionActionsMissingLicenseText);\r\n this.setState({ working: false });\r\n return;\r\n }\r\n\r\n const resetQuantitiesFor = new Set();\r\n const newProductQuantities = { ...this.state.productQuantities };\r\n const newSelectedProducts = { ...this.state.selectedProducts };\r\n\r\n const getErrorMessage = (result: ICartActionResult): string => {\r\n if (result.status === 'FAILED') {\r\n if (result.validationResults?.[0]?.LocalizedMessage) {\r\n return result.validationResults?.[0]?.LocalizedMessage;\r\n }\r\n\r\n if (typeof result.errorDetails?.LocalizedMessage === 'string') {\r\n return result.errorDetails?.LocalizedMessage;\r\n }\r\n\r\n if ((result.errorDetails?.LocalizedMessage as any)?.data?.ValidationResults?.[0]?.ErrorContext) {\r\n return (result.errorDetails?.LocalizedMessage as any)?.data?.ValidationResults?.[0]?.ErrorContext;\r\n }\r\n }\r\n\r\n return 'Unknown error adding items to cart';\r\n };\r\n const handleResult = (result: ICartActionResult, products: SimpleProduct[]): boolean => {\r\n if (result.status === 'SUCCESS') {\r\n newSelectedProducts.isAllSelected = false;\r\n products.forEach(x => {\r\n resetQuantitiesFor.add(x.RecordId);\r\n delete newProductQuantities[x.RecordId];\r\n delete newSelectedProducts[x.RecordId];\r\n });\r\n }\r\n\r\n if (result.status === 'FAILED') {\r\n const footer = (result.errorDetails?.LocalizedMessage as any)?.data?.CorrelationId;\r\n toasts.error(this.props.resources.toastErrorHeader, getErrorMessage(result), { footer });\r\n\r\n this.setState({\r\n resetSelectedQuantities: resetQuantitiesFor,\r\n working: false,\r\n productQuantities: newProductQuantities,\r\n selectedProducts: newSelectedProducts\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n if (operations.buy.length > 0) {\r\n const buyInput = operations.buy.map(({ product, quantity }) => ({\r\n product,\r\n count: quantity,\r\n customPrice: listPageState.result?.activeProducts.find(p => p.RecordId === product.RecordId)?.Price\r\n }));\r\n const result = await cart.addProductsToCart(buyInput);\r\n\r\n if (handleResult(result, operations.buy.map(x => x.product)) === false) {\r\n return;\r\n }\r\n }\r\n\r\n if (operations.update.length > 0) {\r\n const updateInput = operations.update.map(({ product, quantity }) => {\r\n const line = cart!.cart.CartLines!.find(x => x.ProductId === product.RecordId);\r\n line!.Quantity = quantity;\r\n return line!;\r\n });\r\n const result = await cart.updateCartLines({ updatedCartLinesObject: updateInput });\r\n\r\n if (handleResult(result, operations.update.map(x => x.product)) === false) {\r\n return;\r\n }\r\n }\r\n\r\n if (operations.remove.length > 0) {\r\n const cartLineIds = operations.remove.map(({ product }) => {\r\n const line = cart!.cart.CartLines!.find(x => x.ProductId === product.RecordId);\r\n return line!.LineId!;\r\n });\r\n\r\n const result = await cart.removeCartLines({ cartLineIds });\r\n\r\n if (handleResult(result, operations.remove.map(x => x.product)) === false) {\r\n return;\r\n }\r\n }\r\n\r\n await cart.refreshCart({});\r\n this.setState({\r\n resetSelectedQuantities: resetQuantitiesFor,\r\n working: false,\r\n productQuantities: newProductQuantities,\r\n selectedProducts: newSelectedProducts\r\n });\r\n };\r\n\r\n private readonly _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n /* if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name) ||\r\n this.props.context.request.query?.title ||\r\n '';\r\n } */\r\n\r\n if (context.request.query?.title) {\r\n collectionTitle = context.request.query.title;\r\n }\r\n\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount\r\n }\r\n };\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n };\r\n\r\n private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdownOptions = this._getAllSortByOptions();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\r\n }\r\n\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n // eslint-disable-next-line max-len -- existing code\r\n const skipCount = !ObjectExtensions.isNullOrUndefined(listPageState?.currentPageNumber)\r\n ? listPageState!.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\r\n const totalItems = listPageState?.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp='skip'\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n this.state.refiners && ArrayExtensions.hasElements(this.state.refiners)\r\n ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n // this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n // const expandedRefiners = this.expandrefinerCount;\r\n const subMenus =\r\n validRefiners &&\r\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\r\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\r\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\r\n yesText={this.props.resources.yes}\r\n noText={this.props.resources.no}\r\n transitRefinerRecordId={this.props.config.transitRefinerRecordId}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus\r\n };\r\n };\r\n\r\n /**\r\n * Should hide from refiners.\r\n * @param refiner - The refiner.\r\n * @returns ShouldHideFromRefiners.\r\n */\r\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\r\n const { channelInventoryConfiguration } = this.state;\r\n const refinerIds = [\r\n Number(this.props.context.app.config?.forsvaretAttributeRecordId),\r\n Number(this.props.config.alcoholRefinerRecordId),\r\n Number(this.props.config.tobaccoRefinerRecordId),\r\n Number(this.props.config.cocacolaRefinerRecordId),\r\n Number(this.props.config.bamaRefinerRecordId),\r\n Number(this.props.config.dutyFreeSugarRefinerRecordId),\r\n Number(this.props.config.norturaRefinerRecordId)\r\n ];\r\n\r\n const transitRefinerRecordId = this.props.config.transitRefinerRecordId;\r\n const customerTransit = transitRefinerRecordId\r\n ? this.props.data.orgInformation.result?.Attributes?.find(x => x.RecordId === Number(transitRefinerRecordId))\r\n : undefined;\r\n const customerTransitValue = Number(customerTransit?.AttributeValue?.StringValue);\r\n\r\n if (isNaN(customerTransitValue) || customerTransitValue === 0) {\r\n refinerIds.push(Number(transitRefinerRecordId));\r\n }\r\n\r\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\r\n return (\r\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId ||\r\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId ||\r\n refiner.RecordId && refinerIds.includes(refiner.RecordId) ||\r\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n (refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId ||\r\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId))\r\n );\r\n };\r\n\r\n private readonly _canSearchEmpty = (): Boolean => {\r\n // If we're on a recommendation page, we can search for empty string. Will show entire recommendation list\r\n if (this.props.context.request.query?.recommendation) {\r\n return true;\r\n }\r\n // If we're on a category page, we can search for empty string. Will show entire category\r\n if (this._pageType === 'Category') {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n private readonly _getSearchBar = (): React.ReactNode => {\r\n const {\r\n data: { listPageState },\r\n resources: { searchPlaceholderText }\r\n } = this.props;\r\n\r\n const onKeyDown = async (e: React.KeyboardEvent) => {\r\n this.setState({ showEmptySearchBarTooltip: false });\r\n\r\n if (e.key === 'Enter') {\r\n const value = (e.target as HTMLInputElement).value;\r\n\r\n if (!value && !this._canSearchEmpty()) {\r\n // Can't search for empty string\r\n this.setState({ showEmptySearchBarTooltip: true });\r\n return;\r\n }\r\n\r\n const newUrl = new URL(window.location.href);\r\n if (value) {\r\n newUrl.searchParams.set('q', value);\r\n } else {\r\n newUrl.searchParams.delete('q');\r\n }\r\n // Reset to first page everytime we do a search\r\n newUrl.searchParams.delete('skip');\r\n if (this.props.context.request.query?.skip) {\r\n delete this.props.context.request.query.skip;\r\n }\r\n window.history.pushState({ path: newUrl.href }, '', newUrl.href);\r\n\r\n transaction(() => {\r\n listPageState.result!.currentPageNumber = 0;\r\n listPageState.result!.searchText = value;\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <input\r\n className='msc-search-bar'\r\n placeholder={searchPlaceholderText}\r\n defaultValue={this.props.context.request.query?.q}\r\n onKeyDown={onKeyDown}\r\n onBlur={() => this.setState({ showEmptySearchBarTooltip: false })}\r\n />\r\n <Tooltip\r\n isOpen={this.state.showEmptySearchBarTooltip}\r\n target='.msc-search-bar'\r\n className='msc-search-bar-tooltip'\r\n >\r\n {this.props.resources.searchEmptySearchTermText}\r\n </Tooltip>\r\n </>\r\n );\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const { channelInventoryConfiguration } = this.state;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n closeAriaLabel={resources.closeAriaLabel}\r\n selectedChoices={selectedRefiners}\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\r\n refinerValues={refinerValueName}\r\n yesLabel={resources.yes}\r\n noLabel={resources.no}\r\n transitRefinerRecordId={this.props.config.transitRefinerRecordId}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getAvailableQuantity = async (): Promise<IProductInventoryInformation[] | undefined> => {\r\n const { context } = this.props;\r\n const products = (await this.props.data.listPageState).activeProducts;\r\n if (this.shouldShowAvailability === false) {\r\n return undefined;\r\n }\r\n\r\n if (!products || products.length === 0) {\r\n return undefined;\r\n }\r\n const productIds = products.map(p => p.RecordId);\r\n const shippingSearchCriteria = createInventoryAvailabilitySearchCriteria(\r\n context.actionContext,\r\n productIds,\r\n true,\r\n undefined,\r\n undefined,\r\n DeliveryMode.shipping\r\n );\r\n const shippingAvailability = await ProductsDataActions.getEstimatedAvailabilityAsync(\r\n { callerContext: context.actionContext },\r\n shippingSearchCriteria\r\n );\r\n\r\n if (shippingAvailability.ProductWarehouseInventoryAvailabilities) {\r\n const shippingInventory = mapAggregatedProductInventoryInformation(context.actionContext, shippingAvailability);\r\n if (ArrayExtensions.hasElements(shippingInventory)) {\r\n shippingInventory[0].deliveryType = DeliveryMode.shipping;\r\n return shippingInventory;\r\n } else {\r\n return undefined;\r\n }\r\n }else{\r\n return undefined;\r\n }\r\n };\r\n /**\r\n * Get Active products.\r\n * @returns - JSX Elements.\r\n */\r\n private readonly _getProducts = (): JSX.Element => {\r\n const {\r\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation },\r\n data\r\n } = this.props;\r\n // const { resources } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n const resources = {\r\n ...this.props.resources,\r\n productListItemText: productCountNumber ? `${this.props.resources.productListItemText} (${productCountNumber})` : this.props.resources.productListItemText,\r\n addToWishlistText: this.props.resources.addToWishlistButtonText,\r\n removeButtonText: this.props.resources.removeFromWishlistButtonText\r\n };\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\r\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\r\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n const quickviewSlot = this.props.slots?.quickview?.[0];\r\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\r\n ? this.props.slots.productComparisonButton[0]\r\n : null;\r\n\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n\r\n if (this._viewMode === ProductListViewMode.cardView) {\r\n const extendedProducts = products.map((product: ProductSearchResultExt) => {\r\n product.Brand = product.AttributeValues?.find(attribute => attribute.KeyName === this.attributeLocale.brand)?.TextValue;\r\n product.Manufacturer = product.AttributeValues?.find(attribute => attribute.KeyName === this.attributeLocale.manufacturer)?.TextValue;\r\n product.Transit = product.AttributeValues?.find(attribute => attribute.KeyName === this.attributeLocale.transit)?.TextValue === '1';\r\n product.TemperatureZone = getTemperatureZone(this.props.context.request.locale, product.AttributeValues);\r\n return product;\r\n });\r\n\r\n return (\r\n <ProductSearchResultItems\r\n cart={this.props.data.cart.result}\r\n products={extendedProducts}\r\n simpleProducts={this.state.simpleProducts}\r\n customerInformation={this.props.data.customerInformation.result}\r\n unitConversions={this.state.unitConversions}\r\n productInventoryStatus={this.state.productInventoryStatus|| undefined}\r\n wishlists={this.props.data.wishlists.result}\r\n context={this.props.context}\r\n config={this.props.config}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={shouldAllowBack}\r\n disableBuyButtons={!this.state.retrievedActivePrices}\r\n showPrices={this.props.data.products.result?.products.every(x => x.PrefetchedPrice) || this.state.retrievedActivePrices}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewSlot}\r\n productComparisonButton={productComparisonButton}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n validatedProductAccess={this.state.validatedProductAccess}\r\n productInventoryInformation={this.state.productInventoryStatus}\r\n />\r\n );\r\n }\r\n\r\n const productList = productSearchResults2ProductList(\r\n this.props.context,\r\n products,\r\n this.props.data.products.result?.channelInventoryConfigurationId,\r\n this.props.data.cart.result,\r\n this.state.productInventoryStatus || undefined\r\n );\r\n\r\n return (\r\n <ProductListComponent\r\n cart={this.props.data.cart.result}\r\n products={productList}\r\n simpleProducts={this.state.simpleProducts}\r\n customerInformation={this.props.data.customerInformation.result}\r\n unitConversions={this.state.unitConversions}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={shouldAllowBack}\r\n allowMultiSelect\r\n selectOnQuantityChange\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewSlot}\r\n productComparisonButton={productComparisonButton}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n validatedProductAccess={this.state.validatedProductAccess}\r\n actionsAvailable={{\r\n addToCartAction: true,\r\n addToWishlistAction: true,\r\n productComparisonButton:false\r\n }}\r\n disableBuyButtons={this.state.working || !this.state.retrievedActivePrices}\r\n showAvailability={this.shouldShowAvailability}\r\n showPrices={this.props.data.products.result?.products.every(x => x.PrefetchedPrice) || this.state.retrievedActivePrices}\r\n showCartCount\r\n buyAlwaysAdd\r\n wishlists={this.props.data.wishlists.result}\r\n resetSelectedQuantities={this.state.resetSelectedQuantities}\r\n breakoffProducts={this.state.breakoffProducts}\r\n onBreakoffChange={(product, enabled) => {\r\n if (!product.RecordId) {\r\n return;\r\n }\r\n const newBreakoffProducts = { ...this.state.breakoffProducts };\r\n newBreakoffProducts[product.RecordId] = enabled;\r\n this.setState({ breakoffProducts: newBreakoffProducts });\r\n }}\r\n onResetSelectedQuantities={() => this.setState({ resetSelectedQuantities: undefined })}\r\n onUpdateQuantity={(product, quantity) => {\r\n if (!product.RecordId) {\r\n return;\r\n }\r\n\r\n const productQuantities = { ...this.state.productQuantities };\r\n\r\n productQuantities[product.RecordId] = quantity;\r\n this.setState({\r\n productQuantities\r\n });\r\n }}\r\n onUpdateSelection={(products) => {\r\n this.setState({ selectedProducts: products });\r\n }}\r\n onBuyValidate={(product) => onBuyHasAccessValidator(\r\n this.props.context,\r\n this.props.data.customerInformation.result,\r\n this.props.data.listPageState.result?.activeProducts.find(p => p.RecordId === product.RecordId) as ProductSearchResultExt,\r\n this.props.resources.toastNoAccessToProduct\r\n )}\r\n selectedProducts={this.state.selectedProducts}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getTotalProductCount = (): React.ReactNode => {\r\n const {\r\n data: { listPageState, products }\r\n } = this.props;\r\n\r\n let totalProductCount: number | undefined;\r\n if (listPageState && listPageState.result && listPageState.result.totalProductCount !== undefined) {\r\n totalProductCount = listPageState.result.totalProductCount;\r\n } else if (products && products.result) {\r\n totalProductCount = products.result.count;\r\n }\r\n\r\n if (!totalProductCount) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className={`ms-search-result-container__total-product-count`}>\r\n {format(this.props.resources.numberOfSearchResults, totalProductCount)}\r\n </div>\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n // eslint-disable-next-line max-len -- existing code\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n });\r\n };\r\n\r\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n /**\r\n * Retrieves current sort criteria.\r\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\r\n */\r\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\r\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\r\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\r\n return sortCriteria!.Columns[0];\r\n }\r\n\r\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\r\n if (ArrayExtensions.hasElements(queryColumns)) {\r\n return queryColumns[0];\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Retrieves dropdown options.\r\n * @returns All dropdown options.\r\n */\r\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!searchConfiguration) {\r\n return [];\r\n }\r\n\r\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\r\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\r\n );\r\n\r\n return ArrayExtensions.validValues(mappedSearchConfiguration);\r\n };\r\n\r\n /**\r\n * Retrieves current selected dropdown option based on the sort criteria.\r\n * @returns Current dropdown option.\r\n */\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const activeSortColumn = this._getSortCriteriaColumn();\r\n\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!activeSortColumn || !searchConfiguration) {\r\n return undefined;\r\n }\r\n\r\n const activeMappedConfig = searchConfiguration.find(\r\n mappedSearchConfig =>\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n if (!activeMappedConfig) {\r\n return undefined;\r\n }\r\n\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: \r\n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result?.activeFilters || []\r\n );\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n };\r\n\r\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // Set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n if (MsDyn365.isBrowser) {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n }\r\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n // private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n // switch (refinerCount) {\r\n // case expandRefinersCount.all:\r\n // this.expandrefinerCount = validRefiners;\r\n // break;\r\n // case expandRefinersCount.one:\r\n // this.expandrefinerCount = 1;\r\n // break;\r\n // case expandRefinersCount.two:\r\n // this.expandrefinerCount = 2;\r\n // break;\r\n // case expandRefinersCount.three:\r\n // this.expandrefinerCount = 3;\r\n // break;\r\n // case expandRefinersCount.four:\r\n // this.expandrefinerCount = 4;\r\n // break;\r\n // default:\r\n // this.expandrefinerCount = 0;\r\n // }\r\n // };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{paginationPreviousText}</span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{paginationNextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n );\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { ProductList, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n OrderTemplate,\r\n QueryResultSettingsProxy,\r\n GetOrderTemplatesInput,\r\n getOrderTemplates\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './dlvry-search-result-container';\r\nimport { ISearchResultModalViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport {getTelemetryObject, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useEffect } from 'react';\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n IDlvrySearchResultContainerProps\r\n} from './dlvry-search-result-container.props.autogenerated';\r\nimport {\r\n IProductListViewModeProps,\r\n ProductListViewMode,\r\n ProductListViewModeComponent\r\n} from '../../components/product-list-component/components/product-list-view-mode';\r\nimport { ProductComponent } from '../../themes/dlvry-adventureworks/views/components/product.component';\r\nimport PQueue from 'p-queue';\r\nimport { IProductInventoryInformation } from '../../components/common/product-inventory-utils';\r\nimport { onBuyHasAccessValidator } from '../../shared-utils/attributes/on-buy-access-validator';\r\n\r\n/**\r\n * DescriptionInterval.\r\n */\r\nenum DescriptionInterval {\r\n productDescriptionInterval = 14,\r\n productDescriptionIntervalRemainder0 = 0,\r\n productDescriptionIntervalRemainder9 = 9\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param refinerHeading\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCards = (props: ISearchResultContainerViewProps & IDlvrySearchResultContainerProps<{}>, refinerHeading: any): JSX.Element | null => {\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {refinerHeading}\r\n {props.totalProductCount}\r\n {props.products}\r\n {props.errorMessage}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param product - The product item data.\r\n * @param index - The index of each product item.\r\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCardsDescription = (\r\n props: ISearchResultContainerViewProps & IDlvrySearchResultContainerProps<{}>,\r\n cartQueue: PQueue,\r\n product: ProductSearchResult,\r\n index: number,\r\n retrieveOrderTemplates: () => Promise<OrderTemplate[]>,\r\n onUpdateOrderTemplates: (orderTemplate?: ProductList | undefined) => Promise<OrderTemplate[]>,\r\n productInventoryStatus: IProductInventoryInformation[] | undefined,\r\n isEnabledProductDescription?: boolean\r\n): JSX.Element | null => {\r\n const { config, context, resources, productsDimensionAvailabilities } = props;\r\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n const breadCrumbType = props.context.app.config.breadcrumbType;\r\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n const classname = isEnabledProductDescription\r\n ? 'ms-product-search-result__item product__description'\r\n : 'ms-product-search-result__item';\r\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\r\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\r\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n\r\n const productComparisonButton = ArrayExtensions.hasElements(props.slots.productComparisonButton)\r\n ? props.slots.productComparisonButton[0]\r\n : null;\r\n\r\n return (\r\n <li className={classname} key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={isAllowBack}\r\n id={props.id}\r\n key={product.RecordId}\r\n typeName={props.typeName}\r\n data={{\r\n cart: props.data.cart.result,\r\n product,\r\n simpleProduct: props.simpleProducts.find(x => x.RecordId === product.RecordId),\r\n customerInformation: props.data.customerInformation.result,\r\n unitConversions: props.unitConversions?.filter(x => x.ProductRecordId === product.RecordId)\r\n }}\r\n cartQueue={cartQueue}\r\n buyAlwaysAdd\r\n retrieveOrderTemplates={retrieveOrderTemplates}\r\n onUpdateOrderTemplates={onUpdateOrderTemplates}\r\n quickViewButton={quickviewslot}\r\n productComparisonButton={productComparisonButton}\r\n isEnabledProductDescription={isEnabledProductDescription}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n inventoryStatus={productInventoryStatus?.find(x => x.ProductAvailableQuantity.ProductId === product.RecordId)}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n priceResources={priceResources}\r\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\r\n addToCartText={resources.addToCartText}\r\n updateCartText={resources.updateCartText}\r\n removeFromCartText={resources.removeFromCartText}\r\n outOfStockText={resources.outOfStockText}\r\n priceErrorText={resources.priceErrorText}\r\n toastStrings={{\r\n errorHeader: resources.toastErrorHeader,\r\n productsAddedToCart: resources.productsAddedToCart,\r\n productsRemovedFromCart: resources.productsRemovedFromCart,\r\n productsUpdatedInCart: resources.productsUpdatedInCart,\r\n goToCart: resources.toastGoToCart,\r\n noAccessToProduct: resources.toastNoAccessToProduct\r\n }}\r\n inCartTooltipText={resources.inCartTooltipText}\r\n transitTooltip={resources.transitTooltip}\r\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\r\n (dimensionAvailability: IProductsDimensionsAvailabilities[]) =>\r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n )}\r\n addToOrderTemplateResources={{\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText,\r\n createOrderTemplateHeader: resources.createOrderTemplateHeader,\r\n orderTemplateTitle: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n createOrderTemplateDescription: resources.createOrderTemplateDescription,\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n createOrderTemplateButtonText: resources.createOrderTemplateButtonText,\r\n cancelNewOrderTemplateCreationButtonText: resources.cancelNewOrderTemplateCreationButtonText,\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n priceFree: resources.priceFree,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText,\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip\r\n }}\r\n onBuyValidate={(product) => onBuyHasAccessValidator(\r\n props.context,\r\n props.data.customerInformation.result,\r\n product,\r\n props.resources.toastNoAccessToProduct\r\n )}\r\n />\r\n </li>\r\n );\r\n};\r\nconst refinerHeadingRender = (props: ISearchResultContainerViewProps & IDlvrySearchResultContainerProps<{}>, wrapperRefiner: React.MutableRefObject<null>) => {\r\n const { choiceSummary, isMobile, viewModesComponent, sortByOptions } = props;\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n\r\n return (\r\n <Node ref={wrapperRefiner} className='ms-refiner-heading'>\r\n <Node className='ms-refiner-heading_title'>\r\n <div className='ms-search-result-wrapper-search'>\r\n {props.searchBar}\r\n </div>\r\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\r\n <div className='ms-search-result-wrapper-sort-by-category'>\r\n {!isMobile && sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n <div className='ms-search-result-wrapper-view-mode'>\r\n {renderViewModes(viewModesComponent)}\r\n </div>\r\n </Node>\r\n\r\n {/*<Node className='ms-refine__footer'>*/}\r\n {/* {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}*/}\r\n {/*</Node>*/}\r\n </Node>\r\n );\r\n};\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param refinerHeading\r\n * @returns The JSX Element.\r\n */\r\nconst renderProducts = (\r\n props: ISearchResultContainerViewProps & IDlvrySearchResultContainerProps<{}>,\r\n cartQueue: PQueue,\r\n refinerHeading: any,\r\n retrieveOrderTemplates: () => Promise<OrderTemplate[]>,\r\n onUpdateOrderTemplates: (orderTemplate?: ProductList | undefined) => Promise<OrderTemplate[]>,\r\n productInventoryStatus: IProductInventoryInformation[] | undefined\r\n): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n\r\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\r\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\r\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\r\n\r\n if (props.viewModesComponent.viewMode === undefined) {\r\n // Not ready yet\r\n return null;\r\n }\r\n\r\n if (props.viewModesComponent.viewMode === ProductListViewMode.listView) {\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {refinerHeading}\r\n {props.errorMessage}\r\n {props.totalProductCount}\r\n {props.products}\r\n </Node>\r\n );\r\n }\r\n\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {refinerHeading}\r\n {props.errorMessage}\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) =>\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\r\n ? renderProductCardsDescription(props, cartQueue, product, index, retrieveOrderTemplates, onUpdateOrderTemplates, productInventoryStatus, true)\r\n : renderProductCardsDescription(props, cartQueue, product, index, retrieveOrderTemplates, onUpdateOrderTemplates, productInventoryStatus, false)\r\n )}\r\n </ul>\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Title Count.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\n// const renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n// const { title, TitleContainer } = props;\r\n// if (title) {\r\n// return <Node {...TitleContainer}>{title.titleCount}</Node>;\r\n// }\r\n// return null;\r\n// };\r\n\r\n/**\r\n * Render Category Hierarchy.\r\n * @param props - The category hierarchy view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * Function to make filter sticky.\r\n * @param isMobile - The boolean prop.\r\n * @param isStickyHeader - The boolean prop.\r\n */\r\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\r\n // Get heights of cookie and promotion banners\r\n const defaultValue = 0;\r\n const defaultOffset = 28;\r\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\r\n\r\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\r\n const containerHeight: number = headerHeight ?? defaultOffset;\r\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\r\n const headerElement = document.querySelector('header .lock-opaque');\r\n const defaultContainer = document.querySelector('header .default-container');\r\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\r\n if (refinerElement && headerElement && defaultContainer) {\r\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\r\n refinerElement.classList.add('lock-Filter');\r\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\r\n } else {\r\n refinerElement.classList.remove('lock-Filter');\r\n }\r\n } else if (refinerElement) {\r\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\r\n refinerElement.classList.add('lock-top');\r\n } else {\r\n refinerElement.classList.remove('lock-top');\r\n refinerElement.classList.remove('lock-Filter');\r\n refinerElement.removeAttribute('style');\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Function to setup filter sticky.\r\n * @param isMobile - The boolean prop.\r\n * @param isStickyHeader - The boolean prop.\r\n */\r\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\r\n window.addEventListener('scroll', () => {\r\n configureStickyFilter(isMobile, isStickyHeader);\r\n });\r\n configureStickyFilter(isMobile, isStickyHeader);\r\n}\r\n\r\n/**\r\n * Function to make filter sticky.\r\n * @param refinerRefernce - Ref prop for filter.\r\n * @param toggle - Toggle function for filter menu.\r\n */\r\n// function useOutsideClick(refinerRefernce: React.RefObject<HTMLElement>, toggle: (event: Event) => void) {\r\n// React.useEffect(() => {\r\n// /**\r\n// * Function to make filter sticky.\r\n// * @param event - Event prop for filter.\r\n// */\r\n// function handleClickOutside(event: Event) {\r\n// const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\r\n// if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\r\n// toggle(event);\r\n// }\r\n// }\r\n// if (MsDyn365.isBrowser) {\r\n// document.addEventListener('click', handleClickOutside);\r\n// }\r\n// return () => {\r\n// if (MsDyn365.isBrowser) {\r\n// document.removeEventListener('click', handleClickOutside);\r\n// }\r\n// };\r\n// }, [refinerRefernce, toggle]);\r\n// }\r\n\r\n/**\r\n * Render the category page items.\r\n * @param props - The view props.\r\n * @returns The search Result container module view.\r\n */\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & IDlvrySearchResultContainerProps<{}>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductSectionContainer,\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 FeatureSearchContainer,\r\n similarLookProduct,\r\n productInventoryStatus\r\n } = props;\r\n useEffect(() => {\r\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\r\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\r\n }\r\n }, [props]);\r\n // const [isExpanded, setIsExpanded] = useState<boolean>(true);\r\n // const toggle = () => {\r\n // setIsExpanded(isExpanded);\r\n // };\r\n const wrapperRefiner = React.useRef(null);\r\n // useOutsideClick(wrapperRefiner, toggle);\r\n const refinerHeading = refinerHeadingRender(props,wrapperRefiner);\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n\r\n const [orderTemplates, setOrderTemplates] = React.useState<OrderTemplate[] | undefined>(undefined);\r\n\r\n const cartQueue = React.useMemo(() => new PQueue({ concurrency: 1 }), []);\r\n\r\n const updateOrderTemplatesAsync = async (newOrderTemplate?: ProductList) => {\r\n let newOrderTemplates;\r\n\r\n if (newOrderTemplate) {\r\n newOrderTemplates = [...(orderTemplates ? orderTemplates : [])];\r\n\r\n // Add new order template if it doesn't exist\r\n if (newOrderTemplates.every(x => x.productList.Id !== newOrderTemplate.Id)) {\r\n newOrderTemplates.splice(0, 0, new OrderTemplate(newOrderTemplate, [], 0));\r\n }\r\n } else {\r\n // Refresh order templates incase new order template was created\r\n const queryResultSettings = QueryResultSettingsProxy.fromInputData({\r\n requestContext: props.context.request,\r\n config: props.config\r\n }).QueryResultSettings;\r\n const input = new GetOrderTemplatesInput('', queryResultSettings);\r\n newOrderTemplates = (await getOrderTemplates(input, props.context.actionContext)).map(x => new OrderTemplate(x, [], 0));\r\n }\r\n\r\n setOrderTemplates(newOrderTemplates);\r\n return newOrderTemplates;\r\n };\r\n\r\n const retrieveOrderTemplates = async () => {\r\n return orderTemplates ? orderTemplates : updateOrderTemplatesAsync();\r\n };\r\n\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {similarLookProduct ? null : (\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {/*{TitleViewProps && renderTitle(TitleViewProps)}*/}\r\n {/*{TitleViewProps && renderTitleCount(TitleViewProps)}*/}\r\n </Node>\r\n )}\r\n {isMobile && <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>}\r\n {isMobile && createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n <Node {...ProductSectionContainer}>\r\n {!isMobile && refineMenu && renderRefiner(refineMenu)}\r\n {props.config.enableProdutDescription\r\n ? renderProducts(props, cartQueue, refinerHeading, retrieveOrderTemplates, updateOrderTemplatesAsync, productInventoryStatus)\r\n : renderProductCards(props,refinerHeading)}\r\n {pagination}\r\n </Node>\r\n </Node>\r\n {props.selectedProductsActions}\r\n </Module>\r\n );\r\n\r\n // if (isMobile) {\r\n // return (\r\n // <Module {...SearchResultContainer}>\r\n // {similarLookProduct ? null : (\r\n // <Node {...CategoryNavContainer}>\r\n // {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n // {/*{renderTitle(TitleViewProps)}*/}\r\n // {/*{renderTitleCount(TitleViewProps)}*/}\r\n // </Node>\r\n // )}\r\n // {choiceSummary}\r\n // <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\r\n // {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n // <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n // <Node {...RefineAndProductSectionContainer}>\r\n // <Node {...ProductSectionContainer}>\r\n // {props.config.enableProdutDescription ? renderProducts(props, refinerHeading) : renderProductCards(props, refinerHeading)}\r\n // {pagination}\r\n // </Node>\r\n // </Node>\r\n // {props.selectedProductsActions}\r\n // </Module>\r\n // );\r\n // }\r\n // return (\r\n // <Module {...SearchResultContainer}>\r\n // {similarLookProduct ? null : (\r\n // <Node {...CategoryNavContainer}>\r\n // {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n // {/*{TitleViewProps && renderTitle(TitleViewProps)}*/}\r\n // {/*{TitleViewProps && renderTitleCount(TitleViewProps)}*/}\r\n // </Node>\r\n // )}\r\n // <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n // <Node {...RefineAndProductSectionContainer}>\r\n // <Node {...ProductSectionContainer}>\r\n // {refineMenu && renderRefiner(refineMenu)}\r\n // {props.config.enableProdutDescription ? renderProducts(props, refinerHeading) : renderProductCards(props, refinerHeading)}\r\n // {pagination}\r\n // </Node>\r\n // </Node>\r\n // {props.selectedProductsActions}\r\n // </Module>\r\n // );\r\n};\r\n\r\nconst renderViewModes = (props: IProductListViewModeProps): JSX.Element => {\r\n return (\r\n <ProductListViewModeComponent {...props} />\r\n );\r\n};\r\n\r\n/**\r\n * Render Search result Modal.\r\n * @param modalProps - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\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\n/**\r\n * Render Refiner Mobile.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Search result Body.\r\n * @param props - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\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), renderRefinerMobile(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners?.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Refiner Footer.\r\n * @param props - The Refine Menu view props.\r\n * @param handler - The Refine menu toggle function.\r\n * @param resources - Resources to get the done text and aria label.\r\n * @returns The JSX Element.\r\n */\r\n// const renderRefinerFooter = (\r\n// props: IRefineMenuViewProps,\r\n// handler: MouseEventHandler,\r\n// resources: IDlvrySearchResultContainerResources\r\n// ): JSX.Element | null => {\r\n// const { refiners } = props;\r\n// if (refiners) {\r\n// return (\r\n// <Node className='ms-refine__footer__done'>\r\n// <Node tag='button' className='ms-refine-filter-done' aria-label={resources.doneAriaLabel} tabIndex={0} onClick={handler}>\r\n// {resources.doneText}\r\n// </Node>\r\n// </Node>\r\n// );\r\n// }\r\n// return null;\r\n// };\r\n\r\n/**\r\n * Render sort by drop down.\r\n * @param props - The sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\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 <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Title.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <Node tag='h1' className=''>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductRefinerValue, SimpleProduct, SortingInfo } from '@msdyn365-commerce/retail-proxy';\r\nimport { observable } from 'mobx';\r\n\r\nimport { listPageType } from './actions';\r\nimport { ProductSearchResultExt } from './components';\r\n\r\n/**\r\n * ListPageState class.\r\n */\r\nexport class ListPageState {\r\n @observable public activeFilters: ProductRefinerValue[] | null = null;\r\n\r\n @observable public activeProducts: ProductSearchResultExt[] = [];\r\n\r\n @observable public sortingCritera: SortingInfo | null = null;\r\n\r\n @observable public currentPageNumber: number | null = null;\r\n\r\n @observable public refiners: IProductRefinerHierarchy[] | null = null;\r\n\r\n @observable public totalProductCount: number | undefined;\r\n\r\n @observable public pageSize: number = 10;\r\n\r\n @observable public pageType: listPageType = 'Unknown';\r\n\r\n @observable public searchText: string | undefined = '';\r\n\r\n @observable public featureProduct: SimpleProduct | null = null;\r\n\r\n @observable public productPrices: ProductPrice[] | undefined = [];\r\n}\r\n\r\n/**\r\n * ListPageStateInput - action input.\r\n */\r\nexport class ListPageStateInput implements IActionInput {\r\n public getCacheKey = () => 'ListPageState';\r\n\r\n public getCacheObjectType = () => 'ListPageState';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\nexport async function listPageStateAction(input: ListPageStateInput, ctx: IActionContext): Promise<ListPageState> {\r\n return new ListPageState();\r\n}\r\n\r\n/**\r\n * Create new input for create action.\r\n * @param inputData\r\n */\r\nexport const createListPageInput = (inputData: ICreateActionContext<IGeneric<IAny>>): IActionInput => {\r\n return new ListPageStateInput();\r\n};\r\n\r\n/**\r\n * ListPageState - create action.\r\n */\r\nexport default createObservableDataAction<ListPageState>({\r\n action: <IAction<ListPageState>>listPageStateAction,\r\n input: createListPageInput\r\n});\r\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['dlvry-search-result-container'] = {\n c: () => require('partner/modules/dlvry-search-result-container/dlvry-search-result-container.tsx'),\n $type: 'containerModule',\n da: [{name:'cart', path:'@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action', runOn: 0},{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:'customerInformation', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer', 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:'modules/dlvry-search-result-container/list-page-state', runOn: 0},{name:'orgInformation', path:'actions/get-organization-customer', runOn: 0},{name:'products', path:'modules/dlvry-search-result-container/actions/get-full-products-by-collection', runOn: 0},{name:'refiners', path:'modules/dlvry-search-result-container/actions/get-refiners-for-collection', runOn: 0},{name:'searchConfiguration', path:'modules/dlvry-search-result-container/actions/get-mapped-search-configuration', runOn: 0},{name:'wishlists', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id', runOn: 1}],\n \n iNM: false,\n ns: '__local__',\n n: 'dlvry-search-result-container',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/dlvry-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-customer';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer');\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/retail-actions/dist/lib/get-wishlist-by-customer-id';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action';\n let dataAction = require('@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'actions/get-organization-customer';\n let dataAction = require('partner/actions/get-organization-customer');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dlvry-search-result-container/actions/get-full-products-by-collection';\n let dataAction = require('partner/modules/dlvry-search-result-container/actions/get-full-products-by-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dlvry-search-result-container/actions/get-mapped-search-configuration';\n let dataAction = require('partner/modules/dlvry-search-result-container/actions/get-mapped-search-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dlvry-search-result-container/actions/get-refiners-for-collection';\n let dataAction = require('partner/modules/dlvry-search-result-container/actions/get-refiners-for-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dlvry-search-result-container/list-page-state';\n let dataAction = require('partner/modules/dlvry-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__|modules|dlvry-search-result-container|dlvry-search-result-container'] = {\n c: () => require('partner/modules/dlvry-search-result-container/dlvry-search-result-container.view.tsx'),\n cn: '__local__-__local__-dlvry-search-result-container'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["DeliveryMode","InventoryLevels","InventoryLevelValues","displayLabelEnabled","context","inventoryCode","requestContext","app","config","inventoryRanges","available","outOfStock","mapProductInventoryInformation","productsWarehouseInventory","productInventoryInformation","undefined","enableStockCheck","length","product","inventoryLevel","physicalAvailable","physicalProductMap","mapInventoryWithPhysicalBufferEnabled","push","totalAvailable","totalAvailableProductMap","mapInventoryWithTotalAvailableBufferEnabled","productMap","mapInventoryWithThresholdEnabled","productWarehouseInventoryAvailability","ProductId","TotalAvailable","productQty","outOfStockThreshold","productAvailableQuantity","AvailableQuantity","ProductAvailableQuantity","IsProductAvailable","InventLocationId","shouldRenderLabel","PhysicalAvailableInventoryLevelCode","productQuantity","_productWarehouseInve","MaximumPurchasablePhysicalAvailableQuantity","PhysicalAvailable","StockLevelCode","StockLevelLabel","PhysicalAvailableInventoryLevelLabel","TotalAvailableInventoryLevelCode","_productWarehouseInve2","MaximumPurchasableTotalAvailableQuantity","TotalAvailableInventoryLevelLabel","isAggregatedInventory","warehouseAggregation","mapAggregatedProductInventoryInformation","productWarehouseInventoryInformation","_productWarehouseInve3","AggregatedProductInventoryAvailabilities","map","_product$MaximumPurch","_product$MaximumPurch2","DataAreaId","PhysicalAvailableQuantity","TotalAvailableQuantity","ProductWarehouseInventoryAvailabilities","createInventoryAvailabilitySearchCriteria","productIds","isDefaultWareHouse","isFilterByChannelFulfillmentGroup","searchArea","defaultDeliveryMode","deliveryMode","shipping","inventoryAvailabilitySearchCriteria","ProductIds","QuantityUnitTypeValue","SearchArea","FilterByChannelFulfillmentGroup","DeliveryModeTypeFilterValue","DefaultWarehouseOnly","ProductListViewMode","ProductListViewModeComponent","props","React","className","Button","classname","viewMode","cardView","title","cardButtonTxt","role","onClick","setCardViewMode","listView","listButtonTxt","setListViewMode","expandRefinersCount","preferredViewMode","AlcoholAttributeName","BamaAttributeName","CocaColaAttributeName","TobaccoAttributeName","TransitAttributeName","validateProductAccessArray","customerAttributes","products","_customerAttributes$f6","_customerAttributes$f7","_customerAttributes$f8","_customerAttributes$f9","_customerAttributes$f10","results","custAlcohol","Number","find","attr","Name","TextValue","custBama","custCocaCola","custTobacco","custTransit","_productAttributes$fi6","_productAttributes$fi7","_productAttributes$fi8","_productAttributes$fi9","_productAttributes$fi10","productAttributes","AttributeValues","every","Boolean","RecordId","HasAccess","SearchResultContainer","constructor","state","_props$context$reques","super","_viewModeCookieName","BuyAlwaysAdd","sortByDropdownOptions","key","sortOptions","sortByOptionRelevanceDesc","value","this","resources","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","_pageType","request","urlTokens","pageType","_viewport","_viewMode","defaultPageNumber","catalogId","getCatalogId","isListPageStateUpdated","_isMounted","_updateVariantAvailability","async","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","ArrayExtensions","hasElements","includes","DimensionTypes","none","includeAttributes","_getProductsDimensionsAvailabilities","_updateCurrentViewMode","newCookieValue","String","SetCookie","cookies","_updateListPageState","listPageState","_this$props$context$r","_this$props$context$r2","_this$props$config$it","_this$props$config$it2","_this$props$context$r3","_this$props$context$r4","querySorting","query","sorting","JSON","parse","decodeURIComponent","currentPageNumber","skip","itemsPerPage","sortingCritera","Columns","pageSize","activeProducts","totalProductCount","count","activeFilters","hydrateRefinersFromUrl","searchText","q","productId","featureProduct","data","result","_this$props$data$list","_this$props$data$list2","productsList","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","actionContext","setState","_getActivePrice","_this$props$data$list3","_this$props$data$list4","retrievedActivePrices","missingPrices","filter","x","PrefetchedPrice","prices","getActivePricesAsync","callerContext","CatalogId","ChannelId","apiSettings","channelId","Date","forEach","p","indexOfProduct","findIndex","Price","CustomerContextualPrice","BasePrice","AdjustedPrice","Badge","getDiscountBadge","ProductPrice","error","PriceFailed","console","_getSimpleProducts","_this$props$data$list5","missing","simpleProducts","y","getByIdsAsync","newSimpleProducts","_getUnitOfMeasureConversions","user","isAuthenticated","unitOfMeasureConversions","ids","unitConversions","getProductUnitOfMeasureOptionsAsync","_getSearchResultModal","SearchResultModal","modalCloseButtonText","modalTitle","isOpen","modalIsOpen","returnRef","_modalToggleRef","onModalToggle","_toggleModal","_getSelectedProductIds","_ref","selectedProducts","isDisabled","isAllSelected","_objectWithoutProperties","_excluded","Object","entries","_ref2","_getSelectedProductsActions","working","baseClassName","dangerouslySetInnerHTML","__html","selectionActionsText","replace","toString","classnames","_onBuySelectedProducts","disabled","selectionActionsButtonText","_customerInformation$","simpleInputs","id","ProductInput","getSimpleProducts","cart","getCartStateData","GetCartStateDataInput","status","log","Promise","resolve","setTimeout","toast","header","text","autoClose","canClose","position","showProgress","cartLineQuantities","fromEntries","CartLines","line","Quantity","operations","buy","update","remove","_this$state$productQu","_cartLineQuantities$p","quantity","productQuantities","cartQuantity","customerInformation","Attributes","concat","_listPageState$result","some","toasts","toastErrorHeader","selectionActionsMissingLicenseText","resetQuantitiesFor","Set","newProductQuantities","_objectSpread","newSelectedProducts","handleResult","add","_result$errorDetails5","footer","errorDetails","LocalizedMessage","CorrelationId","_result$validationRes","_result$errorDetails","_result$errorDetails3","_result$validationRes2","_result$errorDetails2","_result$errorDetails4","validationResults","ValidationResults","ErrorContext","getErrorMessage","resetSelectedQuantities","buyInput","_ref3","_listPageState$result2","customPrice","addProductsToCart","updateInput","_ref4","updateCartLines","updatedCartLinesObject","cartLineIds","_ref5","LineId","removeCartLines","refreshCart","_getCollectionTitle","_context$request$quer","collectionTitle","productCountNumber","productCountText","format","numberOfProducts","oneProduct","TitleContainer","telemetryPageName","toLowerCase","titlePrefix","Title","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","index","Link","ariaLabel","categoryLinkAriaLabel","href","Url","categoryHierarchySeparator","Separator","separator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","hideRating","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","ref","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","skipCount","ObjectExtensions","isNullOrUndefined","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","items","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","telemetryContent","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","refiners","refiner","Values","_shouldHideFromRefiners","activeRefiners","RefineMenuContainer","RefinerSectionContainer","productRefinerHierarchy","RefineSubmenu","selectedRefinerValues","refineItemCommonProps","_refineItemCommonProps","minValueSliderThumbAriaLabel","maxValueSliderThumbAriaLabel","onUpdateRefiners","_onUpdateRefiners","urlBuilder","_buildRefinerUrl","isExpandedOnInitialLoad","moduleId","moduleTypeName","typeName","productCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","singleProductCountAriaLabel","isMobile","yesText","yes","noText","no","transitRefinerRecordId","_this$props$context$a","_this$props$data$orgI","_customerTransit$Attr","_this$props$data$prod","_this$props$data$prod2","channelInventoryConfiguration","refinerIds","forsvaretAttributeRecordId","alcoholRefinerRecordId","tobaccoRefinerRecordId","cocacolaRefinerRecordId","bamaRefinerRecordId","dutyFreeSugarRefinerRecordId","norturaRefinerRecordId","customerTransit","orgInformation","customerTransitValue","AttributeValue","StringValue","isNaN","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","channelInventoryConfigurationId","InventoryProductAttributeRecordId","_canSearchEmpty","_this$props$context$r5","recommendation","_getSearchBar","_this$props$context$r7","searchPlaceholderText","placeholder","defaultValue","onKeyDown","showEmptySearchBarTooltip","e","_this$props$context$r6","target","newUrl","URL","window","location","searchParams","set","delete","history","pushState","path","transaction","onBlur","Tooltip","searchEmptySearchTermText","_getChoiceSummary","_this$props$data$refi","telemetry","selectedRefiners","refinerValueName","rating","KeyName","ChoiceSummary","classNames","clearAllText","label","choiceSummaryLabel","closeAriaLabel","selectedChoices","refinerHierarchy","choiceFormat","choiceRangeValueFormat","onChoiceClicked","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","choiceAriaLabel","refinerValues","yesLabel","noLabel","_getAvailableQuantity","shouldShowAvailability","shippingSearchCriteria","shippingAvailability","ProductsDataActions","shippingInventory","deliveryType","_getProducts","_this$props$slots","_this$props$data$feat","_this$props$data$prod5","_this$props$data$prod6","_this$props$data$prod7","imageSettings","allowBackNavigation","shouldAllowBackNavigation","productListItemText","addToWishlistText","addToWishlistButtonText","removeButtonText","removeFromWishlistButtonText","breadCrumbType","breadcrumbType","shouldAllowBack","quickviewSlot","slots","quickview","productComparisonButton","isPriceMinMaxFeatureState","featureState","_this$props$data$prod3","_this$props$data$prod4","extendedProducts","_product$AttributeVal","_product$AttributeVal2","_product$AttributeVal3","Brand","attribute","attributeLocale","brand","Manufacturer","manufacturer","Transit","transit","TemperatureZone","getTemperatureZone","locale","ProductSearchResultItems","productInventoryStatus","wishlists","moduleType","disableBuyButtons","showPrices","isPriceMinMaxEnabled","IsEnabled","validatedProductAccess","productList","productSearchResults2ProductList","ProductListComponent","allowMultiSelect","selectOnQuantityChange","actionsAvailable","addToCartAction","addToWishlistAction","showAvailability","showCartCount","buyAlwaysAdd","breakoffProducts","onBreakoffChange","enabled","newBreakoffProducts","onResetSelectedQuantities","onUpdateQuantity","onUpdateSelection","onBuyValidate","_this$props$data$list6","onBuyHasAccessValidator","toastNoAccessToProduct","_getTotalProductCount","numberOfSearchResults","notification","buildListPageUrl","_getSortColumnFromSelectedOption","warning","option","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list7","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","item","validValues","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","itemToggleNotification","_this$props$data$list8","updatedRefinementCriteria","getUpdatedRefinementCriteria","newRefinementCriteria","currentRefinementCriteria","clearAll","dropdownElementId","current","dropdownElement","document","getElementById","focus","selectedChoice","choiceClicked","selectedCriterion","isMatchingRefinementCriterion","selectedRefiner","isClearAll","paginationPreviousText","paginationNextText","device","Type","bind","_updateViewport","productPrices","pending","placeholderTextMax","minLabel","maxLabel","rangeNameFormat","validationErrorNaN","validationErrorNotNumber","validationErrorRange","validationErrorNotRange","getTelemetryObject","friendlyName","savedViewMode","GetCookie","getLocale","disableAvailabilityCheckUnauthorized","nameTranslations","_nameTranslation","nameTranslation","Language","Text","_this$props$context$a2","_this$props$context$a3","_this$props$data$cust","_this$props$data$list10","_this","MsDyn365","isBrowser","addEventListener","units","_len","arguments","productsId","Array","_key","input","ItemId","toJS","conversions","_activeProducts$find","defaultUOM","ap","DefaultUnitOfMeasure","conversion","r","FromUnitOfMeasureSymbol","ToUnitOfMeasureSymbol","Conversion","Value","Factor","enableAffiliationBasedPricing","StoreOperationsDataActions","_unused","_this$props$data$list9","availabilityError","reaction","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r8","_this$props$context$r9","_this$props$context$r10","_this$props$context$r11","_this$props","_this$props$context$a4","newListPageState","GetFullProductsByCollectionInput","Paging","Top","Skip","Math","max","Sorting","recordId","stringify","Recommendation","SearchText","updateRefinerPanel","productResults","getCollectionProducts","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r12","_this$props$context$r13","_this$props$context$r14","_this$props$context$r15","refinerInput","RefinersByCollectionInput","getRefinersForCollectionDataAction","_this$props$data$list11","_this$props$data$list12","_this$props$data$cust2","_this$props$data$list14","_unused2","_this$props$data$list13","componentWillUnmount","removeEventListener","render","_ref6","_listPageState$result3","_listPageState$result4","_this$props$context$r16","_this$props$data$list15","_this$props$data$list16","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","FeatureSearchResultItem","viewModeProps","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","searchBar","choiceSummary","modalToggle","ModalToggle","innerRef","searchResultModal","errorMessage","ErrorMessage","FeatureSearchContainer","similarLookProduct","viewModesComponent","selectedProductsActions","renderView","_getViewport","variant","VariantType","Browser","Viewport","__decorate","computed","observable","action","observer","DescriptionInterval","getInventoryLabel","inventoryAttribute","renderProductCardsDescription","cartQueue","retrieveOrderTemplates","onUpdateOrderTemplates","isEnabledProductDescription","_props$data$products$","_props$data$featureSt","_props$unitConversion","isAllowBack","quickviewslot","priceResources","priceRangeSeparator","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","simpleProduct","ProductRecordId","quickViewButton","inventoryLabel","inventoryStatus","swatchItemAriaLabel","addToCartText","updateCartText","removeFromCartText","outOfStockText","priceErrorText","toastStrings","errorHeader","productsAddedToCart","productsRemovedFromCart","productsUpdatedInCart","goToCart","toastGoToCart","noAccessToProduct","inCartTooltipText","transitTooltip","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","addToOrderTemplateResources","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","createOrderTemplateHeader","orderTemplateTitle","orderTemplateNameAriaLabel","createOrderTemplateDescription","defaultOrderTemplateName","createOrderTemplateButtonText","cancelNewOrderTemplateCreationButtonText","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","configureStickyFilter","isStickyHeader","headerContainer","querySelector","headerHeight","offsetHeight","bannerHeights","headerElement","defaultContainer","refinerElement","documentElement","scrollTop","classList","setAttribute","clientHeight","removeAttribute","renderViewModes","assign","createSearchResultModal","modalProps","isRecoSearchPage","modal","modalHeader","createModalBody","modalFooter","modalBody","renderSort","Node","submenu","renderRefinerMobile","renderRefiner","renderTitle","_props$context$action2","useEffect","useStickyFilter","stickyFilterSetup","enableStickyHeader","wrapperRefiner","refinerHeading","refinerHeadingRender","_props$context$action","orderTemplates","setOrderTemplates","PQueue","concurrency","updateOrderTemplatesAsync","newOrderTemplates","newOrderTemplate","Id","splice","OrderTemplate","queryResultSettings","QueryResultSettingsProxy","fromInputData","QueryResultSettings","GetOrderTemplatesInput","getOrderTemplates","Module","category","renderCategoryHierarchy","enableProdutDescription","renderProducts","_props$data$listPageS","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","renderProductCards","ListPageState","ListPageStateInput","getCacheKey","getCacheObjectType","dataCacheType","listPageStateAction","ctx","createListPageInput","inputData","createObservableDataAction","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","runOn","iNM","ns","n","pdp","md","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}