{"version":3,"file":"static/js/30.f67cb95b68a310b7a498.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/utilities.ts?e024","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/choice-summary.tsx?67cf","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/error-message.tsx?bde3","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/feature-search-result-item.tsx?fb7c","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/link.tsx?840a","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/modal.tsx?d39b","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/product-search-result-items.tsx?eeb6","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/range-refine-item.tsx?7904","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/refine-item.tsx?df8d","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/refine-submenu.tsx?0164","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/separator.tsx?30e0","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/title.tsx?1b1f","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/absolute-search-result-container.props.autogenerated.ts?fed2","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/absolute-search-result-container.tsx?c18a","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/absolute-search-result-container.view.tsx?b98a","webpack://Msdyn365.Commerce.Online/./src/modules/aquaglide-header/components/logo.tsx?adf0","webpack://Msdyn365.Commerce.Online/./src/modules/aquaglide-header/components/nav-icon.tsx?f523","webpack://Msdyn365.Commerce.Online/./src/modules/aquaglide-header/components/aquaglide-header-preferred-store.tsx?a19d","webpack://Msdyn365.Commerce.Online/./src/modules/aquaglide-header/aquaglide-header.tsx?dfbc","webpack://Msdyn365.Commerce.Online/./src/modules/aquaglide-header/aquaglide-header.view.tsx?db78","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header/components/logo.tsx?d024","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header/components/nav-icon.tsx?036d","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header/components/connellyb2b-header-preferred-store.tsx?4dc3","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header/connellyb2b-header.tsx?f159","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header/collapse/Collapse.tsx?4835","webpack://Msdyn365.Commerce.Online/./public/connelly/img/ConnellyWebWhite.svg?136b","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header/connellyb2b-header.view.tsx?74c7","webpack://Msdyn365.Commerce.Online/./src/modules/kent-header/components/logo.tsx?9879","webpack://Msdyn365.Commerce.Online/./src/modules/kent-header/components/nav-icon.tsx?e52b","webpack://Msdyn365.Commerce.Online/./src/modules/kent-header/kent-header.tsx?6404","webpack://Msdyn365.Commerce.Online/./src/modules/kent-header/kent-header.view.tsx?2eb1","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/utilities.ts?a27b","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/choice-summary.tsx?9be8","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/error-message.tsx?ef33","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/feature-search-result-item.tsx?8030","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/link.tsx?e3df","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/modal.tsx?cfe1","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/product-search-result-items.tsx?56d6","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/range-refine-item.tsx?c023","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/refine-item.tsx?ae76","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/refine-submenu.tsx?c591","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/separator.tsx?daed","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/components/title.tsx?8310","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/liquid23-search-result-container.props.autogenerated.ts?9bb7","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/liquid23-search-result-container.tsx?41e9","webpack://Msdyn365.Commerce.Online/./src/modules/liquid23-search-result-container/liquid23-search-result-container.view.tsx?0865","webpack://Msdyn365.Commerce.Online/./src/modules/obrienb2b-header/components/logo.tsx?7e1d","webpack://Msdyn365.Commerce.Online/./src/modules/obrienb2b-header/components/nav-icon.tsx?259e","webpack://Msdyn365.Commerce.Online/./src/modules/obrienb2b-header/components/obrienb2b-header-preferred-store.tsx?7ea5","webpack://Msdyn365.Commerce.Online/./src/modules/obrienb2b-header/obrienb2b-header.tsx?c0d6","webpack://Msdyn365.Commerce.Online/./src/modules/obrienb2b-header/collapse/Collapse.tsx?aa93","webpack://Msdyn365.Commerce.Online/./public/obrien/img/Obrien-Logo-Web.svg?e342","webpack://Msdyn365.Commerce.Online/./src/modules/obrienb2b-header/obrienb2b-header.view.tsx?f06a","webpack://Msdyn365.Commerce.Online/./src/nickComponents/price.components.tsx?e06a","webpack://Msdyn365.Commerce.Online/./src/nickComponents/product-dimension/swatch/swatch-item.tsx?30cf","webpack://Msdyn365.Commerce.Online/./src/nickComponents/product-dimension/swatch/swatch.tsx?c760","webpack://Msdyn365.Commerce.Online/./src/nickComponents/product-component-swatch.tsx?a4cd","webpack://Msdyn365.Commerce.Online/./src/nickComponents/product-dimension/dropdown/dropdown.tsx?2783","webpack://Msdyn365.Commerce.Online/./src/nickComponents/product-dimension/product-dimension.component.tsx?10d0","webpack://Msdyn365.Commerce.Online/./src/nickComponents/rating.component.tsx?f999","webpack://Msdyn365.Commerce.Online/./src/themes/connellyb2b/views/components/product.component.tsx?028e","webpack://Msdyn365.Commerce.Online/./src/themes/hosports-b2b/views/components/product.component.tsx?e808","webpack://Msdyn365.Commerce.Online/./src/themes/obrien23/views/components/product.component.tsx?9c13","webpack://Msdyn365.Commerce.Online/./src/themes/obrienb2b/views/components/product.component.tsx?d1fa","webpack://Msdyn365.Commerce.Online/./src/themes/watersportdiscounts/views/components/product.component.tsx?9735","webpack://Msdyn365.Commerce.Online/./src/modules/fabrikam/views/components/cartlineitem.component.tsx?eb8c"],"sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer;\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (error) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { ProductListInventoryFilteringOptions } from '../actions';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n let { selectedChoices } = this.props;\r\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n selectedChoices = selectedChoices.filter(choice => {\r\n const parent = refinerHierarchy.find(\r\n // eslint-disable-next-line unicorn/prefer-array-some, max-len -- Existing code\r\n (hierarchy: IProductRefinerHierarchy) => !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\r\n );\r\n return parent && parent.RecordId !== channelInventoryConfigurationId;\r\n });\r\n }\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
\r\n {items.length > 0 && label && \r\n {label}\r\n }\r\n
    \r\n {items.map((item: IRefinerMap) => {\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
  • \r\n \r\n {item.key}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n {items.length > 0 && clearAllText && \r\n {clearAllText}\r\n }\r\n
\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n // eslint-disable-next-line unicorn/prefer-array-some, max-len -- Existing code\r\n (hierarchy: IProductRefinerHierarchy) => !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n let result = amount;\r\n\r\n try {\r\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\r\n } catch (error) {\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => (itemClicked.textContent && itemClicked.textContent.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
\r\n {' '}\r\n {text}\r\n {' '}\r\n
\r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IAbsoluteSearchResultContainerResources } from '../absolute-search-result-container.props.autogenerated';\r\n\r\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: IAbsoluteSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n recommendation?: string;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent,\r\n recommendation\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const heading = recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\r\n product.Name, fallbackImage, context.actionContext.requestContext)}\r\n
\r\n \r\n
\r\n

\r\n {heading}\r\n

\r\n {renderProductTitle(product?.Name)}\r\n
\r\n
\r\n );\r\n\r\n};\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string,\r\n altText?: string, fallbackImage?: string, context?: IRequestContext): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\n return (

\r\n {title}\r\n

);\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\r\n {' '}\r\n {text}\r\n {' '}\r\n);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport {\r\n Button,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n {text}\r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n {props.resources.modalTitle}\r\n \r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IAbsoluteSearchResultContainerResources } from '../absolute-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IAbsoluteSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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\nexport function getInventoryLabel(\r\n channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n\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\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled,\r\n productsDimensionAvailabilities\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId)}\r\n />\r\n
  • \r\n ))}\r\n
