{"version":3,"file":"static/js/5f246f55178fc5ad56b5.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} 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 { computed, observable, reaction, transaction, action, 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 } 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\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 previousSearchText: string;\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 { 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 previousSearchText: this.props.context.request.query?.q || ''\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 let searchTextChanged = false;\r\n\r\n if (this.state.previousSearchText !== listPageState.searchText) {\r\n this.setState({ previousSearchText: listPageState.searchText || '' });\r\n searchTextChanged = true;\r\n }\r\n\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 (searchTextChanged || 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 searchTextChanged || 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.bound\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 &&\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 toast({\r\n header: this.props.resources.toastErrorHeader,\r\n text: this.props.resources.selectionActionsMissingLicenseText,\r\n type: 'error',\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 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 toast({\r\n header: this.props.resources.toastErrorHeader,\r\n text: getErrorMessage(result),\r\n footer: (result.errorDetails?.LocalizedMessage as any)?.data?.CorrelationId,\r\n type: 'error',\r\n autoClose: 0,\r\n position: \"bottom-right\",\r\n canClose: true,\r\n showProgress: true\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 = 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 // @ts-ignore\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 };\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 const actionsAvailable = {\r\n addToCartAction: true,\r\n addToWishlistAction: false,\r\n productComparisonButton:false\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 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={actionsAvailable}\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 resetSelectedQuantities={this.state.resetSelectedQuantities}\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: 0}],\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","_this$props$context$r7","super","_viewModeCookieName","BuyAlwaysAdd","sortByDropdownOptions","key","sortOptions","sortByOptionRelevanceDesc","value","this","resources","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_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$config$it","_this$props$config$it2","_this$props$context$r2","_this$props$context$r3","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","toastErrorHeader","selectionActionsMissingLicenseText","type","resetQuantitiesFor","Set","newProductQuantities","_objectSpread","newSelectedProducts","getErrorMessage","_result$validationRes","_result$errorDetails","_result$errorDetails3","_result$validationRes2","_result$errorDetails2","_result$errorDetails4","validationResults","LocalizedMessage","errorDetails","ValidationResults","ErrorContext","handleResult","_result$errorDetails5","add","footer","CorrelationId","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","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$r4","recommendation","_getSearchBar","_this$props$context$r6","searchPlaceholderText","placeholder","defaultValue","onKeyDown","showEmptySearchBarTooltip","e","_this$props$context$r5","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","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","ProductSearchResultItems","productInventoryStatus","wishlists","moduleType","disableBuyButtons","showPrices","isPriceMinMaxEnabled","IsEnabled","validatedProductAccess","productList","productSearchResults2ProductList","ProductListComponent","allowMultiSelect","selectOnQuantityChange","actionsAvailable","addToCartAction","addToWishlistAction","showAvailability","showCartCount","buyAlwaysAdd","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","previousSearchText","placeholderTextMax","minLabel","maxLabel","rangeNameFormat","locale","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","searchTextChanged","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","bound","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":""}