{"version":3,"file":"static/js/b6a20886a0e7607d7f2d.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/actions/get-organization-customer.ts?79c2","webpack://Msdyn365.Commerce.Online/./src/actions/entities/validate-alcohol-license.ts?763b","webpack://Msdyn365.Commerce.Online/./src/actions/validate-alcohol-license.action.ts?c46b","webpack://Msdyn365.Commerce.Online/./src/components/switch/switch.tsx?ec26","webpack://Msdyn365.Commerce.Online/./src/components/common/product-list-order-quantity.tsx?cd94","webpack://Msdyn365.Commerce.Online/./src/components/toast/toast.ts?c1fc","webpack://Msdyn365.Commerce.Online/./src/components/unit-of-measure/utils/humanize-unit-of-measure.ts?110c","webpack://Msdyn365.Commerce.Online/./src/components/unit-of-measure/unit-of-measure.tsx?45a5","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search-result-container/actions/refiner-utils.ts?04ba","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/actions/get-auto-suggest-suggestions.ts?de55","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.categorysuggest.tsx?421f","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.form.tsx?6f55","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.keywordsuggest.tsx?f399","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.label.tsx?35ea","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/cart-count.tsx?8b32","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/buy-section.tsx?a894","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.productsuggest.tsx?20c9","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/dlvry-search.props.autogenerated.ts?c305","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/dlvry-search.tsx?e0db","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.hooks.tsx?2f7a","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/dlvry-search.view.tsx?08b5","webpack://Msdyn365.Commerce.Online/./src/shared-utils/attributes/on-buy-access-validator.ts?4b31","webpack://Msdyn365.Commerce.Online/./src/shared-utils/string-utils.ts?de49","webpack://Msdyn365.Commerce.Online/./src/shared-utils/unit-conversion-utils.ts?1560","webpack://Msdyn365.Commerce.Online/./src/themes/dlvry-adventureworks/views/components/price.component.tsx?b372","webpack://Msdyn365.Commerce.Online/./lib/dlvry-search/module-registration.js?3943","webpack://Msdyn365.Commerce.Online/./src/search-state.ts?dd10","webpack://Msdyn365.Commerce.Online/./src/search-state-data-action.ts?8223","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["import { createObservableDataAction, IActionContext, IAction, ICreateActionContext, IGeneric, IAny, ICommerceApiSettings } from '@msdyn365-commerce/core';\r\nimport { CacheType, callActionOrExecute, Customer, DataServiceQuery, IActionInput, IDataServiceRequest } from \"@msdyn365-commerce/retail-proxy\";\r\nimport * as Entities from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\n\r\nexport class GetOrganizationCustomerInput implements IActionInput {\r\n private readonly user: string | undefined;\r\n private readonly query: DataServiceQuery;\r\n\r\n constructor(apiSettings: ICommerceApiSettings, user: string) {\r\n this.user = user;\r\n\r\n this.query = new DataServiceQuery();\r\n }\r\n\r\n public getDataServiceRequest = (): IDataServiceRequest => {\r\n return this.query.createDataServiceRequestForOperation(\r\n 'GetOrganizationCustomer',\r\n false,\r\n Entities.CustomerClass,\r\n 'false',\r\n {\r\n bypassCache: 'get',\r\n returnEntity: 'Entities.CustomerClass'\r\n },\r\n {}\r\n );\r\n };\r\n\r\n public shouldCacheOutput = (): boolean => false;\r\n\r\n public getCacheKey = () => `OrganizationCustomer-${this.user}`;\r\n public getCacheObjectType = () => 'OrganizationCustomer';\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext>): GetOrganizationCustomerInput => {\r\n const { user } = inputData.requestContext;\r\n return new GetOrganizationCustomerInput(inputData.requestContext.apiSettings, user.customerAccountNumber ?? \"\");\r\n};\r\n\r\nexport const getOrganizationCustomerAction = async (input: GetOrganizationCustomerInput, ctx: IActionContext): Promise => {\r\n if (!ctx.requestContext.user.isAuthenticated) {\r\n return {};\r\n }\r\n var customer = await callActionOrExecute(input.getDataServiceRequest(), ctx);\r\n return customer;\r\n};\r\n\r\nexport const getOrganizationCustomer = createObservableDataAction({\r\n id: 'src/actions/get-organization-customer',\r\n action: >getOrganizationCustomerAction,\r\n input: createInput\r\n});\r\n\r\nexport default getOrganizationCustomer;\r\n","import * as EntityClasses from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\n\r\n/**\r\n * AlcoholLicenseValidationDetails entity interface.\r\n */\r\nexport interface IAlcoholLicenseValidationDetails {\r\n Message?: string;\r\n LicenseNeeded?: number;\r\n ProductId?: number;\r\n}\r\n\r\n/**\r\n * AlcoholValidationCriteria entity interface.\r\n */\r\nexport interface IAlcoholValidationCriteria {\r\n ProductIds: number[];\r\n CatalogId: number;\r\n}\r\n\r\n/**\r\n * ValidateAlcoholLicenseResult entity interface.\r\n */\r\nexport interface IValidateAlcoholLicenseResult {\r\n ValidationResult?: boolean;\r\n CustomerLicense?: number;\r\n Details?: IAlcoholLicenseValidationDetails[];\r\n}\r\n\r\n/**\r\n * AlcoholValidationCriteria entity class.\r\n */\r\nexport class AlcoholValidationCriteriaExtensionClass implements IAlcoholValidationCriteria {\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public ProductIds: number[];\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public CatalogId: number;\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.CatalogId = odataObject.CatalogId;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ProductIds = undefined;\r\n if (odataObject.ProductIds) {\r\n this.ProductIds = [];\r\n for (var i = 0; i < odataObject.ProductIds.length; i++) {\r\n if (odataObject.ProductIds[i]) {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ProductIds[i] =\r\n parseInt(odataObject.ProductIds[i], 10);\r\n\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ProductIds[i] = undefined;\r\n }\r\n }\r\n }\r\n\r\n }\r\n}\r\n\r\n/**\r\n * AlcoholLicenseValidationDetails entity class.\r\n */\r\nexport class AlcoholLicenseValidationDetailsExtensionClass implements IAlcoholLicenseValidationDetails {\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public Message: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public LicenseNeeded: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public ProductId: number;\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Message = odataObject.Message;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.LicenseNeeded = odataObject.LicenseNeeded;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ProductId = (odataObject.ProductId) ? parseInt(odataObject.ProductId, 10) : 0;\r\n }\r\n}\r\n\r\n/**\r\n * ValidateAlcoholLicenseResult entity class.\r\n */\r\nexport class ValidateAlcoholLicenseResultExtensionClass implements IValidateAlcoholLicenseResult {\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public ValidationResult: boolean;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public CustomerLicense: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public Details: IAlcoholLicenseValidationDetails[];\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ValidationResult = odataObject.ValidationResult;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.CustomerLicense = odataObject.CustomerLicense;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Details = undefined;\r\n if (odataObject.Details) {\r\n this.Details = [];\r\n for (var i = 0; i < odataObject.Details.length; i++) {\r\n if (odataObject.Details[i]) {\r\n if (odataObject.Details[i]['@odata.type']) {\r\n var className: string = odataObject.Details[i]['@odata.type'];\r\n className = className.substr(className.lastIndexOf('.') + 1).concat(\"Class\");\r\n if (EntityClasses[className]) {\r\n this.Details[i] = new EntityClasses[className](odataObject.Details[i]);\r\n }\r\n } else {\r\n this.Details[i] = new AlcoholLicenseValidationDetailsExtensionClass(odataObject.Details[i]);\r\n }\r\n\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Details[i] = undefined;\r\n }\r\n }\r\n }\r\n\r\n }\r\n}","import { IActionContext } from '@msdyn365-commerce/core';\r\nimport { DataServiceQuery, IDataServiceRequest, callActionOrExecute } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { ValidateAlcoholLicenseResultExtensionClass, IValidateAlcoholLicenseResult, IAlcoholValidationCriteria } from './entities/validate-alcohol-license';\r\n\r\nfunction validateAlcoholLicenseQuery(): DataServiceQuery {\r\n return new DataServiceQuery();\r\n}\r\n\r\nexport function validateAlcoholLicenseInput(validationCriteria: IAlcoholValidationCriteria): IDataServiceRequest {\r\n const query = validateAlcoholLicenseQuery();\r\n return query.createDataServiceRequestForOperation(\r\n 'ValidateAlcoholLicense',\r\n true,\r\n ValidateAlcoholLicenseResultExtensionClass,\r\n 'false',\r\n { bypassCache: 'get', returnEntity: 'IValidateAlcoholLicenseResult' },\r\n {\r\n validationCriteria: validationCriteria\r\n }\r\n );\r\n}\r\n\r\nexport async function validateAlcoholLicenseAsync(ctx: IActionContext, validationCriteria: IAlcoholValidationCriteria): Promise {\r\n const request = validateAlcoholLicenseInput(validationCriteria);\r\n const result = await callActionOrExecute(request, ctx);\r\n return result;\r\n}\r\n","import * as React from 'react';\r\nimport classnames from 'classnames';\r\n\r\ninterface ISwitchProps {\r\n className?: string;\r\n label?: string;\r\n checked?: boolean;\r\n onChange?: (value: boolean) => void;\r\n mini?: boolean;\r\n miniLabel?: string;\r\n}\r\n\r\nconst Switch: React.FC = ({\r\n className,\r\n label,\r\n checked,\r\n onChange,\r\n mini,\r\n miniLabel\r\n}) => {\r\n const [internalChecked, setInternalChecked] = React.useState(Boolean(checked));\r\n\r\n React.useEffect(() => {\r\n setInternalChecked(Boolean(checked));\r\n }, [checked]);\r\n\r\n const onChangeHandler = (event: React.ChangeEvent) => {\r\n setInternalChecked(event.target.checked);\r\n onChange?.(event.target.checked);\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default Switch;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct, UnitOfMeasureConversion } from '@msdyn365-commerce/retail-proxy';\r\nimport { reaction, computed, when } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport classnames from 'classnames';\r\nimport { UnitOfMeasure, humanizeUnitOfMeasure } from '../unit-of-measure';\r\nimport Switch from '../switch/switch';\r\nimport { getMinimumDecimals, getMostRelevantConversion, getRoundedFactor } from '../../shared-utils/unit-conversion-utils';\r\n\r\ninterface IQuantityProps {\r\n context: ICoreContext;\r\n locale: string;\r\n product: SimpleProduct | undefined;\r\n unitConversions?: UnitOfMeasureConversion[];\r\n currentCount?: number;\r\n allowZero?: boolean;\r\n disabled?: boolean;\r\n hideUnitConversion?: boolean;\r\n incrementGlyphClass?: string;\r\n decrementGlyphClass?: string;\r\n decrementButtonAriaLabel?: string;\r\n incrementButtonAriaLabel?: string;\r\n inputQuantityAriaLabel?: string;\r\n id?: string;\r\n min?: number;\r\n breakoff?: boolean;\r\n legacyBreakoff?: boolean;\r\n onChange?(newValue: number): void;\r\n onBreakoffChange?(enabled: boolean): void;\r\n}\r\n\r\ninterface IQuantityState {\r\n currentInput: string | number;\r\n parsedCurrentInput: number;\r\n breakoff: boolean;\r\n}\r\n\r\nfunction getDecimalSeparator(locale: string) {\r\n const numberWithDecimalSeparator = 1.1;\r\n const separator = Intl.NumberFormat(locale)\r\n .formatToParts(numberWithDecimalSeparator)\r\n .find(part => part.type === 'decimal')\r\n ?.value;\r\n return separator ?? ',';\r\n}\r\n\r\n/**\r\n * Quantity Component - This component is used to add or remove quantity.\r\n */\r\n@observer\r\nexport default class ProductListOrderQuantity extends React.PureComponent {\r\n public static defaultProps: Partial = {\r\n allowZero: true,\r\n decrementGlyphClass: 'fas fa-minus',\r\n incrementGlyphClass: 'fas fa-plus'\r\n };\r\n\r\n private readonly inputRef: React.RefObject = React.createRef();\r\n\r\n @computed get breakoffAvailable(): boolean {\r\n return this.productMultipleOfQuantity !== undefined && this.productMultipleOfQuantity > 1;\r\n }\r\n\r\n @computed get minimum(): number {\r\n return (this.productMinimumQuantity || Number(!this.props.allowZero)) / this.multipleOf;\r\n }\r\n\r\n @computed get maximum(): number {\r\n const max = this.productMaximumQuantity || 999_999_999;\r\n return max / this.multipleOf;\r\n }\r\n\r\n @computed get multipleOf(): number {\r\n return this.state.breakoff ? 1 : this.props.product?.Behavior?.MultipleOfQuantity || 1;\r\n }\r\n\r\n @computed get productDefaultQuantity(): number | undefined {\r\n return this.props.product?.Behavior?.DefaultQuantity;\r\n }\r\n\r\n @computed get productMaximumQuantity(): number | undefined {\r\n return this.props.product?.Behavior?.MaximumQuantity;\r\n }\r\n\r\n @computed get productMinimumQuantity(): number | undefined {\r\n return this.props.product?.Behavior?.MinimumQuantity;\r\n }\r\n\r\n @computed get productMultipleOfQuantity(): number | undefined {\r\n return this.props.product?.Behavior?.MultipleOfQuantity;\r\n }\r\n\r\n @computed get total(): number {\r\n return this.state.parsedCurrentInput * this.multipleOf;\r\n }\r\n\r\n @computed get totalFormatted(): string {\r\n return this.total.toLocaleString(this.props.locale, {\r\n minimumFractionDigits: getMinimumDecimals(this.props.product?.DefaultUnitOfMeasure),\r\n maximumFractionDigits: 2,\r\n useGrouping: false\r\n });\r\n }\r\n\r\n @computed get showDecimals(): boolean {\r\n const units = [\r\n 'kg',\r\n 'Kilogram'\r\n ];\r\n const uom = this.props.product?.DefaultUnitOfMeasure;\r\n\r\n return !!uom && units.includes(uom);\r\n }\r\n\r\n constructor(props: IQuantityProps) {\r\n super(props);\r\n\r\n const { allowZero, currentCount, product } = this.props;\r\n let breakoff = false;\r\n let initialValue: number | string = '';\r\n\r\n if (product) {\r\n initialValue = currentCount || (allowZero ? 0 : this.productMinimumQuantity ?? 1);\r\n\r\n if (this.breakoffAvailable) {\r\n if (props.breakoff) {\r\n breakoff = true;\r\n } else {\r\n const breakoffState = this._getInitialBreakoff(initialValue, product);\r\n\r\n if (breakoffState.factor) {\r\n initialValue = breakoffState.factor;\r\n } else {\r\n breakoff = breakoffState.breakoff;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.state = {\r\n currentInput: initialValue,\r\n parsedCurrentInput: typeof initialValue === 'number' ? initialValue : Number.parseFloat(initialValue) || 0,\r\n breakoff\r\n };\r\n this._clamp = this._clamp.bind(this);\r\n this._handleChange = this._handleChange.bind(this);\r\n this._validateQuantity = this._validateQuantity.bind(this);\r\n this._onToggleBreakoff = this._onToggleBreakoff.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n when(\r\n () => this.props.product !== undefined && (this.state.currentInput === '' || this.state.currentInput === 0),\r\n () => {\r\n const { allowZero, currentCount, product } = this.props;\r\n const initialValue = currentCount || (allowZero ? 0 : this.productMinimumQuantity ?? 1);\r\n\r\n if (this.breakoffAvailable) {\r\n const multipler = product!.Behavior!.MultipleOfQuantity!;\r\n const factor = initialValue / multipler;\r\n const remainder = initialValue % multipler;\r\n\r\n if (remainder === 0) {\r\n this.setState({ currentInput: factor });\r\n } else {\r\n this.setState({ breakoff: true });\r\n }\r\n } else {\r\n this.setState({ currentInput: initialValue });\r\n }\r\n }\r\n );\r\n\r\n reaction(\r\n () => this.props.breakoff,\r\n (breakoff) => {\r\n this.setState({ breakoff: Boolean(breakoff) });\r\n }\r\n );\r\n\r\n reaction(\r\n () => this.props.currentCount,\r\n () => {\r\n const currentInput = typeof this.state.currentInput === 'string'\r\n ? Number.parseFloat(this.state.currentInput.replace(',', '.') || '0')\r\n : this.state.currentInput;\r\n const oldQuantity = this._convertOutgoingQuantity(currentInput);\r\n const newQuantity = this._convertIncomingQuantity(this.props.currentCount ?? 0);\r\n\r\n // Only allow the change from props if it's meaningfully different\r\n if (this.props.currentCount !== oldQuantity) {\r\n this.setState({\r\n currentInput: newQuantity\r\n });\r\n }\r\n }\r\n );\r\n\r\n reaction(\r\n () => this.state.breakoff,\r\n (newValue) => {\r\n if (newValue) {\r\n const newInput = this.props.currentCount ?? 0;\r\n\r\n this.setState({\r\n currentInput: newInput,\r\n parsedCurrentInput: newInput\r\n });\r\n } else {\r\n // const multiplier = this.productMultipleOfQuantity || 1;\r\n const multiplier = this.multipleOf;\r\n const newInput = this.state.parsedCurrentInput / multiplier;\r\n\r\n this.setState({\r\n currentInput: newInput,\r\n parsedCurrentInput: newInput\r\n });\r\n }\r\n }\r\n );\r\n\r\n reaction(\r\n () => this.state.currentInput,\r\n () => {\r\n this.setState({\r\n currentInput: this.showDecimals ? this.state.currentInput.toLocaleString(this.props.locale, {\r\n minimumFractionDigits: getMinimumDecimals(this.props.product?.DefaultUnitOfMeasure),\r\n maximumFractionDigits: 2,\r\n useGrouping: false\r\n }).replace('.', ',') : this.state.currentInput,\r\n parsedCurrentInput: Number.parseFloat(this.state.currentInput.toString().replace(',', '.') || '0')\r\n });\r\n }\r\n );\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { allowZero, context, product, hideUnitConversion } = this.props;\r\n const disabled = this.state.parsedCurrentInput === (allowZero ? 0 : this.minimum);\r\n const incDisabled = this.state.parsedCurrentInput === this.maximum;\r\n const currentValue = this.state.currentInput;\r\n const baseClassName = 'dlvry-quantity';\r\n const miniBreakoff = !this.props.legacyBreakoff;\r\n\r\n let extraClass = '';\r\n if (disabled) {\r\n // The quantity has reached its boundaries (max or min)\r\n extraClass = 'disabled';\r\n } else if (this.props.disabled) {\r\n // This.props.disabled shows if the state is not succeded yet\r\n extraClass = 'transition';\r\n }\r\n const getChangeHandler = (action: 'increment' | 'decrement') => () => {\r\n let amount = action === 'increment' ? 1 : -1;\r\n\r\n if (action === 'increment' && this.state.parsedCurrentInput === 0 && this.productDefaultQuantity) {\r\n amount = this.productDefaultQuantity / this.multipleOf;\r\n }\r\n\r\n const calcTotal = (change: number): number => {\r\n const newAmount = this.state.parsedCurrentInput + change;\r\n return this.multipleOf * newAmount;\r\n };\r\n\r\n let newTotal = calcTotal(amount);\r\n\r\n if (action === 'increment' && newTotal > 0) {\r\n if (this.productMinimumQuantity && newTotal < this.productMinimumQuantity) {\r\n amount = (this.productMinimumQuantity - this.total) / this.multipleOf;\r\n }\r\n\r\n newTotal = calcTotal(amount);\r\n\r\n if (this.productMaximumQuantity && newTotal > this.productMaximumQuantity) {\r\n amount = (this.productMaximumQuantity - this.total) / this.multipleOf;\r\n }\r\n }\r\n\r\n if (action === 'decrement' && newTotal > 0) {\r\n if (this.productMinimumQuantity && newTotal < this.productMinimumQuantity) {\r\n if (allowZero) {\r\n amount = -this.state.parsedCurrentInput;\r\n } else {\r\n amount = this.minimum - this.state.parsedCurrentInput;\r\n }\r\n }\r\n if (this.productMaximumQuantity && newTotal > this.productMaximumQuantity) {\r\n amount = this.maximum - this.state.parsedCurrentInput;\r\n }\r\n }\r\n\r\n this._onIncrementalChange(amount);\r\n };\r\n\r\n return (\r\n
\r\n {!miniBreakoff && (\r\n \r\n )}\r\n
\r\n
\r\n {miniBreakoff && this.breakoffAvailable && (\r\n <>\r\n \r\n\r\n \r\n {`${this.multipleOf} `}\r\n  x\r\n \r\n \r\n )}\r\n \r\n {\r\n const NUMBER_DOT_COMMA = /^[\\d,.]*$/;\r\n const fieldValue = (e.target as any).value;\r\n const fieldHasCommaOrDot = fieldValue.includes('.') || fieldValue.includes(',');\r\n const keyIsCommaOrDot = e.key === '.' || e.key === ',';\r\n\r\n if (!NUMBER_DOT_COMMA.test(e.key) || (keyIsCommaOrDot && fieldHasCommaOrDot)) {\r\n e.preventDefault();\r\n }\r\n\r\n const separator = getDecimalSeparator(this.props.locale);\r\n const replace = separator === '.' ? ',' : '.';\r\n (e as any).target.value = fieldValue.replace(replace, separator);\r\n }}\r\n aria-live='polite'\r\n aria-label={`${this.props.inputQuantityAriaLabel}`}\r\n role='spinbutton'\r\n aria-valuemin={1}\r\n aria-valuemax={this.maximum}\r\n aria-valuenow={Number.parseFloat(currentValue.toString()) || 0}\r\n ref={this.inputRef}\r\n disabled={this.props.disabled}\r\n data-nomodalcss\r\n />\r\n \r\n
\r\n \r\n = {this.totalFormatted} \r\n \r\n \r\n
\r\n {!hideUnitConversion && (\r\n <>\r\n
\r\n 1 = \r\n {`${this.multipleOf} `}\r\n \r\n
\r\n
\r\n {this._getUnitOfMeasureConversion()}\r\n
\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _getInitialBreakoff = (initialValue: number, product: SimpleProduct): { factor?: number, breakoff: boolean } => {\r\n const multiplier = product.Behavior?.MultipleOfQuantity || 1;\r\n const factor = Math.round(((initialValue / multiplier) + Number.EPSILON) * 1000) / 1000;\r\n const remainder = (initialValue * 1000) % (multiplier * 1000);\r\n\r\n if (remainder === 0) {\r\n return { factor, breakoff: false };\r\n } else {\r\n return { breakoff: true };\r\n }\r\n };\r\n\r\n private _getUnitOfMeasureConversion = (): JSX.Element | undefined => {\r\n if (!this.props.unitConversions || !this.props.product?.DefaultUnitOfMeasure) {\r\n return undefined;\r\n }\r\n\r\n const conversions = this.props.unitConversions?.filter(x => x.FromUnitOfMeasureSymbol === this.props.product?.DefaultUnitOfMeasure);\r\n const conversion = getMostRelevantConversion(conversions);\r\n\r\n if (!conversion) {\r\n return undefined;\r\n }\r\n\r\n const factor = getRoundedFactor(conversion).toLocaleString(this.props.locale, {\r\n minimumFractionDigits: getMinimumDecimals(conversion.ToUnitOfMeasureSymbol),\r\n maximumFractionDigits: 2,\r\n useGrouping: false\r\n });\r\n const defaultUOM = humanizeUnitOfMeasure(this.props.context, this.props.product?.DefaultUnitOfMeasure);\r\n const conversionUOM = humanizeUnitOfMeasure(this.props.context, conversion.ToUnitOfMeasureSymbol).toLocaleLowerCase();\r\n\r\n return (\r\n
\r\n 1 {defaultUOM} = {`${factor} ${conversionUOM}`}\r\n
\r\n );\r\n };\r\n\r\n private _convertIncomingQuantity = (quantity: number): number => {\r\n return quantity / this.multipleOf;\r\n };\r\n\r\n private _convertOutgoingQuantity = (quantity: number): number => {\r\n const outgoing = quantity * this.multipleOf;\r\n\r\n // We need to always round to nearest 2 decimal places to avoid floating point errors in quantity validation\r\n return Math.round((outgoing + Number.EPSILON) * 1000) / 1000;\r\n };\r\n\r\n private _onToggleBreakoff = (checked: boolean): void => {\r\n this.setState({ breakoff: checked });\r\n this.props.onBreakoffChange?.(checked);\r\n };\r\n\r\n private _onIncrementalChange(amount: number): void {\r\n const updatedQuantity = this.state.parsedCurrentInput + amount;\r\n\r\n if (this._isValidNewQuantity(updatedQuantity)) {\r\n this.props.onChange?.(this._convertOutgoingQuantity(updatedQuantity));\r\n }\r\n }\r\n\r\n private readonly _clamp = (total: number): number => {\r\n if (this.productMinimumQuantity && total >= 1 && total < this.productMinimumQuantity) {\r\n return this.productMinimumQuantity / this.multipleOf;\r\n } else if (this.productMaximumQuantity && total > this.productMaximumQuantity) {\r\n return this.productMaximumQuantity / this.multipleOf;\r\n } else {\r\n return total / this.multipleOf;\r\n }\r\n };\r\n\r\n private readonly _isValidNewQuantity = (newQuantity: number): boolean => {\r\n if (newQuantity === 0 && this.props.allowZero) {\r\n return true;\r\n }\r\n return !isNaN(newQuantity) && newQuantity >= this.minimum && newQuantity <= this.maximum;\r\n };\r\n\r\n private _handleChange(e: React.ChangeEvent): void {\r\n let newValue: string | number = e.target.value;\r\n\r\n e.persist();\r\n this.setState({ currentInput: newValue }, () => {\r\n if (typeof newValue === 'string') {\r\n newValue = Number.parseFloat(newValue.replace(',', '.'));\r\n }\r\n\r\n if (this._isValidNewQuantity(newValue)) {\r\n this.props.onChange?.(this._convertOutgoingQuantity(newValue));\r\n }\r\n });\r\n }\r\n\r\n private _validateQuantity(e: React.FocusEvent): void {\r\n const currentValue = Number.parseFloat(e.target.value.replace(',', '.') || '0');\r\n const total = this.multipleOf * currentValue;\r\n const newValue = Math.max(this._clamp(total) ?? 0, Number(!this.props.allowZero));\r\n\r\n e.persist();\r\n this.setState({ currentInput: newValue }, () => {\r\n this.props.onChange?.(this._convertOutgoingQuantity(newValue));\r\n });\r\n }\r\n}\r\n","export interface IToastViewProps {\r\n header?: string;\r\n text: string;\r\n footer?: string;\r\n autoClose: number;\r\n position: string;\r\n onClose?(): void;\r\n canClose: boolean;\r\n showProgress: boolean;\r\n type?: 'success' | 'error' | 'warning' | 'info';\r\n link?: string;\r\n linkLabel?: string;\r\n}\r\n\r\nexport const toast = (props: IToastViewProps) => {\r\n new Toast(props);\r\n};\r\n\r\nexport const toasts = {\r\n error: (header: string | undefined, text: string, props: Partial = {}) => {\r\n toast({\r\n ...{\r\n autoClose: 30000,\r\n canClose: true,\r\n position: 'bottom-right',\r\n showProgress: true\r\n },\r\n ...props as IToastViewProps,\r\n header,\r\n text,\r\n type: 'error'\r\n });\r\n }\r\n};\r\n\r\nclass Toast {\r\n\r\n private readonly _props: IToastViewProps;\r\n private _toastElem: HTMLElement;\r\n private _headElem: HTMLElement | undefined;\r\n private _textElem: HTMLElement;\r\n private _footElem: HTMLElement | undefined;\r\n // @ts-ignore\r\n private _removeBinded(): void;\r\n // @ts-ignore\r\n private _unpause(): void;\r\n // @ts-ignore\r\n private _pause(): void;\r\n // @ts-ignore\r\n private _visibilityChange(): void;\r\n private _isPaused: boolean = false;\r\n private _shouldUnPause: boolean = true;\r\n private _timeVisible: number = 0;\r\n private _autoCloseInterval: number = 0;\r\n private _progressInterval: number = 0;\r\n\r\n constructor(input: IToastViewProps) {\r\n this._props = input;\r\n\r\n this._toastElem = document.createElement(\"div\");\r\n this._textElem = document.createElement(\"span\");\r\n\r\n if (this._props.header) {\r\n this._headElem = document.createElement(\"h4\");\r\n this._headElem.textContent = this._props.header;\r\n this._toastElem.appendChild(this._headElem);\r\n } else {\r\n this._textElem.classList.add(\"no-header\");\r\n }\r\n\r\n this._toastElem.appendChild(this._textElem);\r\n\r\n if (this._props.link) {\r\n // Cart button\r\n const cartButton = document.createElement(\"a\");\r\n cartButton.classList.add(\"toast-button\");\r\n cartButton.setAttribute('aria-label', this._props.linkLabel || this._props.link);\r\n cartButton.textContent = this._props.linkLabel || this._props.link;\r\n cartButton.href = this._props.link;\r\n this._toastElem.appendChild(cartButton);\r\n }\r\n\r\n if (this._props.footer) {\r\n this._footElem = document.createElement(\"div\");\r\n this._footElem.classList.add(\"footer\");\r\n this._footElem.textContent = this._props.footer;\r\n this._toastElem.appendChild(this._footElem);\r\n }\r\n\r\n this._toastElem.classList.add(\"toast\");\r\n this._toastElem.classList.add(this._props.type || 'info');\r\n requestAnimationFrame(() => {\r\n this._toastElem.classList.add(\"show\");\r\n });\r\n this._removeBinded = this._remove.bind(this);\r\n this._unpause = () => (this._isPaused = false);\r\n this._pause = () => (this._isPaused = true);\r\n this._visibilityChange = () => {\r\n this._shouldUnPause = document.visibilityState === \"visible\";\r\n };\r\n this._setup();\r\n }\r\n\r\n private readonly _autoClose = () => {\r\n if (this._props.autoClose === 0) {\r\n return;\r\n }\r\n this._timeVisible = 0;\r\n let lastTime: number | null = null;\r\n const func = (time: number) => {\r\n if (this._shouldUnPause) {\r\n lastTime = null;\r\n this._shouldUnPause = false;\r\n }\r\n if (lastTime === null) {\r\n lastTime = time;\r\n this._autoCloseInterval = requestAnimationFrame(func);\r\n return;\r\n }\r\n if (!this._isPaused) {\r\n this._timeVisible += time - lastTime;\r\n if (this._timeVisible >= this._props.autoClose) {\r\n this._remove();\r\n return;\r\n }\r\n }\r\n lastTime = time;\r\n this._autoCloseInterval = requestAnimationFrame(func);\r\n };\r\n this._autoCloseInterval = requestAnimationFrame(func);\r\n };\r\n\r\n private readonly _position = () => {\r\n const currentContainer = this._toastElem.parentElement;\r\n const selector = `.toast-container[data-position=\"${this._props.position}\"]`;\r\n const container = document.querySelector(selector) || this._createContainer(this._props.position);\r\n container.append(this._toastElem);\r\n if (currentContainer === null || currentContainer.hasChildNodes()) {\r\n return;\r\n }\r\n currentContainer.remove();\r\n };\r\n\r\n private readonly _text = () => {\r\n this._textElem.textContent = this._props.text;\r\n };\r\n\r\n private readonly _canClose = () => {\r\n this._toastElem.classList.toggle(\"can-close\", this._props.canClose);\r\n /* if (this._props.canClose) {\r\n this._toastElem.addEventListener(\"click\", this._removeBinded);\r\n } else {\r\n this._toastElem.removeEventListener(\"click\", this._removeBinded);\r\n } */\r\n\r\n if (this._props.canClose) {\r\n const closeButton = document.createElement(\"button\");\r\n closeButton.classList.add(\"close-button\");\r\n closeButton.addEventListener(\"click\", this._removeBinded);\r\n\r\n const closeIcon = document.createElement(\"i\");\r\n closeIcon.classList.add(\"fa-solid\", \"fa-xmark\");\r\n closeButton.appendChild(closeIcon);\r\n\r\n this._toastElem.appendChild(closeButton);\r\n }\r\n };\r\n\r\n private readonly _showProgress = () => {\r\n this._toastElem.classList.toggle(\"progress\", this._props.showProgress);\r\n // @ts-ignore\r\n this._toastElem.style.setProperty(\"--progress\", 1);\r\n\r\n if (this._props.showProgress) {\r\n const func = () => {\r\n if (!this._isPaused) {\r\n this._toastElem.style.setProperty(\r\n \"--progress\",\r\n // @ts-ignore\r\n 1 - this._timeVisible / this._props.autoClose\r\n );\r\n }\r\n this._progressInterval = requestAnimationFrame(func);\r\n };\r\n this._progressInterval = requestAnimationFrame(func);\r\n }\r\n };\r\n\r\n private readonly _pauseOnHover = () => {\r\n this._toastElem.addEventListener(\"mouseenter\", this._pause);\r\n this._toastElem.addEventListener(\"mouseleave\", this._unpause);\r\n };\r\n\r\n private readonly _setup = () => {\r\n this._autoClose();\r\n this._position();\r\n this._text();\r\n this._canClose();\r\n this._showProgress();\r\n this._pauseOnHover();\r\n };\r\n\r\n private readonly _remove = () => {\r\n cancelAnimationFrame(this._autoCloseInterval);\r\n cancelAnimationFrame(this._progressInterval);\r\n const container = this._toastElem.parentElement;\r\n this._toastElem.classList.remove(\"show\");\r\n this._toastElem.addEventListener(\"transitionend\", () => {\r\n this._toastElem.remove();\r\n if (container?.hasChildNodes()) {\r\n return;\r\n }\r\n container?.remove();\r\n });\r\n this._props.onClose?.();\r\n };\r\n\r\n private readonly _createContainer = (position: string): Element => {\r\n const container = document.createElement(\"div\");\r\n container.classList.add(\"toast-container\");\r\n container.dataset.position = position;\r\n document.body.append(container);\r\n return container;\r\n };\r\n}","import { ICoreContext } from '@msdyn365-commerce/core';\r\n\r\nconst translations = {\r\n 'nb-NO': {\r\n 'Flaske-BS': 'Stk',\r\n 'Stk-BS': 'Stk',\r\n 'Stk-M1': 'Krt',\r\n 'Boks-BS': 'Stk',\r\n 'Krt-BS': 'Stk',\r\n 'Krt-M1': 'Krt',\r\n 'Krt-M2': 'Krt',\r\n 'Pose-BS': 'Stk',\r\n 'Kanne-BS': 'Stk',\r\n 'Fat-BS': 'Stk',\r\n 'Glass-BS': 'Stk',\r\n 'Rull-BS': 'Stk',\r\n 'Brett-BS': 'Stk',\r\n 'Brett-M1': 'Brt',\r\n 'Brett-M2': 'Brt',\r\n 'Tube-BS': 'Stk',\r\n 'Sekk-BS': 'Stk',\r\n 'Bunt-BS': 'Stk'\r\n },\r\n 'en-US': {\r\n 'Flaske-BS': 'Pcs',\r\n 'Stk-BS': 'Pcs',\r\n 'Stk-M1': 'Box',\r\n 'Boks-BS': 'Pcs',\r\n 'Krt-BS': 'Pcs',\r\n 'Krt-M1': 'Box',\r\n 'Krt-M2': 'Box',\r\n 'Pose-BS': 'Pcs',\r\n 'Kanne-BS': 'Pcs',\r\n 'Fat-BS': 'Pcs',\r\n 'Glass-BS': 'Pcs',\r\n 'Rull-BS': 'Pcs',\r\n 'Brett-BS': 'Pcs',\r\n 'Brett-M1': 'Try',\r\n 'Brett-M2': 'Try',\r\n 'Tube-BS': 'Pcs',\r\n 'Sekk-BS': 'Pcs',\r\n 'Bunt-BS': 'Pcs'\r\n }\r\n};\r\n\r\nexport function humanizeUnitOfMeasure(locale: ICoreContext | string, unitOfMeasure: string | undefined): string {\r\n if (!unitOfMeasure) {\r\n return '';\r\n }\r\n\r\n // Check if locale is a string or an ICoreContext object\r\n if (typeof locale === 'object') {\r\n locale = locale.request.locale;\r\n }\r\n return translations[locale]?.[unitOfMeasure] || unitOfMeasure;\r\n}\r\n","import * as React from 'react';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { humanizeUnitOfMeasure } from './utils';\r\n\r\ninterface IUnitOfMeasureProps {\r\n context: ICoreContext;\r\n className?: string;\r\n simpleProduct?: SimpleProduct;\r\n unitOfMeasure?: string;\r\n disableTranslate?: boolean;\r\n}\r\n\r\nconst UnitOfMeasure = (props: IUnitOfMeasureProps) => {\r\n const { context } = props;\r\n let { disableTranslate } = props;\r\n\r\n const className = classnames('dlvry-unit-of-measure', props.className);\r\n\r\n // Check if already disabled\r\n if (!disableTranslate) {\r\n // @ts-expect-error\r\n if (context.app.config.humanizeUnitOfMeasure !== true) {\r\n disableTranslate = true;\r\n } else {\r\n // Disable if disableUnitReplace is present and not 1 or 'true'\r\n const disableUnitReplace = context.request.url.requestUrl.searchParams.get('disableUnitReplace');\r\n disableTranslate = disableUnitReplace === '' || disableUnitReplace === '1' || disableUnitReplace?.toLowerCase() === 'true';\r\n }\r\n }\r\n\r\n let unitOfMeasure = props.unitOfMeasure || props.simpleProduct?.DefaultUnitOfMeasure || '';\r\n unitOfMeasure = disableTranslate\r\n ? unitOfMeasure\r\n : humanizeUnitOfMeasure(context, unitOfMeasure);\r\n\r\n return (\r\n \r\n {unitOfMeasure}\r\n \r\n );\r\n};\r\n\r\n\r\nexport default UnitOfMeasure;","import { IActionContext } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, CustomerAttribute, ProductRefinerSource, ProductRefinerValue, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\r\n// @ts-ignore\r\nimport { getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport getOrganizationCustomer, { GetOrganizationCustomerInput } from '../../../actions/get-organization-customer';\r\n\r\n// Pre populated with ids from STAGE for local development\r\nconst AlcoholGroupAttributeId = 5637155076;\r\n\r\nfunction isGodmodeEnabled(context: IActionContext): boolean {\r\n const godmode = context.requestContext.url.requestUrl.searchParams.get('godmode')?.toLowerCase();\r\n\r\n return godmode === '1' || godmode === 'true';\r\n}\r\n\r\nexport function shouldFilterAlcohol(context: IActionContext): boolean {\r\n const doAlcoholFiltering = context.requestContext.url.requestUrl.searchParams.get('alcohol')?.toLowerCase() !== 'false';\r\n const alcoholRefinerRecordId = Number(context.requestContext.app.config?.alcoholRefinerRecordId);\r\n\r\n return doAlcoholFiltering && !isNaN(alcoholRefinerRecordId) && alcoholRefinerRecordId > 0;\r\n}\r\n\r\nexport async function getAlcoholRefiners(context: IActionContext): Promise {\r\n let alcoholGroupAttributeId = Number(context.requestContext.app.config?.alcoholRefinerRecordId);\r\n\r\n if (isNaN(alcoholGroupAttributeId) || alcoholGroupAttributeId === 0) {\r\n alcoholGroupAttributeId = AlcoholGroupAttributeId;\r\n }\r\n\r\n const result: ProductRefinerValue[] = [];\r\n const alcoholRefiner: ProductRefinerValue = {\r\n DataTypeValue: 5,\r\n LeftValueBoundString: '0',\r\n RefinerRecordId: alcoholGroupAttributeId,\r\n RefinerSourceValue: 1,\r\n RightValueBoundString: '0',\r\n UnitText: ''\r\n };\r\n\r\n result.push(alcoholRefiner);\r\n\r\n try {\r\n let alcoholLicenseValue = 0;\r\n\r\n if (context.requestContext.user.isAuthenticated) {\r\n // Get Customer attributes\r\n // const customer = await getCustomer(new GetCustomerInput(context.requestContext.apiSettings, context.requestContext.user.customerAccountNumber), context);\r\n const customer = await getOrganizationCustomer(new GetOrganizationCustomerInput(context.requestContext.apiSettings, context.requestContext.user.customerAccountNumber!), context);\r\n const alcoholLicense = Number(customer.Attributes?.find(x => x.RecordId === alcoholGroupAttributeId)?.AttributeValue?.StringValue);\r\n\r\n if (isNaN(alcoholLicense)) {\r\n // Throw NaN error\r\n console.warn('Alcohol license value is missing or not a number.');\r\n } else {\r\n alcoholLicenseValue = alcoholLicense;\r\n }\r\n } else {\r\n // If user is not logged in show all products\r\n alcoholLicenseValue = 3;\r\n }\r\n\r\n // TODO: Verify we can do ranges like this on text attributes\r\n // If we can do range on text attributes use this:\r\n //alcoholRefiner.RightValueBoundString = alcoholLicense?.AttributeValue?.StringValue ?? '0';\r\n\r\n // Add a refiner for each alcohol group\r\n Array(alcoholLicenseValue).fill(0).forEach((_, index) => {\r\n result.push({\r\n ...alcoholRefiner,\r\n LeftValueBoundString: (index + 1).toString(),\r\n RightValueBoundString: (index + 1).toString()\r\n });\r\n });\r\n } catch (error) {\r\n console.warn('Failed to get customer attributes for alcohol license or parse value of attribute. No alcohol license applied to search.', error);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport async function addAlcoholRefiner(context: IActionContext, searchCriteriaInput: ProductSearchCriteria): Promise {\r\n let alcoholGroupAttributeId = Number(context.requestContext.app.config?.alcoholRefinerRecordId);\r\n\r\n if (isNaN(alcoholGroupAttributeId) || alcoholGroupAttributeId === 0) {\r\n alcoholGroupAttributeId = AlcoholGroupAttributeId;\r\n }\r\n\r\n if (searchCriteriaInput.Refinement!.some(x => x.RefinerRecordId === alcoholGroupAttributeId)) {\r\n // Remove existing, shouldn't be here\r\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement!.filter(x => x.RefinerRecordId !== alcoholGroupAttributeId);\r\n }\r\n\r\n const refiners = await getAlcoholRefiners(context);\r\n\r\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement!.concat(refiners);\r\n\r\n return Promise.resolve();\r\n}\r\n\r\nexport function addOrUpdateZeroPriceRefiner(context: IActionContext, refiners?: ProductRefinerValue[]): ProductRefinerValue[] {\r\n // Check criteria for allowing user to see zero price products. Example:\r\n // - Has ?godmode=true in url\r\n const allowZeroPriceProducts = isGodmodeEnabled(context);\r\n\r\n if (!allowZeroPriceProducts) {\r\n const result = refiners ? [...refiners] : [];\r\n\r\n // Make sure we don't show zero price products\r\n const priceRefiner = result.find(x => x.RefinerRecordId === 0);\r\n\r\n if (priceRefiner) {\r\n // There is a price refiner, make sure it has a min value of 0.01 or more\r\n if (!priceRefiner.LeftValueBoundString || Number(priceRefiner.LeftValueBoundString) < 0.01) {\r\n priceRefiner.LeftValueBoundString = '0.01';\r\n }\r\n } else {\r\n // No price refiner, add one\r\n result.push({\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.ProductRefinerValue',\r\n Count: 0,\r\n DataTypeValue: 1,\r\n LeftValueBoundString: '0.01',\r\n ExtensionProperties: [],\r\n RefinerRecordId: 0,\r\n RefinerSourceValue: 3,\r\n RightValueBoundString: '1000000000',\r\n RowNumber: 0,\r\n UnitText: context.requestContext.channel?.Currency\r\n } as any);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n return refiners || [];\r\n}\r\n\r\nexport async function getAttributeRefiners(context: IActionContext, customerAttributes: CustomerAttribute[] | undefined, attributeRecordId: number, friendlyName?: string): Promise {\r\n const result: ProductRefinerValue[] = [];\r\n const refiner: ProductRefinerValue = {\r\n DataTypeValue: 5,\r\n LeftValueBoundString: '0',\r\n RefinerRecordId: attributeRecordId,\r\n RefinerSourceValue: 1,\r\n RightValueBoundString: '0',\r\n UnitText: ''\r\n };\r\n\r\n result.push(refiner);\r\n\r\n try {\r\n let attributeValue = 0;\r\n\r\n if (context.requestContext.user.isAuthenticated) {\r\n const attribute = Number(customerAttributes?.find(x => x.RecordId === attributeRecordId)?.AttributeValue?.StringValue);\r\n\r\n if (isNaN(attribute)) {\r\n // Throw NaN error\r\n if (friendlyName) {\r\n console.warn(`${friendlyName} attribute value is missing or not a number.`);\r\n } else {\r\n console.warn(`Attribute with record id ${attributeRecordId} is missing a value or not a number.`);\r\n }\r\n } else {\r\n attributeValue = attribute;\r\n }\r\n } else {\r\n // If user is not logged in show all products\r\n attributeValue = 1;\r\n }\r\n\r\n if (attributeValue !== 0) {\r\n result.push({\r\n ...refiner,\r\n LeftValueBoundString: attributeValue.toString(),\r\n RightValueBoundString: attributeValue.toString()\r\n });\r\n }\r\n } catch (error) {\r\n if (friendlyName) {\r\n console.warn(`Failed to get ${friendlyName} customer attribute or parse value of attribute. No filter applied to search.`, error);\r\n } else {\r\n console.warn(`Failed to get customer attribute (record id: ${attributeRecordId}) or parse value of attribute. No filter applied to search.`, error);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport async function getForsvaretRefiner(context: IActionContext, customerAttributes: CustomerAttribute[] | undefined): Promise {\r\n const forsvaretAttributeId = context.requestContext.app.config?.forsvaretAttributeRecordId;\r\n\r\n if (!forsvaretAttributeId || !context.requestContext.user.isAuthenticated) {\r\n return;\r\n }\r\n\r\n try {\r\n const attribute = customerAttributes?.find(x => x.RecordId === Number(forsvaretAttributeId))?.AttributeValue?.IntegerValue;\r\n\r\n if (!attribute || isNaN(attribute) || attribute === 0) {\r\n return;\r\n }\r\n\r\n return {\r\n DataTypeValue: AttributeDataType.Integer,\r\n LeftValueBoundString: attribute.toString(),\r\n RefinerRecordId: Number(forsvaretAttributeId),\r\n RefinerSourceValue: ProductRefinerSource.Attribute,\r\n RightValueBoundString: attribute.toString(),\r\n UnitText: ''\r\n };\r\n } catch (error) {\r\n console.error('Failed to get forsvaret attribute', error);\r\n return;\r\n }\r\n}\r\n\r\nexport async function getSvalbardRefiner(context: IActionContext, customerAttributes: CustomerAttribute[] | undefined): Promise {\r\n if (!context.requestContext.user.isAuthenticated) {\r\n return;\r\n }\r\n\r\n const svalbardAttributeId = context.requestContext.app.config?.svalbardAttributeRecordId;\r\n const blockedSvalbardAttributeId = context.requestContext.app.config?.blockedSvalbardAttributeRecordId;\r\n\r\n // Both config needs to be set to something\r\n if (!svalbardAttributeId || !blockedSvalbardAttributeId) {\r\n return;\r\n }\r\n\r\n // Both config needs to be numbers. This allows users to prepend values with a character to temporarily disable the refiner\r\n if (isNaN(svalbardAttributeId) || isNaN(blockedSvalbardAttributeId)) {\r\n return;\r\n }\r\n\r\n try {\r\n const attribute = customerAttributes?.find(x => x.RecordId === Number(svalbardAttributeId))?.AttributeValue?.IntegerValue;\r\n\r\n // Check if attribute is set, is a number and above 0\r\n if (!attribute || isNaN(attribute) || attribute <= 0) {\r\n return;\r\n }\r\n\r\n // Add refiner so that only products that isn't blocked for svalbard is shown since customer attribute is set to 1 or more\r\n return {\r\n DataTypeValue: AttributeDataType.Integer,\r\n LeftValueBoundString: '0',\r\n RefinerRecordId: Number(blockedSvalbardAttributeId),\r\n RefinerSourceValue: ProductRefinerSource.Attribute,\r\n RightValueBoundString: '0',\r\n UnitText: ''\r\n };\r\n } catch (error) {\r\n console.error('Failed to get svalbard attribute(s)', error);\r\n return;\r\n }\r\n}\r\n\r\nexport async function addAttributeRefiner(context: IActionContext, customerAttributes: CustomerAttribute[] | undefined, searchCriteriaInput: ProductSearchCriteria, attributeRecordId: number): Promise {\r\n if (searchCriteriaInput.Refinement!.some(x => x.RefinerRecordId === attributeRecordId)) {\r\n // Remove existing, shouldn't be here\r\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement!.filter(x => x.RefinerRecordId !== attributeRecordId);\r\n }\r\n\r\n const refiners = await getAttributeRefiners(context, customerAttributes, attributeRecordId);\r\n\r\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement!.concat(refiners);\r\n}\r\n\r\nexport async function addAttributeRefinerKeepExisting(context: IActionContext, customerAttributes: CustomerAttribute[] | undefined, searchCriteriaInput: ProductSearchCriteria, attributeRecordId: number): Promise {\r\n if (searchCriteriaInput.Refinement!.some(x => x.RefinerRecordId === attributeRecordId)) {\r\n return;\r\n }\r\n\r\n const refiners = await getAttributeRefiners(context, customerAttributes, attributeRecordId);\r\n\r\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement!.concat(refiners);\r\n}\r\n\r\nexport async function addAllAttributeRefiners(context: IActionContext, searchCriteriaInput: ProductSearchCriteria): Promise {\r\n const godmode = isGodmodeEnabled(context);\r\n\r\n if (godmode) {\r\n return;\r\n }\r\n\r\n let customerAttributes: CustomerAttribute[] | undefined = [];\r\n\r\n if (context.requestContext.user.isAuthenticated) {\r\n const { apiSettings, user: { customerAccountNumber } } = context.requestContext;\r\n const customer = await getOrganizationCustomer(new GetOrganizationCustomerInput(apiSettings, customerAccountNumber!), context);\r\n customerAttributes = customer.Attributes;\r\n }\r\n\r\n const attributeRecordIds: string[] = [\r\n context.requestContext.app.config?.tobaccoRefinerRecordId,\r\n context.requestContext.app.config?.cocacolaRefinerRecordId,\r\n context.requestContext.app.config?.bamaRefinerRecordId,\r\n context.requestContext.app.config?.dutyFreeSugarRefinerRecordId,\r\n context.requestContext.app.config?.norturaRefinerRecordId\r\n ];\r\n\r\n for (const attributeRecordId of attributeRecordIds) {\r\n const id = Number(attributeRecordId);\r\n\r\n // Make sure it's a number and above 0\r\n if (!isNaN(id) && id > 0) {\r\n await addAttributeRefiner(context, customerAttributes, searchCriteriaInput, id);\r\n }\r\n }\r\n\r\n const transitRefiner = Number(context.requestContext.app.config?.transitRefinerRecordId);\r\n\r\n if (!isNaN(transitRefiner) && transitRefiner > 0) {\r\n await addAttributeRefinerKeepExisting(context, customerAttributes, searchCriteriaInput, transitRefiner);\r\n }\r\n\r\n const forsvaretRefiner = await getForsvaretRefiner(context, customerAttributes);\r\n\r\n if (forsvaretRefiner) {\r\n searchCriteriaInput.Refinement!.push(forsvaretRefiner);\r\n }\r\n\r\n const svalbardRefiner = await getSvalbardRefiner(context, customerAttributes);\r\n\r\n if (svalbardRefiner) {\r\n searchCriteriaInput.Refinement!.push(svalbardRefiner);\r\n }\r\n}\r\n\r\nexport async function getAllAttributeRefiners(context: IActionContext) {\r\n const godmode = isGodmodeEnabled(context);\r\n\r\n if (godmode) {\r\n return [];\r\n }\r\n\r\n let customerAttributes: CustomerAttribute[] | undefined = [];\r\n\r\n if (context.requestContext.user.isAuthenticated) {\r\n const { apiSettings, user: { customerAccountNumber } } = context.requestContext;\r\n const customer = await getOrganizationCustomer(new GetOrganizationCustomerInput(apiSettings, customerAccountNumber!), context);\r\n customerAttributes = customer.Attributes;\r\n }\r\n\r\n const attributeRecordIds: string[] = [\r\n context.requestContext.app.config?.transitRefinerRecordId,\r\n context.requestContext.app.config?.tobaccoRefinerRecordId,\r\n context.requestContext.app.config?.cocacolaRefinerRecordId,\r\n context.requestContext.app.config?.bamaRefinerRecordId,\r\n context.requestContext.app.config?.dutyFreeSugarRefinerRecordId,\r\n context.requestContext.app.config?.norturaRefinerRecordId\r\n ];\r\n\r\n const result: ProductRefinerValue[] = [];\r\n\r\n for (const attributeRecordId of attributeRecordIds) {\r\n const id = Number(attributeRecordId);\r\n\r\n // Make sure it's a number and above 0\r\n if (!isNaN(id) && id > 0) {\r\n const refiners = await getAttributeRefiners(context, customerAttributes, id);\r\n result.push(...refiners);\r\n }\r\n }\r\n\r\n const forsvaretRefiner = await getForsvaretRefiner(context, customerAttributes);\r\n\r\n if (forsvaretRefiner) {\r\n result.push(forsvaretRefiner);\r\n }\r\n\r\n const svalbardRefiner = await getSvalbardRefiner(context, customerAttributes);\r\n\r\n if (svalbardRefiner) {\r\n result.push(svalbardRefiner);\r\n }\r\n\r\n return result;\r\n}","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* eslint-disable no-duplicate-imports */\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n ChannelInventoryConfiguration,\n ProductRefinerSource,\n ProductRefinerValue,\n ProductSearchCriteria,\n SearchSuggestion,\n SearchSuggestionCriteria\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n getInventoryConfigurationAsync,\n getSearchSuggestionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { addAlcoholRefiner, addAllAttributeRefiners, addOrUpdateZeroPriceRefiner, shouldFilterAlcohol } from '../../dlvry-search-result-container/actions/refiner-utils';\n\n/**\n * This setting defines inventory filtering options.\n */\nexport enum ProductListInventoryFilteringOptions {\n /**\n * Filter out all products out of stock.\n */\n HideOOS = 'hideOOS',\n\n /**\n * Sort products by availability, OOS goes last.\n */\n SortOOS = 'sortOOS',\n\n /**\n * No filtering selected.\n */\n Default = 'default'\n}\n\nexport enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * Input class for auto suggest search input.\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n\n public topResultsCount?: number;\n\n public suggestionType?: string;\n\n public hitPrefix?: string;\n\n public hitSuffix?: string;\n\n public constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\n\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions.\n * @param input\n * @param ctx\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\n/**\n * Returns inventory in stock sortable refiner value.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @param isInStock - The flag indicating whether is getting in-stock refiner or out-of-stock refiner.\n * @returns Refiners.\n */\nconst getInventorySortableRefinerValue = (\n channelInventoryConfiguration: ChannelInventoryConfiguration,\n isInStock: boolean\n): ProductRefinerValue | undefined => {\n if (channelInventoryConfiguration && channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId) {\n return {\n RefinerRecordId: channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId,\n DataTypeValue: AttributeDataType.TrueFalse,\n LeftValueBoundString: isInStock ? 'true' : 'false',\n RightValueBoundString: isInStock ? 'true' : 'false',\n UnitText: '',\n RowNumber: 0,\n Count: 0,\n ExtensionProperties: [],\n RefinerSourceValue: ProductRefinerSource.Attribute\n };\n }\n return undefined;\n};\n\nasync function _getAutoSuggest(input: AutoSuggestInput, autosuggest: Autosuggestions, ctx: IActionContext): Promise {\n const catalogId = getCatalogId(ctx.requestContext);\n let productSearchCriteria: ProductSearchCriteria = {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n };\n\n if (ctx.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n const channelInventoryConfiguration = await getInventoryConfigurationAsync({ callerContext: ctx });\n const isInStockRefiner = true;\n const inventoryRefinerValue = getInventorySortableRefinerValue(channelInventoryConfiguration, isInStockRefiner);\n\n if (inventoryRefinerValue) {\n productSearchCriteria = {\n ...productSearchCriteria,\n Refinement: [inventoryRefinerValue]\n };\n }\n }\n\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: productSearchCriteria,\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n searchCriteria.ProductSearchCriteria!.Refinement = addOrUpdateZeroPriceRefiner(ctx, searchCriteria.ProductSearchCriteria?.Refinement);\n\n if (shouldFilterAlcohol(ctx)) {\n await addAlcoholRefiner(ctx, searchCriteria.ProductSearchCriteria!);\n }\n\n await addAllAttributeRefiners(ctx, searchCriteria.ProductSearchCriteria!);\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n searchSuggestions.map((item: SearchSuggestion) => {\n // Generate image url\n item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '';\n\n // Hide price. Active price will be retrieved later\n if (item.Value3?.Value?.DecimalValue) {\n item.Value3.Value.DecimalValue = undefined;\n }\n });\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(\n `[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`\n );\n }\n}\n\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: >getSearchSuggestionsAction,\n input: createInput\n});\n\nexport default getSearchSuggestionsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* eslint-disable no-duplicate-imports */\n/* eslint-disable security/detect-non-literal-regexp */\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IDlvrySearchData } from '../dlvry-search.data';\nimport { IDlvrySearchProps } from '../dlvry-search.props.autogenerated';\nimport { formatString } from '../../../shared-utils/string-utils';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: IDlvrySearchProps;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\n searchTermCompleted: string | undefined;\n categorySuggestionProductCount: string;\n categorySuggestionProductCountPlural: string;\n categorySuggestionJoinerText: string;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * CategorySuggestionsComponent.\n * @param props\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n // @ts-ignore\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: null, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading\n ? format(categorySuggestionHeading, searchText)\n : `Search \"${searchText}\" in categories`;\n\n return
  • {categoryAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix, shouldShowFullPath } = props;\n\n const splitValue = shouldShowFullPath ? item.Value : item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n const fullText = `${props.searchTermCompleted?.toUpperCase()} ${props.categorySuggestionJoinerText} ${ariaLabel}`;\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const count = item.Value3?.Value?.IntegerValue;\n const productCountLabel = count === 1\n ? props.categorySuggestionProductCount\n : props.categorySuggestionProductCountPlural;\n return (\n
  • \n \n \n {props.searchTermCompleted?.toUpperCase()}\n   {props.categorySuggestionJoinerText}  \n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n \n
    ({formatString(productCountLabel, item.Value3?.Value?.IntegerValue)})
    \n
    \n
  • \n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n\n if (searchQsp && searchText) {\n queryUrl.searchParams.set(searchQsp, searchText);\n }\n\n const categoryRefiners = searchRefiners?.find(refiners => {\n return refiners.SourceValue === ProductRefinerSource.Category;\n });\n const refiner = categoryRefiners?.Values?.find(item => {\n return item.RefinerRecordId === Number.parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\n if (encodedRefiner) {\n queryUrl.searchParams.set('refiners', encodedRefiner);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n // eslint-disable-next-line react/no-danger\n return ;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach(refiner => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach(refinerKey => {\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n","/*!\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 } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport classnames from 'classnames';\r\n\r\nexport interface ISearchFormProps {\r\n hideSearchLabel: boolean | undefined;\r\n isSearchFormExpanded?: boolean | undefined;\r\n disableSubmitSearch: boolean | undefined;\r\n searchTextInput: React.RefObject;\r\n maxChars: number;\r\n searchQsp: string;\r\n searchPlaceholder: string;\r\n query: string;\r\n ariaLabelCancel: string;\r\n ariaLabelSearch: string;\r\n ariaLabelSubmit: string;\r\n handleCancelSearchChange(): void;\r\n handleInputChange(query: string): void;\r\n}\r\n\r\nexport interface ISearchFormViewProps {\r\n input: React.ReactNode;\r\n submitBtn: React.ReactNode;\r\n cancelBtn: React.ReactNode;\r\n}\r\n\r\n/**\r\n * On Input Change functionality.\r\n * @param handleInputChange -Input change function.\r\n * @returns Set updated input value.\r\n */\r\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent) => {\r\n handleInputChange(event.target.value || '');\r\n};\r\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\r\n const {\r\n searchQsp,\r\n searchPlaceholder,\r\n hideSearchLabel,\r\n searchTextInput,\r\n handleInputChange,\r\n maxChars,\r\n disableSubmitSearch,\r\n handleCancelSearchChange,\r\n query,\r\n ariaLabelCancel,\r\n ariaLabelSearch,\r\n ariaLabelSubmit\r\n } = props;\r\n\r\n const onInputChange = onInputChangeFunction(handleInputChange);\r\n\r\n const inputNode = !hideSearchLabel ? (\r\n \r\n ) : (\r\n \r\n );\r\n\r\n const submitBtnNode = !disableSubmitSearch && \n \n );\n};\n","import * as React from 'react';\r\nimport {\r\n format,\r\n Tooltip\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\n\r\nexport interface ICartCountProps {\r\n productId: number;\r\n cart: ICartState;\r\n inCartTooltipText?: string;\r\n}\r\n\r\nconst CartCount = (props: ICartCountProps) => {\r\n const { cart, productId, inCartTooltipText } = props;\r\n const [showCartCountTooltip, setShowCartCountTooltip] = React.useState(false);\r\n\r\n // const cartQuantity = cart?.cart.CartLines?.find(x => x.ProductId === productId)?.Quantity;\r\n const cartQuantity = cart?.cart.CartLines?.filter(x => x.ProductId === productId).reduce((acc, val) => acc + (val.Quantity || 0), 0);\r\n\r\n if (!cartQuantity) {\r\n return null;\r\n }\r\n\r\n const cartCountId = `productResults-item-cart-count-${productId}`;\r\n const tooltipString = inCartTooltipText || '{0} i handlekurven';\r\n const tooltipText = format(tooltipString, cartQuantity);\r\n\r\n return (\r\n setShowCartCountTooltip(true)}\r\n onMouseOut={() => setShowCartCountTooltip(false)}\r\n onTouchStart={() => setShowCartCountTooltip(true)}\r\n >\r\n {cartQuantity}\r\n \r\n {tooltipText}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CartCount;\r\n","import * as React from 'react';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport ProductListOrderQuantity from '../../../components/common/product-list-order-quantity';\r\nimport { AddToCartComponent, IAddToCartToastResources } from '../../dlvry-buybox/common/add-to-cart.component';\r\nimport { ProductSearchResultExt } from '../../dlvry-search-result-container/components';\r\nimport CartCount from './cart-count';\r\nimport PQueue from 'p-queue';\r\nimport { BuyValidationResult } from '../../../themes/dlvry-adventureworks/views/components/product.component';\r\nimport { IDlvrySearchResources } from '../dlvry-search.props.autogenerated';\r\n\r\ninterface IBuySectionProps {\r\n context: ICoreContext;\r\n id: string;\r\n typeName: string;\r\n resources: IDlvrySearchResources;\r\n productRecordId: number;\r\n simpleProduct: SimpleProduct | undefined;\r\n productPrice: ProductPrice | undefined;\r\n cart: ICartState;\r\n cartQueue: PQueue | undefined;\r\n inCartTooltipText: string | undefined;\r\n onBuyValidate: (product: ProductSearchResultExt, quantity: number) => Promise;\r\n}\r\n\r\nconst BuySection = (props: IBuySectionProps) => {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n productRecordId,\r\n simpleProduct,\r\n productPrice,\r\n cart,\r\n cartQueue,\r\n inCartTooltipText\r\n } = props;\r\n const [quantity, setQuantity] = React.useState(0);\r\n const [breakoff, setBreakoff] = React.useState(false);\r\n const [forceUpdate , setForceUpdate] = React.useState(0);\r\n\r\n const onContainerClick = React.useCallback((e: React.MouseEvent) => {\r\n if ((e.target as HTMLElement).closest('.dlvry-switch')) {\r\n // No need to prevent default if the click is on the switch and will in fact break the switch\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }, []);\r\n\r\n const toastStrings: IAddToCartToastResources = {\r\n errorHeader: resources.toastErrorHeader,\r\n productsAddedToCart: resources.productsAddedToCart,\r\n productsRemovedFromCart: resources.productsRemovedFromCart,\r\n productsUpdatedInCart: resources.productsUpdatedInCart,\r\n goToCart: resources.toastGoToCart,\r\n noAccessToProduct: resources.toastNoAccessToProduct\r\n };\r\n\r\n const productSearchResult: ProductSearchResultExt = {\r\n RecordId: productRecordId,\r\n Price: productPrice?.CustomerContextualPrice || 0\r\n };\r\n\r\n return (\r\n
    e.preventDefault()} onClick={onContainerClick}>\r\n \r\n\r\n {simpleProduct && (\r\n
    \r\n \r\n { setForceUpdate(forceUpdate + 1); }}\r\n />\r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default BuySection;\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\n/* eslint-disable security/detect-non-literal-regexp */\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, SearchSuggestion, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n INodeProps,\r\n IPayLoad,\r\n ITelemetryContent,\r\n NodeTag\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport * as React from 'react';\r\n\r\nimport { IDlvrySearchData } from '../dlvry-search.data';\r\nimport { IDlvrySearchProps, IDlvrySearchResources } from '../dlvry-search.props.autogenerated';\r\nimport BuySection from './buy-section';\r\nimport PQueue from 'p-queue';\r\nimport { BuyValidationResult } from '../../../themes/dlvry-adventureworks/views/components/product.component';\r\nimport { ProductSearchResultExt } from '../../dlvry-search-result-container/components';\r\n\r\n/**\r\n * Search product suggest resources.\r\n */\r\nexport interface ISearchProductSuggestResources {\r\n freePriceText: string;\r\n inCartTooltipText: string;\r\n}\r\n\r\nexport interface ISearchProductSuggestProps {\r\n searchProductSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: IDlvrySearchProps;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetry: ITelemetry;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n resources?: ISearchProductSuggestResources;\r\n activePrices: { [key: string]: ProductPrice };\r\n simpleProducts: SimpleProduct[];\r\n cart: ICartState | undefined;\r\n cartQueue: PQueue | undefined;\r\n onBuyValidate: (product: ProductSearchResultExt, quantity: number) => Promise;\r\n}\r\n\r\nexport interface ISearchProductViewProps {\r\n title: React.ReactNode;\r\n items: ISearchProductItemViewProps[];\r\n}\r\n\r\nexport interface ISearchProductItemViewProps {\r\n text: React.ReactNode;\r\n thumbnail: React.ReactNode;\r\n price: React.ReactNode;\r\n buySection: React.ReactNode;\r\n LiProduct: INodeProps;\r\n AProduct: INodeProps;\r\n id: string | undefined;\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\nlet telemetryContent: ITelemetryContent | undefined;\r\n\r\n/**\r\n * ProductSuggestionsComponent.\r\n * @param props\r\n */\r\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitSuffix,\r\n hitPrefix,\r\n autoSuggestProps: {\r\n context: { actionContext },\r\n resources: { productSuggestionHeading }\r\n },\r\n moduleType,\r\n moduleId\r\n } = props;\r\n const reactNodes: ISearchProductItemViewProps[] = [];\r\n telemetryContent = props.telemetryContent;\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n suggestions?.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\r\n });\r\n\r\n const titleNode = _renderTitle(productSuggestionHeading);\r\n\r\n return { title: titleNode, items: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (productSuggestionHeading: string) => {\r\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\r\n\r\n return
  • {productAutoSuggestionHeading}
  • ;\r\n};\r\n\r\nconst _assembleNode = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps,\r\n moduleType: string,\r\n moduleId: string\r\n): ISearchProductItemViewProps => {\r\n const altText =\r\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n const price = props.activePrices[item.Id!];\r\n return {\r\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\r\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\r\n price: _renderPrice(price, moduleId, moduleType, props),\r\n buySection: _renderBuySection(item.Id!, props),\r\n LiProduct: _getLiWrapper(),\r\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\r\n id: item.Id\r\n };\r\n};\r\n\r\nconst _getLiWrapper = () => {\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'li' as NodeTag\r\n };\r\n};\r\n\r\nconst _getAWrapper = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps\r\n) => {\r\n const {\r\n autoSuggestProps: { context }\r\n } = props;\r\n const ariaLabel =\r\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n payLoad.contentAction.recid = item.Id;\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const productPrice = item.Value3?.Value?.DecimalValue ? context.cultureFormatter.formatCurrency(item.Value3.Value.DecimalValue) : undefined;\r\n\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'a' as NodeTag,\r\n 'aria-label': `${ariaLabel!} ${productPrice || ''}`,\r\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\r\n ...attribute\r\n };\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const formattedLink = (suggestion.Value as string)\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n return suggestion.Value && suggestion.Id\r\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\r\n : '';\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n return (\r\n // eslint-disable-next-line react/no-danger\r\n \r\n );\r\n};\r\n\r\nconst _renderPrice = (\r\n price: ProductPrice | undefined,\r\n moduleId: string,\r\n moduleType: string,\r\n props: ISearchProductSuggestProps\r\n): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: { context }\r\n } = props;\r\n\r\n if (!price) {\r\n return (\r\n \r\n \r\n ...\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _renderBuySection = (itemId: string, props: ISearchProductSuggestProps): JSX.Element | null => {\r\n const productId = parseInt(itemId, 10);\r\n\r\n if (isNaN(productId) || !props.cart) {\r\n return null;\r\n }\r\n\r\n if (!props.autoSuggestProps.context.request.user.isAuthenticated) {\r\n return null;\r\n }\r\n\r\n const {\r\n id,\r\n typeName,\r\n context\r\n } = props.autoSuggestProps;\r\n const simpleProduct = props.simpleProducts.find(product => product.RecordId === productId);\r\n const productPrice = props.activePrices[itemId];\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: {\r\n context: {\r\n request: { gridSettings }\r\n },\r\n config: { imageSettings }\r\n }\r\n } = props;\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n\r\n if (!suggestion || !suggestion.ImageUrl) {\r\n props.telemetry.error('Search suggestion content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n lg: { q: 'w=64&h=64&m=0&f=webp', w: 64, h: 64 },\r\n md: { q: 'w=64&h=64&m=0&f=webp', w: 64, h: 64 },\r\n sm: { q: 'w=64&h=64&m=0&f=webp', w: 64, h: 64 },\r\n xl: { q: 'w=64&h=64&m=0&f=webp', w: 64, h: 64 },\r\n xs: { q: 'w=64&h=64&m=0&f=webp', w: 64, h: 64 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n if (imageSettings) {\r\n imageSettings.viewports = defaultImageSettings.viewports;\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IDlvrySearch contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport interface IDlvrySearchConfig extends Msdyn365.IModuleConfig {\r\n suggestionTypeCriterion?: ISuggestionTypeCriterionData[];\r\n topResultsCount?: number;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n hideSearchLabel?: boolean;\r\n disableSubmitSearch?: boolean;\r\n searchplaceholderText?: string;\r\n shouldShowFullCategoryPath?: boolean;\r\n noSearchResultImage?: Msdyn365.IImageData;\r\n className?: string;\r\n clientRender?: boolean;\r\n}\r\n\r\nexport interface IDlvrySearchResources {\r\n searchtext: string;\r\n searchLabelArialLabel: string;\r\n cancelBtnAriaLabel: string;\r\n searchBtnAriaLabel: string;\r\n submitBtnAriaLabel: string;\r\n autoSuggestFoundMessage: string;\r\n noAutoSuggestionMessage: string;\r\n productSuggestionHeading: string;\r\n categorySuggestionHeading: string;\r\n autoSuggestResultLoadingMessage: string;\r\n freePriceText: string;\r\n searchSuggestionHeading: string;\r\n keywordsHeading: string;\r\n noResultText: string;\r\n noResultContentHeadingText: string;\r\n noResultContentParagraphText: string;\r\n clearSearchButtonText: string;\r\n emptyMobileSearchTextHeading: string;\r\n emptyMobileSearchText: string;\r\n categorySuggestionProductCount: string;\r\n categorySuggestionProductCountPlural: string;\r\n categorySuggestionJoinerText: string;\r\n inCartTooltipText: string;\r\n addToCartButtonText: string;\r\n productsAddedToCart: string;\r\n productsRemovedFromCart: string;\r\n productsUpdatedInCart: string;\r\n toastErrorHeader: string;\r\n toastGoToCart: string;\r\n toastNoAccessToProduct: string;\r\n}\r\n\r\nexport const enum SuggestionTypeCriterionSuggestionType {\r\n product = 'product',\r\n keyword = 'keyword',\r\n scopedCategory = 'scopedCategory'\r\n}\r\n\r\nexport interface ISuggestionTypeCriterionData {\r\n SuggestionType?: SuggestionTypeCriterionSuggestionType;\r\n}\r\n\r\nexport interface IDlvrySearchProps extends Msdyn365.IModule {\r\n resources: IDlvrySearchResources;\r\n config: IDlvrySearchConfig;\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 { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductRefiner, ProductRefinerSource, ProductSearchResult, ProductsDataActions, ProjectionDomain, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, ObjectExtensions, Random, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { debounce } from 'lodash';\r\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\r\nimport * as React from 'react';\r\n\r\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\r\nimport {\r\n CategorySuggestionsComponent,\r\n FormComponent,\r\n ISearchCategoryViewProps,\r\n ISearchKeywordViewProps,\r\n ISearchProductViewProps,\r\n KeywordSuggestionsComponent,\r\n LabelComponent,\r\n ProductSuggestionsComponent\r\n} from './components';\r\nimport { IDlvrySearchData } from './dlvry-search.data';\r\nimport { IDlvrySearchProps, ISuggestionTypeCriterionData, SuggestionTypeCriterionSuggestionType } from './dlvry-search.props.autogenerated';\r\nimport { getActivePricesAsync, searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport PQueue from 'p-queue';\r\nimport { ProductSearchResultExt } from '../dlvry-search-result-container/components';\r\nimport { BuyValidationResult } from '../../themes/dlvry-adventureworks/views/components/product.component';\r\nimport { onBuyHasAccessValidator } from '../../shared-utils/attributes/on-buy-access-validator';\r\n\r\nexport interface ISearchState {\r\n isSearchFormExpanded: boolean;\r\n searchText: string;\r\n searchKeywordSuggestClass: string;\r\n searchProductSuggestClass: string;\r\n searchCategorySuggestClass: string;\r\n suggestions: Autosuggestions | undefined;\r\n searchRefiners?: ProductRefiner[] | undefined;\r\n autoSuggestAriaLabel: string;\r\n isInitialState: boolean;\r\n isLoadingAutoSuggest?: boolean;\r\n searchTermCompleted?: string;\r\n activePrices: { [key: string]: ProductPrice };\r\n simpleProducts: SimpleProduct[];\r\n productSearchResults: ProductSearchResult[];\r\n}\r\n\r\nexport interface ISearchViewProps extends IDlvrySearchProps {\r\n Search: IModuleProps;\r\n AutoSuggestAriaLabel: INodeProps;\r\n AutoSuggestAriaLabelText: string;\r\n searchText: string;\r\n AutoSuggest: INodeProps;\r\n KeywordSuggest: INodeProps;\r\n ProductSuggest: INodeProps;\r\n CategorySuggest: INodeProps;\r\n SearchForm: INodeProps;\r\n FormWrapper: INodeProps;\r\n UlKeyword: INodeProps;\r\n UlProduct: INodeProps;\r\n UlCategory: INodeProps;\r\n label: React.ReactNode;\r\n form: React.ReactNode;\r\n autosuggestKeyword?: ISearchKeywordViewProps;\r\n autosuggestProduct?: ISearchProductViewProps;\r\n autosuggestCategory?: ISearchCategoryViewProps;\r\n callbacks: {\r\n handleCancelSearchChange(): void;\r\n handleCancelSearchFocused?(): void;\r\n };\r\n isSearchFormExpanded: boolean;\r\n isLoadingAutoSuggest?: boolean;\r\n isLoadingNode?: React.ReactNode;\r\n searchTermCompleted?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Search module.\r\n * @extends {React.Component, ISearchState>}\r\n */\r\nclass Search extends React.Component, ISearchState> {\r\n private readonly searchTextInput: React.RefObject;\r\n\r\n private readonly searchCollapsedLabel: React.RefObject;\r\n\r\n private readonly formReference: React.RefObject;\r\n\r\n private readonly maxChars: number;\r\n\r\n private readonly topResultsCount?: number;\r\n\r\n private readonly hitPrefix: string = '{';\r\n\r\n private readonly hitSuffix: string = '}';\r\n\r\n private readonly waitTime: number = 500;\r\n\r\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject;\r\n\r\n private readonly autoSuggestResultDiv: React.RefObject;\r\n\r\n private readonly searchFormClass: string;\r\n\r\n private readonly searchLabelClass: string;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private loadSuggestionsRequestId?: string;\r\n\r\n private inputSuggestionType: ISuggestionTypeCriterionData[];\r\n\r\n // @ts-expect-error\r\n private cancellabelDebounce: debounce;\r\n\r\n private cartQueue = new PQueue({ concurrency: 1 });\r\n\r\n public constructor(props: IDlvrySearchProps) {\r\n super(props);\r\n this.searchTextInput = React.createRef();\r\n this.searchCollapsedLabel = React.createRef();\r\n this.autoSuggestResultScreenReaderDiv = React.createRef();\r\n this.autoSuggestResultDiv = React.createRef();\r\n this.formReference = React.createRef();\r\n this.state = {\r\n isSearchFormExpanded: false,\r\n searchText: '',\r\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\r\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\r\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: '',\r\n isInitialState: true,\r\n isLoadingAutoSuggest: false,\r\n activePrices: {},\r\n simpleProducts: [],\r\n productSearchResults: []\r\n };\r\n this.maxChars =\r\n (this.props.context &&\r\n this.props.context.app &&\r\n this.props.context.app.config &&\r\n this.props.context.app.config.searchInputMaxLength) ||\r\n 50;\r\n\r\n this.inputSuggestionType = [];\r\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\r\n this.searchFormClass = 'ms-search__form';\r\n this.searchLabelClass = 'ms-search__label';\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 this._initSuggestionTypes();\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\r\n window && window.addEventListener('keyup', this._keyup);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\r\n window && window.removeEventListener('keyup', this._keyup, false);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const {\r\n config: { hideSearchLabel }\r\n } = this.props;\r\n const { isSearchFormExpanded, isInitialState } = this.state;\r\n\r\n if (!this.props.context.request.params.isEditor) {\r\n if (!hideSearchLabel && isSearchFormExpanded) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else if (!isInitialState) {\r\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\r\n }\r\n }\r\n\r\n void this._getActivePrices();\r\n void this._getSimpleProducts();\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IDlvrySearchProps, nextState: ISearchState): 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 // eslint-disable-next-line complexity -- ignore complexity.\r\n public render(): JSX.Element {\r\n const {\r\n context,\r\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\r\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\r\n } = this.props;\r\n\r\n const {\r\n isSearchFormExpanded,\r\n searchText,\r\n searchKeywordSuggestClass,\r\n searchProductSuggestClass,\r\n searchCategorySuggestClass,\r\n suggestions,\r\n searchRefiners,\r\n isLoadingAutoSuggest\r\n } = this.state;\r\n\r\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\r\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\r\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\r\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\r\n\r\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\r\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\r\n );\r\n const productSuggestions = suggestions?.AllSearchResults?.filter(\r\n suggestion => suggestion.SuggestionType === SuggestionType.Product\r\n );\r\n const categoryRefiners = searchRefiners?.find(refiner => {\r\n return refiner.SourceValue === ProductRefinerSource.Category;\r\n });\r\n const categorySuggestions = suggestions?.AllSearchResults?.filter(suggestion => {\r\n if (suggestion.SuggestionType !== SuggestionType.Category) {\r\n return false;\r\n }\r\n const refiner = categoryRefiners?.Values?.find(item => {\r\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\r\n });\r\n\r\n return !ObjectExtensions.isNullOrUndefined(refiner);\r\n });\r\n\r\n const viewProps: ISearchViewProps = {\r\n ...(this.props as IDlvrySearchProps),\r\n\r\n Search: {\r\n moduleProps: this.props,\r\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\r\n },\r\n AutoSuggestAriaLabel: {\r\n tag: 'div',\r\n className: 'msc-autoSuggest__screen-reader',\r\n 'aria-live': 'assertive',\r\n ref: this.autoSuggestResultScreenReaderDiv\r\n },\r\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\r\n searchText: this.state.searchText,\r\n AutoSuggest: {\r\n ref: this.autoSuggestResultDiv,\r\n className: classnames('ms-search__autoSuggest', { show: this.state.searchTermCompleted, hide: !this.state.searchTermCompleted })\r\n },\r\n KeywordSuggest: {\r\n className: searchKeywordSuggestClass\r\n },\r\n ProductSuggest: {\r\n className: searchProductSuggestClass\r\n },\r\n CategorySuggest: {\r\n className: searchCategorySuggestClass\r\n },\r\n SearchForm: {\r\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\r\n },\r\n FormWrapper: {\r\n tag: 'form',\r\n ref: this.formReference,\r\n className: 'ms-search__searchForm',\r\n 'aria-label': 'Search',\r\n name: 'searchForm',\r\n role: 'search',\r\n action: searchURL,\r\n autoComplete: 'off',\r\n onSubmit: this._handleSubmit\r\n },\r\n UlKeyword: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__keywordResults-items', className)\r\n },\r\n UlProduct: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__productResults-items', className)\r\n },\r\n UlCategory: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__categoryResults-items', className)\r\n },\r\n label: LabelComponent({\r\n isSearchFormExpanded,\r\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\r\n searchtext,\r\n searchLabelArialLabel,\r\n searchCollapsedLabel: this.searchCollapsedLabel,\r\n hideSearchLabel,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n telemetryContent: this.telemetryContent\r\n }),\r\n form: FormComponent({\r\n ariaLabelCancel: cancelBtnAriaLabel,\r\n ariaLabelSearch: searchBtnAriaLabel,\r\n ariaLabelSubmit: submitBtnAriaLabel,\r\n hideSearchLabel,\r\n searchTextInput: this.searchTextInput,\r\n disableSubmitSearch,\r\n handleInputChange: this._handleInputChange,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n maxChars: this.maxChars,\r\n searchQsp,\r\n searchPlaceholder,\r\n query: searchText\r\n }),\r\n autosuggestKeyword:\r\n searchText &&\r\n searchText.length > 0 &&\r\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions)))\r\n ? KeywordSuggestionsComponent({\r\n searchKeywordSuggestClass,\r\n searchPageURL,\r\n searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText,\r\n searchTermCompleted: this.state.searchTermCompleted,\r\n suggestions: keywordSuggestions,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestProduct:\r\n searchText &&\r\n searchText.length > 0 &&\r\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions)))\r\n ? ProductSuggestionsComponent({\r\n searchProductSuggestClass,\r\n searchPageURL,\r\n searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText,\r\n suggestions: productSuggestions,\r\n telemetry: this.props.telemetry,\r\n moduleType: this.props.typeName,\r\n moduleId: this.props.id,\r\n telemetryContent: this.telemetryContent,\r\n resources: this.props.resources,\r\n activePrices: this.state.activePrices,\r\n simpleProducts: this.state.simpleProducts,\r\n cart: this.props.data.cart.result,\r\n cartQueue: this.cartQueue,\r\n onBuyValidate: this._onBuyValidate\r\n })\r\n : undefined,\r\n autosuggestCategory:\r\n searchText &&\r\n searchText.length > 0 &&\r\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions)))\r\n ? CategorySuggestionsComponent({\r\n searchCategorySuggestClass,\r\n searchPageURL,\r\n searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText,\r\n suggestions: categorySuggestions,\r\n searchRefiners,\r\n telemetryContent: this.telemetryContent,\r\n shouldShowFullPath: shouldShowFullCategoryPath,\r\n searchTermCompleted: this.state.searchTermCompleted,\r\n categorySuggestionProductCount: this.props.resources.categorySuggestionProductCount,\r\n categorySuggestionProductCountPlural: this.props.resources.categorySuggestionProductCountPlural,\r\n categorySuggestionJoinerText: this.props.resources.categorySuggestionJoinerText\r\n })\r\n : undefined,\r\n callbacks: {\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n handleCancelSearchFocused: this._handleCancelSearchFocused\r\n },\r\n isSearchFormExpanded: this.state.isSearchFormExpanded,\r\n isLoadingAutoSuggest,\r\n isLoadingNode: this._isLoadingNode(),\r\n searchTermCompleted: this.state.searchTermCompleted\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _initSuggestionTypes() {\r\n const suggestionTypes = this.props.config.suggestionTypeCriterion;\r\n\r\n const suggestions = ArrayExtensions.unique(ArrayExtensions.validValues(suggestionTypes));\r\n if (!ArrayExtensions.hasElements(suggestions)) {\r\n this.inputSuggestionType = [\r\n { SuggestionType: SuggestionTypeCriterionSuggestionType.keyword },\r\n { SuggestionType: SuggestionTypeCriterionSuggestionType.product },\r\n { SuggestionType: SuggestionTypeCriterionSuggestionType.scopedCategory }\r\n ];\r\n return;\r\n }\r\n\r\n const validSuggestions = suggestions.filter(suggestion => suggestion.SuggestionType);\r\n if (ArrayExtensions.hasElements(validSuggestions)) {\r\n this.inputSuggestionType = validSuggestions;\r\n return;\r\n }\r\n\r\n this.inputSuggestionType = [];\r\n }\r\n\r\n /**\r\n * Function to create the ReactNode for loading Autosuggest result.\r\n * @returns ReachNode for loading Autosuggest result.\r\n */\r\n private readonly _isLoadingNode = (): React.ReactNode => {\r\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\r\n return ;\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private readonly _focusOutTarget = (e: any): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\r\n this._clearAutoSuggestState();\r\n }\r\n };\r\n\r\n private readonly _keyup = (e: KeyboardEvent): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\r\n this._clearAutoSuggestState();\r\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n\r\n if (\r\n !(\r\n (this.formReference.current && this.formReference.current.contains((e.target as unknown) as Node)) ||\r\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains((e.target as unknown) as Node))\r\n )\r\n ) {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n };\r\n\r\n private readonly _clearAutoSuggestState = (): void => {\r\n const {\r\n context: { actionContext },\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\r\n searchState.searchText = '';\r\n searchState.defaultBasicSearchUrl = '';\r\n searchState.searchQueryStringParameter = '';\r\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\r\n this.searchTextInput.current.value = '';\r\n }\r\n\r\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined, searchTermCompleted: '' });\r\n };\r\n\r\n private async _getActivePrices() {\r\n const { context } = this.props;\r\n const missingPrices = this.state.suggestions?.AllSearchResults?.filter(x => x.SuggestionType === 'Product' && !this.state.activePrices[x.Id!]);\r\n const projectDomain: ProjectionDomain = { ChannelId: +context.request.apiSettings.channelId, CatalogId: context.request.apiSettings.catalogId };\r\n\r\n if (!missingPrices || missingPrices.length === 0) {\r\n return;\r\n }\r\n\r\n const prices = await getActivePricesAsync({ callerContext: context.actionContext },\r\n projectDomain,\r\n missingPrices.map(x => +x.Id!),\r\n new Date(),\r\n null,\r\n undefined,\r\n true);\r\n\r\n const newActivePrices = { ...this.state.activePrices };\r\n prices.forEach(x => {\r\n if (x.ProductId && x.CustomerContextualPrice) {\r\n newActivePrices[x.ProductId.toString()] = x;\r\n }\r\n });\r\n\r\n this.setState({ activePrices: newActivePrices });\r\n }\r\n\r\n private async _getSimpleProducts() {\r\n const { context } = this.props;\r\n const missingProducts = this.state.suggestions?.AllSearchResults\r\n ?.filter(x => x.Id && x.SuggestionType === 'Product' && !this.state.simpleProducts.find(y => y.RecordId === parseInt(x.Id!, 10)));\r\n\r\n if (!missingProducts || missingProducts.length === 0) {\r\n return;\r\n }\r\n\r\n const simpleProducts = await ProductsDataActions.getByIdsAsync(\r\n { callerContext: context.actionContext },\r\n context.request.apiSettings.channelId,\r\n missingProducts.filter(x => x.Id).map(x => parseInt(x.Id!, 10))\r\n );\r\n const newSimpleProducts = [ ...this.state.simpleProducts, ...simpleProducts ];\r\n\r\n this.setState({ simpleProducts: newSimpleProducts });\r\n }\r\n\r\n private async _getSearchSuggestions(loadSuggestionsRequestId: string, query: string) {\r\n try {\r\n const searchSuggestions = await getSearchSuggestionsAction(\r\n new AutoSuggestInput(query, this.topResultsCount, this._getSuggestionType(), this.hitPrefix, this.hitSuffix),\r\n this.props.context.actionContext\r\n );\r\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\r\n return undefined;\r\n }\r\n return searchSuggestions;\r\n } catch (error) {\r\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\r\n return undefined;\r\n }\r\n this.setState({ suggestions: undefined, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\r\n this.props.telemetry.exception(error);\r\n this.props.telemetry.debug('Unable to get auto suggest results');\r\n return undefined;\r\n }\r\n }\r\n\r\n private async _updateSearchRefiners(loadSuggestionsRequestId: string, query: string, suggestions: Autosuggestions | undefined) {\r\n try {\r\n const refiners = await this._getSearchRefiners(query);\r\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\r\n return;\r\n }\r\n this.setState({\r\n suggestions,\r\n searchRefiners: refiners,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions),\r\n isLoadingAutoSuggest: false,\r\n searchTermCompleted: query\r\n });\r\n } catch (error) {\r\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\r\n return;\r\n }\r\n this.setState({ suggestions, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions) });\r\n this.props.telemetry.exception(error);\r\n this.props.telemetry.debug('Unable to get refiners results');\r\n }\r\n }\r\n\r\n private _loadSuggestions(query: string) {\r\n this.cancellabelDebounce = debounce(async () => {\r\n this.setState({ isLoadingAutoSuggest: true });\r\n const loadSuggestionsRequestId = Random.Guid.generateGuid();\r\n this.loadSuggestionsRequestId = loadSuggestionsRequestId;\r\n const searchSuggestions = await this._getSearchSuggestions(loadSuggestionsRequestId, query);\r\n await this._updateSearchRefiners(loadSuggestionsRequestId, query, searchSuggestions);\r\n }, this.waitTime);\r\n\r\n setTimeout(() => {\r\n this.cancellabelDebounce();\r\n }, 0);\r\n }\r\n\r\n private readonly _handleInputChange = (query: string): void => {\r\n if (!query || query.length <= this.maxChars) {\r\n this.setState({ searchText: query });\r\n }\r\n\r\n if (this.cancellabelDebounce) {\r\n this.cancellabelDebounce.cancel();\r\n }\r\n\r\n const {\r\n context,\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (context) {\r\n if (query && query.length > 0) {\r\n if (query.length > this.maxChars) {\r\n return;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(this.inputSuggestionType)) {\r\n this._loadSuggestions(query);\r\n }\r\n\r\n searchState.searchText = query;\r\n } else {\r\n this.setState({ suggestions: undefined, searchRefiners: undefined });\r\n searchState.searchText = '';\r\n }\r\n context.actionContext.update(createSearchStateInput(searchState), searchState);\r\n }\r\n };\r\n\r\n private _getSuggestionType(): string {\r\n const distinctSuggestionTypes: string[] = this.inputSuggestionType.map(\r\n suggestionTypeItem => suggestionTypeItem.SuggestionType!.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType!.slice(1)\r\n );\r\n return distinctSuggestionTypes.join(',');\r\n }\r\n\r\n private async _getSearchRefiners(searchText: string): Promise {\r\n const { actionContext: ctx } = this.props.context;\r\n const catalogId = getCatalogId(ctx.requestContext);\r\n validateCatalogId(catalogId);\r\n return ProductsDataActions.getProductSearchRefinersAsync(\r\n { callerContext: ctx },\r\n {\r\n SearchCondition: searchText,\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: catalogId\r\n }\r\n }\r\n );\r\n }\r\n\r\n private readonly _handleSubmit = (\r\n e: React.MouseEvent | React.KeyboardEvent | React.FormEvent\r\n ): void => {\r\n const {\r\n config: { disableSubmitSearch },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { searchQueryStringParameter }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\r\n e.preventDefault();\r\n\r\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else {\r\n const searchQsp = searchQueryStringParameter || 'q';\r\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\r\n document.location.href = searchURL;\r\n }\r\n };\r\n\r\n private readonly _handleCancelSearchChange = (): void => {\r\n const { isSearchFormExpanded, suggestions } = this.state;\r\n\r\n if (!isSearchFormExpanded) {\r\n this.setState({\r\n isSearchFormExpanded: true,\r\n searchText: '',\r\n isInitialState: false,\r\n searchTermCompleted: ''\r\n });\r\n } else {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n };\r\n\r\n private readonly _handleCancelSearchFocused = (): void => {\r\n const { suggestions } = this.state;\r\n if (!(suggestions && suggestions.AllSearchResults)) {\r\n this._clearAutoSuggestState();\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n };\r\n\r\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\r\n if (!MsDyn365.isBrowser) {\r\n return '';\r\n }\r\n\r\n const queryUrl = new URL(route, window.location.href);\r\n if (qsp && query) {\r\n queryUrl.searchParams.set(qsp, query);\r\n }\r\n\r\n return queryUrl.href;\r\n };\r\n\r\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\r\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\r\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\r\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\r\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\r\n ariaLiveRegion.innerText =\r\n result && result.AllSearchResults && result.AllSearchResults.length > 0 ? suggestResultString : emptyResultString;\r\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\r\n return ariaLiveRegion.innerText;\r\n }\r\n return '';\r\n };\r\n\r\n private readonly _onBuyValidate = async (product: ProductSearchResultExt, quantity: number): Promise => {\r\n const { context, data, resources } = this.props;\r\n\r\n // Buy validation happens on attributes, so we need to get the full product details.\r\n // Check if we already have the product details in the state and if not fetch them. Fetches all products at the same time to reduce the time needed instead of doing one by one.\r\n const missingProducts = this.state.suggestions?.AllSearchResults\r\n ?.filter(x => x.Id && x.SuggestionType === 'Product' && !this.state.productSearchResults.find(y => y.RecordId === parseInt(x.Id!, 10)));\r\n\r\n if (missingProducts && missingProducts.length > 0) {\r\n // Get full product details including attributes for the missing products\r\n const searchResults = await searchByCriteriaAsync(\r\n { callerContext: context.actionContext },\r\n {\r\n Context: {\r\n CatalogId: getCatalogId(context.actionContext.requestContext),\r\n ChannelId: +context.actionContext.requestContext.apiSettings.channelId\r\n },\r\n Ids: missingProducts.map(x => parseInt(x.Id!, 10)),\r\n IncludeAttributes: true\r\n });\r\n\r\n this.setState({ productSearchResults: [...this.state.productSearchResults, ...searchResults] });\r\n }\r\n\r\n return onBuyHasAccessValidator(\r\n context,\r\n data.orgInformation.result,\r\n this.state.productSearchResults.find(x => x.RecordId === product.RecordId) as ProductSearchResultExt,\r\n resources.toastNoAccessToProduct\r\n );\r\n };\r\n}\r\n\r\nexport default Search;\r\n","import * as React from 'react';\r\nimport { ISearchViewProps } from '../dlvry-search';\r\nimport { ISearchFormViewProps } from './dlvry-search.form';\r\n\r\ntype BlackoutOverlayResult = [ boolean, React.CSSProperties, React.Dispatch> ];\r\n\r\nexport const useBlackoutOverlay = (\r\n searchProps: ISearchViewProps,\r\n searchDivRef: React.MutableRefObject,\r\n isMobilePort: boolean,\r\n isSearchText: boolean\r\n): BlackoutOverlayResult => {\r\n const [popupPosition, setPopupPosition] = React.useState({});\r\n const [isInputFocused, setIsInputFocused] = React.useState(false);\r\n\r\n const searchInputRef = ((searchProps.form as ISearchFormViewProps).input as any).ref as React.RefObject;\r\n\r\n const updatePopupPosition = React.useCallback((searchPos: DOMRect, widthOffset: number) => {\r\n setPopupPosition({\r\n top: searchPos.bottom - 2,\r\n left: searchPos.left + 1,\r\n right: 'unset', // bounds.right,\r\n // width: 'unset'\r\n width: searchPos.width + widthOffset\r\n } as React.CSSProperties);\r\n }, [setPopupPosition]);\r\n\r\n React.useEffect(() => {\r\n if (!searchInputRef.current) {\r\n return;\r\n }\r\n\r\n const focus = () => { setIsInputFocused(true); };\r\n const blur = () => { setIsInputFocused(false); };\r\n\r\n searchInputRef.current.addEventListener('focus', focus);\r\n searchInputRef.current.addEventListener('blur', blur);\r\n\r\n return () => {\r\n searchInputRef.current!.removeEventListener('focus', focus);\r\n searchInputRef.current!.removeEventListener('blur', blur);\r\n };\r\n }, [searchInputRef.current]);\r\n\r\n React.useEffect(() => {\r\n // Make sure the search form is expanded when there is text in the input.\r\n // Fixes issue where the search form is collapsed when going from desktop to tablet/mobile view even with text in the input.\r\n if (isInputFocused && !searchProps.searchText && !searchProps.isSearchFormExpanded) {\r\n searchProps.callbacks.handleCancelSearchChange();\r\n }\r\n\r\n // Make sure the search form is collapsed when there is no text in the input.\r\n // Fixes issue where the search form is collapsed when going from desktop to tablet/mobile view even with text in the input.\r\n if (!isInputFocused && !searchProps.searchText && searchProps.isSearchFormExpanded) {\r\n searchProps.callbacks.handleCancelSearchChange();\r\n }\r\n }, [isInputFocused]);\r\n\r\n React.useEffect(() => {\r\n if (!searchDivRef.current) {\r\n return;\r\n }\r\n\r\n const resize = () => {\r\n updatePopupPosition(searchDivRef.current!.getBoundingClientRect(), -1.5);\r\n };\r\n\r\n window.addEventListener('resize', resize);\r\n\r\n return () => {\r\n window.removeEventListener('resize', resize);\r\n };\r\n }, [searchDivRef, searchDivRef.current, setPopupPosition]);\r\n\r\n const shouldShowOverlay = React.useMemo(() =>\r\n isInputFocused || isSearchText || (isMobilePort && searchProps.isSearchFormExpanded),\r\n [isInputFocused, isSearchText, isMobilePort, searchProps.isSearchFormExpanded]\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!shouldShowOverlay) {\r\n return;\r\n }\r\n\r\n document.body.style.position = 'fixed';\r\n document.body.style.top = '0px';\r\n document.body.style.right = '17px';\r\n document.body.style.left = '0px';\r\n document.body.setAttribute('data-popup', 'true');\r\n\r\n updatePopupPosition(searchDivRef.current!.getBoundingClientRect(), -1.5);\r\n\r\n return () => {\r\n document.body.style.position = '';\r\n document.body.style.top = '';\r\n document.body.style.right = '';\r\n document.body.style.left = '';\r\n document.body.removeAttribute('data-popup');\r\n };\r\n }, [shouldShowOverlay, searchDivRef.current]);\r\n\r\n return [ shouldShowOverlay, popupPosition, setIsInputFocused ];\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 { INodeProps, Module, Node, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\r\nimport { ISearchViewProps } from './dlvry-search';\r\nimport { useBlackoutOverlay } from './components/dlvry-search.hooks';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n context,\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label,\r\n isLoadingAutoSuggest,\r\n isLoadingNode,\r\n isSearchFormExpanded,\r\n searchTermCompleted,\r\n callbacks: { handleCancelSearchFocused }\r\n } = props;\r\n\r\n const [isMobilePort, setIsMobile] = React.useState(false);\r\n const overlayDivRef = React.useRef(null);\r\n const searchDivRef = React.useRef(null);\r\n const [\r\n shouldShowOverlay,\r\n popupPosition,\r\n setIsInputFocused\r\n ] = useBlackoutOverlay(props, searchDivRef, isMobilePort, Boolean(searchText));\r\n\r\n React.useEffect(() => {\r\n const onResize = () => {\r\n const isMobileView = isMobile({ variant: VariantType.Browser, context: context.request }) === 'xs';\r\n setIsMobile(isMobileView);\r\n };\r\n onResize(); // Call to set initial value\r\n\r\n window.addEventListener('resize', onResize);\r\n return () => {\r\n window.removeEventListener('resize', onResize);\r\n };\r\n }, [context]);\r\n\r\n const viewport = isMobile({ variant: VariantType.Browser, context: context.request });\r\n const isMobileView = viewport === 'sm' || viewport === 'xs';\r\n\r\n return (\r\n <>\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper, isMobilePort, searchText, searchTermCompleted)}\r\n\r\n {isMobileView && (\r\n \r\n {searchText && searchText.length > 0 ? {AutoSuggestAriaLabelText} : ''}\r\n\r\n {isLoadingAutoSuggest || searchTermCompleted ? (\r\n \r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\r\n \r\n ) : null}\r\n \r\n )}\r\n {!isMobileView && (AutoSuggest.className.includes('show') || isSearchFormExpanded) && (\r\n \r\n {searchText && searchText.length > 0 ? {AutoSuggestAriaLabelText} : ''}\r\n\r\n {searchTermCompleted && (\r\n \r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\r\n \r\n )}\r\n \r\n )}\r\n \r\n {shouldShowOverlay && (\r\n
    {\r\n if (event.target === overlayDivRef.current) {\r\n setIsInputFocused(false);\r\n handleCancelSearchFocused?.();\r\n }\r\n }} />\r\n )}\r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (\r\n form: ISearchFormViewProps,\r\n SearchForm: INodeProps,\r\n FormWrapper: INodeProps,\r\n isMobilePort: boolean,\r\n searchText: string | undefined,\r\n searchTermCompleted: string | undefined\r\n) => {\r\n return (\r\n \r\n \r\n {isMobilePort ? (\r\n <>\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n ) : (\r\n <>\r\n {!searchText && form.submitBtn}\r\n {form.input}\r\n {searchText && form.cancelBtn}\r\n {searchText && form.submitBtn}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {/* {isLoadingAutoSuggest && isLoadingNode} */}\r\n {!isLoadingAutoSuggest &&\r\n keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n
    \r\n {item.text}\r\n
    \r\n {item.price}\r\n {item.buySection}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;\r\n","import { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResultExt } from \"../../modules/dlvry-search-result-container/components\";\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport { hasAccessToBuy } from '.';\r\n\r\nexport interface OnBuyHasAccessValidatorResult {\r\n isValid: boolean;\r\n message?: string;\r\n}\r\n\r\nexport async function onBuyHasAccessValidator(\r\n context: ICoreContext,\r\n customer: Customer | undefined,\r\n product: ProductSearchResultExt,\r\n validationMessage: string | undefined\r\n): Promise {\r\n if (!product || !product.AttributeValues) {\r\n return { isValid: true };\r\n }\r\n\r\n const hasAccess = hasAccessToBuy(context, customer, product.AttributeValues);\r\n\r\n return {\r\n isValid: hasAccess,\r\n message: hasAccess ? undefined : validationMessage\r\n };\r\n}\r\n","export function formatString(template: string, ...values: any[]): string {\r\n if (!template) {\r\n return '';\r\n }\r\n return template.replace(/{(\\d+)}/g, (match, index) => {\r\n const valueIndex = parseInt(index, 10);\r\n return values[valueIndex] !== undefined ? values[valueIndex] : match;\r\n });\r\n}\r\n","import { UnitOfMeasureConversion } from \"@msdyn365-commerce/retail-proxy\";\r\n\r\nexport function getMostRelevantConversion(conversions: UnitOfMeasureConversion[]): UnitOfMeasureConversion | undefined {\r\n // Accepted units, sorted by priority\r\n const acceptedToUnits = [\r\n 'stk',\r\n 'Stykk',\r\n 'Stk-BS',\r\n 'Kilogram',\r\n 'kg',\r\n 'Liter',\r\n '100_meter'\r\n ];\r\n\r\n for (const unit of acceptedToUnits) {\r\n const find = conversions?.find(conversion => conversion.ToUnitOfMeasureSymbol === unit);\r\n if (find) {\r\n return find;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function getKilogramConversion(defaultUnitOfMeasure: string | undefined, conversions: UnitOfMeasureConversion[]): UnitOfMeasureConversion | undefined {\r\n if (!defaultUnitOfMeasure) {\r\n return undefined;\r\n }\r\n\r\n const acceptedToUnits = [\r\n 'Kilogram',\r\n 'kg'\r\n ];\r\n return conversions?.find(conversion =>\r\n conversion.FromUnitOfMeasureSymbol === defaultUnitOfMeasure &&\r\n conversion.ToUnitOfMeasureSymbol && acceptedToUnits.includes(conversion.ToUnitOfMeasureSymbol));\r\n}\r\n\r\nexport function getPcsConversion(conversions: UnitOfMeasureConversion[]): UnitOfMeasureConversion | undefined {\r\n const acceptedFromUnits = [\r\n 'Krt-M1',\r\n 'Krt-BS'\r\n ];\r\n const acceptedToUnits = [\r\n 'stk',\r\n 'Stykk',\r\n 'Stk-BS',\r\n 'Pose-BS'\r\n ];\r\n\r\n return conversions?.find(conversion =>\r\n (conversion.FromUnitOfMeasureSymbol && acceptedFromUnits.includes(conversion.FromUnitOfMeasureSymbol)) &&\r\n (conversion.ToUnitOfMeasureSymbol && acceptedToUnits.includes(conversion.ToUnitOfMeasureSymbol)));\r\n}\r\n\r\nexport function getRoundedFactor(conversion: UnitOfMeasureConversion): number {\r\n // Only round if the conversion is kg/Kilogram\r\n if (conversion.Factor && (conversion.ToUnitOfMeasureSymbol === 'kg' || conversion.ToUnitOfMeasureSymbol === 'Kilogram')) {\r\n return Math.round((conversion.Factor + Number.EPSILON) * 100) / 100;\r\n } else {\r\n return conversion.Factor || 0;\r\n }\r\n}\r\n\r\nexport function getMinimumDecimals(unitOfMeasure: string | undefined): number {\r\n const units = [\r\n 'kg',\r\n 'Kilogram'\r\n ];\r\n return units.includes(unitOfMeasure || '') ? 2 : 0;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { DiscountLine, PriceLine, ProductPrice, ProductType, SalesAgreementPriceLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { Button, Collapse, format, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ProductPriceExt } from '../../../../shared-utils/types';\r\n\r\nconst defaultPrice: number = 0;\r\nconst freePrice: number = 0;\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 salesAgreementPricePrompt?: string;\r\n salesAgreementExpirationDatePrompt?: string;\r\n salesAgreementCommittedQuantityPrompt?: string;\r\n salesAgreementRemainingQuantityPrompt?: 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 product?: SimpleProduct;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n isSalesAgreementPriceFeatureEnabled?: boolean;\r\n useLegacySalesAgreementHTMLFeature?: boolean;\r\n salesAgreementLineId?: number;\r\n priceResources?: IPriceComponentResources;\r\n salesAgreementDetailCollapseProps?: ICollapseProps;\r\n currencyCode?: string;\r\n salesAgreementDetailOnClick?(event: React.MouseEvent | React.KeyboardEvent): void;\r\n discountPercentageSide?: 'left' | 'right';\r\n}\r\n\r\n/**\r\n * The interface of price component.\r\n */\r\nexport interface IPriceComponent extends IComponent {}\r\n\r\nconst priceComponentActions = {};\r\n\r\n/**\r\n * Get the original price from price component props.\r\n * @param props - The IPriceComponentProps.\r\n * @returns The original price.\r\n */\r\nexport const getOriginalPrice = (price: ProductPrice): number => {\r\n let originalPrice = Math.max(\r\n price.TradeAgreementPrice || defaultPrice,\r\n price.AdjustedPrice || defaultPrice\r\n ) || price.BasePrice || defaultPrice;\r\n\r\n // Go through each discount line and apply discounts without \"Show\" in it\r\n getBaseDiscountLines(price.DiscountLines).forEach(discount => {\r\n originalPrice -= discount.EffectiveAmount ?? 0;\r\n });\r\n\r\n return originalPrice;\r\n};\r\n\r\nexport const getDiscountLines = (discountLines: DiscountLine[] | undefined) => {\r\n if (!discountLines || discountLines.length === 0) {\r\n return [];\r\n }\r\n\r\n // Go through each discount line and find lines with Show in it\r\n const discounts = discountLines.filter(x => {\r\n const matches = x.OfferName?.toLowerCase().match(/\\{(.*?)\\}/i) || '';\r\n const parts = matches.length > 1 ? matches[1].split(';').map(x => x.trim()) : undefined;\r\n return parts && parts.includes('show');\r\n });\r\n\r\n return discounts;\r\n};\r\n\r\nexport const getBaseDiscountLines = (discountLines: DiscountLine[] | undefined) => {\r\n if (!discountLines || discountLines.length === 0) {\r\n return [];\r\n }\r\n\r\n // Go through each discount line and apply discounts without \"Show\" in it\r\n const baseDiscounts = discountLines.filter(x => {\r\n const matches = x.OfferName?.toLowerCase().match(/\\{(.*?)\\}/i) || '';\r\n const parts = matches.length > 1 ? matches[1].split(';').map(x => x.trim()) : undefined;\r\n return !parts || parts.length === 0 || !parts.includes('show');\r\n });\r\n\r\n return baseDiscounts;\r\n};\r\n\r\nexport const getDiscountPercentage = (price: ProductPriceExt): number => {\r\n if (price.OverrideDiscountPercentage) {\r\n return price.OverrideDiscountPercentage;\r\n }\r\n\r\n if (!price.CustomerContextualPrice) {\r\n return 0;\r\n }\r\n\r\n const originalPrice = getOriginalPrice(price);\r\n const percentage = 1 - (price.CustomerContextualPrice / originalPrice);\r\n\r\n return Math.floor(percentage * 100);\r\n\r\n // Go through each discount line and find lines with Show in it\r\n // METHOD: Shows the percentage defined in F&O directly\r\n /* const discounts = price.DiscountLines?.filter(x => {\r\n const matches = x.OfferName?.toLowerCase().match(/\\{(.*?)\\}/i) || '';\r\n const parts = matches.length > 1 ? matches[1].split(';').map(x => x.trim()) : undefined;\r\n return parts && parts.includes('show');\r\n });\r\n\r\n return discounts?.reduce((acc, discount) => {\r\n // First use 'Percentage' if it exists, then 'EffectivePercentage' if it exists, then 0\r\n return acc + (discount.Percentage || Math.floor(discount.EffectivePercentage || 0) || 0);\r\n }, 0) ?? 0; */\r\n\r\n // Go through each discount line and find lines with Show in it\r\n // METHOD: Tries to get the percentage defined in F&O. Inaccurate\r\n /* const originalPrice = Math.max(\r\n price.BasePrice ?? defaultPrice,\r\n price.TradeAgreementPrice ?? defaultPrice,\r\n price.AdjustedPrice ?? defaultPrice\r\n );\r\n const discounts = price.DiscountLines?.filter(x => {\r\n const matches = x.OfferName?.toLowerCase().match(/\\{(.*?)\\}/i) || '';\r\n const parts = matches.length > 1 ? matches[1].split(';').map(x => x.trim()) : undefined;\r\n return parts && parts.includes('show');\r\n });\r\n\r\n return discounts?.reduce((acc, discount) => {\r\n if (!discount.EffectiveAmount) {\r\n return acc;\r\n }\r\n\r\n return acc + Math.round(((discount.EffectiveAmount / originalPrice) * 100) + 0.2);\r\n }, 0) ?? 0; */\r\n};\r\n\r\nconst getActivePrice = (props: IPriceComponentProps): number => {\r\n if (showPriceRangeForMasterProduct(props) && props.data.price.MinVariantPrice !== undefined) {\r\n return props.data.price.MinVariantPrice;\r\n }\r\n\r\n if (props.data.price.CustomerContextualPrice !== undefined) {\r\n return props.data.price.CustomerContextualPrice;\r\n }\r\n\r\n return getOriginalPrice(props.data.price);\r\n};\r\n\r\n/**\r\n * Get the formatted currency.\r\n * @param props - The props.\r\n * @param price - The price.\r\n * @param shouldUseFreePriceText - The shouldUseFreePriceText.\r\n * @returns The formatted currency.\r\n */\r\nconst formatCurrency = (\r\n props: IPriceComponentProps,\r\n price: number | undefined,\r\n shouldUseFreePriceText: boolean | undefined,\r\n currencyCode?: string | undefined\r\n): string => {\r\n if (price === undefined) {\r\n return '';\r\n }\r\n\r\n if (shouldUseFreePriceText && price === freePrice && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n\r\n return props.context.cultureFormatter.formatCurrency(price, currencyCode);\r\n};\r\n\r\nconst showPriceRangeForMasterProduct = (props: IPriceComponentProps): boolean => {\r\n return (\r\n (props.isPriceMinMaxEnabled ?? false) &&\r\n (props.product?.ProductTypeValue === ProductType.Master || props.product?.ProductTypeValue === ProductType.KitMaster) &&\r\n props.data.price.MinVariantPrice !== undefined &&\r\n props.data.price.MaxVariantPrice !== undefined\r\n );\r\n};\r\n\r\n/**\r\n * ShowStrikethroughPricing.\r\n * @param props - The props.\r\n * @returns True if showStrikethroughPricing, false otherwise.\r\n */\r\n// @ts-ignore\r\nconst showStrikethroughPricing = (props: IPriceComponentProps): boolean => {\r\n const price = props.data.price as ProductPriceExt;\r\n const overrideDiscountPercentage = price.OverrideDiscountPercentage;\r\n\r\n if (!overrideDiscountPercentage && getDiscountLines(price.DiscountLines).length === 0) {\r\n return false;\r\n }\r\n\r\n if (overrideDiscountPercentage) {\r\n return overrideDiscountPercentage > 0;\r\n }\r\n\r\n const originalPrice = getOriginalPrice(price);\r\n\r\n if (originalPrice && price.CustomerContextualPrice) {\r\n const originalPriceFixed = parseFloat(originalPrice.toFixed(2));\r\n const customerContextualPriceFixed = parseFloat(price.CustomerContextualPrice.toFixed(2));\r\n return originalPriceFixed > customerContextualPriceFixed;\r\n }\r\n\r\n return false;\r\n};\r\n\r\n/**\r\n * Render current price.\r\n * @param props - The props.\r\n * @returns The JSX.Element.\r\n */\r\nconst renderCurrentPrice = (props: IPriceComponentProps): JSX.Element => {\r\n const maxVariantPrice: string = formatCurrency(props, props.data.price.MaxVariantPrice, false, props.currencyCode);\r\n const minVariantPrice: string = formatCurrency(props, props.data.price.MinVariantPrice, false, props.currencyCode);\r\n if (\r\n props.isPriceMinMaxEnabled &&\r\n props.data.price.MaxVariantPrice &&\r\n props.data.price.MinVariantPrice &&\r\n props.data.price.MaxVariantPrice > props.data.price.MinVariantPrice\r\n ) {\r\n return (\r\n \r\n \r\n {minVariantPrice}\r\n \r\n \r\n {props.priceResources?.priceRangeSeparator}\r\n \r\n \r\n {maxVariantPrice}\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {formatCurrency(props, getActivePrice(props), true, props.currencyCode)}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render current price with original price.\r\n * @param props - The props.\r\n * @returns The JSX.Element.\r\n */\r\n// @ts-ignore\r\nconst renderCurrentPriceWithOriginalPrice = (props: IPriceComponentProps): JSX.Element => {\r\n const originalPrice: number = getOriginalPrice(props.data.price);\r\n const initialPrice: string = formatCurrency(props, originalPrice, true);\r\n const discountPercentage = getDiscountPercentage(props.data.price);\r\n\r\n return (\r\n <>\r\n \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 \r\n \r\n {discountPercentage > 0 && -{discountPercentage}%}\r\n {props.savingsText && {props.savingsText}}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * The state of sales agreement details.\r\n * @deprecated This will be removed with SalesAgreementPrice class soon.\r\n */\r\nexport interface ISalesAgreementDetailState {\r\n isOpen: boolean;\r\n}\r\n\r\n/**\r\n * The SalesAgreementPrice class.\r\n * @deprecated This implementation is deprecated. It will be removed soon. Please use the implementation in the Price function component.\r\n */\r\n// eslint-disable-next-line react/require-optimization -- Not needed.\r\nclass SalesAgreementPrice extends React.Component {\r\n public constructor(props: IPriceComponentProps) {\r\n super(props);\r\n this._toggle = this._toggle.bind(this);\r\n this.state = {\r\n isOpen: true\r\n } as ISalesAgreementDetailState;\r\n }\r\n\r\n public render(): React.ReactElement {\r\n const priceLines: PriceLine[] = this.props.data.price.AttainablePriceLines ?? [];\r\n const firstPriceLine: SalesAgreementPriceLine = priceLines[0] as SalesAgreementPriceLine;\r\n if (this.props.salesAgreementDetailCollapseProps) {\r\n this.props.salesAgreementDetailCollapseProps.isOpen = this.state.isOpen;\r\n }\r\n return (\r\n \r\n

    \r\n {formatCurrency(\r\n this.props,\r\n this.props.data.price.SalesAgreementPrice ?? this.props.data.price.CustomerContextualPrice,\r\n true\r\n )}\r\n

    \r\n \r\n {this.props.priceResources?.salesAgreementPricePrompt}\r\n

    \r\n \r\n

    \r\n \r\n {/* Available date */}\r\n {// eslint-disable-next-line prefer-template -- Copied from other class.\r\n ' · ' +\r\n format(\r\n this.props.priceResources?.salesAgreementExpirationDatePrompt ?? '',\r\n this.props.context.cultureFormatter.formatDate(firstPriceLine.EffectiveDate as Date),\r\n this.props.context.cultureFormatter.formatDate(firstPriceLine.ExpirationDate as Date)\r\n )}\r\n \r\n \r\n {/* Quantity commitment */}\r\n {// eslint-disable-next-line prefer-template -- Copied from other class.\r\n ' · ' +\r\n format(\r\n this.props.priceResources?.salesAgreementCommittedQuantityPrompt ?? '',\r\n firstPriceLine.CommittedQuantity\r\n )}\r\n \r\n \r\n {/* Remaining quantity to qualify */}\r\n {// eslint-disable-next-line prefer-template -- Copied from other class.\r\n ' · ' +\r\n format(\r\n this.props.priceResources?.salesAgreementRemainingQuantityPrompt ?? '',\r\n firstPriceLine.RemainingQuantity\r\n )}\r\n \r\n

    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n /**\r\n * Callback which toggles collapse mode.\r\n * @param event - The mouse or keyboard event.\r\n */\r\n private _toggle(event: React.MouseEvent | React.KeyboardEvent): void {\r\n event.preventDefault();\r\n console.log(this.state.isOpen);\r\n // eslint-disable-next-line react/no-access-state-in-setstate -- Copied from other class.\r\n this.setState({ isOpen: !this.state.isOpen });\r\n console.log(this.state.isOpen);\r\n }\r\n}\r\n\r\nconst renderSalesAgreementDetail = (props: IPriceComponentProps): JSX.Element => {\r\n // In most cases there should be only one sales agreement line.\r\n // If there are more than one, only the first one will be shown.\r\n const firstPriceLine: SalesAgreementPriceLine = (props.data.price.AttainablePriceLines ?? [])[0] as SalesAgreementPriceLine;\r\n return (\r\n

    \r\n

    \r\n {/* Available date */}\r\n {// eslint-disable-next-line prefer-template -- Copied from other class.\r\n ' · ' +\r\n format(\r\n props.priceResources?.salesAgreementExpirationDatePrompt ?? '',\r\n props.context.cultureFormatter.formatDate(firstPriceLine.EffectiveDate as Date),\r\n props.context.cultureFormatter.formatDate(firstPriceLine.ExpirationDate as Date)\r\n )}\r\n

    \r\n

    \r\n {/* Quantity commitment */}\r\n {// eslint-disable-next-line prefer-template -- Copied from other class.\r\n ' · ' + format(props.priceResources?.salesAgreementCommittedQuantityPrompt ?? '', firstPriceLine.CommittedQuantity)}\r\n

    \r\n

    \r\n {/* Remaining quantity to qualify */}\r\n {// eslint-disable-next-line prefer-template -- Copied from other class.\r\n ' · ' + format(props.priceResources?.salesAgreementRemainingQuantityPrompt ?? '', firstPriceLine.RemainingQuantity)}\r\n

    \r\n

    \r\n );\r\n};\r\n\r\n/**\r\n * Price.\r\n * @param props - The props.\r\n * @returns The JSX.Element.\r\n */\r\nconst Price: React.FC = (props: IPriceComponentProps): JSX.Element | null => {\r\n // CustomerContextualPrice could be zero\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n\r\n if (!props.context.request.user.isAuthenticated) {\r\n return null;\r\n }\r\n\r\n // Determine if contract price is avaiable/applied by:\r\n // isFeatureEnabled and SA price != 0, for PDP.\r\n // SA line id != 0, for cart line.\r\n if (props.isSalesAgreementPriceFeatureEnabled && props.data.price.SalesAgreementPrice !== 0) {\r\n if (props.useLegacySalesAgreementHTMLFeature) {\r\n const salesAgreementPrice = new SalesAgreementPrice(props);\r\n return {salesAgreementPrice.render()};\r\n } else {\r\n const [isExpanded, setIsExpanded] = React.useState(false);\r\n const toggle = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n return (\r\n \r\n \r\n

    \r\n {formatCurrency(props, props.data.price.SalesAgreementPrice ?? props.data.price.CustomerContextualPrice, true)}\r\n

    \r\n \r\n {props.priceResources?.salesAgreementPricePrompt}\r\n \r\n {isExpanded && renderSalesAgreementDetail(props)}\r\n
    \r\n
    \r\n );\r\n }\r\n }\r\n\r\n const discountPercentageSide = props.discountPercentageSide ?? 'right';\r\n\r\n return (\r\n \r\n {showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)}\r\n {/* {renderCurrentPrice(props)} */}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * The PriceComponent.\r\n */\r\nexport const PriceComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride('Price', {\r\n component: Price,\r\n ...priceComponentActions\r\n});\r\n\r\n\r\nexport default PriceComponent;","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['dlvry-search'] = {\n c: () => require('partner/modules/dlvry-search/dlvry-search.tsx'),\n $type: 'contentModule',\n da: [{name:'cart', path:'@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action', runOn: 0},{name:'orgInformation', path:'actions/get-organization-customer', runOn: 0},{name:'searchState', path:'@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action', runOn: 1}],\n \n iNM: false,\n ns: '__local__',\n n: 'dlvry-search',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/dlvry-search'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action';\n let dataAction = require('@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action';\n let dataAction = require('@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'actions/get-organization-customer';\n let dataAction = require('partner/actions/get-organization-customer');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|dlvry-search|dlvry-search'] = {\n c: () => require('partner/modules/dlvry-search/dlvry-search.view.tsx'),\n cn: '__local__-__local__-dlvry-search'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionInput, IAny, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { GenericInput, getGenericAction } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { SearchState } from './search-state';\n\nexport function createSearchStateInput(result: SearchState): GenericInput {\n return new GenericInput('searchState', result, 'SearchState');\n}\n\nconst createsearchStateInputInternal = (inputData: ICreateActionContext>): IActionInput => {\n return createSearchStateInput({ searchText: '' });\n};\n\nexport const getGenericActionDataAction = createObservableDataAction({\n action: >getGenericAction,\n input: createsearchStateInputInternal\n});\n\nexport default getGenericActionDataAction;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["GetOrganizationCustomerInput","constructor","apiSettings","user","getDataServiceRequest","this","query","createDataServiceRequestForOperation","Entities","bypassCache","returnEntity","shouldCacheOutput","getCacheKey","getCacheObjectType","dataCacheType","DataServiceQuery","getOrganizationCustomerAction","async","input","ctx","requestContext","isAuthenticated","callActionOrExecute","getOrganizationCustomer","createObservableDataAction","id","action","inputData","_user$customerAccount","customerAccountNumber","AlcoholLicenseValidationDetailsExtensionClass","odataObject","Message","LicenseNeeded","ProductId","parseInt","ValidateAlcoholLicenseResultExtensionClass","ValidationResult","CustomerLicense","Details","undefined","i","length","className","substr","lastIndexOf","concat","EntityClasses","validateAlcoholLicenseInput","validationCriteria","validateAlcoholLicenseAsync","request","_ref","label","checked","onChange","mini","miniLabel","internalChecked","setInternalChecked","React","Boolean","classnames","title","type","event","target","ProductListOrderQuantity","props","super","inputRef","_getInitialBreakoff","initialValue","product","_product$Behavior","multiplier","Behavior","MultipleOfQuantity","factor","Math","round","Number","EPSILON","breakoff","_getUnitOfMeasureConversion","_this$props$product","_this$props$unitConve","_this$props$product3","unitConversions","DefaultUnitOfMeasure","conversions","filter","x","_this$props$product2","FromUnitOfMeasureSymbol","conversion","getMostRelevantConversion","getRoundedFactor","toLocaleString","locale","minimumFractionDigits","getMinimumDecimals","ToUnitOfMeasureSymbol","maximumFractionDigits","useGrouping","defaultUOM","humanizeUnitOfMeasure","context","conversionUOM","toLocaleLowerCase","_convertIncomingQuantity","quantity","multipleOf","_convertOutgoingQuantity","outgoing","_onToggleBreakoff","_this$props$onBreakof","_this$props","setState","onBreakoffChange","call","_clamp","total","productMinimumQuantity","productMaximumQuantity","_isValidNewQuantity","newQuantity","allowZero","isNaN","minimum","maximum","currentCount","_this$productMinimumQ","breakoffAvailable","breakoffState","state","currentInput","parsedCurrentInput","parseFloat","bind","_handleChange","_validateQuantity","productMultipleOfQuantity","_this$props$product4","_this$props$product5","DefaultQuantity","_this$props$product6","MaximumQuantity","_this$props$product7","MinimumQuantity","_this$props$product8","_this$props$product9","_this$props$product10","uom","includes","componentDidMount","when","_this$productMinimumQ2","multipler","reaction","_this$props$currentCo","replace","oldQuantity","newValue","_this$props$currentCo2","newInput","_this$props$product11","showDecimals","toString","render","hideUnitConversion","disabled","incDisabled","currentValue","baseClassName","miniBreakoff","legacyBreakoff","extraClass","getChangeHandler","amount","productDefaultQuantity","calcTotal","change","newAmount","newTotal","_onIncrementalChange","Switch","decrementButtonAriaLabel","onClick","tabIndex","color","pattern","value","onBlur","onKeyPress","e","fieldValue","fieldHasCommaOrDot","keyIsCommaOrDot","key","test","preventDefault","separator","_Intl$NumberFormat$fo","Intl","NumberFormat","formatToParts","find","part","getDecimalSeparator","inputQuantityAriaLabel","role","ref","incrementButtonAriaLabel","totalFormatted","UnitOfMeasure","simpleProduct","updatedQuantity","_this$props$onChange","_this$props2","persist","_this$props$onChange2","_this$props3","_this$_clamp","max","_this$props$onChange3","_this$props4","defaultProps","decrementGlyphClass","incrementGlyphClass","__decorate","computed","observer","toast","Toast","toasts","error","header","text","arguments","_objectSpread","autoClose","canClose","position","showProgress","_isPaused","_shouldUnPause","_timeVisible","_autoCloseInterval","_progressInterval","_autoClose","_props","lastTime","func","time","requestAnimationFrame","_remove","_position","currentContainer","_toastElem","parentElement","selector","document","querySelector","_createContainer","append","hasChildNodes","remove","_text","_textElem","textContent","_canClose","classList","toggle","closeButton","createElement","add","addEventListener","_removeBinded","closeIcon","appendChild","_showProgress","style","setProperty","_pauseOnHover","_pause","_unpause","_setup","_this$_props$onClose","_this$_props","cancelAnimationFrame","container","onClose","dataset","body","_headElem","link","cartButton","setAttribute","linkLabel","href","footer","_footElem","_visibilityChange","visibilityState","translations","unitOfMeasure","_translations$locale","_props$simpleProduct","disableTranslate","app","config","disableUnitReplace","url","requestUrl","searchParams","get","toLowerCase","AlcoholGroupAttributeId","isGodmodeEnabled","_context$requestConte","godmode","shouldFilterAlcohol","_context$requestConte2","_context$requestConte3","doAlcoholFiltering","alcoholRefinerRecordId","getAlcoholRefiners","_context$requestConte4","alcoholGroupAttributeId","result","alcoholRefiner","DataTypeValue","LeftValueBoundString","RefinerRecordId","RefinerSourceValue","RightValueBoundString","UnitText","push","alcoholLicenseValue","_customer$Attributes","customer","alcoholLicense","Attributes","RecordId","AttributeValue","StringValue","console","warn","Array","fill","forEach","_","index","addAlcoholRefiner","searchCriteriaInput","_context$requestConte5","Refinement","some","refiners","Promise","resolve","addOrUpdateZeroPriceRefiner","priceRefiner","_context$requestConte6","Count","ExtensionProperties","RowNumber","channel","Currency","getAttributeRefiners","customerAttributes","attributeRecordId","friendlyName","refiner","attributeValue","_customerAttributes$f","attribute","getForsvaretRefiner","_context$requestConte7","forsvaretAttributeId","forsvaretAttributeRecordId","_customerAttributes$f2","IntegerValue","AttributeDataType","Integer","ProductRefinerSource","Attribute","getSvalbardRefiner","_context$requestConte8","_context$requestConte9","svalbardAttributeId","svalbardAttributeRecordId","blockedSvalbardAttributeId","blockedSvalbardAttributeRecordId","_customerAttributes$f3","addAttributeRefiner","addAllAttributeRefiners","_context$requestConte10","_context$requestConte11","_context$requestConte12","_context$requestConte13","_context$requestConte14","_context$requestConte15","attributeRecordIds","tobaccoRefinerRecordId","cocacolaRefinerRecordId","bamaRefinerRecordId","dutyFreeSugarRefinerRecordId","norturaRefinerRecordId","transitRefiner","transitRefinerRecordId","addAttributeRefinerKeepExisting","forsvaretRefiner","svalbardRefiner","getAllAttributeRefiners","_context$requestConte16","_context$requestConte17","_context$requestConte18","_context$requestConte19","_context$requestConte20","_context$requestConte21","ProductListInventoryFilteringOptions","SuggestionType","AutoSuggestInput","searchText","top","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","_ctx$requestContext$a","_searchCriteria$Produ","catalogId","getCatalogId","productSearchCriteria","SearchCondition","Context","ChannelId","channelId","CatalogId","productListInventoryDisplay","HideOOS","inventoryRefinerValue","getInventorySortableRefinerValue","channelInventoryConfiguration","isInStock","ProductAvailabilitySortableAttributeRecordId","TrueFalse","getInventoryConfigurationAsync","callerContext","searchCriteria","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","queryResultSettings","Paging","Top","map","item","_item$Value","ImageUrl","generateImageUrl","Value3","Value","DecimalValue","AllSearchResults","telemetry","Error","autoSuggestPromises","all","then","payLoad","CategorySuggestionsComponent","suggestions","autoSuggestProps","resources","categorySuggestionHeading","reactNodes","getPayloadObject","telemetryContent","_assembleNode","_renderTitle","categoryAutoSuggestionHeading","format","_props$searchTermComp","_props$searchTermComp2","_item$Value2","shouldShowFullPath","splitValue","split","pop","ariaLabel","RegExp","fullText","searchTermCompleted","toUpperCase","categorySuggestionJoinerText","contentAction","etext","getTelemetryAttributes","productCountLabel","categorySuggestionProductCount","categorySuggestionProductCountPlural","Id","Object","assign","_generateLink","_getHighlightedText","formatString","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","MsDyn365","isBrowser","queryUrl","URL","window","location","set","categoryRefiners","SourceValue","Category","Values","encodedRefiner","JSON","stringify","compressRefiners","formattedText","dangerouslySetInnerHTML","getRichTextHtml","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","onInputChangeFunction","inputNode","name","placeholder","maxLength","submitBtnNode","Button","cancelBtn","submitBtn","KeywordSuggestionsComponent","splice","slice","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","attributes","innerRef","_cart$cart$CartLines","cart","productId","inCartTooltipText","showCartCountTooltip","setShowCartCountTooltip","cartQuantity","CartLines","reduce","acc","val","Quantity","cartCountId","tooltipString","tooltipText","onMouseOver","onMouseOut","onTouchStart","Tooltip","isOpen","typeName","productRecordId","productPrice","cartQueue","setQuantity","setBreakoff","forceUpdate","setForceUpdate","onContainerClick","closest","stopPropagation","toastStrings","errorHeader","toastErrorHeader","productsAddedToCart","productsRemovedFromCart","productsUpdatedInCart","goToCart","toastGoToCart","noAccessToProduct","toastNoAccessToProduct","productSearchResult","Price","CustomerContextualPrice","draggable","onDragStart","CartCount","AddToCartComponent","onUpdateQuantity","data","price","productSearch","buyAlwaysAdd","addToCartText","addToCartButtonText","removeFromCartText","updateCartText","onBuyValidate","onAdd","ProductSuggestionsComponent","actionContext","productSuggestionHeading","moduleType","moduleId","items","productAutoSuggestionHeading","altText","activePrices","thumbnail","_renderThumbnail","_renderPrice","buySection","_renderBuySection","LiProduct","_getLiWrapper","AProduct","_getAWrapper","tag","recid","cultureFormatter","formatCurrency","getProductPageUrlSync","_props$resources","PriceComponent","freePriceText","itemId","_props$resources2","simpleProducts","BuySection","gridSettings","imageSettings","cropFocalRegion","defaultImageSettings","viewports","lg","q","w","h","md","sm","xl","xs","lazyload","Image","src","loadFailureBehavior","SuggestionTypeCriterionSuggestionType","Search","waitTime","PQueue","concurrency","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","Spinner","size","SpinnerSize","medium","labelPosition","_focusOutTarget","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","formReference","current","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","update","createSearchStateInput","_handleInputChange","cancellabelDebounce","cancel","ArrayExtensions","hasElements","inputSuggestionType","_loadSuggestions","_handleSubmit","focus","searchURL","_appendQueryParams","getUrlSync","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","route","qsp","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","innerText","_onBuyValidate","_this$state$suggestio","missingProducts","productSearchResults","y","searchResults","searchByCriteriaAsync","Ids","IncludeAttributes","onBuyHasAccessValidator","orgInformation","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","autoSuggestAriaLabel","isLoadingAutoSuggest","searchInputMaxLength","searchFormClass","getTelemetryObject","telemetryPageName","_initSuggestionTypes","componentWillUnmount","removeEventListener","componentDidUpdate","params","isEditor","_getActivePrices","_getSimpleProducts","shouldComponentUpdate","nextProps","nextState","_suggestions$AllSearc","_suggestions$AllSearc2","_suggestions$AllSearc3","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","keywordSuggestions","Keyword","None","productSuggestions","Product","categorySuggestions","_item$RefinerRecordId","ObjectExtensions","isNullOrUndefined","viewProps","moduleProps","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","show","hide","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","autoComplete","onSubmit","UlKeyword","UlProduct","UlCategory","form","autosuggestKeyword","autosuggestProduct","autosuggestCategory","callbacks","handleCancelSearchFocused","isLoadingNode","renderView","suggestionTypes","suggestionTypeCriterion","unique","validValues","keyword","scopedCategory","validSuggestions","_this$state$suggestio2","missingPrices","projectDomain","prices","getActivePricesAsync","Date","newActivePrices","_this$state$suggestio3","ProductsDataActions","newSimpleProducts","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","exception","debug","_getSearchRefiners","_debounce","Random","Guid","generateGuid","_getSearchSuggestions","_updateSearchRefiners","setTimeout","suggestionTypeItem","charAt","join","validateCatalogId","_renderForm","isMobilePort","Node","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","setIsMobile","overlayDivRef","searchDivRef","shouldShowOverlay","popupPosition","setIsInputFocused","useBlackoutOverlay","searchProps","isSearchText","setPopupPosition","isInputFocused","searchInputRef","updatePopupPosition","searchPos","widthOffset","bottom","left","right","width","blur","resize","getBoundingClientRect","removeAttribute","onResize","isMobileView","isMobile","variant","VariantType","Browser","viewport","Module","validationMessage","AttributeValues","isValid","hasAccess","hasAccessToBuy","message","template","_len","values","_key","match","valueIndex","acceptedToUnits","unit","getKilogramConversion","defaultUnitOfMeasure","getPcsConversion","acceptedFromUnits","Factor","getOriginalPrice","originalPrice","TradeAgreementPrice","AdjustedPrice","BasePrice","getBaseDiscountLines","DiscountLines","discount","_discount$EffectiveAm","EffectiveAmount","getDiscountLines","discountLines","_x$OfferName","matches","OfferName","parts","trim","_x$OfferName2","getDiscountPercentage","OverrideDiscountPercentage","percentage","floor","shouldUseFreePriceText","currencyCode","showPriceRangeForMasterProduct","_props$isPriceMinMaxE","_props$product","_props$product2","isPriceMinMaxEnabled","ProductTypeValue","ProductType","Master","KitMaster","MinVariantPrice","MaxVariantPrice","renderCurrentPrice","maxVariantPrice","minVariantPrice","_props$priceResources","itemProp","priceResources","priceRangeSeparator","getActivePrice","SalesAgreementPrice","_toggle","_this$props$data$pric","_this$props$data$pric2","_this$props$priceReso","_this$props$priceReso2","_this$props$priceReso3","_this$props$priceReso4","_this$props$priceReso5","_this$props$priceReso6","_this$props$priceReso7","firstPriceLine","AttainablePriceLines","salesAgreementDetailCollapseProps","salesAgreementPricePrompt","Collapse","salesAgreementExpirationDatePrompt","formatDate","EffectiveDate","ExpirationDate","salesAgreementCommittedQuantityPrompt","CommittedQuantity","salesAgreementRemainingQuantityPrompt","RemainingQuantity","log","msdyn365Commerce","createComponentOverride","component","_props$discountPercen","isSalesAgreementPriceFeatureEnabled","useLegacySalesAgreementHTMLFeature","salesAgreementPrice","_props$data$price$Sal","_props$priceResources8","_props$priceResources9","isExpanded","setIsExpanded","_props$data$price$Att","_props$priceResources2","_props$priceResources3","_props$priceResources4","_props$priceResources5","_props$priceResources6","_props$priceResources7","renderSalesAgreementDetail","discountPercentageSide","overrideDiscountPercentage","toFixed","showStrikethroughPricing","initialPrice","discountPercentage","originalPriceText","currentPriceText","savingsText","renderCurrentPriceWithOriginalPrice","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","SearchState","observable","GenericInput","getGenericActionDataAction","getGenericAction","module","exports","ReactDOM"],"sourceRoot":""}