\r\n );\r\n\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private readonly _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private readonly minInput: React.RefObject;\r\n\r\n private readonly maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\r\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps,\r\n nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\r\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return ([\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]);\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return ([\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]);\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
\r\n \r\n \r\n {validationErrorMin &&\r\n \r\n {validationErrorMin}\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n \r\n {validationErrorMax}\r\n }\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private readonly anchorType: React.RefObject;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps,\r\n nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n return this._renderRating(productRefinerValue, parentProductRefinerHierarchy, isChecked, context, index, telemetryContent,\r\n productCountAriaLabel, singleProductCountAriaLabel);\r\n\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productCount = productRefinerValue.Count || 0;\r\n let refineMenuItemAriaLabel;\r\n if (productCount === 1) {\r\n refineMenuItemAriaLabel = refineItemAriaLabel ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText) : '';\r\n } else {\r\n refineMenuItemAriaLabel =\r\n refineItemsAriaLabel ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount) : '';\r\n }\r\n return (\r\n
  • \r\n \r\n {this._renderSwatch()}\r\n \r\n \r\n
  • \r\n );\r\n\r\n }\r\n\r\n private _renderSwatch(): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasValidSwatch = hasColor || hasImage;\r\n const shouldDisplayAsSwatch = hasValidSwatch && checkIfShouldDisplayAsSwatch(\r\n dimensionType, this.props.context as ICoreContext);\r\n const swatchItems = shouldDisplayAsSwatch ? [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ] : undefined;\r\n\r\n if (!swatchItems) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n };\r\n\r\n private _renderRating(productRefinerValue: ProductRefinerValue, parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean, context: ICoreContext, index?: number, telemetryContent?: ITelemetryContent,\r\n ratingUserCountAriaLabel?: string, ratingSingleUserCountAriaLabel?: string): JSX.Element | undefined {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n const defaultChkProductCount = 1;\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n const productCountAriaLabelValue = (productRefinerValue.Count !== undefined &&\r\n productRefinerValue.Count === defaultChkProductCount) ? (ratingSingleUserCountAriaLabel &&\r\n format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)) : (ratingUserCountAriaLabel &&\r\n format(ratingUserCountAriaLabel, productRefinerValue.Count));\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\r\n }\r\n\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps,\r\n nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if ((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n \r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context,\r\n productCountAriaLabel, singleProductCountAriaLabel, refineItemAriaLabel, refineItemsAriaLabel, isMobile } = this.props;\r\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\r\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n productCountAriaLabel={productCountAriaLabel}\r\n refineItemAriaLabel={refineItemAriaLabel}\r\n refineItemsAriaLabel={refineItemsAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n });\r\n return (\r\n
      \r\n {listItems}\r\n
    \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return (
      \r\n {listItems}\r\n
    );\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => (\r\n {' '}\r\n {separator}\r\n {' '}\r\n);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => (\r\n {' '}\r\n {text}\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 * IAbsoluteSearchResultContainer 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 interface IAbsoluteSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n newTitle?: INewTitleData;\r\n content?: Msdyn365.RichText;\r\n}\r\n\r\nexport interface IAbsoluteSearchResultContainerResources {\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 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}\r\n\r\nexport const enum NewTitleTag {\r\n h1 = 'h1',\r\n h2 = 'h2',\r\n h3 = 'h3',\r\n h4 = 'h4',\r\n h5 = 'h5',\r\n h6 = 'h6'\r\n}\r\n\r\nexport interface INewTitleData {\r\n text: string;\r\n tag?: NewTitleTag;\r\n}\r\n\r\nexport interface IAbsoluteSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IAbsoluteSearchResultContainerResources;\r\n config: IAbsoluteSearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy, IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\n// Nick's content\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice, ProductRefinerValue, SortColumn,\r\n TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, DimensionAvailabilitiesForProductSearchResultInput, DimensionTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction, getPriceForProductSearchResult,\r\n IDimensionsApp, PriceForProductSearchResultInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps,\r\n INodeProps, isMobile, ITelemetryContent, LabeledDropdown, UncontrolledPagination, VariantType } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { buildListPageUrl, getCollectionProducts, getCollectionRefinersAction, getCurrentUrl,\r\n GetFullProductsByCollectionInput, parseQueryParam, ProductListInventoryFilteringOptions, RefinersByCollectionInput, sortOptions } from './actions';\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,\r\n Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IAbsoluteSearchResultContainerData } from './absolute-search-result-container.data';\r\nimport { expandRefinersCount, IAbsoluteSearchResultContainerProps } from './absolute-search-result-container.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends IAbsoluteSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n content?: string;\r\n newTitle?: React.ReactNode;\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[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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, ISearchResultContainerState> {\r\n\r\n @computed get isMobile(): boolean {\r\n return (this._viewport === 'xs' || this._viewport === 'sm');\r\n }\r\n\r\n private 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 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 public constructor(props: IAbsoluteSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\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: []\r\n };\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n\r\n // Initalization of list page\r\n // eslint-disable-next-line max-len -- existing code\r\n /* eslint-disable @typescript-eslint/no-floating-promises, promise/catch-or-return, promise/always-return, promise/prefer-await-to-then -- existing code */\r\n this.props.data.products.then((products) => {\r\n this.props.data.listPageState.then((listPageState) => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing, max-len -- existing code\r\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n // eslint-disable-next-line max-len -- existing code\r\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n // eslint-disable-next-line max-len -- existing code\r\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query && this.props.context.request.query.q ? this.props.context.request.query.q : JSON.stringify({ ProductId: this.props.context.request.query?.productId, Recommendation: this.props.context.request.query?.recommendation }),\r\n !!(this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes),\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n this._getActivePrice();\r\n }\r\n });\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n listPageState.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((listPageState.pageSize * (listPageState.currentPageNumber ?? this.defaultPageNumber)),\r\n this.defaultPageNumber)\r\n },\r\n count: true, Sorting: listPageState.sortingCritera ?? {}\r\n },\r\n listPageState.activeFilters ?? [],\r\n +(this.props.context.request.urlTokens.itemId ?? 0),\r\n this.props.context.request.query?.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel,\r\n undefined,\r\n this.catalogId\r\n );\r\n\r\n getCollectionRefinersAction(refinerInput, this.props.context.actionContext).then((refiners) => {\r\n this.setState({ refiners });\r\n }).catch(error => {\r\n this.props.telemetry.error(error);\r\n });\r\n }\r\n }\r\n );\r\n\r\n });\r\n });\r\n // eslint-disable-next-line max-len -- existing code\r\n /* eslint-enable @typescript-eslint/no-floating-promises, promise/catch-or-return, promise/always-return, promise/prefer-await-to-then -- Existing code. */\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then((products) => {\r\n this.props.data.listPageState.then((listPageStateFeature) => {\r\n listPageStateFeature.featureProduct = products;\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\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 async componentDidMount(): Promise {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n this._getActivePrice();\r\n }\r\n\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 (ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) && !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) && !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes) {\r\n await this._getProductsDimensionsAvailabilities();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { \r\n imageSettings, \r\n className, \r\n content,\r\n newTitle \r\n } = this.props.config;\r\n const { resources } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n // Nick's Content\r\n const Content = content && (\r\n \r\n );\r\n\r\n const NewTitle = newTitle && (\r\n
    \r\n \r\n
    \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n // eslint-disable-next-line max-len -- existing code\r\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown() : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ab-product__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && (\r\n \r\n ),\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n // eslint-disable-next-line max-len -- existing code\r\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n // Nick's Content\r\n content: Content,\r\n newTitle: NewTitle\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n // Nick's content\r\n public handleParagraphChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.content! = event.target.value;\r\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.newTitle!.text = event.target.value;\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(productsList, this.props.context as ICoreContext),\r\n this.props.context.actionContext);\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 const productsList = (this.props.data.listPageState.result?.activeProducts) ?? [];\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext);\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n listPageState.activeProducts = products;\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal(\r\n {\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\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 = (data.category.result && SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const 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\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 && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n\r\n };\r\n\r\n private 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 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 && data.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 && listPageState.currentPageNumber !== null ? (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) : ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\r\n const totalItems = listPageState && listPageState.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\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 private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners) ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n }) : data.refiners.result && 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 = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\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 />\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 /**\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\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n return this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId;\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n closeAriaLabel={resources.closeAriaLabel}\r\n selectedChoices={selectedRefiners}\r\n\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n />\r\n );\r\n\r\n };\r\n\r\n private readonly _getProducts = (): JSX.Element => {\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const quickviewslot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview[0];\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature');\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={allowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewslot}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n // eslint-disable-next-line max-len -- existing code\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\r\n });\r\n };\r\n\r\n private 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(\r\n mappedSearchConfig => 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(mappedSearchConfig => 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 { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n\r\n };\r\n\r\n private 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 },\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'>\r\n {paginationPreviousText}\r\n </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'>\r\n {paginationNextText}\r\n </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","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport { ICategoryHierarchyViewProps, IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from './absolute-search-result-container';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, FeatureSearchContainer, similarLookProduct, content, newTitle } = props;\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <div className=\"ab-cat-header\">\r\n <div className='content-fixer'>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {newTitle ? (\r\n <>\r\n {newTitle}\r\n </>\r\n ) : (\r\n <>\r\n {renderTitle(TitleViewProps)}\r\n </>\r\n )}\r\n {content}\r\n </div>\r\n </div>\r\n <div className='flex-xs'>\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </div>\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n \r\n <Node {...RefineAndProductSectionContainer}>\r\n \r\n <Node {...ProductSectionContainer}>\r\n <div className=\"ab-cat-header\">\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>\r\n <div className='content-fixer'>\r\n {newTitle ? (\r\n <>\r\n {newTitle}\r\n </>\r\n ) : (\r\n <>\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n </>\r\n )}\r\n {content}\r\n </div>\r\n </div>\r\n <div className='flex-xs'>\r\n {refineMenu && renderRefiner(refineMenu)}\r\n <div className='ab-results'>\r\n {choiceSummary}\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </div>\r\n </div>\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n}\r\n\r\nexport interface ILinkData {\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n linkText?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Logo component\r\n * @extends {React.PureComponent<ILogoConfig>}\r\n */\r\nexport class Logo extends React.PureComponent<ILogoProps> {\r\n private attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: ILogoProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n public render(): JSX.Element {\r\n return <div className={this.props.className}>{this._renderLogo(this.props)}</div>;\r\n }\r\n\r\n private _renderLogo(config: ILogoProps): JSX.Element {\r\n if (config.link && config.link.linkUrl.destinationUrl) {\r\n return (\r\n // eslint-disable-next-line react/jsx-no-target-blank\r\n <a\r\n href={config.link.linkUrl.destinationUrl}\r\n aria-label={config.link.ariaLabel}\r\n target={config.link.openInNewTab ? '_blank' : undefined}\r\n {...this.attributes}\r\n >\r\n <svg version='1.1' id='aquaglideSvg' x='0px' y='0px' viewBox='0 0 204 23.8'>\r\n <path\r\n className='logoFill'\r\n d='M67.5,1.7l-0.6,17.7l-8,0l0.5-3.2l-2.8,0l-1.4,3.2l-8.1,0l9.1-17.7L67.5,1.7z M60.1,13.1c0.2-2,0.5-4.5,1-7.4\r\n\tc-1.8,3.4-3,5.9-3.6,7.4H60.1z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M67.5,1.7l-0.6,17.7l-8,0l0.5-3.2l-2.8,0l-1.4,3.2l-8.1,0l9.1-17.7L67.5,1.7z M60.1,13.1c0.2-2,0.5-4.5,1-7.4\r\n\tc-1.8,3.4-3,5.9-3.6,7.4H60.1z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M88.9,4.9l-5.5,18.9l-6.8-2.3l0.9-3.3c-0.9,0.6-1.7,1-2.4,1.2c-0.7,0.2-1.4,0.2-2.3,0.2c-1.3,0-2.3-0.2-3.1-0.5\r\n\tc-0.8-0.4-1.2-0.8-1.3-1.4c-0.1-0.6,0-1.5,0.3-2.7l1.8-6.4c0.3-1,0.6-1.7,1-2.2c0.4-0.5,1-0.9,2-1.3c0.9-0.4,2-0.5,3.2-0.5\r\n\tc0.9,0,1.8,0.1,2.5,0.4c0.7,0.3,1.3,0.6,1.8,1.1l0.5-1.3L88.9,4.9z M80.2,8.9c0.2-0.6,0.2-1.1,0.1-1.3c-0.1-0.2-0.4-0.3-0.8-0.3\r\n\tc-0.4,0-0.7,0.1-0.9,0.3c-0.2,0.2-0.4,0.7-0.6,1.3l-1.9,6.4c-0.2,0.8-0.3,1.3-0.2,1.5c0.1,0.2,0.4,0.3,0.8,0.3c0.4,0,0.8-0.1,1-0.3\r\n\tc0.2-0.2,0.4-0.7,0.6-1.4L80.2,8.9z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M88.9,4.9l-5.5,18.9l-6.8-2.3l0.9-3.3c-0.9,0.6-1.7,1-2.4,1.2c-0.7,0.2-1.4,0.2-2.3,0.2c-1.3,0-2.3-0.2-3.1-0.5\r\n\tc-0.8-0.4-1.2-0.8-1.3-1.4c-0.1-0.6,0-1.5,0.3-2.7l1.8-6.4c0.3-1,0.6-1.7,1-2.2c0.4-0.5,1-0.9,2-1.3c0.9-0.4,2-0.5,3.2-0.5\r\n\tc0.9,0,1.8,0.1,2.5,0.4c0.7,0.3,1.3,0.6,1.8,1.1l0.5-1.3L88.9,4.9z M80.2,8.9c0.2-0.6,0.2-1.1,0.1-1.3c-0.1-0.2-0.4-0.3-0.8-0.3\r\n\tc-0.4,0-0.7,0.1-0.9,0.3c-0.2,0.2-0.4,0.7-0.6,1.3l-1.9,6.4c-0.2,0.8-0.3,1.3-0.2,1.5c0.1,0.2,0.4,0.3,0.8,0.3c0.4,0,0.8-0.1,1-0.3\r\n\tc0.2-0.2,0.4-0.7,0.6-1.4L80.2,8.9z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M108.3,4.9l-4.2,14.5l-7.6,0l0.5-1.2c-0.7,0.5-1.4,0.9-2.2,1.1c-0.8,0.2-1.7,0.4-2.7,0.4c-1.1,0-2-0.1-2.7-0.3\r\n\tc-0.7-0.2-1.1-0.5-1.4-0.9c-0.2-0.4-0.3-0.8-0.3-1.2c0-0.4,0.2-1.3,0.6-2.5l2.8-9.8l7.5,0l-2.9,9.9c-0.3,1.1-0.5,1.8-0.4,2\r\n\tc0.1,0.2,0.3,0.3,0.8,0.3c0.5,0,0.9-0.1,1.1-0.3c0.2-0.2,0.4-0.9,0.8-2.1l2.8-9.7L108.3,4.9z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M108.3,4.9l-4.2,14.5l-7.6,0l0.5-1.2c-0.7,0.5-1.4,0.9-2.2,1.1c-0.8,0.2-1.7,0.4-2.7,0.4c-1.1,0-2-0.1-2.7-0.3\r\n\tc-0.7-0.2-1.1-0.5-1.4-0.9c-0.2-0.4-0.3-0.8-0.3-1.2c0-0.4,0.2-1.3,0.6-2.5l2.8-9.8l7.5,0l-2.9,9.9c-0.3,1.1-0.5,1.8-0.4,2\r\n\tc0.1,0.2,0.3,0.3,0.8,0.3c0.5,0,0.9-0.1,1.1-0.3c0.2-0.2,0.4-0.9,0.8-2.1l2.8-9.7L108.3,4.9z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M115.8,10.5l-7,0l0.3-1c0.3-1.1,0.8-2,1.4-2.6c0.6-0.6,1.7-1.2,3.1-1.6c1.5-0.5,3.3-0.7,5.4-0.7\r\n\tc2.5,0,4.4,0.3,5.5,0.8c1.1,0.5,1.7,1.2,1.8,1.9c0,0.8-0.3,2.3-1,4.7l-2.1,7.3l-7.3,0l0.4-1.3c-0.6,0.5-1.3,0.9-2.1,1.2\r\n\tc-0.8,0.3-1.7,0.4-2.7,0.4c-1.3,0-2.5-0.2-3.4-0.6c-1-0.4-1.2-1.4-0.8-2.8l0.3-1.2c0.3-1.1,0.8-1.8,1.5-2.2c0.7-0.4,2.3-0.9,4.7-1.4\r\n\tc2.6-0.6,4.1-1,4.3-1.1c0.2-0.2,0.4-0.6,0.6-1.2c0.2-0.8,0.3-1.3,0.1-1.5c-0.1-0.2-0.4-0.3-0.9-0.3c-0.5,0-0.9,0.1-1,0.3\r\n\tc-0.2,0.2-0.4,0.7-0.6,1.5L115.8,10.5z M117.6,12.5c-1.4,0.5-2.2,0.9-2.5,1.3c-0.3,0.4-0.5,0.8-0.7,1.5c-0.2,0.7-0.3,1.2-0.2,1.4\r\n\tc0.1,0.2,0.4,0.3,0.9,0.3c0.5,0,0.8-0.1,1-0.3c0.2-0.2,0.4-0.6,0.6-1.3L117.6,12.5z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M115.8,10.5l-7,0l0.3-1c0.3-1.1,0.8-2,1.4-2.6c0.6-0.6,1.7-1.2,3.1-1.6c1.5-0.5,3.3-0.7,5.4-0.7\r\n\tc2.5,0,4.4,0.3,5.5,0.8c1.1,0.5,1.7,1.2,1.8,1.9c0,0.8-0.3,2.3-1,4.7l-2.1,7.3l-7.3,0l0.4-1.3c-0.6,0.5-1.3,0.9-2.1,1.2\r\n\tc-0.8,0.3-1.7,0.4-2.7,0.4c-1.3,0-2.5-0.2-3.4-0.6c-1-0.4-1.2-1.4-0.8-2.8l0.3-1.2c0.3-1.1,0.8-1.8,1.5-2.2c0.7-0.4,2.3-0.9,4.7-1.4\r\n\tc2.6-0.6,4.1-1,4.3-1.1c0.2-0.2,0.4-0.6,0.6-1.2c0.2-0.8,0.3-1.3,0.1-1.5c-0.1-0.2-0.4-0.3-0.9-0.3c-0.5,0-0.9,0.1-1,0.3\r\n\tc-0.2,0.2-0.4,0.7-0.6,1.5L115.8,10.5z M117.6,12.5c-1.4,0.5-2.2,0.9-2.5,1.3c-0.3,0.4-0.5,0.8-0.7,1.5c-0.2,0.7-0.3,1.2-0.2,1.4\r\n\tc0.1,0.2,0.4,0.3,0.9,0.3c0.5,0,0.8-0.1,1-0.3c0.2-0.2,0.4-0.6,0.6-1.3L117.6,12.5z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M146.6,4.8L143.3,16c-0.4,1.5-0.8,2.5-1,2.9c-0.2,0.4-0.8,0.9-1.7,1.4c-0.9,0.5-2,0.9-3.3,1.1\r\n\tc-1.4,0.3-3,0.4-5,0.4c-2.4,0-4.2-0.2-5.5-0.7c-1.3-0.5-1.8-1.4-1.4-2.8l7.2,0c-0.2,0.6,0.1,1,0.9,1c0.6,0,1-0.1,1.2-0.3\r\n\tc0.2-0.2,0.5-0.6,0.6-1.2l0.3-1.1c-0.7,0.3-1.5,0.6-2.3,0.8c-0.8,0.2-1.5,0.3-2.3,0.3c-1.4,0-2.4-0.2-3.2-0.5\r\n\tc-0.8-0.3-1.3-0.7-1.4-1.3c-0.2-0.5-0.1-1.3,0.2-2.2l1.5-5.3c0.4-1.4,1.1-2.4,2.1-3c1-0.6,2.4-0.9,4.1-0.9c0.9,0,1.8,0.1,2.5,0.3\r\n\tc0.7,0.2,1.3,0.6,1.8,1l0.8-1.1L146.6,4.8z M138,8.7c0.2-0.7,0.2-1.1,0.2-1.3c-0.1-0.2-0.3-0.3-0.8-0.3c-0.4,0-0.8,0.1-1,0.3\r\n\tc-0.2,0.2-0.5,0.6-0.6,1.2l-1.4,4.9c-0.2,0.7-0.2,1.1-0.2,1.3c0.1,0.2,0.3,0.3,0.8,0.3c0.5,0,0.9-0.1,1.1-0.3\r\n\tc0.2-0.2,0.5-0.8,0.7-1.6L138,8.7z'\r\n />\r\n <polygon className='logoFill' points='157.5,1.6 152.4,19.3 144.7,19.3 149.8,1.6 ' />\r\n <path\r\n className='logoFill'\r\n d='M166.6,4.8l-4.2,14.5l-7.7,0l4.2-14.5L166.6,4.8z M167.5,1.6l-0.7,2.3l-7.7,0l0.7-2.3L167.5,1.6z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M186.9,1.6l-5.1,17.7l-7.5,0l0.3-1.1c-0.8,0.4-1.7,0.8-2.6,1c-0.9,0.2-1.7,0.3-2.6,0.3c-1.2,0-2.1-0.2-2.9-0.5\r\n\tc-0.7-0.4-1.2-0.8-1.3-1.3c-0.1-0.5,0-1.2,0.3-2.3l2-6.8c0.3-1.1,0.7-1.9,1.1-2.4c0.4-0.5,1-0.9,2-1.2c1-0.4,2-0.5,3.2-0.5\r\n\tc0.9,0,1.8,0.1,2.5,0.3c0.7,0.2,1.3,0.5,1.8,0.9l1.2-4.1L186.9,1.6z M177.5,8.4c0.2-0.5,0.2-0.9,0.1-1.1c-0.1-0.2-0.4-0.3-0.8-0.3\r\n\tc-0.4,0-0.8,0.1-1,0.3c-0.2,0.2-0.4,0.5-0.5,1.1l-2.1,7.1c-0.2,0.6-0.2,1-0.1,1.2c0.1,0.2,0.4,0.3,0.8,0.3c0.5,0,0.8-0.1,1.1-0.3\r\n\tc0.2-0.2,0.4-0.7,0.7-1.5L177.5,8.4z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M203.1,12.2l-9.7,0l-0.9,3.1c-0.2,0.7-0.2,1.1-0.1,1.3c0.1,0.2,0.4,0.3,0.8,0.3c0.6,0,1-0.1,1.3-0.4\r\n\tc0.3-0.3,0.5-0.7,0.7-1.5l0.6-1.9l7.1,0l-0.3,1.1c-0.3,0.9-0.6,1.6-0.9,2.1c-0.3,0.5-0.9,1-1.8,1.5c-0.9,0.5-1.9,1-3,1.2\r\n\tc-1.2,0.3-2.6,0.4-4.2,0.4c-1.6,0-2.9-0.1-4.1-0.4c-1.1-0.3-2-0.6-2.5-1.1c-0.5-0.5-0.8-1-0.9-1.5c-0.1-0.6,0-1.4,0.3-2.5l1.2-4.2\r\n\tc0.4-1.3,0.9-2.3,1.7-3c0.8-0.7,1.9-1.3,3.3-1.7c1.4-0.4,3-0.6,4.7-0.6c2.1,0,3.8,0.2,5,0.7c1.2,0.5,2,1.1,2.3,1.9\r\n\tc0.3,0.8,0.3,1.9-0.1,3.3L203.1,12.2z M196.3,9.9l0.3-1.1c0.2-0.8,0.3-1.2,0.2-1.4c-0.1-0.2-0.3-0.3-0.7-0.3c-0.5,0-0.9,0.1-1.1,0.3\r\n\tc-0.2,0.2-0.4,0.7-0.6,1.5l-0.3,1.1L196.3,9.9z'\r\n />\r\n <g>\r\n <path\r\n className='logoFill'\r\n d='M203,19c-0.2,0-0.4-0.1-0.5-0.2c-0.1-0.1-0.2-0.3-0.2-0.5c0-0.2,0.1-0.4,0.2-0.5c0.1-0.1,0.3-0.2,0.5-0.2l0,0\r\n\t\tc0,0,0,0,0,0c0.4,0,0.7,0.3,0.7,0.7C203.7,18.6,203.4,19,203,19C203,19,203,19,203,19z M203,17.7c-0.1,0-0.3,0.1-0.4,0.2\r\n\t\tc-0.1,0.1-0.2,0.2-0.2,0.4c0,0.1,0.1,0.3,0.2,0.4c0.1,0.1,0.2,0.2,0.4,0.2c0,0,0,0,0,0c0.3,0,0.5-0.2,0.5-0.5\r\n\t\tC203.5,17.9,203.3,17.7,203,17.7C203,17.7,203,17.7,203,17.7L203,17.7z'\r\n />\r\n </g>\r\n <path\r\n className='logoFill'\r\n d='M202.5,17.9L202.5,17.9c0.1,0,0.2,0,0.2,0c0.1,0,0.1,0,0.2,0c0,0,0.1,0,0.1,0c0.1,0,0.2,0,0.3,0\r\n\tc0,0,0.1,0.1,0.1,0.1c0,0,0,0.1,0,0.1c0,0-0.1,0-0.1,0.1c0,0-0.1,0-0.2,0c0,0,0,0,0.1,0.1l0.1,0.1c0,0,0.1,0.1,0.1,0.1\r\n\tc0,0,0.1,0.1,0.1,0.1c0,0,0,0,0,0c0,0,0,0,0,0l0,0l0,0l0,0c0,0-0.1,0-0.1,0c0,0-0.1,0-0.1,0c0,0-0.1-0.1-0.2-0.1\r\n\tc-0.1-0.1-0.2-0.1-0.3-0.2l0,0c0,0,0,0,0.1,0c0.1,0,0.2,0,0.2,0c0,0,0.1-0.1,0.1-0.1c0,0,0-0.1-0.1-0.1c0,0-0.1,0-0.2,0\r\n\tc-0.1,0-0.1,0-0.1,0c0,0,0,0.1,0,0.2v0.2l0,0.1c0,0,0,0.1,0,0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0.1,0l0,0l0,0l0,0c0,0,0,0-0.1,0\r\n\tc0,0-0.1,0-0.1,0c0,0-0.1,0-0.2,0l0,0v0l0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0-0.1l0-0.1l0-0.2l0-0.1\r\n\tc0,0,0-0.1,0-0.1c0,0,0,0,0,0c0,0,0,0,0,0C202.6,17.9,202.6,17.9,202.5,17.9L202.5,17.9L202.5,17.9z'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M26.5,10h7.1c1.4,0,1.8,0.5,1.8,2.7v4.1c0,2.3-2.3,4.5-4.6,4.5h-7.2c-2.4,0-4.9-2.3-4.9-4.6c0-2.1,0-8,0-9.2\r\n\tC18.6,2.3,21.1,0,27,0h8.1c0,0-0.8,4.7-3.7,4.7h-6.1c-1.7,0-1.8,1.6-1.8,2.7c0,1.5,0,3.7,0,7.3c0,0,0,2.1,1.7,2.1h3.9\r\n\tc1.2,0,1.6-1,1.6-1.7c0-0.7,0-1.6,0-2.4c0-2.1-2.4-2.3-4.3-2.3C26.5,10.2,26.5,10,26.5,10'\r\n />\r\n <path\r\n className='logoFill'\r\n d='M8.9,10H1.8C0.4,10,0,10.5,0,12.7v4.1c0,2.3,2.3,4.5,4.6,4.5c3.8,0,5.7,0,7.2,0c2.4,0,4.9-2.3,4.9-4.6\r\n\tc0-2.1,0-8,0-9.2c0-5.2-2.4-7.5-8.3-7.5H0.2c0,0,0.8,4.7,3.7,4.7H10c1.7,0,1.8,1.6,1.8,2.7v7.3c0,0,0,2.1-1.7,2.1\r\n\tc-1.6,0-2.6,0-3.9,0c-1.2,0-1.6-1-1.6-1.7c0-0.7,0-1.6,0-2.4c0-2.1,2.4-2.3,4.3-2.3C8.9,10.2,8.9,10,8.9,10'\r\n />\r\n </svg>\r\n </a>\r\n );\r\n }\r\n return this._renderImage(config);\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=132&h=28&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=160&h=48&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n <Msdyn365.Image\r\n {...config.image}\r\n gridSettings={this.props.gridSettings!}\r\n imageSettings={(config && config.image && config.image.imageSettings) || defaultImageSettings}\r\n loadFailureBehavior='default'\r\n editProps={{ key: config.image || {}, requestContext: this.props.requestContext }}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default Logo;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IAquaglideHeaderResources } from '../aquaglide-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IAquaglideHeaderResources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n telemetryContent?: ITelemetryContent;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component\r\n * @extends {React.PureComponent<INavIconProps>}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.Component<INavIconProps> {\r\n private attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: INavIconProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <Button\r\n className='ms-header__nav-icon'\r\n onClick={this.props.toggleNavBar}\r\n title={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-expanded={this.props.isExpanded}\r\n aria-controls={this.props.targetId}\r\n {...this.attributes}\r\n />\r\n );\r\n }\r\n}\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IAquaglideHeaderData } from '../aquaglide-header.data';\r\nimport { IAquaglideHeaderProps } from '../aquaglide-header.props.autogenerated';\r\n\r\n/**\r\n * The header preferred store component\r\n */\r\n@observer\r\nexport class HeaderPreferredStore extends React.PureComponent<IAquaglideHeaderProps<IAquaglideHeaderData>> {\r\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\n public handleClick = () => {\r\n return this._findPreferreStoreOnClick(this.props);\r\n };\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n slots,\r\n resources\r\n } = this.props;\r\n if (slots && slots.storeSelector && slots.storeSelector.length) {\r\n const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName;\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n //@ts-ignore\r\n storeSelectorStateManager?.preferredStore.StoreName;\r\n resources.headerPreferredStoreText;\r\n\r\n return (\r\n <div className='ms-header__preferred-store-container'>\r\n <button\r\n className='ms-header__preferred-store-btn msc-btn'\r\n color='secondary'\r\n aria-label={resources.headerPreferredStoreAriaLabel}\r\n onClick={this.handleClick}\r\n >\r\n <span className='ms-header__preferred-store-text'>{storeName}</span>\r\n </button>\r\n {slots.storeSelector}\r\n </div>\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private async _findPreferreStoreOnClick(props: IAquaglideHeaderProps<IAquaglideHeaderData>): Promise<void> {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n modules\r\n } = props;\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n let storeSelectorId = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n storeSelectorStateManager\r\n .openDialog({\r\n id: storeSelectorId,\r\n showMapViewLink: false,\r\n onLocationSelected: orgUnitLocation => {\r\n return Promise.resolve();\r\n }\r\n })\r\n .catch((error: Error) => {\r\n if (props.telemetry) {\r\n props.telemetry.error(error.message);\r\n props.telemetry.debug('Unable to set preferred store');\r\n }\r\n return;\r\n });\r\n }\r\n}\r\n\r\nexport default HeaderPreferredStore;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n KeyCodes,\r\n Modal,\r\n ModalBody,\r\n ModalHeader,\r\n onTelemetryClick,\r\n Popover,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { IAquaglideHeaderData } from './aquaglide-header.data';\r\nimport { IAquaglideHeaderProps, IAquaglideHeaderResources, IMyAccountLinksData } from './aquaglide-header.props.autogenerated';\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends IAquaglideHeaderProps<IAquaglideHeaderData>, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n search: React.ReactNode[];\r\n siteOptions: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n accountLinks?: React.ReactNode[];\r\n preferredStore?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent<IAquaglideHeaderProps<IAquaglideHeaderData>>}\r\n */\r\nclass Header extends React.PureComponent<IAquaglideHeaderProps<IAquaglideHeaderData>, IHeaderState> {\r\n private popOverRef: React.RefObject<HTMLButtonElement>;\r\n private telemetryContent: ITelemetryContent;\r\n @computed public get displayName(): Readonly<string | undefined> {\r\n const customer = this.props.data.accountInformation?.result;\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n\r\n constructor(props: IAquaglideHeaderProps<IAquaglideHeaderData>) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: {\r\n accountInformation,\r\n cart: { result: cart },\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n context: {\r\n request: { user }\r\n },\r\n context,\r\n resources: { cartLabel, cartQtyLabel }\r\n } = this.props;\r\n const { logoLink, logoImage } = this.props.config;\r\n const headerClassName = classnames('ms-header', this.props.config.className);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const menuBarSlot = this._getSlot('aquaglideMenuBar');\r\n const searchSlot = this._getSlot('search');\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as IAquaglideHeaderProps<IAquaglideHeaderData>),\r\n ...this.state,\r\n logo: (\r\n <Logo\r\n {...{\r\n link: logoLink,\r\n image: logoImage,\r\n className: 'ms-header__logo',\r\n gridSettings: this.props.context.request.gridSettings,\r\n requestContext: this.props.context.request,\r\n telemetryContent: this.telemetryContent\r\n }}\r\n />\r\n ),\r\n wishListIconDesktop: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-desktop'\r\n showButtonTooltip={true}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n />\r\n ),\r\n wishListIconMobile: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-mobile'\r\n showButtonTooltip={true}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n />\r\n ),\r\n cartIcon:\r\n cartIconSlot && cartIconSlot.length > 0\r\n ? cartIconSlot[0]\r\n : cart && (\r\n <CartIconComponent\r\n cartLabel={cartLabel}\r\n cartQtyLabel={cartQtyLabel}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{ cart: cart }}\r\n />\r\n ),\r\n navIcon: (\r\n <NavIcon\r\n {...{\r\n resources: this.props.resources,\r\n isExpanded: !this.state.mobileMenuCollapsed,\r\n targetId: navbarKey,\r\n toggleNavBar: this._toggleNavbar,\r\n telemetryContent: this.telemetryContent\r\n }}\r\n />\r\n ),\r\n menuBar: (menuBarSlot && menuBarSlot.length && menuBarSlot) || [],\r\n search: (searchSlot && searchSlot.length && searchSlot) || [],\r\n siteOptions: (siteOptionsSlot && siteOptionsSlot.length && siteOptionsSlot) || [],\r\n className: headerClassName,\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('ms-header__topbar aquaglide justify')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: 'ms-header__modal'\r\n },\r\n MobileMenuHeader: <ModalHeader className='ms-header__mobile-hamburger-menu-header' toggle={this._toggleNavbar} />,\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body'\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links'\r\n },\r\n AccountInfoDropdownParentContainer: {\r\n className: 'ms-header__account-info'\r\n },\r\n AccountInfoDropdownPopoverConentContainer:\r\n (customer &&\r\n this.displayName && {\r\n tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover\r\n }) ||\r\n undefined,\r\n\r\n signInLink: this._getSigninButton(customer, user, this.props.resources),\r\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\r\n accountLinks: this._getAccountLinks(customer),\r\n preferredStore: preferredStoreSlot && preferredStoreSlot.length && storeSelectorStateManager && (\r\n <HeaderPreferredStore {...this.props} />\r\n )\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /* Handle link text change*/\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent) => {\r\n if (this.props.config.myAccountLinks && this.props.config.myAccountLinks[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\r\n }\r\n };\r\n\r\n private _getSlot(slotName: string): React.ReactNode[] | null {\r\n const { slots } = this.props;\r\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\r\n }\r\n\r\n private _getSigninButton(\r\n customer: Customer | undefined,\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n resources: IAquaglideHeaderResources\r\n ): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n !customer && (\r\n <Button\r\n className='ms-header__signin-button'\r\n title={resources.signInLinkText}\r\n href={user && user.signInUrl}\r\n aria-label={resources.signInLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signin-button-text' aria-hidden={true}>\r\n {resources.signInLinkText}\r\n </span>\r\n </Button>\r\n )\r\n );\r\n }\r\n\r\n private _getSignOutButton(\r\n customer: Customer | undefined,\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n resources: IAquaglideHeaderResources\r\n ): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n customer &&\r\n this.displayName && (\r\n <Button\r\n className={'ms-header__signout-button'}\r\n title={resources.signOutLinkText}\r\n href={(user && user.signOutUrl) || ''}\r\n aria-label={resources.signOutLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signout-button-text' aria-hidden={true}>\r\n {resources.signOutLinkText}\r\n </span>\r\n </Button>\r\n )\r\n );\r\n }\r\n\r\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n customer &&\r\n this.displayName && (\r\n <Button\r\n innerRef={this.popOverRef}\r\n className={'ms-header__profile-button'}\r\n aria-describedby='myprofilePopover'\r\n onClick={this._togglePopover}\r\n color='link'\r\n aria-expanded={this.state.signinPopoverOpen}\r\n {...attributes}\r\n >\r\n <span className='ms-profile-button-text'>{this.displayName}</span>\r\n </Button>\r\n )\r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if (!customer || !this.displayName || !myAccountLinks || !myAccountLinks.length) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n <MsDyn365.Link\r\n key={index}\r\n link={editableLink}\r\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\r\n />\r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(e: KeyboardEvent): void {\r\n if (e.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n }\r\n }\r\n}\r\n\r\nexport default Header;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Collapse, Drawer, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport classnames from 'classnames';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport { IHeaderViewProps } from './aquaglide-header';\r\n\r\nconst headerView: React.FC<IHeaderViewProps> = props => {\r\n const { HeaderTag, HeaderContainer, HeaderTopBarContainer, Divider } = props;\r\n return (\r\n <Module {...HeaderTag}>\r\n <Node {...HeaderContainer}>\r\n <Node {...HeaderTopBarContainer}>\r\n {/* This is the area that is majorly revamped. Subtract components as needed. */}\r\n\r\n <div className='aquaglide-logo'>\r\n {props.logo}\r\n {props.navIcon}\r\n </div>\r\n\r\n <div className='aquaglide-test desktop-nav'>{_renderReactFragment(props.menuBar)}</div>\r\n\r\n <div className='aquaglide-test always-flex align-items-center'>\r\n {_renderReactFragment(props.search)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.wishListIconDesktop}\r\n <Node {...Divider} />\r\n {props.cartIcon}\r\n {_renderReactFragment(props.siteOptions)}\r\n </div>\r\n </Node>\r\n {_renderCollapseMenu(props)}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n <Collapse className={'ms-header__collapsible-hamburger'} isOpen={!mobileMenuCollapsed}>\r\n <Node {...MobileMenuLinksContainer}>\r\n {_renderReactFragment(props.menuBar)}\r\n {_renderReactFragment(props.search)}\r\n {_renderMobileAccountBlock(props, true)}\r\n {props.wishListIconMobile}\r\n </Node>\r\n </Collapse>\r\n );\r\n}\r\n\r\nconst renderCustomerName = (accountInformation: AsyncResult<Customer>): React.ReactChild => {\r\n const customer = accountInformation && accountInformation.result;\r\n return <>{customer && customer.FirstName}</>;\r\n};\r\n\r\nfunction _renderMobileAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\r\n const { AccountInfoDropdownParentContainer, signOutLink, signInLink, data, accountLinks } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n const accountClassName = classnames(\r\n 'ms-header__drawer',\r\n AccountInfoDropdownParentContainer.className,\r\n renderForMobile ? 'account-mobile' : 'account-desktop'\r\n );\r\n\r\n if (accountLinks) {\r\n return (\r\n <Drawer\r\n className={accountClassName}\r\n openGlyph='ms-header__drawer-open'\r\n closeGlyph='ms-header__drawer-close'\r\n glyphPlacement='end'\r\n toggleButtonText={renderCustomerName(data.accountInformation)}\r\n >\r\n <div>\r\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\r\n {signOutLink}\r\n </div>\r\n </Drawer>\r\n );\r\n } else if (signInLink) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\r\n {signInLink}\r\n </Node>\r\n );\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {accountInfoDropdownButton}\r\n <Node {...AccountInfoDropdownPopoverConentContainer}>\r\n {accountLinks ? accountLinks.map(link => link) : false}\r\n {signOutLink}\r\n </Node>\r\n </Node>\r\n );\r\n } else if (signInLink) {\r\n return <Node {...AccountInfoDropdownParentContainer}>{signInLink}</Node>;\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n <React.Fragment>\r\n {items && items.length\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return <React.Fragment key={index}>{slot}</React.Fragment>;\r\n })\r\n : null}\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nexport default headerView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n}\r\n\r\nexport interface ILinkData {\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n linkText?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Logo component\r\n * @extends {React.PureComponent<ILogoConfig>}\r\n */\r\nexport class Logo extends React.PureComponent<ILogoProps> {\r\n\r\n private attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: ILogoProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n public render():JSX.Element {\r\n return(\r\n <div className={this.props.className}>\r\n {this._renderLogo(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n private _renderLogo(config: ILogoProps):JSX.Element {\r\n if(config.link && config.link.linkUrl.destinationUrl) {\r\n return(\r\n <a\r\n href={config.link.linkUrl.destinationUrl}\r\n aria-label={config.link.ariaLabel}\r\n target={config.link.openInNewTab ? '_blank' : undefined}\r\n {...this.attributes}\r\n >\r\n {this._renderImage(config)}\r\n </a>\r\n );\r\n }\r\n return(\r\n this._renderImage(config)\r\n );\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=132&h=28&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=160&h=48&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n <Msdyn365.Image\r\n {...config.image}\r\n gridSettings={this.props.gridSettings!}\r\n imageSettings={config && config.image && config.image.imageSettings || defaultImageSettings}\r\n loadFailureBehavior='default'\r\n editProps= {{key: config.image || {}, requestContext: this.props.requestContext}}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default Logo;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IConnellyb2bHeaderResources } from '../connellyb2b-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IConnellyb2bHeaderResources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n telemetryContent?: ITelemetryContent;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component\r\n * @extends {React.PureComponent<INavIconProps>}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.Component<INavIconProps> {\r\n\r\n private attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: INavIconProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render():JSX.Element {\r\n return (\r\n <Button\r\n className='ms-header__nav-icon'\r\n onClick={this.props.toggleNavBar}\r\n title={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-expanded={this.props.isExpanded}\r\n aria-controls={this.props.targetId}\r\n {...this.attributes}\r\n ><span>Menu</span></Button>\r\n );\r\n }\r\n}","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IConnellyb2BHeaderData } from '../connellyb2b-header.data';\r\nimport { IConnellyb2bHeaderProps } from '../connellyb2b-header.props.autogenerated';\r\n\r\n/**\r\n * The header preferred store component\r\n */\r\n@observer\r\nexport class HeaderPreferredStore extends React.PureComponent<IConnellyb2bHeaderProps<IConnellyb2BHeaderData>> {\r\n\r\n public handleClick = () => { return this._findPreferreStoreOnClick(this.props); };\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n slots,\r\n resources\r\n } = this.props;\r\n if (slots && slots.storeSelector && slots.storeSelector.length) {\r\n const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName ?\r\n storeSelectorStateManager!.preferredStore.StoreName :\r\n resources.headerPreferredStoreText;\r\n\r\n return (\r\n <div className='ms-header__preferred-store-container'>\r\n <button className='ms-header__preferred-store-btn msc-btn' color='secondary' aria-label={resources.headerPreferredStoreAriaLabel} onClick={this.handleClick} >\r\n <span className='ms-header__preferred-store-text'>{storeName}</span>\r\n </button>\r\n {slots.storeSelector}\r\n </div>\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private async _findPreferreStoreOnClick(props: IConnellyb2bHeaderProps<IConnellyb2BHeaderData>): Promise<void> {\r\n const { data: { storeSelectorStateManager: { result: storeSelectorStateManager } }, modules } = props;\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n storeSelectorStateManager.openDialog({\r\n id: storeSelectorId,\r\n showMapViewLink: false,\r\n onLocationSelected: orgUnitLocation => {\r\n return Promise.resolve();\r\n }\r\n }).catch((error: Error) => {\r\n if (props.telemetry) {\r\n props.telemetry.error(error.message);\r\n props.telemetry.debug('Unable to set preferred store');\r\n }\r\n return;\r\n });\r\n }\r\n}\r\n\r\nexport default HeaderPreferredStore;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\r\n ModalBody, ModalHeader, onTelemetryClick, Popover, TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { IConnellyb2BHeaderData } from './connellyb2b-header.data';\r\nimport { IConnellyb2bHeaderProps, IConnellyb2bHeaderResources, IMyAccountLinksData } from './connellyb2b-header.props.autogenerated';\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends IConnellyb2bHeaderProps<IConnellyb2BHeaderData>, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n search: React.ReactNode[];\r\n siteOptions: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n accountLinks?: React.ReactNode[];\r\n preferredStore?: React.ReactNode;\r\n\r\n logoLinkSvg: string;\r\n}\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent<IConnellyb2bHeaderProps<IConnellyb2bHeaderData>>}\r\n */\r\nclass Header extends React.PureComponent<IConnellyb2bHeaderProps<IConnellyb2BHeaderData>, IHeaderState> {\r\n private popOverRef: React.RefObject<HTMLButtonElement>;\r\n private telemetryContent: ITelemetryContent;\r\n @computed public get displayName(): Readonly<string | undefined> {\r\n const customer = this.props.data.accountInformation?.result;\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n\r\n constructor(props: IConnellyb2bHeaderProps<IConnellyb2BHeaderData>) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: { accountInformation,\r\n cart: { result: cart },\r\n storeSelectorStateManager: {result: storeSelectorStateManager}\r\n },\r\n context: {\r\n request: {\r\n user\r\n }\r\n },\r\n context,\r\n resources: {\r\n cartLabel,\r\n cartQtyLabel\r\n }\r\n } = this.props;\r\n const { logoLink, logoImage, logoLinkSvg } = this.props.config;\r\n const headerClassName = classnames('ms-header', this.props.config.className);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const menuBarSlot = this._getSlot('connellyb2bMenuBar');\r\n const searchSlot = this._getSlot('search');\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n\r\n const LogoLinkSvg = logoLinkSvg ? logoLinkSvg : 'No Link';\r\n\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as IConnellyb2bHeaderProps<IConnellyb2BHeaderData>),\r\n ...(this.state),\r\n logo: <Logo {...{ link: logoLink, image: logoImage, className: 'ms-header__logo', gridSettings: this.props.context.request.gridSettings, requestContext: this.props.context.request, telemetryContent: this.telemetryContent }} />,\r\n wishListIconDesktop: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-desktop'\r\n showButtonTooltip={true}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n />\r\n ),\r\n wishListIconMobile: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-mobile'\r\n showButtonTooltip={true}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n />\r\n ),\r\n cartIcon: (cartIconSlot && cartIconSlot.length > 0)\r\n ? cartIconSlot[0]\r\n : cart && <CartIconComponent cartLabel={cartLabel} cartQtyLabel={cartQtyLabel} context={context} id={id} typeName={typeName} telemetryContent={this.telemetryContent} data={{ cart: cart }} />,\r\n navIcon: <NavIcon {...{ resources: this.props.resources, isExpanded: !this.state.mobileMenuCollapsed, targetId: navbarKey, toggleNavBar: this._toggleNavbar, telemetryContent: this.telemetryContent }} />,\r\n menuBar: menuBarSlot && menuBarSlot.length && menuBarSlot || [],\r\n search: searchSlot && searchSlot.length && searchSlot || [],\r\n siteOptions: siteOptionsSlot && siteOptionsSlot.length && siteOptionsSlot || [],\r\n className: headerClassName,\r\n logoLinkSvg: LogoLinkSvg,\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('inside-xxl always-flex justify')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: 'ms-header__modal'\r\n },\r\n MobileMenuHeader: (\r\n <ModalHeader\r\n className='ms-header__mobile-hamburger-menu-header'\r\n toggle={this._toggleNavbar}\r\n />\r\n ),\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body',\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links',\r\n },\r\n AccountInfoDropdownParentContainer: {\r\n className: 'ms-header__account-info'\r\n },\r\n AccountInfoDropdownPopoverConentContainer: customer && this.displayName && {\r\n tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover,\r\n } || undefined,\r\n signInLink: this._getSigninButton(customer, user, this.props.resources),\r\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\r\n accountLinks: this._getAccountLinks(customer),\r\n preferredStore: preferredStoreSlot\r\n && preferredStoreSlot.length\r\n && storeSelectorStateManager\r\n && (<HeaderPreferredStore {...this.props}/>)\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /* Handle link text change*/\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent) => {\r\n if (this.props.config.myAccountLinks && this.props.config.myAccountLinks[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\r\n }\r\n }\r\n\r\n private _getSlot(slotName: string): React.ReactNode[] | null {\r\n const { slots } = this.props;\r\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\r\n }\r\n\r\n private _getSigninButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IConnellyb2bHeaderResources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return !customer && (\r\n <Button\r\n className='ms-header__signin-button'\r\n title={resources.signInLinkText}\r\n href='https://www.connellycart.com/homesignedin'\r\n aria-label={resources.signInLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signin-button-text' aria-hidden={true}><span>{resources.signInLinkText}</span></span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getSignOutButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IConnellyb2bHeaderResources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n <Button\r\n className={'ms-header__signout-button'}\r\n title={resources.signOutLinkText}\r\n href={user && user.signOutUrl || ''}\r\n aria-label={resources.signOutLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signout-button-text' aria-hidden={true}><span>{resources.signOutLinkText}</span></span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n <Button\r\n innerRef={this.popOverRef}\r\n className={'ms-header__profile-button'}\r\n aria-describedby='myprofilePopover'\r\n onClick={this._togglePopover}\r\n color='link'\r\n aria-expanded={this.state.signinPopoverOpen}\r\n {...attributes}\r\n >\r\n <span className='ms-profile-button-text'>{this.displayName}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if(!customer || ! this.displayName || !myAccountLinks || !myAccountLinks.length) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n <MsDyn365.Link\r\n key={index}\r\n link={editableLink}\r\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\r\n />\r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(e: KeyboardEvent): void {\r\n if (e.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n }\r\n }\r\n}\r\n\r\nexport default Header;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\nimport Transition from 'react-transition-group/Transition';\r\n\r\nimport { mapToCssModules, TransitionStatuses } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICollapseProps } from './Collapse.props';\r\n\r\nexport interface ICollapseState {\r\n height: number | null;\r\n}\r\n\r\ntype IHash = {\r\n [key in TransitionStatuses]: string;\r\n};\r\n\r\n/**\r\n * This is the controlled version of a Collapse component, and as such the toggle behavior is expected to be handled in a parent component.\r\n * @see See [Uncontrolled Components - React](https://reactjs.org/docs/uncontrolled-components.html) to learn more.\r\n * @visibleName Collapse (controlled)\r\n */\r\nexport default class Collapse extends React.Component<ICollapseProps, ICollapseState> {\r\n public static defaultProps: Partial<ICollapseProps> = {\r\n isOpen: false,\r\n tag: 'div',\r\n timeout: 0\r\n };\r\n\r\n public props: ICollapseProps;\r\n\r\n public state: ICollapseState;\r\n\r\n private readonly _transitionStatusToClassHash: IHash = {\r\n entering: 'collapse',\r\n entered: 'collapse show',\r\n exiting: 'collapse',\r\n exited: 'collapse'\r\n };\r\n\r\n private readonly _tagRef: React.RefObject<HTMLElement> = React.createRef<HTMLElement>();\r\n\r\n constructor(props: ICollapseProps) {\r\n super(props);\r\n this.props = props;\r\n\r\n this.state = {\r\n height: 0\r\n };\r\n\r\n this._onEntering = this._onEntering.bind(this);\r\n this._onExit = this._onExit.bind(this);\r\n this._onExited = this._onExited.bind(this);\r\n this._onExiting = this._onExiting.bind(this);\r\n this._reevaluateHeight = this._reevaluateHeight.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n window && window.addEventListener('resize', this._reevaluateHeight);\r\n }\r\n\r\n public componentDidUpdate(nextProps: ICollapseProps): void {\r\n if (nextProps.children !== this.props.children) {\r\n this._reevaluateHeight();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window && window.removeEventListener('resize', this._reevaluateHeight);\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: ICollapseProps,\r\n nextState: ICollapseState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n tag,\r\n isOpen,\r\n className,\r\n children,\r\n navbar,\r\n cssModule,\r\n\r\n in: collapseIn,\r\n mountOnEnter,\r\n unmountOnExit,\r\n appear,\r\n enter,\r\n exit,\r\n timeout,\r\n onEnter,\r\n onEntering,\r\n onEntered,\r\n onExit,\r\n onExiting,\r\n onExited,\r\n\r\n ...otherProps\r\n } = this.props;\r\n\r\n const Tag = tag || 'div';\r\n const transitionProps = {\r\n in: collapseIn,\r\n mountOnEnter,\r\n unmountOnExit,\r\n appear,\r\n enter,\r\n exit,\r\n onEnter,\r\n onEntering,\r\n onEntered,\r\n onExit,\r\n onExiting,\r\n onExited\r\n };\r\n\r\n //const { height } = this.state;\r\n //const style = height === null || height === 0 ? null : { minHeight: height };\r\n\r\n return (\r\n <Transition\r\n {...transitionProps}\r\n in={isOpen}\r\n timeout={timeout || 0}\r\n onEntering={this._onEntering}\r\n onExit={this._onExit}\r\n onExiting={this._onExiting}\r\n onExited={this._onExited}\r\n >\r\n {(status: TransitionStatuses) => {\r\n const collapseClass = this._getTransitionClass(status);\r\n const classes = mapToCssModules(classNames(className, collapseClass, navbar && 'navbar-collapse'), cssModule);\r\n\r\n return (\r\n <Tag\r\n {...otherProps} className={classes} ref={this._tagRef}\r\n >\r\n {children}\r\n </Tag>\r\n );\r\n }}\r\n </Transition>\r\n );\r\n }\r\n\r\n private _reevaluateHeight(): void {\r\n const node = this._tagRef.current;\r\n if (node !== null && node.firstElementChild && node.firstElementChild.scrollHeight > 0) {\r\n this.setState({ height: node.firstElementChild.scrollHeight });\r\n }\r\n }\r\n\r\n private _getTransitionClass(status: TransitionStatuses): string {\r\n return this._transitionStatusToClassHash[status] || 'collapse';\r\n }\r\n\r\n private _onEntering(node: HTMLElement, isAppearing: boolean): void {\r\n this.setState({ height: node.scrollHeight });\r\n\r\n //if (this.props.onEntering) {\r\n // this.props.onEntering(node, isAppearing);\r\n //}\r\n }\r\n\r\n private _onExit(node: HTMLElement): void {\r\n this.setState({ height: node.scrollHeight });\r\n\r\n if (this.props.onExit) {\r\n this.props.onExit(node);\r\n }\r\n }\r\n\r\n private _onExiting(node: HTMLElement): void {\r\n this.setState({ height: 0 });\r\n\r\n if (this.props.onExiting) {\r\n this.props.onExiting(node);\r\n }\r\n }\r\n\r\n private _onExited(node: HTMLElement): void {\r\n this.setState({ height: null });\r\n\r\n if (this.props.onExited) {\r\n this.props.onExited(node);\r\n }\r\n }\r\n}\r\n","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React from \"react\";\nexport default (({\n styles = {},\n ...props\n}) => /*#__PURE__*/React.createElement(\"svg\", _extends({\n version: \"1.1\",\n id: \"Layer_1\",\n xmlns: \"http://www.w3.org/2000/svg\",\n x: \"0\",\n y: \"0\",\n viewBox: \"0 0 630.97 117.83\",\n xmlSpace: \"preserve\"\n}, props), /*#__PURE__*/React.createElement(\"path\", {\n className: styles[\"st0\"] || \"st0\",\n d: \"M157.17 2.87c-31 0-56.69 25.4-56.69 56.4 0 32.15 25.4 56.4 56.69 56.4s56.69-24.25 56.69-56.4c0-31-25.69-56.4-56.69-56.4zm0 100.18c-23.39 0-43.2-19.09-43.2-43.78 0-23.83 17.8-43.77 43.2-43.77 25.4 0 43.2 19.95 43.2 43.77 0 24.69-19.8 43.78-43.2 43.78zM429 103.05c-23.39 0-43.2-19.09-43.2-43.78h99.89c0-31-25.69-56.4-56.69-56.4-31 0-56.69 25.4-56.69 56.4 0 32.15 25.4 56.4 56.69 56.4 26.77 0 49.23-17.76 55.16-43.02h-14c-5.62 17.88-22.21 30.4-41.16 30.4zm0-87.55c20.38 0 35.87 12.84 41.19 30.22h-82.37C393.15 28.34 408.63 15.5 429 15.5zM56.69 103.05c-23.39 0-43.2-19.09-43.2-43.78 0-23.83 17.8-43.77 43.2-43.77 13.24 0 24.42 5.42 32.08 13.98l6.88-11.02C85.44 8.82 71.69 2.87 56.69 2.87 25.69 2.87 0 28.27 0 59.27c0 32.15 25.4 56.4 56.69 56.4 15.08 0 28.8-5.64 38.96-15.07l-7.17-11.66c-7.97 8.73-19.37 14.11-31.79 14.11zM347.06 5.17v79.94l-26.71-27.99V5.17h-13.49v37.82L265.83 0v42.12L225.62 0v113.38h13.49V32.72l26.71 27.99v52.67h13.49V74.85l41.03 42.99V75.71l40.2 42.12V5.17h-13.48zm-40.21 79.94l-27.54-28.85V32.72l27.54 28.85v23.54zM510.96 5.17h-13.48v108.21h56.49v-12.34h-43.01z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n className: styles[\"st0\"] || \"st0\",\n d: \"M531.2 5.16h-13.49v89.16h36.26V82.85H531.2zM615.47 5.17l-26.56 46.21-26.55-46.21h-15.5l35.31 61.14v47.07h13.49V66.31l35.31-61.14zM170.13 33.47c9.32 0 17.38 5.25 21.13 12.95-5.21-13.91-18.5-23.58-34.1-23.58-20.12 0-36.43 16.31-36.43 36.43s16.31 36.43 36.43 36.43 36.43-16.31 36.43-36.43h-10.22c0 15.35-12.28 27.8-27.34 27.8-15.38 0-27.7-12.43-27.7-27.83 0-14.04 8.02-24.55 19.5-29.82-10.52 4.9-17.88 16.7-17.88 28.27 0 14.61 11.3 26.39 25.41 26.39 13.82 0 25.08-11.08 25.08-24.75l-10.05-.02c0 9.07-7.34 16.42-16.24 16.42-9.54 0-16.95-7.92-16.95-17.85 0-10.39 6.01-19.51 14.86-24.37-7.52 4.55-12.51 13.95-12.51 22.63 0 9.23 6.31 16.58 14.27 16.58 7.43 0 13.56-5.99 13.56-13.39l-10.21-.03c0 2.62-2.21 4.75-4.71 4.75-3.4 0-5.73-3.4-5.73-7.84 0-12.52 10.48-22.74 23.4-22.74z\"\n})));","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport Collapse from './collapse/Collapse';\r\nimport * as React from 'react';\r\n//import classnames from 'classnames';\r\n// import { Customer } from '@msdyn365-commerce/retail-proxy';\r\n// import { AsyncResult } from '@msdyn365-commerce/core';\r\nimport { IHeaderViewProps } from './connellyb2b-header';\r\n//@ts-ignore\r\nimport Logosvg from '../../../public/connelly/img/ConnellyWebWhite.svg';\r\n\r\nconst headerView: React.FC<IHeaderViewProps> = props => {\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer,\r\n Divider,\r\n logoLinkSvg\r\n } = props;\r\n return (\r\n <Module {...HeaderTag}>\r\n <Node {...HeaderContainer}>\r\n <Node {...HeaderTopBarContainer}>\r\n\r\n {/* This is the area that is majorly revamped. Subtract components as needed. */}\r\n\r\n <div className='connellyb2b-logo always-flex align-items-center'>\r\n {props.navIcon}\r\n <Node {...Divider}/>\r\n <div className='connellySvg'><a href={logoLinkSvg}><Logosvg /></a></div>\r\n </div>\r\n \r\n <div className='connellyb2b-other always-flex align-items-center'>\r\n <Node {...Divider}/>\r\n {_renderReactFragment(props.search)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.cartIcon}\r\n {_renderReactFragment(props.siteOptions)}\r\n </div>\r\n\r\n </Node>\r\n {_renderCollapseMenu(props)}\r\n \r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n <Collapse className={'ms-header__collapsible-hamburger'} isOpen={!mobileMenuCollapsed}>\r\n <Node {...MobileMenuLinksContainer}>\r\n <div className='right-here'>\r\n {_renderReactFragment(props.menuBar)}\r\n {/* {_renderMobileAccountBlock(props, true)}\r\n {props.wishListIconMobile} */}\r\n </div>\r\n </Node>\r\n </Collapse>\r\n );\r\n}\r\n\r\n// const renderCustomerName = (accountInformation: AsyncResult<Customer>): React.ReactChild => {\r\n// const customer = accountInformation && accountInformation.result;\r\n// return (\r\n// <>{customer && customer.FirstName}</>\r\n// );\r\n// };\r\n\r\n// function _renderMobileAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\r\n// const {\r\n// AccountInfoDropdownParentContainer,\r\n// signOutLink,\r\n// signInLink,\r\n// data,\r\n// accountLinks } = props;\r\n\r\n// if (AccountInfoDropdownParentContainer) {\r\n// const accountClassName = classnames('ms-header__drawer', AccountInfoDropdownParentContainer.className, renderForMobile ? 'account-mobile' : 'account-desktop');\r\n\r\n// if (accountLinks) {\r\n// return (\r\n// <Drawer className={accountClassName} openGlyph='ms-header__drawer-open' closeGlyph='ms-header__drawer-close' glyphPlacement='end' toggleButtonText={renderCustomerName(data.accountInformation)}>\r\n// <div>\r\n// {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\r\n// {signOutLink}\r\n// </div>\r\n// </Drawer>\r\n// );\r\n// } else if (signInLink) {\r\n// return (\r\n// <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\r\n// {signInLink}\r\n// </Node>\r\n// );\r\n// }\r\n// }\r\n// return null;\r\n// }\r\n\r\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {accountInfoDropdownButton}\r\n <Node {...AccountInfoDropdownPopoverConentContainer}>\r\n { accountLinks ? accountLinks.map(link => link) : false }\r\n {signOutLink}\r\n </Node>\r\n </Node>\r\n );\r\n } else if (signInLink) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {signInLink}\r\n </Node>\r\n );\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n <React.Fragment>\r\n {items && items.length\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return <React.Fragment key={index}>{slot}</React.Fragment>;\r\n })\r\n : null}\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nexport default headerView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: ILinkData;\r\n className?: string;\r\n}\r\n\r\nexport interface ILinkData {\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n linkText?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Logo component\r\n * @extends {React.PureComponent<ILogoConfig>}\r\n */\r\nexport class Logo extends React.PureComponent<ILogoProps> {\r\n public render():JSX.Element {\r\n return(\r\n <div className={this.props.className}>\r\n {this._renderLogo(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n private _renderLogo(config: ILogoProps):JSX.Element {\r\n if(config.link && config.link.linkUrl.destinationUrl) {\r\n return(\r\n <a\r\n href={config.link.linkUrl.destinationUrl}\r\n aria-label={config.link.ariaLabel}\r\n target={config.link.openInNewTab ? '_blank' : undefined}\r\n >\r\n {this._renderImage(config)}\r\n </a>\r\n );\r\n }\r\n return(\r\n this._renderImage(config)\r\n );\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=132&h=28&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=160&h=48&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n <Msdyn365.Image\r\n {...config.image}\r\n gridSettings={this.props.gridSettings!}\r\n imageSettings={config && config.image && config.image.imageSettings || defaultImageSettings}\r\n loadFailureBehavior='default'\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default Logo;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport { observer } from 'mobx-react';\r\nimport { IKentHeaderResources } from '../kent-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IKentHeaderResources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component\r\n * @extends {React.PureComponent<INavIconProps>}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.Component<INavIconProps> {\r\n public render():JSX.Element {\r\n return (\r\n <Button\r\n className='ms-header__nav-icon'\r\n onClick={this.props.toggleNavBar}\r\n title={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-expanded={this.props.isExpanded}\r\n aria-controls={this.props.targetId}\r\n />\r\n );\r\n }\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Button, IModuleProps, INodeProps, KeyCodes, Modal, ModalBody, ModalHeader, Popover } from '@msdyn365-commerce-modules/utilities';\r\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components'\r\nimport { IRequestContextUser } from '@msdyn365-commerce/core';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { Logo, NavIcon } from './components';\r\nimport { IKentHeaderData } from './kent-header.data';\r\nimport { IKentHeaderProps, IKentHeaderResources, IMyAccountLinksData } from './kent-header.props.autogenerated';\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends IKentHeaderProps<IKentHeaderData>, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n search: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n accountLinks?: React.ReactNode[];\r\n}\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent<IKentHeaderProps<IKentHeaderData>>}\r\n */\r\nclass Header extends React.PureComponent<IKentHeaderProps<IKentHeaderData>, IHeaderState> {\r\n private popOverRef: React.RefObject<HTMLButtonElement>;\r\n\r\n constructor(props: IKentHeaderProps<IKentHeaderData>) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false\r\n };\r\n }\r\n\r\n public componentDidMount(): void {\r\n window && window.addEventListener('keydown', this._keydown);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window && window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n slots,\r\n typeName,\r\n data: { accountInformation,\r\n cart: { result: cart }\r\n },\r\n context: {\r\n request: {\r\n user\r\n }\r\n },\r\n context,\r\n resources: {\r\n cartLabel,\r\n cartQtyLabel\r\n }\r\n } = this.props;\r\n const { logoLink, logoImage } = this.props.config;\r\n const headerClassName = classnames('ms-header', this.props.config.className);\r\n const navbarKey = 'header-nav-mobile';\r\n\r\n const customer = accountInformation && accountInformation.result;\r\n\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as IKentHeaderProps<IKentHeaderData>),\r\n ...(this.state),\r\n logo: <Logo {...{ link: logoLink, image: logoImage, className: 'ms-header__logo', gridSettings: this.props.context.request.gridSettings }} />,\r\n wishListIconDesktop: <WishListIconComponent className='ms-header__wishlist-desktop' wishlistTooltipText={this.props.resources.wishlistTooltipText} context={context} id={id} typeName={typeName} data={{}} />,\r\n wishListIconMobile: <WishListIconComponent className='ms-header__wishlist-mobile' wishlistTooltipText={this.props.resources.wishlistTooltipText} context={context} id={id} typeName={typeName} data={{}} />,\r\n cartIcon: cart && <CartIconComponent cartLabel={cartLabel} cartQtyLabel={cartQtyLabel} context={context} id={id} typeName={typeName} data={{ cart: cart }} />,\r\n navIcon: <NavIcon {...{ resources: this.props.resources, isExpanded: !this.state.mobileMenuCollapsed, targetId: navbarKey, toggleNavBar: this._toggleNavbar }} />,\r\n menuBar: slots && slots.kentMenuBar && slots.kentMenuBar.length && slots.kentMenuBar || [],\r\n search: slots && slots.search && slots.search.length && slots.search || [],\r\n className: headerClassName,\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('ms-header__topbar')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: 'ms-header__modal'\r\n },\r\n MobileMenuHeader: (\r\n <ModalHeader\r\n className='ms-header__mobile-hamburger-menu-header'\r\n toggle={this._toggleNavbar}\r\n />\r\n ),\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body',\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links',\r\n },\r\n AccountInfoDropdownParentContainer: customer && {\r\n className: 'ms-header__account-info'\r\n } || undefined,\r\n AccountInfoDropdownPopoverConentContainer: customer && customer.FirstName && {\r\n tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover,\r\n } || undefined,\r\n signInLink: this._getSigninButton(customer, user, this.props.resources),\r\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\r\n accountLinks: this._getAccountLinks(customer)\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _getSigninButton(customer: Customer | undefined, user: IRequestContextUser | undefined, resources: IKentHeaderResources): React.ReactNode | undefined {\r\n return customer && !customer.FirstName && (\r\n <Button\r\n className='ms-header__signin-button'\r\n title={resources.signInLinkText}\r\n href={user && user.signInUrl}\r\n aria-label={resources.signInLinkAriaText}\r\n >\r\n <span className='ms-header__signin-button-text' aria-hidden={true}>{resources.signInLinkText}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getSignOutButton(customer: Customer | undefined, user: IRequestContextUser | undefined, resources: IKentHeaderResources): React.ReactNode | undefined {\r\n return customer && customer.FirstName && (\r\n <Button\r\n className={'ms-header__signout-button'}\r\n title={resources.signOutLinkText}\r\n href={user && user.signOutUrl || ''}\r\n aria-label={resources.signOutLinkAriaText}\r\n >\r\n <span className='ms-header__signout-button-text' aria-hidden={true}>{resources.signOutLinkText}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\r\n return customer && customer.FirstName && (\r\n <Button\r\n innerRef={this.popOverRef}\r\n className={'ms-header__profile-button'}\r\n aria-describedby='myprofilePopover'\r\n onClick={this._togglePopover}\r\n color='link'\r\n aria-expanded={this.state.signinPopoverOpen}\r\n >\r\n <span className='ms-profile-button-text'>{customer.FirstName}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n\r\n return customer && customer.FirstName && myAccountLinks && myAccountLinks.length ?\r\n myAccountLinks.map((cta: IMyAccountLinksData, index: number) => (\r\n <Button\r\n className='ms-signin-info__account-link-button'\r\n key={index}\r\n href={cta.linkUrl.destinationUrl}\r\n color='link'\r\n aria-label={cta.ariaLabel || ''}\r\n target={cta.openInNewTab ? '_blank' : undefined}\r\n >\r\n {cta.linkText || ''}\r\n </Button>\r\n ))\r\n : undefined;\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(e: KeyboardEvent): void {\r\n if (e.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n }\r\n }\r\n}\r\n\r\nexport default Header;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IHeaderViewProps } from './kent-header';\r\nimport { Collapse, Drawer, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nconst headerView: React.FC<IHeaderViewProps> = props => {\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer,\r\n //Divider,\r\n } = props;\r\n return (\r\n <Module {...HeaderTag}>\r\n <Node {...HeaderContainer}>\r\n <Node {...HeaderTopBarContainer}>\r\n <div className='ob-top-header'>\r\n <div className='always-flex justify inside-xxl'>\r\n <div id='ob-top-logos' className='align-vertical'>\r\n <a role='button' className='up-obrien' href='https://obrien.com' />\r\n <a role='button' className='up-margaritaville' href='https://obrien.com/margaritaville' />\r\n <a role='button' className='up-hydroslide' href='https://obrien.com/obrien-watersports/hydroslide/5637195665.c' />\r\n </div>\r\n <div className='ob-top-menu always-flex'>\r\n {_renderReactFragment(props.search)}\r\n {_renderAccountBlock(props, false)}\r\n {props.wishListIconDesktop}\r\n {props.cartIcon}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className='ob-low-header'>\r\n <div className='always-flex justify inside-xxl'>\r\n {props.logo}\r\n {props.navIcon}\r\n {_renderReactFragment(props.menuBar)}\r\n </div>\r\n </div>\r\n </Node>\r\n {_renderCollapseMenu(props)}\r\n\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n <Collapse className={'ms-header__collapsible-hamburger'} isOpen={!mobileMenuCollapsed}>\r\n <Node {...MobileMenuLinksContainer}>\r\n {_renderReactFragment(props.menuBar)}\r\n {_renderReactFragment(props.search)}\r\n {_renderMobileAccountBlock(props, true)}\r\n {props.wishListIconMobile}\r\n </Node>\r\n\r\n\r\n </Collapse>\r\n );\r\n}\r\nconst renderCustomerName = (accountInformation: AsyncResult<Customer>): React.ReactChild => {\r\n const customer = accountInformation && accountInformation.result;\r\n return (\r\n <>{customer && customer.FirstName}</>\r\n );\r\n};\r\n\r\nfunction _renderMobileAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n signOutLink,\r\n signInLink,\r\n data,\r\n accountLinks } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n const accountClassName = classnames('ms-header__drawer', AccountInfoDropdownParentContainer.className, renderForMobile ? 'account-mobile' : 'account-desktop');\r\n\r\n if (accountLinks) {\r\n return (\r\n <Drawer className={accountClassName} openGlyph='ms-header__drawer-open' closeGlyph='ms-header__drawer-close' glyphPlacement='end' toggleButtonText={renderCustomerName(data.accountInformation)}>\r\n <div>\r\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\r\n {signOutLink}\r\n </div>\r\n </Drawer>\r\n );\r\n } else if (signInLink) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\r\n {signInLink}\r\n </Node>\r\n );\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction _renderAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n const accountClassName = classnames(AccountInfoDropdownParentContainer.className, renderForMobile ? 'account-mobile' : 'account-desktop');\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\r\n {accountInfoDropdownButton}\r\n <Node {...AccountInfoDropdownPopoverConentContainer}>\r\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\r\n {signOutLink}\r\n </Node>\r\n </Node>\r\n );\r\n } else if (signInLink) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\r\n {signInLink}\r\n </Node>\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n <React.Fragment>\r\n {items && items.length\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return <React.Fragment key={index}>{slot}</React.Fragment>;\r\n })\r\n : null}\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nexport default headerView;\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 { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return (\r\n dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\r\n ) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry\r\n): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (error) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { ProductListInventoryFilteringOptions } from '../actions';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent<IChoiceSummaryProps> {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n let { selectedChoices } = this.props;\r\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n selectedChoices = selectedChoices.filter(choice => {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\r\n );\r\n return parent && parent.RecordId !== channelInventoryConfigurationId;\r\n });\r\n }\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly<IChoiceSummaryProps>) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n <div className='msc-choice-summary'>\r\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\r\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\r\n {items.map((item: IRefinerMap) => {\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n <li className='msc-choice-summary__list-item' key={item.key}>\r\n <a\r\n className='msc-choice-summary__item'\r\n href={this.props.urlBuilder(item.value, false)}\r\n aria-label={`${item.value.LeftValueBoundString} ${choiceAriaLabel}`}\r\n onClick={this._onClick}\r\n role='button'\r\n id={item.key}\r\n {...attribute}\r\n >\r\n {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\r\n ? item.value.LeftValueBoundString\r\n : (item.value.LeftValueBoundLocalizedString ||\r\n item.value.LeftValueBoundLocalizedString === undefined) &&\r\n item.value.RefinerRecordId === 0\r\n ? item.key\r\n : item.value.LeftValueBoundString}\r\n <span\r\n className={`${this.closeButtonGlyph} msc-choice-summary__glyph`}\r\n aria-label={closeAriaLabel}\r\n />\r\n </a>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n {items.length > 0 && clearAllText && (\r\n <a\r\n href={this.props.urlBuilder({}, true)}\r\n className='msc-choice-summary__clear-all'\r\n {...clearAllAttributes}\r\n onClick={this._onClick}\r\n >\r\n {clearAllText}\r\n </a>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else if (productRefinerValue.RefinerRecordId === 0) {\r\n const filterValue = refinerValues?.Values.find(r => r.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n if (refinerName === 'Rating' || refinerName === 'Price') {\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\r\n }\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}`);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n let result = amount;\r\n\r\n try {\r\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\r\n } catch (error) {\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\r\n return (\r\n <span className='ms-search-result-container__no-results-message'>\r\n <h5 className='error-text'>\r\n {` `}\r\n {text}\r\n {` `}\r\n </h5>\r\n </span>\r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ILiquid23SearchResultContainerResources } from '../liquid23-search-result-container.props.autogenerated';\r\n\r\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: ILiquid23SearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n recommendation?: string;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent,\r\n recommendation\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const heading =\r\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n <div className='ms-feature-search-result__item'>\r\n <a\r\n href={productUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n {...attribute}\r\n aria-label={product.Name}\r\n >\r\n <div className='msc-feature-search-result__item__image'>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n fallbackImage,\r\n context.actionContext.requestContext\r\n )}\r\n </div>\r\n </a>\r\n <div className='msc-feature-search-result__item__detail'>\r\n <p className='msc-feature-search-result__item__heading'>{heading}</p>\r\n {renderProductTitle(product?.Name)}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n altText?: string,\r\n fallbackImage?: string,\r\n context?: IRequestContext\r\n): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return <Image {...img} {...imageProps} loadFailureBehavior='empty' requestContext={context} />;\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\n return <h1 className='msc-feature-search-result__item__product-title'>{title}</h1>;\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 * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (\r\n <a className={className} href={href} aria-label={ariaLabel}>\r\n {' '}\r\n {text}{' '}\r\n </a>\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 { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\r\n {text}\r\n </button>\r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: <ModalBody className='msc-review-modal-body' />\r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <Modal\r\n autoFocus\r\n applicationNode='renderPage'\r\n returnFocusRef={props.returnRef}\r\n isOpen={props.isOpen}\r\n toggle={props.onModalToggle}\r\n className='msc-search-result-modal'\r\n zIndex={1050}\r\n />\r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return <ModalHeader toggle={props.onModalToggle}>{props.resources.modalTitle}</ModalHeader>;\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <ModalFooter>\r\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\r\n {props.resources.modalCloseButtonText}\r\n </Button>\r\n </ModalFooter>\r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ILiquid23SearchResultContainerResources } from '../liquid23-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: ILiquid23SearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n productComparisonButton?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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\nexport function 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\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n productComparisonButton,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled,\r\n productsDimensionAvailabilities\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n <li className='ms-product-search-result__item' key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={allowBackNavigation}\r\n id={moduleId}\r\n key={product.RecordId}\r\n typeName={moduleType}\r\n data={{ product }}\r\n quickViewButton={quickviewSlot}\r\n productComparisonButton={productComparisonButton}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\r\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\r\n dimensionAvailability =>\r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n )}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\r\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private readonly minInput: React.RefObject<HTMLInputElement>;\r\n\r\n private readonly maxInput: React.RefObject<HTMLInputElement>;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef<HTMLInputElement>();\r\n this.maxInput = React.createRef<HTMLInputElement>();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return [\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ];\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (\r\n sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string\r\n ): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return [\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ];\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\r\n <label className={minLabelClassName}>\r\n {refineItemCommonProps.minLabel}\r\n <input\r\n className={minInputClassName}\r\n onChange={this._changeMin}\r\n onFocus={this._changeMin}\r\n onBlur={this._finishChangeMin}\r\n value={formattedSelectedMin}\r\n ref={this.minInput}\r\n />\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel}\r\n <input\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._changeMax}\r\n onFocus={this._changeMax}\r\n onBlur={this._finishChangeMax}\r\n value={formattedSelectedMax}\r\n ref={this.maxInput}\r\n />\r\n </label>\r\n {validationErrorMin && (\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\r\n {validationErrorMin}\r\n </span>\r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\r\n {validationErrorMax}\r\n </span>\r\n )}\r\n </form>\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n return (\r\n <Slider\r\n className='ms-refine-submenu__range-refiner'\r\n key={this.state.sliderId}\r\n sliderKey={sliderKey}\r\n id={this.state.sliderId}\r\n inForm={false}\r\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\r\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\r\n step={1}\r\n orientation='horizontal'\r\n labels={this.state.labels}\r\n showLabels\r\n showTooltip\r\n sliderThumbs={this.state.sliderThumbs}\r\n onChangeEnd={this._onRangeUpdateEnd}\r\n onChange={debounce(this._onRangeUpdate, 500)}\r\n handleTooltipText={this._handleRangeTooltipText}\r\n {...ariaAttributes}\r\n />\r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n return amount || '';\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(() => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}\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 { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\r\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n return this._renderRating(\r\n productRefinerValue,\r\n parentProductRefinerHierarchy,\r\n isChecked,\r\n context,\r\n index,\r\n telemetryContent,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel\r\n );\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productCount = productRefinerValue.Count || 0;\r\n let refineMenuItemAriaLabel;\r\n if (productCount === 1) {\r\n refineMenuItemAriaLabel = refineItemAriaLabel\r\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\r\n : '';\r\n } else {\r\n refineMenuItemAriaLabel = refineItemsAriaLabel\r\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\r\n : '';\r\n }\r\n\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\r\n\r\n let className = 'ms-refine-submenu-item';\r\n if (shouldDisplayAsSwatch) {\r\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\r\n }\r\n\r\n // If the swatch has no color or image specified, it should be displayed as text.\r\n // We don't use swatch logic to display the number of the results found together with the text.\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasContentSwatch = hasColor || hasImage;\r\n\r\n return (\r\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\r\n <a\r\n key={selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={hasColor ? -1 : 0}\r\n onClick={this._onClick}\r\n className={itemTypeClassName}\r\n role={inputType}\r\n aria-label={refineMenuItemAriaLabel}\r\n aria-checked={!!selectedRefinementCriterion}\r\n {...attribute}\r\n {...attrs}\r\n >\r\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\r\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\r\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n\r\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\r\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\r\n return shouldDisplayAsSwatch;\r\n }\r\n\r\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n const swatchItems = [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ];\r\n\r\n return (\r\n <SwatchComponent\r\n className='ms-refine-submenu-item__swatch'\r\n apiSettings={this.props.context.request.apiSettings}\r\n list={swatchItems}\r\n isSelectionEnabled={false}\r\n isRefineItem\r\n />\r\n );\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n private _renderRating(\r\n productRefinerValue: ProductRefinerValue,\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean,\r\n context: ICoreContext,\r\n index?: number,\r\n telemetryContent?: ITelemetryContent,\r\n ratingUserCountAriaLabel?: string,\r\n ratingSingleUserCountAriaLabel?: string\r\n ): JSX.Element | undefined {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(\r\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\r\n );\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n const defaultChkProductCount = 1;\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n const productCountAriaLabelValue =\r\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\r\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\r\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\r\n return (\r\n <li\r\n className='ms-refine-submenu-item ms-refine-submenu-item__rating'\r\n role={!this.props.isMobileView ? 'presentation' : undefined}\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\r\n >\r\n <a\r\n href={this._getRefinerUrl()}\r\n role='option'\r\n aria-selected={isChecked}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\r\n ${productCountAriaLabelValue!}`}\r\n onClick={this._onClick}\r\n {...attribute}\r\n >\r\n <RatingComponent\r\n className={ratingComponentClass}\r\n avgRating={refinerRating}\r\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\r\n hideCount={false}\r\n readOnly\r\n ariaLabel=''\r\n context={context}\r\n id={this.props.moduleId}\r\n typeName={this.props.moduleTypeName}\r\n data={{}}\r\n />\r\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n return undefined;\r\n }\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\r\n return null;\r\n }\r\n\r\n const className = classnames(\r\n 'ms-refine-submenu',\r\n 'list-group',\r\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\r\n );\r\n\r\n return (\r\n <div className={className}>\r\n <Button\r\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label={productRefinerHierarchy.KeyName}\r\n onClick={this._onToggleSubmenu}\r\n aria-expanded={this.state.expanded}\r\n >\r\n {productRefinerHierarchy.KeyName}\r\n </Button>\r\n <Collapse isOpen={this.state.expanded} timeout={350}>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n isMobile\r\n } = this.props;\r\n const isSingleSelect =\r\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\r\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue =>\r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\r\n )}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n productCountAriaLabel={productCountAriaLabel}\r\n refineItemAriaLabel={refineItemAriaLabel}\r\n refineItemsAriaLabel={refineItemsAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n });\r\n return (\r\n <ul\r\n className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`}\r\n {...role}\r\n aria-label={productRefinerHierarchy.KeyName}\r\n >\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\r\n ) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n sliderKey={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>{listItems}</ul>;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\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 * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (\r\n <span>\r\n {` `}\r\n {separator}\r\n {` `}\r\n </span>\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 * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC<ITitle> = ({ text, className }) => (\r\n <span className={className}>\r\n {` `}\r\n {text}\r\n {` `}\r\n </span>\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 * ILiquid23SearchResultContainer 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 interface ILiquid23SearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n}\r\n\r\nexport interface ILiquid23SearchResultContainerResources {\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 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}\r\n\r\nexport interface ILiquid23SearchResultContainerProps<T> extends Msdyn365.IModule<T> {\r\n resources: ILiquid23SearchResultContainerResources;\r\n config: ILiquid23SearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n productComparisonButton: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\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 { format, ProductPrice, ProductRefinerValue, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n DimensionSwatchDisplayTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n getPriceForProductSearchResult,\r\n IDimensionsApp,\r\n PriceForProductSearchResultInput\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} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCollectionRefinersAction,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n IFullProductsSearchResultsWithCount,\r\n parseQueryParam,\r\n ProductListInventoryFilteringOptions,\r\n RefinersByCollectionInput,\r\n sortOptions\r\n} from './actions';\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 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 { ILiquid23SearchResultContainerData } from './liquid23-search-result-container.data';\r\nimport { expandRefinersCount, ILiquid23SearchResultContainerProps } from './liquid23-search-result-container.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends ILiquid23SearchResultContainerProps<ILiquid23SearchResultContainerData> {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n}\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[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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<ILiquid23SearchResultContainerProps<ILiquid23SearchResultContainerData>>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n ILiquid23SearchResultContainerProps<ILiquid23SearchResultContainerData>,\r\n ISearchResultContainerState\r\n> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n private 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 private readonly _modalToggleRef: React.RefObject<HTMLButtonElement>;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\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 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: ILiquid23SearchResultContainerProps<ILiquid23SearchResultContainerData>, 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<HTMLButtonElement>();\r\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n refiners: []\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(\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 public async componentDidMount(): Promise<void> {\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 this._updateListPageState(listPageState, products);\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 ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\r\n ];\r\n },\r\n async () => {\r\n const newListPageState = await this.props.data.listPageState;\r\n const input = new GetFullProductsByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\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 );\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 // 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 if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(\r\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel,\r\n undefined,\r\n this.catalogId\r\n );\r\n\r\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\r\n this.setState({ refiners });\r\n }\r\n }\r\n );\r\n\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\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 const context = this.props.context as ICoreContext<IDimensionsApp>;\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 componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\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 errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n <FeatureSearchResultItem\r\n product={searchProduct}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n telemetryContent={this.telemetryContent}\r\n recommendation={this.props.context.request.query?.recommendation}\r\n />\r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle:\r\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\r\n <ModalToggle\r\n text={resources.modalTitle}\r\n ariaLabel={resources.modalTitle}\r\n innerRef={this._modalToggleRef}\r\n onClick={this._toggleModal}\r\n id='search-result-modal'\r\n />\r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && <ErrorMessage text={errorText} />,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: searchProduct ? featureComponent : null,\r\n productPrices: this.productPrices\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\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 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 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<void> => {\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<IDimensionsApp>,\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<void> => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext\r\n );\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n listPageState.activeProducts = products;\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 _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 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 = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: `ms-search-result-container__title ${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, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n this.props.config.updateRefinerPanel && 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={!!(expandedRefiners && expandedRefiners > index)}\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 />\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 // 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId)\r\n );\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinerValueName = this.props.data.refiners.result?.find(n => n.KeyName === 'Rating');\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n closeAriaLabel={resources.closeAriaLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n refinerValues={refinerValueName}\r\n />\r\n );\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 } = this.props;\r\n const { resources } = this.props;\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\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\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 return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={shouldAllowBack}\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 />\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\n/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './liquid23-search-result-container';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage,\r\n FeatureSearchContainer,\r\n similarLookProduct\r\n } = props;\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && renderRefiner(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <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\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\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>{title.titleCount}</h5>\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. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n}\r\n\r\nexport interface ILinkData {\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n linkText?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Logo component\r\n * @extends {React.PureComponent<ILogoConfig>}\r\n */\r\nexport class Logo extends React.PureComponent<ILogoProps> {\r\n\r\n private attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: ILogoProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n public render():JSX.Element {\r\n return(\r\n <div className={this.props.className}>\r\n {this._renderLogo(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n private _renderLogo(config: ILogoProps):JSX.Element {\r\n if(config.link && config.link.linkUrl.destinationUrl) {\r\n return(\r\n <a\r\n href={config.link.linkUrl.destinationUrl}\r\n aria-label={config.link.ariaLabel}\r\n target={config.link.openInNewTab ? '_blank' : undefined}\r\n {...this.attributes}\r\n >\r\n {this._renderImage(config)}\r\n </a>\r\n );\r\n }\r\n return(\r\n this._renderImage(config)\r\n );\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=132&h=28&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=160&h=48&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n <Msdyn365.Image\r\n {...config.image}\r\n gridSettings={this.props.gridSettings!}\r\n imageSettings={config && config.image && config.image.imageSettings || defaultImageSettings}\r\n loadFailureBehavior='default'\r\n editProps= {{key: config.image || {}, requestContext: this.props.requestContext}}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default Logo;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IObrienb2bHeaderResources } from '../obrienb2b-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IObrienb2bHeaderResources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n telemetryContent?: ITelemetryContent;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component\r\n * @extends {React.PureComponent<INavIconProps>}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.Component<INavIconProps> {\r\n\r\n private attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: INavIconProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render():JSX.Element {\r\n return (\r\n <Button\r\n className='ms-header__nav-icon'\r\n onClick={this.props.toggleNavBar}\r\n title={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-expanded={this.props.isExpanded}\r\n aria-controls={this.props.targetId}\r\n {...this.attributes}\r\n ><span>Menu</span></Button>\r\n );\r\n }\r\n}","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IObrienb2BHeaderData } from '../obrienb2b-header.data';\r\nimport { IObrienb2bHeaderProps } from '../obrienb2b-header.props.autogenerated';\r\n\r\n/**\r\n * The header preferred store component\r\n */\r\n@observer\r\nexport class HeaderPreferredStore extends React.PureComponent<IObrienb2bHeaderProps<IObrienb2BHeaderData>> {\r\n\r\n public handleClick = () => { return this._findPreferreStoreOnClick(this.props); };\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n slots,\r\n resources\r\n } = this.props;\r\n if (slots && slots.storeSelector && slots.storeSelector.length) {\r\n const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName ?\r\n storeSelectorStateManager!.preferredStore.StoreName :\r\n resources.headerPreferredStoreText;\r\n\r\n return (\r\n <div className='ms-header__preferred-store-container'>\r\n <button className='ms-header__preferred-store-btn msc-btn' color='secondary' aria-label={resources.headerPreferredStoreAriaLabel} onClick={this.handleClick} >\r\n <span className='ms-header__preferred-store-text'>{storeName}</span>\r\n </button>\r\n {slots.storeSelector}\r\n </div>\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private async _findPreferreStoreOnClick(props: IObrienb2bHeaderProps<IObrienb2BHeaderData>): Promise<void> {\r\n const { data: { storeSelectorStateManager: { result: storeSelectorStateManager } }, modules } = props;\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n storeSelectorStateManager.openDialog({\r\n id: storeSelectorId,\r\n showMapViewLink: false,\r\n onLocationSelected: orgUnitLocation => {\r\n return Promise.resolve();\r\n }\r\n }).catch((error: Error) => {\r\n if (props.telemetry) {\r\n props.telemetry.error(error.message);\r\n props.telemetry.debug('Unable to set preferred store');\r\n }\r\n return;\r\n });\r\n }\r\n}\r\n\r\nexport default HeaderPreferredStore;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\r\n ModalBody, ModalHeader, onTelemetryClick, Popover, TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { IObrienb2BHeaderData } from './obrienb2b-header.data';\r\nimport { IObrienb2bHeaderProps, IObrienb2bHeaderResources, IMyAccountLinksData } from './obrienb2b-header.props.autogenerated';\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends IObrienb2bHeaderProps<IObrienb2BHeaderData>, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n search: React.ReactNode[];\r\n siteOptions: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n accountLinks?: React.ReactNode[];\r\n preferredStore?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent<IObrienb2bHeaderProps<IObrienb2bHeaderData>>}\r\n */\r\nclass Header extends React.PureComponent<IObrienb2bHeaderProps<IObrienb2BHeaderData>, IHeaderState> {\r\n private popOverRef: React.RefObject<HTMLButtonElement>;\r\n private telemetryContent: ITelemetryContent;\r\n @computed public get displayName(): Readonly<string | undefined> {\r\n const customer = this.props.data.accountInformation?.result;\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n\r\n constructor(props: IObrienb2bHeaderProps<IObrienb2BHeaderData>) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: { accountInformation,\r\n cart: { result: cart },\r\n storeSelectorStateManager: {result: storeSelectorStateManager}\r\n },\r\n context: {\r\n request: {\r\n user\r\n }\r\n },\r\n context,\r\n resources: {\r\n cartLabel,\r\n cartQtyLabel\r\n }\r\n } = this.props;\r\n const { logoLink, logoImage } = this.props.config;\r\n const headerClassName = classnames('ms-header', this.props.config.className);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const menuBarSlot = this._getSlot('obrienb2bMenuBar');\r\n const searchSlot = this._getSlot('search');\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as IObrienb2bHeaderProps<IObrienb2BHeaderData>),\r\n ...(this.state),\r\n logo: <Logo {...{ link: logoLink, image: logoImage, className: 'ms-header__logo', gridSettings: this.props.context.request.gridSettings, requestContext: this.props.context.request, telemetryContent: this.telemetryContent }} />,\r\n wishListIconDesktop: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-desktop'\r\n showButtonTooltip={true}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n />\r\n ),\r\n wishListIconMobile: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-mobile'\r\n showButtonTooltip={true}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n />\r\n ),\r\n cartIcon: (cartIconSlot && cartIconSlot.length > 0)\r\n ? cartIconSlot[0]\r\n : cart && <CartIconComponent cartLabel={cartLabel} cartQtyLabel={cartQtyLabel} context={context} id={id} typeName={typeName} telemetryContent={this.telemetryContent} data={{ cart: cart }} />,\r\n navIcon: <NavIcon {...{ resources: this.props.resources, isExpanded: !this.state.mobileMenuCollapsed, targetId: navbarKey, toggleNavBar: this._toggleNavbar, telemetryContent: this.telemetryContent }} />,\r\n menuBar: menuBarSlot && menuBarSlot.length && menuBarSlot || [],\r\n search: searchSlot && searchSlot.length && searchSlot || [],\r\n siteOptions: siteOptionsSlot && siteOptionsSlot.length && siteOptionsSlot || [],\r\n className: headerClassName,\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('inside-xxl always-flex justify')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: 'ms-header__modal'\r\n },\r\n MobileMenuHeader: (\r\n <ModalHeader\r\n className='ms-header__mobile-hamburger-menu-header'\r\n toggle={this._toggleNavbar}\r\n />\r\n ),\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body',\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links',\r\n },\r\n AccountInfoDropdownParentContainer: {\r\n className: 'ms-header__account-info'\r\n },\r\n AccountInfoDropdownPopoverConentContainer: customer && this.displayName && {\r\n tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover,\r\n } || undefined,\r\n signInLink: this._getSigninButton(customer, user, this.props.resources),\r\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\r\n accountLinks: this._getAccountLinks(customer),\r\n preferredStore: preferredStoreSlot\r\n && preferredStoreSlot.length\r\n && storeSelectorStateManager\r\n && (<HeaderPreferredStore {...this.props}/>)\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /* Handle link text change*/\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent) => {\r\n if (this.props.config.myAccountLinks && this.props.config.myAccountLinks[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\r\n }\r\n }\r\n\r\n private _getSlot(slotName: string): React.ReactNode[] | null {\r\n const { slots } = this.props;\r\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\r\n }\r\n\r\n private _getSigninButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IObrienb2bHeaderResources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return !customer && (\r\n <Button\r\n className='ms-header__signin-button'\r\n title={resources.signInLinkText}\r\n href={user && user.signInUrl}\r\n aria-label={resources.signInLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signin-button-text' aria-hidden={true}><span>{resources.signInLinkText}</span></span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getSignOutButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IObrienb2bHeaderResources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n <Button\r\n className={'ms-header__signout-button'}\r\n title={resources.signOutLinkText}\r\n href={user && user.signOutUrl || ''}\r\n aria-label={resources.signOutLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signout-button-text' aria-hidden={true}><span>{resources.signOutLinkText}</span></span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n <Button\r\n innerRef={this.popOverRef}\r\n className={'ms-header__profile-button'}\r\n aria-describedby='myprofilePopover'\r\n onClick={this._togglePopover}\r\n color='link'\r\n aria-expanded={this.state.signinPopoverOpen}\r\n {...attributes}\r\n >\r\n <span className='ms-profile-button-text'>{this.displayName}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if(!customer || ! this.displayName || !myAccountLinks || !myAccountLinks.length) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n <MsDyn365.Link\r\n key={index}\r\n link={editableLink}\r\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\r\n />\r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(e: KeyboardEvent): void {\r\n if (e.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n }\r\n }\r\n}\r\n\r\nexport default Header;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\nimport Transition from 'react-transition-group/Transition';\r\n\r\nimport { mapToCssModules, TransitionStatuses } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICollapseProps } from './Collapse.props';\r\n\r\nexport interface ICollapseState {\r\n height: number | null;\r\n}\r\n\r\ntype IHash = {\r\n [key in TransitionStatuses]: string;\r\n};\r\n\r\n/**\r\n * This is the controlled version of a Collapse component, and as such the toggle behavior is expected to be handled in a parent component.\r\n * @see See [Uncontrolled Components - React](https://reactjs.org/docs/uncontrolled-components.html) to learn more.\r\n * @visibleName Collapse (controlled)\r\n */\r\nexport default class Collapse extends React.Component<ICollapseProps, ICollapseState> {\r\n public static defaultProps: Partial<ICollapseProps> = {\r\n isOpen: false,\r\n tag: 'div',\r\n timeout: 0\r\n };\r\n\r\n public props: ICollapseProps;\r\n\r\n public state: ICollapseState;\r\n\r\n private readonly _transitionStatusToClassHash: IHash = {\r\n entering: 'collapse',\r\n entered: 'collapse show',\r\n exiting: 'collapse',\r\n exited: 'collapse'\r\n };\r\n\r\n private readonly _tagRef: React.RefObject<HTMLElement> = React.createRef<HTMLElement>();\r\n\r\n constructor(props: ICollapseProps) {\r\n super(props);\r\n this.props = props;\r\n\r\n this.state = {\r\n height: 0\r\n };\r\n\r\n this._onEntering = this._onEntering.bind(this);\r\n this._onExit = this._onExit.bind(this);\r\n this._onExited = this._onExited.bind(this);\r\n this._onExiting = this._onExiting.bind(this);\r\n this._reevaluateHeight = this._reevaluateHeight.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n window && window.addEventListener('resize', this._reevaluateHeight);\r\n }\r\n\r\n public componentDidUpdate(nextProps: ICollapseProps): void {\r\n if (nextProps.children !== this.props.children) {\r\n this._reevaluateHeight();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window && window.removeEventListener('resize', this._reevaluateHeight);\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: ICollapseProps,\r\n nextState: ICollapseState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n tag,\r\n isOpen,\r\n className,\r\n children,\r\n navbar,\r\n cssModule,\r\n\r\n in: collapseIn,\r\n mountOnEnter,\r\n unmountOnExit,\r\n appear,\r\n enter,\r\n exit,\r\n timeout,\r\n onEnter,\r\n onEntering,\r\n onEntered,\r\n onExit,\r\n onExiting,\r\n onExited,\r\n\r\n ...otherProps\r\n } = this.props;\r\n\r\n const Tag = tag || 'div';\r\n const transitionProps = {\r\n in: collapseIn,\r\n mountOnEnter,\r\n unmountOnExit,\r\n appear,\r\n enter,\r\n exit,\r\n onEnter,\r\n onEntering,\r\n onEntered,\r\n onExit,\r\n onExiting,\r\n onExited\r\n };\r\n\r\n //const { height } = this.state;\r\n //const style = height === null || height === 0 ? null : { minHeight: height };\r\n\r\n return (\r\n <Transition\r\n {...transitionProps}\r\n in={isOpen}\r\n timeout={timeout || 0}\r\n onEntering={this._onEntering}\r\n onExit={this._onExit}\r\n onExiting={this._onExiting}\r\n onExited={this._onExited}\r\n >\r\n {(status: TransitionStatuses) => {\r\n const collapseClass = this._getTransitionClass(status);\r\n const classes = mapToCssModules(classNames(className, collapseClass, navbar && 'navbar-collapse'), cssModule);\r\n\r\n return (\r\n <Tag\r\n {...otherProps} className={classes} ref={this._tagRef}\r\n >\r\n {children}\r\n </Tag>\r\n );\r\n }}\r\n </Transition>\r\n );\r\n }\r\n\r\n private _reevaluateHeight(): void {\r\n const node = this._tagRef.current;\r\n if (node !== null && node.firstElementChild && node.firstElementChild.scrollHeight > 0) {\r\n this.setState({ height: node.firstElementChild.scrollHeight });\r\n }\r\n }\r\n\r\n private _getTransitionClass(status: TransitionStatuses): string {\r\n return this._transitionStatusToClassHash[status] || 'collapse';\r\n }\r\n\r\n private _onEntering(node: HTMLElement, isAppearing: boolean): void {\r\n this.setState({ height: node.scrollHeight });\r\n\r\n //if (this.props.onEntering) {\r\n // this.props.onEntering(node, isAppearing);\r\n //}\r\n }\r\n\r\n private _onExit(node: HTMLElement): void {\r\n this.setState({ height: node.scrollHeight });\r\n\r\n if (this.props.onExit) {\r\n this.props.onExit(node);\r\n }\r\n }\r\n\r\n private _onExiting(node: HTMLElement): void {\r\n this.setState({ height: 0 });\r\n\r\n if (this.props.onExiting) {\r\n this.props.onExiting(node);\r\n }\r\n }\r\n\r\n private _onExited(node: HTMLElement): void {\r\n this.setState({ height: null });\r\n\r\n if (this.props.onExited) {\r\n this.props.onExited(node);\r\n }\r\n }\r\n}\r\n","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React from \"react\";\nexport default (({\n styles = {},\n ...props\n}) => /*#__PURE__*/React.createElement(\"svg\", _extends({\n version: \"1.1\",\n id: \"Layer_1\",\n xmlns: \"http://www.w3.org/2000/svg\",\n x: \"0\",\n y: \"0\",\n viewBox: \"0 0 2830.95 600.69\",\n xmlSpace: \"preserve\"\n}, props), /*#__PURE__*/React.createElement(\"path\", {\n className: styles[\"st0\"] || \"st0\",\n d: \"M1095.41 411.04c-15.25 16.07-33.33 23.81-54.24 23.81H785.79c-21.47 0-39.55-7.15-54.81-23.22-15.25-16.08-22.03-35.12-22.03-57.75V246.12c0-22.03 7.34-41.08 22.03-56.56 15.25-16.07 33.34-23.81 54.81-23.81h255.38c20.9 0 38.98 7.74 54.24 23.81 15.26 16.08 22.6 34.53 22.6 56.56v107.76c0 22.03-7.35 41.08-22.6 57.16zm-28.25-164.92c0-14.29-11.86-26.79-25.99-26.79H785.22c-14.12 0-24.86 12.5-24.86 26.79v107.76c0 18.46 8.47 27.39 25.42 27.39h255.38c14.12 0 25.99-12.5 25.99-27.39V246.12zM1504.43 411.63c-14.69 15.48-32.77 23.22-54.24 23.22h-306.22V165.76h306.22c21.47 0 38.99 7.74 54.24 23.81 15.26 16.08 22.6 34.53 22.6 56.56 0 20.84-6.21 39.3-19.21 54.18 13 14.88 19.21 32.74 19.21 53.58 0 22.62-7.34 41.66-22.6 57.74zm-54.24-192.3h-254.81v54.18h255.37c14.13 0 25.42-12.5 25.42-27.39.01-14.88-10.73-26.79-25.98-26.79zm.56 107.76h-255.37v54.18h254.81c16.95 0 25.43-8.93 25.43-27.39 0-14.29-10.74-26.79-24.87-26.79zM1884.64 434.85v-80.97c0-17.86-8.47-26.79-25.42-26.79h-254.81v107.76H1553V165.76h306.23c21.47 0 38.98 7.74 54.24 23.81 15.26 16.08 22.61 34.53 22.61 56.56 0 20.84-6.22 39.3-19.21 54.18 12.99 14.88 19.21 32.74 19.21 53.58v80.97h-51.44zm-25.42-215.52h-254.81v54.18h254.81c16.95 0 25.42-8.93 25.42-27.39 0-17.86-8.47-26.79-25.42-26.79zM1962.03 434.85v-268.5h50.85v268.5h-50.85zM2038.85 434.85V165.76h383.07v80.37h-51.41c0-17.86-8.48-26.79-24.86-26.79h-255.37v54.18h255.37v53.58h-255.37v54.18h255.37c16.95 0 25.42-8.93 24.86-27.39h51.41v80.97h-383.07zM2779.53 434.85V246.12c0-14.29-11.3-26.79-25.42-26.79h-255.38v215.51h-50.85V165.76h306.23c21.48 0 38.99 7.74 54.24 23.81 15.26 16.08 22.6 34.53 22.6 56.56v188.73h-51.42z\"\n}), /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n className: styles[\"st0\"] || \"st0\",\n d: \"M128.51 210.95v178.79c0 24.88 25.79 45.06 57.59 45.06h147.76c15.32-13.53 61.09-61.12 31.89-124.68 0 0 47.4 70.79 31.4 124.68h17.47c31.81 0 57.59-20.18 57.59-45.06V210.95c0-24.89-25.78-45.06-57.59-45.06H186.1c-31.81 0-57.59 20.17-57.59 45.06zm74.77 33.92c0-11.32 11.72-20.48 26.18-20.48h141.8c14.45 0 26.17 9.16 26.17 20.48v72.55c-2.52-3.13-5.05-6.15-7.6-9.08v-.04l-.06-.02c-72.92-83.45-155.8-83.53-155.8-83.53 59.53 10.38 87.49 47.31 100.37 84.18 5.03 19.92 2.39 47.98-39.52 67.38h-65.37c-14.46 0-26.18-9.17-26.18-20.49V244.87z\"\n})), /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n className: styles[\"st0\"] || \"st0\",\n d: \"M300.35 600.69C134.75 600.69 0 465.95 0 300.34 0 134.74 134.75 0 300.35 0S600.7 134.74 600.7 300.34c0 165.61-134.75 300.35-300.35 300.35zm0-540.56c-132.47 0-240.22 107.75-240.22 240.21s107.75 240.22 240.22 240.22S540.57 432.8 540.57 300.34c0-132.45-107.75-240.21-240.22-240.21z\"\n}))));","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport Collapse from './collapse/Collapse';\r\nimport * as React from 'react';\r\n// import classnames from 'classnames';\r\n// import { Customer } from '@msdyn365-commerce/retail-proxy';\r\n// import { AsyncResult } from '@msdyn365-commerce/core';\r\nimport { IHeaderViewProps } from './obrienb2b-header';\r\n//@ts-ignore\r\nimport Logosvg from '../../../public/obrien/img/Obrien-Logo-Web.svg';\r\n\r\nconst headerView: React.FC<IHeaderViewProps> = props => {\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer,\r\n Divider\r\n } = props;\r\n return (\r\n <Module {...HeaderTag}>\r\n <Node {...HeaderContainer}>\r\n <Node {...HeaderTopBarContainer}>\r\n\r\n {/* This is the area that is majorly revamped. Subtract components as needed. */}\r\n\r\n <div className='obrienb2b-logo always-flex align-items-center'>\r\n {props.navIcon}\r\n <Node {...Divider}/>\r\n <div className='obrienSvg'><a href='https://kentsports.commerce.dynamics.com/obb2b'><Logosvg /></a></div>\r\n </div>\r\n \r\n <div className='obrienb2b-other always-flex align-items-center'>\r\n <Node {...Divider}/>\r\n {_renderReactFragment(props.search)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.cartIcon}\r\n {_renderReactFragment(props.siteOptions)}\r\n </div>\r\n\r\n </Node>\r\n {_renderCollapseMenu(props)}\r\n \r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n <Collapse className={'ms-header__collapsible-hamburger'} isOpen={!mobileMenuCollapsed}>\r\n <Node {...MobileMenuLinksContainer}>\r\n <div className='right-here'>\r\n {_renderReactFragment(props.menuBar)}\r\n {/* {_renderMobileAccountBlock(props, true)}\r\n {props.wishListIconMobile} */}\r\n </div>\r\n </Node>\r\n </Collapse>\r\n );\r\n}\r\n\r\n// const renderCustomerName = (accountInformation: AsyncResult<Customer>): React.ReactChild => {\r\n// const customer = accountInformation && accountInformation.result;\r\n// return (\r\n// <>{customer && customer.FirstName}</>\r\n// );\r\n// };\r\n\r\n// function _renderMobileAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\r\n// const {\r\n// AccountInfoDropdownParentContainer,\r\n// signOutLink,\r\n// signInLink,\r\n// data,\r\n// accountLinks } = props;\r\n\r\n// if (AccountInfoDropdownParentContainer) {\r\n// const accountClassName = classnames('ms-header__drawer', AccountInfoDropdownParentContainer.className, renderForMobile ? 'account-mobile' : 'account-desktop');\r\n\r\n// if (accountLinks) {\r\n// return (\r\n// <Drawer className={accountClassName} openGlyph='ms-header__drawer-open' closeGlyph='ms-header__drawer-close' glyphPlacement='end' toggleButtonText={renderCustomerName(data.accountInformation)}>\r\n// <div>\r\n// {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\r\n// {signOutLink}\r\n// </div>\r\n// </Drawer>\r\n// );\r\n// } else if (signInLink) {\r\n// return (\r\n// <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\r\n// {signInLink}\r\n// </Node>\r\n// );\r\n// }\r\n// }\r\n// return null;\r\n// }\r\n\r\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {accountInfoDropdownButton}\r\n <Node {...AccountInfoDropdownPopoverConentContainer}>\r\n { accountLinks ? accountLinks.map(link => link) : false }\r\n {signOutLink}\r\n </Node>\r\n </Node>\r\n );\r\n } else if (signInLink) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {signInLink}\r\n </Node>\r\n );\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n <React.Fragment>\r\n {items && items.length\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return <React.Fragment key={index}>{slot}</React.Fragment>;\r\n })\r\n : null}\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nexport default headerView;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ProductPrice } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\n/**\r\n * Interface for price component resources.\r\n * @param {string} priceRangeSeparator - The price range separator.\r\n */\r\nexport interface IPriceComponentResources {\r\n priceRangeSeparator?: string;\r\n}\r\n\r\n/**\r\n * Interface for price component props.\r\n * @param {boolean} isPriceMinMaxEnabled - Whether the price range feature is enabled or not.\r\n * @param {IPriceComponentResources} priceResources - The price range resources.\r\n */\r\nexport interface IPriceComponentProps extends IComponentProps<{ price: ProductPrice }> {\r\n className?: string;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n}\r\nexport interface IPriceComponent extends IComponent<IPriceComponentProps> {\r\n}\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst Price: React.FC<IPriceComponentProps> = (props: IPriceComponentProps) => {\r\n // CustomerContextualPrice could be 0\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n\r\n return (\r\n <span className={classnames('msc-price', props.className)}>\r\n {showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)}\r\n </span>\r\n );\r\n};\r\n\r\nconst showStrikethroughPricing = (props: IPriceComponentProps) => {\r\n const originalPrice = getOriginalPrice(props);\r\n\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getOriginalPrice = (props: IPriceComponentProps) => {\r\n return Math.max(props.data.price.BasePrice || 0, props.data.price.TradeAgreementPrice || 0, props.data.price.AdjustedPrice || 0);\r\n};\r\n\r\nconst formatCurrency = (props: IPriceComponentProps, price: number | undefined, shouldUseFreePriceText: boolean | undefined): string | undefined => {\r\n if (price === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (shouldUseFreePriceText && price === 0 && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n\r\n return props.context.cultureFormatter.formatCurrency(price);\r\n};\r\n\r\nconst renderCurrentPrice = (props: IPriceComponentProps): JSX.Element | undefined => {\r\n const initialPrice = formatCurrency(props, props.data.price.CustomerContextualPrice, true);\r\n const maxVariantPrice = formatCurrency(props, props.data.price.MaxVariantPrice, false);\r\n const minVariantPrice = formatCurrency(props, props.data.price.MinVariantPrice, false);\r\n if (props.isPriceMinMaxEnabled && maxVariantPrice !== minVariantPrice && maxVariantPrice && minVariantPrice) {\r\n return (\r\n <span className='msc-price__pricerange' itemProp='price'>\r\n <span className='msc-price__minprice' itemProp='price'>\r\n {minVariantPrice}\r\n </span>\r\n <span className='msc-price__separator' itemProp='price'>\r\n {props.priceResources?.priceRangeSeparator}\r\n </span>\r\n <span className='msc-price__maxprice' itemProp='price'>\r\n {maxVariantPrice}\r\n </span>\r\n </span>\r\n );\r\n }\r\n return (<span className='msc-price__actual' itemProp='price'>\r\n {initialPrice}\r\n </span>);\r\n};\r\n\r\nconst renderCurrentPriceWithOriginalPrice = (props: IPriceComponentProps): JSX.Element | null => {\r\n const originalPrice = getOriginalPrice(props);\r\n const initialPrice = formatCurrency(props, originalPrice, true);\r\n\r\n return (\r\n <>\r\n <span className='sr-only'>\r\n {' '}\r\n {props.originalPriceText}\r\n {' '}\r\n {initialPrice}\r\n {' '}\r\n {props.currentPriceText}\r\n {' '}\r\n {renderCurrentPrice(props)}\r\n </span>\r\n <span className='msc-price__strikethrough' aria-hidden='true'>\r\n {initialPrice}\r\n </span>\r\n <span aria-hidden='true'>\r\n {renderCurrentPrice(props)}\r\n </span>\r\n {props.savingsText && <span className='msc-price__savings'>\r\n {props.savingsText}\r\n </span>}\r\n </>\r\n );\r\n};\r\n\r\nexport const PriceComponent: React.FunctionComponent<IPriceComponentProps> = msdyn365Commerce.createComponent<IPriceComponent>(\r\n 'Price',\r\n { component: Price, ...PriceComponentActions }\r\n);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\r\nimport { DimensionTypes, generateSwatchImageUrl, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\n/**\r\n * Swatch item data.\r\n */\r\nexport interface ISwatchItem {\r\n value: string;\r\n itemId: string;\r\n dimensionType: DimensionTypes;\r\n colorHexCode?: string;\r\n imageUrl?: string;\r\n productImageUrls?: string[];\r\n isDisabled?: boolean;\r\n\r\n isDefault?: boolean;\r\n}\r\n\r\n/**\r\n * Swatch item configuration.\r\n */\r\nexport interface ISwatchItemProps {\r\n className: string;\r\n apiSettings: ICommerceApiSettings;\r\n\r\n isSelected: boolean;\r\n isSelectionEnabled?: boolean;\r\n\r\n item: ISwatchItem;\r\n\r\n onSelectItem(item: ISwatchItem): void;\r\n}\r\n\r\n/**\r\n * Represents a single item for swatch.\r\n * @param props - Item configuration.\r\n * @returns React node.\r\n */\r\nexport const SwatchItemComponent: React.FC<ISwatchItemProps> = (props: ISwatchItemProps) => {\r\n const { isSelected, className, onSelectItem, item } = props;\r\n const { itemId, value, colorHexCode, imageUrl } = item;\r\n\r\n const style: React.CSSProperties = {};\r\n\r\n let isColored = false;\r\n\r\n const hasColor = !StringExtensions.isNullOrWhitespace(colorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(imageUrl);\r\n\r\n const selectItem = React.useCallback(() => {\r\n onSelectItem(item);\r\n }, [onSelectItem, item]);\r\n\r\n const selectionHandler = props.isSelectionEnabled && !item.isDisabled ? selectItem : undefined;\r\n\r\n if (hasColor) {\r\n style.backgroundColor = colorHexCode;\r\n isColored = true;\r\n } else if (hasImage) {\r\n const fullImageUrl = generateSwatchImageUrl(imageUrl!, props.apiSettings);\r\n return (\r\n <img\r\n key={`${itemId}-${item.isDisabled ? 'disabled' : 'enabled'}`}\r\n src={fullImageUrl}\r\n className={\r\n classnames(\r\n className,\r\n `${className}-${itemId}`,\r\n `${className}__image`,\r\n isSelected ? `${className}__selected` : `${className}__unselected`,\r\n item.isDisabled ? `${className}__disabled` : undefined\r\n )\r\n }\r\n style={style}\r\n onClick={selectionHandler}\r\n onKeyPress={selectionHandler}\r\n title={value}\r\n aria-label={value}\r\n alt={value}\r\n />\r\n );\r\n }\r\n\r\n const shouldDisplayText = !isColored;\r\n\r\n return (\r\n <button\r\n key={`${itemId}-${item.isDisabled ? 'disabled' : 'enabled'}`}\r\n className={\r\n classnames(\r\n className,\r\n `${className}-${itemId}`,\r\n isSelected ? `${className}__selected` : `${className}__unselected`,\r\n isColored ? `${className}__colored` : `${className}__uncolored`,\r\n item.isDisabled ? `${className}__disabled` : undefined\r\n )\r\n }\r\n style={style}\r\n onClick={selectionHandler}\r\n onKeyPress={selectionHandler}\r\n title={value}\r\n aria-label={value}\r\n disabled={item.isDisabled}\r\n >\r\n {shouldDisplayText && value}\r\n </button>\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\r\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { ISwatchItem, SwatchItemComponent } from './swatch-item';\r\n\r\n/**\r\n * Swatch item configuration.\r\n */\r\nexport interface ISwatchProps {\r\n className?: string;\r\n apiSettings: ICommerceApiSettings;\r\n\r\n list: ISwatchItem[];\r\n isSelectionEnabled?: boolean;\r\n\r\n onSelectItem?(item: ISwatchItem): void;\r\n}\r\n\r\n/**\r\n * Represents a single item for swatch.\r\n * @param props - Item configuration.\r\n * @returns React node.\r\n */\r\nexport const SwatchComponent: React.FC<ISwatchProps> = (props: ISwatchProps) => {\r\n const containerClassName = 'msc-swatch-container';\r\n\r\n const [selectedItemId, setSelectedItemId] = React.useState<string | undefined>(undefined);\r\n const [didUserSetAnyItem, setDidUserSetAnyItem] = React.useState<boolean>(false);\r\n\r\n const isSelectionEnabled = props.isSelectionEnabled ?? true;\r\n\r\n const onSelectItemCallback = props.onSelectItem;\r\n\r\n const onSelectItem = React.useCallback((item: ISwatchItem) => {\r\n setSelectedItemId(item.itemId);\r\n if (!ObjectExtensions.isNullOrUndefined(onSelectItemCallback)) {\r\n onSelectItemCallback(item);\r\n }\r\n setDidUserSetAnyItem(true);\r\n }, [setSelectedItemId, onSelectItemCallback]);\r\n\r\n if (!didUserSetAnyItem) {\r\n const defaultItem = props.list.find(item => item.isDefault);\r\n if (defaultItem && defaultItem.itemId !== selectedItemId) {\r\n setSelectedItemId(defaultItem.itemId);\r\n if (!ObjectExtensions.isNullOrUndefined(onSelectItemCallback)) {\r\n onSelectItemCallback(defaultItem);\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <div className={classnames(containerClassName, props.className)} >\r\n {\r\n props.list.map(item => {\r\n const itemId = item.itemId;\r\n const isSelected = selectedItemId === itemId;\r\n\r\n return (\r\n <SwatchItemComponent\r\n key={`${itemId}-${item.isDisabled ? 'disabled' : 'enabled'}`}\r\n className={`${containerClassName}__item`}\r\n item={item}\r\n onSelectItem={onSelectItem}\r\n isSelected={isSelected}\r\n apiSettings={props.apiSettings}\r\n isSelectionEnabled={isSelectionEnabled}\r\n />\r\n );\r\n })\r\n }\r\n </div>\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport React from 'react';\r\n\r\nimport { ISwatchItem, SwatchComponent } from './product-dimension';\r\n\r\n/**\r\n * Props for product component swatch.\r\n */\r\nexport interface IProductComponentSwatchProps {\r\n context: ICoreContext;\r\n swatches: ISwatchItem[];\r\n dimensionType?: string;\r\n onSelectDimension(coreContext: ICoreContext, swatchItem: ISwatchItem, dimensionType?: string): void;\r\n}\r\n\r\n/**\r\n * Swatch for the product component.\r\n * @param props - Swatch props.\r\n * @returns React element.\r\n */\r\nexport const ProductComponentSwatchComponent: React.FC<IProductComponentSwatchProps> = (props: IProductComponentSwatchProps) => {\r\n const { context, dimensionType, swatches, onSelectDimension } = props;\r\n\r\n const onSelectItem = React.useCallback((item: ISwatchItem) => {\r\n onSelectDimension(context, item, dimensionType);\r\n }, [onSelectDimension, context, dimensionType]);\r\n if (ArrayExtensions.hasElements(swatches)) {\r\n return (\r\n <SwatchComponent\r\n apiSettings={context.request.apiSettings}\r\n list={swatches}\r\n onSelectItem={onSelectItem}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <div className='msc-swatch-empty' />\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IDropdownItemProps, IDropdownProps } from './dropdown.props';\r\n\r\ninterface IDropdownState {\r\n\r\n /**\r\n * @friendlyName selectedIndex\r\n * @description selected index\r\n */\r\n selectedIndex: string;\r\n}\r\n\r\n/**\r\n *\r\n * DropDown component\r\n * @extends {React.PureComponent<IDropdownProps, IDropdownState>}\r\n */\r\nexport class Dropdown extends React.PureComponent<IDropdownProps, IDropdownState> {\r\n private readonly selectMenu: React.RefObject<HTMLSelectElement> = React.createRef<HTMLSelectElement>();\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IDropdownProps) {\r\n super(props);\r\n this.state = {\r\n selectedIndex: ''\r\n };\r\n this.payLoad = getPayloadObject('click', props.telemetryContent!, this.props.dropdownName);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (this.selectMenu.current) {\r\n this.selectMenu.current.selectedIndex = 0;\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { dropdownId, dropdownList, dropdownName, dropdownToggleName } = this.props;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n <select\r\n id={`msc-dropdown__entry-${dropdownId}`}\r\n ref={this.selectMenu}\r\n aria-label={dropdownName}\r\n className='msc-dropdown__select'\r\n onChange={this._onChanged}\r\n {...attribute}\r\n >\r\n <option\r\n value=''\r\n aria-selected={this.state.selectedIndex === ''}\r\n selected={this.state.selectedIndex === ''}\r\n hidden\r\n disabled\r\n >\r\n {dropdownToggleName}\r\n </option>\r\n {dropdownList.map(\r\n (item: IDropdownItemProps) => (<option\r\n value={item.id}\r\n key={item.id}\r\n selected={this.state.selectedIndex === item.id.toString()}\r\n aria-selected={this.state.selectedIndex === item.id.toString()}\r\n >\r\n {item.value}\r\n </option>)\r\n )}\r\n </select>\r\n );\r\n }\r\n\r\n private readonly _onChanged = async (event: React.ChangeEvent<HTMLSelectElement>) => {\r\n this.setState({ selectedIndex: event.target.value });\r\n\r\n if (this.props.onChange) {\r\n await this.props.onChange({\r\n dropdownId: this.props.dropdownId,\r\n selectId: event.target.value,\r\n // eslint-disable-next-line unicorn/prefer-dom-node-text-content -- Auto-suppressed.\r\n selectedValue: event.target.innerText\r\n });\r\n }\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getTelemetryObject, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { Dropdown, IDropdownItemProps, IDropdownOnSelectionChangeNotification } from './dropdown';\r\nimport { IErrorState,\r\n IProductDimensionCallbacks,\r\n IProductDimensionConfigureDropdownViewProps,\r\n IProductDimensionConfigureResources,\r\n IProductDimensionConfigureViewProps } from './product-dimension-interface';\r\n\r\nlet telemetryContent: ITelemetryContent;\r\n\r\n// Quantity on change.\r\nconst onChange = async (\r\n notification: IDropdownOnSelectionChangeNotification,\r\n dimensionChanged: (newValue: number, selectedDimensionValue: string) => Promise<void>\r\n): Promise<void> => {\r\n await dimensionChanged(+notification.dropdownId, notification.selectId);\r\n};\r\n\r\n// This method will map all product dimension to correct value and returns respective dropdown.\r\nconst mapProductDimensionFullToDropdownViewProps =\r\n (\r\n productDimensionFull: ProductDimensionFull,\r\n moduleName: string,\r\n selectDimensionFormatString: string,\r\n resources: IProductDimensionConfigureResources,\r\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources) => string,\r\n dropdownCallback: (notification: IDropdownOnSelectionChangeNotification) => Promise<void>,\r\n configureErrors?: { [configureId: string]: string | undefined }\r\n ): IProductDimensionConfigureDropdownViewProps => {\r\n const dropdownName = getDropdownName(productDimensionFull.DimensionTypeValue, resources);\r\n const dropdownId = productDimensionFull.DimensionTypeValue.toString();\r\n const dropdownToggleName = selectDimensionFormatString.replace('{0}', dropdownName.toLocaleLowerCase());\r\n const dropdownList: IDropdownItemProps[] = productDimensionFull.DimensionValues ? productDimensionFull.DimensionValues.map<IDropdownItemProps>(dM => {\r\n return { value: dM.Value || '', id: dM.RecordId.toString() };\r\n }) : [];\r\n const errorMessage = configureErrors ? configureErrors[dropdownId] : '';\r\n\r\n return {\r\n containerProps: {\r\n className: `${moduleName}__dropdown`\r\n },\r\n labelContainerProps: {\r\n tag: 'label',\r\n className: `${moduleName}__dropdown-quantity-label`,\r\n htmlFor: `${moduleName}__dropown-quantity-input-${dropdownId}`\r\n },\r\n errors: errorMessage && (\r\n <span className='msc-alert msc-alert-noborder msc-alert-danger'>\r\n <span className='msi-exclamation-triangle' aria-hidden='true' />\r\n <span>\r\n {errorMessage}\r\n </span>\r\n </span>\r\n ),\r\n heading: (\r\n <div>\r\n {dropdownName}\r\n </div>\r\n ),\r\n select: (\r\n <Dropdown\r\n dropdownId={dropdownId}\r\n dropdownName={dropdownName}\r\n dropdownToggleName={dropdownToggleName}\r\n dropdownList={dropdownList}\r\n onChange={dropdownCallback}\r\n telemetryContent={telemetryContent}\r\n />\r\n )\r\n };\r\n };\r\n\r\nexport const getProductConfigure = (moduleName: string, context: ICoreContext, pageName: string, telemetry: ITelemetry, selectDimensionFormatString: string,\r\n resources: IProductDimensionConfigureResources,\r\n callbacks: IProductDimensionCallbacks, product?: SimpleProduct, productDimensions?: ProductDimensionFull[],\r\n configureErrors?: IErrorState): IProductDimensionConfigureViewProps | undefined => {\r\n\r\n const\r\n { getDropdownName } = callbacks;\r\n\r\n if (!product || !productDimensions) {\r\n return undefined;\r\n }\r\n\r\n const onChanged = async (notification: IDropdownOnSelectionChangeNotification) => onChange(notification, callbacks.dimensionSelectedAsync);\r\n\r\n telemetryContent = getTelemetryObject(context.request.telemetryPageName!, pageName, telemetry);\r\n\r\n if (!ArrayExtensions.hasElements(productDimensions)) {\r\n return undefined;\r\n }\r\n\r\n const dropdowns = productDimensions.map((productDimensionFull: ProductDimensionFull) => mapProductDimensionFullToDropdownViewProps(productDimensionFull,\r\n moduleName, selectDimensionFormatString, resources, getDropdownName, onChanged, configureErrors?.configureErrors));\r\n\r\n return {\r\n containerProps: {\r\n className: `${moduleName}__configure`\r\n },\r\n dropdowns\r\n };\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport React, { useEffect, useState } from 'react';\r\n\r\nexport interface IRatingComponentProps extends IComponentProps<{}> {\r\n readOnly: boolean;\r\n ariaLabel: string;\r\n avgRating: number;\r\n ratingCount?: string;\r\n initialRating?: number;\r\n hideCount?: boolean;\r\n className?: string;\r\n ratingCountAriaLabel?: string;\r\n onChange?(value: number): void;\r\n}\r\nexport interface IRatingComponent extends IComponent<IRatingComponentProps> {\r\n onSliderChanged(): (event: React.ChangeEvent<HTMLInputElement>, props: IRatingComponentProps, setRating: (rating: IRatingState) => void) => void;\r\n onMouseOver(): (event: React.MouseEvent<HTMLElement>, rating: IRatingState, setRating: (rating: IRatingState) => void) => void;\r\n onClick(): (event: React.MouseEvent<HTMLElement>, props: IRatingComponentProps, setRating: (rating: IRatingState) => void) => void;\r\n onMouseLeave(): (event: React.MouseEvent, rating: IRatingState, setRating: (rating: IRatingState) => void) => void;\r\n}\r\n\r\ninterface IRatingState {\r\n rating: number;\r\n lastSelectedRating: number;\r\n}\r\n\r\nconst roundUpMin: number = 0.75;\r\nconst roundMidMin: number = 0.25;\r\nconst maxRating: number = 5;\r\n\r\nconst RatingComponentActions = {\r\n onSliderChanged(event: React.ChangeEvent<HTMLInputElement>, props: IRatingComponentProps, setRating: (rating: IRatingState) => void): void {\r\n const value = Number.parseInt(event.target.value, 10);\r\n setRating({ rating: value, lastSelectedRating: value });\r\n\r\n if (props.onChange) {\r\n props.onChange(value);\r\n }\r\n },\r\n onMouseLeave(_event: React.MouseEvent, rating: IRatingState, setRating: (rating: IRatingState) => void): void {\r\n setRating({ rating: rating.lastSelectedRating, lastSelectedRating: rating.lastSelectedRating });\r\n\r\n },\r\n onMouseOver(event: React.MouseEvent<HTMLElement>, rating: IRatingState, setRating: (rating: IRatingState) => void): void {\r\n setRating({ rating: getIndex(event), lastSelectedRating: rating.lastSelectedRating });\r\n },\r\n onClick(event: React.MouseEvent<HTMLElement>, props: IRatingComponentProps, setRating: (rating: IRatingState) => void): void {\r\n if (!props.readOnly) {\r\n const index = getIndex(event);\r\n setRating({ rating: index, lastSelectedRating: index });\r\n\r\n if (props.onChange) {\r\n props.onChange(index);\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst Rating: React.FC<IRatingComponentProps> = (props: IRatingComponentProps) => {\r\n const initialRating = props.readOnly ? props.avgRating : props.initialRating || 0;\r\n const [rating, setRating] = useState({ rating: initialRating, lastSelectedRating: initialRating });\r\n useEffect(\r\n () => {\r\n const newRating = props.readOnly ? props.avgRating : props.initialRating || 0;\r\n setRating({ rating: newRating, lastSelectedRating: newRating });\r\n },\r\n [props]\r\n );\r\n const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n RatingComponentActions.onSliderChanged(event, props, setRating);\r\n };\r\n const onMouseLeave = (event: React.MouseEvent) => {\r\n RatingComponentActions.onMouseLeave(event, rating, setRating);\r\n };\r\n const onMouseOver = (event: React.MouseEvent<HTMLElement>) => {\r\n RatingComponentActions.onMouseOver(event, rating, setRating);\r\n };\r\n const onClick = (event: React.MouseEvent<HTMLElement>) => {\r\n RatingComponentActions.onClick(event, props, setRating);\r\n };\r\n\r\n return (\r\n <div className={`msc-rating ${rating.rating > 0 ? 'msc-no-ratings' : ''} ${props.className ? props.className : ''}`}>\r\n {starControl(props.readOnly, rating.rating, props.ariaLabel, props.ratingCountAriaLabel, onChange)}\r\n <div aria-hidden onMouseLeave={props.readOnly ? undefined : onMouseLeave} className='msc-rating__group'>\r\n {renderStars(rating.rating, props, onMouseOver, onClick)}\r\n </div>\r\n { props.ratingCount && <output tabIndex={-1} aria-hidden className='msc-rating__count'>\r\n {' '}\r\n {props.typeName === 'reviews-list' ? `${props.avgRating} / 5 (${props.ratingCount})` : props.ratingCount}\r\n {' '}\r\n </output> }\r\n </div>\r\n );\r\n};\r\n\r\n// Set default props\r\nRating.defaultProps = {\r\n avgRating: 0\r\n} as Partial<IRatingComponentProps>;\r\n\r\n/**\r\n * Rating Review ariaLabel.\r\n * @param readOnly - Boolean.\r\n * @param currentRating - Current rating number.\r\n * @param ariaLabel - Rating AriaLabel.\r\n * @param reviewCountAriaLabel - Product review count.\r\n * @param onChange - On Change function.\r\n * @returns Jsx element.\r\n */\r\nconst starControl = (\r\n readOnly: boolean,\r\n currentRating: number,\r\n ariaLabel: string,\r\n reviewCountAriaLabel: string | undefined,\r\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void): JSX.Element => {\r\n if (readOnly) {\r\n return (<div className='msc-rating__range sr-only'>\r\n {`${ariaLabel}${reviewCountAriaLabel ? ` ${reviewCountAriaLabel}` : ''}`}\r\n </div>);\r\n }\r\n\r\n return (\r\n <input\r\n type='range'\r\n className='msc-rating__range'\r\n min={0}\r\n max={5}\r\n step={1}\r\n value={currentRating}\r\n aria-valuemax={5}\r\n aria-valuemin={0}\r\n aria-valuenow={currentRating}\r\n onChange={onChange}\r\n aria-label={ariaLabel}\r\n />\r\n );\r\n};\r\n\r\nconst renderStars = (rating: number, props: IRatingComponentProps, mouseOver: (event: React.MouseEvent<HTMLElement>) => void, onClick: (event: React.MouseEvent<HTMLElement>) => void): JSX.Element[] => {\r\n const floor = Math.floor(rating);\r\n const remainder = rating - floor;\r\n const filled = remainder < roundUpMin ? floor : floor + 1;\r\n const half = roundMidMin <= remainder && remainder < roundUpMin ? filled + 1 : 0;\r\n const stars = [];\r\n\r\n for (let i = 1; i <= maxRating; i++) {\r\n const glyphClass = filled >= i ? 'msc-rating__star' : (half === i ? 'msc-rating__half-star' : 'msc-rating__empty-star'!);\r\n stars.push(<span\r\n className={glyphClass} data-index={i} key={i}\r\n onMouseOver={props.readOnly ? undefined : mouseOver} onClick={onClick} role='presentation' />);\r\n }\r\n\r\n return stars;\r\n};\r\n\r\nconst getIndex = (event: React.MouseEvent<HTMLElement>): number => {\r\n const target = event.target as HTMLElement;\r\n return Number.parseInt(target.getAttribute('data-index')!, 10);\r\n};\r\n\r\n// @ts-expect-error\r\nexport const RatingComponent: React.FunctionComponent<IRatingComponentProps> = msdyn365Commerce.createComponent<IRatingComponent>(\r\n 'Rating',\r\n { component: Rating, ...RatingComponentActions }\r\n);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport {\r\n IComponent, IComponentProps, ICoreContext, IGridSettings,\r\n IImageData, IImageProps, IImageSettings, Image, IRequestContext, msdyn365Commerce\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeSwatch, AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions, DimensionTypes, generateImageUrl,\r\n getProductPageUrlSync, IDimensionsApp, StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { IPriceComponentResources, PriceComponent } from '../../../../nickComponents/price.components';\r\nimport { ISwatchItem } from '@msdyn365-commerce/components/src/product-dimension';\r\nimport { RatingComponent } from '../../../../nickComponents/rating.component';\r\nimport { ProductComponentSwatchComponent } from '../../../../nickComponents/product-component-swatch';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n inventoryLabel,\r\n isPriceMinMaxEnabled,\r\n priceResources\r\n}) => {\r\n const product = data.product;\r\n\r\n /**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\n function getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color);\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n }\r\n\r\n /**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls) ? generateImageUrl(\r\n defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings) : productData?.PrimaryImageUrl;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductPageUrlFromDefaultSwatch(coreContext: ICoreContext, productUrl: string, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n }\r\n\r\n let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl = productPageUrlFromSwatch, setProductPageUrl] = useState<string | undefined>();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState<string | undefined>();\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback((coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls) ? swatchItem.productImageUrls[0] : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n }, [context, productPageUrl]);\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-product__unit-of-measure'>\r\n <span>\r\n {unitOfMeasure}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__availability'>\r\n <span>\r\n {inventoryAvailabilityLabel}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes);\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__dimensions'>\r\n {\r\n attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches = item.Swatches?.map<ISwatchItem>(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault\r\n };\r\n }) ?? [];\r\n if (ArrayExtensions.hasElements(swatches) && !swatches.some(swatch => swatch.isDefault) && dimensionType === DimensionTypes.color) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n <ProductComponentSwatchComponent\r\n key={item.RecordId}\r\n context={context}\r\n onSelectDimension={updatePageAndImageUrl}\r\n swatches={swatches}\r\n />\r\n );\r\n })\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component. */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n }\r\n\r\n /**\r\n * Gets the aria label for rating.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Aria label format for rating.\r\n * @returns The product rating aria label string.\r\n */\r\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\r\n if (rating && ratingAriaLabelText) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabelText || '', roundedRating, '5');\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label for review count.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Aria label format for review.\r\n * @returns The product review count aria label string.\r\n */\r\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label string for product that includes product name with its price and rating.\r\n * @param name - Product name.\r\n * @param price - Product price.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Rating aria label text.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Number of ratings.\r\n * @returns The aria label string for the product card.\r\n */\r\n function renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return (\r\n `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${reviewCountArialableText ? ` ${reviewCountArialableText}` : ''}`\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @returns React component for product image.\r\n */\r\n function renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n {...image} {...imageProps} loadFailureBehavior='empty'\r\n requestContext={requestContext}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param basePrice - Product base price.\r\n * @param adjustedPrice - Product adjusted price.\r\n * @param maxVariantPrice - Product variant max price.\r\n * @param minVariantPrice - Product variant min price.\r\n * @param savingsPriceResourceText - Product price saving text.\r\n * @param freePriceResourceText - Product price free text.\r\n * @param originalPriceResourceText - Product price original text.\r\n * @param currentPriceResourceText - Product price current text.\r\n * @returns React component for Product price. */\r\n function renderPrice(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, basePrice?: number, adjustedPrice?: number,\r\n maxVariantPrice?: number, minVariantPrice?: number, savingsPriceResourceText?: string, freePriceResourceText?: string,\r\n originalPriceResourceText?: string, currentPriceResourceText?: string): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice,\r\n MaxVariantPrice: maxVariantPrice ? maxVariantPrice : adjustedPrice,\r\n MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n data={{ price }}\r\n savingsText={savingsPriceResourceText}\r\n freePriceText={freePriceResourceText}\r\n originalPriceText={originalPriceResourceText}\r\n currentPriceText={currentPriceResourceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param description - Product description.\r\n * @returns The product description component.\r\n */\r\n function renderDescription(description?: string): JSX.Element | null {\r\n return (<p className='msc-product__text'>\r\n {description}\r\n </p>);\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param avgRating - Average rating.\r\n * @param totalRatings - Total rating.\r\n * @param ariaLabel - Aria label for rating.\r\n * @returns React component for Product rating.\r\n */\r\n function renderRating(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, avgRating?: number,\r\n totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n avgRating={avgRating}\r\n ratingCount={numberRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabelText}\r\n ratingCountAriaLabel={ratingCountAriaLabelText}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <a\r\n href={productPageUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, productImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext)}\r\n </div>\r\n <div className='flex-vertical'>\r\n <div>\r\n <h4 className='msc-product__title'>\r\n {product.Name}\r\n </h4>\r\n {/* <div className='msc-product__sku'>\r\n SKU: {product.ItemId} \r\n </div> */}\r\n </div>\r\n </div>\r\n </a>\r\n <div className='connellyFlex flex-md'>\r\n {renderProductDimensions(product.AttributeValues)}\r\n <div className='msc-product__details'>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price,\r\n product.MaxVariantPrice, product.MinVariantPrice, savingsText, freePriceText, originalPriceText, currentPriceText)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n {!context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n </div>\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n <div className='connellyButton flex-vertical'>\r\n <a\r\n href={productPageUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='button' {...attribute}>\r\n <div className='newSpot'>Full Details</div>\r\n </a>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<IProductComponent>(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\n\r\nexport default ProductComponent;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport {\r\n IComponent, IComponentProps, ICoreContext, IGridSettings,\r\n IImageData, IImageProps, IImageSettings, Image, IRequestContext, msdyn365Commerce\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeSwatch, AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions, DimensionTypes, generateImageUrl,\r\n getProductPageUrlSync, IDimensionsApp, StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { IPriceComponentResources, PriceComponent } from '../../../../nickComponents/price.components';\r\nimport { ISwatchItem } from '@msdyn365-commerce/components/src/product-dimension';\r\nimport { RatingComponent } from '../../../../nickComponents/rating.component';\r\nimport { ProductComponentSwatchComponent } from '../../../../nickComponents/product-component-swatch';\r\n\r\n\r\n \r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\r\n\r\n\r\n\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n inventoryLabel,\r\n isPriceMinMaxEnabled,\r\n priceResources\r\n}) => {\r\n const product = data.product;\r\n\r\n\r\n \r\n /**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\n function getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color);\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n }\r\n\r\n /**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls) ? generateImageUrl(\r\n defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings) : productData?.PrimaryImageUrl;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductPageUrlFromDefaultSwatch(coreContext: ICoreContext, productUrl: string, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n }\r\n\r\n let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl = productPageUrlFromSwatch, setProductPageUrl] = useState<string | undefined>();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState<string | undefined>();\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback((coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls) ? swatchItem.productImageUrls[0] : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n }, [context, productPageUrl]);\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-product__unit-of-measure'>\r\n <span>\r\n {unitOfMeasure}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__availability'>\r\n <span>\r\n {inventoryAvailabilityLabel}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes);\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__dimensions'>\r\n {\r\n attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches = item.Swatches?.map<ISwatchItem>(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault\r\n };\r\n }) ?? [];\r\n if (ArrayExtensions.hasElements(swatches) && !swatches.some(swatch => swatch.isDefault) && dimensionType === DimensionTypes.color) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n <ProductComponentSwatchComponent\r\n key={item.RecordId}\r\n context={context}\r\n onSelectDimension={updatePageAndImageUrl}\r\n swatches={swatches}\r\n />\r\n );\r\n })\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component. */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n }\r\n\r\n /**\r\n * Gets the aria label for rating.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Aria label format for rating.\r\n * @returns The product rating aria label string.\r\n */\r\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\r\n if (rating && ratingAriaLabelText) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabelText || '', roundedRating, '5');\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label for review count.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Aria label format for review.\r\n * @returns The product review count aria label string.\r\n */\r\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label string for product that includes product name with its price and rating.\r\n * @param name - Product name.\r\n * @param price - Product price.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Rating aria label text.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Number of ratings.\r\n * @returns The aria label string for the product card.\r\n */\r\n function renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return (\r\n `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${reviewCountArialableText ? ` ${reviewCountArialableText}` : ''}`\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @returns React component for product image.\r\n */\r\n function renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n {...image} {...imageProps} loadFailureBehavior='empty'\r\n requestContext={requestContext}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param basePrice - Product base price.\r\n * @param adjustedPrice - Product adjusted price.\r\n * @param maxVariantPrice - Product variant max price.\r\n * @param minVariantPrice - Product variant min price.\r\n * @param savingsPriceResourceText - Product price saving text.\r\n * @param freePriceResourceText - Product price free text.\r\n * @param originalPriceResourceText - Product price original text.\r\n * @param currentPriceResourceText - Product price current text.\r\n * @returns React component for Product price. */\r\n function renderPrice(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, basePrice?: number, adjustedPrice?: number,\r\n maxVariantPrice?: number, minVariantPrice?: number, savingsPriceResourceText?: string, freePriceResourceText?: string,\r\n originalPriceResourceText?: string, currentPriceResourceText?: string): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice,\r\n MaxVariantPrice: maxVariantPrice ? maxVariantPrice : adjustedPrice,\r\n MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n data={{ price }}\r\n savingsText={savingsPriceResourceText}\r\n freePriceText={freePriceResourceText}\r\n originalPriceText={originalPriceResourceText}\r\n currentPriceText={currentPriceResourceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param description - Product description.\r\n * @returns The product description component.\r\n */\r\n function renderDescription(description?: string): JSX.Element | null {\r\n return (<p className='msc-product__text'>\r\n {description}\r\n </p>);\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param avgRating - Average rating.\r\n * @param totalRatings - Total rating.\r\n * @param ariaLabel - Aria label for rating.\r\n * @returns React component for Product rating.\r\n */\r\n function renderRating(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, avgRating?: number,\r\n totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n avgRating={avgRating}\r\n ratingCount={numberRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabelText}\r\n ratingCountAriaLabel={ratingCountAriaLabelText}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <a\r\n href={productPageUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, productImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext)}\r\n </div>\r\n <h4 className='msc-product__title'>\r\n {product.Name}\r\n </h4>\r\n <div className='msc-product__sku'>\r\n SKU: {product.ItemId} \r\n </div>\r\n </a>\r\n <div className='nickDescriptionText'>\r\n {renderProductDimensions(product.AttributeValues)}\r\n <div className='msc-product__details'>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price,\r\n product.MaxVariantPrice, product.MinVariantPrice, savingsText, freePriceText, originalPriceText, currentPriceText)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n {!context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n </div>\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n {/* <div className='connellyButton flex-vertical'>\r\n <a\r\n href={productPageUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='button' {...attribute}>\r\n <div className='newSpot'>Full Details</div>\r\n </a>\r\n </div> */}\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<IProductComponent>(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\n\r\nexport default ProductComponent;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n IComponent, IComponentProps, ICoreContext, IGridSettings,\r\n IImageData, IImageProps, IImageSettings, Image, IRequestContext, msdyn365Commerce\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeSwatch, ProductDimension, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions, checkIfShouldDisplayAsSwatch, convertDimensionTypeToProductDimensionType,\r\n Dictionary,\r\n DimensionSwatchDisplayTypes, DimensionTypes, generateImageUrl,\r\n getProductPageUrlSync, IDimensionsApp, StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { IPriceComponentResources, PriceComponent, ISwatchItem, RatingComponent, ProductComponentSwatchComponent } from '@msdyn365-commerce/components';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\r\n swatchItemAriaLabel?: string;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n inventoryLabel,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n dimensionAvailabilities,\r\n swatchItemAriaLabel\r\n}) => {\r\n const product = data.product;\r\n\r\n /**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\n function getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color);\r\n if (!ArrayExtensions.hasElements(colorAttribute?.Swatches)) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute!.Swatches.find(item => item.IsDefault === true) ?? colorAttribute!.Swatches[0];\r\n return defaultSwatch;\r\n }\r\n\r\n /**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productData?.PrimaryImageUrl;\r\n }\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls) ? generateImageUrl(\r\n defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings) : productData?.PrimaryImageUrl;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductPageUrlFromDefaultSwatch(coreContext: ICoreContext, productUrl: string, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productUrl;\r\n }\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n }\r\n\r\n let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\r\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\r\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\r\n const enableStockCheck = context.app.config.enableStockCheck;\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback((coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n selectedSwatchItems.setValue(dimensionType, swatchItem);\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls) ? swatchItem.productImageUrls[0] : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n }, [selectedSwatchItems, context, productPageUrl]);\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n const swatchItems = ArrayExtensions.validValues(product.AttributeValues?.map(item => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(\r\n dimensionTypeValue as DimensionTypes,\r\n context as ICoreContext<IDimensionsApp>,\r\n DimensionSwatchDisplayTypes.productCard);\r\n if (!shouldDisplayAsSwatch) {\r\n return null;\r\n }\r\n\r\n const siteContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches = item.Swatches?.map<ISwatchItem>(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault,\r\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\r\n isDisabled: enableStockCheck && dimensionAvailabilities?.find(\r\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? ''))?.isDisabled\r\n };\r\n }) ?? [];\r\n if (dimensionToPreSelectInProductCard !== DimensionTypes.none && ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) && dimensionType === DimensionTypes.color) {\r\n swatches[0].isDefault = true;\r\n }\r\n return { recordId: item.RecordId, swatches };\r\n }));\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-product__unit-of-measure'>\r\n <span>\r\n {unitOfMeasure}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__availability'>\r\n <span>\r\n {inventoryAvailabilityLabel}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(): JSX.Element | null {\r\n if (!ArrayExtensions.hasElements(swatchItems)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__dimensions'>\r\n {\r\n swatchItems.map(item => {\r\n return (\r\n <ProductComponentSwatchComponent\r\n key={item.recordId}\r\n context={context}\r\n onSelectDimension={updatePageAndImageUrl}\r\n swatches={item.swatches}\r\n />\r\n );\r\n })\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component.\r\n */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\r\n return {\r\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: swatches.value\r\n }\r\n };\r\n });\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\r\n }\r\n\r\n /**\r\n * Gets the aria label for rating.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Aria label format for rating.\r\n * @returns The product rating aria label string.\r\n */\r\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\r\n if (rating && ratingAriaLabelText) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabelText || '', roundedRating, '5');\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label for review count.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Aria label format for review.\r\n * @returns The product review count aria label string.\r\n */\r\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label string for product that includes product name with its price and rating.\r\n * @param name - Product name.\r\n * @param price - Product price.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Rating aria label text.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Number of ratings.\r\n * @returns The aria label string for the product card.\r\n */\r\n function renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return (\r\n `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${reviewCountArialableText ? ` ${reviewCountArialableText}` : ''}`\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @returns React component for product image.\r\n */\r\n function renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = context.app.config.placeholderImageName as string;\r\n let fallbackImageSource = fallbackImageUrl;\r\n if (emptyPlaceHolderImage && fallbackImageUrl) {\r\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageSource\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n {...image} {...imageProps} loadFailureBehavior='empty'\r\n requestContext={requestContext}\r\n bypassHideOnFailure\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param basePrice - Product base price.\r\n * @param adjustedPrice - Product adjusted price.\r\n * @param maxVariantPrice - Product variant max price.\r\n * @param minVariantPrice - Product variant min price.\r\n * @param savingsPriceResourceText - Product price saving text.\r\n * @param freePriceResourceText - Product price free text.\r\n * @param originalPriceResourceText - Product price original text.\r\n * @param currentPriceResourceText - Product price current text.\r\n * @returns React component for Product price.\r\n */\r\n function renderPrice(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, basePrice?: number, adjustedPrice?: number,\r\n maxVariantPrice?: number, minVariantPrice?: number, savingsPriceResourceText?: string, freePriceResourceText?: string,\r\n originalPriceResourceText?: string, currentPriceResourceText?: string): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice,\r\n MaxVariantPrice: maxVariantPrice ? maxVariantPrice : adjustedPrice,\r\n MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n data={{ price }}\r\n savingsText={savingsPriceResourceText}\r\n freePriceText={freePriceResourceText}\r\n originalPriceText={originalPriceResourceText}\r\n currentPriceText={currentPriceResourceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param description - Product description.\r\n * @returns The product description component.\r\n */\r\n function renderDescription(description?: string): JSX.Element | null {\r\n return (<p className='msc-product__text'>\r\n {description}\r\n </p>);\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param avgRating - Average rating.\r\n * @param totalRatings - Total rating.\r\n * @param ariaLabel - Aria label for rating.\r\n * @returns React component for Product rating.\r\n */\r\n function renderRating(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, avgRating?: number,\r\n totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n avgRating={avgRating}\r\n ratingCount={numberRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabelText}\r\n ratingCountAriaLabel={ratingCountAriaLabelText}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <a\r\n href={productPageUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, productImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext)}\r\n </div>\r\n\r\n <div className='msc-product__details'>\r\n <h4 className='msc-product__title'>\r\n {product.Name}\r\n </h4>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price,\r\n product.MaxVariantPrice, product.MinVariantPrice, savingsText, freePriceText, originalPriceText, currentPriceText)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n {!context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n </div>\r\n \r\n </a>\r\n {renderProductDimensions()}\r\n \r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n </>\r\n );\r\n};\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<IProductComponent>(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\n\r\nexport default ProductComponent;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport {\r\n IComponent, IComponentProps, ICoreContext, IGridSettings,\r\n IImageData, IImageProps, IImageSettings, Image, IRequestContext, msdyn365Commerce\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeSwatch, AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions, DimensionTypes, generateImageUrl,\r\n getProductPageUrlSync, IDimensionsApp, StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { IPriceComponentResources, PriceComponent } from '../../../../nickComponents/price.components';\r\nimport { ISwatchItem } from '@msdyn365-commerce/components/src/product-dimension';\r\nimport { RatingComponent } from '../../../../nickComponents/rating.component';\r\nimport { ProductComponentSwatchComponent } from '../../../../nickComponents/product-component-swatch';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n inventoryLabel,\r\n isPriceMinMaxEnabled,\r\n priceResources\r\n}) => {\r\n const product = data.product;\r\n\r\n /**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\n function getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color);\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n }\r\n\r\n /**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls) ? generateImageUrl(\r\n defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings) : productData?.PrimaryImageUrl;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductPageUrlFromDefaultSwatch(coreContext: ICoreContext, productUrl: string, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n }\r\n\r\n let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl = productPageUrlFromSwatch, setProductPageUrl] = useState<string | undefined>();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState<string | undefined>();\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback((coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls) ? swatchItem.productImageUrls[0] : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n }, [context, productPageUrl]);\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-product__unit-of-measure'>\r\n <span>\r\n {unitOfMeasure}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__availability'>\r\n <span>\r\n {inventoryAvailabilityLabel}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes);\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__dimensions'>\r\n {\r\n attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches = item.Swatches?.map<ISwatchItem>(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault\r\n };\r\n }) ?? [];\r\n if (ArrayExtensions.hasElements(swatches) && !swatches.some(swatch => swatch.isDefault) && dimensionType === DimensionTypes.color) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n <ProductComponentSwatchComponent\r\n key={item.RecordId}\r\n context={context}\r\n onSelectDimension={updatePageAndImageUrl}\r\n swatches={swatches}\r\n />\r\n );\r\n })\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component. */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n }\r\n\r\n /**\r\n * Gets the aria label for rating.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Aria label format for rating.\r\n * @returns The product rating aria label string.\r\n */\r\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\r\n if (rating && ratingAriaLabelText) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabelText || '', roundedRating, '5');\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label for review count.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Aria label format for review.\r\n * @returns The product review count aria label string.\r\n */\r\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label string for product that includes product name with its price and rating.\r\n * @param name - Product name.\r\n * @param price - Product price.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Rating aria label text.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Number of ratings.\r\n * @returns The aria label string for the product card.\r\n */\r\n function renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return (\r\n `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${reviewCountArialableText ? ` ${reviewCountArialableText}` : ''}`\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @returns React component for product image.\r\n */\r\n function renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n {...image} {...imageProps} loadFailureBehavior='empty'\r\n requestContext={requestContext}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param basePrice - Product base price.\r\n * @param adjustedPrice - Product adjusted price.\r\n * @param maxVariantPrice - Product variant max price.\r\n * @param minVariantPrice - Product variant min price.\r\n * @param savingsPriceResourceText - Product price saving text.\r\n * @param freePriceResourceText - Product price free text.\r\n * @param originalPriceResourceText - Product price original text.\r\n * @param currentPriceResourceText - Product price current text.\r\n * @returns React component for Product price. */\r\n function renderPrice(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, basePrice?: number, adjustedPrice?: number,\r\n maxVariantPrice?: number, minVariantPrice?: number, savingsPriceResourceText?: string, freePriceResourceText?: string,\r\n originalPriceResourceText?: string, currentPriceResourceText?: string): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice,\r\n MaxVariantPrice: maxVariantPrice ? maxVariantPrice : adjustedPrice,\r\n MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n data={{ price }}\r\n savingsText={savingsPriceResourceText}\r\n freePriceText={freePriceResourceText}\r\n originalPriceText={originalPriceResourceText}\r\n currentPriceText={currentPriceResourceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param description - Product description.\r\n * @returns The product description component.\r\n */\r\n function renderDescription(description?: string): JSX.Element | null {\r\n return (<p className='msc-product__text'>\r\n {description}\r\n </p>);\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param avgRating - Average rating.\r\n * @param totalRatings - Total rating.\r\n * @param ariaLabel - Aria label for rating.\r\n * @returns React component for Product rating.\r\n */\r\n function renderRating(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, avgRating?: number,\r\n totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n avgRating={avgRating}\r\n ratingCount={numberRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabelText}\r\n ratingCountAriaLabel={ratingCountAriaLabelText}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <a\r\n href={productPageUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, productImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext)}\r\n </div>\r\n <h4 className='msc-product__title'>\r\n {product.Name}\r\n </h4>\r\n </a>\r\n <div className='connellyFlex flex-sm'>\r\n {renderProductDimensions(product.AttributeValues)}\r\n <div className='msc-product__details'>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price,\r\n product.MaxVariantPrice, product.MinVariantPrice, savingsText, freePriceText, originalPriceText, currentPriceText)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n {!context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n </div>\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n <div className='connellyButton flex-vertical'>\r\n <a\r\n href={productPageUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='button' {...attribute}>\r\n <div className='newSpot'>Full Details</div>\r\n </a>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<IProductComponent>(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\n\r\nexport default ProductComponent;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport {\r\n IComponent, IComponentProps, ICoreContext, IGridSettings,\r\n IImageData, IImageProps, IImageSettings, Image, IRequestContext, msdyn365Commerce\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeSwatch, AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions, DimensionTypes, generateImageUrl,\r\n getProductPageUrlSync, IDimensionsApp, StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { IPriceComponentResources, PriceComponent } from '../../../../nickComponents/price.components';\r\nimport { ISwatchItem } from '@msdyn365-commerce/components/src/product-dimension';\r\nimport { RatingComponent } from '../../../../nickComponents/rating.component';\r\nimport { ProductComponentSwatchComponent } from '../../../../nickComponents/product-component-swatch';\r\n\r\n\r\n \r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\r\n\r\n\r\n\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n inventoryLabel,\r\n isPriceMinMaxEnabled,\r\n priceResources\r\n}) => {\r\n const product = data.product;\r\n\r\n\r\n \r\n /**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\n function getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color);\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n }\r\n\r\n /**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls) ? generateImageUrl(\r\n defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings) : productData?.PrimaryImageUrl;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductPageUrlFromDefaultSwatch(coreContext: ICoreContext, productUrl: string, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n }\r\n\r\n let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl = productPageUrlFromSwatch, setProductPageUrl] = useState<string | undefined>();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState<string | undefined>();\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback((coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls) ? swatchItem.productImageUrls[0] : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n }, [context, productPageUrl]);\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-product__unit-of-measure'>\r\n <span>\r\n {unitOfMeasure}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__availability'>\r\n <span>\r\n {inventoryAvailabilityLabel}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes);\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__dimensions'>\r\n {\r\n attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches = item.Swatches?.map<ISwatchItem>(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault\r\n };\r\n }) ?? [];\r\n if (ArrayExtensions.hasElements(swatches) && !swatches.some(swatch => swatch.isDefault) && dimensionType === DimensionTypes.color) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n <ProductComponentSwatchComponent\r\n key={item.RecordId}\r\n context={context}\r\n onSelectDimension={updatePageAndImageUrl}\r\n swatches={swatches}\r\n />\r\n );\r\n })\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component. */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n }\r\n\r\n /**\r\n * Gets the aria label for rating.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Aria label format for rating.\r\n * @returns The product rating aria label string.\r\n */\r\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\r\n if (rating && ratingAriaLabelText) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabelText || '', roundedRating, '5');\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label for review count.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Aria label format for review.\r\n * @returns The product review count aria label string.\r\n */\r\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label string for product that includes product name with its price and rating.\r\n * @param name - Product name.\r\n * @param price - Product price.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Rating aria label text.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Number of ratings.\r\n * @returns The aria label string for the product card.\r\n */\r\n function renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return (\r\n `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${reviewCountArialableText ? ` ${reviewCountArialableText}` : ''}`\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @returns React component for product image.\r\n */\r\n function renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n {...image} {...imageProps} loadFailureBehavior='empty'\r\n requestContext={requestContext}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param basePrice - Product base price.\r\n * @param adjustedPrice - Product adjusted price.\r\n * @param maxVariantPrice - Product variant max price.\r\n * @param minVariantPrice - Product variant min price.\r\n * @param savingsPriceResourceText - Product price saving text.\r\n * @param freePriceResourceText - Product price free text.\r\n * @param originalPriceResourceText - Product price original text.\r\n * @param currentPriceResourceText - Product price current text.\r\n * @returns React component for Product price. */\r\n function renderPrice(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, basePrice?: number, adjustedPrice?: number,\r\n maxVariantPrice?: number, minVariantPrice?: number, savingsPriceResourceText?: string, freePriceResourceText?: string,\r\n originalPriceResourceText?: string, currentPriceResourceText?: string): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice,\r\n MaxVariantPrice: maxVariantPrice ? maxVariantPrice : adjustedPrice,\r\n MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n data={{ price }}\r\n savingsText={savingsPriceResourceText}\r\n freePriceText={freePriceResourceText}\r\n originalPriceText={originalPriceResourceText}\r\n currentPriceText={currentPriceResourceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param description - Product description.\r\n * @returns The product description component.\r\n */\r\n function renderDescription(description?: string): JSX.Element | null {\r\n return (<p className='msc-product__text'>\r\n {description}\r\n </p>);\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param avgRating - Average rating.\r\n * @param totalRatings - Total rating.\r\n * @param ariaLabel - Aria label for rating.\r\n * @returns React component for Product rating.\r\n */\r\n function renderRating(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, avgRating?: number,\r\n totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n avgRating={avgRating}\r\n ratingCount={numberRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabelText}\r\n ratingCountAriaLabel={ratingCountAriaLabelText}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <a\r\n id={product.ItemId}\r\n href={productPageUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n \r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, productImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext)}\r\n </div>\r\n <h4 className='msc-product__title'>\r\n {product.Name}\r\n </h4>\r\n \r\n </a>\r\n <div className='nickDescriptionText'>\r\n {renderProductDimensions(product.AttributeValues)}\r\n <div className='msc-product__details'>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price,\r\n product.MaxVariantPrice, product.MinVariantPrice, savingsText, freePriceText, originalPriceText, currentPriceText)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n {!context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n </div>\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n {/* <div className='connellyButton flex-vertical'>\r\n <a\r\n href={productPageUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='button' {...attribute}>\r\n <div className='newSpot'>Full Details</div>\r\n </a>\r\n </div> */}\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<IProductComponent>(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\n\r\nexport default ProductComponent;","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { CartLine, ProductCatalog, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\n\n/**\n * ICartlineResourceString: Interface for specifying the\n * resource strings that the component needs.\n */\nexport interface ICartlineResourceString {\n /**\n * Display string for discount label\n */\n discountStringText: string;\n\n /**\n * String for size key\n */\n sizeString: string;\n\n /**\n * String for color key\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension\n */\n configString: string;\n\n /**\n * String for style key\n */\n styleString: string;\n\n /**\n * String for amount key\n */\n amountString?: string;\n\n /**\n * Display string for quantity label\n */\n quantityDisplayString: string;\n\n /**\n * Display string for quantity label\n */\n inputQuantityAriaLabel: string;\n\n /**\n * Aria label for the decrement button in quantity component\n */\n decrementButtonAriaLabel: string;\n\n /**\n * Aria label for the increment button in quantity component\n */\n incrementButtonAriaLabel: string;\n\n /**\n * Original text screenreader\n */\n originalPriceText: string;\n\n /**\n * Current text screenreader\n */\n currentPriceText: string;\n\n /**\n * Shipping Charges Text\n */\n shippingChargesText: string;\n\n priceEditorResources?: ICartLinePriceEditorResources;\n salesAgreementPricePrompt?: string;\n}\n\ninterface ICartLineData {\n cartLine: CartLine | SalesLine;\n cartState?: ICartState;\n product?: SimpleProduct;\n catalogs?: ProductCatalog[];\n}\n\n/**\n * ICartLineProps: The props required to render cartLineitem.\n */\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\n /**\n * The flag to change the quantity component from intractable to static.\n */\n disableQuantityInteractivity?: boolean;\n\n /**\n * The primary image url.\n */\n primaryImageUrl?: string;\n\n /**\n * The product url.\n */\n productUrl?: string;\n\n /**\n * GridSettings for the product image in cartLine.\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartLine.\n */\n imageSettings: IImageSettings;\n\n /**\n * Boolean flag to indicate if the item is out of stock.\n */\n isOutOfStock?: boolean;\n\n /**\n * Flag to make quantity section editable.\n */\n isQuantityEditable?: boolean;\n\n /**\n * Max quantity for line item.\n */\n maxQuantity?: number;\n\n /**\n * Current quantity for line item.\n */\n currentQuantity?: number;\n\n /**\n * Resource string for the component.\n */\n resources: ICartlineResourceString;\n\n /**\n * SalesLine flag.\n */\n isSalesLine?: boolean;\n\n /**\n * Error message to show in place of quantity.\n */\n errorMessage?: string;\n\n /**\n * Inventory information label.\n */\n inventoryInformationLabel?: string;\n\n /**\n * Inventory information class name.\n */\n inventoryLabelClassName?: string;\n\n /**\n * Flag to show/hide shipping charges for line items.\n */\n showShippingChargesForLineItems?: boolean;\n\n /**\n * Boolean flag to indicate if cart state status is ready.\n */\n isCartStateReady?: boolean;\n\n /**\n * Chanel Delivery Option configuration is from api.\n */\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n /**\n * The telemetry content.\n */\n telemetryContent?: ITelemetryContent;\n\n /**\n * The cart line index.\n */\n lineIndex?: number;\n\n /**\n * Quantity onChange callback.\n */\n quantityOnChange?(cartLine: CartLine, newQuantity: number, lineIndex?: number): boolean;\n}\n\ninterface IDimensionStrings {\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n}\n\n/**\n * Renders catalog label for the cart line.\n * @param props - Cart line props.\n * @returns Catalog label.\n */\nconst CatalogLabelComponent: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const catalogId = props.data.cartLine.CatalogId;\n\n if (!props.context.request.user.isB2b || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\n return null;\n }\n\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\n\n if (!catalog || !catalog.Name) {\n return null;\n }\n\n return <div className='msc-cart-line__catalog-label'>{catalog.Name}</div>;\n};\n\nconst CartLineItemFunctions = {\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\n if (!Product || !Product.Dimensions) {\n return [];\n }\n\n return Product.Dimensions.map(productDimension => {\n if (productDimension.DimensionTypeValue === 1) {\n return (\n <div key={`${Product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-color'>\n {DimensionStrings.colorString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 2) {\n return (\n <div key={`${Product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-configuration'>\n {DimensionStrings.configString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 3) {\n return (\n <div key={`${Product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-size'>\n {DimensionStrings.sizeString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 4) {\n return (\n <div key={`${Product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-style'>\n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n return null;\n });\n },\n\n renderDiscountLines: (props: ICartLineProps) => {\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\n return null;\n }\n\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n return (\n <div key={discountLine.OfferId || index} className='msc-cart-line-item-product-discount'>\n <span>\n {discountLine.OfferName ? discountLine.OfferName : ''}:{` ${props.resources.discountStringText || 'Discount'} `}\n </span>\n <span className='cart-line-item-product-discount-price'>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n // @ts-expect-error\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: discountLine.EffectiveAmount,\n BasePrice: discountLine.EffectiveAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n />\n </span>\n <span>{` (${discountLine.EffectivePercentage !== undefined ? discountLine.EffectivePercentage : ''}%)`}</span>\n </div>\n );\n });\n },\n renderInventoryLabel: (props: ICartLineProps) => {\n if (!props.inventoryInformationLabel) {\n return null;\n }\n const inventoryCssName = props.inventoryLabelClassName\n ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`\n : 'msc-cart-line__product-inventory-label';\n return <span className={inventoryCssName}>{props.inventoryInformationLabel}</span>;\n },\n\n /**\n * Gets the react node for product unit of measure display.\n * @param props - Icartline props.\n * @returns The node representing markup for unit of measure component.\n */\n renderUnitOfMeasure: (props: ICartLineProps) => {\n if (props.data.cartLine.IsInvoiceLine) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\n return undefined;\n }\n\n const product = props.data.product;\n if (!product || !product.DefaultUnitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-cartline__product-unit-of-measure'>\n <span>{product.DefaultUnitOfMeasure}</span>\n </div>\n );\n },\n renderShippingLabel: (props: ICartLineProps) => {\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\n const cartline = props.data.cartLine;\n let hasShippingMethod = false;\n if (channelDeliveryOptionConfig !== undefined) {\n hasShippingMethod = !!(\n cartline.DeliveryMode &&\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode)\n );\n } else {\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\n }\n if (!hasShippingMethod) {\n return undefined;\n }\n\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\n\n if (shippingChargeLines.length === 0) {\n return undefined;\n }\n\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\n }, 0);\n\n const priceComponent = (\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: freightFee\n }\n }}\n freePriceText='Free'\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__freight-actual'\n />\n );\n return (\n <>\n <label className='msc-cart-line__freight-label'>{`${props.resources.shippingChargesText}:`}</label>\n <span className='shipping-value'>{priceComponent}</span>\n </>\n );\n },\n renderOtherCharges: (props: ICartLineProps) => {\n const cartline = props.data.cartLine;\n const otherCharges = cartline.ChargeLines?.filter(chargeline => !chargeline.IsShipping);\n\n return (\n (otherCharges &&\n otherCharges.map((otherCharge, key) => {\n return otherCharge && otherCharge.CalculatedAmount ? (\n <div className='msc-cart-line__other-charges' key={key}>\n <label className='msc-cart-line__other-charges-label'>{`${otherCharge.Description}:`}</label>\n <span className='other-charge-value'>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: otherCharge.CalculatedAmount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__other-charges-actual'\n />\n </span>\n </div>\n ) : (\n ''\n );\n })) ||\n undefined\n );\n },\n\n /**\n * Render the sales agreement prompt.\n * @param props - The ICartLineProps.\n * @returns The JSX.Element.\n */\n renderSalesAgreementPrompt: (props: ICartLineProps): JSX.Element | null => {\n if (props.data.cartLine.SalesAgreementLineRecordId === 0) {\n return null;\n }\n return <div className='msc-cart-line__sales-agreement-prompt'>{props.resources.salesAgreementPricePrompt}</div>;\n }\n};\n\n// eslint-disable-next-line no-redeclare\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const { isSalesLine, productUrl, resources } = props;\n const { product, cartLine } = props.data;\n\n const destructDimensionStrings = {\n sizeString: resources.sizeString,\n colorString: resources.colorString,\n styleString: resources.styleString,\n configString: resources.configString,\n amountString: resources.amountString\n };\n\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n const imageSettings = props.imageSettings;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\n const renderUnitOfMeasure = CartLineItemFunctions.renderUnitOfMeasure(props);\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\n const renderSalesAgreementPrompt = CartLineItemFunctions.renderSalesAgreementPrompt(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\n const productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const productName = product?.Name || cartLine.Description;\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\n\n const onChange = (newValue: number): boolean => {\n if (props.quantityOnChange) {\n return props.quantityOnChange(props.data.cartLine, newValue, props.lineIndex);\n }\n return true;\n };\n\n const _generateErrorMessage = (): JSX.Element | null => {\n if (props.errorMessage) {\n return (\n <div className='msc-cart-line__error-message msc-alert__header'>\n <span className='msi-exclamation-triangle' />\n <span>{props.errorMessage}</span>\n </div>\n );\n }\n\n return null;\n };\n\n const _generateQuantityandPrice = (): JSX.Element[] | null => {\n const nodes = [];\n if (props.isOutOfStock) {\n return null;\n }\n\n // No quantity selector for invoice line\n if (!props.data.cartLine.IsInvoiceLine) {\n if (props.data.product && props.isQuantityEditable) {\n nodes.push(\n <div className='msc-cart-line__product-quantity'>\n <div className='msc-cart-line__product-quantity-label'>{resources.quantityDisplayString}</div>\n <IncrementalQuantity\n id={`msc-cart-line__quantity_${props.data.product.RecordId}-${props.data.cartLine.DeliveryMode}-${props.data.cartLine.LineId}`}\n max={props.maxQuantity || 10}\n currentCount={props.currentQuantity}\n onChange={onChange}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n key={props.data.cartLine.LineId}\n disabled={!props.isCartStateReady}\n isGiftCard={props.data.product.IsGiftCard}\n telemetryContent={props.telemetryContent}\n />\n </div>\n );\n } else {\n nodes.push(\n <div className={classNames('msc-cart-line__quantity', { 'single-quantity': props.data.cartLine.Quantity === 1 })}>\n <label className='quantity-label'>{resources.quantityDisplayString}:</label>\n <span className='quantity-value'>{props.data.cartLine.Quantity}</span>\n </div>\n );\n }\n }\n\n nodes.push(\n <div className='msc-cart-line__product-savings'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n // @ts-expect-error\n CustomerContextualPrice: props.data.cartLine.NetAmount,\n BasePrice: props.data.cartLine.Price\n }\n }\n : {\n price: {\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-actual'\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n />\n {(props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 && (\n <>\n <span className='msc-cart-line__product-savings-label'>\n {` ${props.resources.discountStringText || 'Discount'} `}\n </span>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n // @ts-expect-error\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: props.data.cartLine.DiscountAmount,\n BasePrice: props.data.cartLine.DiscountAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-text'\n salesAgreementLineId={props.data.cartLine.SalesAgreementLineRecordId}\n />\n </>\n )) ||\n null}\n </div>\n );\n\n return nodes;\n };\n\n return (\n <>\n <div className='msc-cart-line'>\n <div className={imgeClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n src={props.primaryImageUrl ?? 'empty'}\n fallBackSrc={fallbackImageUrl}\n altText={productName}\n gridSettings={props.gridSettings}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n <div className='msc-cart-line__content'>\n <div className='msc-cart-line__product'>\n <CatalogLabelComponent {...props} />\n {MsDyn365.isBrowser ? (\n <a className='msc-cart-line__product-title' {...productAttribute} href={productUrl} key={productUrl}>\n {productName}\n </a>\n ) : null}\n {ArrayExtensions.hasElements(productDimensions) ? (\n <div className='msc-cart-line__product-variants'>{productDimensions}</div>\n ) : (\n ''\n )}\n {renderUnitOfMeasure}\n <div className='msc-cart-line__product-price'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n // @ts-expect-error - existing code.\n CustomerContextualPrice: props.data.cartLine.NetAmount,\n BasePrice: props.data.cartLine.Price\n }\n }\n : {\n price: {\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='discount-value'\n salesAgreementLineId={props.data.cartLine.SalesAgreementLineRecordId}\n />\n </div>\n {renderDisountLines}\n {renderInventoryLabel}\n {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>{renderShippingLabel}</div>}\n {renderOtherCharges}\n {renderSalesAgreementPrompt}\n </div>\n {_generateQuantityandPrice()}\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\n <CartLinePriceEditor\n className='msc-cart-line__price-editor-container'\n context={props.context}\n resources={props.resources.priceEditorResources}\n cartState={props.data.cartState}\n cartLine={props.data.cartLine}\n />\n )}\n </div>\n </div>\n {_generateErrorMessage()}\n </>\n );\n};\n\nexport default CartLine;\n"],"names":["ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","next","_objectSpread","undefined","rangeStart","RightValueBoundString","rangeEnd","push","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","Values","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","React","constructor","props","super","closeButtonGlyph","_onClick","e","preventDefault","stopPropagation","target","currentTarget","clearAll","getAttribute","includes","selectedRefiner","this","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","payLoad","getPayloadObject","telemetryContent","selectedRefinersMap","_this$props$context","selectedChoices","channelInventoryConfigurationId","refinerHierarchy","context","app","config","productListInventoryDisplay","ProductListInventoryFilteringOptions","filter","choice","parent","hierarchy","value","RecordId","map","key","_getKeyForRefinerValue","render","clearAllText","label","classNames","choiceAriaLabel","closeAriaLabel","items","contentAction","etext","clearAllAttributes","getTelemetryAttributes","className","length","classnames","item","attribute","Object","assign","ref","urlBuilder","onClick","role","choiceFormat","choiceRangeValueFormat","telemetry","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","warning","replace","_formatPrice","UnitText","LeftValueBoundLocalizedString","amount","currency","trace","result","cultureFormatter","formatCurrency","Number","error","selected","textContent","trim","__decorate","computed","observer","ErrorMessage","_ref","text","FeatureSearchResultItem","product","imageSettings","resources","recommendation","productName","Name","productRecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","requestContext","apiSettings","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","toString","href","onTelemetryClick","gridSettings","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","request","PrimaryImageUrl","title","Link","ariaLabel","ModalToggle","innerRef","id","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","Button","modalCloseButtonText","getInventoryLabel","ArrayExtensions","AttributeValues","inventoryAttribute","TextValue","ProductSearchResultItems","products","moduleType","moduleId","allowBackNavigation","quickviewSlot","isPriceMinMaxEnabled","productsDimensionAvailabilities","priceResources","priceRangeSeparator","index","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","typeName","data","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","minValue","maxValue","labels","sliderKeyString","sliderThumbs","state","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","setState","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","max","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","event","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","touched","validationError","validationErrorRange","input","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","RefineItem","anchorType","_productRefinerValue$","_this$props","productCountAriaLabel","singleProductCountAriaLabel","children","refineItemAriaLabel","refineItemsAriaLabel","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","itemTypeClassName","SourceValue","_renderRating","productText","productCount","Count","refineMenuItemAriaLabel","format","_getRefinerUrl","tabIndex","_renderSwatch","_this$props$parentPro","_this$props$parentPro2","_productRefinerValue$2","dimensionType","toLocaleLowerCase","hasColor","StringExtensions","SwatchColorHexCode","hasImage","SwatchImageUrl","swatchItems","checkIfShouldDisplayAsSwatch","itemId","colorHexCode","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","isMobile","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","onUpdateRefiners","prevState","Separator","separator","Title","expandRefinersCount","NewTitleTag","SearchResultContainer","SearchResultContainer_1","_this$props$context$r6","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","_viewport","expandrefinerCount","defaultPageNumber","catalogId","getCatalogId","handleParagraphChange","content","handleTextChange","newTitle","_getProductsDimensionsAvailabilities","async","_this$props$data$list","_this$props$data$list2","productsList","listPageState","activeProducts","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","query","q","category","getFriendlyName","locale","NameTranslations","productCountNumber","productCountText","totalProductCount","count","numberOfProducts","oneProduct","TitleContainer","telemetryPageName","toLowerCase","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","_shouldHideFromRefiners","activeRefiners","activeFilters","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_this$props$data$prod","_getChoiceSummary","_this$props$data$prod2","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$data$feat","_this$props$data$prod3","breaCrumbType","breadcrumbType","quickviewslot","slots","quickview","isPriceMinMaxFeatureState","featureState","IsEnabled","notification","window","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","option","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","paginationPreviousText","paginationNextText","device","Type","_updateViewport","productPrices","pending","validationErrorNotNumber","validationErrorNotRange","getTelemetryObject","friendlyName","then","querySorting","sorting","parse","decodeURIComponent","pageSize","hydrateRefinersFromUrl","reaction","_this$props$context$r","_this$props$context$r2","GetFullProductsByCollectionInput","Paging","Top","Skip","Math","Sorting","ProductId","productId","Recommendation","includeAttributes","getCollectionProducts","productResults","_this$props$context$a","_this$props$context$a2","enableAffiliationBasedPricing","user","isAuthenticated","_listPageState$curren","_listPageState$sortin","_listPageState$active","_this$props$context$r3","_this$props$context$r4","_this$props$context$r5","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","catch","featureProduct","listPageStateFeature","static","nameTranslations","_nameTranslation","nameTranslation","Language","Text","_this$props$context$a3","_this$props$context$a4","MsDyn365","addEventListener","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","componentWillUnmount","removeEventListener","_this$props$context$r7","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","Content","Msdyn365","editProps","onEdit","NewTitle","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","renderView","_getViewport","variant","VariantType","observable","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","renderRefiner","Node","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","_props$context$action","Module","Logo","TelemetryConstant","attributes","_renderLogo","link","linkUrl","destinationUrl","openInNewTab","version","x","y","viewBox","d","points","_renderImage","defaultImageSettings","viewports","xs","w","h","lg","lazyload","image","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","targetId","HeaderPreferredStore","handleClick","_findPreferreStoreOnClick","storeSelectorStateManager","storeSelector","storeName","preferredStore","StoreName","headerPreferredStoreText","color","headerPreferredStoreAriaLabel","modules","storeSelectorId","keys","openDialog","showMapViewLink","onLocationSelected","orgUnitLocation","Promise","resolve","message","debug","Header","handleLinkTextChange","linkIndex","myAccountLinks","linkText","popOverRef","_toggleNavbar","_togglePopover","_keydown","mobileMenuCollapsed","signinPopoverOpen","displayName","_this$props$data$acco","customer","accountInformation","FirstName","componentDidMount","cart","cartLabel","cartQtyLabel","logoLink","logoImage","headerClassName","navbarKey","cartIconSlot","_getSlot","menuBarSlot","searchSlot","siteOptionsSlot","preferredStoreSlot","viewProps","logo","wishListIconDesktop","WishListIconComponent","showButtonTooltip","wishlistTooltipText","wishListIconMobile","cartIcon","CartIconComponent","navIcon","menuBar","search","siteOptions","HeaderTag","HeaderContainer","HeaderTopBarContainer","Divider","MobileMenuContainer","wrapClassName","MobileMenuHeader","MobileMenuBodyContainer","MobileMenuLinksContainer","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","Popover","placement","signInLink","_getSigninButton","signOutLink","_getSignOutButton","accountInfoDropdownButton","_getAccountInfoDropdownButton","accountLinks","_getAccountLinks","slotName","signInLinkText","signInUrl","signInLinkAriaText","signOutLinkText","signOutUrl","signOutLinkAriaText","cta","editableLink","additionalProperties","onTextChange","keyCode","KeyCodes","renderCustomerName","_renderReactFragment","slot","_renderDesktopAccountBlock","renderForMobile","accountClassName","Drawer","openGlyph","closeGlyph","glyphPlacement","toggleButtonText","_renderMobileAccountBlock","_renderCollapseMenu","logoLinkSvg","LogoLinkSvg","_transitionStatusToClassHash","entering","entered","exiting","exited","_tagRef","height","_onEntering","_onExit","_onExited","_onExiting","_reevaluateHeight","navbar","cssModule","in","collapseIn","mountOnEnter","unmountOnExit","appear","enter","exit","onEnter","onEntering","onEntered","onExit","onExiting","onExited","otherProps","Tag","transitionProps","Transition","status","collapseClass","_getTransitionClass","classes","mapToCssModules","node","firstElementChild","scrollHeight","isAppearing","_extends","i","arguments","source","prototype","hasOwnProperty","call","apply","defaultProps","styles","xmlns","xmlSpace","Logosvg","kentMenuBar","_renderAccountBlock","refinerValues","filterValue","r","productComparisonButton","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasContentSwatch","_props$context$reques","_props$context$reques2","isListPageStateUpdated","_updateListPageState","_this$props$config$it","_this$props$config$it2","DimensionSwatchDisplayTypes","inventoryAwareSortableAttributeId","_this$props$data$refi","n","_this$props$slots","_this$props$slots$qui","_this$props$data$prod4","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","_this$props$data$list6","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$config","newListPageState","recordId","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r8","_listPageState$result","_listPageState$result2","_this$props$context$r9","_this$props$data$list7","_this$props$data$list8","productCollection","showStrikethroughPricing","originalPrice","getOriginalPrice","price","CustomerContextualPrice","BasePrice","TradeAgreementPrice","AdjustedPrice","shouldUseFreePriceText","renderCurrentPrice","initialPrice","maxVariantPrice","MaxVariantPrice","minVariantPrice","MinVariantPrice","_props$priceResources","itemProp","renderCurrentPriceWithOriginalPrice","savingsText","PriceComponent","msdyn365Commerce","component","SwatchItemComponent","isSelected","onSelectItem","style","isColored","selectItem","selectionHandler","backgroundColor","fullImageUrl","generateSwatchImageUrl","onKeyPress","alt","shouldDisplayText","disabled","_props$isSelectionEna","containerClassName","selectedItemId","setSelectedItemId","didUserSetAnyItem","setDidUserSetAnyItem","onSelectItemCallback","ObjectExtensions","defaultItem","isDefault","ProductComponentSwatchComponent","swatches","onSelectDimension","Dropdown","selectMenu","_onChanged","selectedIndex","selectId","innerText","dropdownName","dropdownList","dropdownToggleName","hidden","getProductConfigure","moduleName","pageName","selectDimensionFormatString","callbacks","productDimensions","configureErrors","getDropdownName","onChanged","dimensionChanged","dimensionSelectedAsync","dropdowns","productDimensionFull","mapProductDimensionFullToDropdownViewProps","dropdownCallback","DimensionTypeValue","DimensionValues","dM","Value","containerProps","labelContainerProps","htmlFor","errors","select","RatingComponentActions","onSliderChanged","setRating","rating","lastSelectedRating","onMouseLeave","_event","onMouseOver","getIndex","Rating","initialRating","useState","useEffect","newRating","starControl","ratingCountAriaLabel","renderStars","currentRating","reviewCountAriaLabel","type","mouseOver","floor","remainder","filled","half","stars","glyphClass","_product$Name","_getProductImageUrlFr","_getProductPageUrlFro","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","pathname","getDefaultColorSwatchSelected","productData","_colorAttribute$Swatc","_colorAttribute$Swatc2","_colorAttribute$Swatc3","colorAttribute","attributeValue","_attributeValue$KeyNa","defaultSwatch","Swatches","IsDefault","productImageUrlFromSwatch","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","updatePageAndImageUrl","swatchItem","productPageUrlWithSwatch","newUrl","searchParams","delete","swatchProductImageUrl","productImageUrls","newImageUrl","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","getRatingAriaLabel","ratingAriaLabelText","roundedRating","toFixed","getReviewAriaLabel","reviewCount","ratingCountAriaLabelText","renderLabel","name","reviewCountArialableText","Price","AverageRating","TotalRatings","productCardimageSettings","fallbackImageUrl","cropFocalRegion","attributeValues","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","shouldDisplayDimension","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","some","swatch","basePrice","adjustedPrice","savingsPriceResourceText","freePriceResourceText","originalPriceResourceText","currentPriceResourceText","renderPrice","unitOfMeasure","DefaultUnitOfMeasure","description","Description","totalRatings","numberRatings","renderRating","inventoryAvailabilityLabel","selectedProductId","renderQuickView","_product$AttributeVal","dimensionToPreSelectInProductCard","selectedSwatchItems","Dictionary","enableStockCheck","setValue","_dimensionAvailabilit","_swatchItem$SwatchVal3","emptyPlaceHolderImage","placeholderImageName","fallbackImageSource","bypassHideOnFailure","selectedDimensions","getValues","convertDimensionTypeToProductDimensionType","DimensionValue","CatalogLabelComponent","cartLine","CatalogId","isB2b","catalogs","catalog","CartLineItemFunctions","renderProductDimensions","Product","DimensionStrings","Dimensions","productDimension","colorString","configString","sizeString","IsGiftCard","amountString","styleString","DiscountLines","discountLine","OfferId","OfferName","discountStringText","isSalesLine","PeriodicDiscount","EffectiveAmount","EffectivePercentage","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","IsInvoiceLine","pickupDeliveryModeCode","channel","PickupDeliveryModeCode","channelDeliveryOptionConfig","cartline","hasShippingMethod","_channelDeliveryOptio","DeliveryMode","PickupDeliveryModeCodes","deliveryMode","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","reduce","chargeTotal","CalculatedAmount","priceComponent","shippingChargesText","_cartline$ChargeLines","otherCharges","chargeline","otherCharge","SalesAgreementLineRecordId","salesAgreementPricePrompt","_props$primaryImageUr","destructDimensionStrings","renderDisountLines","renderInventoryLabel","renderUnitOfMeasure","renderShippingLabel","renderOtherCharges","renderSalesAgreementPrompt","productAttribute","imgeClassName","newValue","quantityOnChange","lineIndex","primaryImageUrl","NetAmount","NetAmountWithoutTax","NetPrice","salesAgreementLineId","showShippingChargesForLineItems","_generateQuantityandPrice","nodes","isOutOfStock","isQuantityEditable","quantityDisplayString","IncrementalQuantity","LineId","maxQuantity","currentCount","currentQuantity","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","isCartStateReady","isGiftCard","Quantity","DiscountAmount","cartState","priceEditorResources","CartLinePriceEditor"],"sourceRoot":""}