{"version":3,"file":"static/js/2.b1c3f6c28882235d0690.chunk.js","mappings":"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AAS,GAAK4M,EAAyBrL,EAAS8B,EAAWoJ,EAAS,GAAIC,KAKtG,q7DCrEO,MAAM0B,EAA+C,CACxD,QAAS,OACT,QAAS,OACT,QAAS,OACT,QAAS,OACT,QAAS,UACT,QAAS,YACT,QAAS,SACT,QAAS,OACT,QAAS,OACT,QAAS,OACT,QAAS,WACT,QAAS,UACT,QAAS,QACT,QAAS,aACT,QAAS,aACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,QACT,QAAS,QACT,QAAS,WACT,QAAS,WACT,QAAS,WACT,QAAS,WACT,QAAS,WACT,QAAS,WACT,QAAS,SACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,WACT,QAAS,QACT,QAAS,QACT,QAAS,SACT,QAAS,WACT,QAAS,mBACT,QAAS,WACT,QAAS,MACT,QAAS,QACT,QAAS,MACT,QAAS,WACT,QAAS,WACT,QAAS,iCACT,QAAS,iBACT,QAAS,kBACT,QAAS,QACT,QAAS,SACT,QAAS,sBACT,QAAS,wBACT,QAAS,SACT,QAAS,UACT,aAAc,SACd,QAAS,aACT,QAAS,YACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,MACT,QAAS,SACT,QAAS,aACT,QAAS,OACT,QAAS,cASAC,EAA2C,CACpD,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS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","sources":["webpack://lds-commerce/./src/modules/script-injector/script-injector.tsx?5a34","webpack://lds-commerce/./src/video-player-utilities/components/utilities/key-codes.ts?1004","webpack://lds-commerce/./src/video-player-utilities/components/utilities/string-extensions.ts?3689","webpack://lds-commerce/./src/video-player-utilities/components/utilities/html-extensions.ts?9642","webpack://lds-commerce/./src/video-player-utilities/components/utilities/player-utility.ts?33e3","webpack://lds-commerce/./src/video-player-utilities/components/utilities/utilities.ts?65c9","webpack://lds-commerce/./src/price/price.components.tsx?7295","webpack://lds-commerce/./src/order-template/order-templates-list/order-template-products-preview.tsx?832a","webpack://lds-commerce/./src/video-player-utilities/components/helper/localization-helper.ts?26d0","webpack://lds-commerce/./src/video-player-utilities/components/helper/closed-caption-helper.ts?8eff","webpack://lds-commerce/./src/video-player-utilities/components/helper/player-helper.ts?800e","webpack://lds-commerce/./src/rating/rating.component.tsx?1ba8","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/ttml-settings.ts?ff45","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/ttml-context.ts?2af4","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/ttml-time-parser.ts?72f5","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/ttml-parser.ts?6362","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/video-closed-captions.tsx?4d40","webpack://lds-commerce/./node_modules/@msdyn365-commerce/bootloader/node_modules/core-js/modules/es.string.split.js?2c70","webpack://lds-commerce/./src/social-media/social-media.components.tsx?9b27","webpack://lds-commerce/./src/add-to-cart/add-to-cart.component.tsx?c15a","webpack://lds-commerce/./src/add-to-cart/items-added-to-cart.ts?4f10","webpack://lds-commerce/./src/add-to-cart/items-added-to-cart-error-component.tsx?3e3e","webpack://lds-commerce/./src/add-to-cart/items-added-to-cart-dialog-component.tsx?3a1e","webpack://lds-commerce/./src/add-to-cart/notifications/item-successfully-added-to-cart-notification-component.tsx?1092","webpack://lds-commerce/./src/add-to-cart/notifications/item-successfully-added-to-cart-notification.ts?b5b4","webpack://lds-commerce/./src/add-to-cart/notifications/multi-items-successfully-added-to-cart-notification-component.tsx?ec23","webpack://lds-commerce/./src/add-to-cart/notifications/multi-items-successfully-added-to-cart-notification.ts?4d32","webpack://lds-commerce/./src/add-to-cart/product-model.ts?91f1","webpack://lds-commerce/./src/order-template/add-order-template-to-cart/add-order-template-to-cart.component.tsx?b3bb","webpack://lds-commerce/./src/order-template/rename-order-template/rename-order-template.component.tsx?22f7","webpack://lds-commerce/./src/order-template/lines-added-to-cart-dialog/lines-added-to-cart-dialog.component.tsx?3b78","webpack://lds-commerce/./src/order-template/order-template-name-dialog/order-template-name-dialog.component.tsx?aa9c","webpack://lds-commerce/./src/order-template/order-templates-list/order-template-list.tsx?9a9e","webpack://lds-commerce/./src/order-template/add-to-order-template-dialog/add-to-order-template-dialog.component.tsx?94ad","webpack://lds-commerce/./src/order-template/lines-added-to-order-template-dialog/lines-added-to-order-template-dialog.component.tsx?8a37","webpack://lds-commerce/./src/order-template/add-products-to-order-template/add-products-to-order-template.component.tsx?bf4c","webpack://lds-commerce/./src/order-template/duplicate-items-when-adding-to-order-template-dialog/duplicate-items-when-adding-to-order-template-dialog.component.tsx?1ec3","webpack://lds-commerce/./src/order-template/item-added-to-order-template-dialog/item-added-to-order-template-dialog.component.tsx?017f","webpack://lds-commerce/./src/order-template/add-to-order-template/add-to-order-template.component.tsx?0066","webpack://lds-commerce/./src/order-template/item-added-to-cart-dialog/item-added-to-cart-dialog.component.tsx?9757","webpack://lds-commerce/./src/order-template/save-cart-to-order-template/save-cart-to-order-template.component.tsx?c47e","webpack://lds-commerce/./src/video-player-utilities/player.tsx?8176","webpack://lds-commerce/./src/video-player-utilities/components/action-toggle/action-toggle.tsx?246b","webpack://lds-commerce/./src/video-player-utilities/components/age-gate/age-gate.tsx?96c8","webpack://lds-commerce/./src/video-player-utilities/components/data/player-constants.ts?0a75","webpack://lds-commerce/./src/video-player-utilities/components/data/player-metadata.ts?24d6","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/video-closed-captions-settings.ts?2fc2","webpack://lds-commerce/./src/video-player-utilities/components/menu/menu.tsx?4ce6","webpack://lds-commerce/./src/video-player-utilities/components/menu-item/menu-item.tsx?471c","webpack://lds-commerce/./src/video-player-utilities/components/play-pause-trigger/play-pause-trigger.tsx?3fa4","webpack://lds-commerce/./src/video-player-utilities/components/video-controls/video-controls.tsx?32a5","webpack://lds-commerce/./src/carousel/CarouselContext.tsx?5738","webpack://lds-commerce/./src/carousel/CarouselItem.tsx?ecad","webpack://lds-commerce/./src/carousel/Carousel.tsx?9349","webpack://lds-commerce/./src/cart-icon/cart-icon.component.tsx?ef29","webpack://lds-commerce/./src/promocode/promocode.component.tsx?37c7","webpack://lds-commerce/./src/action-menu/action-menu.component.tsx?7298","webpack://lds-commerce/./src/add-to-wishlist/add-to-wishlist.component.tsx?0a03","webpack://lds-commerce/./src/cartline/components/cart-line-price-editor.tsx?6767","webpack://lds-commerce/./src/cartline/cartlineitem.component.tsx?be39","webpack://lds-commerce/./src/product-card/components/product-component-swatch.tsx?a399","webpack://lds-commerce/./src/product-card/product.component.tsx?32e2","webpack://lds-commerce/./src/product-dimension/dropdown/dropdown.tsx?9ac3","webpack://lds-commerce/./src/product-dimension/product-dimension.component.tsx?387b","webpack://lds-commerce/./src/product-dimension/swatch/swatch-item.tsx?72c2","webpack://lds-commerce/./src/product-dimension/swatch/swatch.tsx?6550","webpack://lds-commerce/./src/product-card-v2/components/product-component-swatch-v2.tsx?1bc1","webpack://lds-commerce/./src/product-dimensions-matrix/components/product-dimensions-matrix-dimension-item.tsx?0f56","webpack://lds-commerce/./src/product-dimensions-matrix/components/product-dimensions-matrix-dimension-selection.tsx?2e77","webpack://lds-commerce/./src/product-dimensions-matrix/components/product-dimensions-matrix-enter-all-quantity-button.tsx?43c1","webpack://lds-commerce/./src/product-dimensions-matrix/product-dimensions-matrix.tsx?50f3","webpack://lds-commerce/./src/refiner/common.tsx?5431","webpack://lds-commerce/./src/refiner/refiner-apply.component.tsx?c65c","webpack://lds-commerce/./src/refiner/refiner-choice-summary.component.tsx?bb08","webpack://lds-commerce/./src/refiner/refiner-footer.component.tsx?922c","webpack://lds-commerce/./src/refiner/refiner-toggle.component.tsx?191b","webpack://lds-commerce/./src/refiner/refiner-sort.component.tsx?6742","webpack://lds-commerce/./src/refiner/refiner-header.component.tsx?f32a","webpack://lds-commerce/./src/refiner/refiner-item-check.component.tsx?49ea","webpack://lds-commerce/./src/refiner/refiner-item-daterange.component.tsx?a87f","webpack://lds-commerce/./src/refiner/refiner-modal.component.tsx?e1db","webpack://lds-commerce/./src/refiner/refiner-options.component.tsx?7d6b","webpack://lds-commerce/./src/refiner/refiner.component.tsx?4a59","webpack://lds-commerce/./src/search-bar/search-bar.component.tsx?4f38","webpack://lds-commerce/./src/table/table.component.tsx?d5d2","webpack://lds-commerce/./src/wishlist-icon/wishlist-icon.component.tsx?a133","webpack://lds-commerce/./src/video-player-utilities/components/data/player-options.ts?0c9c","webpack://lds-commerce/./src/product-card-v2/product-v2.component.tsx?2a5e"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as MsDyn365 from '@msdyn365-commerce/core-internal';\nimport { LogLevel } from '@msdyn365-commerce/telemetry-internal';\nimport * as React from 'react';\nimport { IScriptInjectorProps } from './script-injector.props.autogenerated';\n\n/**\n *\n * CoreComponent component\n * @extends {React.PureComponent<IScriptInjectorProps>}\n */\nclass ScriptInjector extends React.PureComponent<IScriptInjectorProps<{}>> {\n constructor(props: IScriptInjectorProps<{}>) {\n super(props);\n }\n\n public render(): JSX.Element | null {\n const { config } = this.props;\n this._debug(`Adding html head tags for '${this.props.id}/${this.props.typeName}'`);\n\n const placeHolderPropsRegEx = RegExp('%[a-zA-Z0-9-.]*%', 'g');\n let placeHolders: RegExpExecArray | null;\n const originalSource = config && config.scriptSource;\n let resolvedSource;\n\n if (originalSource) {\n let hasMorePlaceHolders = true;\n resolvedSource = originalSource;\n\n while (hasMorePlaceHolders) {\n placeHolders = placeHolderPropsRegEx.exec(originalSource);\n\n if (placeHolders && placeHolders.length > 0) {\n this._debug(`extracted placeholder ${placeHolders[0]}`);\n resolvedSource = this._resolvePlaceHolder(resolvedSource, placeHolders[0]);\n } else {\n hasMorePlaceHolders = false;\n }\n }\n }\n\n if (!resolvedSource) {\n return null;\n }\n\n return (\n <MsDyn365.HtmlHeadInclude>\n {this._isUrl(resolvedSource) ? (\n <script\n src={resolvedSource}\n async={!!config.async}\n defer={!!config.defer}\n data-load-point={config.loadPoint || 'bodyEnd'}\n />\n ) : (\n <script\n async={!!config.async}\n defer={!!config.defer}\n data-load-point={config.loadPoint || 'bodyEnd'}\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: resolvedSource }}\n />\n )}\n </MsDyn365.HtmlHeadInclude>\n );\n }\n\n private _debug(debugMessage: string): void {\n if (this.props.telemetry) {\n this.props.telemetry.log(LogLevel.Debug, debugMessage);\n }\n }\n\n private _isUrl(source: string): boolean {\n // eslint-disable-next-line security/detect-unsafe-regex\n return /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?/.test(source);\n }\n\n private _resolvePlaceHolder(resolvedSource: string, placeHolderToken: string): string {\n // expect placeholder to of the format eg: %config.id%\n const placeHolderTokens = placeHolderToken.split(/[%.]/);\n\n if (placeHolderTokens.length !== 4 || !resolvedSource) {\n return resolvedSource;\n }\n\n const propertyContext = placeHolderTokens[1];\n const propertyName = placeHolderTokens[2];\n\n if (propertyContext === 'props') {\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n if (this.props[propertyName]) {\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n resolvedSource = resolvedSource.replace(placeHolderToken, this.props[propertyName]);\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n this._debug(`Replaced placeholder ${placeHolderToken} with props property ${this.props[propertyName]}`);\n }\n } else if (this.props.context && this.props.context.request) {\n switch (propertyContext) {\n case 'request':\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n if (this.props.context.request[propertyName]) {\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n resolvedSource = resolvedSource.replace(placeHolderToken, this.props.context.request[propertyName]);\n this._debug(\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n `Replaced placeholder ${placeHolderToken} with request property ${this.props.context.request[propertyName]}`\n );\n }\n\n break;\n case 'user':\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n if (this.props.context.request.user && this.props.context.request.user[propertyName]) {\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n resolvedSource = resolvedSource.replace(placeHolderToken, this.props.context.request.user[propertyName]);\n this._debug(\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n `Replaced placeholder ${placeHolderToken} with user property ${this.props.context.request.user[propertyName]}`\n );\n }\n\n break;\n case 'query':\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n if (this.props.context.request.query && this.props.context.request.query[propertyName]) {\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n resolvedSource = resolvedSource.replace(placeHolderToken, this.props.context.request.query[propertyName]);\n this._debug(\n // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n `Replaced placeholder ${placeHolderToken} with query parameter ${this.props.context.request.query[propertyName]}`\n );\n }\n\n break;\n default:\n }\n }\n\n return resolvedSource;\n }\n}\n\nexport default ScriptInjector;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * KeyCodes Enum.\n */\nexport enum KeyCodes {\n Back = 8,\n Tab = 9,\n Enter = 13,\n Shift = 16,\n Ctrl = 17,\n Alt = 18,\n Break = 19,\n CapsLock = 20,\n Escape = 27,\n Space = 32,\n PageUp = 33,\n PageDown = 34,\n End = 35,\n Home = 36,\n ArrowLeft = 37,\n ArrowUp = 38,\n ArrowRight = 39,\n ArrowDown = 40,\n Print = 44,\n Insert = 45,\n Delete = 46,\n Colon2 = 59, // Opera and Firefox\n Equals2 = 61, // Opera\n Equals3 = 107, // Firefox\n Minus2 = 109, // Opera and Firefox\n Period = 190,\n WindowsLeft = 91,\n WindowsRight = 92,\n WindowsOpera = 219, // Opera\n Menu = 93,\n NumPad0 = 96,\n NumPad1 = 97,\n NumPad2 = 98,\n NumPad3 = 99,\n NumPad4 = 100,\n NumPad5 = 101,\n NumPad6 = 102,\n NumPad7 = 103,\n NumPad8 = 104,\n NumPad9 = 105,\n NumPadMultiply = 106,\n NumPadPlus = 107,\n NumPadMinus = 109,\n NumPadDot = 110,\n NumPadDivide = 111,\n Function1 = 112,\n Function2 = 113,\n Function3 = 114,\n Function4 = 115,\n Function5 = 116,\n Function6 = 117,\n Function7 = 118,\n Function8 = 119,\n Function9 = 120,\n Function10 = 121,\n Function11 = 122,\n Function12 = 123,\n NavigationUp = 138,\n NavigationDown = 139,\n NavigationLeft = 140,\n NavigationRight = 141,\n NavigationAccept = 142,\n NumLock = 144,\n ScrollLock = 145,\n Colon = 186,\n Equals = 187,\n Comma = 188,\n Minus = 189,\n ForwardSlash = 191,\n Tilde = 192,\n GamepadA = 195,\n GamepadB = 196,\n GamepadX = 197,\n GamepadY = 198,\n GamepadRightButton = 199,\n GamepadLeftButton = 200,\n GamepadLeftTrigger = 201,\n GamepadRightTrigger = 202,\n GamepadDPadUp = 203,\n GamepadDPadDown = 204,\n GamepadDPadLeft = 205,\n GamepadDPadRight = 206,\n GamepadSelect = 207,\n GamepadStart = 208,\n GamepadLeftThumbstick = 209,\n GamepadRightThumbstick = 210,\n GamepadLeftThumbstickUp = 211,\n GamepadLeftThumbstickDown = 212,\n GamepadLeftThumbstickRight = 213,\n GamepadLeftThumbstickLeft = 214,\n GamepadRightThumbstickUp = 215,\n GamepadRightThumbstickDown = 216,\n GamepadRightThumbstickRight = 217,\n GamepadRightThumbstickLeft = 218,\n OpenBracket = 219,\n BackSlash = 220,\n CloseBracket = 221,\n Quote = 222\n}\n\n/**\n * Here for test coverage.\n */\nexport class KeycodesClass {\n public testCoverage(): string {\n return ':(';\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Format the passed string.\n * @param formatSpecifier - FormatSpecifier.\n * @param parameters -- Any number of parameters.\n * @returns The formated string.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function format(formatSpecifier: string, ...parameters: any[]): string {\n if (!formatSpecifier) {\n return '';\n }\n\n return formatSpecifier.replace(/{(\\d+)}/g, (match: string, index: number) => {\n if (index >= parameters.length) {\n return match;\n }\n\n const value = parameters[index];\n\n if (typeof value !== 'number' && !value) {\n return '';\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n return value.toString();\n });\n}\n\n/**\n * Determines if the specified string is undefined, null, empty, or whitespace.\n * @param value - The string to examine.\n * @returns - True if the value is undefined, null, empty, or whitespace, otherwise false.\n */\nexport function isNullOrWhiteSpace(value: string): boolean {\n return !value || typeof value !== 'string' || !trim(value);\n}\n\n/**\n * Trims leading and trailing whitespace from the string.\n * @param value - The string to examine.\n * @returns - The trimmed string.\n */\nexport function trim(value: string): string {\n // Any flavor of !value (ie. null/undefined/'') should return itself.\n if (!value || typeof value !== 'string') {\n return value;\n }\n\n if (value.trim) {\n return value.trim();\n }\n\n return value.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determines if the specified string starts with the specified value.\n * @param value - The string to look in.\n * @param prefix - The prefix to look for.\n * @param ignoreCase - Ignore Case.\n * @returns - True if the string starts with the prefix, otherwise false.\n */\nexport function startsWith(value: string, prefix: string, ignoreCase: boolean = true): boolean {\n if (!value || !prefix) {\n return false;\n }\n\n if (ignoreCase) {\n value = value.toLocaleLowerCase();\n prefix = prefix.toLocaleLowerCase();\n }\n\n if (value.startsWith) {\n return value.startsWith(prefix);\n }\n\n return value.startsWith(prefix);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { isNullOrWhiteSpace, trim } from './string-extensions';\n\n/**\n * Get the text of the element.\n * @param element - HTML element.\n * @returns The content of the element.\n */\nexport function getText(element?: HTMLElement | Element): string {\n return element ? element.textContent || '' : '';\n}\n\n/**\n * Add a css class to an element.\n * @param element - The element to add the css class to.\n * @param cssClass - The css class to add.\n */\nexport function addClass(element: HTMLElement, cssClass: string): void {\n if (element && !isNullOrWhiteSpace(cssClass) && !hasClass(element, cssClass)) {\n if (element.classList) {\n element.classList.add(cssClass);\n } else {\n element.className = trim(`${element.className} ${cssClass}`);\n }\n }\n}\n\n/**\n * Checks for the presence of a css class on an element.\n * @param element - The element to check the css class of.\n * @param cssClass - The css class to check for.\n * @returns True if the element's className has the specified class, otherwise false.\n */\nexport function hasClass(element: HTMLElement, cssClass: string): boolean {\n if (!element || isNullOrWhiteSpace(cssClass)) {\n return false;\n } else if (element.classList) {\n return element.classList.contains(cssClass);\n }\n return `' ' ${element.className} ' '`.includes(`' ' ${trim(cssClass)} ' '`);\n}\n\n/**\n * Convert node list to array.\n * @param nodeList - Node List.\n * @returns Array of the node list.\n */\nexport function nodeListToArray<T extends Node>(\n nodeList: NodeListOf<T> | NodeListOf<Element> | HTMLCollection | NodeList | NamedNodeMap\n): T[] {\n if (!nodeList) {\n return [];\n }\n\n const elements: T[] = [];\n\n for (let n = 0; n < nodeList.length; n++) {\n elements.push(<T>nodeList[n]);\n }\n\n return elements;\n}\n\n/**\n * Select elements in a context.\n * @param selector - Can be class, id or tag selector.\n * @param [context] - Any element to scope the selection. It's optional. If not provided document will be assumed.\n * @returns HTMLElement[].\n */\nexport function selectElements(selector: string, context?: HTMLElement): HTMLElement[] {\n return selectElementsT<HTMLElement>(selector, context);\n}\n\n/**\n * Select elements in a context.\n * @param selector - Can be class, id or tag selector.\n * @param [context] - Any element to scope the selection. It's optional. If not provided document will be assumed.\n * @returns T[].\n */\nexport function selectElementsT<T extends HTMLElement>(selector: string, context?: HTMLElement): T[] {\n if (isNullOrWhiteSpace(selector) || selector === '#') {\n return <T[]>[];\n }\n\n const currentContext: HTMLElement | Document = context || document;\n\n // Check if the first character is class or id.\n if (/^[#.]?[\\w-]+$/.test(selector)) {\n // eslint-disable-next-line default-case\n switch (selector[0]) {\n case '.':\n if (currentContext.getElementsByClassName) {\n return nodeListToArray<T>(currentContext.getElementsByClassName(selector.slice(1)));\n }\n return nodeListToArray<T>(currentContext.querySelectorAll(selector));\n\n case '#':\n const element = currentContext.querySelector(selector);\n return <T[]>(element ? [element] : []);\n }\n\n return nodeListToArray<T>(currentContext.getElementsByTagName(selector));\n }\n\n return nodeListToArray<T>(currentContext.querySelectorAll(selector));\n}\n\n/**\n * Sets or gets CSS properties.\n * @param element - HTML Element.\n * @param property - The CSS property name.\n * @param [value] - The value to set on the CSS property.\n * @returns - The value of the CSS property.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function css(element: HTMLElement | Node, property: string, value?: any): any {\n if (!element) {\n return null;\n }\n\n if (value || value === '') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (<any>element).style[property] = value;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value = (<any>element).style[property];\n\n if (isNullOrWhiteSpace(value)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value = getComputedStyle(element as any);\n value = value[property];\n }\n\n return value;\n }\n}\n\n/**\n * Remove all inner HTML from a parent element - used to delete child elements.\n * @param parentElement - The parent element from which all children should be removed.\n */\nexport function removeInnerHtml(parentElement: HTMLElement): void {\n if (parentElement) {\n parentElement.innerHTML = '';\n }\n}\n\n/**\n * Select first element from the selected elements using provided selector.\n * @param selector - Element selector.\n * @param [context] - An optional context to scope the selection.\n * @returns - The first element from the match.\n */\nexport function selectFirstElement(selector: string, context?: HTMLElement): HTMLElement | null {\n const elementsSelected = selectElementsT<HTMLElement>(selector, context);\n return !elementsSelected || !elementsSelected.length ? null : elementsSelected[0];\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare let window: any;\n\n/**\n * @name - XDomainRequest\n * @description - typescript declaration for XDomainRequest object.\n * @type {object}\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare let XDomainRequest: any;\n\n/**\n * PlayerUtilities class.\n * @classdesc - The PlayerOptions class is used to pass player options settings to the player.\n * It supplies default values which can be overridden via overrides passed to the constructor.\n */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class PlayerUtility {\n /**\n * @name - pendingAjaxRequests\n * @description - array to hold pending ajax requests.\n * @private\n * @static\n * @returns {any}\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static readonly pendingAjaxRequests: any = [];\n\n /**\n * Gets request data using ajax call.\n * @param url - Url from where to fetch data.\n * @param done - On success callback function.\n * @param failed - On failed callback function.\n */\n public static ajax(url: string, done: Function, failed?: Function): void {\n if (!url) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let ajaxRequest: any = null;\n\n // For IE 9 and below use XDomainRequest\n if (window.XDomainRequest) {\n ajaxRequest = new XDomainRequest();\n\n ajaxRequest.addEventListener('load', () => {\n done && done(ajaxRequest.responseText);\n PlayerUtility._removeFromPendingAjaxRequests(ajaxRequest);\n });\n\n // IE8 and IE9 have a bug where garbage collector will clear XDomainRequest object\n // before the call is completed. Thus add a reference to the object so that request\n // is not aborted by garbage collector.\n PlayerUtility.pendingAjaxRequests.push(ajaxRequest);\n } else if (window.XMLHttpRequest) {\n ajaxRequest = new XMLHttpRequest();\n\n ajaxRequest.onreadystatechange = () => {\n if (ajaxRequest.readyState === 4) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any = null;\n if (ajaxRequest.status === 200) {\n result = ajaxRequest.responseText;\n }\n done && done(result);\n } else {\n // The following console.log useful for debugging and is left in commented out for easy restoration.\n // console.log('Localization-helper: readystate(' + xhttp.readyState + ') status(' + xhttp.status + ')');\n }\n };\n }\n\n // Attach common event handlers and make the request.\n if (ajaxRequest) {\n ajaxRequest.ontimeout = ajaxRequest.addEventListener('error', () => {\n PlayerUtility._removeFromPendingAjaxRequests(ajaxRequest);\n failed && failed();\n });\n ajaxRequest.open('GET', url, true);\n ajaxRequest.send();\n }\n }\n\n /**\n * Removes object from array to hold pending ajax requests.\n * @param obj - Object.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _removeFromPendingAjaxRequests(obj: any): void {\n // When the call is completed remove it from the array\n let index = -1;\n for (let i = 0; i < PlayerUtility.pendingAjaxRequests.length; i++) {\n if (obj === PlayerUtility.pendingAjaxRequests[i]) {\n index = i;\n break;\n }\n }\n if (index >= 0) {\n PlayerUtility.pendingAjaxRequests.splice(index, 1);\n }\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Client Dimension Interface.\n */\nexport interface IClientDimension {\n width: number;\n height: number;\n}\n\n/**\n * Dictionary String Interface.\n */\nexport interface IDictionaryStringString {\n [key: string]: string;\n}\n\n/**\n * @interface IGrid\n * @classdesc - The IGrid interface contract.\n */\nexport interface IGrid {\n rows: number;\n columns: number;\n}\n\n/**\n * Clamp position between a range.\n * @param value - Value to be clamped.\n * @param min - Minimum value in range.\n * @param max - Maximum value in range.\n * @returns The clap value if min passed is less than max else returns 0.\n */\nexport function clamp(value: number, min: number, max: number): number {\n if (min <= max) {\n return Math.min(Math.max(value, min), max);\n }\n return 0;\n}\n\n/**\n * Upper case the first letter of the string, if only one char exists on the string, uppercase it.\n * @param value - Value to be upper cased.\n * @returns The upper cased string of the passed value, if it has just one char uppercase it.\n */\nexport function toUpperCaseFirstChar(value: string): string {\n if (value.length > 1) {\n return value.charAt(0).toUpperCase() + value.substr(1);\n }\n if (value.length === 1) {\n return value.charAt(0).toUpperCase();\n }\n return '';\n}\n\n/**\n * HTML collectio to Array.\n * @param nodeList - Html Collection.\n * @returns - An array of the HTML Element.\n */\nexport function htmlCollectionToArray(nodeList: HTMLCollection): HTMLElement[] {\n return Array.prototype.slice.call(nodeList);\n}\n\n/**\n * Get CSS for the Element.\n * @param element - The HTML Element.\n * @param property - The HTML property.\n * @returns - The value of the required property.\n */\nexport function getCSS(element: HTMLElement, property: string): string {\n let style = element.style[property];\n\n if (!style) {\n style = getComputedStyle(element)[property];\n }\n\n return style;\n}\n\n/**\n * Create Throttled Event.\n * @param listener - The Event Listener.\n * @param threshold - The threshold number.\n * @returns The event.\n */\nexport function createThrottledEvent(listener: EventListener, threshold: number): (event: Event) => void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let timer: any;\n let last = 0;\n\n return (event: Event) => {\n const now = Date.now();\n\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n\n if (last && now < last + threshold) {\n timer = setTimeout(() => {\n last = Date.now();\n listener(event);\n }, threshold - (now - last));\n } else {\n last = now;\n listener(event);\n }\n };\n}\n\n/**\n * Add the Throrrled Event.\n * @param target - Event Targer.\n * @param name - Name of the Event.\n * @param listener - The Event Listener.\n * @param threshold - The Threshold number.\n * @returns - Returns the Throttled Event.\n */\nexport function addThrottledEvent(\n target: EventTarget,\n name: string,\n listener: EventListener,\n threshold: number = 150\n): (event: Event) => void {\n const throttledEventHandler = createThrottledEvent(listener, threshold);\n target.addEventListener(name, throttledEventHandler, false);\n\n return throttledEventHandler;\n}\n\n/**\n * Map the CSS to the modules.\n * @param className - Class name.\n * @param cssModule - CSS modules.\n * @returns - Returns the map CSS.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function mapToCssModules(className: string = '', cssModule: any): string {\n if (!cssModule) {\n return className;\n }\n\n return className\n .split(' ')\n .map((c: string) => cssModule[c] || c)\n .join(' ');\n}\n\n/**\n * Check the raget object is reference.\n * @param target - Target object.\n * @returns Returns boolean.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isRef(target: any): boolean {\n if (!target) {\n return false;\n }\n\n return (<React.RefObject<HTMLElement>>target).current !== undefined;\n}\n\n/**\n * Check if the passed target is element.\n * @param target - Target element.\n * @returns Returns boolean.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isElement(target: any): boolean {\n if (!target) {\n return false;\n }\n\n return (<HTMLElement>target).addEventListener !== undefined;\n}\n\n/**\n * KeyCodes Enum.\n */\nexport const keyCodes = {\n esc: 27,\n space: 32,\n tab: 9,\n up: 38,\n down: 40,\n enter: 13\n};\n\n/**\n * Map Interface.\n */\ninterface IMap<T> {\n [key: string]: T;\n}\nconst warned: IMap<boolean> = {};\n\n/**\n * Warn once.\n * @param message - Message to warned.\n */\nexport function warnOnce(message: string): void {\n if (!warned[message]) {\n if (typeof console !== 'undefined') {\n throw new Error(message);\n }\n warned[message] = true;\n }\n}\n\n/**\n * Can use DOM..\n */\nexport const canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\n/**\n * Find the required DOM element.\n * @param target - Targert Dom Element.\n * @returns - The DOM Element or string or null.\n */\nexport function findDOMElements(target: string): NodeListOf<Element> | string | null {\n try {\n if (typeof target === 'string' && canUseDOM) {\n let selection = document.querySelectorAll(target);\n\n if (!selection.length) {\n selection = document.querySelectorAll(`#${target}`);\n }\n\n if (!selection.length) {\n throw new Error();\n }\n return selection;\n }\n\n return target;\n } catch {\n console.error(`The target '${target}' could not be identified in the dom, tip: check spelling`);\n return null;\n }\n}\n\n/**\n * Get the Target element.\n * @param target - Target Element.\n * @returns - Returns the HTMLElement or null or string.\n */\nexport function getTarget(target: string | HTMLElement | React.Ref<HTMLElement>): HTMLElement | React.Ref<HTMLElement> | null | string {\n const selection = findDOMElements(<string>target);\n if (selection && selection.length) {\n return <HTMLElement>selection[0];\n }\n\n return target;\n}\n\n/**\n * Get the Target element.\n * @param target - Target Element.\n * @returns - Returns the HTMLElement or null or string.\n */\nexport function getTargetElement(target: string | HTMLElement | React.Ref<HTMLElement>): HTMLElement | null {\n const targetElement = getTarget(target);\n if (isRef(targetElement)) {\n return (<React.RefObject<HTMLElement>>targetElement).current;\n }\n if (isElement(targetElement)) {\n return <HTMLElement>targetElement;\n }\n\n return null;\n}\n\n/**\n * Transition Timeouts.\n */\nexport const TransitionTimeouts = {\n Fade: 150,\n Collapse: 350,\n Modal: 300,\n Carousel: 600\n};\n\n/**\n * Transition Statuses.\n */\nexport type TransitionStatuses = 'entering' | 'entered' | 'exiting' | 'exited';\n\n/**\n * Focusable Elements.\n */\nexport const focusableElements = [\n 'a[href]',\n 'area[href]',\n 'input:not([disabled]):not([type=hidden])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'iframe',\n 'object',\n 'embed',\n '[tabindex]:not(.modal)',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])'\n];\n\n/**\n * Extends an object with properties/values from one or more others.\n * @param parameters - The objects to merge together.\n * @returns - The extended object.\n */\n// eslint-disable-next-line complexity, @typescript-eslint/no-explicit-any\nexport function extend(...parameters: any[]): any {\n if (!parameters || !parameters.length) {\n return null;\n }\n\n const recursive = typeof parameters[0] === 'boolean' && parameters[0];\n\n if (parameters.length < 2) {\n return recursive ? null : parameters[0];\n }\n\n if (recursive && parameters.length < 3) {\n return parameters[1];\n }\n\n const target = recursive ? parameters[1] : parameters[0];\n\n for (let paramIndex = recursive ? 2 : 1; paramIndex < parameters.length; paramIndex++) {\n if (parameters[paramIndex] !== undefined) {\n for (const key of Object.keys(parameters[paramIndex])) {\n if (parameters[paramIndex].hasOwnProperty(key)) {\n const source = parameters[paramIndex][key];\n\n if (recursive) {\n let isSourceArray = Array.isArray ? Array.isArray(source) : {}.toString.call(source) === '[object Array]';\n let isTargetArray =\n !!target[key] &&\n (Array.isArray ? Array.isArray(target[key]) : {}.toString.call(target[key]) === '[object Array]');\n let isSourceObject = !isSourceArray && typeof source === 'object';\n let isTargetObject = !isTargetArray && !!target[key] && typeof target[key] === 'object';\n\n if (isSourceArray && isTargetArray) {\n for (const [arrayIndex, element] of source.entries()) {\n isSourceArray = Array.isArray ? Array.isArray(element) : {}.toString.call(element) === '[object Array]';\n isTargetArray =\n !!target[key][arrayIndex] &&\n (Array.isArray\n ? Array.isArray(target[key][arrayIndex])\n : {}.toString.call(target[key][arrayIndex]) === '[object Array]');\n isSourceObject = !isSourceArray && typeof element === 'object';\n isTargetObject = !isTargetArray && !!target[key][arrayIndex] && typeof target[key][arrayIndex] === 'object';\n\n if (isSourceArray) {\n target[key][arrayIndex] = extend(true, isTargetArray ? target[key][arrayIndex] : [], element);\n } else if (isSourceObject) {\n target[key][arrayIndex] = extend(true, isTargetObject ? target[key][arrayIndex] : {}, element);\n } else {\n target[key][arrayIndex] = element;\n }\n }\n continue;\n } else if (isSourceArray) {\n target[key] = extend(true, [], source);\n continue;\n } else if (isSourceObject) {\n target[key] = extend(true, isTargetObject ? target[key] : {}, source);\n continue;\n }\n }\n\n target[key] = source;\n }\n }\n }\n }\n\n return target;\n}\n\n/**\n * Gets the dimension of an element.\n * @param containerElement - The container element.\n * @returns - {IClientDimension} - The client dimension.\n * {IClientDimension.width} - The client width.\n * {IClientDimension.height} - The client height.\n */\nexport function getDimensions(containerElement: HTMLElement): IClientDimension | null {\n if (containerElement === null) {\n return null;\n }\n return {\n width: containerElement.clientWidth,\n height: containerElement.clientHeight\n };\n}\n\n/**\n * Check if the browser is Safari or not.\n * @returns Ture or false.\n */\nexport function isSafari(): boolean {\n if (navigator.vendor && navigator.userAgent) {\n return navigator.vendor.includes('Apple') && !navigator.userAgent.includes('CriOS') && !navigator.userAgent.includes('FxiOS');\n }\n return false;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductType, SalesAgreementPriceLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { Button, format, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nconst defaultPrice: number = 0;\nconst freePrice: number = 0;\n\n/**\n * Interface for price component resources.\n * @param {string} priceRangeSeparator - The price range separator.\n */\nexport interface IPriceComponentResources {\n priceRangeSeparator?: string;\n salesAgreementPricePrompt?: string;\n salesAgreementExpirationDatePrompt?: string;\n salesAgreementCommittedQuantityPrompt?: string;\n salesAgreementRemainingQuantityPrompt?: string;\n}\n\n/**\n * Interface for price component props.\n * @param {boolean} isPriceMinMaxEnabled - Whether the price range feature is enabled or not.\n * @param {IPriceComponentResources} priceResources - The price range resources.\n */\nexport interface IPriceComponentProps extends IComponentProps<{ price: ProductPrice }> {\n className?: string;\n product?: SimpleProduct;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n isPriceMinMaxEnabled?: boolean;\n isSalesAgreementPriceFeatureEnabled?: boolean;\n salesAgreementLineId?: number;\n priceResources?: IPriceComponentResources;\n salesAgreementDetailCollapseProps?: ICollapseProps;\n currencyCode?: string;\n salesAgreementDetailOnClick?(event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): void;\n}\n\n/**\n * The interface of price component.\n */\nexport interface IPriceComponent extends IComponent<IPriceComponentProps> {}\n\nconst priceComponentActions = {};\n\n/**\n * Get the original price from price component props.\n * @param props - The IPriceComponentProps.\n * @returns The original price.\n */\nconst getOriginalPrice = (props: IPriceComponentProps): number => {\n return props.data.price.AdjustedPrice ?? props.data.price.TradeAgreementPrice ?? props.data.price.BasePrice ?? defaultPrice;\n};\n\nconst getActivePrice = (props: IPriceComponentProps): number => {\n if (showPriceRangeForMasterProduct(props) && props.data.price.MinVariantPrice !== undefined) {\n return props.data.price.MinVariantPrice;\n }\n\n if (props.data.price.CustomerContextualPrice !== undefined) {\n return props.data.price.CustomerContextualPrice;\n }\n\n return getOriginalPrice(props);\n};\n\n/**\n * Get the formatted currency.\n * @param props - The props.\n * @param price - The price.\n * @param shouldUseFreePriceText - The shouldUseFreePriceText.\n * @returns The formatted currency.\n */\nconst formatCurrency = (\n props: IPriceComponentProps,\n price: number | undefined,\n shouldUseFreePriceText: boolean | undefined,\n currencyCode?: string | undefined\n): string => {\n if (price === undefined) {\n return '';\n }\n\n if (shouldUseFreePriceText && price === freePrice && props.freePriceText) {\n return props.freePriceText;\n }\n\n return props.context.cultureFormatter.formatCurrency(price, currencyCode);\n};\n\nconst showPriceRangeForMasterProduct = (props: IPriceComponentProps): boolean => {\n return (\n (props.isPriceMinMaxEnabled ?? false) &&\n (props.product?.ProductTypeValue === ProductType.Master || props.product?.ProductTypeValue === ProductType.KitMaster) &&\n props.data.price.MinVariantPrice !== undefined &&\n props.data.price.MaxVariantPrice !== undefined\n );\n};\n\n/**\n * ShowStrikethroughPricing.\n * @param props - The props.\n * @returns True if showStrikethroughPricing, false otherwise.\n */\nconst showStrikethroughPricing = (props: IPriceComponentProps): boolean => {\n const originalSalesPrice = getOriginalPrice(props);\n const activeSalesPrice = showPriceRangeForMasterProduct(props)\n ? props.data.price.MinVariantPrice\n : props.data.price.CustomerContextualPrice;\n\n if (activeSalesPrice && originalSalesPrice) {\n return activeSalesPrice < originalSalesPrice;\n }\n\n return false;\n};\n\n/**\n * Render current price.\n * @param props - The props.\n * @returns The JSX.Element.\n */\nconst renderCurrentPrice = (props: IPriceComponentProps): JSX.Element => {\n const maxVariantPrice: string = formatCurrency(props, props.data.price.MaxVariantPrice, false, props.currencyCode);\n const minVariantPrice: string = formatCurrency(props, props.data.price.MinVariantPrice, false, props.currencyCode);\n if (\n props.isPriceMinMaxEnabled &&\n props.data.price.MaxVariantPrice &&\n props.data.price.MinVariantPrice &&\n props.data.price.MaxVariantPrice > props.data.price.MinVariantPrice\n ) {\n return (\n <span className='msc-price__pricerange' itemProp='price'>\n <span className='msc-price__minprice' itemProp='price'>\n {minVariantPrice}\n </span>\n <span className='msc-price__separator' itemProp='price'>\n {props.priceResources?.priceRangeSeparator}\n </span>\n <span className='msc-price__maxprice' itemProp='price'>\n {maxVariantPrice}\n </span>\n </span>\n );\n }\n\n return (\n <span className='msc-price__actual' itemProp='price'>\n {formatCurrency(props, getActivePrice(props), true, props.currencyCode)}\n </span>\n );\n};\n\n/**\n * Render active sales price with original sales price.\n * @param props - The props.\n * @returns The JSX.Element.\n */\nconst renderCurrentPriceWithOriginalPrice = (props: IPriceComponentProps): JSX.Element => {\n const initialPrice: string = formatCurrency(props, getOriginalPrice(props), true);\n\n return (\n <>\n <span className='sr-only'>\n {` `}\n {props.originalPriceText}\n {` `}\n {initialPrice}\n {` `}\n {props.currentPriceText}\n {` `}\n {renderCurrentPrice(props)}\n </span>\n <span className='msc-price__strikethrough' aria-hidden='true'>\n {initialPrice}\n {` `}\n </span>\n <span aria-hidden='true'>{renderCurrentPrice(props)}</span>\n {props.savingsText && <span className='msc-price__savings'>{props.savingsText}</span>}\n </>\n );\n};\n\nconst renderSalesAgreementDetail = (props: IPriceComponentProps): JSX.Element => {\n // In most cases there should be only one sales agreement line.\n // If there are more than one, only the first one will be shown.\n const firstPriceLine: SalesAgreementPriceLine = (props.data.price.AttainablePriceLines ?? [])[0] as SalesAgreementPriceLine;\n return (\n <p className={classnames('msc-price__salesagreementdetail', props.className)}>\n <p>\n {/* Available date */}\n {` · ${format(\n props.priceResources?.salesAgreementExpirationDatePrompt ?? '',\n props.context.cultureFormatter.formatDate(firstPriceLine.EffectiveDate as Date),\n props.context.cultureFormatter.formatDate(firstPriceLine.ExpirationDate as Date)\n )}`}\n </p>\n <p>\n {/* Quantity commitment */}\n {` · ${format(props.priceResources?.salesAgreementCommittedQuantityPrompt ?? '', firstPriceLine.CommittedQuantity)}`}\n </p>\n <p>\n {/* Remaining quantity to qualify */}\n {` · ${format(props.priceResources?.salesAgreementRemainingQuantityPrompt ?? '', firstPriceLine.RemainingQuantity)}`}\n </p>\n </p>\n );\n};\n\n/**\n * Price.\n * @param props - The props.\n * @returns The JSX.Element.\n */\nconst Price: React.FC<IPriceComponentProps> = (props: IPriceComponentProps): JSX.Element | null => {\n // CustomerContextualPrice could be zero\n if (props.data.price.CustomerContextualPrice === undefined) {\n return null;\n }\n\n // Determine if contract price is avaiable/applied by:\n // isFeatureEnabled and SA price != 0, for PDP.\n // SA line id != 0, for cart line.\n if (props.isSalesAgreementPriceFeatureEnabled && props.data.price.SalesAgreementPrice !== 0) {\n const [isExpanded, setIsExpanded] = React.useState<boolean>(false);\n const toggle = () => {\n setIsExpanded(!isExpanded);\n };\n return (\n <span className={classnames('msc-price', props.className)}>\n <span className={classnames('msc-price__salesagreementprice', props.className)}>\n <p className='msc-price__actual' itemProp='price'>\n {formatCurrency(props, props.data.price.SalesAgreementPrice ?? props.data.price.CustomerContextualPrice, true)}\n </p>\n <Button\n className={isExpanded ? 'msc-price__salesagreementprompt_expanded' : 'msc-price__salesagreementprompt_collapsed'}\n aria-label={props.priceResources?.salesAgreementPricePrompt}\n onClick={toggle}\n aria-expanded={isExpanded}\n tabIndex={0}\n >\n {props.priceResources?.salesAgreementPricePrompt}\n </Button>\n {isExpanded && renderSalesAgreementDetail(props)}\n </span>\n </span>\n );\n }\n\n return (\n <span className={classnames('msc-price', props.className)}>\n {showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)}\n </span>\n );\n};\n\n/**\n * The PriceComponent.\n */\nexport const PriceComponent: React.FunctionComponent<IPriceComponentProps> = msdyn365Commerce.createComponent<IPriceComponent>('Price', {\n component: Price,\n ...priceComponentActions\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nexport interface IOrderTemplateProductsPreviewComponentProps {\n className: string;\n products: FullProduct[];\n context: ICoreContext;\n imageSettings?: IImageSettings;\n}\n\nexport const OrderTemplateProductsPreviewComponent = (props: IOrderTemplateProductsPreviewComponentProps) => {\n const { products, className, imageSettings } = props;\n\n return (\n <div className={`${className}__products`}>\n {renderOrderTemplateImages(props.context, `${className}__products`, products, imageSettings)}\n </div>\n );\n};\n\nconst renderOrderTemplateImage = (context: ICoreContext, className: string, product: FullProduct, imageSettings?: IImageSettings) => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n return (\n <div className={`${className}__image-props`}>\n <Image\n requestContext={context.actionContext.requestContext}\n src={product.ProductDetails.PrimaryImageUrl ?? ''}\n fallBackSrc={\n getFallbackImageUrl(\n product.ProductDetails.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n ) ?? ''\n }\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n altText={product.ProductDetails.Name ?? 'image'}\n />\n </div>\n );\n};\n\nconst renderOrderTemplateImages = (\n context: ICoreContext,\n className: string,\n products: FullProduct[],\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n return (\n <div className={`${className}__image-container`}>\n <div className='row'>\n <div className='column'>\n {products.length > 0 && renderOrderTemplateImage(context, className, products[0], imageSettings)}\n </div>\n <div className='column'>\n {products.length > 1 && renderOrderTemplateImage(context, className, products[1], imageSettings)}\n </div>\n </div>\n <div className='row'>\n <div className='column'>\n {products.length > 2 && renderOrderTemplateImage(context, className, products[2], imageSettings)}\n </div>\n <div className='column'>\n {products.length > 3 && renderOrderTemplateImage(context, className, products[3], imageSettings)}\n </div>\n </div>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPlayerResources } from '../data';\nimport { IDictionaryStringString } from '../utilities';\n\n/**\n * @name - ccCultureLocStrings\n * @description - The localized names for the close caption menu options.\n * @constant\n * @type {IDictionaryStringString}\n */\nexport const ccCultureLocStrings: IDictionaryStringString = {\n 'ar-ab': 'عربي',\n 'ar-xm': 'عربي',\n 'ar-ma': 'عربي',\n 'ar-sa': 'عربي',\n 'eu-es': 'Euskara',\n 'bg-bg': 'БългарÑки',\n 'ca-es': 'Català ',\n 'zh-cn': '简体ä¸æ–‡',\n 'zh-hk': 'ç¹é«”ä¸æ–‡',\n 'zh-tw': 'ç¹é«”ä¸æ–‡',\n 'hr-hr': 'Hrvatski',\n 'cs-cz': 'ÄŒeÅ¡tina',\n 'da-dk': 'Dansk',\n 'nl-be': 'Nederlands',\n 'nl-nl': 'Nederlands',\n 'en-ab': 'English',\n 'en-aa': 'English',\n 'en-au': 'English',\n 'en-ca': 'English',\n 'en-eu': 'English',\n 'en-hk': 'English',\n 'en-in': 'English',\n 'en-id': 'English',\n 'en-ie': 'English',\n 'en-jm': 'English',\n 'en-my': 'English',\n 'en-nz': 'English',\n 'en-pk': 'English',\n 'en-ph': 'English',\n 'en-sg': 'English',\n 'en-za': 'English',\n 'en-tt': 'English',\n 'en-gb': 'English',\n 'en-us': 'English',\n 'et-ee': 'Eesti',\n 'fi-fi': 'Suomi',\n 'fr-ab': 'Français',\n 'fr-be': 'Français',\n 'fr-ca': 'Français',\n 'fr-fr': 'Français',\n 'fr-xf': 'Français',\n 'fr-ch': 'Français',\n 'gl-es': 'Galego',\n 'de-de': 'Deutsch',\n 'de-at': 'Deutsch',\n 'de-ch': 'Deutsch',\n 'el-gr': 'Ελληνικά',\n 'he-il': 'עברית',\n 'hi-in': 'हिंदी',\n 'hu-hu': 'Magyar',\n 'is-is': 'Ãslenska',\n 'id-id': 'Bahasa Indonesia',\n 'it-it': 'Italiano',\n 'ja-jp': '日本語',\n 'kk-kz': 'Қазақ',\n 'ko-kr': 'í•œêµì–´',\n 'lv-lv': 'LatvieÅ¡u',\n 'lt-lt': 'Lietuvių',\n 'ms-my': 'Bahasa Melayu (Asia Tenggara)‎',\n 'nb-no': 'Norsk (bokmÃ¥l)',\n 'nn-no': 'Norsk (nynorsk)',\n 'fa-ir': 'Ùارسی',\n 'pl-pl': 'Polski',\n 'pt-br': 'Português (Brasil)‎',\n 'pt-pt': 'Português (Portugal)‎',\n 'ro-ro': 'Română',\n 'ru-ru': 'РуÑÑкий',\n 'sr-latn-rs': 'Srpski',\n 'sk-sk': 'SlovenÄina',\n 'sl-si': 'Slovenski',\n 'es-ar': 'Español',\n 'es-cl': 'Español',\n 'es-co': 'Español',\n 'es-cr': 'Español',\n 'es-do': 'Español',\n 'es-ec': 'Español',\n 'es-us': 'Español',\n 'es-gt': 'Español',\n 'es-hn': 'Español',\n 'es-xl': 'Español',\n 'es-mx': 'Español',\n 'es-ni': 'Español',\n 'es-pa': 'Español',\n 'es-py': 'Español',\n 'es-pe': 'Español',\n 'es-pr': 'Español',\n 'es-es': 'Español',\n 'es-uy': 'Español',\n 'es-ve': 'Español',\n 'sv-se': 'Svenska',\n 'tl-ph': 'Tagalog',\n 'th-th': 'ไทย',\n 'tr-tr': 'Türkçe',\n 'uk-ua': 'УкраїнÑька',\n 'ur-pk': 'اردو',\n 'vi-vn': 'Tiếng Việt'\n};\n\n/**\n * @name - ccLanguageCodes\n * @description - The 2 character language codes for use with the lang attribute .\n * @constant\n * @type {IDictionaryStringString}\n */\nexport const ccLanguageCodes: IDictionaryStringString = {\n 'ar-ab': 'ar',\n 'ar-xm': 'ar',\n 'ar-ma': 'ar',\n 'ar-sa': 'ar',\n 'eu-es': 'eu',\n 'bg-bg': 'bg',\n 'ca-es': 'ca',\n 'zh-cn': 'zh',\n 'zh-hk': 'zh',\n 'zh-tw': 'zh',\n 'hr-hr': 'hr',\n 'cs-cz': 'cs',\n 'da-dk': 'da',\n 'nl-be': 'nl',\n 'nl-nl': 'nl',\n 'en-ab': 'en',\n 'en-aa': 'en',\n 'en-au': 'en',\n 'en-ca': 'en',\n 'en-eu': 'en',\n 'en-hk': 'en',\n 'en-in': 'en',\n 'en-id': 'en',\n 'en-ie': 'en',\n 'en-jm': 'en',\n 'en-my': 'en',\n 'en-nz': 'en',\n 'en-pk': 'en',\n 'en-ph': 'en',\n 'en-sg': 'en',\n 'en-za': 'en',\n 'en-tt': 'en',\n 'en-gb': 'en',\n 'en-us': 'en',\n 'et-ee': 'et',\n 'fi-fi': 'fi',\n 'fr-ab': 'fr',\n 'fr-be': 'fr',\n 'fr-ca': 'fr',\n 'fr-fr': 'fr',\n 'fr-xf': 'fr',\n 'fr-ch': 'fr',\n 'gl-es': 'gl',\n 'de-de': 'de',\n 'de-at': 'de',\n 'de-ch': 'de',\n 'el-gr': 'el',\n 'he-il': 'he',\n 'hi-in': 'hi',\n 'hu-hu': 'hu',\n 'is-is': 'is',\n 'id-id': 'id',\n 'it-it': 'it',\n 'ja-jp': 'ja',\n 'kk-kz': 'kk',\n 'ko-kr': 'ko',\n 'lv-lv': 'lv',\n 'lt-lt': 'lt',\n 'ms-my': 'ms‎',\n 'nb-no': 'nb',\n 'nn-no': 'nn',\n 'fa-ir': 'fa',\n 'pl-pl': 'pl',\n 'pt-br': 'pt‎',\n 'pt-pt': 'pt‎',\n 'ro-ro': 'ro',\n 'ru-ru': 'ru',\n 'sr-latn-rs': 'sr',\n 'sk-sk': 'sk',\n 'sl-si': 'sl',\n 'es-ar': 'es',\n 'es-cl': 'es',\n 'es-co': 'es',\n 'es-cr': 'es',\n 'es-do': 'es',\n 'es-ec': 'es',\n 'es-us': 'es',\n 'es-gt': 'es',\n 'es-hn': 'es',\n 'es-xl': 'es',\n 'es-mx': 'es',\n 'es-ni': 'es',\n 'es-pa': 'es',\n 'es-py': 'es',\n 'es-pe': 'es',\n 'es-pr': 'es',\n 'es-es': 'es',\n 'es-uy': 'es',\n 'es-ve': 'es',\n 'sv-se': 'sv',\n 'tl-ph': 'tl',\n 'th-th': 'th',\n 'tr-tr': 'tr',\n 'uk-ua': 'uk',\n 'ur-pk': 'ur',\n 'vi-vn': 'vi'\n};\n\n/**\n * @name - playerLocKeys\n * @description - Key names to get localized values.\n * @constant\n */\nexport const PlayerLocKeys = {\n audio_tracks: 'audio_tracks',\n closecaption_off: 'closecaption_off',\n audio_tracks_default: 'audio_tracks_default',\n geolocation_error: 'geolocation_error',\n media_err_aborted: 'media_err_aborted',\n media_err_decode: 'media_err_decode',\n media_err_network: 'media_err_network',\n media_err_src_not_supported: 'media_err_src_not_supported',\n media_err_unknown_error: 'media_err_unknown_error',\n media_err_amp_encrypt: 'media_err_amp_encrypt',\n media_err_amp_player_mismatch: 'media_err_amp_player_mismatch',\n browserunsupported: 'browserunsupported',\n browserunsupported_download: 'browserunsupported_download',\n expand: 'expand',\n mute: 'mute',\n nullvideoerror: 'nullvideoerror',\n pause: 'pause',\n play: 'play',\n play_video: 'play_video',\n playing: 'playing',\n paused: 'paused',\n play_pause_button_tooltip: 'play_pause_button_tooltip',\n live_caption: 'live_caption',\n live_label: 'live_label',\n playbackerror: 'playbackerror',\n standarderror: 'standarderror',\n time: 'time',\n more_caption: 'more_caption',\n data_error: 'data_error',\n seek: 'seek',\n unexpand: 'unexpand',\n unmute: 'unmute',\n volume: 'volume',\n quality: 'quality',\n quality_hd: 'quality_hd',\n quality_hq: 'quality_hq',\n quality_lo: 'quality_lo',\n quality_sd: 'quality_sd',\n quality_auto: 'quality_auto',\n cc_customize: 'cc_customize',\n cc_text_font: 'cc_text_font',\n cc_text_color: 'cc_text_color',\n cc_color_black: 'cc_color_black',\n cc_color_blue: 'cc_color_blue',\n cc_color_cyan: 'cc_color_cyan',\n cc_color_green: 'cc_color_green',\n cc_color_grey: 'cc_color_grey',\n cc_color_magenta: 'cc_color_magenta',\n cc_color_red: 'cc_color_red',\n cc_color_white: 'cc_color_white',\n cc_color_yellow: 'cc_color_yellow',\n cc_font_name_casual: 'cc_font_name_casual',\n cc_font_name_cursive: 'cc_font_name_cursive',\n cc_font_name_monospacedsansserif: 'cc_font_name_monospacedsansserif',\n cc_font_name_proportionalsansserif: 'cc_font_name_proportionalsansserif',\n cc_font_name_monospacedserif: 'cc_font_name_monospacedserif',\n cc_font_name_proportionalserif: 'cc_font_name_proportionalserif',\n cc_font_name_smallcapitals: 'cc_font_name_smallcapitals',\n cc_text_size: 'cc_text_size',\n cc_text_size_default: 'cc_text_size_default',\n cc_text_size_extralarge: 'cc_text_size_extralarge',\n cc_text_size_large: 'cc_text_size_large',\n cc_text_size_maximum: 'cc_text_size_maximum',\n cc_text_size_small: 'cc_text_size_small',\n cc_appearance: 'cc_appearance',\n cc_preset1: 'cc_preset1',\n cc_preset2: 'cc_preset2',\n cc_preset3: 'cc_preset3',\n cc_preset4: 'cc_preset4',\n cc_preset5: 'cc_preset5',\n cc_presettings: 'cc_presettings',\n cc_text_background_color: 'cc_text_background_color',\n cc_text_background_opacity: 'cc_text_background_opacity',\n cc_text_opacity: 'cc_text_opacity',\n cc_percent_0: 'cc_percent_0',\n cc_percent_100: 'cc_percent_100',\n cc_percent_25: 'cc_percent_25',\n cc_percent_50: 'cc_percent_50',\n cc_percent_75: 'cc_percent_75',\n cc_text_edge_color: 'cc_text_edge_color',\n cc_text_edge_style: 'cc_text_edge_style',\n cc_text_edge_style_depressed: 'cc_text_edge_style_depressed',\n cc_text_edge_style_dropshadow: 'cc_text_edge_style_dropshadow',\n cc_text_edge_style_none: 'cc_text_edge_style_none',\n cc_text_edge_style_raised: 'cc_text_edge_style_raised',\n cc_text_edge_style_uniform: 'cc_text_edge_style_uniform',\n cc_window_color: 'cc_window_color',\n cc_window_opacity: 'cc_window_opacity',\n cc_reset: 'cc_reset',\n closecaption: 'closecaption',\n close_text: 'close_text',\n playbackspeed: 'playbackspeed',\n playbackspeed_normal: 'playbackspeed_normal',\n sharing_label: 'sharing_label',\n sharing_facebook: 'sharing_facebook',\n sharing_twitter: 'sharing_twitter',\n sharing_linkedin: 'sharing_linkedin',\n sharing_skype: 'sharing_skype',\n sharing_mail: 'sharing_mail',\n sharing_copy: 'sharing_copy',\n loading_value_text: 'loading_value_text',\n loading_aria_label: 'loading_aria_label',\n descriptive_audio: 'descriptive_audio',\n unknown_language: 'unknown_language',\n download_label: 'download_label',\n download_transcript: 'download_transcript',\n download_audio: 'download_audio',\n download_video: 'download_video',\n download_videoWithCC: 'download_videoWithCC',\n agegate_day: 'agegate_day',\n agegate_month: 'agegate_month',\n agegate_year: 'agegate_year',\n agegate_enterdate: 'agegate_enterdate',\n agegate_enterdate_arialabel: 'agegate_enterdate_arialabel',\n agegate_fail: 'agegate_fail',\n agegate_verifyyourage: 'agegate_verifyyourage',\n agegate_submit: 'agegate_submit',\n agegate_dateorder: 'agegate_dateorder',\n previous_menu_aria_label: 'previous_menu_aria_label',\n reactive_menu_aria_label: 'reactive_menu_aria_label',\n reactive_menu_aria_label_closedcaption: 'reactive_menu_aria_label_closedcaption',\n interactivity_show: 'interactivity_show',\n interactivity_hide: 'interactivity_hide'\n};\n\n/**\n * Localization Constants.\n */\nexport const LocalizationConstants = {\n playVideoAriaLabel: 'play video',\n playAriaLabel: 'play',\n pauseAriaLabel: 'pause',\n closeAriaLabel: 'close',\n optionAriaLabel: 'More options',\n muteAriaLabel: 'mute',\n unMuteAriaLabel: 'unmute',\n fullScreenAriaLabel: 'full screen',\n exitFullScreenAriaLabel: 'exit full screen',\n playingAriaLabel: 'paying',\n pausedAriaLabel: 'paused',\n seekBarLabel: 'Seek bar',\n sliderThumbLabel: 'Slider thumb',\n volumeThumbLabel: 'Volume thumb',\n videoTimeDurationLabel: 'Video time duration',\n closedCaptionLabel: 'Closed caption',\n audio_tracks: 'Audio Tracks',\n descriptive_audio: 'Audio descriptions',\n closecaption_off: 'Off',\n audio_tracks_default: 'Default Track',\n cc_customize: 'Customize',\n cc_text_font: 'Font',\n cc_text_color: 'Text color',\n cc_color_black: 'Black',\n cc_color_blue: 'Blue',\n cc_color_cyan: 'Cyan',\n cc_color_green: 'Green',\n cc_color_grey: 'Grey',\n cc_color_magenta: 'Magenta',\n cc_color_red: 'Red',\n cc_color_white: 'White',\n cc_color_yellow: 'Yellow',\n cc_font_name_casual: 'Casual',\n cc_font_name_cursive: 'Cursive',\n cc_font_name_monospacedsansserif: 'Monospaced Sans Serif',\n cc_font_name_monospacedserif: 'Monospaced Serif',\n cc_font_name_proportionalserif: 'Proportional Serif',\n cc_font_name_proportionalsansserif: 'Proportional Sans Serif',\n cc_font_name_smallcapitals: 'Small Capitals',\n cc_text_size: 'Text size',\n cc_text_size_default: 'Default',\n cc_text_size_extralarge: 'Extra Large',\n cc_text_size_large: 'Large',\n cc_text_size_maximum: 'Maximum',\n cc_text_size_small: 'Small',\n cc_appearance: 'Appearance',\n cc_preset1: 'Preset 1 ',\n cc_preset2: 'Preset 2',\n cc_preset3: 'Preset 3',\n cc_preset4: 'Preset 4',\n cc_preset5: 'Preset 5',\n cc_presettings: 'Close captions appearance {0}: ({1}:{2}, {3}:{4})',\n cc_text_background_color: 'Background color',\n cc_text_background_opacity: 'Background opacity',\n cc_text_opacity: 'Text opacity',\n cc_percent_0: '0%',\n cc_percent_100: '100%',\n cc_percent_25: '25%',\n cc_percent_50: '50%',\n cc_percent_75: '75%',\n cc_text_edge_color: 'Text edge color',\n cc_text_edge_style: 'Text edge style',\n cc_text_edge_style_depressed: 'Depressed',\n cc_text_edge_style_dropshadow: 'Drop shadow',\n cc_text_edge_style_none: 'No edge',\n cc_text_edge_style_raised: 'Raised',\n cc_text_edge_style_uniform: 'Uniform',\n cc_window_color: 'Window color',\n cc_window_opacity: 'Window opacity',\n cc_reset: 'Reset'\n};\n\n/**\n *\n * Closed Caption helper class.\n *\n */\nexport default class LocalizationHelper {\n private readonly playerResources: IPlayerResources;\n\n public constructor(props: IPlayerResources) {\n this.playerResources = props;\n }\n\n /**\n * Gets the localized value for given key.\n * @param key - The key to look for.\n * @returns The localization string.\n */\n public getLocalizedValue(key: string): string {\n return this.playerResources[key] || LocalizationConstants[key] || '';\n }\n\n /**\n * Converts from a locale ID to a 2 character language code.\n * @public\n * @param locale - Locale ID string.\n * @returns The localization string.\n */\n public getLanguageCodeFromLocale(locale: string): string {\n return ccLanguageCodes[locale] || '';\n }\n\n /**\n * Converts from language ID or locale name to a localized language name.\n * @public\n * @param locale - Language ID string or locale name string.\n * @returns Language Name from locale.\n */\n public getLanguageNameFromLocale(locale: string): string {\n return ccCultureLocStrings[locale] || this.getLocalizedValue(PlayerLocKeys.unknown_language);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n closedCaptionsPresetMap,\n closedCaptionsSettingsMap,\n closedCaptionsSettingsOptions,\n videoClosedCaptionsConstant\n} from '../closed-captions';\nimport { ClosedCaptionTypes, ICurrentClosedCaptionsSettings, IPlayerMenu, IPlayerMenuItem, IVideoMetadata, MenuCategories } from '../data';\nimport { format } from '../utilities';\nimport LocalizationHelper, { ccCultureLocStrings, PlayerLocKeys } from './localization-helper';\nimport PlayerHelper from './player-helper';\n\n/**\n *\n * Closed Caption helper class.\n *\n */\nexport default class ClosedCaptionHelper {\n private readonly playerMetaData: IVideoMetadata;\n\n private readonly playerHelper: PlayerHelper;\n\n private readonly localizationHelper: LocalizationHelper;\n\n public constructor(props: IVideoMetadata, playerHelper: PlayerHelper, localizationHelper: LocalizationHelper) {\n this.playerMetaData = props;\n this.playerHelper = playerHelper;\n this.localizationHelper = localizationHelper;\n }\n\n public checkClosedCaptionsFiles(): boolean {\n if (this.playerMetaData.ccFiles && this.playerMetaData.ccFiles.length > 0) {\n return true;\n }\n return false;\n }\n\n public getClosedCaptionMenu(): IPlayerMenu | null {\n if (this.playerMetaData.ccFiles && this.playerMetaData.ccFiles.length > 0) {\n const ccFiles = this.playerMetaData.ccFiles;\n\n const ccMenuItems: IPlayerMenuItem[] = [];\n\n for (const ccFile of ccFiles) {\n // If ccType is not provided we default to TTML\n if (!ccFile.ccType || ccFile.ccType === ClosedCaptionTypes.TTML) {\n const lang = this.localizationHelper.getLanguageCodeFromLocale(ccFile.locale.toLowerCase());\n\n const ccMenuItem: IPlayerMenuItem = {\n id: this.playerHelper.addIdPrefix(ccFile.locale),\n label: ccCultureLocStrings[ccFile.locale],\n language: lang,\n data: ccFile.locale,\n selected: false,\n selectable: true,\n persistOnClick: true,\n ariaLabel: `${ccCultureLocStrings[ccFile.locale]} ${this.localizationHelper.getLocalizedValue(\n PlayerLocKeys.closecaption\n )}`\n };\n ccMenuItems.push(ccMenuItem);\n }\n }\n\n ccMenuItems.push({\n id: this.playerHelper.addIdPrefix('appearance'),\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_appearance),\n selected: false,\n selectable: false,\n subMenu: this._getClosedCaptionsSettingsMenu()\n });\n\n // Add 'off' option to the top of the list\n ccMenuItems.unshift({\n id: this.playerHelper.addIdPrefix('off'),\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.closecaption_off),\n selected: false,\n data: 'off',\n selectable: true,\n persistOnClick: true,\n ariaLabel: `${this.localizationHelper.getLocalizedValue(\n PlayerLocKeys.closecaption_off\n )} ${this.localizationHelper.getLocalizedValue(PlayerLocKeys.closecaption)}`\n });\n\n return {\n category: MenuCategories.ClosedCaption,\n id: this.playerHelper.addIdPrefix(MenuCategories.ClosedCaption),\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.closecaption),\n items: ccMenuItems\n };\n }\n return null;\n }\n\n public getUpdatedClosedCaptionSetting(\n currentClosedCaptionsSetting: ICurrentClosedCaptionsSettings,\n settingKey: string,\n optionKey: string\n ): ICurrentClosedCaptionsSettings {\n if (settingKey === videoClosedCaptionsConstant.presetKey) {\n const presetValue = closedCaptionsPresetMap[optionKey];\n\n return {\n window_color: currentClosedCaptionsSetting.window_color,\n window_opacity: currentClosedCaptionsSetting.window_opacity,\n text_background_color: presetValue.text_background_color,\n text_background_opacity: presetValue.text_background_opacity,\n text_color: presetValue.text_color,\n text_edge_style: presetValue.text_edge_style,\n text_font: presetValue.text_font,\n text_opacity: presetValue.text_opacity,\n text_size: presetValue.text_size,\n preset: optionKey\n };\n }\n if (this._getOptionValue(settingKey, optionKey)) {\n currentClosedCaptionsSetting[videoClosedCaptionsConstant.presetKey] = 'none';\n currentClosedCaptionsSetting[settingKey] = optionKey;\n return currentClosedCaptionsSetting;\n }\n return currentClosedCaptionsSetting;\n }\n\n /**\n * Gets the value of closed captions URL from the locale.\n * @param locale - Locale.\n * @returns Returns the closed caption URL.\n */\n public getClosedCaptionURLFromLocale(locale: string): string {\n let url: string = '';\n const ccFiles = this.playerMetaData.ccFiles!;\n for (const ccFile of ccFiles) {\n if (ccFile.locale === locale) {\n url = ccFile.url;\n }\n }\n return url;\n }\n\n /**\n * Gets the value of closed captions settings option.\n * @private\n * @param settingKey - The closed ceptions settings key.\n * @param optionKey - The closed captions option key.\n * @returns - The option value.\n */\n private _getOptionValue(settingKey: string, optionKey: string): string {\n const setting = closedCaptionsSettingsMap[settingKey];\n if (setting) {\n const option = closedCaptionsSettingsOptions[setting.option];\n return option && option.map[optionKey];\n }\n return '';\n }\n\n /**\n * Gets the closed captions settings menu to be added to options menu.\n * @returns - The player menu.\n */\n private _getClosedCaptionsSettingsMenu(): IPlayerMenu {\n // Const currentSettings = currentClosedCaptionsSetting;\n\n // create customize settings menu\n const settingsMenuItems: IPlayerMenuItem[] = [];\n\n for (const settingKey of Object.keys(closedCaptionsSettingsMap)) {\n const setting = closedCaptionsSettingsMap[settingKey];\n\n const option = closedCaptionsSettingsOptions[setting.option];\n const optionMenuItem: IPlayerMenuItem[] = [];\n\n // eslint-disable-next-line guard-for-in\n for (const optionKey in option.map) {\n optionMenuItem.push({\n id: this._getCCMenuItemId(settingKey, optionKey),\n label: this.localizationHelper.getLocalizedValue(`${option.pre}${optionKey}`),\n selectable: true,\n selected: false,\n persistOnClick: true,\n data: `${settingKey}:${optionKey}`\n });\n }\n\n // Add back button\n optionMenuItem.unshift({\n id: '',\n label: this.localizationHelper.getLocalizedValue(`cc_${settingKey}`),\n ariaLabel: `${settingKey} - go back to previous menu`,\n selectable: false,\n selected: false,\n persistOnClick: false,\n isBackButton: true\n });\n\n settingsMenuItems.push({\n id: this.playerHelper.addIdPrefix(`${settingKey}_item`),\n label: this.localizationHelper.getLocalizedValue(`cc_${settingKey}`),\n selectable: false,\n subMenu: {\n id: this._getCCSettingsMenuId(settingKey),\n category: MenuCategories.ClosedCaptionSettings,\n items: optionMenuItem,\n label: this.localizationHelper.getLocalizedValue(`cc_${settingKey}`)\n }\n });\n }\n\n settingsMenuItems.unshift({\n id: '',\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_customize),\n ariaLabel: 'Customize - go back to previous menu',\n selectable: false,\n selected: false,\n persistOnClick: false,\n isBackButton: true\n });\n\n const settingsMenu: IPlayerMenu = {\n id: this.playerHelper.addIdPrefix(MenuCategories.ClosedCaptionSettings),\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_customize),\n category: MenuCategories.ClosedCaptionSettings,\n items: settingsMenuItems\n };\n\n // Create preset items menu\n const presetItems: IPlayerMenuItem[] = [];\n\n for (const preset of Object.keys(closedCaptionsPresetMap)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const presetSetting: any = closedCaptionsPresetMap[preset];\n const font: string = presetSetting.text_font;\n const color: string = presetSetting.text_color;\n\n const ariaLabelValue = format(\n this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_presettings),\n '',\n this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_text_font),\n this.localizationHelper.getLocalizedValue(`cc_font_name_${font}`),\n this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_text_color),\n this.localizationHelper.getLocalizedValue(`cc_color_${color}`)\n );\n\n presetItems.push({\n id: this._getCCMenuItemId(videoClosedCaptionsConstant.presetKey, preset),\n label: this.localizationHelper.getLocalizedValue(`cc_${preset}`),\n data: `preset:${preset}`,\n selectable: true,\n selected: false,\n persistOnClick: true,\n ariaLabel: ariaLabelValue,\n hasMouseHoverEvents: true\n });\n }\n\n presetItems.push({\n id: this.playerHelper.addIdPrefix('cc-customize'),\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_customize),\n subMenu: settingsMenu,\n hasMouseHoverEvents: true\n });\n\n presetItems.push({\n id: 'reset',\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_reset),\n data: 'reset',\n persistOnClick: true,\n hasMouseHoverEvents: true\n });\n\n presetItems.unshift({\n id: '',\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_appearance),\n ariaLabel: 'Appreance - go back to previous menu',\n selectable: false,\n selected: false,\n persistOnClick: false,\n isBackButton: true,\n hasMouseHoverEvents: true\n });\n\n return {\n id: this._getCCSettingsMenuId(videoClosedCaptionsConstant.presetKey),\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_appearance),\n category: MenuCategories.ClosedCaptionSettings,\n items: presetItems\n };\n }\n\n /**\n * Gets the close captions setting menu item id.\n * @param settingId - The setting key.\n * @param optionId - The option key.\n * @returns - Menu Id.\n */\n private _getCCMenuItemId(settingId: string, optionId: string): string {\n return this.playerHelper.addIdPrefix(`cc-${settingId}-${optionId}`);\n }\n\n /**\n * Gets the close captions setting menu id.\n * @param settingId - The setting key.\n * @returns Setting menu Id.\n */\n private _getCCSettingsMenuId(settingId: string): string {\n return this.playerHelper.addIdPrefix(`cc-${settingId}`);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n ClosedCaptionTypes,\n IAudioTrack,\n IBinaryReference,\n ICCFile,\n IPlayerMenu,\n IPlayerMenuItem,\n IPlayerProps,\n IVideoFile,\n IVideoMetadata,\n MediaQuality,\n MediaTypes,\n MenuCategories,\n PlayerConstants\n} from '../data';\nimport { startsWith } from '../utilities';\nimport LocalizationHelper, { PlayerLocKeys } from './localization-helper';\n\n/**\n *\n * Player helper class.\n *\n */\nexport default class PlayerHelper {\n private playerProps: IPlayerProps;\n\n private readonly localizationHelper: LocalizationHelper;\n\n private readonly _isMobileDevice?: boolean;\n\n public constructor(props: IPlayerProps, localizationHelper: LocalizationHelper, isMobileDevice?: boolean) {\n this.playerProps = props;\n this.localizationHelper = localizationHelper;\n this._isMobileDevice = isMobileDevice;\n }\n\n public getMetadata(): IVideoMetadata {\n this._mapVideoFiles();\n this._setCCFiles();\n this._setAudioTracks();\n return this.playerProps.playerData.metaData;\n }\n\n public updatePlayerProps(props: IPlayerProps): void {\n this.playerProps = props;\n this._clearVideoPlayerMetaData();\n }\n\n public getOptionMenu(): IPlayerMenu | null {\n const audioTracks = this._getAudioTracksMenu();\n if (audioTracks === null) {\n return null;\n }\n const optionMenuItems: IPlayerMenuItem[] = [];\n\n optionMenuItems.push({\n id: this.addIdPrefix('audioTracks'),\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks),\n selected: false,\n selectable: false,\n subMenu: audioTracks\n });\n\n return {\n category: MenuCategories.Options,\n id: this.addIdPrefix(MenuCategories.Options),\n label: 'Options',\n items: optionMenuItems\n };\n }\n\n /**\n * Get Poster Frame URL.\n * @returns Returns the poster image URL.\n */\n public getPosterFrameUrl(): string {\n let posterFrameUrl = '';\n if (!this.playerProps.playerData.options.hidePosterFrame && this.playerProps.playerData.metaData.posterframeUrl) {\n posterFrameUrl = this._removeProtocolFromUrl(this.playerProps.playerData.metaData.posterframeUrl);\n if (this.playerProps.playerData.options.thumbnailFullWidth) {\n if (posterFrameUrl.indexOf('?') > 0) {\n posterFrameUrl = `${posterFrameUrl}${'&w='}${PlayerConstants.thumbnailFullWidth}${'&h='}${\n PlayerConstants.thumbnailFullHeight\n }`;\n } else {\n posterFrameUrl = `${posterFrameUrl}${'?w='}${PlayerConstants.thumbnailFullWidth}${'&h='}${\n PlayerConstants.thumbnailFullHeight\n }`;\n }\n }\n }\n return posterFrameUrl;\n }\n\n public getVideoFileToPlay(): IVideoFile {\n let videoFile: IVideoFile = {\n url: '',\n mediaType: MediaTypes.MP4,\n quality: MediaQuality.LO\n };\n const videoMetaData: IVideoMetadata = this.playerProps.playerData.metaData;\n\n const mpVideoFiles = this._getVideoFileByType(MediaTypes.MP4, videoMetaData.videoFiles!);\n\n if (this._isMobileDevice && this.playerProps.playerData.options.mobileVideoQuality) {\n const mobileVideoFile = this._getVideoFileByQuality(\n this.playerProps.playerData.options.mobileVideoQuality.toUpperCase() as MediaQuality,\n mpVideoFiles\n );\n if (mobileVideoFile) {\n return mobileVideoFile;\n }\n }\n\n const hdVideoFile = this._getVideoFileByQuality(MediaQuality.HDX, mpVideoFiles);\n if (hdVideoFile !== null) {\n videoFile = hdVideoFile;\n } else {\n const hqVideoFile = this._getVideoFileByQuality(MediaQuality.HQ, mpVideoFiles);\n if (hqVideoFile !== null) {\n videoFile = hqVideoFile;\n } else {\n const sdVideoFile = this._getVideoFileByQuality(MediaQuality.SD, mpVideoFiles);\n if (sdVideoFile !== null) {\n videoFile = sdVideoFile;\n } else {\n const loVideoFile = this._getVideoFileByQuality(MediaQuality.LO, mpVideoFiles);\n if (loVideoFile !== null) {\n videoFile = loVideoFile;\n }\n }\n }\n }\n return videoFile;\n }\n\n /**\n * Callback function when error happen.\n * @param errorType - Error Type.\n * @param message - Error message.\n */\n public onErrorCallback = (errorType: string, message: string): void => {\n console.log(`ErrorType : ${errorType}, Message : ${message}`);\n };\n\n public isEmptyOrUndefined(value?: string): boolean {\n if (value === undefined || value === '') {\n return true;\n }\n return false;\n }\n\n /**\n * Adds the id prefix to form a child id.\n * @param childId - The child id to prefix.\n * @returns - The prefixed id or the original id if no prefix is built.\n */\n public addIdPrefix(childId: string): string {\n const prefix = this.isEmptyOrUndefined(this.playerProps.playerId) ? null : `${this.playerProps.playerId}-`;\n\n return prefix && !startsWith(childId, prefix, false) ? prefix + childId : childId;\n }\n\n /**\n * Removes the id prefix from a child id.\n * @param childId - The child id to prefix.\n * @returns - The un-prefixed id or the original id if no prefix was found.\n */\n public removeIdPrefix(childId: string): string {\n const prefix = this.isEmptyOrUndefined(this.playerProps.playerId) ? null : `${this.playerProps.playerId}-`;\n\n return prefix && startsWith(childId, prefix, false) ? childId.substring(prefix.length) : childId;\n }\n\n private _getAudioTracksMenu(): IPlayerMenu | null {\n const audioTracksMenuItems: IPlayerMenuItem[] = [];\n const videoMetaData: IVideoMetadata = this.playerProps.playerData.metaData;\n if (videoMetaData.audioTracks !== undefined && videoMetaData.audioTracks.length > 0) {\n // Check if there are multiple \"Descriptive Audio\" tracks, in which case we will want to show language\n let descriptiveAudioTrackCount = 0;\n for (const track of videoMetaData.audioTracks) {\n if (track.isDescriptiveAudio) {\n descriptiveAudioTrackCount++;\n }\n }\n\n let trackIndex: number = 0;\n for (const audioTrack of videoMetaData.audioTracks) {\n let label: string;\n let languageCode: string = '';\n if (audioTrack.isDescriptiveAudio) {\n // Descriptive audio labels look like:\n // \"Descriptive audio\" -- when only one descriptive audio track exists\n // or\n // \"Descriptive audio - English\" -- if there is more than one descriptive audio track\n const descriptiveAudioLabel = this.localizationHelper.getLocalizedValue(PlayerLocKeys.descriptive_audio);\n if (descriptiveAudioTrackCount > 1) {\n const language = this.localizationHelper.getLanguageNameFromLocale(audioTrack.languageCode);\n label = `${descriptiveAudioLabel} - ${language}`;\n } else {\n label = descriptiveAudioLabel;\n }\n languageCode = `daudio-${audioTrack.languageCode.toLowerCase()}`;\n } else {\n // Regular tracks display language of the stream only.\n label = this.localizationHelper.getLanguageNameFromLocale(audioTrack.languageCode);\n languageCode = audioTrack.languageCode.toLowerCase();\n }\n\n const audioMenuItem: IPlayerMenuItem = {\n label,\n language: languageCode,\n data: audioTrack.url,\n id: this.addIdPrefix(`audio-${trackIndex}`),\n selected: false,\n selectable: true,\n persistOnClick: true\n };\n\n audioTracksMenuItems.push(audioMenuItem);\n trackIndex++;\n }\n\n audioTracksMenuItems.unshift({\n id: '',\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks_default),\n ariaLabel: this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks_default),\n language: 'default',\n data: 'default',\n selectable: true,\n selected: false,\n persistOnClick: true\n });\n\n audioTracksMenuItems.unshift({\n id: '',\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks),\n ariaLabel: `${this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks)} - go back to previous menu`,\n selectable: false,\n selected: false,\n persistOnClick: false,\n isBackButton: true\n });\n return {\n category: MenuCategories.AudioTracks,\n id: this.addIdPrefix(MenuCategories.AudioTracks),\n label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks),\n items: audioTracksMenuItems\n };\n }\n return null;\n }\n\n private _clearVideoPlayerMetaData(): void {\n this.playerProps.playerData.metaData.videoFiles = [];\n this.playerProps.playerData.metaData.audioTracks = [];\n this.playerProps.playerData.metaData.ccFiles = [];\n }\n\n private _setCCFiles(): void {\n const videoMetaData: IVideoMetadata = this.playerProps.playerData.metaData;\n const ccFiles: ICCFile[] = [];\n if (!(videoMetaData.ccFiles && videoMetaData.ccFiles.length > 0)) {\n if (videoMetaData.videoBinaryReferences && videoMetaData.videoBinaryReferences.length > 0) {\n for (const binaryRef of videoMetaData.videoBinaryReferences) {\n // Skip all other format except ttml/closedcaption\n if (\n (binaryRef.extension && binaryRef.extension === 'ttml') ||\n binaryRef.$type === 'videoClosedCaptionBinaryReference'\n ) {\n const ccFile: ICCFile = {\n ccType: ClosedCaptionTypes.TTML,\n locale: binaryRef.locale!,\n url: binaryRef.sourceHref!\n };\n ccFiles.push(ccFile);\n }\n }\n this.playerProps.playerData.metaData.ccFiles = ccFiles;\n }\n }\n }\n\n private _setAudioTracks(): void {\n const videoMetaData: IVideoMetadata = this.playerProps.playerData.metaData;\n const audioTracks: IAudioTrack[] = [];\n if (videoMetaData.videoBinaryReferences && videoMetaData.videoBinaryReferences.length > 0) {\n for (const binaryRef of videoMetaData.videoBinaryReferences) {\n if (binaryRef.$type && binaryRef.$type === 'audioBinaryReference') {\n const audioTrack: IAudioTrack = {\n isDescriptiveAudio: binaryRef.audioType === 'descriptiveAudio',\n bitrate: binaryRef.bitrate!,\n languageCode: binaryRef.locale === undefined ? '' : binaryRef.locale,\n name: binaryRef.alias!,\n url: binaryRef.clientHref!\n };\n audioTracks.push(audioTrack);\n }\n }\n }\n this.playerProps.playerData.metaData.audioTracks = audioTracks;\n }\n\n private _mapVideoFiles(): void {\n const videoMetaData: IVideoMetadata = this.playerProps.playerData.metaData;\n if (!videoMetaData.videoFiles || videoMetaData.videoFiles.length === 0) {\n const videoFiles: IVideoFile[] = [];\n const videoBinaryFiles: IBinaryReference[] = videoMetaData.videoBinaryReferences!;\n if (videoBinaryFiles && videoBinaryFiles.length > 0) {\n for (const binaryRef of videoBinaryFiles) {\n if (binaryRef.format) {\n // Skip the unsupported 1001 format\n if (binaryRef.format === '1001') {\n continue;\n }\n\n // Handle all other video/audio format\n const mediaTypeAndQuality = this._getMediaTypeAndQuality(binaryRef.format);\n let urlRef;\n if (mediaTypeAndQuality.mediaType === MediaTypes.MP4) {\n urlRef = binaryRef.clientHref;\n } else {\n urlRef = binaryRef.sourceHref;\n }\n\n if (urlRef) {\n urlRef = this._removeProtocolFromUrl(urlRef);\n }\n\n if (urlRef) {\n videoFiles.push({\n url: urlRef,\n quality: mediaTypeAndQuality.quality,\n mediaType: mediaTypeAndQuality.mediaType,\n formatCode: binaryRef.format\n });\n }\n }\n }\n }\n this.playerProps.playerData.metaData.videoFiles = videoFiles;\n }\n }\n\n /**\n * Gets video quality and media type from stream name.\n * @param format - The stream name.\n * @returns The mediaType and MediaQuality.\n */\n private _getMediaTypeAndQuality(format: string): { mediaType: MediaTypes; quality: MediaQuality } {\n let mType: MediaTypes = MediaTypes.MP4;\n let mQuality: MediaQuality = MediaQuality.SD;\n\n switch (format) {\n case '101':\n mType = MediaTypes.MP4;\n mQuality = MediaQuality.LO;\n break;\n case '102':\n mType = MediaTypes.MP4;\n mQuality = MediaQuality.SD;\n break;\n case '103':\n mType = MediaTypes.MP4;\n mQuality = MediaQuality.HQ;\n break;\n case '104':\n mType = MediaTypes.MP4;\n mQuality = MediaQuality.HDX;\n break;\n case '105':\n mType = MediaTypes.MP4;\n mQuality = MediaQuality.HD;\n break;\n case '1004':\n mType = MediaTypes.SMOOTH;\n break;\n case '1006':\n mType = MediaTypes.HLS;\n break;\n case '1007':\n mType = MediaTypes.DASH;\n break;\n default:\n mType = MediaTypes.MP4;\n mQuality = MediaQuality.SD;\n }\n\n return {\n mediaType: mType,\n quality: mQuality\n };\n }\n\n /**\n * Removes protocol from url.\n * @param url - The url.\n * @returns The URL.\n */\n private _removeProtocolFromUrl(url: string): string {\n return url.replace(/(^\\w+:|^)\\/\\//, '//');\n }\n\n /**\n * Gets the video file of specified quality.\n * @param quality - The desired quality to look for.\n * @param videoFiles - The video files.\n * @returns Returns the video file.\n */\n private _getVideoFileByQuality(quality: MediaQuality, videoFiles: IVideoFile[]): IVideoFile | null {\n let videoFile = null;\n for (const file of videoFiles) {\n if (file.quality === quality) {\n videoFile = file;\n break;\n }\n }\n\n return videoFile;\n }\n\n /**\n * Gets the video file of specified type.\n * @param mediaType - The media type to look for.\n * @param videoFiles - The video files.\n * @returns Returns the video file.\n */\n private _getVideoFileByType(mediaType: MediaTypes, videoFiles: IVideoFile[]): IVideoFile[] {\n const videoFile: IVideoFile[] = [];\n for (const file of videoFiles) {\n if (file.mediaType === mediaType) {\n videoFile.push(file);\n }\n }\n return videoFile;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React, { useEffect, useState } from 'react';\n\nexport interface IRatingComponentProps extends IComponentProps<{}> {\n readOnly: boolean;\n ariaLabel: string;\n avgRating: number;\n ratingCount?: string;\n initialRating?: number;\n hideCount?: boolean;\n shouldShowFullRatingDescription?: boolean;\n className?: string;\n ratingCountAriaLabel?: string;\n onChange?(value: number): void;\n}\nexport interface IRatingComponent extends IComponent<IRatingComponentProps> {\n onSliderChanged(): (\n event: React.ChangeEvent<HTMLInputElement>,\n props: IRatingComponentProps,\n setRating: (rating: IRatingState) => void\n ) => void;\n onMouseOver(): (event: React.MouseEvent<HTMLElement>, rating: IRatingState, setRating: (rating: IRatingState) => void) => void;\n onClick(): (event: React.MouseEvent<HTMLElement>, props: IRatingComponentProps, setRating: (rating: IRatingState) => void) => void;\n onMouseLeave(): (event: React.MouseEvent, rating: IRatingState, setRating: (rating: IRatingState) => void) => void;\n}\n\ninterface IRatingState {\n rating: number;\n lastSelectedRating: number;\n}\n\nconst roundUpMin: number = 0.75;\nconst roundMidMin: number = 0.25;\nconst maxRating: number = 5;\n\nconst RatingComponentActions = {\n onSliderChanged(\n event: React.ChangeEvent<HTMLInputElement>,\n props: IRatingComponentProps,\n setRating: (rating: IRatingState) => void\n ): void {\n const value = Number.parseInt(event.target.value, 10);\n setRating({ rating: value, lastSelectedRating: value });\n\n if (props.onChange) {\n props.onChange(value);\n }\n },\n onMouseLeave(_event: React.MouseEvent, rating: IRatingState, setRating: (rating: IRatingState) => void): void {\n setRating({ rating: rating.lastSelectedRating, lastSelectedRating: rating.lastSelectedRating });\n },\n onMouseOver(event: React.MouseEvent<HTMLElement>, rating: IRatingState, setRating: (rating: IRatingState) => void): void {\n setRating({ rating: getIndex(event), lastSelectedRating: rating.lastSelectedRating });\n },\n onClick(event: React.MouseEvent<HTMLElement>, props: IRatingComponentProps, setRating: (rating: IRatingState) => void): void {\n if (!props.readOnly) {\n const index = getIndex(event);\n setRating({ rating: index, lastSelectedRating: index });\n\n if (props.onChange) {\n props.onChange(index);\n }\n }\n }\n};\n\nconst Rating: React.FC<IRatingComponentProps> = (props: IRatingComponentProps) => {\n const initialRating = props.readOnly ? props.avgRating : props.initialRating || 0;\n const [rating, setRating] = useState({ rating: initialRating, lastSelectedRating: initialRating });\n useEffect(() => {\n const newRating = props.readOnly ? props.avgRating : props.initialRating || 0;\n setRating({ rating: newRating, lastSelectedRating: newRating });\n }, [props]);\n const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n RatingComponentActions.onSliderChanged(event, props, setRating);\n };\n const onMouseLeave = (event: React.MouseEvent) => {\n RatingComponentActions.onMouseLeave(event, rating, setRating);\n };\n const onMouseOver = (event: React.MouseEvent<HTMLElement>) => {\n RatingComponentActions.onMouseOver(event, rating, setRating);\n };\n const onClick = (event: React.MouseEvent<HTMLElement>) => {\n RatingComponentActions.onClick(event, props, setRating);\n };\n\n const shouldShowFullRatingDescriptionConfiguration = props.shouldShowFullRatingDescription ?? false;\n const shouldShowDescription = shouldShowFullRatingDescriptionConfiguration || props.typeName === 'reviews-list';\n\n return (\n <div className={`msc-rating ${rating.rating > 0 ? 'msc-no-ratings' : ''} ${props.className ? props.className : ''}`}>\n {starControl(props.readOnly, rating.rating, props.ariaLabel, props.ratingCountAriaLabel, onChange)}\n <div aria-hidden onMouseLeave={props.readOnly ? undefined : onMouseLeave} className='msc-rating__group'>\n {renderStars(rating.rating, props, onMouseOver, onClick)}\n </div>\n {props.ratingCount && (\n <output aria-hidden className='msc-rating__count'>\n {` `}\n {shouldShowDescription ? `${props.avgRating} / 5 (${props.ratingCount})` : props.ratingCount}\n {` `}\n </output>\n )}\n </div>\n );\n};\n\n// Set default props\nRating.defaultProps = {\n avgRating: 0\n} as Partial<IRatingComponentProps>;\n\n/**\n * Rating Review ariaLabel.\n * @param readOnly - Boolean.\n * @param currentRating - Current rating number.\n * @param ariaLabel - Rating AriaLabel.\n * @param reviewCountAriaLabel - Product review count.\n * @param onChange - On Change function.\n * @returns Jsx element.\n */\nconst starControl = (\n readOnly: boolean,\n currentRating: number,\n ariaLabel: string,\n reviewCountAriaLabel: string | undefined,\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n): JSX.Element => {\n if (readOnly) {\n return <div className='msc-rating__range sr-only'>{`${ariaLabel}${reviewCountAriaLabel ? ` ${reviewCountAriaLabel}` : ''}`}</div>;\n }\n\n return (\n <input\n type='range'\n className='msc-rating__range'\n min={0}\n max={5}\n step={1}\n value={currentRating}\n aria-valuemax={5}\n aria-valuemin={0}\n aria-valuenow={currentRating}\n onChange={onChange}\n aria-label={ariaLabel}\n />\n );\n};\n\nconst renderStars = (\n rating: number,\n props: IRatingComponentProps,\n mouseOver: (event: React.MouseEvent<HTMLElement>) => void,\n onClick: (event: React.MouseEvent<HTMLElement>) => void\n): JSX.Element[] => {\n const floor = Math.floor(rating);\n const remainder = rating - floor;\n const filled = remainder < roundUpMin ? floor : floor + 1;\n const half = roundMidMin <= remainder && remainder < roundUpMin ? filled + 1 : 0;\n const stars = [];\n\n for (let i = 1; i <= maxRating; i++) {\n const glyphClass = filled >= i ? 'msc-rating__star' : half === i ? 'msc-rating__half-star' : 'msc-rating__empty-star'!;\n stars.push(\n <span\n className={glyphClass}\n data-index={i}\n key={i}\n onMouseOver={props.readOnly ? undefined : mouseOver}\n onClick={onClick}\n role='presentation'\n />\n );\n }\n\n return stars;\n};\n\nconst getIndex = (event: React.MouseEvent<HTMLElement>): number => {\n const target = event.target as HTMLElement;\n return Number.parseInt(target.getAttribute('data-index')!, 10);\n};\n\n// @ts-expect-error\nexport const RatingComponent: React.FunctionComponent<IRatingComponentProps> = msdyn365Commerce.createComponent<IRatingComponent>(\n 'Rating',\n { component: Rating, ...RatingComponentActions }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { extend, IClientDimension, IDictionaryStringString, IGrid } from '../utilities';\n\n/**\n * Timed Text Markup Language (TTML).\n * See http://www.w3.org/TR/ttml1/ for more details.\n */\nexport const xmlNS = 'http://www.w3.org/XML/1998/namespace';\n\n/**\n * @interface ITtmlSettings\n * @classdesc - The ITtmlSettings interface contract.\n */\nexport interface ITtmlSettings {\n ttmlNamespace?: string;\n ttmlStyleNamespace?: string;\n ttmlParameterNamespace?: string;\n ttmlMetaNamespace?: string;\n idPrefix?: string;\n mediaFrameRate?: number;\n mediaFrameRateMultiplier?: number;\n mediaSubFrameRate?: number;\n mediaTickRate?: number;\n supportedTimeBase?: string;\n rootContainerRegionDimensions?: IClientDimension | null;\n relatedMediaObjectRegion?: IClientDimension | null;\n cellResolution?: IGrid;\n defaultRegionStyle?: IDictionaryStringString;\n fontMap?: IDictionaryStringString;\n log?: Function;\n}\n\n/**\n *\n * The TtmlSettings class.\n * The TtmlSettings class is used to pass settings between the ttml parser, the ttml context, and the outside world.\n * It supplies default values which can be overridden via overrides passed to the constructor.\n */\nexport class TtmlSettings implements ITtmlSettings {\n /**\n * @name - ttmlNamespace\n * @description - The ttml namespace to use.\n * @public\n * @type {string}\n */\n public ttmlNamespace: string = 'http://www.w3.org/ns/ttml';\n\n /**\n * @name - ttmlStyleNamespace\n * @description - The ttml style namespace to use.\n * @public\n * @type {string}\n */\n public ttmlStyleNamespace: string = 'http://www.w3.org/ns/ttml#styling';\n\n /**\n * @name - ttmlParameterNamespace\n * @description - The ttml parameter namespace to use.\n * @public\n * @type {string}\n */\n public ttmlParameterNamespace: string = 'http://www.w3.org/ns/ttml#parameter';\n\n /**\n * @name - ttmlMetaNamespace\n * @description - The ttml metadata namespace to use.\n * @public\n * @type {string}\n */\n public ttmlMetaNamespace: string = 'http://www.w3.org/ns/ttml#metadata';\n\n /**\n * @name - idPrefix\n * @description - The id prefix to use so ids copied from the ttml doc are unique.\n * @public\n * @type {string}\n */\n public idPrefix: string = '';\n\n /**\n * @name - mediaFrameRate\n * @description - The media frame rate to use.\n * @public\n * @type {number}\n */\n public mediaFrameRate: number = 30;\n\n /**\n * @name - mediaFrameRateMultiplier\n * @description - The media frame rate multiplier to use.\n * @public\n * @type {number}\n */\n public mediaFrameRateMultiplier: number = 1;\n\n /**\n * @name - mediaSubFrameRate\n * @description - The media sub frame rate to use.\n * @public\n * @type {number}\n */\n public mediaSubFrameRate: number = 1;\n\n /**\n * @name - mediaTickRate\n * @description - The media tick rate to use.\n * @public\n * @type {number}\n */\n public mediaTickRate: number = 1000;\n\n /**\n * @name - supportedTimeBase\n * @description - The support timebase value.\n * @public\n * @type {string}\n */\n public supportedTimeBase: string = 'media';\n\n /**\n * @name - rootContainerRegionDimensions\n * @description - The root container's dimensions.\n * @public\n * @type {IClientDimension}\n */\n public rootContainerRegionDimensions: IClientDimension | null = null;\n\n /**\n * @name - relatedMediaObjectRegion\n * @description - The media object's dimensions.\n * @public\n * @type {IClientDimension}\n */\n public relatedMediaObjectRegion: IClientDimension | null = null;\n\n /**\n * @name - cellResolution\n * @description - The default cell grid.\n * @public\n * @type {IGrid}\n */\n public cellResolution: IGrid = { rows: 15, columns: 32 };\n\n /**\n * @name - defaultRegionStyle\n * @description - The default region style.\n * @public\n * @type {IDictionaryStringString}\n */\n public defaultRegionStyle: IDictionaryStringString = {\n backgroundColor: 'transparent',\n color: '#E8E9EA',\n direction: 'ltr',\n display: 'auto',\n displayAlign: 'before',\n extent: 'auto',\n fontFamily: 'default',\n fontSize: '1c',\n fontStyle: 'normal',\n fontWeight: 'normal',\n lineHeight: 'normal',\n opacity: '1',\n origin: 'auto',\n overflow: 'hidden',\n padding: '0',\n showBackground: 'always',\n textAlign: 'start',\n textDecoration: 'none',\n textOutline: 'none',\n unicodeBidi: 'normal',\n visibility: 'visible',\n wrapOption: 'normal',\n writingMode: 'lrtb'\n };\n\n /**\n * @name - fontMap\n * @description - The default font map.\n * @public\n * @type {IDictionaryStringString}\n */\n public fontMap: IDictionaryStringString = {};\n\n /**\n * @name - log\n * @description - The logging function to use in debug mode.\n * @public\n * @type {Function}\n */\n public log: Function | undefined;\n\n /*\n * Constructor for the TtmlSettings class.\n */\n public constructor(settingsOverrides?: ITtmlSettings) {\n // These are from the Simple Delivery Profile\n // Per spec recommendation that default be monospace sans serif.\n this.fontMap.default = 'Lucida sans typewriter, Lucida console, Consolas';\n this.fontMap.monospaceSerif = 'Courier';\n this.fontMap.proportionalSerif = 'Times New Roman, Serif';\n this.fontMap.monospaceSansSerif = 'Lucida sans typewriter, Lucida console, Consolas';\n this.fontMap.proportionalSansSerif = 'Arial, Sans-serif';\n this.fontMap.casual = 'Verdana';\n this.fontMap.cursive = 'Zapf-Chancery, Segoe script, Cursive';\n this.fontMap.smallCaps = 'Arial, Helvetica';\n\n // These are others from the broader ttml (v1.0)\n this.fontMap.monospace = 'Lucida sans typewriter, Lucida console, Consolas';\n this.fontMap.sansSerif = 'Arial, Sans-serif';\n this.fontMap.serif = 'Times New Roman, Serif';\n\n if (settingsOverrides) {\n extend(this, settingsOverrides);\n }\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n addClass,\n css,\n extend,\n format,\n getDimensions,\n getText,\n IClientDimension,\n IDictionaryStringString,\n isNullOrWhiteSpace,\n nodeListToArray,\n trim\n} from '../utilities';\nimport { ITtmlEvent, TtmlParser } from './ttml-parser';\nimport { TtmlSettings, xmlNS } from './ttml-settings';\n\n// Timed Text Markup Language (TTML).\n// See http://www.w3.org/TR/ttml1/ for more details.\n\n/**\n * @interface ITtmlContext\n * @classdesc - The TtmlContext interface contract.\n */\nexport interface ITtmlContext {\n setOwnerDocument(ownerDocument: Document): void;\n updateRelatedMediaObjectRegion(dimensions: IClientDimension): boolean;\n resetCurrentEvents(): void;\n hasEvents(): boolean;\n updateCurrentEvents(time: number): boolean;\n getCues(time: number): HTMLElement[];\n}\n\n/**\n * @interface ITtmlTranslationResult\n * @classdesc - The ITtmlTranslationResult interface contract.\n */\ninterface ITtmlTranslationResult {\n outerNode: HTMLElement | null;\n innerNode: HTMLElement | null;\n inheritableStyleSet?: IDictionaryStringString | null;\n}\n\n/**\n * @interface ITtmlPruneResult\n * @classdesc - The ITtmlPruneResult interface contract.\n */\ninterface ITtmlPruneResult {\n prunedElement: Element;\n hasPreservedContent: boolean;\n}\n\n/**\n * The TtmlContext. An instance of this class is returned from the TttmlParser.parse() method after it parses a ttml file.\n * This context is then used by the VideoClosedCaptions object to get the captions for any play position of the video.\n */\nexport class TtmlContext implements ITtmlContext {\n /**\n * @name - lengthRegEx\n * The regular expression pattern used in ttml->css text outline conersion.\n * @static\n * @private\n * @type {RegExp}\n */\n private static readonly lengthRegEx: RegExp = /\\s*(\\d+\\.*\\d*)(.*)\\s*/;\n\n /**\n * @name - rgbaRegEx\n * The regular expression pattern used in ttml->css color conersion.\n * @static\n * @private\n * @type {RegExp}\n */\n private static readonly rgbaRegEx: RegExp = /\\s*rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)\\s*/;\n\n /**\n * @name - TtmlNamedColorMap\n * The table used to map named ttml color values to css color values.\n * @static\n * @private\n * @type {IDictionaryStringString}\n */\n private static readonly TtmlNamedColorMap: IDictionaryStringString = {\n transparent: 'rgba(0,0,0,0)',\n black: 'rgba(0,0,0,1)',\n silver: 'rgba(192,192,192,1)',\n gray: 'rgba(128,128,128,1)',\n white: 'rgba(255,255,255,1)',\n maroon: 'rgba(128,0,0,1)',\n red: 'rgba(255,0,0,1)',\n purple: 'rgba(128,0,128,1)',\n fuchsia: 'rgba(255,0,255,1)',\n magenta: 'rgba(255,0,255,1)',\n green: 'rgba(0,128,0,1)',\n lime: 'rgba(0,255,0,1)',\n olive: 'rgba(128,128,0,1)',\n yellow: 'rgba(255,255,0,1)',\n navy: 'rgba(0,0,128,1)',\n blue: 'rgba(0,0,255,1)',\n teal: 'rgba(0,128,128,1)',\n aqua: 'rgba(0,255,255,1)',\n cyan: 'rgba(0,255,255,1)'\n };\n\n /**\n * @name - events\n * The set of all ttml events.\n * @public\n * @type {ITtmlEvent[]}\n */\n public events!: ITtmlEvent[];\n\n /**\n * @name - settings\n * The ttml settings.\n * @public\n * @type {TtmlSettings}\n */\n public settings!: TtmlSettings;\n\n /**\n * @name - styleSetCache\n * The ttml styleSet cache.\n * @public\n * @type {IDictionaryStringString[]}\n */\n public styleSetCache!: IDictionaryStringString[];\n\n /**\n * @name - rootContainerRegion\n * The root container region.\n * @public\n * @type {Element}\n */\n public rootContainerRegion!: Element;\n\n /**\n * @name - root\n * The root element.\n * @public\n * @type {Element}\n */\n public root!: Element;\n\n /**\n * @name - body\n * The body element.\n * @public\n * @type {Element}\n */\n public body!: Element;\n\n /**\n * @name - layout\n * The layout element.\n * @public\n * @type {Element}\n */\n public layout!: Element;\n\n /**\n * @name - ownerDocument\n * The owner document for this context. Used to create html elements.\n * @private\n * @type {Document}\n */\n private ownerDocument!: Document;\n\n /**\n * @name - currentEvents\n * The current set of temporally active events.\n * @private\n * @type {ITtmlEvent[]}\n */\n private currentEvents!: ITtmlEvent[];\n\n /**\n * @name - currentEventsTime\n * The time the currentEvents was populated.\n * @private\n * @type {number}\n */\n private currentEventsTime!: number;\n\n /**\n * Converts a ttml text decoration style value to a css one.\n * @param ttmlTextDecoration - The ttml value.\n * @returns - The css value.\n */\n private static _ttmlToCssTextDecoration(ttmlTextDecoration: string): string {\n let textDecoration = '';\n const parts = ttmlTextDecoration.split(/\\s+/);\n\n // Since we have no CSS for the 'no' values just replace them all with a none at the front of the list.\n for (const value of parts) {\n // eslint-disable-next-line default-case\n switch (value) {\n case 'none':\n case 'noUnderline':\n case 'noLineThrough':\n case 'noOverline':\n textDecoration = 'none';\n }\n }\n\n // Then append all the others.\n for (const value of parts) {\n switch (value) {\n case 'none':\n case 'noUnderline':\n case 'noLineThrough':\n case 'noOverline':\n break;\n case 'lineThrough':\n textDecoration += ' line-through';\n break;\n default:\n textDecoration += ` ${value}`;\n }\n }\n\n return trim(textDecoration);\n }\n\n /**\n * Converts a ttml text color style value to a css one.\n * #RRGGBB and rgb(rrr,ggg,bbb) do not need conversion and are not modified.\n * #RRGGBBAA is modified because css doesn't support it (at least as implemented in todays browsers).\n * rgba(rrr,ggg,bbb,aaa) is converted to rgba(rrr,ggg,bbb,0-1).\n * ttml namedColors are converted to rgb(rrr,ggg,bbb) in the unlikely event that their alpha (only) is overridden.\n * @param color - The ttml value.\n * @returns - The css value.\n */\n private static _ttmlToCssColor(color: string): string {\n let mappedColor = color;\n\n color = color.toLowerCase();\n\n if (color.startsWith('rgba')) {\n const parts = TtmlContext.rgbaRegEx.exec(color);\n\n if (parts && parts.length === 5) {\n const red = parts[1];\n const green = parts[2];\n const blue = parts[3];\n const alpha = Number.parseInt(parts[4], 10);\n\n mappedColor = format('rgba({0},{1},{2},{3})', red, green, blue, Math.round((alpha * 100) / 255) / 100);\n }\n } else if (color.startsWith('#') && color.length === 9) {\n const red = Number.parseInt(color.substr(1, 2), 16);\n const green = Number.parseInt(color.substr(3, 2), 16);\n const blue = Number.parseInt(color.substr(5, 2), 16);\n const alpha = Number.parseInt(color.substr(7, 2), 16);\n\n mappedColor = format('rgba({0},{1},{2},{3})', red, green, blue, Math.round((alpha * 100) / 255) / 100);\n } else if (TtmlContext.TtmlNamedColorMap[color]) {\n mappedColor = TtmlContext.TtmlNamedColorMap[color];\n }\n\n return mappedColor;\n }\n\n /**\n * Applies default styles to the element to match the ttml defaults.\n * @param element - The element to set the default styles on.\n * @returns - The specified element (for chaining).\n */\n private static _defaultStyle(element: HTMLElement): HTMLElement {\n // Set some element styles to our ttml defaults for them.\n css(element, 'background-color', TtmlContext.TtmlNamedColorMap.transparent);\n css(element, 'offset', '0');\n css(element, 'margin', '0');\n css(element, 'padding', '0');\n css(element, 'border', '0');\n return element;\n }\n\n /**\n * Set the context's owner document. It will use this to create elements during translation.\n * @param ownerDocument - The owner document for this context.\n */\n public setOwnerDocument(ownerDocument: Document): void {\n this.ownerDocument = ownerDocument;\n }\n\n /**\n * Updates the context's media object region.\n * @public\n * @param dimensions - The desired dimensions for the region.\n * @returns - True if the dimensions where changed, otherwise false.\n */\n public updateRelatedMediaObjectRegion(dimensions: IClientDimension): boolean {\n if (\n dimensions !== null &&\n (!this.settings.relatedMediaObjectRegion ||\n dimensions.width !== this.settings.relatedMediaObjectRegion.width ||\n dimensions.height !== this.settings.relatedMediaObjectRegion.height)\n ) {\n this.settings.relatedMediaObjectRegion = {\n width: dimensions.width,\n height: dimensions.height\n };\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Indicates whether or not the context has events.\n * @returns - True if the context has events, otherwise false.\n */\n public hasEvents(): boolean {\n return this.events && !!this.events.length;\n }\n\n /**\n * Resets the context's currentEvents.\n */\n public resetCurrentEvents(): void {\n this.currentEvents = [];\n }\n\n /**\n * Updates the context's currentEvents if there are new events for the specified time.\n * @param time - The time to get events for.\n * @returns - True if the events for the specified time are different than the currentEvents, otherwise false.\n */\n public updateCurrentEvents(time: number): boolean {\n const timeEvents = this._getTemporallyActiveEvents(time);\n\n // As a shortcut compare lengths first.\n const currentEventsLength = this.currentEvents ? this.currentEvents.length : 0;\n const timeEventsLength = timeEvents ? timeEvents.length : 0;\n\n if (currentEventsLength !== timeEventsLength) {\n this.currentEventsTime = time;\n this.currentEvents = timeEvents;\n return true;\n }\n\n if (this.currentEvents) {\n for (let index = 0; index < currentEventsLength; index++) {\n if (this.currentEvents[index].time !== timeEvents[index].time) {\n this.currentEventsTime = time;\n this.currentEvents = timeEvents;\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * The set of cues that apply to the specified time.\n * @param time - The time to get cues for.\n * @returns - The set of cues for the specified time, otherwise an empty [].\n */\n public getCues(time: number): HTMLElement[] {\n let cues: HTMLElement[] = [];\n\n if (this.currentEventsTime !== time) {\n this.updateCurrentEvents(time);\n }\n\n // Find all the region elements in the TTML namespace.\n const preserveSpace = TtmlParser.getAttributeNS(this.root, 'space', xmlNS) === 'preserve';\n const regions = <HTMLElement[]>(this.layout ? this.layout.getElementsByTagNameNS(this.settings.ttmlNamespace, 'region') : []);\n\n for (const region of regions) {\n const regionId = TtmlParser.getAttributeNS(region, 'id', xmlNS);\n const anonymousId = region.getAttribute('data-isanonymous');\n\n if (anonymousId || regionId) {\n const translation = this._translate(region, this.settings.defaultRegionStyle, preserveSpace, time, this.translateToHtml);\n\n if (translation.outerNode && translation.innerNode) {\n const innerNode = translation.innerNode;\n const outerNode = translation.outerNode;\n\n // Create a new subtree for the body element, prune elements\n // not associated with the region, and if its not empty then\n // select it into this region by adding it to div container.\n for (const event of this.events) {\n if (event.element) {\n if (this._isInRegion(event.element, anonymousId ? '' : regionId)) {\n const pruneResult = this._prune(\n event.element,\n translation.inheritableStyleSet!,\n preserveSpace,\n time,\n this.translateToHtml\n );\n let cueBody: Element | null = pruneResult.prunedElement;\n\n if (!pruneResult.hasPreservedContent && cueBody && !trim(getText(cueBody)).length) {\n cueBody = null;\n }\n\n if (cueBody) {\n innerNode.appendChild(cueBody);\n }\n }\n }\n }\n\n const showAlways = outerNode.getAttribute('data-showBackground') === 'always';\n\n if (showAlways || innerNode.children.length) {\n if (showAlways) {\n // Just needed internally for the previous check, don't pass through on the cue.\n outerNode.removeAttribute('data-showBackground');\n }\n\n cues.push(outerNode);\n }\n }\n }\n }\n\n // If we ended up with any displayable cues add them all to the rootContainerRegion cue.\n if (cues.length) {\n const rcr = this._translate(this.rootContainerRegion, { overflow: 'hidden', padding: '0' }, false, time, this.translateToHtml);\n\n for (const cue of cues) {\n rcr.innerNode!.appendChild(cue);\n }\n\n cues = [];\n cues.push(rcr.outerNode!);\n }\n\n return cues;\n }\n\n /**\n * Get the list of temporally active events for the specified time.\n * @private\n * @param time - The time to get the active events for.\n * @returns - The set of active events for the specified time, otherwise an empty [].\n */\n private _getTemporallyActiveEvents(time: number): ITtmlEvent[] {\n return this.events.filter(event => {\n return event.element ? this._isTemporallyActive(event.element, time) : true;\n });\n }\n\n /**\n * Determines whether or not the specified element is temporally active at the specified time.\n * @param element - The element to check.\n * @param time - The time to check against.\n * @returns - True if the element is active at the specified time, otherwise false.\n */\n private _isTemporallyActive(element: Element, time: number): boolean {\n return (\n (Number.parseInt(element.getAttribute('data-time-start')!, 10) || 0) <= time &&\n time < (Number.parseInt(element.getAttribute('data-time-end')!, 10) || 0)\n );\n }\n\n /**\n * Convert a ttml element into the equivalent in another format via the supplied translator function.\n * @param element - The ttml element to translate.\n * @param inheritedStyleSet - The element's inherited style set.\n * @param preserveSpace - Indicates whether or not space should be preserved.\n * @param time - The time to translate against. Elements and styles are temporally transient.\n * @param translator - The translator function to use. Originally supported both xml/html but is always using html in MWF.\n * @returns - A ITtmlTranslationResult instance containing the translation results.\n */\n private _translate(\n element: Element,\n inheritedStyleSet: IDictionaryStringString,\n preserveSpace: boolean,\n time: number,\n translator: Function\n ): ITtmlTranslationResult {\n let translation: ITtmlTranslationResult;\n let computedStyleSet: IDictionaryStringString;\n\n if (this._isTemporallyActive(element, time)) {\n const tag = this._getTagNameEquivalent(element);\n\n computedStyleSet = this._getComputedStyleSet(element, inheritedStyleSet, tag, time);\n\n if (computedStyleSet.display !== 'none') {\n const applicableStyleSet = this._getApplicableStyleSet(computedStyleSet, tag);\n\n translation = translator(element, applicableStyleSet, preserveSpace);\n\n return {\n outerNode: translation.outerNode,\n innerNode: translation.innerNode,\n inheritableStyleSet: this._getInheritableStyleSet(computedStyleSet)\n };\n }\n }\n\n return { outerNode: null, innerNode: null, inheritableStyleSet: null };\n }\n\n /**\n * Convert a ttml element into the its equivalent html element.\n * @param element - The ttml element to translate.\n * @param applicableStyleSet - The style set applicable to this element.\n * @param preserveSpace - Indicates whether or not space should be preserved.\n * @returns - A ITtmlTranslationResult instance containing the translation results.\n */\n private readonly translateToHtml = (\n element: Element,\n applicableStyleSet: IDictionaryStringString,\n preserveSpace: boolean\n ): ITtmlTranslationResult => {\n let translation: HTMLElement;\n let innerNode: HTMLElement;\n const name = this._getTagNameEquivalent(element);\n let htmlName = '';\n let htmlClass = '';\n switch (name) {\n case 'ttml:region':\n htmlClass = 'cue ';\n\n /* Falls through */\n // break;\n case 'ttml:rootcontainerregion':\n case 'ttml:body':\n case 'ttml:div':\n htmlName = 'div';\n break;\n case 'ttml:p':\n htmlName = 'p';\n break;\n case 'ttml:span':\n htmlName = 'span';\n break;\n case 'ttml:br':\n htmlName = 'br';\n break;\n default:\n }\n\n const role = TtmlParser.getAttributeNS(element, 'role', this.settings.ttmlMetaNamespace);\n\n if (role) {\n htmlClass += ` ${role}`;\n }\n\n const agent = TtmlParser.getAttributeNS(element, 'agent', this.settings.ttmlMetaNamespace);\n\n if (agent) {\n htmlClass += ` ${agent}`;\n }\n\n // Hack until display:ruby on other elements works.\n if (role === 'x-ruby') {\n htmlName = 'ruby';\n } else if (role === 'x-rubybase') {\n htmlName = 'rb';\n } else if (role === 'x-rubytext') {\n htmlName = 'rt';\n }\n\n if (!isNullOrWhiteSpace(htmlName)) {\n translation = TtmlContext._defaultStyle(this.ownerDocument.createElement(htmlName));\n addClass(translation, trim(htmlClass));\n\n const title = TtmlParser.getAttributeNS(element, 'title', this.settings.ttmlMetaNamespace);\n\n if (title) {\n translation.setAttribute('title', title);\n }\n\n const id = TtmlParser.getAttributeNS(element, 'id', xmlNS);\n\n if (id && this.settings.idPrefix) {\n // Migrate the ttml doc id's over to the html markup.\n // Use idPrefix to ensure there are no name clases on id's already in target doc.\n translation.setAttribute('id', this.settings.idPrefix + id);\n }\n\n if (name === 'ttml:region') {\n // To get a <region> to display properly we are actually going to need to create two nested <div>s\n // This is because for displayAlign to work we need a table-cell <div> inside a table <div>.\n innerNode = translation.appendChild(TtmlContext._defaultStyle(this.ownerDocument.createElement('div')));\n innerNode.setAttribute('style', 'display:table; border-spacing:0; cell-spacing:0; cell-padding:0; width:100%; height:100%');\n innerNode = innerNode.appendChild(TtmlContext._defaultStyle(this.ownerDocument.createElement('div')));\n css(innerNode, 'display', 'table-cell');\n\n // Apply the displayAlign style to inner table-cell <div>\n if (applicableStyleSet.displayAlign) {\n this._translateStyle(name, innerNode, { displayAlign: applicableStyleSet.displayAlign });\n\n // Then remove displayAlign from the applicableStyleSet so as not to also later apply it to the outer table <div>\n applicableStyleSet.displayAlign = '';\n }\n }\n\n // If we're preserving space add an inner <span> with 'white-space: pre'.\n // This is how we implement preserving space in css and we need an inner\n // span because the 'real' span will already be setting it's css white-space\n // value to either normal or nowrap and we can't collide with that.\n if (preserveSpace && name === 'ttml:span') {\n innerNode = translation.appendChild(TtmlContext._defaultStyle(this.ownerDocument.createElement('span')));\n css(innerNode, 'white-space', 'pre');\n }\n\n // Default some css properties that we don't want to inadvertantly end up\n // inheriting values for that might cause adverse layout impacts for us.\n css(translation, 'position', 'static');\n css(translation, 'width', '100%');\n\n // Copy style from element over to html, translating into CSS as we go.\n this._translateStyle(name, translation, applicableStyleSet);\n }\n\n return { outerNode: translation!, innerNode: innerNode! ? innerNode! : translation! };\n };\n\n /**\n * Translate the ttml styles in a styleSet to their equivalent css styles and apply them to the specified html element.\n * @param tagName - The ttml element tagName. All styles do not apply to all tagNames.\n * @param element - The ttml element to translate.\n * @param applicableStyleSet - The style set applicable to this element.\n */\n private _translateStyle(tagName: string, element: HTMLElement, applicableStyleSet: IDictionaryStringString): void {\n for (const style in applicableStyleSet) {\n if (applicableStyleSet[style]) {\n this._applyStyle(element, tagName, style, applicableStyleSet[style]);\n }\n }\n }\n\n /**\n * Convert the element if it is in the region, then recurse into its contents.\n * If it ends up with no children then we dont add it to the region, we prune it.\n * @param element - The ttml element to translate.\n * @param inheritedStyleSet - The style set inherited by this element.\n * @param preserveSpace - Indicates whether or not space should be preserved.\n * @param time - The time to translate against. Elements and styles are temporally transient.\n * @param translator - The translator function to use. Originally supported both xml/html but is always using html in MWF.\n * @param [ignoreAncestors] - Specifies whether or not to ignore the element's ancestors.\n * @returns - A ITtmlPruneResult instance containing the prune results.\n */\n private _prune(\n element: Element,\n inheritedStyleSet: IDictionaryStringString,\n preserveSpace: boolean,\n time: number,\n translator: Function,\n ignoreAncestors: boolean = false\n ): ITtmlPruneResult {\n let outerNode: Element;\n let hasPreservedContent = false;\n\n let translation = this._translate(element, inheritedStyleSet, preserveSpace, time, translator);\n\n if (translation.outerNode !== null) {\n const tag = this._getTagNameEquivalent(element);\n\n outerNode = translation.outerNode;\n let innerNode = translation.innerNode;\n\n for (const child of nodeListToArray<Node>(element.childNodes)) {\n if (child.nodeType === Node.COMMENT_NODE) {\n // Do nothing.\n } else if (child.nodeType === Node.TEXT_NODE) {\n innerNode!.appendChild(document.createTextNode((<Text>child).data));\n\n if (preserveSpace && tag === 'ttml:span') {\n hasPreservedContent = true;\n }\n } else {\n let childPreserveSpace = preserveSpace;\n const spaceAttr = TtmlParser.getAttributeNS(<Element>child, 'space', xmlNS);\n\n if (spaceAttr) {\n childPreserveSpace = spaceAttr === 'preserve';\n }\n\n const pruneRecord = this._prune(\n <Element>child,\n translation.inheritableStyleSet!,\n childPreserveSpace,\n time,\n translator,\n true\n );\n\n hasPreservedContent = hasPreservedContent || pruneRecord.hasPreservedContent;\n\n if (pruneRecord.prunedElement) {\n innerNode!.appendChild(pruneRecord.prunedElement);\n }\n }\n }\n\n // Now traverse back till the body and build the corresponding structures.\n if (!ignoreAncestors) {\n let ancestor = <Element>element.parentNode;\n\n while (ancestor !== null && ancestor.nodeType === Node.ELEMENT_NODE && ancestor !== this.body) {\n translation = this._translate(ancestor, inheritedStyleSet, preserveSpace, time, translator);\n if (translation.outerNode) {\n innerNode = translation.innerNode;\n innerNode!.appendChild(outerNode);\n outerNode = translation.outerNode;\n } else {\n break;\n }\n\n ancestor = <Element>ancestor.parentNode;\n }\n }\n }\n\n return { prunedElement: outerNode!, hasPreservedContent };\n }\n\n /**\n * Build this element's ttml computed styleset.\n * This is used as the base styleSet to filter the inherited styleSet from for an element's children.\n * @param element - The ttml element to translate.\n * @param inheritedStyleSet - The styleSet inherited by this element.\n * @param tagName - The ttml element tagName. All styles do not apply to all tagNames.\n * @param time - The time to translate against. Elements and styles are temporally transient.\n * @returns - The resulting computed styleSet.\n */\n private _getComputedStyleSet(\n element: Element,\n inheritedStyleSet: IDictionaryStringString,\n tagName: string,\n time: number\n ): IDictionaryStringString {\n // Start off with a clone of the inherited styleset.\n const computedStyleSet = extend({}, inheritedStyleSet);\n\n // Iterate over this nodes ttml styles and pave them onto it's computed styleset.\n extend(computedStyleSet, this.styleSetCache[Number.parseInt(element.getAttribute('data-styleSet')!, 10)]);\n\n // Apply any temporally active style animations.\n const sets = element.getElementsByTagNameNS(this.settings.ttmlNamespace, 'set');\n\n for (const set of nodeListToArray(sets)) {\n if (this._isTemporallyActive(<Element>set, time)) {\n TtmlParser.applyInlineStyles(this.settings, computedStyleSet, <Element>set);\n }\n }\n\n if (tagName === 'ttml:p' && computedStyleSet.lineHeight === 'normal') {\n // Special case for <p>'s with tts:lineHeight='normal'\n // This means use the largest tts:fontSize value of any\n // of it's descendant <span>'s. Since we don't know what\n // values those might be until translateStyle we'll just\n // save them all and figure it out then.\n const fontSizes = this._appendSpanFontSizes(element, this._getInheritableStyleSet(computedStyleSet), time, '');\n\n if (fontSizes) {\n computedStyleSet['computed-lineHeight'] = fontSizes;\n }\n }\n\n return computedStyleSet;\n }\n\n /**\n * Build this tags ttml applicable styleset from the specified computed styleSet to apply only to it.\n * @param computedStyleSet - The style set inherited by this element.\n * @param tagName - The ttml element tagName. All styles do not apply to all tagNames.\n * @returns - The resulting applicable styleSet.\n */\n private _getApplicableStyleSet(computedStyleSet: IDictionaryStringString, tagName: string): IDictionaryStringString {\n const applicableStyleSet: IDictionaryStringString = {};\n\n // Special case extent to the front of the list as later processing of\n // padding will depend on it having already been set first.\n if (computedStyleSet.extent && this._isStyleApplicable(tagName, 'extent')) {\n applicableStyleSet.extent = computedStyleSet.extent;\n }\n\n // Special case color to the front of the list as later processing of\n // textOutline will depend on it having already been set first.\n if (computedStyleSet.color && this._isStyleApplicable(tagName, 'color')) {\n applicableStyleSet.color = computedStyleSet.color;\n }\n\n for (const style in computedStyleSet) {\n if (this._isStyleApplicable(tagName, style)) {\n applicableStyleSet[style] = computedStyleSet[style];\n }\n }\n\n return applicableStyleSet;\n }\n\n /**\n * Determines if the specified style applies to the specified ttml tagName.\n * NOTE: The ttml spec doesn't mention ttml:br in the styles 'applies to' sections but\n * as noted in the span section everything that applies to ttml:span also applies to ttml:br.\n * @private\n * @param tagName - The ttml element tagName. All styles do not apply to all tagNames.\n * @param style - The style to check against the tagName.\n * @returns - True if the ttml:style applies to the ttml:tag, otherwise false.\n */\n private _isStyleApplicable(tagName: string, style: string): boolean {\n switch (style) {\n case 'backgroundColor':\n case 'display':\n case 'visibility':\n return 'ttml:body ttml:div ttml:p ttml:region ttml:rootcontainerregion ttml:span ttml:br'.includes(tagName);\n\n // Technically these font styles do not apply to <p>s but for some reason the resulting html/css\n // for span/br doesnt compute line-height correctly if the entire containing <p> (div) isn't all the same...\n case 'fontFamily':\n case 'fontSize':\n case 'fontStyle':\n case 'fontWeight':\n return 'ttml:p ttml:span ttml:br'.includes(tagName);\n\n case 'color':\n case 'textDecoration':\n case 'textOutline':\n case 'wrapOption':\n return 'ttml:span ttml:br'.includes(tagName);\n\n case 'direction':\n case 'unicodeBidi':\n return 'ttml:p ttml:span ttml:br'.includes(tagName);\n\n case 'displayAlign':\n case 'opacity':\n case 'origin':\n case 'overflow':\n case 'padding':\n case 'showBackground':\n case 'writingMode':\n case 'zIndex':\n return 'ttml:region ttml:rootcontainerregion'.includes(tagName);\n\n case 'extent':\n return 'ttml:tt ttml:region ttml:rootcontainerregion'.includes(tagName);\n\n case 'computed-lineHeight':\n case 'lineHeight':\n case 'textAlign':\n return 'ttml:p'.includes(tagName);\n\n default:\n return false;\n }\n }\n\n /**\n * Filters a computed styleSet into an inheritable styleSet subset to pass on to children.\n * Not all styles are inheritable.\n * @private\n * @param computedStyleSet - The computed styleSet to filter.\n * @returns - The resulting inheritable styleSet.\n */\n private _getInheritableStyleSet(computedStyleSet: IDictionaryStringString): IDictionaryStringString {\n const inheritedStyleSet: IDictionaryStringString = {};\n\n for (const style in computedStyleSet) {\n if (computedStyleSet.hasOwnProperty(style)) {\n switch (style) {\n case 'backgroundColor':\n case 'computed-lineHeight':\n case 'display':\n case 'displayAlign':\n case 'extent':\n case 'opacity':\n case 'origin':\n case 'overflow':\n case 'padding':\n case 'showBackground':\n case 'unicodeBidi':\n case 'writingMode':\n case 'zIndex':\n break;\n default:\n inheritedStyleSet[style] = computedStyleSet[style];\n }\n }\n }\n\n return inheritedStyleSet;\n // eslint-disable-next-line max-lines\n }\n\n /**\n * Recurses through an element and it's descendants finding the font sizess of all it's <span>'s.\n * @param element - The ttml element to translate.\n * @param inheritedStyleSet - The element's inherited styleSet.\n * @param time - The time to translate against. Elements and styles are temporally transient.\n * @param value - The list of font sizes to append to.\n * @returns - The value with any additional font sizes appended to it.\n */\n private _appendSpanFontSizes(element: Element, inheritedStyleSet: IDictionaryStringString, time: number, value: string): string {\n for (const child of nodeListToArray<Element>(element.childNodes)) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n const tag = this._getTagNameEquivalent(child);\n\n if (tag === 'ttml:span') {\n const computedStyleSet = this._getComputedStyleSet(child, inheritedStyleSet, 'ttml:span', time);\n const fontSize = computedStyleSet.fontSize;\n\n if (fontSize) {\n value += (value ? ',' : '') + fontSize;\n }\n\n value = this._appendSpanFontSizes(child, this._getInheritableStyleSet(computedStyleSet), time, value);\n }\n }\n }\n\n return value;\n }\n\n /**\n * Determines whether or not the specified element is associated with the specified region.\n * Ttml defines 5 ordered rules, where the first rule satisfied is used and remaining rules are skipped.\n * @param element - The ttml element to check.\n * @param regionId - The id of the region to see if the element is associated with.\n * @returns - True if the specified element is within the specified region, otherwise false.\n */\n private _isInRegion(element: Element, regionId: string): boolean {\n // Quick test: Out of normal order, but makes following rules simpler.\n // This is a shortcut to check step #4 first\n if (!regionId) {\n return true;\n }\n\n const elemRegion = TtmlParser.getAttributeNS(element, 'region', this.settings.ttmlNamespace);\n\n // 1. If the element specifies a region attribute, then the element is\n // associated with the region referenced by that attribute;\n if (elemRegion === regionId) {\n return true;\n }\n\n if (!elemRegion) {\n // 2. If some ancestor of that element specifies a region attribute, then the element is\n // associated with the region referenced by the most immediate ancestor that specifies\n // this attribute;\n let ancestor = <Element>element.parentNode;\n\n while (ancestor !== null && ancestor.nodeType === Node.ELEMENT_NODE) {\n const id = this._getRegionId(ancestor);\n if (id) {\n return id === regionId;\n }\n ancestor = <Element>ancestor.parentNode;\n }\n\n // 3. If the element contains a descendant element that specifies a region attribute,\n // then the element is associated with the region referenced by that attribute;\n for (const node of nodeListToArray(element.getElementsByTagName('*'))) {\n if (this._getRegionId(<Element>node) === regionId) {\n return true;\n }\n }\n }\n\n // 5. The element is not associated with any region.\n return false;\n }\n\n /**\n * Gets the region id for the specified element.\n * @param element - The ttml element to check.\n * @returns - The id of the region the element is associated with.\n */\n private _getRegionId(element: Element): string {\n let regionId: string;\n\n if (element.nodeType === Node.ELEMENT_NODE && element.namespaceURI === this.settings.ttmlNamespace) {\n if (TtmlParser.getLocalTagName(element) === 'region') {\n regionId = TtmlParser.getAttributeNS(element, 'id', xmlNS);\n } else {\n regionId = TtmlParser.getAttributeNS(element, 'region', this.settings.ttmlNamespace);\n }\n }\n\n return regionId!;\n }\n\n /**\n * Gets the tagName of the element with the current ttml namespace prepended if non-standard.\n * @param element - The ttml element to get the tagName of.\n * @returns - The tagName or '' if the namespace isn't one of the ttml ones.\n */\n private _getTagNameEquivalent(element: Element): string {\n const tagName = TtmlParser.getLocalTagName(element);\n const nameSpace = element.namespaceURI;\n\n if (nameSpace === this.settings.ttmlNamespace) {\n return `ttml:${tagName}`;\n }\n\n if (nameSpace === 'http://www.w3.org/1999/xhtml') {\n return tagName;\n }\n\n return '';\n }\n\n /**\n * Translates the ttml style/value into one or more css styles/values and applies them to the element.\n * @param element - The ttml element to apply the css style(s) too.\n * @param tagName - The ttml tagName associated with the element.\n * @param style - The ttml style name.\n * @param value - The ttml style value.\n */\n // eslint-disable-next-line complexity\n private _applyStyle(element: HTMLElement, tagName: string, style: string, value: string): void {\n let mappedValue = value;\n\n switch (style) {\n case 'color':\n case 'backgroundColor': {\n mappedValue = TtmlContext._ttmlToCssColor(value);\n css(element, style, mappedValue);\n return;\n }\n\n case 'direction':\n case 'display': {\n // No change.\n css(element, style, mappedValue);\n return;\n }\n\n case 'displayAlign': {\n // eslint-disable-next-line default-case\n switch (value) {\n case 'before':\n mappedValue = 'top';\n break;\n case 'center':\n mappedValue = 'middle';\n break;\n case 'after':\n mappedValue = 'bottom';\n }\n\n css(element, 'vertical-align', mappedValue);\n return;\n }\n\n case 'extent': {\n let width: string;\n let height: string;\n\n if (value !== 'auto') {\n // Get the individual components.\n const coords = value.split(/\\s+/);\n\n if (coords.length === 2) {\n width = this._ttmlToCssUnits(coords[0], true);\n height = this._ttmlToCssUnits(coords[1], false);\n }\n }\n\n if (!width!) {\n width = `${(this.settings.rootContainerRegionDimensions\n ? this.settings.rootContainerRegionDimensions.width\n : this.settings.relatedMediaObjectRegion!.width\n ).toString()}px`;\n height = `${(this.settings.rootContainerRegionDimensions\n ? this.settings.rootContainerRegionDimensions.height\n : this.settings.relatedMediaObjectRegion!.height\n ).toString()}px`;\n }\n\n css(element, 'position', 'absolute');\n css(element, 'width', width!);\n css(element, 'min-width', width!);\n css(element, 'max-width', width!);\n css(element, 'height', height!);\n css(element, 'min-height', height!);\n css(element, 'max-height', height!);\n return;\n }\n\n case 'fontFamily': {\n if (this.settings.fontMap && this.settings.fontMap[value]) {\n mappedValue = this.settings.fontMap[value];\n }\n\n if (value === 'smallCaps') {\n // Need to additionally add font-variant: small-caps.\n css(element, 'fontVariant', 'small-caps');\n }\n\n css(element, style, mappedValue);\n return;\n }\n\n case 'fontSize': {\n const parts = value.split(/\\s+/);\n\n // For two part fontSize values we use the vertical size which is in the second part.\n const size = parts.length > 1 ? parts[1] : parts[0];\n\n // Set the fontsize scaleFactor to 75% (of cell size) to account for ascenders/descenders etc.\n mappedValue = this._ttmlToCssFontSize(size, false, 0.75, tagName === 'ttml:region');\n\n css(element, style, mappedValue);\n return;\n }\n\n case 'fontStyle':\n case 'fontWeight': {\n // No change.\n css(element, style, mappedValue);\n return;\n }\n\n case 'lineHeight': {\n // Spec doesn't qualify what % lengths mean so I'm going to assume it's % of a\n // cell and therefore use fontSize conversion method.\n mappedValue = value === 'normal' ? value : this._ttmlToCssFontSize(value, false);\n\n css(element, 'line-height', mappedValue);\n return;\n }\n\n case 'computed-lineHeight': {\n const values = value.split(',');\n let max = -1;\n\n for (const fontSize of values) {\n // Computed-lineHeight is based off of fontSize so use fontSize conversion method.\n mappedValue = this._ttmlToCssFontSize(fontSize, false);\n\n if (mappedValue && mappedValue.indexOf('px') === mappedValue.length - 2) {\n const height = Number.parseFloat(mappedValue.substr(0, mappedValue.length - 2));\n\n if (!isNaN(height) && height > max) {\n max = height;\n }\n }\n }\n\n if (max >= 0) {\n css(element, 'line-height', `${max}px`);\n }\n\n return;\n }\n\n case 'origin': {\n if (value !== 'auto') {\n // Get the individual components.\n const coords = value.split(/\\s+/);\n\n if (coords.length === 2) {\n css(element, 'position', 'absolute');\n css(element, 'left', this._ttmlToCssUnits(coords[0], true));\n css(element, 'top', this._ttmlToCssUnits(coords[1], false));\n }\n }\n\n return;\n }\n\n case 'opacity': {\n // No change.\n css(element, style, mappedValue);\n return;\n }\n\n case 'padding': {\n const contextRect = getDimensions(element);\n\n // Get the individual components.\n const parts = value.split(/\\s+/);\n let first: string;\n let second: string;\n let third: string;\n let forth: string;\n\n // eslint-disable-next-line default-case\n switch (parts.length) {\n case 1:\n // Value is used for all 4 sides.\n first = this._ttmlToCssUnits(parts[0], false, contextRect!);\n second = this._ttmlToCssUnits(parts[0], true, contextRect!);\n mappedValue = format('{0} {1} {0} {1}', first, second);\n break;\n case 2:\n // First is top/bottom, second is left/right.\n first = this._ttmlToCssUnits(parts[0], false, contextRect!);\n second = this._ttmlToCssUnits(parts[1], true, contextRect!);\n mappedValue = format('{0} {1} {0} {1}', first, second);\n break;\n case 3:\n // First is top, second is left/right, third is bottom.\n first = this._ttmlToCssUnits(parts[0], false, contextRect!);\n second = this._ttmlToCssUnits(parts[1], true, contextRect!);\n third = this._ttmlToCssUnits(parts[2], false, contextRect!);\n mappedValue = format('{0} {1} {2} {1}', first, second, third);\n break;\n case 4:\n // Top, right, bottom, left.\n first = this._ttmlToCssUnits(parts[0], false, contextRect!);\n second = this._ttmlToCssUnits(parts[1], true, contextRect!);\n third = this._ttmlToCssUnits(parts[2], false, contextRect!);\n forth = this._ttmlToCssUnits(parts[3], true, contextRect!);\n mappedValue = format('{0} {1} {2} {3}', first, second, third, forth);\n }\n\n // Using border width to implement tts:padding as neither padding nor margin fix the size (height) of the content area.\n css(element, 'box-sizing', 'border-box');\n\n // TODO: See if we work in FF without the following commented out -moz-box-sizing line now and if so remove it.\n /// /// css(element, '-moz-box-sizing', 'border-box');\n css(element, 'border-style', 'solid');\n css(element, 'border-color', 'transparent');\n\n // It can be helpful when debugging to change the border-color from transparent to something like rgba(255,255,200,0.5)\n // css(element, 'border-color', 'rgba(255,255,200,0.5)');\n css(element, 'border-width', mappedValue);\n return;\n }\n\n // If you know what this was for please document it here and uncomment it.\n // As of now the caller appeared to be doing nothing with it so commenting it out.\n /// /// case 'showBackground': {\n /// /// return this.getAttribute('data-showBackground', value);\n /// /// }\n\n case 'textAlign': {\n // eslint-disable-next-line default-case\n switch (value) {\n case 'start':\n mappedValue = 'left'; // TODO: handle rtl correctly.\n break;\n case 'end':\n mappedValue = 'right'; // TODO: handle rtl correctly.\n }\n\n css(element, 'text-align', mappedValue);\n return;\n }\n\n case 'textDecoration': {\n mappedValue = TtmlContext._ttmlToCssTextDecoration(value);\n css(element, 'text-decoration', mappedValue);\n return;\n }\n\n case 'textOutline': {\n const defaultColor = css(element, 'color');\n css(element, 'text-shadow', this._ttmlToCssTextOutline(mappedValue, defaultColor));\n return;\n }\n\n case 'unicodeBidi': {\n // TODO: Handle multiple options correctly.\n // eslint-disable-next-line default-case\n switch (value) {\n case 'bidiOverride':\n mappedValue = 'bidi-override';\n }\n css(element, 'unicode-bidi', mappedValue);\n return;\n }\n\n case 'visibility': {\n // No change.\n css(element, style, mappedValue);\n return;\n }\n\n case 'writingMode': {\n // eslint-disable-next-line default-case\n switch (value) {\n case 'lr':\n case 'lrtb': {\n css(element, 'writing-mode', 'horizontal-tb'); // CCS3 standard: Doesn't work yet\n css(element, '-webkit-writing-mode', 'horizontal-tb'); // Webkit for Chrome\n css(element, 'writing-mode', 'lr-tb'); // IE specific\n return;\n }\n case 'rl':\n case 'rltb': {\n css(element, 'writing-mode', 'horizontal-tb'); // CCS3 standard: Doesn't work yet\n css(element, '-webkit-writing-mode', 'horizontal-tb'); // Webkit for Chrome\n css(element, 'writing-mode', 'rl-tb'); // IE specific\n return;\n }\n case 'tblr': {\n css(element, 'text-orientation', 'upright'); // CCS3 standard: Doesn't work yet\n css(element, 'writing-mode', 'vertical-lr'); // CCS3 standard: Doesn't work yet\n css(element, '-webkit-text-orientation', 'upright'); // Webkit for Chrome\n css(element, '-webkit-writing-mode', 'vertical-lr'); // Webkit for Chrome\n css(element, 'writing-mode', 'tb-lr'); // IE specific\n return;\n }\n case 'tb':\n case 'tbrl': {\n css(element, 'text-orientation', 'upright'); // CCS3 standard: Doesn't work yet\n css(element, 'writing-mode', 'vertical-rl'); // CCS3 standard: Doesn't work yet\n css(element, '-webkit-text-orientation', 'upright'); // Webkit for Chrome\n css(element, '-webkit-writing-mode', 'vertical-rl'); // Webkit for Chrome\n css(element, 'writing-mode', 'tb-rl'); // IE specific\n return;\n }\n }\n return;\n }\n\n case 'wrapOption': {\n css(element, 'white-space', value === 'noWrap' ? 'nowrap' : value === 'pre' ? 'pre' : 'normal');\n return;\n }\n\n case 'zIndex': {\n css(element, style, mappedValue); // Requires global information...\n return;\n }\n\n default: {\n css(element, style, mappedValue);\n }\n }\n }\n\n /**\n * Converts a ttml unit string to a css one.\n * @param ttmlUnits - The ttml value.\n * @param width - Indicates whether to perform a width based or a height based conversion.\n * @param [contextRect] - The context rectangle to use for conversion.\n * @returns - The css value.\n */\n private _ttmlToCssUnits(ttmlUnits: string, width: boolean, contextRect?: IClientDimension): string {\n let cssUnits = ttmlUnits;\n\n if (ttmlUnits) {\n const unit = ttmlUnits.charAt(ttmlUnits.length - 1);\n\n // Need to special case handle ttml cell metrics.\n if (unit === 'c' || unit === '%') {\n const container = this.settings.rootContainerRegionDimensions\n ? this.settings.rootContainerRegionDimensions\n : this.settings.relatedMediaObjectRegion;\n const length = Number.parseFloat(ttmlUnits.substr(0, ttmlUnits.length - 1));\n let containerSize = width ? container!.width : container!.height;\n let value: number;\n\n if (unit === 'c') {\n const gridSize = width ? this.settings.cellResolution.columns : this.settings.cellResolution.rows;\n\n value = (length * containerSize) / gridSize;\n } else if (unit === '%') {\n // If % units calls also specify a contextRect use that instead of the container.\n if (contextRect) {\n containerSize = width ? contextRect.width : contextRect.height;\n }\n\n // Have to convert % to px because padding and vertical-align (displayAlign) are not\n // working together if the extent width/height are % instead of px.\n value = (containerSize * length) / 100;\n }\n\n // Round to 1 decimal place\n value = Math.round(value! * 10) / 10;\n cssUnits = `${value}px`;\n }\n }\n\n return cssUnits;\n }\n\n /**\n * Converts a ttml font size to a css one.\n * @param ttmlUnits - The ttml value.\n * @param width - Indicates whether to perform a width based or a height based conversion.\n * @param [scaleFactor] - The scale factor to use for conversion.\n * @param [isRegion] - Indicates whether or not the conversion is being done for a <region>.\n * @returns - The css value.\n */\n private _ttmlToCssFontSize(ttmlUnits: string, width: boolean, scaleFactor: number = 1, isRegion: boolean = false): string {\n let cssUnits = ttmlUnits;\n\n if (ttmlUnits) {\n const unit = ttmlUnits.charAt(ttmlUnits.length - 1);\n\n // Need to special case handle ttml cell metrics and % units.\n if (unit === 'c' || (isRegion && unit === '%')) {\n const container = this.settings.rootContainerRegionDimensions\n ? this.settings.rootContainerRegionDimensions\n : this.settings.relatedMediaObjectRegion;\n const length = Number.parseFloat(ttmlUnits.substr(0, ttmlUnits.length - 1));\n const containerSize = width ? container!.width : container!.height;\n const gridSize = width ? this.settings.cellResolution.columns : this.settings.cellResolution.rows;\n let value = (length * containerSize) / gridSize;\n\n if (unit === '%') {\n // Length is % so divide by 100.\n value /= 100;\n }\n\n // Apply the scale factor and limit to one decimal place precision.\n value = Math.floor(value * scaleFactor * 10) / 10;\n\n cssUnits = `${value}px`;\n }\n }\n\n return cssUnits;\n }\n\n /**\n * Converts a ttml text outline style value to a css one.\n * @param textOutline - The ttml value.\n * @param defaultColor - Default value of the outline color.\n * @returns - The css value.\n */\n private _ttmlToCssTextOutline(textOutline: string, defaultColor: string): string {\n let textShadow = 'none';\n\n if (!isNullOrWhiteSpace(textOutline) && textOutline !== 'none') {\n let parts: string[] = textOutline.split(/\\s+/);\n let color: string = '';\n let thickness: string = '';\n let blur: string = '';\n\n if (parts.length === 1) {\n color = defaultColor;\n thickness = parts[0];\n blur = '';\n } else if (parts.length === 3) {\n color = parts[0];\n thickness = parts[1];\n blur = parts[2];\n } else if (parts.length === 2) {\n const firstChar = parts[0].charAt(0);\n\n if (firstChar >= '0' && firstChar <= '9') {\n color = defaultColor;\n thickness = parts[0];\n blur = parts[1];\n } else {\n color = parts[0];\n thickness = parts[1];\n blur = '';\n }\n }\n\n // Spec doesn't qualify what % lengths mean so I'm going to assume it's % of a cell\n // and therefore use fontSize conversion method with the same scaleFactor applied\n // to fontSize since it's the font that we're outlining here.\n blur = this._ttmlToCssFontSize(blur, false, 0.75);\n thickness = this._ttmlToCssFontSize(thickness, false, 0.75);\n\n parts = <string[]>TtmlContext.lengthRegEx.exec(thickness);\n\n if (parts && parts.length === 3) {\n const width = Math.round(Number.parseFloat(parts[1]));\n const units = parts[2];\n\n textShadow = '';\n\n for (let x = -width; x <= width; x++) {\n for (let y = -width; y <= width; y++) {\n if (x !== 0 || y !== 0) {\n textShadow += format('{0}{4} {1}{4} {2} {3}, ', x, y, blur, TtmlContext._ttmlToCssColor(color), units);\n }\n }\n }\n\n if (textShadow) {\n textShadow = textShadow.substr(0, textShadow.length - 2);\n }\n }\n }\n\n return textShadow;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * TtmlTimeParser class.\n * @classdesc - The TtmlTimeParser class is used to parse ttml time expressions which can be absolute or relative.\n */\nexport class TtmlTimeParser {\n /**\n * @name - absoluteTimeRegex\n * Regex to parse absolute ttml times. (clock-time).\n * Hours \":\" minutes \":\" seconds ( fraction | \":\" frames ( \".\" sub-frames )? )?.\n * NOTE: (johnlemi) Our clocktime regex matches 1 or 2 digits for hours instead of 2 because even.\n * though the spec says 2 we have some existing ttml from the Office team with end attrs with 1 hour digit.\n * @static\n * @private\n * @type {string}\n */\n private static readonly absoluteTimeRegex: RegExp = /^(\\d+):(\\d{2}):(\\d{2})((\\.\\d+)|:(\\d{2,}(\\.\\d+)?))?$/;\n\n /**\n * @name - relativeTimeRegex\n * Regex to parse relative ttml times. (offset-time).\n * time-count fraction? metric.\n * @static\n * @private\n * @type {string}\n */\n private static readonly relativeTimeRegex: RegExp = /^(\\d+(\\.\\d+)?)(ms|[fhmst])$/;\n\n /**\n * @name - mediaFrameRate.\n * @description - mediaFrameRate.\n * @private\n * @type {string}\n */\n private readonly mediaFrameRate: number;\n\n /**\n * @name - mediaTickRate.\n * @description - mediaTickRate.\n * @private\n * @type {string}\n */\n private readonly mediaTickRate: number;\n\n /**\n * Constructor for the TtmlTimeParser class.\n * @param _mediaFrameRate - The ttml media frame rate.\n * @param _mediaTickRate - The ttml media tick rate.\n */\n public constructor(_mediaFrameRate: number, _mediaTickRate: number) {\n this.mediaFrameRate = _mediaFrameRate;\n this.mediaTickRate = _mediaTickRate;\n }\n\n /**\n * Parses a ttml time expression string into a number.\n * @param ttmlTime - The time expression to parse.\n * @returns - The number the time expression represents, or 0 if the exression doesn't match.\n */\n public parse(ttmlTime: string): number {\n if (!ttmlTime) {\n return 0;\n }\n\n const absoluteTime = TtmlTimeParser.absoluteTimeRegex.exec(ttmlTime);\n\n if (absoluteTime && absoluteTime.length > 3) {\n const hours = Number.parseInt(absoluteTime[1], 10) * 60 * 60;\n const minutes = Number.parseInt(absoluteTime[2], 10) * 60;\n const seconds = Number.parseInt(absoluteTime[3], 10);\n let subseconds = 0;\n\n if (absoluteTime[5]) {\n subseconds = Number.parseFloat(absoluteTime[4]) * 1000;\n }\n\n if (absoluteTime[6]) {\n subseconds = Math.round(Number.parseFloat(absoluteTime[6]) * this._getTimeUnitMultiplier('f'));\n }\n\n return (hours + minutes + seconds) * 1000 + subseconds;\n }\n\n const relativeTime = TtmlTimeParser.relativeTimeRegex.exec(ttmlTime);\n\n if (relativeTime && relativeTime.length > 3) {\n return Math.round(Number.parseFloat(relativeTime[1]) * this._getTimeUnitMultiplier(relativeTime[3]));\n }\n\n return 0;\n }\n\n /**\n * Converts a ttml time unit expression string into a multiplier number.\n * @param timeUnit - The time unit expression.\n * @returns - The multiplier value, or 0 if the unit exression doesn't match.\n */\n private _getTimeUnitMultiplier(timeUnit: string): number {\n switch (timeUnit) {\n case 'h':\n return 1000 * 60 * 60;\n case 'ms':\n return 1;\n case 'm':\n return 1000 * 60;\n case 's':\n return 1000;\n case 'f':\n return 1000 / this.mediaFrameRate;\n case 't':\n return 1000 / this.mediaTickRate;\n default:\n return 0;\n }\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { format, IDictionaryStringString, IGrid, nodeListToArray, trim } from '../utilities';\nimport { ITtmlContext, TtmlContext } from './ttml-context';\nimport { ITtmlSettings, TtmlSettings, xmlNS } from './ttml-settings';\nimport { TtmlTimeParser } from './ttml-time-parser';\n\n// Timed Text Markup Language (TTML).\n// See http://www.w3.org/TR/ttml1/ for more details.\n\n/**\n * @interface ITtmlEvent\n * @classdesc - The ITtmlEvent interface contract.\n * @export\n */\nexport interface ITtmlEvent {\n time: number;\n element?: Element;\n}\n\n/**\n * @interface ITtmlTimingBounds\n * @classdesc - The ITtmlTimingBounds interface contract.\n * @export\n */\ninterface ITtmlTimingBounds {\n start: number;\n end: number;\n}\n\n/**\n *\n * The TtmlParser class.\n *\n */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class TtmlParser {\n /**\n * @name - mediaStart\n * Used as the start time for applyTiming when applying to the entire document.\n * @static\n * @private\n * @type {number}\n */\n private static readonly mediaStart: number = -1;\n\n /**\n * @name - mediaEnd\n * Used as the end time for applyTiming when applying to the entire document.\n * Picking a number that should always be greater than any real media end time.\n * @static\n * @private\n * @type {number}\n */\n private static readonly mediaEnd: number = 99_999_999;\n\n /**\n * Gets the local tagName of a Node.\n * @param node - The node to get the tagName of.\n * @returns - The tagName.\n */\n public static getLocalTagName(node: Node): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (<Element>node).localName || (<any>node).baseName;\n }\n\n /**\n * Gets the value of a namespaced attribute. First tries element.getAttributeNS() but falls back\n * to scanning each attribute if that fails.\n * If you know which cases go into the fallback code please document it here.\n * @param element - The element to get the attribute of.\n * @param name - The attribute name.\n * @param namespace - The attribute namespace.\n * @returns - The attribute value. Or an empty string if a matching attribute is not found.\n */\n public static getAttributeNS(element: Element, name: string, namespace: string): string {\n let result = element.getAttributeNS(namespace, name);\n\n if (!result) {\n // Go through all the attributes looking for a match.\n for (const attribute of nodeListToArray(element.attributes)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((<any>attribute).localName === name && attribute.lookupNamespaceURI((<any>attribute).prefix) === namespace) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n result = (<any>attribute).value;\n break;\n }\n }\n }\n\n return result!;\n }\n\n /**\n * Parses a ttml document and builds a ttmlContext instance from it.\n * @param ttmlDocument - The ttml document to parse.\n * @param settingsOverrides - The ttml settings overrides to use.\n * @returns - The resulting ttmlContext instance that can be used to get cues by time.\n */\n public static parse(ttmlDocument: XMLDocument, settingsOverrides: ITtmlSettings): ITtmlContext {\n ttmlDocument = typeof ttmlDocument === 'string' ? TtmlParser._parseXml(ttmlDocument) : ttmlDocument;\n\n const ttmlContext = new TtmlContext();\n\n // Start initializing the context.\n ttmlContext.settings = new TtmlSettings(settingsOverrides);\n ttmlContext.root = TtmlParser._verifyRoot(ttmlDocument, ttmlContext);\n ttmlContext.body = TtmlParser._getFirstElementByTagNameNS(ttmlContext.root, 'body', ttmlContext.settings.ttmlNamespace);\n ttmlContext.events = [];\n ttmlContext.styleSetCache = [];\n\n if (ttmlContext.body) {\n // Parse the root <tt> attributes.\n TtmlParser._parseTtAttrs(ttmlContext);\n\n // Set up our regions.\n const head = TtmlParser._ensureRegions(ttmlContext);\n\n const timeBase =\n TtmlParser.getAttributeNS(ttmlContext.root, 'timeBase', ttmlContext.settings.ttmlParameterNamespace) || 'media';\n\n if (ttmlContext.settings.supportedTimeBase.includes(timeBase)) {\n // Process textnodes into anonymous spans.\n TtmlParser._processAnonymousSpans(ttmlContext, ttmlContext.body);\n\n const timeParser = new TtmlTimeParser(ttmlContext.settings.mediaFrameRate, ttmlContext.settings.mediaTickRate);\n\n // Apply the intervals over the tree.\n TtmlParser._applyTiming(\n ttmlContext,\n ttmlContext.root,\n { start: TtmlParser.mediaStart, end: TtmlParser.mediaEnd },\n true,\n timeParser\n );\n\n // Apply the style inheritance over the tree.\n TtmlParser._applyStyling(ttmlContext, head);\n }\n\n // Add an dummy end event for the captions to appear until end of video.\n // Not sure why we need to do this, please add to this comment if you know.\n ttmlContext.events.push({ time: TtmlParser.mediaEnd, element: undefined });\n\n // Sort events into temporal order.\n ttmlContext.events.sort((event1: ITtmlEvent, event2: ITtmlEvent) => {\n return event1.time - event2.time;\n });\n }\n\n return ttmlContext;\n }\n\n /**\n * Applies the elements inline styles into the styleSet.\n * @param settings - The TtmlSettings for this document.\n * @param styleSet - The styleSet to build upon.\n * @param element - The element to apply the styles of.\n */\n public static applyInlineStyles(settings: TtmlSettings, styleSet: IDictionaryStringString, element: Element): void {\n for (const attribute of nodeListToArray(element.attributes)) {\n if (attribute.namespaceURI === settings.ttmlStyleNamespace) {\n // Trim() because we see lots of ttml attribute values with trailing space...\n styleSet[TtmlParser.getLocalTagName(attribute)] = trim(attribute.nodeValue!);\n }\n }\n }\n\n /**\n * Parses an xml document in string format to an XMLDocument.\n * @param xmlString - The xml string to parse.\n * @returns - The resulting XMLDocument, or null if the xml string failed to parse.\n */\n private static _parseXml(xmlString: string): XMLDocument {\n let xml: XMLDocument;\n\n if (window.DOMParser) {\n const domParser = new window.DOMParser();\n xml = domParser.parseFromString(xmlString, 'application/xml');\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const domParser = new (<any>window).ActiveXObject('Microsoft.XMLDOM');\n domParser.async = false;\n domParser.loadXML(xmlString);\n xml = <XMLDocument>domParser;\n }\n return xml;\n }\n\n /**\n * Verifies that root <tag> of the specified document is the expected ttml <tt> tagName and\n * updates the settings namespaces from it if they are non standard.\n * @param ttmlDocument - The ttml document to verify.\n * @param ttmlContext - The ttmlContext for this document.\n * @returns - The valid root Element, or or null if the root Element was not valid.\n */\n private static _verifyRoot(ttmlDocument: XMLDocument, ttmlContext: TtmlContext): Element {\n let root: Element;\n const candidate = ttmlDocument.documentElement;\n\n if (TtmlParser.getLocalTagName(candidate) === 'tt') {\n if (candidate.namespaceURI !== 'http://www.w3.org/ns/ttml') {\n ttmlContext.settings.ttmlNamespace = candidate.namespaceURI!;\n ttmlContext.settings.ttmlStyleNamespace = `${ttmlContext.settings.ttmlNamespace}#styling`;\n ttmlContext.settings.ttmlParameterNamespace = `${ttmlContext.settings.ttmlNamespace}#parameter`;\n ttmlContext.settings.ttmlMetaNamespace = `${ttmlContext.settings.ttmlNamespace}#metadata`;\n }\n\n root = candidate;\n }\n\n return root!;\n }\n\n /**\n * Parses the <tt> tag attributes and initializes ttmlContext properties from them.\n * @param ttmlContext - The ttmlContext for this document.\n */\n private static _parseTtAttrs(ttmlContext: TtmlContext): void {\n const cellRes = TtmlParser.getAttributeNS(ttmlContext.root, 'cellResolution', ttmlContext.settings.ttmlParameterNamespace);\n const extent = TtmlParser.getAttributeNS(ttmlContext.root, 'extent', ttmlContext.settings.ttmlStyleNamespace);\n let cellGrid: IGrid | null = null;\n\n if (cellRes) {\n const parts = trim(cellRes).split(/\\s+/);\n\n if (parts.length === 2) {\n const columns = Math.round(Number.parseFloat(parts[0]));\n const rows = Math.round(Number.parseFloat(parts[1]));\n\n if (rows > 0 && columns > 0) {\n cellGrid = { rows, columns };\n }\n }\n }\n\n if (cellGrid) {\n ttmlContext.settings.cellResolution = cellGrid;\n }\n\n if (extent) {\n if (extent !== 'auto') {\n // Get the individual components.\n const coords = extent.split(/\\s+/);\n\n if (\n coords.length === 2 &&\n coords[0].substr(coords[0].length - 2) === 'px' &&\n coords[1].substr(coords[1].length - 2) === 'px'\n ) {\n const width = Number.parseFloat(coords[0].substr(0, coords[0].length - 2));\n const height = Number.parseFloat(coords[1].substr(0, coords[1].length - 2));\n\n // Round to integer.\n ttmlContext.settings.rootContainerRegionDimensions = { width: Math.round(width), height: Math.round(height) };\n }\n }\n }\n }\n\n /**\n * Ensures we have the elements/regions we require by either finding them or creating them if they are not present.\n * @param ttmlContext - The ttmlContext for this document.\n * @returns - The <head> element.\n */\n private static _ensureRegions(ttmlContext: TtmlContext): Element {\n // Create our rootContainerRegion\n ttmlContext.rootContainerRegion = ttmlContext.root.ownerDocument.createElementNS(\n ttmlContext.settings.ttmlNamespace,\n 'rootcontainerregion'\n );\n\n ttmlContext.root.appendChild(ttmlContext.rootContainerRegion);\n\n const extents = ttmlContext.settings.rootContainerRegionDimensions\n ? format(\n '{0}px {1}px',\n ttmlContext.settings.rootContainerRegionDimensions.width,\n ttmlContext.settings.rootContainerRegionDimensions.height\n )\n : 'auto';\n\n ttmlContext.rootContainerRegion.setAttributeNS(ttmlContext.settings.ttmlStyleNamespace, 'extent', extents);\n\n let head = TtmlParser._getFirstElementByTagNameNS(ttmlContext.root, 'head', ttmlContext.settings.ttmlNamespace);\n\n // Ensure we have a <head>\n if (!head) {\n // No <head> so we need to create that now.\n head = ttmlContext.root.ownerDocument.createElementNS(ttmlContext.settings.ttmlNamespace, 'head');\n ttmlContext.root.appendChild(head);\n }\n\n // Ensure we have a <layout>\n ttmlContext.layout = TtmlParser._getFirstElementByTagNameNS(head, 'layout', ttmlContext.settings.ttmlNamespace);\n\n if (!ttmlContext.layout) {\n // No <layout> so we need to create that now.\n ttmlContext.layout = ttmlContext.root.ownerDocument.createElementNS(ttmlContext.settings.ttmlNamespace, 'layout');\n ttmlContext.root.appendChild(ttmlContext.layout);\n }\n\n // Create an anonymous region if we have no regions.\n const regions = ttmlContext.layout.getElementsByTagNameNS(ttmlContext.settings.ttmlNamespace, 'region');\n\n if (!regions.length) {\n const anonymousRegion = ttmlContext.root.ownerDocument.createElementNS(ttmlContext.settings.ttmlNamespace, 'region');\n\n anonymousRegion.setAttributeNS(xmlNS, 'id', 'anonymous');\n anonymousRegion.setAttribute('data-isanonymous', '1');\n ttmlContext.layout.appendChild(anonymousRegion);\n\n ttmlContext.body.setAttributeNS(ttmlContext.settings.ttmlNamespace, 'region', 'anonymous');\n }\n\n return head;\n }\n\n /**\n * Recurses through all the <p> elements in the document and groups all the contiguous TEXT_NODES together into <span>'s.\n * @param ttmlContext - The ttmlContext for this document.\n * @param element - The element to process the TEXT_NODES of.\n */\n private static _processAnonymousSpans(ttmlContext: TtmlContext, element: Element): void {\n // If this element is <p> then group all contiguous textnodes together in <span>\n if (TtmlParser._isTagNS(element, 'p', ttmlContext.settings.ttmlNamespace)) {\n const textNodeGroups: Node[][] = [];\n let prevNodeType: number = 0;\n\n for (const child of nodeListToArray(element.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n if (prevNodeType !== Node.TEXT_NODE) {\n textNodeGroups.push([]);\n }\n\n textNodeGroups[textNodeGroups.length - 1].push(child);\n }\n\n prevNodeType = child.nodeType;\n }\n\n for (const group of textNodeGroups) {\n const anonSpan = ttmlContext.root.ownerDocument.createElementNS(ttmlContext.settings.ttmlNamespace, 'span');\n\n anonSpan.appendChild(group[0].parentNode!.replaceChild(anonSpan, group[0]));\n\n for (let index = 1; index < group.length; index++) {\n anonSpan.appendChild(group[index]);\n }\n }\n }\n\n // Then recurse through the contents doing the same thing for those.\n for (const child of nodeListToArray<Element>(element.childNodes)) {\n this._processAnonymousSpans(ttmlContext, child);\n }\n }\n\n /**\n * Recurses through the document element tree to determine the absolute start and end times of all the elements\n * using the TTML subset of the SMIL timing model. The reference times passed in 'bound' are absolute times.\n * The result of calling this is to set the local start time and end time to absolute times between these two\n * reference times, based on the begin, end and dur attributes and to recursively set all of the children.\n * @param ttmlContext - The ttmlContext for this document.\n * @param element - The element to apply the timing to.\n * @param bound - The bounds for the timing.\n * @param isParallelContext - Indicates whether or not this element is in a parallel timing context.\n * @param timeParser - The TtmlTimeParser to use to parse this elements time attributes.\n */\n private static _applyTiming(\n ttmlContext: TtmlContext,\n element: Element,\n bound: ITtmlTimingBounds,\n isParallelContext: boolean,\n timeParser: TtmlTimeParser\n ): void {\n const beginAttribute = TtmlParser.getAttributeNS(element, 'begin', ttmlContext.settings.ttmlNamespace);\n let startTime = beginAttribute ? timeParser.parse(beginAttribute) : bound.start;\n let endTime = 0;\n\n // Compute the simple duration of the interval.\n let duration = 0;\n let end = 0;\n const durationAttribute = TtmlParser.getAttributeNS(element, 'dur', ttmlContext.settings.ttmlNamespace);\n const endAttribute = TtmlParser.getAttributeNS(element, 'end', ttmlContext.settings.ttmlNamespace);\n\n if (!durationAttribute && !endAttribute) {\n // No direct timing attested, so use default based on context.\n // Parallel children have indefinite default duration, truncated by bounds.\n if (isParallelContext) {\n // Sequential children have zero default duration.\n if (startTime <= bound.end) {\n endTime = bound.end;\n } else {\n endTime = 0;\n }\n }\n } else if (durationAttribute && endAttribute) {\n // Both duration and end attested, the minimum interval applies.\n duration = timeParser.parse(durationAttribute);\n end = timeParser.parse(endAttribute);\n const minEnd = Math.min(startTime + duration, bound.start + end);\n endTime = Math.min(minEnd, bound.end);\n } else if (endAttribute) {\n // Only end attested.\n end = timeParser.parse(endAttribute);\n endTime = Math.min(bound.start + end, bound.end);\n } else {\n // Only dur attested.\n duration = timeParser.parse(durationAttribute);\n endTime = Math.min(startTime + duration, bound.end);\n }\n\n if (endTime < startTime) {\n endTime = startTime;\n }\n\n startTime = Math.floor(startTime);\n endTime = Math.floor(endTime);\n\n element.setAttribute('data-time-start', startTime.toString());\n element.setAttribute('data-time-end', endTime.toString());\n\n if (\n startTime >= 0 &&\n ttmlContext.events.filter(event => {\n return event.time === startTime;\n }).length <= 0\n ) {\n ttmlContext.events.push({ time: startTime, element });\n }\n\n let start = startTime;\n\n for (const child of nodeListToArray<Element>(element.childNodes)) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n // Parallel is the default so null is OK here.\n if (TtmlParser.getAttributeNS(element, 'timeContainer', ttmlContext.settings.ttmlNamespace) !== 'seq') {\n this._applyTiming(ttmlContext, child, { start: startTime, end: endTime }, true, timeParser);\n } else {\n this._applyTiming(ttmlContext, child, { start, end: endTime }, false, timeParser);\n start = Number.parseInt(child.getAttribute('data-time-end')!, 10);\n }\n }\n }\n }\n\n /**\n * Recurses through all the elements in <head> applying the ttml sytling to them based on the <style>'s.\n * @param ttmlContext - The ttmlContext for this document.\n * @param head - The element to process the TEXT_NODES of.\n */\n private static _applyStyling(ttmlContext: TtmlContext, head: Element): void {\n // First find all the <style>'s\n const styling = TtmlParser._getFirstElementByTagNameNS(head, 'styling', ttmlContext.settings.ttmlNamespace);\n const styles = styling ? nodeListToArray(styling.getElementsByTagNameNS(ttmlContext.settings.ttmlNamespace, 'style')) : [];\n\n // Apply the styles to every element in the body\n for (const element of nodeListToArray(ttmlContext.root.querySelectorAll('*'))) {\n this._applyStyle(ttmlContext, element, <Element[]>styles);\n }\n }\n\n /**\n * Applies the ttml styling to the specified element.\n * Apply styles in the correct order to element by building a styleSet, adding it\n * to the stlyeSetCache, and the adding reference to the cached styleSet to the element.\n * @param ttmlContext - The ttmlContext for this document.\n * @param element - The element to apply the ttml styling to.\n * @param styles - The set of styles to apply.\n */\n private static _applyStyle(ttmlContext: TtmlContext, element: Element, styles: Element[]): void {\n const styleSet: IDictionaryStringString = {};\n\n // Find all the applicable styles and set them as properties on styleSet.\n this._applyStylesheet(ttmlContext.settings, styleSet, element, styles);\n TtmlParser.applyInlineStyles(ttmlContext.settings, styleSet, element);\n\n let empty = true;\n\n for (const style in styleSet) {\n // Just need to see if there's at least one.\n if (styleSet.hasOwnProperty(style)) {\n empty = false;\n break;\n }\n }\n\n if (!empty) {\n // Record the applied set to the element.\n element.setAttribute('data-styleSet', ttmlContext.styleSetCache.length.toString());\n ttmlContext.styleSetCache.push(styleSet);\n }\n }\n\n /**\n * For each style id on the element, find the corresponding style element and then\n * apply the stylesheet into styleset; this recurses over the tree of referenced styles.\n * @param settings - The TtmlSettings for this document.\n * @param styleSet - The styleSet to build upon.\n * @param element - The element to apply the styles of.\n * @param styles - The set of styles to apply.\n */\n private static _applyStylesheet(settings: TtmlSettings, styleSet: IDictionaryStringString, element: Element, styles: Element[]): void {\n // Find all the style ID references.\n const styleAttribute = TtmlParser.getAttributeNS(element, 'style', settings.ttmlNamespace);\n const ids = styleAttribute ? styleAttribute.split(/\\s+/) : [];\n\n for (const styleId of ids) {\n for (const style of styles) {\n // Filter on those whose id is the one we want.\n if (TtmlParser.getAttributeNS(style, 'id', xmlNS) === styleId) {\n // Recurse into its style references.\n this._applyStylesheet(settings, styleSet, style, styles);\n\n // Do inline styles.\n TtmlParser.applyInlineStyles(settings, styleSet, style);\n }\n }\n }\n\n // If the element is a region do nested styles. NOTE regions can only be referenced from elements in the body.\n if (TtmlParser._isTagNS(element, 'region', settings.ttmlNamespace)) {\n // Find all the style elements in the TTML namespace.\n for (const style of nodeListToArray(element.getElementsByTagNameNS(settings.ttmlNamespace, 'style'))) {\n TtmlParser.applyInlineStyles(settings, styleSet, <Element>style);\n }\n }\n }\n\n /**\n * Determines whether or not the namespace and local tagName of an element matches\n * the specified namespace and tag name.\n * @param element - The node to compare against.\n * @param tagName - The tag name.\n * @param namespace - The attribute namespace.\n * @returns - True if the elements ns/tagName match, otherwise false.\n */\n private static _isTagNS(element: Element, tagName: string, namespace: string): boolean {\n return element.namespaceURI === namespace && this.getLocalTagName(element) === tagName;\n }\n\n /**\n * Gets the first matching element that matches the specified tagName and namespace.\n * @param context - The context to search within.\n * @param tagName - The tagName to match.\n * @param namespace - The namespace to match.\n * @returns - The first matching element found, or null if there are no matches.\n */\n private static _getFirstElementByTagNameNS(context: Element, tagName: string, namespace: string): Element {\n let result: Element;\n if (context) {\n const matches = context.getElementsByTagNameNS(namespace, tagName);\n\n if (matches && matches.length) {\n result = matches[0];\n }\n }\n\n return result!;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { ICurrentClosedCaptionsSettings } from '../data';\nimport {\n css,\n format,\n getDimensions,\n IDictionaryStringString,\n PlayerUtility,\n removeInnerHtml,\n selectElements,\n selectFirstElement\n} from '../utilities';\nimport { IClosedCaptionsProps } from './closed-captions-props';\nimport { ITtmlContext } from './ttml-context';\nimport { TtmlParser } from './ttml-parser';\nimport { ITtmlSettings } from './ttml-settings';\nimport { closedCaptionsSettingsMap, closedCaptionsSettingsOptions } from './video-closed-captions-settings';\n\n/**\n *\n * ClosedCaptions React component for video player.\n *\n */\nexport default class ClosedCaptions extends React.Component<IClosedCaptionsProps> {\n /**\n * @name - currentSettings\n * @description - The current closed captions settings.\n * @private\n * @type {IDictionaryStringString}\n */\n public currentSettings: ICurrentClosedCaptionsSettings | undefined;\n\n /**\n * @name - userPreferences\n * @description - The user preference overrides for the closed captions.\n * @static\n * @public\n * @type {ICcUserPreferences}\n */\n private userPreferences: ICcUserPreferences = {\n text: {},\n window: {}\n };\n\n private readonly closedCaptionDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n /**\n * @name - lastPlayPosition\n * @description - The last player position passed to updateCaptions.\n * This is used to call updateCaptions again when the cc language is changed.\n * Play could be paused at that time.\n * @private\n * @type {number}\n */\n private lastPlayPosition: number = 0;\n\n /**\n * @name - ttmlContext\n * @description - The ttmlContext for the current ttml document.\n * @private\n * @type {ITtmlContext}\n */\n private ttmlContext: ITtmlContext | null = null;\n\n public constructor(props: IClosedCaptionsProps) {\n super(props);\n this.resetCaptions();\n this.clicked = this.clicked.bind(this);\n }\n\n public render(): JSX.Element {\n const { className } = this.props;\n const closedCaptionDivStyle = {\n bottom: this.props.isVideoControlVisible ? '2.5em' : '0',\n transition: 'bottom 0.5s ease-in 0s'\n };\n return (\n <div\n role='none'\n className={className}\n ref={this.closedCaptionDiv}\n aria-hidden={!this.props.showClosedCaptions}\n style={closedCaptionDivStyle}\n onClick={this.clicked}\n />\n );\n }\n\n public clicked(): void {\n this.props.onClosedCaptionClick();\n }\n\n public componentDidMount(): void {\n if (this.props.ccURL) {\n this._setCcLanguage(this.props.ccURL);\n }\n window &&\n window.addEventListener('resize', () => {\n if (this.props.showClosedCaptions) {\n this.updateCaptions(this.props.currentTime);\n }\n });\n }\n\n public shouldComponentUpdate(nextProps: IClosedCaptionsProps): boolean {\n let shouldRender = false;\n if (nextProps.showClosedCaptions || this.props.showClosedCaptions !== nextProps.showClosedCaptions) {\n shouldRender = true;\n }\n return shouldRender;\n }\n\n public componentWillUnmount(): void {\n window &&\n window.removeEventListener('resize', () => {\n if (this.props.showClosedCaptions) {\n this.updateCaptions(this.props.currentTime);\n }\n });\n }\n\n public componentDidUpdate(prevProps: IClosedCaptionsProps): void {\n if (this.props.showClosedCaptions) {\n if (prevProps.ccLanguage! !== this.props.ccLanguage!) {\n if (this.props.ccURL) {\n this._setCcLanguage(this.props.ccURL);\n }\n }\n this.applySettings();\n this.resetCaptions();\n this.updateCaptions(this.props.currentTime);\n if (prevProps.isVideoControlVisible !== this.props.isVideoControlVisible) {\n this.applySettings();\n this.resetCaptions();\n\n // Setting up a delay so that right height and width is calculated\n window.setTimeout(() => {\n this.updateCaptions(this.props.currentTime);\n }, 500);\n }\n }\n }\n\n /**\n * Displays a mocked caption container with content, used to show the caption preset preview.\n */\n public showSampleCaptions(): void {\n this.ttmlContext = null;\n const mockCaptions: XMLDocument = new DOMParser().parseFromString(\n `<?xml version='1.0' encoding='utf-8'?>\n<tt xml:lang='en-us' xmlns='http://www.w3.org/ns/ttml' xmlns:tts='http://www.w3.org/ns/ttml#styling'\nxmlns:ttm='http://www.w3.org/ns/ttml#metadata'>\n <head>\n <metadata>\n <ttm:title>Media.wvx.aib</ttm:title>\n <ttm:copyright>Copyright (c) 2013 Microsoft Corporation. All rights reserved.</ttm:copyright>\n </metadata>\n <styling>\n <style xml:id='Style1' tts:fontFamily='proportionalSansSerif' tts:fontSize='0.8c' tts:textAlign='center'\n tts:color='white' />\n </styling>\n <layout>\n <region style='Style1' xml:id='CaptionArea' tts:origin='0c 12.6c' tts:extent='32c 2.4c'\n tts:backgroundColor='rgba(0,0,0,160)' tts:displayAlign='center' tts:padding='0.3c 0.5c' />\n </layout>\n </head>\n <body region='CaptionArea'>\n <div>\n <p begin='00:00:01.140' end='99:99:99.999'>EXAMPLE CAPTIONS!</p>\n </div>\n </body>\n</tt>`,\n 'text/xml'\n );\n\n this._onClosedCaptionsLoaded(mockCaptions);\n const dimensions = getDimensions(this.closedCaptionDiv.current!);\n this.ttmlContext!.updateRelatedMediaObjectRegion(dimensions!);\n this.closedCaptionDiv.current!.style.bottom = '2.5rem';\n }\n\n /**\n * Update the captionContainer with the captions that correspond to the current time.\n * @param playPosition - The video's play position to sync the captions to.\n */\n public updateCaptions(playPosition: number): void {\n let output: string = '';\n this.lastPlayPosition = playPosition;\n\n if (this.ttmlContext && this.ttmlContext.hasEvents()) {\n const tick = Math.floor(playPosition * 1000);\n\n const dimensions = getDimensions(this.closedCaptionDiv.current!);\n if (this.ttmlContext.updateRelatedMediaObjectRegion(dimensions!)) {\n // Call resetCaptions to force an update since the relatedMediaObjectRegion size has changed.\n this.resetCaptions();\n }\n\n if (this.ttmlContext.updateCurrentEvents(tick)) {\n removeInnerHtml(this.closedCaptionDiv.current!);\n\n for (const cue of this.ttmlContext.getCues(tick)) {\n this._applyUserPreferencesOverrides(cue);\n\n // Background color is not honored in high contrast mode,\n // thus remove it from this wrapper div to avoid video not getting displayed in high contrast mode\n // with close captions enabled\n css(cue, 'background-color', '');\n output = cue.outerHTML;\n }\n\n this.closedCaptionDiv.current!.innerHTML = output;\n }\n }\n }\n\n /**\n * Resets the ttml caption container.\n * This should be called when user preferences change.\n */\n public resetCaptions(): void {\n if (this.ttmlContext) {\n this.ttmlContext.resetCurrentEvents();\n }\n\n if (this.closedCaptionDiv.current!) {\n removeInnerHtml(this.closedCaptionDiv.current!);\n }\n this.applySettings();\n }\n\n /**\n * Applies the closed captions settings.\n */\n public applySettings(): void {\n const prefs: IDictionaryStringString = {};\n\n const currentSettings = this.props.tempClosedCaptionsSettings\n ? this.props.tempClosedCaptionsSettings\n : this.props.currentClosedCaptionsSettings;\n\n for (const settingKey in currentSettings) {\n if (currentSettings.hasOwnProperty(settingKey)) {\n const optionValue = this._getOptionValue(settingKey, currentSettings[settingKey]);\n\n if (optionValue) {\n prefs[settingKey] = `${closedCaptionsSettingsMap[settingKey].value}${optionValue}`;\n }\n }\n }\n\n this.userPreferences.text = this._getPrefsCss(prefs, 'text');\n this.userPreferences.window = this._getPrefsCss(prefs, 'window');\n }\n\n /**\n * Loads the close captioning ttml file.\n * @param href - The cc href.\n */\n private _loadClosedCaptions(href: string): void {\n PlayerUtility.ajax(\n href,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (result: any) => {\n this._onClosedCaptionsLoaded(result);\n },\n () => {\n if (this.props.errorCallback) {\n this.props.errorCallback({\n errorType: 'Player.error.loadClosedCaptions.ajax',\n errorDesc: `Ajax call failed: ' ${href}`\n });\n }\n }\n );\n }\n\n /**\n * Close captioning ttml file loaded handler.\n * @param ttmlDocument - The ttml document containing the closed captions.\n */\n private _onClosedCaptionsLoaded(ttmlDocument: XMLDocument): void {\n if (!ttmlDocument) {\n if (this.props.errorCallback) {\n this.props.errorCallback({\n errorType: 'Player.error.onClosedCaptionsLoaded.ttmlDoc',\n errorDesc: 'No ttmlDocument found'\n });\n }\n return;\n }\n\n // This.closedCaptionDiv.current!.setAttribute(ClosedCaptions.ariaHidden, 'false');\n\n const id = this.closedCaptionDiv.current!.id ? `${this.closedCaptionDiv.current!.id} '-'` : '';\n const settingsOverrides: ITtmlSettings = {\n idPrefix: id,\n fontMap: { default: 'Segoe ui, Arial' },\n relatedMediaObjectRegion: getDimensions(this.closedCaptionDiv.current!)\n };\n\n try {\n this.ttmlContext = TtmlParser.parse(ttmlDocument, settingsOverrides);\n\n if (this.ttmlContext) {\n this.ttmlContext.setOwnerDocument(this.closedCaptionDiv.current!.ownerDocument);\n\n if (this.ttmlContext.hasEvents()) {\n this.updateCaptions(this.lastPlayPosition);\n }\n }\n } catch (error) {\n if (this.props.errorCallback) {\n this.props.errorCallback({\n errorType: 'Player.error.onClosedCaptionsLoaded.ttmlParser',\n errorDesc: `'TtmlDocument parser error: ' ${error.message}`\n });\n }\n }\n }\n\n /**\n * Applies user preference overrides to the specified cue.\n * @param cue - The cue to apply any overrides to.\n */\n private _applyUserPreferencesOverrides(cue: HTMLElement): void {\n if (!this.userPreferences) {\n return;\n }\n\n if (this.userPreferences.text) {\n for (const element of selectElements('span, br', cue)) {\n for (const property in this.userPreferences.text) {\n if (this.userPreferences.text.hasOwnProperty(property)) {\n css(element, property, this.userPreferences.text[property]);\n }\n }\n }\n }\n\n if (this.userPreferences.window) {\n const winElement: HTMLElement | null = selectFirstElement('p', cue);\n if (winElement) {\n for (const property in this.userPreferences.window) {\n if (this.userPreferences.window.hasOwnProperty(property)) {\n css(winElement, property, this.userPreferences.window[property]);\n }\n }\n }\n }\n }\n\n /**\n * Updates the component if there is any change to its underlying DOM.\n * @param href - The ttml href.\n */\n private _setCcLanguage(href: string): void {\n this.ttmlContext = null;\n this.resetCaptions();\n if (!href) {\n return;\n }\n this._loadClosedCaptions(href);\n }\n\n /**\n * Gets the value of closed captions settings option.\n * @param settingKey - The closed ceptions settings key.\n * @param optionKey - The closed captions option key.\n */\n private _getOptionValue(settingKey: string, optionKey: string): string {\n const setting = closedCaptionsSettingsMap[settingKey];\n if (setting) {\n const option = closedCaptionsSettingsOptions[setting.option];\n return option && option.map[optionKey];\n }\n return '';\n }\n\n /**\n * Gets the css for the preferences.\n * @param prefs - The preferences to get css for.\n * @param prefix - The closed captions type (text/window).\n */\n private _getPrefsCss(prefs: IDictionaryStringString, prefix: string): IDictionaryStringString {\n const prefsCss: IDictionaryStringString = {};\n\n // First store all the non-transparency values\n for (const pref in prefs) {\n if (prefs.hasOwnProperty(pref)) {\n const propVal = prefs[pref];\n\n if (pref.startsWith(prefix) && !pref.includes('opacity')) {\n if (propVal && propVal.length > 0) {\n const styles = propVal.split(';');\n\n for (const style of styles) {\n const pVal = style.split(':');\n\n if (pVal.length > 1) {\n prefsCss[pVal[0].trim()] = pVal[1].trim();\n }\n }\n }\n }\n }\n }\n\n // Then go through all the transparency values and\n // map them onto their non-transparent color counterparts\n for (const pref in prefs) {\n if (prefs.hasOwnProperty(pref)) {\n const propVal = prefs[pref];\n if (pref.startsWith(prefix) && pref.indexOf('opacity') > 0) {\n const pVal = propVal.split(':');\n\n if (pVal.length > 1) {\n const colorValue = prefsCss[pVal[0].trim()];\n const opacityValue = pVal[1].trim();\n prefsCss[pVal[0].trim()] = this._formatAsRgba(colorValue, opacityValue);\n }\n }\n }\n }\n\n return prefsCss;\n }\n\n /**\n * Formats the color value from css to rgba value.\n * @param cssColor - The css color value.\n * @param opacity - The opacity value.\n * @returns - The Rgb.\n */\n private _formatAsRgba(cssColor: string, opacity: string): string {\n let result = format('rgba(0,0,0,{0})', opacity);\n const colorStart = cssColor ? cssColor.indexOf('#') : -1;\n\n if (colorStart >= 0) {\n const fullColorString = cssColor.substr(colorStart + 1);\n const colorLenght = fullColorString.length / 3;\n\n if (colorLenght > 0) {\n const red = Number.parseInt(fullColorString.substr(0, colorLenght), 16);\n const green = Number.parseInt(fullColorString.substr(colorLenght, colorLenght), 16);\n const blue = Number.parseInt(fullColorString.substr(colorLenght * 2, colorLenght), 16);\n result = format('rgba({0},{1},{2},{3})', red, green, blue, opacity);\n }\n }\n\n return result;\n }\n}\n\n/**\n * @interface ICcUserPreferences\n * @classdesc - Describes the closed caption user preferences data structure.\n */\nexport interface ICcUserPreferences {\n text: IDictionaryStringString;\n window: IDictionaryStringString;\n}\n","'use strict';\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar getMethod = require('../internals/get-method');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar fails = require('../internals/fails');\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\nvar MAX_UINT32 = 0xFFFFFFFF;\nvar min = Math.min;\nvar push = uncurryThis([].push);\nvar stringSlice = uncurryThis(''.slice);\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nvar BUGGY = 'abbc'.split(/(b)*/)[1] === 'c' ||\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n 'test'.split(/(?:)/, -1).length !== 4 ||\n 'ab'.split(/(?:ab)*/).length !== 2 ||\n '.'.split(/(.?)(.?)/).length !== 4 ||\n // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length;\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit = '0'.split(undefined, 0).length ? function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : call(nativeSplit, this, separator, limit);\n } : nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.es/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = isNullOrUndefined(separator) ? undefined : getMethod(separator, SPLIT);\n return splitter\n ? call(splitter, separator, O, limit)\n : call(internalSplit, toString(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (string, limit) {\n var rx = anObject(this);\n var S = toString(string);\n\n if (!BUGGY) {\n var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n }\n\n var C = speciesConstructor(rx, RegExp);\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (UNSUPPORTED_Y ? 'g' : 'y');\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return regExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;\n var z = regExpExec(splitter, UNSUPPORTED_Y ? stringSlice(S, q) : S);\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n push(A, stringSlice(S, p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n push(A, z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n push(A, stringSlice(S, p));\n return A;\n }\n ];\n}, BUGGY || !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, IImageData } from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport enum SocialMedia {\n Facebook = 'facebook',\n Twitter = 'twitter',\n Pinterest = 'pinterest',\n Mail = 'mail',\n Linkedin = 'linkedin',\n Customization = 'customization'\n}\n\nexport interface ISocialMediaProps extends IComponentProps<{}> {\n src?: IImageData;\n postUrl: string;\n postTitle?: string;\n socialMedia: SocialMedia;\n socialShareURL?: string;\n socialMediaName?: string;\n}\n\nexport interface ISocialMediaComponent extends IComponent<ISocialMediaProps> {}\n\n/**\n *\n * SocialMedia component.\n * @extends {React.FC<ISocialMediaProps>}\n */\n\nexport const SocialMediaComponent: React.FC<ISocialMediaProps> = props => {\n const openWindowFunc = (event: React.MouseEvent<HTMLElement>) => {\n setShareLinks(props);\n };\n const src = props.src && props.src.src;\n return (\n <img\n onClick={openWindowFunc}\n src={src}\n alt={props.socialMediaName || props.socialMedia}\n title={props.socialMediaName || props.socialMedia}\n />\n );\n};\n\nconst setShareLinks = (props: React.PropsWithChildren<ISocialMediaProps>): void => {\n const pageUrl = encodeURIComponent(props.postUrl);\n const mediaImage = document.getElementsByName('twitter:image')[0].getAttribute('content');\n let url: string | undefined;\n switch (props.socialMedia) {\n case SocialMedia.Facebook:\n url = `https://www.facebook.com/sharer.php?u=${pageUrl}`;\n break;\n case SocialMedia.Twitter:\n url = `https://twitter.com/share?url=${pageUrl}${props.postTitle ? `&text=${props.postTitle}` : ''}`;\n break;\n case SocialMedia.Pinterest:\n url = `https://www.pinterest.com/pin/create/button/?url=${pageUrl}${mediaImage ? `&media=${mediaImage}` : ''}${\n props.postTitle ? `&description=${props.postTitle}` : ''\n }`;\n break;\n case SocialMedia.Mail:\n url = `mailto:?body=Check%20out%20this%20site:${pageUrl}${props.postTitle ? `&subject=${props.postTitle}` : ''}`;\n break;\n case SocialMedia.Linkedin:\n url = `https://www.linkedin.com/shareArticle?mini=true&url=${pageUrl}${props.postTitle ? `&title=${props.postTitle}` : ''}`;\n break;\n case SocialMedia.Customization:\n url = props.socialShareURL && `${props.socialShareURL}${pageUrl}`;\n break;\n default:\n }\n\n url && openWindow(url);\n};\n\nfunction openWindow(url: string): void {\n const left = (screen.width - 570) / 2;\n const top = (screen.height - 570) / 2;\n const params = `menubar=no,toolbar=no,status=no,width=570,height=570,top='${top}',left='${left}`;\n\n // Setting 'params' to an empty string will launch\n // content in a new tab or window rather than a pop-up.\n // params = \"\";\n window.open(url, 'NewWindow', params);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, {\n getCatalogId,\n IComponent,\n IComponentProps,\n IGridSettings,\n IImageSettings,\n msdyn365Commerce,\n TelemetryEvent\n} from '@msdyn365-commerce/core';\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n CartLineValidationResults,\n CartsDataActions,\n format,\n ProductAvailableQuantity,\n ProductDimension,\n ProductPrice,\n ProductsDataActions,\n ProductSearchCriteria,\n ProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\nimport { ArrayExtensions, generateProductImageUrl, ObjectExtensions, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport { PriceComponent } from '../price';\nimport { IItemsAddedToCartResources } from './items-added-to-cart';\nimport { ItemsAddedToCartDialogComponent } from './items-added-to-cart-dialog-component';\nimport { ItemSuccessfullyAddedToCartNotification } from './notifications/item-successfully-added-to-cart-notification';\nimport { MultiItemsSuccessfullyAddedToCartNotification } from './notifications/multi-items-successfully-added-to-cart-notification';\nimport { OrderDetailsProduct } from './product-model';\n\n/**\n * Interface for add to cart resources.\n */\nexport interface IAddToCartResources {\n goToCartText: string;\n continueShoppingText: string;\n closeNotificationLabel: string;\n headerItemOneText: string;\n headerItemFormatText: string;\n headerLinesFormatText?: string;\n headerMessageText: string;\n freePriceText: string;\n originalPriceText: string;\n currentPriceText: string;\n addedQuantityText: string;\n buyAgainNotificationTitle?: string;\n buyAgainNotificationCloseAriaLabel?: string;\n validationErrorMessage?: string;\n oneErrorText?: string;\n multiErrorsText?: string;\n}\n\n/**\n * Interface for add to cart components props.\n */\nexport interface IAddToCartComponentProps extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice } | undefined> {\n className?: string;\n addToCartText: string;\n outOfStockText?: string;\n disabled?: boolean;\n quantity?: number;\n navigationUrl?: string;\n productAvailability?: ProductAvailableQuantity;\n getSelectedProduct?: Promise<SimpleProduct | null>;\n isNavigationToCartPageDisabled?: boolean;\n shouldSkipSiteSettings?: boolean;\n addToCartArialLabel?: string;\n products?: {\n productId: number;\n quantity: number;\n catalogId?: number;\n }[];\n orderDetailsProducts?: OrderDetailsProduct[];\n hasAvailableProducts?: boolean;\n imageSettings?: IImageSettings;\n gridSettings?: IGridSettings;\n\n isLoading?: boolean;\n isUpdatingDimension?: boolean;\n isLoadingDeliveryOptions?: boolean;\n isUpdatingDeliveryOptions?: boolean;\n isAddServiceItemToCart?: boolean;\n isAddEmailDeliveryItemToCart?: boolean;\n isPriceKeyedIn?: boolean;\n customPriceAmount?: number;\n isOrderQuantityLimitsFeatureEnabled?: boolean;\n\n dialogStrings?: IAddToCartResources;\n\n telemetryContent?: ITelemetryContent;\n\n catalogId?: number;\n\n isCustomPriceSelected?: boolean;\n maximumKeyInPrice?: number;\n minimumKeyInPrice?: number;\n defaultMaximumKeyInPrice?: number;\n defaultMinimumKeyInPrice?: number;\n isProductQuantityLoading?: boolean;\n\n onAdd?(result: ICartActionResult): void;\n onError?(result: IAddToCartFailureResult): void;\n changeUpdatingDimension?(isUpdatingDimension: boolean): void;\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\n}\n\n/**\n * Cart action Failure reason type.\n */\nexport declare type ICartActionFailureReason =\n | 'EMPTYINPUT'\n | 'MISSINGDIMENSION'\n | 'OUTOFSTOCK'\n | 'CARTACTIONFAILED'\n | 'INVALIDCUSTOMAMOUNT';\n\n/**\n * Interface for add to cart failure result.\n */\nexport interface IAddToCartFailureResult {\n failureReason: ICartActionFailureReason;\n\n stockLeft?: number;\n cartActionResult?: ICartActionResult;\n missingDimensions?: ProductDimension[];\n}\n\n/**\n * This setting defines the experience when a product is added to cart. Corresponds to the configuration in Fabrikam.\n */\nexport enum AddToCartBehavior {\n /**\n * Navigate to cart page.\n */\n goToCart = 'goToCart',\n\n /**\n * Show item added to cart popup.\n */\n showModal = 'showModal',\n\n /**\n * Show mini cart popup.\n */\n showMiniCart = 'showMiniCart',\n\n /**\n * Show item added to cart notification.\n */\n showNotification = 'showNotification',\n\n /**\n * Do nothing and stay on the page.\n */\n nothing = 'nothing'\n}\n\nconst zero = 0;\nconst defaultQuantity = 1;\n\n/**\n * The propagate result.\n * @param props -- The add to cart component props.\n * @param result -- The cart action result.\n */\nconst propagateResult = (props: IAddToCartComponentProps, result: ICartActionResult): void => {\n if (props.onAdd) {\n props.onAdd(result);\n }\n};\n\n/**\n * The propagate error.\n * @param props -- The add to cart component props.\n * @param result -- The add to cart failure result.\n */\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\n if (props.onError) {\n props.onError(result);\n }\n};\n\n/**\n * Retrieves add to cart input from the component props.\n * @param props - Add to cart component props.\n * @returns Add to cart input.\n */\nconst getAddToCartInputFromProps = async (props: IAddToCartComponentProps) => {\n const products = props.orderDetailsProducts?.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\n const emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n const input = products?.map(product => {\n const deliveryOption = product.salesLine.DeliveryMode;\n return {\n product: product.simpleProduct!,\n count: ObjectExtensions.isNullOrUndefined(product.salesLine.Quantity) ? defaultQuantity : product.salesLine.Quantity,\n catalogId: product.salesLine.CatalogId,\n isAddEmailDeliveryItemToCart: deliveryOption && deliveryOption === emailDeliveryModeCode\n };\n });\n\n if (ArrayExtensions.hasElements(input)) {\n return input;\n }\n\n if (ArrayExtensions.hasElements(props.products)) {\n const actionContext = props.context.actionContext;\n const apiSettings = actionContext.requestContext.apiSettings;\n\n const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\n validateCatalogId(catalogId);\n\n const searchCriteriaInput: ProductSearchCriteria = {\n Context: {\n ChannelId: apiSettings.channelId,\n CatalogId: catalogId\n },\n IncludeAttributes: false,\n Ids: props.products.map(product => product.productId)\n };\n\n const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\n const productSearchResultsWithImages = searchResult.map(productSearchResult => {\n const newProductSearchResult = { ...productSearchResult };\n const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\n\n if (newImageUrl) {\n newProductSearchResult.PrimaryImageUrl = newImageUrl;\n }\n\n return newProductSearchResult;\n });\n\n return props.products.map(item => {\n const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\n let simpleProduct: SimpleProduct;\n if (productData) {\n simpleProduct = {\n ...productData,\n ProductTypeValue: ProductType.Variant,\n AdjustedPrice: productData.Price,\n BasePrice: productData.BasePrice ?? productData.Price\n };\n } else {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\n simpleProduct = {\n RecordId: item.productId\n } as SimpleProduct;\n }\n\n return {\n product: simpleProduct,\n count: item.quantity,\n catalogId: item.catalogId\n };\n });\n }\n\n if (props.data?.product) {\n return [\n {\n product: props.data.product,\n count: props.quantity ?? defaultQuantity,\n catalogId: props.catalogId\n }\n ];\n }\n\n return [];\n};\n\n/**\n * Add one item to cart when it is not buy again.\n * @param props -- The props.\n * @param setDisabled -- The set disable call back.\n * @param openModal -- The open modal call back.\n */\nconst addOneItemToCart = async (\n props: IAddToCartComponentProps,\n setDisabled: (disabled: boolean) => void,\n openModal: (opened: boolean) => void\n): Promise<void> => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\n const data = props.data;\n\n const addToCartInput = await getAddToCartInputFromProps(props);\n const product = addToCartInput[0].product;\n const quantity = addToCartInput[0].count;\n\n const cartState = await getCartState(props.context.actionContext);\n const addToCartResult = await cartState.addProductToCart({\n product,\n count: quantity,\n availableQuantity: props.productAvailability?.AvailableQuantity,\n additionalProperties: { validateQuantity: props.isOrderQuantityLimitsFeatureEnabled },\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\n enableStockCheck: props.context.app.config.enableStockCheck,\n isPriceKeyedIn: props.isPriceKeyedIn,\n customPrice: props.isPriceKeyedIn ? props.customPriceAmount : undefined,\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\n shouldSkipSiteSettings: props.shouldSkipSiteSettings,\n catalogId: addToCartInput[0].catalogId\n });\n\n if (addToCartResult.status === 'SUCCESS') {\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\n setDisabled(false);\n openModal(true);\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\n setDisabled(false);\n const notification = new ItemSuccessfullyAddedToCartNotification(\n props.context,\n props.dialogStrings,\n props.imageSettings,\n props.gridSettings,\n product,\n data?.price,\n quantity,\n props.navigationUrl,\n props.telemetryContent!,\n props.id,\n props.typeName\n );\n NotificationsManager.instance().addNotification(notification);\n } else if (\n MsDyn365.isBrowser &&\n props.navigationUrl &&\n !props.isNavigationToCartPageDisabled &&\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\n ) {\n window.location.assign(props.navigationUrl);\n } else {\n setDisabled(false);\n }\n propagateResult(props, addToCartResult);\n } else {\n NotificationsManager.instance().addNotification(\n new ErrorNotification(\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\n props.dialogStrings?.closeNotificationLabel ?? ''\n )\n );\n\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\n setDisabled(false);\n }\n};\n\n/**\n * Callback to handle success of adding to cart.\n * @param props - Add to cart component props.\n * @param setDisabled - Callback to update disabled state of the component.\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\n * @param setErrorMessage - Callback to update error message state of the component.\n * @param cartState - Current cart state.\n * @param addToCartInput - Input used for adding to cart.\n * @param addToCartResult - Result of adding to cart.\n */\nconst handleAddItemsToCartSuccess = async (\n props: IAddToCartComponentProps,\n setDisabled: (disabled: boolean) => void,\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\n setErrorMessage: (message: string) => void,\n cartState: ICartState,\n addToCartInput: {\n product: SimpleProduct;\n count: number;\n }[],\n addToCartResult: ICartActionResult\n) => {\n // Validate cart for line errors.\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: props.context.actionContext, bypassCache: 'none' },\n cartState.cart.Id,\n cartState.cart.Version\n );\n const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\n const singleErrorCount = 1;\n const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\n const errorMessage =\n errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\n\n setErrorMessage(errorMessage);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\n\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\n setDisabled(false);\n setItemsAddedToCartDialogOpen(true);\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\n setDisabled(false);\n const itemsAddedResource: IItemsAddedToCartResources = {\n viewCartButtonText: props.dialogStrings.goToCartText,\n closeButtonLabel: props.dialogStrings.closeNotificationLabel,\n itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\n itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\n linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\n itemsAddedValidationErrorMessage: errorMessage\n };\n\n const notification = new MultiItemsSuccessfullyAddedToCartNotification(\n props.context,\n itemsAddedResource,\n props.imageSettings,\n props.gridSettings,\n addToCartInput,\n props.navigationUrl,\n props.telemetryContent!,\n props.id,\n props.typeName\n );\n NotificationsManager.instance().addNotification(notification);\n } else if (\n MsDyn365.isBrowser &&\n props.navigationUrl &&\n !props.isNavigationToCartPageDisabled &&\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\n ) {\n window.location.assign(props.navigationUrl);\n } else {\n setDisabled(false);\n }\n propagateResult(props, addToCartResult);\n};\n\n/**\n * Add one or multi item to cart from buy again.\n * @param props -- The props.\n * @param setDisabled -- The set disable call back.\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\n * @param setErrorMessage -- The set error message call back.\n */\nconst addItemsToCart = async (\n props: IAddToCartComponentProps,\n setDisabled: (disabled: boolean) => void,\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\n setErrorMessage: (message: string) => void\n): Promise<void> => {\n const addToCartInput = await getAddToCartInputFromProps(props);\n\n if (!ArrayExtensions.hasElements(addToCartInput)) {\n return;\n }\n\n const cartState = await getCartState(props.context.actionContext);\n const addToCartResult = await cartState.addProductsToCart(addToCartInput);\n\n if (addToCartResult.status === 'SUCCESS') {\n await handleAddItemsToCartSuccess(\n props,\n setDisabled,\n setItemsAddedToCartDialogOpen,\n setErrorMessage,\n cartState,\n addToCartInput,\n addToCartResult\n );\n } else {\n if (props.dialogStrings?.buyAgainNotificationTitle) {\n // For buy again show simple error notification.\n NotificationsManager.instance().addNotification(\n new ErrorNotification(\n props.dialogStrings.buyAgainNotificationTitle,\n props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\n )\n );\n } else {\n NotificationsManager.instance().addNotification(\n new ErrorNotification(\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\n props.dialogStrings?.closeNotificationLabel ?? ''\n )\n );\n }\n\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\n setDisabled(false);\n }\n};\n\n/**\n * Interface for add to cart component.\n */\nexport interface IAddtoCartComponent extends IComponent<IAddToCartComponentProps> {\n onClick(): (event: React.MouseEvent<HTMLElement>, props: IAddToCartComponentProps) => void;\n}\n\n/**\n * On click function.\n * @param _event - The mouse event.\n * @param props - The props.\n * @param setDisabled - Flag to define whether the element is disabled.\n * @param openModal - Flag to specify if it should open in a modal window.\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\n * @param setErrorMessage - Error message.\n */\nconst onClick = async (\n _event: React.MouseEvent<HTMLElement>,\n props: IAddToCartComponentProps,\n setDisabled: (disabled: boolean) => void,\n openModal: (opened: boolean) => void,\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\n setErrorMessage: (message: string) => void\n): Promise<void> => {\n if (!ArrayExtensions.hasElements(props.products)) {\n const cartError = addToCartError(props);\n\n if (cartError) {\n propagateError(props, cartError);\n return;\n }\n\n setDisabled(true);\n }\n\n const hasOrderDetailsProducts =\n ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\n const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\n\n const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\n\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\n await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\n } else {\n await addOneItemToCart(props, setDisabled, openModal);\n }\n};\n\n/**\n * Add to cart component action constant.\n */\nconst AddToCartComponentActions = {\n onClick\n};\n\n/**\n * Add to cart component.\n * @param props - The props.\n * @returns - The add to cart component.\n */\nexport const AddToCartFunctionalComponent: React.FC<IAddToCartComponentProps> = (props: IAddToCartComponentProps) => {\n const [disabled, setDisabled] = useState(false);\n const [modalOpen, setModalOpen] = useState(false);\n const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n const [addToCartInput, setAddToCartInput] = useState<\n {\n product: SimpleProduct;\n count: number;\n }[]\n >([]);\n\n const onClickHandler = async (event: React.MouseEvent<HTMLElement>) => {\n await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\n };\n\n /**\n * Close dialog.\n */\n const closeItemsAddedToCartDialog = React.useCallback(() => {\n setItemsAddedToCartDialogOpen(false);\n }, []);\n\n const priceComponent = props.data?.price ? (\n <PriceComponent\n data={{ price: props.data.price }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n freePriceText={props.dialogStrings?.freePriceText}\n originalPriceText={props.dialogStrings?.originalPriceText}\n currentPriceText={props.dialogStrings?.currentPriceText}\n />\n ) : (\n ''\n );\n\n const popupProps: IPopupProps = {\n context: props.context,\n className: 'msc-add-to-cart',\n id: props.id,\n typeName: props.typeName,\n data: { product: addToCartInput[0]?.product, price: props.data?.price }, // addToCartInput[0]?.product?.Price },\n dialogStrings: props.dialogStrings,\n imageSettings: props.imageSettings,\n gridSettings: props.context.request.gridSettings,\n productQuantity: addToCartInput[0]?.count !== undefined ? addToCartInput[0]?.count : defaultQuantity,\n priceComponent,\n navigationUrl: props.navigationUrl,\n modalOpen,\n setModalOpen,\n telemetryContent: props.telemetryContent\n };\n\n const itemsAddedResource: IItemsAddedToCartResources = {\n viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\n closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\n itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\n itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\n linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\n itemsAddedValidationErrorMessage: errorMessage\n };\n\n const renderModalPopup = <Popup {...popupProps} />;\n const label = getLinkText(props);\n const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\n\n React.useEffect(() => {\n /**\n * Retrieves add to cart input and updates the state.\n */\n const retrieveAddToCartInput = async () => {\n const retrievedInput = await getAddToCartInputFromProps(props);\n setAddToCartInput(retrievedInput);\n };\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\n retrieveAddToCartInput();\n }, [props, setAddToCartInput]);\n\n return (\n <>\n {renderModalPopup}\n <button\n className={classnames(buttonClassName, props.className)}\n aria-label={props.addToCartArialLabel ?? label}\n title={props.addToCartArialLabel ?? label}\n {...attributes}\n onClick={onClickHandler}\n disabled={props.disabled || disabled || isIntermediateState(props) || shouldShowOutOfStock(props, false)}\n >\n {label}\n </button>\n <ItemsAddedToCartDialogComponent\n className='msc-lines-added-to-cart-dialog'\n id={props.id}\n typeName={props.typeName}\n context={props.context}\n dialogStrings={itemsAddedResource}\n data={{\n products: addToCartInput\n }}\n isModalOpen={isItemsAddedToCartDialogOpen}\n onClose={closeItemsAddedToCartDialog}\n />\n </>\n );\n};\n\n// Set default props\nAddToCartFunctionalComponent.defaultProps = {\n quantity: defaultQuantity\n};\n\n/**\n * Resolves whether product is in stock.\n * @param props - The add to cart component props.\n * @returns Gets the link text.\n */\nconst getLinkText = (props: IAddToCartComponentProps): string => {\n return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\n};\n\n/**\n * Resolves whether product is in stock.\n * @param props - The add to cart component props.\n * @returns The add to cart failure result.\n */\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\n const {\n data,\n productAvailability,\n isCustomPriceSelected,\n customPriceAmount,\n maximumKeyInPrice,\n minimumKeyInPrice,\n defaultMaximumKeyInPrice = 100,\n defaultMinimumKeyInPrice = 10\n } = props;\n\n if (!data || !data.product.RecordId) {\n // No product exists, won't be able to add to cart\n return { failureReason: 'EMPTYINPUT' };\n }\n\n if (data.product.Dimensions) {\n const missingDimensions = data.product.Dimensions.filter(\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n );\n\n if (ArrayExtensions.hasElements(missingDimensions)) {\n // At least one dimension with no value exists on the product, won't be able to add to cart\n return { failureReason: 'MISSINGDIMENSION', missingDimensions };\n }\n }\n\n if (shouldShowOutOfStock(props, true)) {\n const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\n const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\n const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\n\n return { failureReason: 'OUTOFSTOCK', stockLeft };\n }\n\n // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\n if (\n isCustomPriceSelected &&\n (!customPriceAmount ||\n customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\n customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\n ) {\n return { failureReason: 'INVALIDCUSTOMAMOUNT' };\n }\n\n // Only allow adding to cart if not showing out of stock\n return undefined;\n};\n\n/**\n * Resolves whether product is in stock.\n * @param props - The add to cart component props.\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\n * @returns The dialog element.\n */\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\n if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\n return false;\n }\n\n // When skip site settings do not need show out of stock on adding to cart\n if (props.shouldSkipSiteSettings) {\n return false;\n }\n\n if (\n props.isLoading ||\n props.isProductQuantityLoading ||\n props.isUpdatingDimension ||\n props.isLoadingDeliveryOptions ||\n props.isUpdatingDeliveryOptions ||\n props.isAddServiceItemToCart\n ) {\n // Out of stock turn off, don't bother showing out of stock\n return false;\n }\n\n if (!props.data || !props.data.product.RecordId) {\n // No product exists, don't bother showing out of stock\n return false;\n }\n\n const hasAvailableProducts = props.hasAvailableProducts ?? true;\n if (!hasAvailableProducts) {\n return true;\n }\n\n if (props.data.product.Dimensions) {\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\n // At least one dimension with no value exists on the product, so also don't show out of stock\n return false;\n }\n }\n\n const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\n\n return !(\n props.productAvailability &&\n props.productAvailability.AvailableQuantity !== undefined &&\n props.productAvailability.AvailableQuantity >= includedQuantityNumber\n );\n};\n\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\n if (props.data?.product.Dimensions) {\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\n // At least one dimension with no value exists on the product, so also not in intermediate state\n return false;\n }\n }\n\n if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\n return false;\n }\n\n return true;\n};\n\n// @ts-expect-error\nexport const AddToCartComponent: React.FunctionComponent<IAddToCartComponentProps> = msdyn365Commerce.createComponent<IAddtoCartComponent>(\n 'AddToCart',\n { component: AddToCartFunctionalComponent, ...AddToCartComponentActions }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Interface for multi items added to cart resource.\n */\nexport interface IItemsAddedToCartResources {\n viewCartButtonText: string;\n closeButtonLabel: string;\n itemsAddedToCartHeaderText: string;\n itemsAddedToCartFormatText: string;\n linesAddedToCartFormatText: string;\n itemsAddedValidationErrorMessage?: string;\n}\n\n/**\n * Interface for add to cart input.\n */\nexport interface IAddToCartInput {\n product: SimpleProduct;\n count?: number;\n}\n\n/**\n * The total number of items.\n * @param addedInput -- The added to cart input.\n * @returns The total number of items.\n */\nexport const getTotalItems = (addedInput: IAddToCartInput[]): number => {\n const defaultQuantity: number = 1;\n let totalCount: number = 0;\n\n for (const item of addedInput) {\n totalCount += item.count ?? defaultQuantity;\n }\n\n return totalCount;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\n/**\n * Items added to cart error message.\n */\nexport interface IItemsAddedErrorProps {\n errorMessage?: string;\n}\n\n/**\n * Items added error.\n * @param errorProps - The error properties.\n * @param errorProps.errorMessage - The error message to show.\n * @returns The alert element showing items added errors.\n */\nexport const ItemsAddedErrorComponent: React.FC<IItemsAddedErrorProps> = ({ errorMessage }) => {\n if (StringExtensions.isNullOrEmpty(errorMessage)) {\n return null;\n }\n\n return (\n <span className='msc-alert-danger msc-alert'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n <span>{errorMessage}</span>\n </span>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { getUrlSync, IComponentProps, IImageSettings } from '@msdyn365-commerce/core';\nimport { format } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { OrderTemplateProductsPreviewComponent } from '../order-template/order-templates-list/order-template-products-preview';\nimport { getTotalItems, IAddToCartInput, IItemsAddedToCartResources } from './items-added-to-cart';\nimport { ItemsAddedErrorComponent } from './items-added-to-cart-error-component';\n\n/**\n * Interface for items added to cart data.\n */\nexport interface IItemsAddedToCartDialogData {\n products: IAddToCartInput[];\n}\n\n/**\n * Interface for items added to cart props.\n */\nexport interface IItemsAddedToCartDialogProps extends IComponentProps<IItemsAddedToCartDialogData> {\n className: string;\n dialogStrings: IItemsAddedToCartResources;\n\n imageSettings?: IImageSettings;\n isModalOpen?: boolean;\n\n onClose(): void;\n}\n\n/**\n * Items added to cart dialog.\n * @param dialogProps -- The dialog props.\n * @returns The dialog element.\n */\nexport const ItemsAddedToCartDialogComponent = (dialogProps: IItemsAddedToCartDialogProps): JSX.Element => {\n const {\n dialogStrings,\n className,\n context,\n isModalOpen,\n imageSettings,\n data: { products }\n } = dialogProps;\n\n /**\n * Get cart page URL.\n * @returns The URL of cart page.\n */\n const getCartPageUrl = (): string => {\n return getUrlSync('cart', context.actionContext) ?? '';\n };\n\n const itemsString =\n format(dialogStrings.itemsAddedToCartFormatText, getTotalItems(products).toString()) + dialogStrings.itemsAddedToCartHeaderText;\n const linesString = format(dialogStrings.linesAddedToCartFormatText, products.length.toString());\n\n const fullProducts: FullProduct[] = products.map(item => {\n return { ProductDetails: item.product };\n });\n\n return (\n <Modal isOpen={isModalOpen} className={className} toggle={dialogProps.onClose}>\n <ModalHeader className={`${className}__dialog__header`} toggle={dialogProps.onClose}>\n <b>{linesString}</b>\n <span>{dialogStrings.itemsAddedToCartHeaderText}</span>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <div className={`${className}__dialog__content`}>\n <OrderTemplateProductsPreviewComponent\n context={context}\n className={`${className}__dialog`}\n products={fullProducts}\n imageSettings={imageSettings}\n />\n <div className={`${className}__dialog__description`}>\n <div className={`${className}__dialog__order-template-items`}>{itemsString}</div>\n </div>\n <ItemsAddedErrorComponent errorMessage={dialogProps.dialogStrings.itemsAddedValidationErrorMessage} />\n </div>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`}>\n <Button\n className={`${className}__dialog__view-cart-button`}\n title={dialogStrings.viewCartButtonText}\n href={getCartPageUrl()}\n >\n {dialogStrings.viewCartButtonText}\n </Button>\n <Button\n className={`${className}__dialog__continue-shopping`}\n title={dialogStrings.closeButtonLabel}\n onClick={dialogProps.onClose}\n >\n {dialogStrings.closeButtonLabel}\n </Button>\n </ModalFooter>\n </Modal>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Image } from '@msdyn365-commerce/core';\nimport {\n BaseNotificationComponent,\n ClosableNotificationWrapper,\n DismissibleNotificationWrapper,\n INotificationCloseButtonProps,\n INotificationProps,\n NotificationCloseButton,\n NotificationContent,\n NotificationFooter,\n NotificationHeader,\n NotificationInstance,\n NotificationTitle\n} from '@msdyn365-commerce-modules/notifications-core';\nimport { getFallbackImageUrl, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { PriceComponent } from '../../price/price.components';\nimport { ItemSuccessfullyAddedToCartNotification } from './item-successfully-added-to-cart-notification';\n\nexport interface IItemSuccessfullyAddedToCartNotificationProps\n extends INotificationProps<ItemSuccessfullyAddedToCartNotification>,\n INotificationCloseButtonProps<ItemSuccessfullyAddedToCartNotification> {}\n\nexport class ItemSuccessfullyAddedToCartNotificationComponent extends BaseNotificationComponent<\n ItemSuccessfullyAddedToCartNotification,\n IItemSuccessfullyAddedToCartNotificationProps\n> {\n public static readonly className: string = 'msc-notification-item-successfully-added-to-cart';\n\n public constructor(props: IItemSuccessfullyAddedToCartNotificationProps) {\n super(props);\n }\n\n public render(): React.ReactNode {\n const payLoad = getPayloadObject('click', this.props.notification.telemetryContent, TelemetryConstant.ContinueShopping);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const shouldDisplayUnitOfMeasure =\n this.props.notification.context.app.config?.unitOfMeasureDisplayType &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n this.props.notification.context.app.config.unitOfMeasureDisplayType !== 'none';\n payLoad.contentAction.etext = TelemetryConstant.ViewBagAndCheckout;\n const viewBagAttribute = getTelemetryAttributes(this.props.notification.telemetryContent, payLoad);\n const fallbackImageUrl = getFallbackImageUrl(\n this.props.notification.product.ItemId,\n this.props.notification.context.actionContext.requestContext.apiSettings,\n this.props.notification.context.app?.config?.OmniChannelMedia\n );\n if (this.props.notification.imageSettings) {\n this.props.notification.imageSettings.cropFocalRegion = true;\n }\n\n const reducedDimensions: string = this.props.notification.product.Dimensions\n ? this.props.notification.product.Dimensions.reduce<string>((str, productDimension) => {\n if (productDimension.DimensionValue && productDimension.DimensionValue.Value) {\n if (str) {\n return `${str}, ${productDimension.DimensionValue.Value}`;\n }\n\n return `${productDimension.DimensionValue.Value}`;\n }\n\n return str;\n }, '')\n : '';\n\n const contentClassName = NotificationContent.className;\n const footerClassName = NotificationFooter.className;\n\n return (\n <div role='alert' className={ItemSuccessfullyAddedToCartNotificationComponent.className}>\n <ClosableNotificationWrapper notification={this.props.notification}>\n <DismissibleNotificationWrapper notification={this.props.notification}>\n <NotificationInstance notification={this.props.notification}>\n <NotificationHeader notification={this.props.notification}>\n <NotificationTitle notification={this.props.notification} />\n <NotificationCloseButton notification={this.props.notification} />\n </NotificationHeader>\n <NotificationContent notification={this.props.notification}>\n <Image\n requestContext={this.props.notification.context.actionContext.requestContext}\n className={`${contentClassName}__image`}\n src={this.props.notification.product.PrimaryImageUrl || ''}\n fallBackSrc={fallbackImageUrl}\n altText={this.props.notification.product.Name}\n gridSettings={this.props.notification.gridSettings || {}}\n imageSettings={this.props.notification.imageSettings}\n loadFailureBehavior='empty'\n />\n <div className={`${contentClassName}__product-info`}>\n <div className={`${contentClassName}__product-title`}>{this.props.notification.product.Name}</div>\n {this.props.notification.price ? (\n <div className={`${contentClassName}__product-price`}>\n <PriceComponent\n data={{ price: this.props.notification.price }}\n context={this.props.notification.context}\n id={this.props.notification.id}\n typeName={this.props.notification.typeName}\n freePriceText={this.props.notification.resources.freePriceText}\n originalPriceText={this.props.notification.resources.originalPriceText}\n currentPriceText={this.props.notification.resources.currentPriceText}\n />\n </div>\n ) : (\n ''\n )}\n {this.props.notification.product.DefaultUnitOfMeasure && shouldDisplayUnitOfMeasure ? (\n <div className={`${contentClassName}__product-unit-of-measure`}>\n <span>{this.props.notification.product.DefaultUnitOfMeasure}</span>\n </div>\n ) : (\n ''\n )}\n {StringExtensions.isNullOrWhitespace(reducedDimensions) ? null : (\n <div className={`${contentClassName}__product-variants`}>{reducedDimensions}</div>\n )}\n <div className={`${contentClassName}__product-quantity`}>\n {this.props.notification.resources.addedQuantityText.replace(\n '{0}',\n this.props.notification.productQuantity.toString()\n )}\n </div>\n </div>\n </NotificationContent>\n <NotificationFooter notification={this.props.notification}>\n {this.props.notification.navigationUrl && (\n <Button\n className={`${footerClassName}__go-to-cart`}\n href={this.props.notification.navigationUrl}\n title={this.props.notification.resources.goToCartText}\n {...viewBagAttribute}\n >\n {this.props.notification.resources.goToCartText}\n </Button>\n )}\n </NotificationFooter>\n </NotificationInstance>\n </DismissibleNotificationWrapper>\n </ClosableNotificationWrapper>\n </div>\n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, ICoreContext, IGeneric, IGridSettings, IImageSettings, RichText } from '@msdyn365-commerce/core';\nimport { format, ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n DismissibleNotification,\n IClosableNotification,\n ITitledNotification,\n NotificationEvents,\n withNotificationComponent\n} from '@msdyn365-commerce-modules/notifications-core';\nimport { Event } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\n\nimport { IAddToCartResources } from '../add-to-cart.component';\nimport { ItemSuccessfullyAddedToCartNotificationComponent } from './item-successfully-added-to-cart-notification-component';\n\n/**\n * Notification which will be shown after the user adds an item to the cart.\n */\n@withNotificationComponent(ItemSuccessfullyAddedToCartNotificationComponent)\nexport class ItemSuccessfullyAddedToCartNotification extends DismissibleNotification implements ITitledNotification, IClosableNotification {\n public readonly context: ICoreContext<IGeneric<IAny>>;\n\n public readonly resources: IAddToCartResources;\n\n public readonly imageSettings?: IImageSettings;\n\n public readonly gridSettings?: IGridSettings;\n\n public readonly product: SimpleProduct;\n\n public readonly price?: ProductPrice;\n\n public readonly productQuantity: number;\n\n public readonly navigationUrl?: string;\n\n public readonly telemetryContent: ITelemetryContent;\n\n public readonly closeAriaLabel: string;\n\n public readonly title: RichText;\n\n public readonly componentId: string;\n\n public readonly typeName: string;\n\n public isClosed: boolean;\n\n public constructor(\n context: ICoreContext<IGeneric<IAny>>,\n resources: IAddToCartResources,\n imageSettings: IImageSettings | undefined,\n gridSettings: IGridSettings | undefined,\n product: SimpleProduct,\n price: ProductPrice | undefined,\n productQuantity: number,\n navigationUrl: string | undefined,\n telemetryContent: ITelemetryContent,\n componentId: string,\n typeName: string\n ) {\n super();\n\n const quantityOne = 1;\n const itemsString =\n productQuantity === quantityOne\n ? resources.headerItemOneText\n : format(resources.headerItemFormatText, productQuantity.toString());\n\n this.title = `<b>${itemsString}</b><span>${resources.headerMessageText}</span>`;\n\n this.context = context;\n this.resources = resources;\n this.imageSettings = imageSettings;\n this.gridSettings = gridSettings;\n this.product = product;\n this.price = price;\n this.productQuantity = productQuantity;\n this.navigationUrl = navigationUrl;\n this.telemetryContent = telemetryContent;\n this.componentId = componentId;\n this.typeName = typeName;\n\n this.isClosed = false;\n this.closeAriaLabel = resources.closeNotificationLabel;\n\n this.events.setValue(NotificationEvents.Close, new Event());\n }\n\n public close(): void {\n this.isClosed = true;\n this.events.getValue(NotificationEvents.Close)?.trigger();\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport {\n BaseNotificationComponent,\n ClosableNotificationWrapper,\n DismissibleNotificationWrapper,\n INotificationCloseButtonProps,\n INotificationProps,\n NotificationCloseButton,\n NotificationContent,\n NotificationDescription,\n NotificationFooter,\n NotificationHeader,\n NotificationInstance,\n NotificationTitle\n} from '@msdyn365-commerce-modules/notifications-core';\nimport { Button, getPayloadObject, getTelemetryAttributes, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { OrderTemplateProductsPreviewComponent } from '../../order-template/order-templates-list/order-template-products-preview';\nimport { ItemsAddedErrorComponent } from '../items-added-to-cart-error-component';\nimport { MultiItemsSuccessfullyAddedToCartNotification } from './multi-items-successfully-added-to-cart-notification';\n\n/**\n * Interface of props for multiple items are successfully added to cart notification.\n */\nexport interface IMultiItemsSuccessfullyAddedToCartNotificationProps\n extends INotificationProps<MultiItemsSuccessfullyAddedToCartNotification>,\n INotificationCloseButtonProps<MultiItemsSuccessfullyAddedToCartNotification> {}\n\n/**\n * Multiple items are successfully added to cart notification.\n */\nexport class MultiItemsSuccessfullyAddedToCartNotificationComponent extends BaseNotificationComponent<\n MultiItemsSuccessfullyAddedToCartNotification,\n IMultiItemsSuccessfullyAddedToCartNotificationProps\n> {\n public static readonly className: string = 'msc-notification-items-added-to-cart';\n\n public constructor(props: IMultiItemsSuccessfullyAddedToCartNotificationProps) {\n super(props);\n }\n\n public render(): React.ReactNode {\n const payLoad = getPayloadObject('click', this.props.notification.telemetryContent, TelemetryConstant.ContinueShopping);\n payLoad.contentAction.etext = TelemetryConstant.ViewBagAndCheckout;\n const viewBagAttribute = getTelemetryAttributes(this.props.notification.telemetryContent, payLoad);\n if (this.props.notification.imageSettings) {\n this.props.notification.imageSettings.cropFocalRegion = true;\n }\n\n const fullProducts: FullProduct[] = this.props.notification.products.map(item => {\n return { ProductDetails: item.product };\n });\n\n const className = MultiItemsSuccessfullyAddedToCartNotificationComponent.className;\n const footerClassName = NotificationFooter.className;\n return (\n <div role='alert' className={className}>\n <ClosableNotificationWrapper notification={this.props.notification}>\n <DismissibleNotificationWrapper notification={this.props.notification}>\n <NotificationInstance notification={this.props.notification}>\n <NotificationHeader notification={this.props.notification}>\n <NotificationTitle notification={this.props.notification} />\n <NotificationCloseButton notification={this.props.notification} />\n </NotificationHeader>\n <NotificationContent notification={this.props.notification}>\n <OrderTemplateProductsPreviewComponent\n context={this.props.notification.context}\n className='msc-notification-content__preview'\n products={fullProducts}\n imageSettings={this.props.notification.imageSettings}\n />\n <NotificationDescription notification={this.props.notification} />\n <ItemsAddedErrorComponent\n errorMessage={this.props.notification.resources.itemsAddedValidationErrorMessage}\n />\n </NotificationContent>\n <NotificationFooter notification={this.props.notification}>\n {this.props.notification.navigationUrl && (\n <Button\n className={`${footerClassName}__go-to-cart`}\n href={this.props.notification.navigationUrl}\n title={this.props.notification.resources.viewCartButtonText}\n {...viewBagAttribute}\n >\n {this.props.notification.resources.viewCartButtonText}\n </Button>\n )}\n </NotificationFooter>\n </NotificationInstance>\n </DismissibleNotificationWrapper>\n </ClosableNotificationWrapper>\n </div>\n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, ICoreContext, IGeneric, IGridSettings, IImageSettings, RichText } from '@msdyn365-commerce/core';\nimport { format } from '@msdyn365-commerce/retail-proxy';\nimport {\n DismissibleNotification,\n IClosableNotification,\n ITitledNotification,\n NotificationEvents,\n withNotificationComponent\n} from '@msdyn365-commerce-modules/notifications-core';\nimport { Event } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\n\nimport { getTotalItems, IAddToCartInput, IItemsAddedToCartResources } from '../items-added-to-cart';\nimport { MultiItemsSuccessfullyAddedToCartNotificationComponent } from './multi-items-successfully-added-to-cart-notification-component';\n\n/**\n * Notification which will be shown after the user adds multi items to the cart.\n */\n@withNotificationComponent(MultiItemsSuccessfullyAddedToCartNotificationComponent)\nexport class MultiItemsSuccessfullyAddedToCartNotification extends DismissibleNotification\n implements ITitledNotification, IClosableNotification {\n public readonly context: ICoreContext<IGeneric<IAny>>;\n\n public readonly resources: IItemsAddedToCartResources;\n\n public readonly imageSettings?: IImageSettings;\n\n public readonly gridSettings?: IGridSettings;\n\n public readonly products: IAddToCartInput[];\n\n public readonly navigationUrl?: string;\n\n public readonly telemetryContent: ITelemetryContent;\n\n public readonly closeAriaLabel: string;\n\n public readonly title: RichText;\n\n public readonly descriptionLines: RichText[];\n\n public readonly componentId: string;\n\n public readonly typeName: string;\n\n public isClosed: boolean;\n\n public constructor(\n context: ICoreContext<IGeneric<IAny>>,\n resources: IItemsAddedToCartResources,\n imageSettings: IImageSettings | undefined,\n gridSettings: IGridSettings | undefined,\n products: IAddToCartInput[],\n navigationUrl: string | undefined,\n telemetryContent: ITelemetryContent,\n componentId: string,\n typeName: string\n ) {\n super();\n\n const itemsString = format(resources.itemsAddedToCartFormatText, getTotalItems(products).toString());\n const linesString = format(resources.linesAddedToCartFormatText, products.length.toString());\n\n this.title = `<b>${linesString}</b><span>${resources.itemsAddedToCartHeaderText}</span>`;\n this.descriptionLines = [];\n this.descriptionLines.push(`<b>${itemsString}</b><span>${resources.itemsAddedToCartHeaderText}</span>`);\n\n this.context = context;\n this.resources = resources;\n this.imageSettings = imageSettings;\n this.gridSettings = gridSettings;\n this.products = products;\n this.navigationUrl = navigationUrl;\n this.telemetryContent = telemetryContent;\n this.componentId = componentId;\n this.typeName = typeName;\n\n this.isClosed = false;\n this.closeAriaLabel = resources.closeButtonLabel;\n\n this.events.setValue(NotificationEvents.Close, new Event());\n }\n\n public close(): void {\n this.isClosed = true;\n this.events.getValue(NotificationEvents.Close)?.trigger();\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { SalesLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product from order details.\n */\nexport class OrderDetailsProduct {\n @observable\n public isSelected: boolean;\n\n public readonly isProductAvailable: boolean;\n\n public readonly salesLine: SalesLine;\n\n /**\n * Simple product info.\n * May be undefined for the removed/unavailable product.\n */\n public readonly simpleProduct?: SimpleProduct;\n\n public readonly productUrl?: string;\n\n public constructor(salesLine: SalesLine, simpleProduct?: SimpleProduct, productUrl?: string) {\n this.salesLine = salesLine;\n this.simpleProduct = simpleProduct;\n this.isSelected = false;\n this.isProductAvailable = !ObjectExtensions.isNullOrUndefined(simpleProduct);\n this.productUrl = productUrl;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { IComponent, IComponentProps, getCatalogId, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport {\n addOrderTemplateToCartAction,\n AddOrderTemplateToCartInput,\n OrderTemplate,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n IPopupProductsProps,\n ITelemetryContent,\n PopupProducts,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport {\n ILinesAddedToCartDialogResources,\n LinesAddedToCartDialog\n} from '../lines-added-to-cart-dialog/lines-added-to-cart-dialog.component';\n\nexport interface IAddOrderTemplateToCartComponentData {\n orderTemplate: OrderTemplate;\n}\n\nexport interface IAddOrderTemplateToCartComponentProps extends IComponentProps<IAddOrderTemplateToCartComponentData> {\n className?: string;\n parentElementRef?: React.RefObject<Button>;\n addToCartText: string;\n telemetryContent?: ITelemetryContent;\n dialogStrings: {\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n orderTemplateErrorMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n}\n\nexport declare type IAddToCartActionFailureReason = 'EMPTYINPUT' | 'MISSINGDIMENSION' | 'OUTOFSTOCK' | 'CARTACTIONFAILED'; // Rename to used method\n\nexport interface IAddOrderTemplateToCartComponent extends IComponent<IAddOrderTemplateToCartComponentProps> {\n onClick(): (event: React.MouseEvent<HTMLElement>, props: IAddOrderTemplateToCartComponentProps) => void;\n}\n\nconst onClick = async (\n _event: React.MouseEvent<HTMLElement>,\n props: IAddOrderTemplateToCartComponentProps,\n setUploadStatus: (uploadStatus: addOrderTemplateToCartStatus) => void,\n openModal: (opened: boolean) => void,\n setLinesAddedToCartDialogOpen: (opened: boolean) => void,\n setAddedLinesCount: (value: number) => void,\n setErrorMessage: (message: string) => void\n): Promise<void> => {\n openModal(true);\n setUploadStatus('LOADING');\n const { context, dialogStrings } = props;\n // assuming selected catalogId will be passed to component and if not passed then get from context\n const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\n validateCatalogId(catalogId);\n const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n const addOrderTemplateToCartInput = isMultipleCatalogFeatureEnabledInHq\n ? new AddOrderTemplateToCartInput(props.data.orderTemplate.productList.Id, isMultipleCatalogFeatureEnabledInHq)\n : new AddOrderTemplateToCartInput(props.data.orderTemplate.productList.Id);\n try {\n const cartState = await getCartState(context.actionContext);\n const cart = cartState.cart;\n const hasInvoiceInCart = cart?.CartLines?.find(cartLine => cartLine.IsInvoiceLine === true);\n if (hasInvoiceInCart) {\n setErrorMessage('Can not add items to a cart containing an invoice.');\n setUploadStatus('FAILED');\n } else {\n const addedCartLines = await addOrderTemplateToCartAction(addOrderTemplateToCartInput, context.actionContext);\n setAddedLinesCount(addedCartLines.length);\n openModal(false);\n setTimeout(() => {\n setLinesAddedToCartDialogOpen(true);\n }, 500);\n setErrorMessage('');\n }\n } catch (error) {\n setErrorMessage(dialogStrings.orderTemplateErrorMessage);\n setUploadStatus('FAILED');\n }\n};\n\nconst AddToCartComponentActions = {\n onClick\n};\n\nexport type addOrderTemplateToCartStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'WAITING';\n\nconst _getModalText = (status: addOrderTemplateToCartStatus, props: IAddOrderTemplateToCartComponentProps, errorMsg: string) => {\n const { dialogStrings } = props;\n const { addToCartFailureMessage, addToCartSuccessMessage, addToCartProcessMessage } = dialogStrings;\n\n if (status === 'LOADING') {\n return `${addToCartProcessMessage}...`;\n }\n\n if (status === 'SUCCESS') {\n return addToCartSuccessMessage;\n }\n\n if (status === 'FAILED') {\n return errorMsg !== null ? errorMsg : addToCartFailureMessage;\n }\n\n return '';\n};\n\nlet buttonEventReference: HTMLButtonElement | undefined;\n\nconst AddOrderTemplate: React.FC<IAddOrderTemplateToCartComponentProps> = (props: IAddOrderTemplateToCartComponentProps) => {\n const [uploadStatus, setUploadStatus] = useState<addOrderTemplateToCartStatus>('WAITING');\n const [modalOpen, setModalOpen] = useState(false);\n const [addedLinesCount, setAddedLinesCount] = useState(0);\n const [linesAddedToCartDialogOpen, setLinesAddedToCartDialogOpen] = useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n\n const onClickHandler = async (event: React.MouseEvent<HTMLElement>) => {\n buttonEventReference = event.target as HTMLButtonElement;\n await AddToCartComponentActions.onClick(\n event,\n props,\n setUploadStatus,\n setModalOpen,\n setLinesAddedToCartDialogOpen,\n setAddedLinesCount,\n setErrorMessage\n );\n };\n const closeLinesAddedToCartDialog = () => {\n setLinesAddedToCartDialogOpen(false);\n setErrorMessage('');\n buttonEventReference?.focus();\n };\n\n const modalText = _getModalText(uploadStatus, props, errorMessage);\n const processStatusClass = uploadStatus.toLowerCase();\n const dialogStrings = { closeWindowButtonText: props.dialogStrings.closeWindowButtonText };\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.AddOrderTemplateToCart);\n const addOrderTemplateAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n const popupProps: IPopupProductsProps = {\n dialogStrings,\n className: 'msc-add-order-template-to-cart',\n processStatusClass,\n text: modalText,\n modalOpen,\n setModalOpen\n };\n\n const renderModalPopup = <PopupProducts {...popupProps} />;\n\n const products = props.data.orderTemplate.orderTemplateLines\n .map(line => line.fullProduct)\n .filter(fullProduct => fullProduct) as FullProduct[];\n const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n return (\n <>\n {renderModalPopup}\n <button\n className={classnames(\n 'msc-add-order-template-to-cart msc-btn',\n props.className,\n props.data.orderTemplate.totalLines === 0 ? 'disabled' : ''\n )}\n aria-label={props.addToCartText}\n disabled={props.data.orderTemplate.totalLines === 0}\n type='button'\n onClick={onClickHandler}\n {...addOrderTemplateAttribute}\n >\n {props.addToCartText}\n </button>\n <LinesAddedToCartDialog\n className='msc-lines-added-to-cart-dialog'\n id={props.id}\n typeName={props.typeName}\n context={props.context}\n dialogStrings={props.dialogStrings.linesAddedToCartDialogResources}\n data={{\n linesCount: addedLinesCount,\n orderTemplate: props.data.orderTemplate.productList,\n products\n }}\n modalOpen={linesAddedToCartDialogOpen}\n onClose={closeLinesAddedToCartDialog}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq || false}\n {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n />\n </>\n );\n};\n\nexport const AddOrderTemplateToCartComponent: React.FunctionComponent<IAddOrderTemplateToCartComponentProps> =\n // @ts-expect-error -- As per design, custom component\n msdyn365Commerce.createComponent<IAddOrderTemplateToCartComponent>('AddOrderTemplate', {\n component: AddOrderTemplate,\n ...AddToCartComponentActions\n });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport {\n IOrderTemplateNameDialogResources,\n OrderTemplateNameDialog\n} from '../order-template-name-dialog/order-template-name-dialog.component';\n\nexport interface IRenameOrderTemplateComponentProps extends IComponentProps<IRenameOrderTemplateData> {\n className?: string;\n renameOrderTemplateDialogStrings: IOrderTemplateNameDialogResources;\n renameOrderTemplateButtonText: string;\n onRenameTemplate(orderTemplate: ProductList): Promise<void>;\n\n // as required passing in components for later user\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n}\n\ninterface IRenameOrderTemplateData {\n orderTemplate: ProductList;\n}\n\nexport interface IRenameOrderTemplateComponent extends IComponent<IRenameOrderTemplateComponentProps> {}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention -- For backward compatibility\nconst RenameOrderTemplateComponentActions = {};\nlet buttonEventReference: HTMLButtonElement | undefined;\n\nconst RenameOrderTemplate: React.FC<IRenameOrderTemplateComponentProps> = (props: IRenameOrderTemplateComponentProps) => {\n const {\n data: { orderTemplate },\n renameOrderTemplateButtonText,\n renameOrderTemplateDialogStrings,\n context\n } = props;\n const [renameOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = React.useState(false);\n const onOrderTemplateNameCancel = () => {\n context.telemetry.debug('Rename of template was canceled.');\n buttonEventReference?.focus();\n };\n\n const onRenameButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n buttonEventReference = event.target as HTMLButtonElement;\n setOrderTemplateNameDialogOpen(true);\n };\n return (\n <>\n <Button className='ms-order-template-action-bar__rename-template-button' onClick={onRenameButtonClick}>\n {renameOrderTemplateButtonText}\n </Button>\n <OrderTemplateNameDialog\n existingOrderTemplate={orderTemplate}\n isUpdateDialog\n className='msc-order-template-name-dialog'\n modalOpen={renameOrderTemplateDialogOpen}\n setModalOpen={setOrderTemplateNameDialogOpen}\n context={context}\n id={props.id}\n data={props.data}\n orderTemplateName={props.data.orderTemplate.Name}\n typeName={props.typeName}\n dialogStrings={renameOrderTemplateDialogStrings}\n onCancel={onOrderTemplateNameCancel}\n onSuccess={props.onRenameTemplate}\n />\n </>\n );\n};\n\nexport const RenameOrderTemplateComponent: React.FunctionComponent<IRenameOrderTemplateComponentProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error\n IRenameOrderTemplateComponent\n>('RenameOrderTemplate', { component: RenameOrderTemplate, ...RenameOrderTemplateComponentActions });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { getUrlSync, IComponentProps, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { OrderTemplateProductsPreviewComponent } from '../order-templates-list/order-template-products-preview';\n\nexport interface ILinesAddedToCartDialogResources {\n viewCartButtonText: string;\n orderTemplateCloseButtonText: string;\n linesAddedToCartHeaderItemsOneText: string;\n linesAddedToCartHeaderLinesOneText: string;\n linesAddedToCartHeaderLinesFormatText: string;\n linesAddedToCartHeaderMessageText: string;\n}\n\nexport interface ILinesAddedToCartDialogData {\n linesCount: number;\n orderTemplate: ProductList;\n products: FullProduct[];\n}\n\nexport interface ILinesAddedToCartDialogProps extends IComponentProps<ILinesAddedToCartDialogData> {\n className: string;\n imageSettings?: IImageSettings;\n\n dialogStrings: ILinesAddedToCartDialogResources;\n\n modalOpen: boolean | undefined;\n onClose(): void;\n\n // as required passing in components for later user\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n}\n\nexport const LinesAddedToCartDialog = (dialogProps: ILinesAddedToCartDialogProps) => {\n const {\n dialogStrings,\n className,\n context,\n modalOpen,\n imageSettings,\n data: { orderTemplate, products, linesCount }\n } = dialogProps;\n\n const getCartPageUrl = (): string => {\n return getUrlSync('cart', context.actionContext) || '';\n };\n\n const close: () => void = () => {\n dialogProps.onClose();\n };\n\n const lineItemsString =\n linesCount === 1\n ? dialogStrings.linesAddedToCartHeaderLinesOneText\n : dialogStrings.linesAddedToCartHeaderLinesFormatText.replace('{0}', linesCount.toString());\n\n return (\n <Modal isOpen={modalOpen} className={`${className}`} toggle={close}>\n <ModalHeader className={`${className}__dialog__header`} toggle={close}>\n <b>{dialogStrings.linesAddedToCartHeaderItemsOneText}</b>\n <span>{dialogStrings.linesAddedToCartHeaderMessageText}</span>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <div className={`${className}__dialog__content`}>\n <OrderTemplateProductsPreviewComponent\n context={context}\n className={`${className}__dialog`}\n products={products}\n imageSettings={imageSettings}\n />\n <div className={`${className}__dialog__description`}>\n <div className={`${className}__dialog__order-template-name`}>{orderTemplate.Name}</div>\n <div className={`${className}__dialog__order-template-items`}>{lineItemsString}</div>\n </div>\n </div>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`}>\n <Button\n className={`${className}__dialog__view-cart-button`}\n title={dialogStrings.viewCartButtonText}\n href={getCartPageUrl()}\n >\n {dialogStrings.viewCartButtonText}\n </Button>\n <Button\n className={`${className}__dialog__continue-shopping`}\n title={dialogStrings.orderTemplateCloseButtonText}\n onClick={close}\n >\n {dialogStrings.orderTemplateCloseButtonText}\n </Button>\n </ModalFooter>\n </Modal>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport {\n createOrderTemplate,\n CreateOrderTemplateInput,\n StringExtensions,\n updateOrderTemplateHeader,\n UpdateOrderTemplateHeaderInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nexport interface IOrderTemplateNameDialogResources {\n orderTemplateHeaderLabel: string;\n orderTemplateTitleLabel: string;\n orderTemplateNameAriaLabel: string;\n orderTemplateDescription: string;\n defaultOrderTemplateName: string;\n orderTemplateButtonLabel: string;\n orderTemplateCancelButtonLabel: string;\n orderTemplateModalAriaLabel?: string;\n}\n\nexport interface IOrderTemplateNameDialogProps extends IComponentProps {\n isUpdateDialog: boolean | undefined;\n existingOrderTemplate?: ProductList;\n className: string;\n orderTemplateName?: string;\n dialogStrings: IOrderTemplateNameDialogResources;\n modalOpen: boolean | undefined;\n parentElementRef?: React.RefObject<HTMLButtonElement>;\n setModalOpen(newValue: boolean): void;\n onCancel(): void;\n onSuccess(orderTemplate: ProductList): Promise<void>;\n}\n\nexport const OrderTemplateNameDialog = (dialogProps: IOrderTemplateNameDialogProps) => {\n const {\n isUpdateDialog,\n existingOrderTemplate,\n dialogStrings,\n className,\n modalOpen,\n setModalOpen,\n onCancel,\n onSuccess,\n context,\n parentElementRef\n } = dialogProps;\n\n if (!dialogStrings) {\n return null;\n }\n\n const [orderTemplateName, setOrderTemplateName] = useState(dialogProps.orderTemplateName);\n\n const cancel: () => void = () => {\n setModalOpen(false);\n onCancel();\n setOrderTemplateName('');\n if (parentElementRef) {\n parentElementRef.current?.focus();\n }\n };\n\n const submit: () => Promise<void> = async () => {\n dialogProps.orderTemplateName = orderTemplateName || dialogStrings.defaultOrderTemplateName;\n if (StringExtensions.isNullOrWhitespace(dialogProps.orderTemplateName)) {\n return;\n }\n if (isUpdateDialog) {\n if (existingOrderTemplate) {\n existingOrderTemplate.Name = dialogProps.orderTemplateName;\n const input: UpdateOrderTemplateHeaderInput = new UpdateOrderTemplateHeaderInput(existingOrderTemplate);\n const orderTemplate: ProductList = await updateOrderTemplateHeader(input, context.actionContext);\n setModalOpen(false);\n await onSuccess(orderTemplate);\n } else {\n context.telemetry.error('You need to pass ProductList instance for update.');\n throw new Error('Unexpected error: existing order template was not set.');\n }\n } else {\n const input: CreateOrderTemplateInput = new CreateOrderTemplateInput(dialogProps.orderTemplateName);\n const orderTemplate: ProductList = await createOrderTemplate(input, context.actionContext);\n setModalOpen(false);\n await onSuccess(orderTemplate);\n }\n };\n\n const updateOrderTemplateName = (event: React.ChangeEvent<HTMLInputElement>) => {\n setOrderTemplateName(event.target.value);\n };\n\n return (\n <Modal\n isOpen={modalOpen}\n className={`${className} msc-modal-input-required`}\n toggle={cancel}\n aria-label={dialogStrings.orderTemplateModalAriaLabel}\n >\n <ModalHeader className={`${className}__dialog__header`} toggle={cancel}>\n <span aria-live='assertive'>{dialogStrings.orderTemplateHeaderLabel}</span>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <div className={`${className}__dialog__content`}>\n <label\n className={`${className}__dialog__order-template-name-label`}\n htmlFor={`${className}__dialog__order-template-name`}\n >\n {dialogStrings.orderTemplateTitleLabel}\n </label>\n <input\n className={`${className}__dialog__order-template-name`}\n type='text'\n aria-label={dialogStrings.orderTemplateNameAriaLabel}\n placeholder={dialogStrings.defaultOrderTemplateName}\n onChange={updateOrderTemplateName}\n value={orderTemplateName}\n maxLength={250}\n />\n <div className={`${className}__dialog__description`}>{dialogStrings.orderTemplateDescription}</div>\n </div>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`}>\n <Button\n className={`${className}__dialog__create-order-template-button`}\n title={dialogStrings.orderTemplateButtonLabel}\n aria-label={dialogStrings.orderTemplateButtonLabel}\n onClick={submit}\n >\n {dialogStrings.orderTemplateButtonLabel}\n </Button>\n <Button\n className={`${className}__dialog__cancel-button`}\n title={dialogStrings.orderTemplateCancelButtonLabel}\n aria-label={dialogStrings.orderTemplateCancelButtonLabel}\n onClick={cancel}\n >\n {dialogStrings.orderTemplateCancelButtonLabel}\n </Button>\n </ModalFooter>\n </Modal>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, format } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { OrderTemplateProductsPreviewComponent } from './order-template-products-preview';\n\nexport interface IOrderTemplateComponentProps {\n className: string;\n orderTemplate: OrderTemplate;\n context: ICoreContext;\n imageSettings?: IImageSettings;\n actionButtonText: string;\n lineItemsText: string;\n orderTemplateAction(orderTemplate: ProductList): Promise<void>;\n}\n\nexport const OrderTemplateComponent = (props: IOrderTemplateComponentProps) => {\n const { orderTemplate, className, imageSettings } = props;\n\n const onActionButtonClick = () => {\n return props.orderTemplateAction(props.orderTemplate.productList);\n };\n\n const products = orderTemplate.orderTemplateLines.map(line => line.fullProduct).filter(fullProduct => fullProduct);\n\n return (\n <div className={`${className}__container`}>\n <div className={`${className}__item_header`}>\n <div className={`${className}__title`}>{orderTemplate.productList.Name}</div>\n <div className={`${className}__count`}>{format(props.lineItemsText, orderTemplate.totalLines)}</div>\n </div>\n <OrderTemplateProductsPreviewComponent\n context={props.context}\n className={className}\n products={products as FullProduct[]}\n imageSettings={imageSettings}\n />\n <div className={`${className}__footer`}>\n <Button className={`${className}__action-button`} title={props.actionButtonText} onClick={onActionButtonClick}>\n {props.actionButtonText}\n </Button>\n </div>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getAsset, IComponentProps, Image } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport {\n IOrderTemplateNameDialogResources,\n OrderTemplateNameDialog\n} from '../order-template-name-dialog/order-template-name-dialog.component';\nimport { OrderTemplateComponent } from '../order-templates-list/order-template-list';\n\nexport interface IAddToOrderTemplateDialogData {\n orderTemplates: OrderTemplate[];\n}\n\nexport interface IAddToOrderTemplateDialogResources {\n addToOrderTemplateHeader: string;\n\n noOrderTemplatesMessage: string;\n noOrderTemplatesDescription: string;\n\n createAnOrderTemplateButtonText: string;\n createNewOrderTemplateButtonText: string;\n cancelOrderTemplateCreationButtonText: string;\n\n selectTemplatesText: string;\n addToTemplateButtonText: string;\n lineItemsText: string;\n}\n\nexport interface IAddToOrderTemplateDialogProps extends IComponentProps<IAddToOrderTemplateDialogData> {\n className: string;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n\n modalOpen: boolean | undefined;\n setModalOpen(newValue: boolean): void;\n onOrderTemplateSelected(orderTemplate: ProductList): Promise<void>;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n}\n\nconst renderAddToOrderTemplatesWhenEmptyOrderTemplatesDialog = (\n dialogProps: IAddToOrderTemplateDialogProps,\n className: string,\n closeDialog: () => void,\n showOrderTemplateNameDialog: () => void\n) => {\n const { addToOrderTemplateDialogResources, modalOpen } = dialogProps;\n\n const createOrderTemplateImageUrl = `${getAsset('images/order-templates/create-order-template.svg', dialogProps.context.request)}`;\n\n return (\n <>\n <Modal isOpen={modalOpen} className={`${className} msc-modal-input-required`} toggle={closeDialog}>\n <ModalHeader className={`${className}__dialog__header`} toggle={closeDialog}>\n <span>{addToOrderTemplateDialogResources.addToOrderTemplateHeader}</span>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <div className={`${className}__dialog__content`}>\n <div className={`${className}__dialog__create-order-template-image-container`}>\n <Image\n altText={addToOrderTemplateDialogResources.createNewOrderTemplateButtonText}\n requestContext={dialogProps.context.actionContext.requestContext}\n className={`${className}__dialog__create-order-template-image`}\n src={createOrderTemplateImageUrl}\n gridSettings={dialogProps.context.request.gridSettings!}\n loadFailureBehavior='empty'\n />\n </div>\n <div className={`${className}__dialog__no-order-templates`}>\n {addToOrderTemplateDialogResources.noOrderTemplatesMessage}\n </div>\n <div className={`${className}__dialog__no-order-templates-description`}>\n {addToOrderTemplateDialogResources.noOrderTemplatesDescription}\n </div>\n </div>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`}>\n <Button\n className={`${className}__dialog__create-order-template-button`}\n title={addToOrderTemplateDialogResources.createAnOrderTemplateButtonText}\n onClick={showOrderTemplateNameDialog}\n >\n {addToOrderTemplateDialogResources.createAnOrderTemplateButtonText}\n </Button>\n <Button\n className={`${className}__dialog__cancel-button`}\n title={addToOrderTemplateDialogResources.cancelOrderTemplateCreationButtonText}\n onClick={closeDialog}\n >\n {addToOrderTemplateDialogResources.cancelOrderTemplateCreationButtonText}\n </Button>\n </ModalFooter>\n </Modal>\n </>\n );\n};\n\nconst formatBold = (text: string, boldText: string) => {\n const patternToFind = '{0}';\n return (\n <>\n {text.slice(0, text.indexOf(patternToFind))}\n <b>{boldText}</b>\n {text.slice(text.indexOf(patternToFind) + patternToFind.length)}\n </>\n );\n};\n\nconst renderAddToOrderTemplatesForExistingOrderTemplatesDialog = (\n dialogProps: IAddToOrderTemplateDialogProps,\n className: string,\n closeDialog: () => void,\n showOrderTemplateNameDialog: () => void,\n onAddToOrderTemplateButtonClick: (orderTemplate: ProductList) => Promise<void>\n) => {\n const {\n addToOrderTemplateDialogResources,\n modalOpen,\n data: { orderTemplates }\n } = dialogProps;\n\n const createOrderTemplateImageUrl = `${getAsset('images/order-templates/create-order-template.svg', dialogProps.context.request)}`;\n\n return (\n <>\n <Modal isOpen={modalOpen} className={`${className} msc-modal-input-required`} toggle={closeDialog}>\n <ModalHeader className={`${className}__dialog__header`} toggle={closeDialog}>\n <span>{addToOrderTemplateDialogResources.addToOrderTemplateHeader}</span>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <div className={`${className}__dialog__content`}>\n <div className={`${className}__dialog__order-templates-description`}>\n {formatBold(addToOrderTemplateDialogResources.selectTemplatesText, orderTemplates.length.toString())}\n </div>\n <div className={`${className}__dialog__order-templates-container`}>\n <div\n className={classnames(\n `${className}__dialog__order-templates-line__container`,\n `${className}__dialog__order-templates-line__container__create-new-line`\n )}\n >\n <Image\n altText={addToOrderTemplateDialogResources.createNewOrderTemplateButtonText}\n requestContext={dialogProps.context.actionContext.requestContext}\n className={`${className}__dialog__order-templates-line__container__create-new-line__image`}\n src={createOrderTemplateImageUrl}\n gridSettings={dialogProps.context.request.gridSettings!}\n loadFailureBehavior='empty'\n />\n <Button\n className={`${className}__dialog__order-templates-line__container__create-new-line__button`}\n onClick={showOrderTemplateNameDialog}\n >\n {addToOrderTemplateDialogResources.createNewOrderTemplateButtonText}\n </Button>\n </div>\n {orderTemplates.map((orderTemplate, index) => {\n return (\n <OrderTemplateComponent\n key={index}\n className={`${className}__dialog__order-templates-line`}\n orderTemplate={orderTemplate}\n context={dialogProps.context}\n actionButtonText={addToOrderTemplateDialogResources.addToTemplateButtonText}\n lineItemsText={addToOrderTemplateDialogResources.lineItemsText}\n orderTemplateAction={onAddToOrderTemplateButtonClick}\n />\n );\n })}\n </div>\n </div>\n </ModalBody>\n </Modal>\n </>\n );\n};\n\nexport const AddToOrderTemplateDialog = (dialogProps: IAddToOrderTemplateDialogProps) => {\n const {\n setModalOpen,\n data: { orderTemplates },\n className\n } = dialogProps;\n\n const closeDialog = () => {\n setModalOpen(false);\n };\n\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\n const showOrderTemplateNameDialog = () => {\n setModalOpen(false);\n setTimeout(() => {\n setOrderTemplateNameDialogOpen(true);\n }, 500);\n };\n const onCreateOrderTemplateCancel = () => {\n setTimeout(() => {\n setModalOpen(true);\n }, 500);\n };\n\n let addToOrderTemplateDialog: JSX.Element;\n if (orderTemplates.length !== 0) {\n addToOrderTemplateDialog = renderAddToOrderTemplatesForExistingOrderTemplatesDialog(\n dialogProps,\n `${className}__existing`,\n closeDialog,\n showOrderTemplateNameDialog,\n dialogProps.onOrderTemplateSelected\n );\n } else {\n addToOrderTemplateDialog = renderAddToOrderTemplatesWhenEmptyOrderTemplatesDialog(\n dialogProps,\n `${className}__empty`,\n closeDialog,\n showOrderTemplateNameDialog\n );\n }\n\n return (\n <>\n {addToOrderTemplateDialog}\n <OrderTemplateNameDialog\n className='msc-order-template-name-dialog'\n modalOpen={isCreateOrderTemplateDialogOpen}\n isUpdateDialog={false}\n setModalOpen={setOrderTemplateNameDialogOpen}\n context={dialogProps.context}\n id={dialogProps.id}\n data={{}}\n typeName={dialogProps.typeName}\n dialogStrings={dialogProps.createOrderTemplateDialogResources}\n onCancel={onCreateOrderTemplateCancel}\n onSuccess={dialogProps.onOrderTemplateSelected}\n />\n </>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { getUrlSync, IComponentProps, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { ProductDimensionType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { OrderTemplateProductsPreviewComponent } from '../order-templates-list/order-template-products-preview';\n\nexport interface ILinesAddedToOrderTemplateDialogResources {\n viewOrderTemplateButtonText: string;\n continueShoppingButtonText: string;\n linesAddedToOrderTemplateHeaderItemsOneText: string;\n linesAddedToOrderTemplateHeaderItemsFormatText: string;\n linesAddedToOrderTemplateHeaderLinesOneText: string;\n linesAddedToOrderTemplateHeaderLinesFormatText: string;\n linesAddedToOrderTemplateHeaderMessageText: string;\n linesAddedToOrderTemplateCustomPriceAlertMessageText?: string;\n}\n\nexport interface ILinesAddedToOrderTemplateDialogData {\n itemsCount: number;\n linesCount: number;\n orderTemplate: ProductList;\n products: FullProduct[];\n}\n\nexport interface ILinesAddedToOrderTemplateDialogProps extends IComponentProps<ILinesAddedToOrderTemplateDialogData> {\n className: string;\n imageSettings?: IImageSettings;\n\n dialogStrings: ILinesAddedToOrderTemplateDialogResources;\n\n modalOpen: boolean | undefined;\n\n // as required passing in components for later user\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n}\n\nexport const LinesAddedToOrderTemplateDialog = (dialogProps: ILinesAddedToOrderTemplateDialogProps) => {\n const {\n dialogStrings,\n className,\n context,\n modalOpen,\n imageSettings,\n data: { orderTemplate, products, itemsCount, linesCount }\n } = dialogProps;\n\n const getOrderTemplatePageUrl = (): string => {\n const url = getUrlSync('ordertemplate', context.actionContext) || '';\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}id=${orderTemplate.Id}`;\n };\n\n const close = React.useCallback(() => {\n window.location.reload(true);\n }, []);\n\n const itemsString =\n itemsCount === 1\n ? dialogStrings.linesAddedToOrderTemplateHeaderItemsOneText\n : dialogStrings.linesAddedToOrderTemplateHeaderItemsFormatText.replace('{0}', itemsCount.toString());\n const lineItemsString =\n linesCount === 1\n ? dialogStrings.linesAddedToOrderTemplateHeaderLinesOneText\n : dialogStrings.linesAddedToOrderTemplateHeaderLinesFormatText.replace('{0}', linesCount.toString());\n\n const addedProducts = products.filter(\n product =>\n !product.ProductDetails.Dimensions?.find(\n dimension => dimension.DimensionTypeValue === ProductDimensionType.Style && dimension.DimensionValue?.Value === 'Custom'\n )\n );\n const filteredProducts = products.filter(product =>\n product.ProductDetails.Dimensions?.find(\n dimension => dimension.DimensionTypeValue === ProductDimensionType.Style && dimension.DimensionValue?.Value === 'Custom'\n )\n );\n\n return (\n <Modal isOpen={modalOpen} className={`${className}`} toggle={close}>\n <ModalHeader className={`${className}__dialog__header`} toggle={close}>\n <b>{lineItemsString}</b>\n <span aria-live='assertive'>{dialogStrings.linesAddedToOrderTemplateHeaderMessageText}</span>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <div className={`${className}__dialog__content`}>\n <OrderTemplateProductsPreviewComponent\n context={context}\n className={`${className}__dialog`}\n products={addedProducts}\n imageSettings={imageSettings}\n />\n <div className={`${className}__dialog__description`}>\n <div className={`${className}__dialog__order-template-name`}>{orderTemplate.Name}</div>\n <div className={`${className}__dialog__order-template-items`}>{itemsString}</div>\n </div>\n {ArrayExtensions.hasElements(filteredProducts) ? (\n <>\n <Alert color='danger' assertive aria-label={dialogStrings.linesAddedToOrderTemplateCustomPriceAlertMessageText}>\n <div className='msc-alert__header'>\n <span className='msi-exclamation-triangle' />\n <span>{dialogStrings.linesAddedToOrderTemplateCustomPriceAlertMessageText}</span>\n </div>\n </Alert>\n <OrderTemplateProductsPreviewComponent\n context={context}\n className={`${className}__dialog`}\n products={filteredProducts}\n imageSettings={imageSettings}\n />\n </>\n ) : null}\n </div>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`}>\n <Button\n className={`${className}__dialog__view-order-template-button`}\n title={dialogStrings.viewOrderTemplateButtonText}\n href={getOrderTemplatePageUrl()}\n >\n {dialogStrings.viewOrderTemplateButtonText}\n </Button>\n <Button\n className={`${className}__dialog__continue-shopping`}\n title={dialogStrings.continueShoppingButtonText}\n onClick={close}\n >\n {dialogStrings.continueShoppingButtonText}\n </Button>\n </ModalFooter>\n </Modal>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { ICoreContext, getCatalogId, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { Customer, ProductList, ProductListLine, ProductListsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n FullProductInput,\n getFullProducts,\n getProductDetailsCriteriaFromActionInput,\n OrderTemplate,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport {\n AddToOrderTemplateDialog,\n IAddToOrderTemplateDialogResources\n} from '../add-to-order-template-dialog/add-to-order-template-dialog.component';\nimport {\n ILinesAddedToOrderTemplateDialogResources,\n LinesAddedToOrderTemplateDialog\n} from '../lines-added-to-order-template-dialog/lines-added-to-order-template-dialog.component';\nimport { IOrderTemplateNameDialogResources } from '../order-template-name-dialog/order-template-name-dialog.component';\n\n/**\n * Data for the add products to order template component.\n */\nexport interface IAddProductsToOrderTemplateData {\n orderTemplates: OrderTemplate[];\n products: ProductListLine[];\n\n customerInformation?: Customer;\n}\n\n/**\n * Resources for the add products to order template component.\n */\nexport interface IAddProductsToOrderTemplateResources\n extends IAddToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n ILinesAddedToOrderTemplateDialogResources {\n addProductsToOrderTemplateButton: string;\n addProductsToOrderTemplateButtonTooltip: string;\n}\n\n/**\n * Props for the add products to order template component.\n */\nexport interface IAddProductsToOrderTemplateProps {\n className: string;\n\n context: ICoreContext;\n\n data: IAddProductsToOrderTemplateData;\n\n resources: IAddProductsToOrderTemplateResources;\n\n isDisabled?: boolean;\n\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n}\n\nconst modalTimeoutTime = 500;\n\n/**\n * Add products to order template component.\n * @param props - Component props.\n * @returns React node.\n */\nexport const AddProductsToOrderTemplateComponent: React.FC<IAddProductsToOrderTemplateProps> = (\n props: IAddProductsToOrderTemplateProps\n) => {\n const [chosenOrderTemplate, setChosenOrderTemplate] = useState<ProductList | undefined>(undefined);\n const [addedProducts, setAddedProducts] = useState<FullProduct[] | undefined>(undefined);\n const [isAddToOrderTemplateModalOpen, setIsAddToOrderTemplateModalOpen] = useState(false);\n const [isLinesAddedToOrderTemplateDialogOpen, setIsLinesAddedToOrderTemplateDialogOpen] = useState(false);\n const [addedLinesCount, setAddedLinesCount] = useState(0);\n const [addedItemsCount, setAddedItemsCount] = useState(0);\n\n /**\n * Adds product to the selected order template.\n * @param orderTemplate - Order template to use for adding products.\n */\n const onOrderTemplateSelected = React.useCallback(\n async (orderTemplate: ProductList) => {\n setChosenOrderTemplate(orderTemplate);\n // assuming selected catalogId will be passed to component and if not passed then get from context\n const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\n validateCatalogId(catalogId);\n const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n const linesToAdd: ProductListLine[] = props.data.products.map(line => {\n return {\n ...line,\n ...(isMultipleCatalogFeatureEnabledInHq && { catalogId: line.CatalogId || catalogId }),\n ProductListId: orderTemplate.Id\n };\n });\n\n const allProductInputs: FullProductInput[] = [];\n for (const listLine of linesToAdd) {\n if (listLine.ProductId) {\n allProductInputs.push(\n new FullProductInput(\n listLine.ProductId,\n props.context.actionContext.requestContext.apiSettings,\n getProductDetailsCriteriaFromActionInput(props.context.actionContext),\n props.context.actionContext.requestContext\n )\n );\n }\n }\n\n const allProducts = await getFullProducts(allProductInputs, props.context.actionContext);\n\n const addedLines = await ProductListsDataActions.addProductListLinesAsync(\n { callerContext: props.context.actionContext },\n orderTemplate.Id,\n linesToAdd\n );\n\n const quantities = addedLines.map(line => line.Quantity ?? 0);\n setAddedLinesCount(addedLines.length);\n setAddedItemsCount(ArrayExtensions.hasElements(quantities) ? ArrayExtensions.calculateSum(quantities) : 0);\n setAddedProducts(allProducts);\n\n setIsAddToOrderTemplateModalOpen(false);\n setTimeout(() => {\n setIsLinesAddedToOrderTemplateDialogOpen(true);\n }, modalTimeoutTime);\n },\n [props.context.actionContext, props.data.products]\n );\n\n const onAddProductsToOrderTemplateClick = React.useCallback(() => {\n setIsAddToOrderTemplateModalOpen(true);\n }, []);\n\n if (!isChannelTypeB2B(props.context.actionContext.requestContext)) {\n return null;\n }\n\n const addToOrderTemplateReference: React.RefObject<HTMLButtonElement> = React.createRef();\n const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n return (\n <div className={props.className}>\n <AddToOrderTemplateDialog\n className='msc-add-to-order-template-dialog'\n id=''\n typeName=''\n modalOpen={isAddToOrderTemplateModalOpen}\n setModalOpen={setIsAddToOrderTemplateModalOpen}\n context={props.context}\n data={{ orderTemplates: props.data.orderTemplates }}\n addToOrderTemplateDialogResources={props.resources}\n createOrderTemplateDialogResources={props.resources}\n onOrderTemplateSelected={onOrderTemplateSelected}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n />\n {chosenOrderTemplate && addedProducts && (\n <LinesAddedToOrderTemplateDialog\n className='msc-lines-added-to-order-template-dialog'\n id=''\n typeName=''\n context={props.context}\n dialogStrings={props.resources}\n data={{\n linesCount: addedLinesCount,\n itemsCount: addedItemsCount,\n orderTemplate: chosenOrderTemplate,\n products: addedProducts\n }}\n modalOpen={isLinesAddedToOrderTemplateDialogOpen}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n />\n )}\n <Button\n className={`${props.className}__add-button`}\n onClick={onAddProductsToOrderTemplateClick}\n title={props.resources.addProductsToOrderTemplateButton}\n innerRef={addToOrderTemplateReference}\n disabled={props.isDisabled}\n >\n {props.resources.addProductsToOrderTemplateButton}\n </Button>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n duplicatedProductsHeader: string;\n\n duplicatedProductsDescription: string;\n\n updateQuantityButtonText: string;\n cancelDuplicateItemsButtonText: string;\n}\n\nexport interface IDuplicateItemsWhenAddingToOrderTemplateDialogProps extends IComponentProps {\n className: string;\n\n dialogStrings?: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n modalOpen: boolean | undefined;\n\n executeOverrideQuantity(): Promise<void>;\n onCancel(): void;\n // as required passing in components for later user\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n}\n\nexport const DuplicateItemsWhenAddingToOrderTemplateDialog = (dialogProps: IDuplicateItemsWhenAddingToOrderTemplateDialogProps) => {\n const { dialogStrings, className, modalOpen, executeOverrideQuantity } = dialogProps;\n\n return (\n <Modal isOpen={modalOpen} className={`${className}`} toggle={dialogProps.onCancel}>\n <ModalHeader className={`${className}__dialog__header`} toggle={dialogProps.onCancel}>\n <span>{dialogStrings?.duplicatedProductsHeader}</span>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <div className={`${className}__dialog__content`}>\n <div className={`${className}__dialog__description`}>{dialogStrings?.duplicatedProductsDescription}</div>\n </div>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`}>\n <Button\n className={`${className}__dialog__update-quantity-button`}\n title={dialogStrings?.updateQuantityButtonText}\n onClick={executeOverrideQuantity}\n >\n {dialogStrings?.updateQuantityButtonText}\n </Button>\n <Button\n className={`${className}__dialog__cancel-button`}\n title={dialogStrings?.cancelDuplicateItemsButtonText}\n onClick={dialogProps.onCancel}\n >\n {dialogStrings?.cancelDuplicateItemsButtonText}\n </Button>\n </ModalFooter>\n </Modal>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getUrlSync, IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { PriceComponent } from '../../price/price.components';\n\nexport interface IItemAddedToOrderTemplateDialogResources {\n viewOrderTemplateButtonText: string;\n continueShoppingButtonText: string;\n itemAddedToOrderTemplateHeaderItemOneText: string;\n itemAddedToOrderTemplateHeaderItemFormatText: string;\n itemAddedToOrderTemplateHeaderMessageText: string;\n\n freePriceText: string;\n originalPriceText: string;\n currentPriceText: string;\n}\n\nexport interface IItemAddedToOrderTemplateDialogData {\n product: SimpleProduct;\n productPrice: ProductPrice;\n quantity: number;\n orderTemplateId: string;\n}\n\nexport interface IItemAddedToOrderTemplateDialogProps extends IComponentProps<IItemAddedToOrderTemplateDialogData> {\n className: string;\n\n dialogStrings: IItemAddedToOrderTemplateDialogResources;\n\n modalOpen: boolean | undefined;\n\n // as required passing in components for later user\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n imageSettings?: IImageSettings;\n}\n\nconst renderOrderTemplateImage = (context: ICoreContext, className: string, product: SimpleProduct, imageSettings?: IImageSettings) => {\n const fallbackImageUrl = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className={`${className}__image-props`}\n src={product.PrimaryImageUrl || ''}\n altText={product.Name}\n fallBackSrc={fallbackImageUrl}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n};\n\nexport const ItemAddedToOrderTemplateDialog = (dialogProps: IItemAddedToOrderTemplateDialogProps) => {\n const {\n dialogStrings,\n className,\n context,\n modalOpen,\n imageSettings,\n data: { orderTemplateId, product, productPrice, quantity }\n } = dialogProps;\n\n const getOrderTemplatePageUrl = (): string => {\n const url = getUrlSync('ordertemplate', context.actionContext) || '';\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}id=${orderTemplateId}`;\n };\n\n const close: () => void = () => {\n window.location.reload(true);\n };\n\n const itemsString =\n quantity === 1\n ? dialogStrings.itemAddedToOrderTemplateHeaderItemOneText\n : dialogStrings.itemAddedToOrderTemplateHeaderItemFormatText.replace('{0}', quantity.toString());\n\n return (\n <Modal isOpen={modalOpen} className={`${className}`} toggle={close}>\n <ModalHeader className={`${className}__dialog__header`} toggle={close}>\n <b>{itemsString}</b>\n <span>{dialogStrings.itemAddedToOrderTemplateHeaderMessageText}</span>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <div className={`${className}__dialog__content`}>\n {renderOrderTemplateImage(context, `${className}__dialog`, product, imageSettings)}\n <div className={`${className}__dialog__description`}>\n <div className={`${className}__dialog__product-name`}>{product.Name}</div>\n <div className={`${className}__dialog__product-price`}>\n {productPrice && (\n <PriceComponent\n data={{ price: productPrice }}\n context={dialogProps.context}\n id={dialogProps.id}\n typeName={dialogProps.typeName}\n freePriceText={dialogProps.dialogStrings.freePriceText}\n originalPriceText={dialogProps.dialogStrings.originalPriceText}\n currentPriceText={dialogProps.dialogStrings.currentPriceText}\n />\n )}\n </div>\n {product.Dimensions && (\n <div className={`${className}__dialog__product-dimensions`}>\n {product.Dimensions.map(dimension => dimension.DimensionValue?.Value)\n .filter(value => value)\n .join(', ')}\n </div>\n )}\n </div>\n </div>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`}>\n <Button\n className={`${className}__dialog__view-order-template-button`}\n title={dialogStrings.viewOrderTemplateButtonText}\n href={getOrderTemplatePageUrl()}\n >\n {dialogStrings.viewOrderTemplateButtonText}\n </Button>\n <Button\n className={`${className}__dialog__continue-shopping`}\n title={dialogStrings.continueShoppingButtonText}\n onClick={close}\n >\n {dialogStrings.continueShoppingButtonText}\n </Button>\n </ModalFooter>\n </Modal>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce, isChannelTypeB2B, IImageSettings } from '@msdyn365-commerce/core';\nimport { AsyncResult, Customer, ProductDimension, ProductList, ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n addItemToOrderTemplate,\n AddItemToOrderTemplateInput,\n getPriceForSelectedVariant,\n OrderTemplate,\n PriceForSelectedVariantInput,\n updateOrderTemplateAction,\n UpdateOrderTemplateInput,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as Popper from 'popper.js';\nimport React, { useState } from 'react';\n\nimport {\n AddToOrderTemplateDialog,\n IAddToOrderTemplateDialogData,\n IAddToOrderTemplateDialogResources\n} from '../add-to-order-template-dialog/add-to-order-template-dialog.component';\nimport {\n DuplicateItemsWhenAddingToOrderTemplateDialog,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources\n} from '../duplicate-items-when-adding-to-order-template-dialog/duplicate-items-when-adding-to-order-template-dialog.component';\nimport {\n IItemAddedToOrderTemplateDialogResources,\n ItemAddedToOrderTemplateDialog\n} from '../item-added-to-order-template-dialog/item-added-to-order-template-dialog.component';\nimport { IOrderTemplateNameDialogResources } from '../order-template-name-dialog/order-template-name-dialog.component';\n\nexport interface IAddToOrderTemplateComponentProps extends IComponentProps<IAddToOrderTemplateData> {\n className?: string;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateButtonTooltip: string;\n\n addToOrderTemplateMessage?: string;\n addItemToOrderTemplateError?: string;\n\n showButtonText?: boolean;\n showButtonTooltip?: boolean;\n shouldShowButtonFailedTooltip?: boolean;\n disableButton?: boolean;\n tooltipPosition?: Popper.Placement;\n showStatusMessage?: boolean;\n disabled?: boolean;\n canAddMasterProduct?: boolean;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n\n imageSettings?: IImageSettings;\n\n onSuccess?(): void;\n onError?(result: IOrderTemplateActionErrorResult): void;\n}\n\nexport interface IOrderTemplateActionErrorResult {\n status: 'FAILED' | 'MISSING_DIMENSION';\n\n missingDimensions?: ProductDimension[];\n}\n\ninterface IAddToOrderTemplateStateManager {\n waiting: boolean;\n content: IAddToOrderTemplateContentState;\n\n setWaiting(newWaiting: boolean): void;\n setContent(newContent: IAddToOrderTemplateContentState): void;\n}\n\ninterface IAddToOrderTemplateContentState {\n showAlert?: boolean;\n orderTemplateTextMessage?: string;\n color?: string;\n}\n\ninterface IAddToOrderTemplateData {\n orderTemplates: OrderTemplate[];\n\n product: SimpleProduct;\n quantity: number;\n\n customerInformation?: Customer;\n isChannelTypeB2B?: boolean;\n}\n\nexport interface IAddToOrderTemplateComponent extends IComponent<IAddToOrderTemplateComponentProps> {\n onClick(): (\n event: React.MouseEvent<HTMLElement>,\n props: IAddToOrderTemplateComponentProps,\n state: IAddToOrderTemplateStateManager\n ) => void;\n}\n\nconst onClick = async (\n _event: React.MouseEvent<HTMLElement>,\n props: IAddToOrderTemplateComponentProps,\n state: IAddToOrderTemplateStateManager,\n openModal: (opened: boolean) => void\n): Promise<void> => {\n const { user } = props.context.request;\n\n if (state.waiting) {\n return;\n }\n\n if (!user.isAuthenticated && user.signInUrl && window) {\n window.location.assign(user.signInUrl);\n return;\n }\n\n addToOrderTemplate(props, openModal);\n state.setWaiting(false);\n};\n\nconst onDismiss = (state: IAddToOrderTemplateStateManager): void => {\n state.setContent({ color: 'success', showAlert: false });\n};\n\nconst AddToOrderTemplateComponentActions = {\n onClick,\n onDismiss\n};\n\nconst hasProductInOrderTemplates = (productToFind: SimpleProduct) => {\n /*\n TODO: Currently API does not support filtering by products.\n await getProductListLinesAsync(context, '',)\n return orderTemplates.filter(orderTemplate =>\n orderTemplate.orderTemplateLines.filter(\n product => product.productListLine.ProductId === productToFind.RecordId).length !== 0).length !== 0;\n */\n return false;\n};\n\nconst AddToOrderTemplate: React.FC<IAddToOrderTemplateComponentProps> = (props: IAddToOrderTemplateComponentProps) => {\n if (!isChannelTypeB2B(props.context.actionContext.requestContext)) {\n return null;\n }\n\n const [waiting, setWaiting] = useState(false);\n const [content, setContent] = useState({});\n const state: IAddToOrderTemplateStateManager = {\n waiting,\n content,\n\n setWaiting,\n setContent\n };\n\n const [addToOrderTemplateModalOpen, setAddToOrderTemplateModalOpen] = useState(false);\n\n const [chosenOrderTemplateId, setChosenOrderTemplateId] = useState<string | undefined>(undefined);\n const [productPrice, setProductPrice] = useState<ProductPrice | null>(null);\n const [itemAddedToOrderTemplateDialogOpen, setItemAddedToOrderTemplateDialogOpen] = useState(false);\n const [duplicateItemsWhenAddingToOrderTemplateDialogOpen, setDuplicateItemsWhenAddingToOrderTemplateDialogOpen] = useState(false);\n const catalogId = props.catalogId;\n validateCatalogId(catalogId);\n const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n const executeAddItemToOrderTemplate = async (orderTemplate: ProductList) => {\n setChosenOrderTemplateId(orderTemplate.Id);\n const input = isMultipleCatalogFeatureEnabledInHq\n ? new AddItemToOrderTemplateInput(\n orderTemplate.Id,\n props.data.product.RecordId,\n props.data.quantity,\n props.data.product.DefaultUnitOfMeasure || 'ea',\n isMultipleCatalogFeatureEnabledInHq,\n catalogId\n )\n : new AddItemToOrderTemplateInput(\n orderTemplate.Id,\n props.data.product.RecordId,\n props.data.quantity,\n props.data.product.DefaultUnitOfMeasure || 'ea'\n );\n await addItemToOrderTemplate(input, props.context.actionContext)\n .then(async result => {\n const retrievedProductPrice = await getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(\n props.data.product.RecordId,\n props.context.actionContext.requestContext.apiSettings.channelId,\n props.data.product\n ),\n props.context.actionContext\n );\n setProductPrice(retrievedProductPrice);\n setAddToOrderTemplateModalOpen(false);\n setTimeout(() => {\n setItemAddedToOrderTemplateDialogOpen(true);\n }, 500);\n })\n .catch(error => {\n if (error.error?.name !== 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n return AsyncResult.reject(error);\n }\n setAddToOrderTemplateModalOpen(false);\n setTimeout(() => {\n setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(true);\n }, 500);\n return AsyncResult.resolve();\n });\n };\n\n const onDuplicateDialogCancel = () => {\n setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(false);\n setTimeout(() => {\n setAddToOrderTemplateModalOpen(true);\n }, 500);\n };\n\n const overrideQuantity = async () => {\n const input = isMultipleCatalogFeatureEnabledInHq\n ? new UpdateOrderTemplateInput(\n chosenOrderTemplateId!,\n props.data.product.RecordId,\n props.data.quantity,\n props.data.product.DefaultUnitOfMeasure || 'ea',\n isMultipleCatalogFeatureEnabledInHq,\n catalogId\n )\n : new UpdateOrderTemplateInput(\n chosenOrderTemplateId!,\n props.data.product.RecordId,\n props.data.quantity,\n props.data.product.DefaultUnitOfMeasure || 'ea'\n );\n await updateOrderTemplateAction(input, props.context.actionContext);\n\n const retrievedProductPrice = await getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(\n props.data.product.RecordId,\n props.context.actionContext.requestContext.apiSettings.channelId,\n props.data.product\n ),\n props.context.actionContext\n );\n setProductPrice(retrievedProductPrice);\n setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(false);\n setTimeout(() => {\n setItemAddedToOrderTemplateDialogOpen(true);\n }, 500);\n };\n\n const {\n addToOrderTemplateButtonText,\n showStatusMessage,\n showButtonText,\n className,\n disabled,\n showButtonTooltip,\n shouldShowButtonFailedTooltip,\n disableButton,\n tooltipPosition,\n addToOrderTemplateButtonTooltip,\n addToOrderTemplateDialogResources,\n createOrderTemplateDialogResources\n } = props;\n\n const onDismissHandler = () => {\n AddToOrderTemplateComponentActions.onDismiss(state);\n };\n const ariaLabel = addToOrderTemplateButtonText;\n const addToOrderTemplateRef: React.RefObject<HTMLButtonElement> = React.createRef();\n const showMessage = showStatusMessage !== undefined ? showStatusMessage : true;\n const showTooltip = showButtonTooltip !== undefined ? showButtonTooltip : true;\n const tooltipPos = showButtonTooltip !== undefined ? tooltipPosition : 'top-end';\n\n const dialogData: IAddToOrderTemplateDialogData = {\n orderTemplates: props.data.orderTemplates\n };\n\n const onClickHandler = (event: React.MouseEvent<HTMLElement>) => {\n return AddToOrderTemplateComponentActions.onClick(event, props, state, setAddToOrderTemplateModalOpen);\n };\n\n return (\n <>\n <>\n <button\n className={classnames(\n className,\n hasProductInOrderTemplates(props.data.product)\n ? 'msc-add-to-order-template-icon__added'\n : 'msc-add-to-order-template-icon',\n state.waiting ? 'msc-add-to-order-template-icon__waiting' : ''\n )}\n aria-label={ariaLabel}\n onClick={disableButton ? undefined : onClickHandler}\n disabled={disabled}\n ref={addToOrderTemplateRef}\n >\n {showButtonText ? ariaLabel : ''}\n </button>\n {showTooltip && (\n <UncontrolledTooltip placement={tooltipPos} trigger='hover focus' target={addToOrderTemplateRef}>\n {shouldShowButtonFailedTooltip ? addToOrderTemplateButtonTooltip : ariaLabel}\n </UncontrolledTooltip>\n )}\n </>\n {state.content.showAlert && showMessage ? (\n <div className='ms-order-template-items__product-status'>\n <Alert color={state.content.color} isOpen={state.content.showAlert} toggle={onDismissHandler}>\n {state.content.orderTemplateTextMessage}\n </Alert>\n </div>\n ) : (\n ''\n )}\n <AddToOrderTemplateDialog\n className='msc-add-to-order-template-dialog'\n modalOpen={addToOrderTemplateModalOpen}\n setModalOpen={setAddToOrderTemplateModalOpen}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n data={dialogData}\n addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\n createOrderTemplateDialogResources={createOrderTemplateDialogResources}\n onOrderTemplateSelected={executeAddItemToOrderTemplate}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n />\n {chosenOrderTemplateId && productPrice && (\n <ItemAddedToOrderTemplateDialog\n className='msc-item-added-to-order-template-dialog'\n id={props.id}\n typeName={props.typeName}\n context={props.context}\n dialogStrings={props.itemAddedToOrderTemplateDialogResources}\n imageSettings={props.imageSettings !== undefined ? props.imageSettings : undefined}\n data={{\n product: props.data.product,\n quantity: props.data.quantity,\n orderTemplateId: chosenOrderTemplateId,\n productPrice\n }}\n modalOpen={itemAddedToOrderTemplateDialogOpen}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n />\n )}\n <DuplicateItemsWhenAddingToOrderTemplateDialog\n className='msc-duplicate-items-when-adding-to-order-template-dialog'\n id={props.id}\n typeName={props.typeName}\n context={props.context}\n dialogStrings={props.duplicateItemsWhenAddingToOrderTemplateDialogResources}\n data={{}}\n modalOpen={duplicateItemsWhenAddingToOrderTemplateDialogOpen}\n executeOverrideQuantity={overrideQuantity}\n onCancel={onDuplicateDialogCancel}\n // isMultipleCatalogFeatureEnabledInHq={props.isMultipleCatalogFeatureEnabledInHq}\n // {...(props.isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n />\n </>\n );\n};\n\nconst addToOrderTemplate = (props: IAddToOrderTemplateComponentProps, openModal: (opened: boolean) => void): void => {\n const { canAddMasterProduct } = props;\n\n if (props.data.product.Dimensions && !canAddMasterProduct) {\n const missingDimensions = props.data.product.Dimensions.filter(\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n );\n\n if (missingDimensions.length > 0) {\n // At least one dimension with no value exists on the product, won't be able to proceed.\n propagateError(props, { status: 'MISSING_DIMENSION', missingDimensions });\n return;\n }\n }\n\n openModal(true);\n};\n\nconst propagateError = (props: IAddToOrderTemplateComponentProps, result: IOrderTemplateActionErrorResult): void => {\n const { onError } = props;\n\n if (onError) {\n onError(result);\n }\n};\n\nexport const AddToOrderTemplateComponent: React.FunctionComponent<IAddToOrderTemplateComponentProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error\n IAddToOrderTemplateComponent\n>('AddToOrderTemplate', { component: AddToOrderTemplate, ...AddToOrderTemplateComponentActions });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getUrlSync, IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { PriceComponent } from '../../price/price.components';\n\nexport interface IItemAddedToCartDialogResources {\n viewCartButtonText: string;\n orderTemplateCloseButtonText: string;\n itemAddedToCartHeaderItemOneText: string;\n itemAddedToCartHeaderItemFormatText: string;\n itemAddedToCartHeaderMessageText: string;\n\n freePriceText: string;\n originalPriceText: string;\n currentPriceText: string;\n}\n\nexport interface IItemAddedToCartDialogData {\n product: SimpleProduct;\n productPrice: ProductPrice;\n quantity: number;\n}\n\nexport interface IItemAddedToCartDialogProps extends IComponentProps<IItemAddedToCartDialogData> {\n className: string;\n\n dialogStrings: IItemAddedToCartDialogResources;\n\n modalOpen: boolean | undefined;\n\n // as required passing in components for later user\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n onClose(): void;\n}\n\nconst renderImage = (context: ICoreContext, className: string, product: SimpleProduct, imageSettings?: IImageSettings) => {\n const fallbackImageUrl = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className={`${className}__image-props`}\n src={product.PrimaryImageUrl || ''}\n altText={product.Name}\n fallBackSrc={fallbackImageUrl}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n};\n\nexport const ItemAddedToCartDialog = (dialogProps: IItemAddedToCartDialogProps) => {\n const {\n dialogStrings,\n className,\n context,\n modalOpen,\n data: { product, productPrice, quantity }\n } = dialogProps;\n\n const getCartPageUrl = (): string => {\n return getUrlSync('cart', context.actionContext) || '';\n };\n\n const close: () => void = () => {\n dialogProps.onClose();\n };\n\n const itemsString =\n quantity === 1\n ? dialogStrings.itemAddedToCartHeaderItemOneText\n : dialogStrings.itemAddedToCartHeaderItemFormatText.replace('{0}', quantity.toString());\n\n return (\n <Modal isOpen={modalOpen} className={`${className}`} toggle={close}>\n <ModalHeader className={`${className}__dialog__header`} toggle={close}>\n <b>{itemsString}</b>\n <span>{dialogStrings.itemAddedToCartHeaderMessageText}</span>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <div className={`${className}__dialog__content`}>\n {renderImage(context, `${className}__dialog`, product)}\n <div className={`${className}__dialog__description`}>\n <div className={`${className}__dialog__product-name`}>{product.Name}</div>\n <div className={`${className}__dialog__product-price`}>\n {productPrice && (\n <PriceComponent\n data={{ price: productPrice }}\n context={dialogProps.context}\n id={dialogProps.id}\n typeName={dialogProps.typeName}\n freePriceText={dialogProps.dialogStrings.freePriceText}\n originalPriceText={dialogProps.dialogStrings.originalPriceText}\n currentPriceText={dialogProps.dialogStrings.currentPriceText}\n />\n )}\n </div>\n {product.Dimensions && (\n <div className={`${className}__dialog__product-dimensions`}>\n {product.Dimensions.map(dimension => dimension.DimensionValue?.Value)\n .filter(value => value)\n .join(', ')}\n </div>\n )}\n </div>\n </div>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`}>\n <Button\n className={`${className}__dialog__view-cart-button`}\n title={dialogStrings.viewCartButtonText}\n href={getCartPageUrl()}\n >\n {dialogStrings.viewCartButtonText}\n </Button>\n <Button\n className={`${className}__dialog__continue-shopping`}\n title={dialogStrings.orderTemplateCloseButtonText}\n onClick={close}\n >\n {dialogStrings.orderTemplateCloseButtonText}\n </Button>\n </ModalFooter>\n </Modal>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { IComponent, IComponentProps, msdyn365Commerce, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { AsyncResult, CartLine, Customer, ProductList, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport {\n addProductListLinesAsync,\n updateProductListLinesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport {\n FullProductInput,\n getFullProducts,\n getProductDetailsCriteriaFromActionInput,\n getProductListLines,\n GetProductListLinesInput,\n OrderTemplate\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport {\n AddToOrderTemplateDialog,\n IAddToOrderTemplateDialogResources\n} from '../add-to-order-template-dialog/add-to-order-template-dialog.component';\nimport {\n ILinesAddedToOrderTemplateDialogResources,\n LinesAddedToOrderTemplateDialog\n} from '../lines-added-to-order-template-dialog/lines-added-to-order-template-dialog.component';\nimport { IOrderTemplateNameDialogResources } from '../order-template-name-dialog/order-template-name-dialog.component';\nimport {\n DuplicateItemsWhenAddingToOrderTemplateDialog,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources\n} from '../duplicate-items-when-adding-to-order-template-dialog/duplicate-items-when-adding-to-order-template-dialog.component';\nexport interface ISaveCartToOrderTemplateComponentProps extends IComponentProps<ISaveCartToOrderTemplateData> {\n className?: string;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogId?: number;\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n linesAddedToOrderTemplateDialogResources: ILinesAddedToOrderTemplateDialogResources;\n\n createOrderTemplateFromCartButton: string;\n createOrderTemplateFromCartButtonTooltip: string;\n\n duplicateItemsWhenAddingToOrderTemplateDialogResources?: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n}\n\ninterface ISaveCartToOrderTemplateData {\n orderTemplates: OrderTemplate[];\n cartLines: CartLine[];\n customerInformation?: Customer;\n isChannelTypeB2B?: boolean;\n}\n\ninterface ISaveCartToOrderTemplateContentState {\n showAlert?: boolean;\n orderTemplateTextMessage?: string;\n color?: string;\n}\n\ninterface ISaveCartToOrderTemplateStateManager {\n waiting: boolean;\n content: ISaveCartToOrderTemplateContentState;\n\n setWaiting(newWaiting: boolean): void;\n setContent(newContent: ISaveCartToOrderTemplateContentState): void;\n}\n\nexport interface ISaveCartToOrderTemplateComponent extends IComponent<ISaveCartToOrderTemplateComponentProps> {\n onClick(): (\n event: React.MouseEvent<HTMLElement>,\n props: ISaveCartToOrderTemplateComponentProps,\n state: ISaveCartToOrderTemplateStateManager\n ) => void;\n}\n\nconst onDismiss = (state: ISaveCartToOrderTemplateStateManager): void => {\n state.setContent({ color: 'success', showAlert: false });\n};\n\nconst SaveCartToOrderTemplateActions = {\n onDismiss\n};\n\nconst SaveCartToOrderTemplate: React.FC<ISaveCartToOrderTemplateComponentProps> = (props: ISaveCartToOrderTemplateComponentProps) => {\n if (!isChannelTypeB2B(props.context.actionContext.requestContext)) {\n return null;\n }\n\n const [chosenOrderTemplate, setChosenOrderTemplate] = useState<ProductList | undefined>(undefined);\n const [addedProducts, setAddedProducts] = useState<FullProduct[] | undefined>(undefined);\n const [addToOrderTemplateModalOpen, setAddToOrderTemplateModalOpen] = useState(false);\n const [linesAddedToOrderTemplateDialogOpen, setLinesAddedToOrderTemplateDialogOpen] = useState(false);\n const [duplicateItemsWhenAddingToOrderTemplateDialogOpen, setDuplicateItemsWhenAddingToOrderTemplateDialogOpen] = useState(false);\n const [addedLinesCount, setAddedLinesCount] = useState(0);\n const [addedItemsCount, setAddedItemsCount] = useState(0);\n\n const {\n addToOrderTemplateDialogResources,\n createOrderTemplateDialogResources,\n createOrderTemplateFromCartButton,\n createOrderTemplateFromCartButtonTooltip\n } = props;\n\n const onDuplicateDialogCancel = () => {\n setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(false);\n setTimeout(() => {\n setAddToOrderTemplateModalOpen(true);\n }, 500);\n };\n const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n const overrideQuantity = async () => {\n const newLinesToupdate: ProductListLine[] = [];\n\n for (const cartLine of props.data.cartLines) {\n const getLinesInput = new GetProductListLinesInput(chosenOrderTemplate?.Id!, cartLine.ProductId!.toString());\n const linesState = await getProductListLines(getLinesInput, props.context.actionContext);\n const length = 1;\n const linesToUpdate = linesState.lines.filter(line => line.productListLine.ProductId === cartLine.ProductId);\n if (linesToUpdate.length !== length) {\n // skip new line if not exist already top update\n continue;\n }\n const lineToUpdate = linesToUpdate[0].productListLine;\n lineToUpdate.UnitOfMeasure = cartLine.UnitOfMeasureSymbol || 'ea';\n lineToUpdate.Quantity = cartLine.Quantity!;\n if (isMultipleCatalogFeatureEnabledInHq) {\n lineToUpdate.CatalogId = cartLine.CatalogId;\n }\n newLinesToupdate.push(lineToUpdate);\n }\n\n await updateProductListLinesAsync(\n {\n callerContext: props.context.actionContext\n },\n chosenOrderTemplate!.Id,\n newLinesToupdate\n ).then(async updatedLines => {\n updateLinesCounts(updatedLines);\n const allProductInputs: FullProductInput[] = getFullProductsDetails(updatedLines);\n const allProducts = await getFullProducts(allProductInputs, props.context.actionContext);\n setAddedProducts(allProducts);\n setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(false);\n setTimeout(() => {\n setLinesAddedToOrderTemplateDialogOpen(true);\n }, 500);\n });\n };\n const getFullProductsDetails = (productLines: ProductListLine[]) => {\n const allProdInputs: FullProductInput[] = [];\n productLines.forEach(lines => {\n if (lines.ProductId) {\n allProdInputs.push(\n new FullProductInput(\n lines.ProductId,\n props.context.actionContext.requestContext.apiSettings,\n getProductDetailsCriteriaFromActionInput(props.context.actionContext),\n props.context.actionContext.requestContext\n )\n );\n }\n });\n return allProdInputs;\n };\n\n const onOrderTemplateSelected = async (orderTemplate: ProductList) => {\n setChosenOrderTemplate(orderTemplate);\n const allProductListLines = props.data.cartLines?.map(cartLine => {\n const productListLineToAdd: ProductListLine = {\n ProductListId: orderTemplate.Id,\n ProductId: cartLine.ProductId,\n Quantity: cartLine.Quantity,\n UnitOfMeasure: cartLine.UnitOfMeasureSymbol\n };\n return productListLineToAdd;\n });\n\n const allProductInputs: FullProductInput[] = getFullProductsDetails(allProductListLines);\n const allProducts = await getFullProducts(allProductInputs, props.context.actionContext);\n\n // Filter out products with keyed in price\n const filteredProductListLines = props.data.cartLines\n .filter(cartline => !cartline.IsPriceKeyedIn)\n .map(cartLine => {\n const productListLineToAdd: ProductListLine = {\n ProductListId: orderTemplate.Id,\n ProductId: cartLine.ProductId,\n Quantity: cartLine.Quantity,\n UnitOfMeasure: cartLine.UnitOfMeasureSymbol,\n ...(isMultipleCatalogFeatureEnabledInHq && { catalogId: cartLine.CatalogId })\n };\n\n return productListLineToAdd;\n });\n\n await addProductListLinesAsync({ callerContext: props.context.actionContext }, orderTemplate.Id, filteredProductListLines)\n .then(filteredAddedLines => {\n updateLinesCounts(filteredAddedLines);\n setAddedProducts(allProducts);\n setAddToOrderTemplateModalOpen(false);\n setTimeout(() => {\n setLinesAddedToOrderTemplateDialogOpen(true);\n }, 500);\n })\n .catch(error => {\n if (error.name !== 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n return AsyncResult.reject(error);\n }\n setAddToOrderTemplateModalOpen(false);\n setTimeout(() => {\n setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(true);\n }, 500);\n return AsyncResult.resolve();\n });\n };\n const updateLinesCounts = (lines: ProductListLine[]) => {\n setAddedLinesCount(lines.length);\n setAddedItemsCount(lines.map(line => line.Quantity || 1).reduce((firstQuantity, secondQuantity) => firstQuantity + secondQuantity));\n };\n const onSaveCartToOrderTemplateClick = () => {\n setAddToOrderTemplateModalOpen(true);\n };\n\n const areAllCartlinesPriceKeyedIn = props.data.cartLines.filter(cartline => !cartline.IsPriceKeyedIn).length === 0;\n\n const addToOrderTemplateRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n return (\n <>\n <AddToOrderTemplateDialog\n className='msc-add-to-order-template-dialog'\n modalOpen={addToOrderTemplateModalOpen}\n setModalOpen={setAddToOrderTemplateModalOpen}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n data={{ orderTemplates: props.data.orderTemplates }}\n addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\n createOrderTemplateDialogResources={createOrderTemplateDialogResources}\n onOrderTemplateSelected={onOrderTemplateSelected}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n />\n {chosenOrderTemplate && addedProducts && (\n <LinesAddedToOrderTemplateDialog\n className='msc-lines-added-to-order-template-dialog'\n id={props.id}\n typeName={props.typeName}\n context={props.context}\n dialogStrings={props.linesAddedToOrderTemplateDialogResources}\n data={{\n linesCount: addedLinesCount,\n itemsCount: addedItemsCount,\n orderTemplate: chosenOrderTemplate,\n products: addedProducts\n }}\n modalOpen={linesAddedToOrderTemplateDialogOpen}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n />\n )}\n <DuplicateItemsWhenAddingToOrderTemplateDialog\n className='msc-duplicate-items-when-adding-to-order-template-dialog'\n id={props.id}\n typeName={props.typeName}\n context={props.context}\n dialogStrings={props.duplicateItemsWhenAddingToOrderTemplateDialogResources}\n data={{}}\n modalOpen={duplicateItemsWhenAddingToOrderTemplateDialogOpen}\n executeOverrideQuantity={overrideQuantity}\n onCancel={onDuplicateDialogCancel}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n />\n <Button\n className={`msc-cart__btn-addcarttotemplate${areAllCartlinesPriceKeyedIn ? ' disabled' : ''}`}\n onClick={areAllCartlinesPriceKeyedIn ? undefined : onSaveCartToOrderTemplateClick}\n title={createOrderTemplateFromCartButton}\n innerRef={addToOrderTemplateRef}\n >\n {createOrderTemplateFromCartButton}\n </Button>\n {areAllCartlinesPriceKeyedIn && (\n <UncontrolledTooltip\n className='msc-cart__btn-addcarttotemplate-tooltip'\n placement='top-start'\n trigger='hover focus'\n target={addToOrderTemplateRef}\n >\n {createOrderTemplateFromCartButtonTooltip}\n </UncontrolledTooltip>\n )}\n </>\n );\n};\n\nexport const SaveCartToOrderTemplateComponent: React.FunctionComponent<ISaveCartToOrderTemplateComponentProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error\n ISaveCartToOrderTemplateComponent\n>('SaveCartToOrderTemplate', { component: SaveCartToOrderTemplate, ...SaveCartToOrderTemplateActions });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, IPayLoad, ISliderChangeNotification, onTelemetryClick, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport {\n AgeGate,\n ClosedCaptionHelper,\n ClosedCaptions,\n closedCaptionsSettingDefaults,\n ClosedCaptionTypes,\n format,\n ICCFile,\n ICurrentClosedCaptionsSettings,\n IPlayerMenu,\n IPlayerMenuItemClickNotification,\n IPlayerProps,\n IPlayPosition,\n isNullOrWhiteSpace,\n isSafari,\n IVideoErrorData,\n IVideoErrorMessageData,\n IVideoMetadata,\n KeyCodes,\n LocalizationConstants,\n LocalizationHelper,\n MediaEvents,\n MenuCategories,\n PlayerConstants,\n PlayerHelper,\n PlayerStates,\n PlayPauseTrigger,\n videoClosedCaptionsConstant,\n VideoControls,\n VideoErrorCodes,\n VideoPlayerNames\n} from './components';\n\n/**\n * Player state interface.\n */\nexport interface IPlayerState {\n playing: boolean;\n mouseHovered: boolean;\n isControlPanelVisible: boolean;\n doControlsHaveFocus: boolean;\n playPosition: IPlayPosition;\n currentVolume: number;\n isTriggerEnabled: boolean;\n previousVolume: number;\n isMuted: boolean;\n isInFullScreen: boolean;\n showSpinner: boolean;\n showErrorMessage: boolean;\n videoErrorMessage: IVideoErrorMessageData;\n screenReaderText: string;\n showClosedCaptions: boolean;\n isAgegateEnabled: boolean;\n currentAudioTrack: string;\n currentAudioTrackURL: string;\n closedCaptionLanguage: string;\n closedCaptionsURL: string;\n currentClosedCaptionsSettings: ICurrentClosedCaptionsSettings;\n mounted: boolean;\n tempClosedCaptionsSettings?: {};\n}\n\n/**\n *\n * Player component.\n *\n */\nexport default class Player extends React.Component<IPlayerProps, IPlayerState> {\n public static defaultProps: Partial<IPlayerProps> = {\n playerData: {\n options: {\n autoplay: true,\n ageGate: false,\n mute: true,\n loop: false,\n playPauseTrigger: false,\n controls: true,\n hidePosterFrame: false,\n lazyLoad: true\n },\n metaData: {\n playerName: 'videoPlayer',\n videoId: '',\n title: '',\n description: '',\n duration: 0,\n posterframeUrl: '',\n shareUrl: '',\n videoFiles: [],\n externalPlayerUrl: '',\n externalSourceId: '',\n videoBinaryReferences: []\n }\n },\n playerResources: {\n playAriaLabel: LocalizationConstants.playAriaLabel,\n pauseAriaLabel: LocalizationConstants.pauseAriaLabel,\n closeAriaLabel: LocalizationConstants.closeAriaLabel,\n muteAriaLabel: LocalizationConstants.muteAriaLabel,\n unMuteAriaLabel: LocalizationConstants.unMuteAriaLabel,\n fullScreenAriaLabel: LocalizationConstants.fullScreenAriaLabel,\n exitFullScreenAriaLabel: LocalizationConstants.exitFullScreenAriaLabel,\n pausedAriaLabel: LocalizationConstants.pausedAriaLabel,\n playingAriaLabel: LocalizationConstants.playingAriaLabel,\n seekBarLabel: LocalizationConstants.seekBarLabel,\n videoTimeDurationLabel: LocalizationConstants.videoTimeDurationLabel,\n closedCaptionLabel: LocalizationConstants.closedCaptionLabel,\n sliderThumbLabel: LocalizationConstants.sliderThumbLabel,\n volumeThumbLabel: LocalizationConstants.volumeThumbLabel\n }\n };\n\n private controlPanelTimer: number = 0;\n\n private readonly playerId: string;\n\n private readonly player: React.RefObject<HTMLVideoElement> = React.createRef<HTMLVideoElement>();\n\n private readonly audio: React.RefObject<HTMLAudioElement> = React.createRef<HTMLAudioElement>();\n\n private readonly playerContainer: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n private readonly videoControl: React.RefObject<VideoControls> = React.createRef<VideoControls>();\n\n private readonly ClosedCaptions: React.RefObject<ClosedCaptions> = React.createRef<ClosedCaptions>();\n\n private readonly ageGateContainer: React.RefObject<AgeGate> = React.createRef<AgeGate>();\n\n private videoUrl: string = '';\n\n private posterFrameUrl: string = '';\n\n private seekFrom: number | null = null;\n\n private playerState: PlayerStates;\n\n private readonly playerHelper: PlayerHelper;\n\n private readonly localizationHelper: LocalizationHelper;\n\n private closedCaptionHelper: ClosedCaptionHelper | null = null;\n\n private closedCaptionMenu: IPlayerMenu | null = null;\n\n private optionsMenu: IPlayerMenu | null = null;\n\n private selectedClosedCaptionsLocale: string | null = '';\n\n private isPlayerManuallyPaused: boolean = false;\n\n private isPlayerLoaded: boolean = false;\n\n private playerMetaData: IVideoMetadata;\n\n private readonly isMobileDevice: boolean;\n\n private readonly payLoad: IPayLoad;\n\n private readonly _shouldAutoPlay: boolean;\n\n /**\n * Checks if fullscreen is supported by browser or not.\n * @returns - If native fullscreen enabled.\n */\n private static _isNativeFullscreenEnabled(): boolean {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const doc = document as any;\n return (\n doc.fullscreenEnabled ||\n doc.mozFullScreenEnabled ||\n doc.webkitFullscreenEnabled ||\n doc.webkitSupportsFullscreen ||\n doc.msFullscreenEnabled\n );\n }\n /**\n * Gets the current fullscreen element.\n * @returns - The element in full screen.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _getElementInFullScreen(): any {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const doc = document as any;\n return doc.fullscreenElement || doc.mozFullScreenElement || doc.webkitFullscreenElement || doc.msFullscreenElement;\n }\n\n public constructor(props: IPlayerProps) {\n super(props);\n\n const {\n playerData: {\n options: {\n shouldDisableAutoPlayOnMobile,\n autoplay: isAutoPlay,\n playPauseTrigger: isPlayPauseTrigger,\n ageGate: isAgeGateEnabled,\n controls: isControlsEnabled,\n mute: isMuted,\n lazyLoad: isLazyLoaded,\n isMobileDevice\n }\n }\n } = this.props;\n\n this.isMobileDevice = this._isMobile() || isMobileDevice!;\n\n this._shouldAutoPlay = this.isMobileDevice && shouldDisableAutoPlayOnMobile ? false : isAutoPlay!;\n\n const state = {\n playing: false,\n mouseHovered: isPlayPauseTrigger! || !this._shouldAutoPlay,\n isControlPanelVisible: !isPlayPauseTrigger,\n doControlsHaveFocus: false,\n isTriggerEnabled: isPlayPauseTrigger! && !this._shouldAutoPlay && isControlsEnabled!,\n currentVolume: isMuted && !this.isMobileDevice ? 0 : PlayerConstants.defaultVolume * 100,\n previousVolume: 0,\n isMuted: isMuted ?? false,\n isInFullScreen: false,\n showSpinner: false,\n isAgegateEnabled: isAgeGateEnabled! && !this._shouldAutoPlay,\n showErrorMessage: false,\n screenReaderText: '',\n closedCaptionLanguage: 'off',\n currentAudioTrack: 'default',\n currentAudioTrackURL: '',\n showClosedCaptions: false,\n mounted: false,\n currentClosedCaptionsSettings: {\n preset: closedCaptionsSettingDefaults.preset,\n text_font: closedCaptionsSettingDefaults.text_font,\n text_color: closedCaptionsSettingDefaults.text_color,\n text_opacity: closedCaptionsSettingDefaults.text_opacity,\n text_size: closedCaptionsSettingDefaults.text_size,\n text_edge_style: closedCaptionsSettingDefaults.text_edge_style,\n text_background_color: closedCaptionsSettingDefaults.text_background_color,\n text_background_opacity: closedCaptionsSettingDefaults.text_background_opacity,\n window_color: closedCaptionsSettingDefaults.window_color,\n window_opacity: closedCaptionsSettingDefaults.window_opacity\n },\n closedCaptionsURL: '',\n videoErrorMessage: {\n title: '',\n message: ''\n },\n playPosition: {\n currentTime: 0,\n startTime: 0,\n endTime: 0,\n bufferedDuration: 0\n },\n tempClosedCaptionsSettings: undefined\n };\n\n this.playerState = 'init';\n this._onTriggerClicked = this._onTriggerClicked.bind(this);\n this._onMouseEvent = this._onMouseEvent.bind(this);\n this._onPlay = this._onPlay.bind(this);\n this._onPause = this._onPause.bind(this);\n this._triggerEvents = this._triggerEvents.bind(this);\n this._triggerAudioEvents = this._triggerAudioEvents.bind(this);\n this._onProgressChange = this._onProgressChange.bind(this);\n this._setMuted = this._setMuted.bind(this);\n this._onVolumeChange = this._onVolumeChange.bind(this);\n this._onFullScreenChanged = this._onFullScreenChanged.bind(this);\n this._toggleFullScreen = this._toggleFullScreen.bind(this);\n this._showControlBar = this._showControlBar.bind(this);\n this._handleControlsKeyDownEvent = this._handleControlsKeyDownEvent.bind(this);\n this._onFullscreenError = this._onFullscreenError.bind(this);\n this._onPlayerKeyDown = this._onPlayerKeyDown.bind(this);\n this._onTriggerFocus = this._onTriggerFocus.bind(this);\n this._onTriggerBlur = this._onTriggerBlur.bind(this);\n this._onVideoControlsFocus = this._onVideoControlsFocus.bind(this);\n this._onVideoControlsBlur = this._onVideoControlsBlur.bind(this);\n this._onPlayerMenuItemClick = this._onPlayerMenuItemClick.bind(this);\n this._onPlayerMenuItemFocus = this._onPlayerMenuItemFocus.bind(this);\n this._onPlayerMenuItemBlur = this._onPlayerMenuItemBlur.bind(this);\n this._validateAgeSubmitHandler = this._validateAgeSubmitHandler.bind(this);\n this._onContextMenuClicked = this._onContextMenuClicked.bind(this);\n this.localizationHelper = new LocalizationHelper(this.props.playerResources!);\n this.playerHelper = new PlayerHelper(this.props, this.localizationHelper, this.isMobileDevice);\n this.playerId = this.playerHelper.isEmptyOrUndefined(this.props.playerId) ? 'vid-0' : this.props.playerId!;\n this.playerMetaData = this.playerHelper.getMetadata();\n this.state = state;\n this.posterFrameUrl = this.playerHelper.getPosterFrameUrl();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n\n if (!isLazyLoaded) {\n this.videoUrl = this.playerHelper.getVideoFileToPlay().url;\n }\n }\n\n public shouldComponentUpdate(nextProps: IPlayerProps, nextState: IPlayerState): boolean {\n if (this.state === nextState && this.props.playerData.options === nextProps.playerData.options) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const {\n playerData: {\n options: { loop: isLoop }\n }\n } = this.props;\n\n const maskLevelStyle: React.CSSProperties = {};\n maskLevelStyle.backgroundColor = this._getMaskLevelStyle();\n\n if (this.props.isEditor) {\n this.playerHelper.updatePlayerProps(this.props);\n this.playerMetaData = this.playerHelper.getMetadata();\n if (this.posterFrameUrl !== this.playerHelper.getPosterFrameUrl()) {\n this.posterFrameUrl = this.playerHelper.getPosterFrameUrl();\n }\n if (this.isPlayerLoaded && this.videoUrl !== this.playerHelper.getVideoFileToPlay().url) {\n this._loadPlayer();\n }\n }\n\n const loadMetaData = this._shouldAutoPlay ? 'auto' : 'metadata';\n\n // Set play aria label\n let playAriaLabel: string = '';\n if (this.playerMetaData.title) {\n playAriaLabel = `${this.localizationHelper.getLocalizedValue('playAriaLabel')} ${this.playerMetaData.title}`;\n } else {\n playAriaLabel = LocalizationConstants.playVideoAriaLabel;\n }\n\n return (\n <div\n role='none'\n className={`${VideoPlayerNames.videoplayerContainer}`}\n ref={this.playerContainer}\n onKeyDown={this._onPlayerKeyDown}\n onMouseEnter={this._onMouseEvent}\n onMouseLeave={this._onMouseEvent}\n data-playerid={this.playerId}\n >\n <div className={`${VideoPlayerNames.videoplayerContainer}__wrapper`}>\n {this.state.currentAudioTrack !== '' && this.state.currentAudioTrackURL !== '' && (\n <audio\n ref={this.audio}\n preload='auto'\n src={this.state.currentAudioTrackURL}\n muted={this.state.isMuted}\n loop={isLoop}\n />\n )}\n <video\n className={`${VideoPlayerNames.videoplayerContainer}__video`}\n ref={this.player}\n preload={loadMetaData}\n autoPlay={this._shouldAutoPlay}\n muted={this.state.isMuted}\n loop={isLoop}\n onPlay={this._onPlay}\n onPause={this._onPause}\n onClick={!this.state.isAgegateEnabled ? this._onTriggerClicked : this._onPause}\n src={this.videoUrl}\n onContextMenu={this._onContextMenuClicked}\n poster={this.posterFrameUrl}\n playsInline\n aria-hidden='true'\n />\n <div\n className={`${VideoPlayerNames.videoplayerContainer}__errormessage`}\n role='status'\n aria-hidden={!this.state.showErrorMessage}\n >\n <div className={`${VideoPlayerNames.videoplayerContainer}__errormessage__wrapper`}>\n <p className={`${VideoPlayerNames.videoplayerContainer}__errormessage__heading`}>\n {this.state.videoErrorMessage.title}\n </p>\n </div>\n </div>\n <div className={`${VideoPlayerNames.videoplayerContainer}__screenreader`} aria-live='assertive'>\n {this.state.screenReaderText}\n </div>\n <div\n className={`${VideoPlayerNames.videoplayerContainer}__spinner`}\n role='status'\n aria-hidden={!this.state.showSpinner}\n >\n <Waiting className={`${VideoPlayerNames.videoplayerContainer}__waiting`} />\n </div>\n {this.props.playerData.options.ageGate && this._renderAgeGate()}\n {this._renderPlayPauseTrigger(playAriaLabel, maskLevelStyle)}\n {this.state.showClosedCaptions && this._renderClosedCaptions()}\n {this._renderVideoControls(playAriaLabel)}\n </div>\n </div>\n );\n }\n\n /**\n * Play the video.\n */\n public play(): void {\n this.player.current!.play().catch(() => {\n this._onVideoError();\n });\n if (this.audio.current) {\n this.audio.current.play().catch(() => {\n this._onAudioError();\n });\n }\n }\n\n /**\n * Pause the video.\n */\n public pause(): void {\n this.player.current!.pause();\n if (this.audio.current) {\n this.audio.current.pause();\n }\n }\n\n public componentDidMount(): void {\n const {\n playerData: {\n options: { playPauseTrigger: isPlayPauseTrigger, lazyLoad: isLazyLoaded }\n }\n } = this.props;\n if (!isLazyLoaded) {\n this._onVideoLoadedData();\n this._showControlBar(false);\n }\n\n if (this._shouldAutoPlay || (isLazyLoaded && !isPlayPauseTrigger) || !isLazyLoaded) {\n this._loadPlayer();\n }\n document.addEventListener('fullscreenchange', this._onFullScreenChanged);\n document.addEventListener('mozfullscreenchange', this._onFullScreenChanged);\n document.addEventListener('webkitfullscreenchange', this._onFullScreenChanged);\n document.addEventListener('MSFullscreenChange', this._onFullScreenChanged);\n\n document.addEventListener('fullscreenerror', this._onFullscreenError);\n document.addEventListener('mozfullscreenerror', this._onFullscreenError);\n document.addEventListener('webkitfullscreenerror', this._onFullscreenError);\n document.addEventListener('MSFullscreenError', this._onFullscreenError);\n }\n\n public componentWillUnmount(): void {\n if (this.player.current) {\n for (const mediaEvent of MediaEvents) {\n this.player.current.removeEventListener(mediaEvent, this._triggerEvents);\n }\n }\n document.removeEventListener('fullscreenchange', this._onFullScreenChanged);\n document.removeEventListener('mozfullscreenchange', this._onFullScreenChanged);\n document.removeEventListener('webkitfullscreenchange', this._onFullScreenChanged);\n document.removeEventListener('MSFullscreenChange', this._onFullScreenChanged);\n\n document.removeEventListener('fullscreenerror', this._onFullscreenError);\n document.removeEventListener('mozfullscreenerror', this._onFullscreenError);\n document.removeEventListener('webkitfullscreenerror', this._onFullscreenError);\n document.removeEventListener('MSFullscreenError', this._onFullscreenError);\n }\n\n /**\n * Renders closed captions.\n * @returns Returns closed captions.\n */\n private readonly _renderClosedCaptions = (): JSX.Element => {\n return (\n <ClosedCaptions\n ref={this.ClosedCaptions}\n className={`${VideoPlayerNames.videoplayerContainer}__ccoverlay`}\n showClosedCaptions={this.state.showClosedCaptions}\n currentTime={this.state.playPosition.currentTime}\n ccLanguage={this.state.closedCaptionLanguage}\n ccURL={this.state.closedCaptionsURL}\n errorCallback={this.playerHelper.onErrorCallback}\n isVideoControlVisible={this.state.isControlPanelVisible || this.state.doControlsHaveFocus}\n currentClosedCaptionsSettings={this.state.currentClosedCaptionsSettings}\n tempClosedCaptionsSettings={this.state.tempClosedCaptionsSettings}\n onClosedCaptionClick={this._onTriggerClicked}\n />\n );\n };\n\n /**\n * Renders the play pause trigger.\n * @param playAriaLabel - Aria label for the play button.\n * @param maskLevelStyle - Mask level.\n * @returns Returns play pause trigger.\n */\n private readonly _renderPlayPauseTrigger = (playAriaLabel: string, maskLevelStyle: React.CSSProperties): JSX.Element | undefined => {\n const {\n playerData: {\n options: {\n autoplay: shouldAutoPlay,\n playPauseTrigger: isPlayPauseTrigger,\n controls: isControlsEnabled,\n shouldDisableAutoPlayOnMobile\n }\n }\n } = this.props;\n\n if (!MsDyn365.msdyn365Commerce.isBrowser && isPlayPauseTrigger && shouldAutoPlay && shouldDisableAutoPlayOnMobile) {\n // Rendering an empty div because on server side isMobile will be false at server side.\n return <div className={`${VideoPlayerNames.videoplayerContainer}__playpausetrigger__container`} />;\n }\n\n if (isPlayPauseTrigger && (!isControlsEnabled || this.state.isTriggerEnabled) && !this.state.isAgegateEnabled) {\n return (\n <PlayPauseTrigger\n className={`${VideoPlayerNames.videoplayerContainer}__playpausetrigger`}\n style={maskLevelStyle}\n onChange={this._onTriggerClicked}\n toggled={this.state.playing}\n aria-hidden={!this.state.mouseHovered}\n playAriaLabel={playAriaLabel}\n pauseAriaLabel={this.localizationHelper.getLocalizedValue('pauseAriaLabel')}\n onFocus={this._onTriggerFocus}\n onBlur={this._onTriggerBlur}\n telemetryContent={this.props.telemetryContent}\n />\n );\n }\n\n return undefined;\n };\n\n /**\n * Renders the video controls.\n * @param playAriaLabel - Arial label for the play button.\n * @returns Returns the video control.\n */\n private readonly _renderVideoControls = (playAriaLabel: string): JSX.Element | undefined => {\n const {\n playerData: {\n options: { controls: isControlsEnabled }\n }\n } = this.props;\n\n if (isControlsEnabled && !this.state.isTriggerEnabled && !this.state.isAgegateEnabled) {\n return (\n <VideoControls\n ref={this.videoControl}\n className={`${VideoPlayerNames.videoplayerContainer}__controls ${\n this.state.isControlPanelVisible || this.state.doControlsHaveFocus ? 'show' : 'hide'\n }`}\n aria-hidden={!(this.state.isControlPanelVisible || this.state.doControlsHaveFocus)}\n onPlayClick={this._onTriggerClicked}\n playing={this.state.playing}\n closedCaptionMenu={this.closedCaptionMenu!}\n optionMenu={this.optionsMenu!}\n videoSeekSteps={PlayerConstants.defaultVideoSliderSteps}\n volumeSeekSteps={PlayerConstants.defaultVolumeSliderSteps}\n isMuted={this.state.isMuted}\n onMuteClick={this._setMuted}\n onVolumeChange={this._onVolumeChange}\n onProgressChange={this._onProgressChange}\n playPosition={this.state.playPosition}\n currentClosedCaptionLanguage={this.state.closedCaptionLanguage}\n currentVolume={this.state.currentVolume}\n isInFullScreen={this.state.isInFullScreen}\n toggleFullScreen={this._toggleFullScreen}\n handleControlsKeyDownHandler={this._handleControlsKeyDownEvent}\n isControlPanelVisible={this.state.isControlPanelVisible || this.state.doControlsHaveFocus}\n onFocus={this._onVideoControlsFocus}\n onBlur={this._onVideoControlsBlur}\n onMenuItemClick={this._onPlayerMenuItemClick}\n onMenuItemFocus={this._onPlayerMenuItemFocus}\n onMenuItemBlur={this._onPlayerMenuItemBlur}\n currentAudioTrack={this.state.currentAudioTrack}\n currentAudioTrackURL={this.state.currentAudioTrackURL}\n currentClosedCaptionsSetting={this.state.currentClosedCaptionsSettings}\n isMobileDevice={this.isMobileDevice}\n telemetryContent={this.props.telemetryContent}\n resources={{\n playAriaLabel,\n pauseAriaLabel: this.localizationHelper.getLocalizedValue('pauseAriaLabel'),\n muteAriaLabel: this.localizationHelper.getLocalizedValue('muteAriaLabel'),\n unMuteAriaLabel: this.localizationHelper.getLocalizedValue('unMuteAriaLabel'),\n fullScreenAriaLabel: this.localizationHelper.getLocalizedValue('fullScreenAriaLabel'),\n exitFullScreenAriaLabel: this.localizationHelper.getLocalizedValue('exitFullScreenAriaLabel'),\n seekBarLabel: this.localizationHelper.getLocalizedValue('seekBarLabel'),\n videoTimeDurationLabel: this.localizationHelper.getLocalizedValue('videoTimeDurationLabel'),\n closedCaptionLabel: this.localizationHelper.getLocalizedValue('closedCaptionLabel'),\n optionButtonLabel: this.localizationHelper.getLocalizedValue('optionAriaLabel'),\n sliderThumbLabel: this.localizationHelper.getLocalizedValue('sliderThumbLabel'),\n volumeThumbLabel: this.localizationHelper.getLocalizedValue('volumeThumbLabel')\n }}\n />\n );\n }\n return undefined;\n };\n\n /**\n * Renders the age gate module.\n * @returns Renders the age gate module.\n */\n private readonly _renderAgeGate = (): JSX.Element => {\n return (\n <AgeGate\n ref={this.ageGateContainer}\n onSubmitClick={this._validateAgeSubmitHandler}\n aria-hidden={!this.state.isAgegateEnabled}\n minmumAge={this.playerMetaData.minimumAge}\n />\n );\n };\n\n private _loadPlayer(): void {\n if (this.player.current) {\n this.player.current.volume = this.state.currentVolume / 100;\n\n // Register the media events\n for (const mediaEvent of MediaEvents) {\n this.player.current.addEventListener(mediaEvent, this._triggerEvents);\n }\n }\n\n if (this.props.playerData.options.lazyLoad || this.props.isEditor) {\n this.videoUrl = this.playerHelper.getVideoFileToPlay().url;\n if (this.player.current) {\n this.player.current.src = this.videoUrl;\n this.player.current.load();\n }\n }\n\n this.isPlayerLoaded = true;\n\n if (this.props.playerData.options.controls) {\n this.closedCaptionHelper = new ClosedCaptionHelper(this.playerMetaData, this.playerHelper, this.localizationHelper);\n this.closedCaptionMenu = this.closedCaptionHelper.getClosedCaptionMenu()!;\n this.optionsMenu = this.playerHelper.getOptionMenu();\n const ccFiles = this.playerMetaData.ccFiles!;\n if (ccFiles !== undefined && ccFiles.length > 0) {\n const autoCaptionsLang = this.props.playerData && this.props.playerData.options.autoCaptions;\n let autoCaptionsLocale: string | null = null;\n for (const ccFile of ccFiles) {\n if (!autoCaptionsLocale && autoCaptionsLang && ccFile.locale.includes(autoCaptionsLang)) {\n autoCaptionsLocale = ccFile.locale;\n }\n }\n this.selectedClosedCaptionsLocale = autoCaptionsLocale;\n if (!isNullOrWhiteSpace(this.selectedClosedCaptionsLocale!)) {\n this.setState({\n closedCaptionLanguage: this.selectedClosedCaptionsLocale!,\n closedCaptionsURL: this.closedCaptionHelper.getClosedCaptionURLFromLocale(this.selectedClosedCaptionsLocale!),\n showClosedCaptions: true\n });\n }\n }\n }\n }\n\n /**\n * Validates the age submitted by the user.\n */\n private _validateAgeSubmitHandler(): void {\n if (this.ageGateContainer.current!.getCalculatedAge()) {\n this.videoUrl = this.playerHelper.getVideoFileToPlay().url;\n this.setState({ isAgegateEnabled: false });\n } else {\n this.setState({ isAgegateEnabled: true });\n this._displayErrorMessage({ title: 'you are not allowed to watch video' });\n }\n }\n\n private _onVideoControlsFocus(): void {\n // No need to call showControlBar, this will make sure it shows\n this.setState({ doControlsHaveFocus: true });\n }\n\n private _onVideoControlsBlur(): void {\n // Call showControlBar to give it the 6 second timeout\n this._showControlBar(true);\n\n this.setState({ doControlsHaveFocus: false });\n }\n\n private _onPlayerMenuItemFocus(notification: IPlayerMenuItemClickNotification): void {\n if (notification.data && notification.data.indexOf(':') > 0) {\n const dataSplit = notification.data.split(':');\n const settingKey = dataSplit[0];\n if (settingKey === videoClosedCaptionsConstant.presetKey) {\n if (this.state.closedCaptionLanguage === 'off') {\n this.setState(\n {\n showClosedCaptions: true\n },\n () => {\n this.ClosedCaptions.current!.showSampleCaptions();\n this._setCCSettings(notification, false);\n }\n );\n } else {\n this._setCCSettings(notification, false);\n }\n }\n } else if (this.state.closedCaptionLanguage === 'off') {\n this.setState({\n showClosedCaptions: false\n });\n }\n }\n\n private _onPlayerMenuItemBlur(): void {\n this._setCCSettings({\n category: MenuCategories.ClosedCaptionSettings,\n id: '',\n data: 'current'\n });\n }\n\n private _onPlayerMenuItemClick(notification: IPlayerMenuItemClickNotification): void {\n switch (notification.category) {\n case MenuCategories.ClosedCaption: {\n this._setCC(notification.id);\n break;\n }\n\n case MenuCategories.ClosedCaptionSettings: {\n this._setCCSettings(notification);\n break;\n }\n\n case MenuCategories.AudioTracks: {\n this._setAudioTracks(notification);\n break;\n }\n default:\n }\n }\n\n /**\n * Sets the close captioning language/locale.\n * @param ccLanguageId - The desired new cc value.\n */\n private _setCC(ccLanguageId: string): void {\n ccLanguageId = this.playerHelper.removeIdPrefix(ccLanguageId);\n let selectedOption: ICCFile | null = null;\n\n if (ccLanguageId && this.playerMetaData.ccFiles) {\n for (const ccFile of this.playerMetaData.ccFiles) {\n if (ccFile.locale === ccLanguageId && (!ccFile.ccType || ccFile.ccType === ClosedCaptionTypes.TTML)) {\n selectedOption = ccFile;\n break;\n }\n }\n }\n\n if (ccLanguageId === 'off') {\n this.setState({\n closedCaptionLanguage: 'off',\n closedCaptionsURL: '',\n showClosedCaptions: false\n });\n } else {\n this.setState({\n closedCaptionLanguage: selectedOption!.locale,\n closedCaptionsURL: selectedOption!.url,\n showClosedCaptions: true\n });\n }\n }\n\n /**\n * Sets the close caption settings.\n * @param notification - The desired new cc value.\n * @param updatePreferences - Update Preferences.\n */\n private _setCCSettings(notification: IPlayerMenuItemClickNotification, updatePreferences?: boolean): void {\n if (notification.data === 'reset') {\n this.setState(\n {\n currentClosedCaptionsSettings: closedCaptionsSettingDefaults\n },\n () => {\n if (this.ClosedCaptions.current !== null) {\n this.ClosedCaptions.current.applySettings();\n this.ClosedCaptions.current.resetCaptions();\n this.ClosedCaptions.current.updateCaptions(this.state.playPosition.currentTime);\n }\n }\n );\n } else if (notification.data === 'current') {\n this.setState({\n tempClosedCaptionsSettings: undefined\n });\n\n if (this.state.closedCaptionLanguage === 'off') {\n this.setState({\n showClosedCaptions: false\n });\n }\n } else {\n const dataSplit = notification.data!.split(':');\n if (!dataSplit) {\n return;\n }\n const settingKey = dataSplit[0];\n const optionKey = dataSplit[1];\n const currentSetting = this.closedCaptionHelper!.getUpdatedClosedCaptionSetting(\n this.state.currentClosedCaptionsSettings,\n settingKey,\n optionKey\n );\n if (updatePreferences === undefined || updatePreferences) {\n this.setState(\n {\n tempClosedCaptionsSettings: undefined,\n currentClosedCaptionsSettings: currentSetting\n },\n () => {\n if (this.ClosedCaptions.current) {\n this.ClosedCaptions.current.applySettings();\n this.ClosedCaptions.current.resetCaptions();\n this.ClosedCaptions.current.updateCaptions(this.state.playPosition.currentTime);\n }\n }\n );\n } else {\n this.setState({\n tempClosedCaptionsSettings: currentSetting\n });\n }\n }\n }\n\n private _setAudioTracks(notification: IPlayerMenuItemClickNotification): void {\n const data = JSON.parse(notification.data!);\n if (data.lang === 'default') {\n this.setState(\n {\n currentAudioTrack: 'default',\n currentAudioTrackURL: ''\n },\n () => {\n this.player.current!.volume = this.state.currentVolume / 100;\n }\n );\n } else {\n this.setState(\n {\n currentAudioTrack: data.lang,\n currentAudioTrackURL: data.url\n },\n () => {\n this.audio.current!.currentTime = this.player.current!.currentTime;\n this.audio.current!.volume = this.state.currentVolume / 100;\n this.player.current!.volume = 0;\n if (!this.player.current!.paused) {\n this.audio.current!.load();\n for (const mediaEvent of MediaEvents) {\n this.audio.current!.addEventListener(mediaEvent, this._triggerAudioEvents);\n }\n }\n }\n );\n }\n }\n\n private _triggerAudioEvents(event: Event): void {\n switch (event.type.toLowerCase()) {\n case 'error':\n this._onAudioError();\n break;\n case 'waiting':\n if (this.playerState === 'playing') {\n this.isPlayerManuallyPaused = true;\n this.pause();\n }\n break;\n\n case 'loadeddata':\n if (this.isPlayerManuallyPaused) {\n this.isPlayerManuallyPaused = false;\n this.play();\n }\n if (!this.player.current!.paused) {\n this.play();\n }\n break;\n\n default:\n }\n }\n\n private _triggerEvents(event: Event): void {\n switch (event.type.toLowerCase()) {\n case 'canplay':\n case 'canplaythrough':\n break;\n\n case 'error':\n this._onVideoError();\n break;\n\n case 'play':\n break;\n\n case 'pause':\n this._updateState('paused');\n if (this.props.playerData.options.playPauseTrigger) {\n this.setState({\n mouseHovered: true\n });\n }\n break;\n\n case 'seeking':\n if (this.playerState !== 'ended' && this.player.current!.seeking) {\n this.seekFrom = this.player.current!.currentTime;\n this._updateState('seeking');\n }\n break;\n\n case 'seeked':\n const currentPlayer = this.player.current;\n const currentTime = currentPlayer!.currentTime;\n if (this.playerState !== 'ended' && this.player.current!.seeking && this.seekFrom !== currentTime) {\n this.seekFrom = null;\n }\n this._updateState(currentPlayer!.paused ? 'paused' : 'playing');\n break;\n\n case 'waiting':\n this._updateState('buffering');\n break;\n\n case 'loadedmetadata':\n break;\n\n case 'loadeddata':\n this._onVideoLoadedData();\n if (!this._shouldAutoPlay) {\n this._showControlBar(false);\n }\n break;\n\n case 'timeupdate':\n this._onTimeUpdate();\n break;\n\n case 'ended':\n this._updateState('ended');\n this._stop();\n break;\n\n case 'playing':\n this._updateState('playing');\n break;\n\n case 'volumechange':\n break;\n\n default:\n }\n }\n\n private _onAudioError(): void {\n this.pause();\n const errorMessage: IVideoErrorMessageData = { title: 'Error while playing audio Track. Switching back to default track' };\n this._displayErrorMessage(errorMessage);\n this._setAudioTracks({ category: 'audioTracks', data: '{ \"lang\": \"default\", \"url\": \"\"}', id: '' });\n setTimeout(() => {\n this.setState(\n {\n showErrorMessage: false\n },\n () => {\n this.play();\n }\n );\n }, 2000);\n }\n\n private _onVideoError(): void {\n this._updateState('error');\n const error: IVideoErrorData | null = this._getError();\n let errorMessage = '';\n if (error?.errorCode) {\n switch (error.errorCode) {\n case VideoErrorCodes.MediaErrorAborted:\n errorMessage = 'video playback was aborted';\n break;\n case VideoErrorCodes.MediaErrorNetwork:\n errorMessage = 'video failed to download';\n break;\n case VideoErrorCodes.MediaErrorDecode:\n errorMessage = 'video is not readable';\n break;\n case VideoErrorCodes.MediaErrorSourceNotSupported:\n errorMessage = 'video format is not supported';\n break;\n default:\n errorMessage = 'unknown error occurred';\n }\n\n this._stopMedia(errorMessage);\n } else {\n this._stopMedia();\n }\n }\n\n private _stopMedia(msgToDisplay?: string): void {\n if (msgToDisplay) {\n this._displayErrorMessage({ title: msgToDisplay });\n this._updateState('stopped');\n }\n }\n\n /**\n * Create an error message overlay.\n * @param errorMessage - Error message content.\n */\n private _displayErrorMessage(errorMessage: IVideoErrorMessageData): void {\n this.setState({ videoErrorMessage: { title: errorMessage.title, message: errorMessage.message } });\n this.setState({ showErrorMessage: true });\n }\n\n /**\n * Gets the video error code of the current error.\n * @returns : Returns the video error code.\n */\n private _getError(): IVideoErrorData | null {\n let contentErrorCode: VideoErrorCodes;\n if (this.player.current!.error) {\n // Video playback failed - show a message saying why\n switch (this.player.current!.error.code) {\n case this.player.current!.error.MEDIA_ERR_ABORTED:\n contentErrorCode = VideoErrorCodes.MediaErrorAborted;\n break;\n case this.player.current!.error.MEDIA_ERR_NETWORK:\n contentErrorCode = VideoErrorCodes.MediaErrorNetwork;\n break;\n case this.player.current!.error.MEDIA_ERR_DECODE:\n contentErrorCode = VideoErrorCodes.MediaErrorDecode;\n break;\n case this.player.current!.error.MEDIA_ERR_SRC_NOT_SUPPORTED:\n contentErrorCode = VideoErrorCodes.MediaErrorSourceNotSupported;\n break;\n default:\n contentErrorCode = VideoErrorCodes.MediaErrorUnknown;\n }\n return { errorCode: contentErrorCode };\n }\n return null;\n }\n\n private _handleControlsKeyDownEvent(e: React.KeyboardEvent): void {\n const keyBrdEvent = (e as unknown) as KeyboardEvent;\n const keycode = keyBrdEvent.keyCode;\n this._showControlBar(true);\n\n // Const castTarget = e.target as HTMLElement;\n\n switch (keycode) {\n case KeyCodes.Home:\n e.stopPropagation();\n e.preventDefault();\n this.player.current!.currentTime = 0;\n if (this.audio.current) {\n this.audio.current.currentTime = 0;\n }\n break;\n case KeyCodes.End:\n e.stopPropagation();\n e.preventDefault();\n this.player.current!.currentTime = this.state.playPosition.endTime;\n if (this.audio.current) {\n this.audio.current.currentTime = this.state.playPosition.endTime;\n }\n break;\n case KeyCodes.ArrowLeft:\n case KeyCodes.ArrowRight:\n e.stopPropagation();\n e.preventDefault();\n let jumpToTime =\n keycode === KeyCodes.ArrowLeft\n ? this.state.playPosition.currentTime - PlayerConstants.defaultVideoSliderSteps\n : this.state.playPosition.currentTime + PlayerConstants.defaultVideoSliderSteps;\n jumpToTime = Math.min(Math.max(this.state.playPosition.startTime, jumpToTime), this.state.playPosition.endTime);\n this.player.current!.currentTime = jumpToTime;\n if (this.audio.current) {\n this.audio.current.currentTime = jumpToTime;\n }\n break;\n case KeyCodes.ArrowUp:\n case KeyCodes.ArrowDown:\n e.stopPropagation();\n e.preventDefault();\n this.videoControl.current!.showVolumeControl(true).call(this);\n const volume =\n keycode === KeyCodes.ArrowDown\n ? Math.max((this.state.currentVolume - PlayerConstants.defaultVolumeSliderSteps) / 100, 0)\n : Math.min((this.state.currentVolume + PlayerConstants.defaultVolumeSliderSteps) / 100, 1);\n this.setState({ currentVolume: Math.round(volume * 100) });\n if (this.audio.current) {\n this.audio.current.volume = volume;\n } else {\n this.player.current!.volume = volume;\n }\n if (volume === 0) {\n this.setState({ isMuted: true });\n } else {\n this.setState({ isMuted: false });\n }\n break;\n default:\n }\n }\n\n private _onPlay(): void {\n this.setState({ playing: true });\n }\n\n private _onPause(): void {\n this.setState({ playing: false });\n }\n\n private _onVolumeChange(notification: ISliderChangeNotification): void {\n this.setState({ currentVolume: notification.firstThumbValue });\n if (this.audio.current) {\n this.audio.current.volume = notification.firstThumbValue / 100;\n } else {\n this.player.current!.volume = notification.firstThumbValue / 100;\n }\n\n if (notification.firstThumbValue === 0) {\n this.setState({ isMuted: true });\n } else if (this.state.isMuted && notification.firstThumbValue > 0) {\n this.setState({ isMuted: false });\n }\n }\n\n private _setMuted(): void {\n if (this.state.isMuted) {\n const newVolume = this.state.previousVolume === 0 ? PlayerConstants.defaultVolume * 100 : this.state.previousVolume;\n\n if (this.audio.current) {\n this.audio.current.volume = newVolume / 100;\n } else {\n this.player.current!.volume = newVolume / 100;\n }\n this.setState({ isMuted: false, currentVolume: newVolume });\n this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('unMuteAriaLabel'));\n onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.unMuteAriaLabel).call(this);\n } else {\n this.setState({ isMuted: true, previousVolume: this.player.current!.volume * 100, currentVolume: 0 });\n this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('muteAriaLabel'));\n onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.muteAriaLabel).call(this);\n }\n }\n\n private _onPlayerKeyDown(e: React.KeyboardEvent): void {\n const keyBrdEvent = (e as unknown) as KeyboardEvent;\n const keycode = keyBrdEvent.keyCode;\n\n if (keycode === KeyCodes.Tab) {\n this._showControlsBasedOnState();\n }\n }\n\n private _onMouseEvent(event: React.MouseEvent<HTMLDivElement>): void {\n if (this.props.playerData.options.controls) {\n this._showControlBar();\n }\n if (!this.state.isTriggerEnabled && this.state.playing) {\n this.setState({ mouseHovered: event.type === 'mouseenter' });\n }\n }\n\n private _showControlBar(autoHide: boolean = true): void {\n if (!this.state.isTriggerEnabled && !this.state.isAgegateEnabled) {\n if (!this.state.isControlPanelVisible) {\n this.setState({ isControlPanelVisible: true });\n }\n if (this.controlPanelTimer) {\n window && window.clearTimeout(this.controlPanelTimer);\n this.controlPanelTimer = 0;\n }\n if (autoHide) {\n this.controlPanelTimer =\n window &&\n window.setTimeout(() => {\n this._hideControlBar();\n }, PlayerConstants.defaultControlPanelTimeout);\n }\n }\n }\n\n private _hideControlBar(): void {\n window && window.clearTimeout(this.controlPanelTimer);\n this.controlPanelTimer = 0;\n this.setState({ isControlPanelVisible: false });\n }\n\n private _onFullScreenChanged(): void {\n this.state.isInFullScreen ? this._onFullscreenExit() : this._onFullscreenEnter();\n }\n\n /**\n * Event handler for fullscreen enter.\n */\n private _onFullscreenEnter(): void {\n this.setState({\n isInFullScreen: true\n });\n }\n\n /**\n * Event handler for fullscreen exit.\n */\n private _onFullscreenExit(): void {\n this.setState({\n isInFullScreen: false\n });\n }\n\n private _toggleFullScreen(): void {\n this.state.isInFullScreen ? this._exitFullScreen() : this._enterFullScreen();\n }\n\n private _onFullscreenError(): void {\n this.setState({\n isInFullScreen: false\n });\n }\n\n private _enterFullScreen(): void {\n if (!Player._isNativeFullscreenEnabled()) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fullscreenElement = this.playerContainer.current! as any;\n const elementInFullScreen = Player._getElementInFullScreen();\n\n // We go to fullscreen only when there is no other element in fullscreen and browser supports fullscreen\n if (fullscreenElement && !elementInFullScreen) {\n const enterFullScreen =\n fullscreenElement.requestFullscreen ||\n fullscreenElement.msRequestFullscreen ||\n fullscreenElement.mozRequestFullScreen ||\n fullscreenElement.webkitRequestFullscreen ||\n fullscreenElement.webkitEnterFullScreen;\n\n enterFullScreen.call(fullscreenElement);\n this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('fullScreenLabel'));\n onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.fullScreenAriaLabel).call(this);\n }\n }\n\n private _exitFullScreen(): void {\n if (!Player._isNativeFullscreenEnabled()) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fullscreenElement = this.playerContainer.current! as any;\n const elementInFullScreen = Player._getElementInFullScreen();\n\n // We only call cancel if we are in fullscreen. If another element went fullscreen that took the player with it then\n // we shouldn't call cancel fullscreen\n if (fullscreenElement && fullscreenElement === elementInFullScreen) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const doc = document as any;\n const cancelFullScreen = doc.cancelFullScreen || doc.msExitFullscreen || doc.mozCancelFullScreen || doc.webkitCancelFullScreen;\n\n cancelFullScreen.call(doc);\n this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('exitFullScreenLabel'));\n onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.exitFullScreenAriaLabel).call(this);\n }\n }\n\n private _onVideoLoadedData(): void {\n this._updateState('ready');\n if (this.props.playerData.options.controls) {\n const position = this._getPlayPosition();\n this.setState({ playPosition: position });\n }\n }\n\n private _onTimeUpdate(): void {\n if (this.props.playerData.options.controls) {\n const position = this._getPlayPosition();\n\n // EndTime changes after playing video for certain time. Keeping this constant.\n position.endTime = this.state.playPosition.endTime;\n this.setState({ playPosition: position });\n if (this.state.playing) {\n if (this.playerState === 'buffering') {\n this._updateState('playing');\n }\n }\n }\n }\n\n private _getBufferedDuration(): number {\n let buffered = 0;\n if (this.player.current!.buffered && this.player.current!.buffered.length) {\n buffered = this.player.current!.buffered.end(this.player.current!.buffered.length - 1);\n }\n return buffered;\n }\n\n private _getPlayPosition(): IPlayPosition {\n const bufferedDuration = this._getBufferedDuration();\n return {\n currentTime: this.player.current!.currentTime,\n startTime: 0,\n endTime: this.player.current!.duration,\n bufferedDuration\n };\n }\n\n private _onProgressChange(notification: ISliderChangeNotification): void {\n let time = notification.firstThumbValue;\n const position = this._getPlayPosition();\n time = Math.max(position.startTime, Math.min(time, position.endTime));\n\n if (Math.abs(time - position.currentTime) >= PlayerConstants.defaultPositionUpdateThreshold) {\n this.player.current!.currentTime = time;\n if (this.audio.current) {\n this.audio.current.currentTime = time;\n }\n }\n }\n\n private _onTriggerClicked(): void {\n const currentPlayer = this.player.current;\n if (!this.isPlayerLoaded) {\n this._loadPlayer();\n this.player.current!.autoplay = true;\n } else if (currentPlayer!.paused) {\n this.play();\n this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('playingAriaLabel'));\n onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.playAriaLabel).call(this);\n if (this.videoControl.current) {\n this.videoControl.current.setFocusOnPause();\n }\n } else {\n this.pause();\n this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('pausedAriaLabel'));\n onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.pauseAriaLabel).call(this);\n if (this.videoControl.current) {\n this.videoControl.current.setFocusOnPlay();\n }\n }\n\n if (this.state.isTriggerEnabled) {\n this.setState({ isTriggerEnabled: false }, () => {\n setTimeout(() => {\n if (this.videoControl.current) {\n this.videoControl.current.setFocusOnPause();\n }\n }, 500);\n });\n onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.pauseAriaLabel).call(this);\n if (this.props.playerData.options.playFullScreen) {\n this._enterFullScreen();\n }\n }\n }\n\n private _stop(): void {\n const videoStartingTime: number = 0.1;\n if (isSafari()) {\n // Safari browser has issues with showing the poster frame of the video when ended. So setting the same to 0.1 seconds.\n this._seek(videoStartingTime);\n } else {\n this._seek(0);\n }\n\n if (this.props.playerData.options.controls) {\n this.pause();\n const playPosition = this._getPlayPosition();\n playPosition.endTime = this.state.playPosition.endTime;\n this.setState({ playPosition });\n if (this.audio.current) {\n this.audio.current.pause();\n }\n }\n }\n\n private _seek(time: number): void {\n const position = this._getPlayPosition();\n time = Math.max(position.startTime, Math.min(time, position.endTime));\n\n if (Math.abs(time - position.currentTime) >= PlayerConstants.defaultPositionUpdateThreshold) {\n this.seekFrom = position.currentTime;\n this.player.current!.currentTime = time;\n if (this.audio.current) {\n this.audio.current.currentTime = time;\n }\n }\n }\n\n /**\n * Returns the mask level style.\n * @returns Returns the mask level style.\n */\n private _getMaskLevelStyle(): string {\n let result: string = '';\n if (this.state.isTriggerEnabled) {\n const maskLevel = this.props.playerData.options.maskLevel || PlayerConstants.defaultMaskLevel;\n result = format('rgba(0,0,0,{0})', Number(maskLevel) / 100);\n }\n return result;\n }\n\n /**\n * Updates the current player state.\n * @param newState - Player state.\n */\n private _updateState(newState: PlayerStates): void {\n if (!newState || newState === this.playerState) {\n return;\n }\n\n this.playerState = newState;\n\n this._showControlsBasedOnState();\n this._showSpinnerBasedOnState();\n }\n\n /**\n * Shows or hides the spinner based on player state.\n */\n private _showSpinnerBasedOnState(): void {\n switch (this.playerState) {\n case 'ready':\n case 'playing':\n case 'paused':\n case 'ended':\n case 'stopped':\n case 'error':\n this._hideSpinner();\n break;\n default:\n this._showSpinner();\n }\n }\n\n /**\n * Shows or hides the player controls based on player state.\n */\n private _showControlsBasedOnState(): void {\n switch (this.playerState) {\n case 'error':\n case 'loading':\n case 'init':\n this._hideControlBar();\n break;\n case 'ended':\n this._showControlBar(false);\n break;\n case 'ready':\n case 'paused':\n case 'stopped':\n this._showControlBar(false);\n break;\n default:\n this._showControlBar(true);\n }\n }\n\n private _hideSpinner(): void {\n this.setState({ showSpinner: false });\n }\n\n private _showSpinner(): void {\n this.setState({ showSpinner: true });\n }\n\n /**\n * Play Trigger focus event.\n */\n private _onTriggerFocus(): void {\n this.setState({ mouseHovered: true });\n }\n\n /**\n * Play Trigger Blur event.\n */\n private _onTriggerBlur(): void {\n if (!this.state.isTriggerEnabled && this.state.playing) {\n this.setState({ mouseHovered: false });\n }\n }\n\n /**\n * Updates the screen reader element.\n * @param text - Update the screen reader element with the pased text.\n */\n private _updateScreenReaderElement(text: string): void {\n this.setState({\n screenReaderText: text\n });\n }\n\n /**\n * Avoid opening context menu on righ click.\n * @param e - Mouse Event.\n */\n private _onContextMenuClicked(e: React.MouseEvent): void {\n e.preventDefault();\n }\n\n /**\n * Check for mobile devices.\n * @returns - Return true or false.\n */\n private _isMobile(): boolean {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const userAgent = window.navigator.userAgent;\n const isIphone = !!userAgent.match(/iphone/i);\n const isSilk = !!userAgent.match(/silk/i);\n const isWindowsPhone = !!userAgent.match(/windows phone/i);\n const isAndroid = !isWindowsPhone && (isSilk || !!userAgent.match(/android/i));\n return isIphone || isWindowsPhone || isAndroid;\n }\n return false;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { IActionToggleProps } from './action-toggle.props';\n\n/**\n * ActionToggle - This component is toggle button which switches between states\n * and for accessibility reasons are 2 different buttons.\n */\nexport default class ActionToggle extends React.PureComponent<IActionToggleProps> {\n private readonly _divRef: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n private _focusElement: HTMLElement | null = null;\n\n public constructor(props: Readonly<IActionToggleProps>) {\n super(props);\n this._onClick = this._onClick.bind(this);\n }\n\n public getSnapshotBeforeUpdate(): null {\n this._focusElement = null;\n if (this._divRef.current?.contains(document.activeElement)) {\n this._focusElement = document.activeElement as HTMLElement;\n }\n return null;\n }\n\n public render(): JSX.Element | null {\n const { className, children, toggled, onChange, ...props } = this.props;\n const classes = `action-toggle${className ? ' ' : ''}${className || ''}`;\n return React.Children.count(children) !== 2 ? null : (\n <div className={classes} {...props} ref={this._divRef}>\n {React.Children.map(children, (child: React.ReactNode, index: number) => {\n const hidden = (!index && !!toggled) || (!!index && !toggled);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return React.cloneElement(child as any, { 'aria-hidden': hidden, onClick: this._onClick });\n })}\n </div>\n );\n }\n\n private _onClick(event: React.KeyboardEvent): void {\n event.stopPropagation();\n if (this.props.onChange) {\n this.props.onChange({ id: this.props.id, actionToggle: this, toggled: !!this.props.toggled, event });\n }\n if (this._divRef.current && this._focusElement) {\n const focusTarget = this._divRef.current.children[this.props.toggled ? 1 : 0] as HTMLElement;\n if (focusTarget !== document.activeElement) {\n focusTarget.focus();\n }\n }\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { PlayerConstants, VideoPlayerNames } from '../data';\nimport { IAgeGateProps } from './age-gate.props';\n\n/**\n *\n * AgeGate React component for video player.\n *\n */\nexport interface IDropdownState {\n monthValue: string;\n dayValue: string;\n yearValue: string;\n}\n\n/**\n * AgeGate class.\n */\nexport default class AgeGate extends React.PureComponent<IAgeGateProps, IDropdownState> {\n public static defaultProps: Partial<IAgeGateProps> = {\n minmumAge: 18\n };\n\n private readonly ageGateDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n public constructor(props: IAgeGateProps) {\n super(props);\n this._filterDateMonthYear = this._filterDateMonthYear.bind(this);\n this.state = {\n monthValue: 'Month',\n dayValue: 'Day',\n yearValue: 'Year'\n };\n }\n\n public render(): JSX.Element {\n const enabled =\n PlayerConstants.regxForAgeGateInputValidation.test(this.state.dayValue) &&\n PlayerConstants.regxForAgeGateInputValidation.test(this.state.monthValue) &&\n PlayerConstants.regxForAgeGateInputValidation.test(this.state.yearValue);\n return (\n <div\n className={`${VideoPlayerNames.videoplayerContainer}__agegate__container`}\n ref={this.ageGateDiv}\n aria-hidden={this.props['aria-hidden']}\n >\n <div>\n <div>\n <h3> Enter your date of birth </h3>\n <fieldset>\n <div>{this.renderSelectMonth()}</div>\n <div>{this.renderSelectDay()}</div>\n <div>{this.renderSelectYear()}</div>\n <button disabled={!enabled} onClick={this.props.onSubmitClick}>\n Submit\n </button>\n </fieldset>\n </div>\n </div>\n </div>\n );\n }\n\n public getCalculatedAge = () => {\n const day: number = Number(this.state.dayValue);\n const month: number = Number(this.state.monthValue);\n const year: number = Number(this.state.yearValue);\n const today: Date = new Date();\n let age = today.getFullYear() - year;\n const birthdayMonthHasNotHappenedYet: boolean = today.getMonth() + 1 < month;\n const birthdayDayHasNotHappenedYet: boolean = today.getMonth() + 1 === month && today.getDate() < day;\n if (birthdayMonthHasNotHappenedYet || birthdayDayHasNotHappenedYet) {\n // User has not reached their birth month and/or birth day-of-month in the current year\n age--;\n }\n const minimmumage = Number(this.props.minmumAge);\n if (age >= minimmumage) {\n return true;\n }\n return false;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _filterDateMonthYear(event: any): void {\n switch (event.target.id) {\n case 'selectDay': {\n this.setState({ dayValue: event.target.value });\n break;\n }\n case 'selectMonth': {\n this.setState({ monthValue: event.target.value });\n break;\n }\n case 'selectYear': {\n this.setState({ yearValue: event.target.value });\n break;\n }\n default:\n break;\n }\n }\n\n private readonly renderSelectMonth = (): JSX.Element => {\n const maxOffset = 12;\n const allMonth = [];\n for (let month = 1; month <= maxOffset; month++) {\n allMonth.push(month);\n }\n const monthList = allMonth.map(month => {\n return (\n <option role='menuitem' key={month} value={month}>\n {month.toFixed(0)}\n </option>\n );\n });\n return (\n <select\n aria-expanded='false'\n className={`${VideoPlayerNames.videoplayerContainer}__agegate__select`}\n role='menu'\n onChange={this._filterDateMonthYear}\n value={this.state.monthValue}\n aria-label='Enter your month of birth'\n name='selectMonth'\n id='selectMonth'\n >\n <option role='menuitem'>Month</option>\n {monthList}\n </select>\n );\n };\n\n private readonly renderSelectDay = (): JSX.Element => {\n const maxOffset = 31;\n const allDay = [];\n for (let day = 1; day <= maxOffset; day++) {\n allDay.push(day);\n }\n const dayList = allDay.map(day => {\n return (\n <option role='menuitem' key={day}>\n {day.toFixed(0)}\n </option>\n );\n });\n return (\n <select\n aria-expanded='false'\n className={`${VideoPlayerNames.videoplayerContainer}__agegate__select`}\n role='menu'\n onChange={this._filterDateMonthYear}\n value={this.state.dayValue}\n aria-label='Enter your day of birth'\n name='selectDay'\n id='selectDay'\n >\n <option role='menuitem'>Day</option>\n {dayList}\n </select>\n );\n };\n\n private readonly renderSelectYear = (): JSX.Element => {\n const maxOffset = 100;\n const thisYear = new Date().getFullYear();\n const allYear = [];\n for (let year = 1; year <= maxOffset; year++) {\n allYear.push(thisYear - year);\n }\n const yearList = allYear.map(year => {\n return (\n <option role='menuitem' key={year}>\n {year.toFixed(0)}\n </option>\n );\n });\n return (\n <select\n aria-expanded='false'\n className={`${VideoPlayerNames.videoplayerContainer}__agegate__select`}\n role='menu'\n onChange={this._filterDateMonthYear}\n value={this.state.yearValue}\n aria-label='Enter your year of birth'\n name='selectYear'\n id='selectYear'\n >\n <option role='menuitem'>Year</option>\n {yearList}\n </select>\n );\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Player constants.\n */\nexport const PlayerConstants = {\n defaultVolume: 0.8,\n defaultVolumeSliderSteps: 5,\n defaultVideoSliderSteps: 1,\n defaultControlPanelTimeout: 6500,\n defaultPositionUpdateThreshold: 0.1,\n defaultMaskLevel: 40,\n defaultPlayGlyphIcon: 'fas fa-play',\n defaultPauseGlyphIcon: 'fas fa-pause',\n defaultMuteGlyphIcon: 'fas fa-volume-up',\n defaultUnMuteGlyphIcon: 'fas fa-volume-off',\n defaultFullScreenGlyphIcon: 'fas fa-expand',\n defaultExitFullScreenGlyphIcon: 'fas fa-compress',\n closedCaptionGlyphClassName: 'fas fa-closed-captioning',\n thumbnailFullWidth: 1110,\n thumbnailFullHeight: 624,\n ccLangPrefKey: 'vidccpref',\n seekBarLabel: 'Seek bar',\n regxForAgeGateInputValidation: /^[\\d\\b]+$/,\n mutePrefKey: 'vidmut',\n volumePrefKey: 'vidvol'\n};\n\n/**\n * @description - names used for video and player html elements.\n */\nexport const VideoPlayerNames = {\n videoplayerContainer: 'msc-videoplayer',\n mediaType: 'video/mp4'\n};\n\n/**\n * Menu Categories.\n */\nexport const MenuCategories = {\n AudioTracks: 'audio-tracks',\n ClosedCaption: 'close-caption',\n ClosedCaptionSettings: 'cc-settings',\n PlaybackSpeed: 'playback-speed',\n Quality: 'quality',\n Share: 'share',\n Download: 'download',\n Options: 'options'\n};\n\n/**\n * Media Events.\n */\nexport const MediaEvents = [\n 'abort',\n 'canplay',\n 'canplaythrough',\n 'emptied',\n 'ended',\n 'error',\n 'loadeddata',\n 'loadedmetadata',\n 'loadstart',\n 'pause',\n 'play',\n 'playing',\n 'progress',\n 'ratechange',\n 'readystatechange',\n 'seeked',\n 'seeking',\n 'stalled',\n 'suspend',\n 'timeupdate',\n 'volumechange',\n 'waiting'\n];\n\n/**\n * Play Positon Interface.\n */\nexport interface IPlayPosition {\n /**\n * @name startTime\n * @type {number}\n * Start position of the buffer, in seconds.\n * For VoD this is usually 0.\n * For live stream this is a position of beginning of DVR window, relative to the stream start time.\n */\n startTime: number;\n\n /**\n * @name endTime\n * @type {number}\n * @description End position of the buffer, in seconds.\n * For VoD this is normally a video duration.\n * For live stream this is normally a \"live\" position, relative to the stream start time.\n */\n endTime: number;\n\n /**\n * @name currentTime\n * @type {number}\n * @description Position currently on the screen, relative to the stream start time, in seconds.\n */\n currentTime: number;\n\n /**\n * @name bufferedDuration\n * @type {number}\n * @description Buffered duration of the video.\n */\n bufferedDuration: number;\n}\n\n/**\n * Current Closed Captions Settings Interface.\n */\nexport interface ICurrentClosedCaptionsSettings {\n preset: string;\n text_font: string;\n text_color: string;\n text_opacity: string;\n text_size: string;\n text_edge_style: string;\n text_background_color: string;\n text_background_opacity: string;\n window_color: string;\n window_opacity: string;\n}\n\n/**\n * @name - PlayerEvents\n * @description - Player states.\n * @type {IPlayerState}\n */\nexport type PlayerStates =\n | 'init'\n | 'playerLoaded'\n | 'loading'\n | 'ready'\n | 'playing'\n | 'paused'\n | 'buffering'\n | 'seeking'\n | 'ended'\n | 'error'\n | 'stopped';\n\n/**\n * @enum VideoErrorCodes\n * @description - Enum for supported media quality.\n */\nexport enum VideoErrorCodes {\n // Buffering.\n BufferingFirstByteTimeout = 2000,\n\n // Media element errors.\n MediaErrorAborted = 2100,\n MediaErrorNetwork = 2101,\n MediaErrorDecode = 2102,\n MediaErrorSourceNotSupported = 2103,\n MediaErrorUnknown = 2104,\n\n // Media selection.\n MediaSelectionNoMedia = 2200\n}\n\n/**\n * @interface IVideoErrorData\n * @description - The data contract interface used for storing references to video error data.\n */\nexport interface IVideoErrorData {\n errorCode: VideoErrorCodes;\n message?: string;\n}\n\n/**\n * @interface IVideoErrorMessageData\n * @description - The data contract interface used for supplying content to an error message.\n */\nexport interface IVideoErrorMessageData {\n title?: string;\n message?: string;\n}\n\n/**\n * @interface - IPlayerMenuItem\n * The IPlayerMenuItem interface that defines the data structure used to store menu item information.\n */\nexport interface IPlayerMenuItem {\n id: string;\n label: string;\n className?: string;\n language?: string;\n data?: string;\n image?: string;\n itemCount?: number;\n itemIndex?: number;\n imageAlt?: string;\n glyph?: string;\n selected?: boolean;\n selectable?: boolean;\n hasMouseHoverEvents?: boolean;\n persistOnClick?: boolean;\n isBackButton?: boolean;\n ariaLabel?: string;\n subMenu?: IPlayerMenu;\n hasFocus?: boolean;\n}\n\n/**\n * @interface - IPlayerMenu\n * The IPlayerMenu interface that defines the data structure used to store menu information.\n */\nexport interface IPlayerMenu {\n id: string;\n category: string;\n items: IPlayerMenuItem[];\n label?: string;\n glyph?: string;\n cssClass?: string;\n hideBackButton?: boolean;\n}\n\n/**\n * Player Menu Item Click Notification Interface.\n */\nexport interface IPlayerMenuItemClickNotification {\n category: string;\n id: string;\n data?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAudioTrack } from './player-interface';\n\n/**\n * @interface ICCFile\n * @description - The data contract interface used for storing references to closed caption files.\n */\nexport interface ICCFile {\n url: string;\n locale: string;\n ccType?: ClosedCaptionTypes;\n}\n\n/**\n * @interface IDownloadableFile\n * @description - The data contract interface used for storing references downloadable media files.\n */\nexport interface IDownloadableFile {\n mediaType: DownloadableMediaTypes;\n url: string;\n locale: string;\n}\n\n/**\n * @enum MediaTypes\n * @description - Enum for supported media types.\n */\nexport enum MediaTypes {\n MP4 = 'MP4',\n DASH = 'DASH',\n SMOOTH = 'SMOOTH',\n HLS = 'HLS'\n}\n\n/**\n * @enum MediaQuality\n * @description - Enum for supported media quality.\n */\nexport enum MediaQuality {\n HD = 'HD',\n HDX = 'HDX',\n HQ = 'HQ',\n SD = 'SD',\n LO = 'LO'\n}\n\n/**\n * @enum ClosedCaptionTypes\n * @description - Enum for supported closed caption types.\n */\nexport enum ClosedCaptionTypes {\n VTT = 'VTT',\n TTML = 'TTML'\n}\n\n/**\n * @enum DownloadableMediaTypes\n * @description - Enum for supported downloadable media types.\n */\nexport enum DownloadableMediaTypes {\n transcript = 'transcript',\n audio = 'audio',\n video = 'video',\n videoWithCC = 'videoWithCC'\n}\n\n/**\n * Cms datatype of video binary reference.\n */\nexport interface IVideoBinaryReference {\n /// <summary>Gets the video binary file format.</summary>\n format: string;\n\n /// <summary>Gets the video bit rate.</summary>\n frameRate: number;\n\n /// <summary>Gets the URL used on the clients to play the video.</summary>\n ClientHref: string;\n}\n\n/**\n * Cms datatype of video transcript binary reference.\n */\nexport interface IVideoTranscriptBinaryReference {\n /// <summary>Gets the locale.</summary>\n locale: string;\n\n /// <summary>Gets the URL used on the clients to play the video.</summary>\n clientHref: string;\n}\n\n/**\n * Cms datatype of video closed captions binary reference.\n */\nexport interface IVideoClosedCaptionBinaryReference {\n /// <summary>Gets the locale.</summary>\n locale: string;\n\n /// <summary>Gets the URL used on the clients to play the video.</summary>\n clientHref: string;\n}\n\n/**\n * Cms datatype of video closed captions binary reference.\n */\nexport interface IAudioBinaryReference {\n /// <summary>Gets the locale.</summary>\n locale: string;\n\n /// <summary>Gets the audio type.</summary>\n audioType: string;\n\n /// <summary>Gets the URL used on the clients to play the video.</summary>\n clientHref: string;\n}\n\n/**\n * IVideoMetadata.\n * @description - The data contract interface used for storing references to video metadata.\n */\nexport interface IVideoMetadata {\n playerName?: string;\n videoId?: string;\n title?: string;\n description?: string;\n duration?: number;\n posterframeUrl?: string;\n shareUrl?: string;\n videoFiles?: IVideoFile[];\n externalPlayerUrl?: string;\n externalSourceId?: string;\n interactiveTriggersEnabled?: boolean;\n interactiveTriggersUrl?: string;\n minimumAge?: number;\n videoBinaryReferences?: IBinaryReference[];\n ccFiles?: ICCFile[];\n audioTracks?: IAudioTrack[];\n}\n\n/**\n * @description - The data contract interface used for storing references to video files.\n */\nexport interface IVideoFile {\n url: string;\n mediaType: MediaTypes;\n quality: MediaQuality;\n width?: number;\n height?: number;\n formatCode?: string;\n}\n\n/**\n * Cms datatype of BinaryReference.\n */\nexport interface IBinaryReference {\n format?: string;\n bitrate?: number;\n clientHref?: string;\n height?: number;\n width?: number;\n alias?: string;\n contentType?: string;\n description?: string;\n extension?: string;\n sizeInBytes?: number;\n sourceHref?: string;\n href?: string;\n locale?: string;\n $type?: string;\n audioType?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICurrentClosedCaptionsSettings } from '../data';\nimport { IDictionaryStringString } from '../utilities';\n\n/**\n * Video closed captions constant.\n */\nexport const videoClosedCaptionsConstant = {\n presetKey: 'preset'\n};\n\n/**\n * @name - closedCaptionsSettinsDefaults\n * @description - The default value for closed captions settings.\n */\nexport const closedCaptionsSettingDefaults: ICurrentClosedCaptionsSettings = {\n preset: 'preset1',\n text_font: 'proportionalsansserif',\n text_color: 'white',\n text_opacity: '100',\n text_size: 'default',\n text_edge_style: 'none',\n text_background_color: 'black',\n text_background_opacity: '100',\n window_color: 'black',\n window_opacity: '0'\n};\n\n/**\n * @name - closedCaptionsSettingsMap\n * @description - The closed captions settings map.\n */\nexport const closedCaptionsSettingsMap: IClosedCaptionsSettingsMap = {\n text_font: { value: 'font-family:', option: 'font' },\n text_color: { value: 'color:', option: 'color' },\n text_size: { value: 'font-size:', option: 'text_size' },\n text_edge_style: { value: 'text-shadow:', option: 'text_edge_style' },\n text_opacity: { value: 'color:', option: 'percent' },\n text_background_color: { value: 'background:', option: 'color' },\n text_background_opacity: { value: 'background:', option: 'percent' },\n window_color: { value: 'background:', option: 'color' },\n window_opacity: { value: 'background:', option: 'percent' }\n};\n\n/**\n * @interface IClosedCaptionsSettingsMap\n * @description - The data contract interface used for storing closed caption setting map.\n */\nexport interface IClosedCaptionsSettingsMap {\n [key: string]: IClosedCaptionsSettings;\n}\n\n/**\n * @interface IClosedCaptionsSettings\n * @description - The data contract interface used for storing closed caption setting values.\n */\nexport interface IClosedCaptionsSettings {\n value: string;\n option: string;\n}\n\n/**\n * Closed Captions Preset Map Interface.\n */\nexport interface IClosedCaptionsPresetMap {\n [key: string]: IDictionaryStringString;\n}\n\n/**\n * @name - closedCaptionsPresetMap\n * @description - The closed captions preset settings map.\n */\nexport const closedCaptionsPresetMap: IClosedCaptionsPresetMap = {\n preset1: {\n text_font: 'proportionalsansserif',\n text_color: 'white',\n text_opacity: '100',\n text_background_color: 'black',\n text_background_opacity: '100'\n },\n preset2: {\n text_font: 'monospacedserif',\n text_color: 'white',\n text_opacity: '100',\n text_background_color: 'black',\n text_background_opacity: '100'\n },\n preset3: {\n text_font: 'proportionalsansserif',\n text_color: 'yellow',\n text_opacity: '100',\n text_background_color: 'black',\n text_background_opacity: '100'\n },\n preset4: {\n text_font: 'proportionalsansserif',\n text_color: 'blue',\n text_opacity: '100',\n text_background_color: 'grey',\n text_background_opacity: '100'\n },\n preset5: {\n text_font: 'casual',\n text_color: 'white',\n text_opacity: '100',\n text_background_color: 'black',\n text_background_opacity: '100'\n }\n};\n\n/**\n * @name - closedCaptionsSettingsOptions\n * @description - The closed captions settings options and value map.\n */\nexport const closedCaptionsSettingsOptions: IClosedCaptionsOptionsMap = {\n font: {\n pre: 'cc_font_name_', // Key prefix for the localization\n map: {\n casual: 'Verdana;font-variant:normal',\n cursive: 'Zapf-Chancery,Segoe script,Cursive;font-variant:normal',\n monospacedsansserif: 'Lucida sans typewriter,Lucida console,Consolas;font-variant:normal',\n monospacedserif: 'Courier;font-variant:normal',\n proportionalsansserif: 'Arial,Sans-serif;font-variant:normal',\n proportionalserif: 'Times New Roman,Serif;font-variant:normal',\n smallcapitals: 'Arial,Helvetica,Sans-serif;font-variant:small-caps'\n }\n },\n percent: {\n pre: 'cc_percent_', // Key prefix for the options\n map: {\n 0: '0',\n 50: '0.5',\n 75: '0.75',\n 100: '1'\n }\n },\n text_size: {\n pre: 'cc_text_size_', // Key prefix for the options\n map: {\n small: '75%',\n default: '100%',\n large: '125%',\n extralarge: '150%',\n maximum: '200%'\n }\n },\n color: {\n pre: 'cc_color_', // Key prefix for the options\n map: {\n white: '#FFFFFF',\n black: '#000000',\n blue: '#0000FF',\n cyan: '#00FFFF',\n green: '#00FF00',\n grey: '#BCBCBC',\n magenta: '#FF00FF',\n red: '#FF0000',\n yellow: '#FFFF00'\n }\n },\n text_edge_style: {\n pre: 'cc_text_edge_style_', // Key prefix for the options\n map: {\n none: 'none',\n depressed: '1px 1px 0 #FFF,-1px -1px 0 #000',\n dropshadow: '1px 1px 0 #000',\n raised: '1px 1px 0 #000,-1px -1px 0x #FFF',\n uniform: '1px 1px 0 #000,-1px 1px 0 #000,1px -1px 0 #000,-1px -1px 0 #000'\n }\n }\n};\n\n/**\n * @interface IClosedCaptionOptionsMap\n * @description - The data contract interface used for storing player closed captions options map.\n */\nexport interface IClosedCaptionsOptionsMap {\n [key: string]: IClosedCaptionsOptions;\n}\n\n/**\n * @interface IClosedCaptionsOptions\n * @description - The data contract interface used for storing closed captions options values.\n */\nexport interface IClosedCaptionsOptions {\n pre: string;\n map: IDictionaryStringString;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { IMenuItemProps, MenuItem } from '../menu-item';\nimport { IMenuProps } from './menu-props';\n\n/**\n *\n * Menu React component for video player.\n *\n */\nexport default class Menu extends React.Component<IMenuProps> {\n private readonly target: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n public constructor(props: IMenuProps) {\n super(props);\n this.handleDocumentClick = this.handleDocumentClick.bind(this);\n this._onKeyDown = this._onKeyDown.bind(this);\n this._onKeyUp = this._onKeyUp.bind(this);\n }\n\n public componentDidMount(): void {\n ['click', 'touchstart'].forEach((event: string) => {\n window && window.addEventListener(event, this.handleDocumentClick, true);\n });\n }\n\n public componentWillUnmount(): void {\n ['click', 'touchstart'].forEach((event: string) => {\n window && window.removeEventListener(event, this.handleDocumentClick, true);\n });\n }\n\n public getMenuWidth(): number {\n return this.target.current!.offsetWidth;\n }\n\n public shouldComponentUpdate(nextProps: IMenuProps): boolean {\n let shouldRender = false;\n if (nextProps.playerMenu !== this.props.playerMenu) {\n shouldRender = true;\n }\n return shouldRender;\n }\n\n public render(): JSX.Element {\n const { className, style } = this.props;\n const menuItems: IMenuItemProps[] = this.props.playerMenu.items;\n const count: number = menuItems.length;\n return (\n <div className={className} style={style} ref={this.target} data-category={this.props.playerMenu.category}>\n <ul role='menu' className={`${className}__list`} onKeyDown={this._onKeyDown} onKeyUp={this._onKeyUp}>\n {menuItems.map((menuItem: IMenuItemProps, index: number) => {\n return (\n <MenuItem\n id={menuItem.id}\n key={index}\n label={menuItem.label}\n className={`${className}__menuitem`}\n language={menuItem.language}\n data={menuItem.data}\n isBackButton={menuItem.isBackButton}\n image={menuItem.image}\n imageAlt={menuItem.imageAlt}\n itemCount={count}\n itemIndex={index}\n glyph={menuItem.glyph}\n selected={menuItem.selected}\n selectable={menuItem.selectable}\n persistOnClick={menuItem.persistOnClick}\n {...(menuItem.id.includes('cc-preset') ? {} : { ariaLabel: menuItem.ariaLabel })}\n subMenu={menuItem.subMenu}\n hasMouseHoverEvents={menuItem.hasMouseHoverEvents}\n hasChildren={\n !!(menuItem.subMenu !== undefined && menuItem.subMenu.items && menuItem.subMenu.items.length > 0)\n }\n onClick={this.props.onMenuItemClick}\n onFocus={this.props.onFocus}\n onBlur={this.props.onBlur}\n onKeyDown={this.props.onKeyDown}\n onKeyUp={this.props.onKeyUp}\n onMouseOver={this.props.onMouseOver}\n onMouseOut={this.props.onMouseOut}\n hasFocus={menuItem.hasFocus}\n />\n );\n })}\n </ul>\n </div>\n );\n }\n\n public handleDocumentClick(e: Event): void {\n const target = e.target as HTMLElement;\n if (\n this.target !== undefined &&\n !(this.target.current !== null && (e.target === this.target.current || this.target.current.contains(target)))\n ) {\n this.props.onDocumentClick(e);\n }\n }\n\n private _onKeyDown(event: React.KeyboardEvent<HTMLUListElement>): void {\n this.props.onKeyDown!((event as unknown) as Event);\n }\n\n private _onKeyUp(event: React.KeyboardEvent<HTMLUListElement>): void {\n this.props.onKeyUp!((event as unknown) as Event);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport React from 'react';\n\nimport { IMenuItemProps } from './menu-item-props';\n\n/**\n *\n * PlayPauseTrigger React component for video player.\n *\n */\nexport default class MenuItem extends React.PureComponent<IMenuItemProps> {\n private readonly menuItem: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n public constructor(props: IMenuItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this._onFocus = this._onFocus.bind(this);\n this._onMouseOver = this._onMouseOver.bind(this);\n this._onMouseOut = this._onMouseOut.bind(this);\n this._onKeyDown = this._onKeyDown.bind(this);\n this._onKeyUp = this._onKeyUp.bind(this);\n this._onBlur = this._onBlur.bind(this);\n }\n\n public render(): JSX.Element {\n const { ...props } = this.props;\n let className = this.props.className;\n const hasChildren = !!props.subMenu;\n if (hasChildren) {\n className += ' menu__parent menu__position__right';\n } else if (this.props.selected) {\n className += ' menu__selected menu__position__right';\n } else if (this.props.isBackButton) {\n className += ' menu__back menu__position__left';\n }\n return (\n <li id={props.id} role='presentation'>\n <button\n ref={this.menuItem}\n className={className}\n data-has-children={hasChildren}\n {...(props.data ? { 'data-info': props.data } : {})}\n role={props.selectable ? 'menuitemradio' : 'menuitem'}\n aria-setsize={props.itemCount}\n aria-posinset={props.itemIndex! + 1}\n data-itemindex={props.itemIndex!}\n data-isbackbutton={props.isBackButton}\n {...(props.selectable && props.selected ? { 'aria-selected': true, 'aria-checked': true } : {})}\n {...(props.selectable ? { 'data-video-selectable': true } : {})}\n {...(hasChildren ? { 'aria-expanded': false, 'aria-haspopup': true } : {})}\n {...(props.persistOnClick ? { 'data-persist': true } : {})}\n {...(props.ariaLabel ? { 'aria-label': props.ariaLabel } : {})}\n {...(props.language ? { lang: props.language } : {})}\n {...(props.hasMouseHoverEvents ? { 'data-has-events': props.hasMouseHoverEvents } : {})}\n onClick={this._onClick}\n onFocus={this._onFocus}\n onMouseOver={this._onMouseOver}\n onMouseOut={this._onMouseOut}\n onKeyDown={this._onKeyDown}\n onKeyUp={this._onKeyUp}\n onBlur={this._onBlur}\n >\n {props.image && <img src={props.image} alt={props.imageAlt || ''} className='menu__image' />}\n {props.label}\n </button>\n </li>\n );\n }\n\n public componentDidMount(): void {\n if (this.props.hasFocus) {\n setTimeout(() => {\n this.menuItem.current!.focus();\n }, 0);\n }\n }\n\n public componentDidUpdate(): void {\n if (this.props.hasFocus) {\n setTimeout(() => {\n this.menuItem.current!.focus();\n }, 0);\n }\n }\n\n private _onClick(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void {\n this.props.onClick!((event as unknown) as Event);\n }\n\n private _onFocus(event: React.FocusEvent<HTMLButtonElement>): void {\n this.props.onFocus!((event as unknown) as Event);\n }\n\n private _onMouseOver(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void {\n this.props.onMouseOver!((event as unknown) as Event);\n }\n\n private _onMouseOut(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void {\n this.props.onMouseOut!((event as unknown) as Event);\n }\n\n private _onKeyDown(event: React.KeyboardEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n this.props.onKeyDown!((event as unknown) as Event);\n }\n\n private _onKeyUp(event: React.KeyboardEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n this.props.onKeyUp!((event as unknown) as Event);\n }\n\n private _onBlur(event: React.FocusEvent<HTMLButtonElement>): void {\n this.props.onBlur!((event as unknown) as Event);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ActionToggle } from '../action-toggle';\nimport { LocalizationConstants } from '../helper';\nimport { IPlayPauseTriggerProps } from './play-pause-trigger.props';\n\n/**\n *\n * PlayPauseTrigger React component for video player.\n *\n */\nexport default class PlayPauseTrigger extends React.PureComponent<IPlayPauseTriggerProps> {\n public static defaultProps: Partial<IPlayPauseTriggerProps> = {\n playAriaLabel: 'play',\n pauseAriaLabel: 'pause'\n };\n\n private readonly playRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n private readonly pauseRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IPlayPauseTriggerProps) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { className, playAriaLabel, pauseAriaLabel, style, ...props } = this.props;\n this.payLoad.contentAction.etext = this.props.toggled ? LocalizationConstants.pauseAriaLabel : LocalizationConstants.playAriaLabel;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <div className={`${className}__container`} onClick={this.props.onChange} style={style} role='none'>\n <ActionToggle className={this.props.className} {...props}>\n <button aria-label={playAriaLabel} className={`${className}__playbtn`} ref={this.playRef} {...attribute} />\n <button aria-label={pauseAriaLabel} className={`${className}__pausebtn`} ref={this.pauseRef} {...attribute} />\n </ActionToggle>\n <UncontrolledTooltip trigger='hover focus' target={this.playRef}>\n {' '}\n {playAriaLabel}\n </UncontrolledTooltip>\n <UncontrolledTooltip trigger='hover focus' target={this.pauseRef}>\n {' '}\n {pauseAriaLabel}\n </UncontrolledTooltip>\n </div>\n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n IPayLoad,\n ISliderProps,\n Slider,\n UncontrolledTooltip\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ActionToggle } from '../action-toggle';\nimport { IPlayerMenu, MenuCategories, VideoPlayerNames } from '../data';\nimport { LocalizationConstants } from '../helper';\nimport { Menu } from '../menu';\nimport { KeyCodes } from '../utilities';\nimport { IVideoControlsProps } from './video-controls.props';\n\n/**\n * Video Control State Interface.\n */\nexport interface IVideoControlState {\n showVolumeSlider: boolean;\n volumeSliderLeftPosition: number;\n volumeSliderTopPosition: number;\n showMenu: boolean;\n menuLeftPosition: number;\n currentMenu?: IPlayerMenu;\n toolTipClass: string;\n}\n\n/**\n * Offset Position Interface.\n */\nexport interface IOffsetPosition {\n offsetLeft: number;\n offsetTop: number;\n}\n\n/**\n * Button Menu Types.\n */\nexport const ButtonMenuTypes = {\n ClosedCaption: 'close-caption',\n Options: 'options'\n};\n\nconst volumeSliderDivOffset: number = 162;\n\n/**\n *\n * VideoControls React component for video player.\n *\n */\nexport default class VideoControls extends React.PureComponent<IVideoControlsProps, IVideoControlState> {\n public static defaultProps: Partial<IVideoControlsProps> = {\n resources: {\n playAriaLabel: LocalizationConstants.playAriaLabel,\n pauseAriaLabel: LocalizationConstants.pauseAriaLabel,\n closeAriaLabel: LocalizationConstants.closeAriaLabel,\n muteAriaLabel: LocalizationConstants.muteAriaLabel,\n unMuteAriaLabel: LocalizationConstants.unMuteAriaLabel,\n fullScreenAriaLabel: LocalizationConstants.fullScreenAriaLabel,\n exitFullScreenAriaLabel: LocalizationConstants.exitFullScreenAriaLabel,\n pausedAriaLabel: LocalizationConstants.pausedAriaLabel,\n playingAriaLabel: LocalizationConstants.playingAriaLabel,\n seekBarLabel: LocalizationConstants.seekBarLabel,\n videoTimeDurationLabel: LocalizationConstants.videoTimeDurationLabel,\n closedCaptionLabel: LocalizationConstants.closedCaptionLabel\n },\n viewportMin: 200\n };\n\n private static readonly videoControlsClassName: string = `${VideoPlayerNames.videoplayerContainer}__controls`;\n\n private static readonly volumeAutoHideTimeout: number = 2000;\n\n private selectedMenuItems: number[] = [];\n\n private volumeAutoHideTimer: number;\n\n private focusedMenuItemIndex: number;\n\n private currentMenu: string;\n\n private readonly volumeButtonDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n private readonly playButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n private readonly pauseButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n private readonly closedCaptionRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n private readonly optionButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n private readonly fullscreenButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n private readonly exitFullScreenButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n private readonly videoControlDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n private readonly closedCaptionButtonDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n private readonly optionButtonDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n private readonly menuRef: React.RefObject<Menu> = React.createRef<Menu>();\n\n private readonly muteButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n private readonly unMuteButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n private readonly _fullScreenReference: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n private readonly payLoad: IPayLoad;\n\n public static getDerivedStateFromProps(props: IVideoControlsProps, state: IVideoControlState): IVideoControlState {\n const nextState = { ...state };\n if (!props.isControlPanelVisible) {\n nextState.showMenu = false;\n }\n return nextState;\n }\n\n public constructor(props: IVideoControlsProps) {\n super(props);\n this.volumeAutoHideTimer = 0;\n this.focusedMenuItemIndex = 0;\n this.currentMenu = '';\n this._hideVolumeControl = this._hideVolumeControl.bind(this);\n this._onMenuItemClick = this._onMenuItemClick.bind(this);\n this._reevaluateWidth = this._reevaluateWidth.bind(this);\n this._onClosedCaptionClick = this._onClosedCaptionClick.bind(this);\n this._onDocumentClick = this._onDocumentClick.bind(this);\n this._onOptionsButtonClick = this._onOptionsButtonClick.bind(this);\n this._onMenuBlur = this._onMenuBlur.bind(this);\n this._onMenuFocus = this._onMenuFocus.bind(this);\n this._onMouseOver = this._onMouseOver.bind(this);\n this._onMouseOut = this._onMouseOut.bind(this);\n this._onMenuKeyDown = this._onMenuKeyDown.bind(this);\n this._onMenuKeyUp = this._onMenuKeyUp.bind(this);\n this.state = {\n showVolumeSlider: false,\n volumeSliderLeftPosition: 0,\n volumeSliderTopPosition: -160,\n showMenu: false,\n menuLeftPosition: 0,\n currentMenu: this.props.closedCaptionMenu,\n toolTipClass: ''\n };\n\n // Construct telemetry attribute to render\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public componentDidUpdate(previousProps: IVideoControlsProps): void {\n // Updating the selected menu as setstate in player takes time to update\n if (\n this.props.currentClosedCaptionLanguage !== previousProps.currentClosedCaptionLanguage ||\n this.props.currentClosedCaptionsSetting !== previousProps.currentClosedCaptionsSetting ||\n this.props.currentAudioTrack !== previousProps.currentAudioTrack\n ) {\n this._updateSelectedMenu();\n }\n }\n\n public render(): JSX.Element {\n const { className, ...props } = this.props;\n\n const currentTime = this._toElapsedTimeString(props.playPosition.currentTime);\n const endTime = this._toElapsedTimeString(props.playPosition.endTime);\n\n const volumeDivStyle = {\n top: this.state.volumeSliderTopPosition,\n left: this.state.volumeSliderLeftPosition\n };\n\n const menuDivStyle = {\n left: this.state.menuLeftPosition\n };\n\n this.payLoad.contentAction.etext = this.props.playing ? LocalizationConstants.pauseAriaLabel : LocalizationConstants.playAriaLabel;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <div\n className={className}\n ref={this.videoControlDiv}\n role='none'\n onKeyDown={this.props.handleControlsKeyDownHandler}\n onBlur={this.props.onBlur}\n onFocus={this.props.onFocus}\n >\n <div className={`${VideoControls.videoControlsClassName}__wrapper`}>\n <div className={`${VideoControls.videoControlsClassName}__playpausebtn__container`}>\n <ActionToggle\n className={`${VideoControls.videoControlsClassName}__playpausebtn__wrapper`}\n onChange={this.props.onPlayClick}\n toggled={this.props.playing}\n >\n <button\n ref={this.playButtonRef}\n aria-label={this.props.resources.playAriaLabel}\n className={`${VideoControls.videoControlsClassName}__playbtn`}\n {...attribute}\n />\n <button\n ref={this.pauseButtonRef}\n aria-label={this.props.resources.pauseAriaLabel}\n className={`${VideoControls.videoControlsClassName}__pausebtn`}\n {...attribute}\n />\n </ActionToggle>\n <UncontrolledTooltip className={this.state.toolTipClass} trigger='hover focus' target={this.playButtonRef}>\n {' '}\n {this.props.resources.playAriaLabel}\n </UncontrolledTooltip>\n <UncontrolledTooltip trigger='hover focus' target={this.pauseButtonRef}>\n {' '}\n {this.props.resources.pauseAriaLabel}\n </UncontrolledTooltip>\n </div>\n <div className={`${VideoControls.videoControlsClassName}__time`}>\n <div\n className={`${VideoControls.videoControlsClassName}__time__screenreader`}\n aria-hidden={this.props.isMobileDevice}\n aria-live='polite'\n >\n {`${this.props.resources.videoTimeDurationLabel} ${currentTime} / ${endTime}`}\n </div>\n <div className={`${VideoControls.videoControlsClassName}__time__text`} aria-hidden='true'>\n {currentTime} / {endTime}\n </div>\n </div>\n <div className={`${VideoControls.videoControlsClassName}__slider__container`}>{this._renderVideoSlider()}</div>\n {this.props.closedCaptionMenu && this._renderClosedCaptionButton()}\n {this.props.optionMenu && this._renderOptionButton()}\n {this.state.showMenu && (\n <Menu\n ref={this.menuRef}\n className={`${VideoControls.videoControlsClassName}__menu`}\n playerMenu={this.state.currentMenu!}\n style={menuDivStyle}\n onDocumentClick={this._onDocumentClick}\n onMenuItemClick={this._onMenuItemClick}\n onFocus={this._onMenuFocus}\n onBlur={this._onMenuBlur}\n onMouseOver={this._onMouseOver}\n onMouseOut={this._onMouseOut}\n onKeyDown={this._onMenuKeyDown}\n onKeyUp={this._onMenuKeyUp}\n />\n )}\n {!this.props.isMobileDevice && (\n <div className={`${VideoControls.videoControlsClassName}__muteunmutebtn__container`} ref={this.volumeButtonDiv}>\n {this._renderVolumeButton()}\n </div>\n )}\n {!this.props.isMobileDevice && (\n <div\n className={`${VideoControls.videoControlsClassName}__volumeslider__container ${\n this.state.showVolumeSlider ? 'show' : 'hide'\n }`}\n onFocus={this.showVolumeControl()}\n onBlur={this._hideVolumeControl}\n onMouseOver={this.showVolumeControl()}\n onMouseOut={this._hideVolumeControl}\n style={volumeDivStyle}\n role='presentation'\n >\n {this._renderVolumeSlider()}\n </div>\n )}\n {this._renderFullScreenButton()}\n </div>\n </div>\n );\n }\n\n /**\n * Show Volume Control.\n * @param autohide - AutoHide the volume Control.\n * @returns Returns void.\n */\n public showVolumeControl = (autohide?: boolean) => () => {\n const offsetPosition = this._getOffsetPosition(this.volumeButtonDiv);\n window && window.clearTimeout(this.volumeAutoHideTimer);\n\n this.setState({\n showVolumeSlider: true,\n volumeSliderLeftPosition: offsetPosition.offsetLeft,\n volumeSliderTopPosition: offsetPosition.offsetTop - volumeSliderDivOffset + 1\n });\n if (autohide && document.activeElement!.parentElement !== this.volumeButtonDiv.current!.firstChild) {\n this.volumeAutoHideTimer =\n window &&\n window.setTimeout(() => {\n this._hideVolumeControl();\n }, VideoControls.volumeAutoHideTimeout);\n }\n };\n\n public setFocusOnPlay(): void {\n setTimeout(() => {\n if (this.playButtonRef.current) {\n this.playButtonRef.current.focus();\n }\n }, 0);\n }\n\n public setFocusOnPause(): void {\n setTimeout(() => {\n if (this.pauseButtonRef.current) {\n this.pauseButtonRef.current.focus();\n }\n }, 0);\n }\n\n public setFocusOnMenuButton(): void {\n // Don't set focus if control panel is not visible\n if (this.props.isControlPanelVisible) {\n if (this.currentMenu === ButtonMenuTypes.ClosedCaption) {\n this.closedCaptionRef.current!.focus();\n } else {\n this.optionButtonRef.current!.focus();\n }\n }\n }\n\n public componentDidMount(): void {\n window && window.addEventListener('resize', this._reevaluateWidth);\n this._reevaluateWidth();\n if (this._isIPhone()) {\n this._fullScreenReference.current?.setAttribute('hidden', 'true');\n }\n }\n\n public componentWillUnmount(): void {\n window && window.removeEventListener('resize', this._reevaluateWidth);\n }\n\n private _reevaluateWidth(): void {\n const rowDiv = this.videoControlDiv.current!.children[0];\n let controlBarButtonsWidth = 0;\n\n // Not able to use for-of loop as it causes another ts-lint issue because rowDiv.children is a HTMLCollection object and HTMLCollection\n // is not an array type and string type. So I am surpressing the ts-lint error here rather than other error\n for (let i = 0; i < rowDiv.children.length; i++) {\n if (rowDiv.children[i].children[0] !== undefined && rowDiv.children[i].children[0].className.includes('action-toggle')) {\n controlBarButtonsWidth += rowDiv.children[i].clientWidth;\n }\n }\n\n const sliderWidth = controlBarButtonsWidth + 100;\n rowDiv.children[2].setAttribute('style', `${'width: calc(100% - '}${sliderWidth}${'px)'}`);\n if (this.state.showVolumeSlider) {\n this._hideVolumeControl();\n }\n if (!this.props.isMobileDevice) {\n const offsetPosition = this._getOffsetPosition(this.volumeButtonDiv);\n this.setState({\n volumeSliderLeftPosition: offsetPosition.offsetLeft,\n volumeSliderTopPosition: offsetPosition.offsetTop - volumeSliderDivOffset\n });\n }\n if (this.state.showMenu) {\n this.setState({\n showMenu: false\n });\n }\n\n const videoControlWidth = this.videoControlDiv.current!.clientWidth;\n const viewportMax = window && window.innerWidth;\n this._applyTooltipClassOnWidthChange(videoControlWidth, viewportMax);\n }\n\n /**\n * Handles document click.\n * @param e - Event object passed.\n */\n private readonly _onDocumentClick = (e: Event): void => {\n const target = e.target as HTMLElement;\n if (\n !(\n (this.currentMenu === ButtonMenuTypes.ClosedCaption &&\n (target === this.closedCaptionButtonDiv.current!.firstChild ||\n target.parentElement === this.closedCaptionButtonDiv.current!.firstChild)) ||\n (this.currentMenu === ButtonMenuTypes.Options &&\n (target === this.optionButtonDiv.current!.firstChild ||\n target.parentElement === this.optionButtonDiv.current!.firstChild))\n )\n ) {\n this.setState({\n showMenu: !this.state.showMenu\n });\n }\n };\n\n private _onMenuFocus(e: Event): void {\n const button: HTMLButtonElement = e.target as HTMLButtonElement;\n const hasEvents = button.getAttribute('data-has-events');\n if (hasEvents) {\n this.props.onMenuItemFocus({\n category: button.parentElement!.parentElement!.parentElement!.getAttribute('data-category')!,\n id: button.parentElement!.id,\n data: button.getAttribute('data-info')!\n });\n }\n }\n\n private _onMenuBlur(e: Event): void {\n const button: HTMLButtonElement = e.target as HTMLButtonElement;\n const hasEvents = button.getAttribute('data-has-events');\n if (hasEvents) {\n this.props.onMenuItemBlur();\n }\n }\n\n private _onMouseOver(e: Event): void {\n const button: HTMLButtonElement = e.target as HTMLButtonElement;\n const hasEvents = button.getAttribute('data-has-events');\n if (hasEvents) {\n this.props.onMenuItemFocus({\n category: button.parentElement!.parentElement!.parentElement!.getAttribute('data-category')!,\n id: button.parentElement!.id,\n data: button.getAttribute('data-info')!\n });\n }\n }\n\n private _onMouseOut(e: Event): void {\n const button: HTMLButtonElement = e.target as HTMLButtonElement;\n const hasEvents = button.getAttribute('data-has-events');\n if (hasEvents) {\n this.props.onMenuItemBlur();\n }\n }\n\n private _onMenuKeyDown(e: Event): void {\n this._onMenuKeyPressed((e as unknown) as KeyboardEvent);\n }\n\n private _onMenuKeyUp(event: Event): void {\n const e = (event as unknown) as KeyboardEvent;\n const key = e.keyCode;\n\n if (key === KeyCodes.Space) {\n event.preventDefault();\n }\n }\n\n /**\n * Event handler for menu's keyboard events.\n * @param event - The dialog that is allowed to remain open.\n */\n private _onMenuKeyPressed(event: KeyboardEvent): void {\n const key = event.keyCode;\n const target = event.target as HTMLElement;\n const currentMenuItem = this.state.currentMenu!;\n this._resetFocusForCurrentMenu(currentMenuItem);\n\n // eslint-disable-next-line default-case\n switch (key) {\n case KeyCodes.ArrowLeft:\n case KeyCodes.ArrowRight:\n event.stopPropagation();\n event.preventDefault();\n if (key === KeyCodes.ArrowRight && target.getAttribute('data-has-children') === 'true') {\n this._onMenuItemClick(event);\n }\n if (key === KeyCodes.ArrowLeft && target.getAttribute('data-isbackbutton') === 'true') {\n this._onMenuItemClick(event);\n }\n break;\n\n case KeyCodes.Enter:\n case KeyCodes.Space:\n event.preventDefault();\n this._onMenuItemClick(event);\n break;\n\n case KeyCodes.ArrowUp:\n case KeyCodes.ArrowDown:\n event.stopPropagation();\n event.preventDefault();\n\n if (key === KeyCodes.ArrowUp) {\n this.focusedMenuItemIndex -= 1;\n if (this.focusedMenuItemIndex < 0) {\n this.focusedMenuItemIndex = currentMenuItem.items.length - 1;\n }\n } else {\n this.focusedMenuItemIndex = (this.focusedMenuItemIndex + 1) % currentMenuItem.items.length;\n }\n\n currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n this.setState(\n {\n currentMenu: currentMenuItem\n },\n () => {\n if (this.menuRef.current) {\n this.menuRef.current.forceUpdate();\n }\n }\n );\n break;\n\n case KeyCodes.PageUp:\n case KeyCodes.Home:\n event.stopPropagation();\n event.preventDefault();\n this.focusedMenuItemIndex = 0;\n currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n this.setState(\n {\n currentMenu: currentMenuItem\n },\n () => {\n if (this.menuRef.current) {\n this.menuRef.current.forceUpdate();\n }\n }\n );\n break;\n\n case KeyCodes.End:\n case KeyCodes.PageDown:\n event.stopPropagation();\n event.preventDefault();\n this.focusedMenuItemIndex = currentMenuItem.items.length - 1;\n currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n this.setState(\n {\n currentMenu: currentMenuItem\n },\n () => {\n if (this.menuRef.current) {\n this.menuRef.current.forceUpdate();\n }\n }\n );\n break;\n\n case KeyCodes.Escape:\n this.setFocusOnMenuButton();\n this.setState({\n showMenu: false\n });\n break;\n case KeyCodes.Tab:\n if (\n (this.focusedMenuItemIndex < currentMenuItem.items.length - 1 ||\n (this.focusedMenuItemIndex === currentMenuItem.items.length - 1 && event.shiftKey)) &&\n this.focusedMenuItemIndex >= 0 &&\n !(this.focusedMenuItemIndex === 0 && event.shiftKey)\n ) {\n this.focusedMenuItemIndex += event.shiftKey ? -1 : 1;\n\n currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n this.setState({\n currentMenu: currentMenuItem\n });\n } else {\n event.stopPropagation();\n event.preventDefault();\n this.setState({\n showMenu: false\n });\n if (event.shiftKey) {\n this.setFocusOnMenuButton();\n } else if (this.currentMenu === ButtonMenuTypes.ClosedCaption && this.optionButtonRef.current) {\n this.optionButtonRef.current.focus();\n } else {\n this.props.isMuted ? this.unMuteButtonRef.current!.focus() : this.muteButtonRef.current!.focus();\n }\n }\n }\n }\n\n private _onMenuItemClick(e: KeyboardEvent): void {\n const button: HTMLButtonElement = e.currentTarget as HTMLButtonElement;\n if (button.getAttribute('data-has-children')! === 'true') {\n const index: number = Number(button.getAttribute('data-itemindex')!);\n this.selectedMenuItems.push(index);\n const currentMenuItem = this._getSelectedMenuFromList();\n this.focusedMenuItemIndex = 0;\n currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n this.setState({\n currentMenu: currentMenuItem\n });\n } else if (button.getAttribute('data-isbackbutton')! === 'true') {\n this.focusedMenuItemIndex = this.selectedMenuItems.pop()!;\n const currentMenuItem = this._getSelectedMenuFromList();\n currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n this.setState({\n currentMenu: currentMenuItem\n });\n } else {\n const currentMenuItem = this._getSelectedMenuFromList();\n this._resetFocusForCurrentMenu(currentMenuItem);\n const index: number = Number(button.getAttribute('data-itemindex')!);\n this.focusedMenuItemIndex = index;\n const data =\n this.currentMenu === ButtonMenuTypes.ClosedCaption\n ? button.getAttribute('data-info')\n : JSON.stringify({ url: button.getAttribute('data-info')!, lang: button.getAttribute('lang')! });\n this.props.onMenuItemClick({\n category: button.parentElement!.parentElement!.parentElement!.getAttribute('data-category')!,\n id: button.parentElement!.id,\n data: data!\n });\n }\n this._updateSelectedMenu();\n }\n\n private _resetFocusForCurrentMenu(currentMenu: IPlayerMenu): void {\n currentMenu.items.forEach(item => (item.hasFocus = false));\n }\n\n private _getSelectedMenuFromList(): IPlayerMenu {\n let menuItem = this.currentMenu === ButtonMenuTypes.ClosedCaption ? this.props.closedCaptionMenu! : this.props.optionMenu!;\n\n for (let i = 0; i < this.selectedMenuItems.length; i++) {\n menuItem = menuItem.items[this.selectedMenuItems[i]].subMenu!;\n }\n return menuItem;\n }\n\n private _updateSelectedMenu(): void {\n const currentMenuItem = this._getSelectedMenuFromList();\n if (currentMenuItem) {\n // eslint-disable-next-line default-case\n switch (currentMenuItem.category) {\n case MenuCategories.ClosedCaption:\n currentMenuItem.items.forEach(item => {\n if (item.data && item.data === this.props.currentClosedCaptionLanguage) {\n item.selected = true;\n } else {\n item.selected = false;\n }\n });\n break;\n case MenuCategories.ClosedCaptionSettings:\n currentMenuItem.items.forEach(item => {\n // eslint-disable-next-line guard-for-in\n for (const setting in this.props.currentClosedCaptionsSetting) {\n const data = `${setting}:${this.props.currentClosedCaptionsSetting[setting]}`;\n if (item.data && item.data === data) {\n item.selected = true;\n break;\n } else {\n item.selected = false;\n }\n }\n });\n break;\n case MenuCategories.AudioTracks:\n currentMenuItem.items.forEach(item => {\n if (item.language && item.language === this.props.currentAudioTrack) {\n item.selected = true;\n } else {\n item.selected = false;\n }\n });\n }\n\n this.setState(\n {\n currentMenu: currentMenuItem\n },\n () => {\n if (this.menuRef.current) {\n this.menuRef.current.forceUpdate();\n }\n }\n );\n }\n }\n\n /**\n * Render the closed caption button.\n * @returns Returns the closed caption button.\n */\n private readonly _renderClosedCaptionButton = (): JSX.Element => {\n return (\n <div className={`${VideoControls.videoControlsClassName}__closedcaption__container`} ref={this.closedCaptionButtonDiv}>\n <button\n ref={this.closedCaptionRef}\n aria-label={this.props.resources.closedCaptionLabel}\n className={`${VideoControls.videoControlsClassName}__closedcaptionbtn`}\n onClick={this._onClosedCaptionClick}\n />\n <UncontrolledTooltip trigger='hover focus' target={this.closedCaptionRef}>\n {this.props.resources.closedCaptionLabel}\n </UncontrolledTooltip>\n </div>\n );\n };\n\n /**\n * Renders the option button.\n * @returns Returns the render option button.\n */\n private readonly _renderOptionButton = (): JSX.Element => {\n return (\n <div className={`${VideoControls.videoControlsClassName}__moreoptions__container`} ref={this.optionButtonDiv}>\n <button\n ref={this.optionButtonRef}\n aria-label={this.props.resources.optionButtonLabel}\n className={`${VideoControls.videoControlsClassName}__moreoptionsbtn`}\n onClick={this._onOptionsButtonClick}\n />\n <UncontrolledTooltip trigger='hover focus' target={this.optionButtonRef}>\n {this.props.resources.optionButtonLabel}\n </UncontrolledTooltip>\n </div>\n );\n };\n\n /**\n * Renders the full screen button.\n * @returns Returns the full screen button.\n */\n private readonly _renderFullScreenButton = (): JSX.Element => {\n this.payLoad.contentAction.etext = this.props.isInFullScreen\n ? LocalizationConstants.exitFullScreenAriaLabel\n : LocalizationConstants.fullScreenAriaLabel;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <div ref={this._fullScreenReference} className={`${VideoControls.videoControlsClassName}__fullscreenbtn__container`}>\n <ActionToggle\n onChange={this.props.toggleFullScreen}\n toggled={this.props.isInFullScreen}\n className={`${VideoControls.videoControlsClassName}__fullscreenbtn__wrapper`}\n >\n <button\n ref={this.fullscreenButtonRef}\n aria-label={this.props.resources.fullScreenAriaLabel}\n className={`${VideoControls.videoControlsClassName}__fullscreenbtn`}\n {...attribute}\n />\n <button\n ref={this.exitFullScreenButtonRef}\n aria-label={this.props.resources.exitFullScreenAriaLabel}\n className={`${VideoControls.videoControlsClassName}__exitfullscreenbtn`}\n {...attribute}\n />\n </ActionToggle>\n <UncontrolledTooltip\n className={`${VideoControls.videoControlsClassName}__fullscreenbtn__tooltip`}\n trigger='hover focus'\n target={this.fullscreenButtonRef}\n >\n {' '}\n {this.props.resources.fullScreenAriaLabel}\n </UncontrolledTooltip>\n <UncontrolledTooltip trigger='hover focus' target={this.exitFullScreenButtonRef}>\n {' '}\n {this.props.resources.exitFullScreenAriaLabel}\n </UncontrolledTooltip>\n </div>\n );\n };\n\n /**\n * Renders the Volume button.\n * @returns Returns the volume button.\n */\n private readonly _renderVolumeButton = (): JSX.Element => {\n this.payLoad.contentAction.etext = this.props.isMuted ? LocalizationConstants.unMuteAriaLabel : LocalizationConstants.muteAriaLabel;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n const volumeButtonProps = {\n className: `${VideoControls.videoControlsClassName}__muteunmutebtn__wrapper`,\n onChange: this.props.onMuteClick,\n toggled: this.props.isMuted,\n onFocus: this.showVolumeControl(),\n onBlur: this._hideVolumeControl,\n onMouseOver: this.showVolumeControl(),\n onMouseOut: this._hideVolumeControl\n };\n\n return (\n <ActionToggle {...volumeButtonProps}>\n <button\n aria-label={this.props.resources.muteAriaLabel}\n ref={this.muteButtonRef}\n className={`${VideoControls.videoControlsClassName}__mutebtn`}\n {...attribute}\n />\n <button\n aria-label={this.props.resources.unMuteAriaLabel}\n ref={this.unMuteButtonRef}\n className={`${VideoControls.videoControlsClassName}__unmutebtn`}\n {...attribute}\n />\n </ActionToggle>\n );\n };\n\n /**\n * Renders the video slider.\n * @returns - Returns the video slider div.\n */\n private readonly _renderVideoSlider = (): JSX.Element => {\n const videoProps: ISliderProps = {\n id: 'VideoSlider',\n inForm: false,\n className: `${VideoControls.videoControlsClassName}__slidercontainer`,\n min: this.props.playPosition.startTime,\n max: this.props.playPosition.endTime,\n ariaLabel: this.props.resources.seekBarLabel,\n fillTrackValue: this.props.playPosition.bufferedDuration,\n step: this.props.videoSeekSteps || 1,\n orientation: 'horizontal',\n showProgressBar: true,\n onChange: this.props.onProgressChange,\n showLabels: false,\n showTooltip: true,\n shouldSliderAdjustToRTL: false,\n handleTooltipText: this._handleProgressToolTipText(this.props.playPosition.currentTime),\n sliderThumbs: [\n {\n id: 'VideoSliderThumb',\n value: this.props.playPosition.currentTime,\n ariaValueText: this.props.playPosition.currentTime.toString(),\n ariaLabel: this.props.resources.sliderThumbLabel\n }\n ]\n };\n\n return <Slider {...videoProps} />;\n };\n\n /**\n * Renders the Volume slider.\n * @returns Returns the Volume Slider.\n */\n private readonly _renderVolumeSlider = (): JSX.Element => {\n const volumeSliderProps: ISliderProps = {\n id: 'VolumeSlider',\n inForm: false,\n className: `${VideoControls.videoControlsClassName}__volumeslider`,\n min: 0,\n max: 100,\n step: this.props.volumeSeekSteps || 5,\n orientation: 'vertical',\n showProgressBar: false,\n onChange: this.props.onVolumeChange,\n onFocus: this.showVolumeControl(),\n onBlur: this._hideVolumeControl,\n showLabels: false,\n showTooltip: true,\n shouldSliderAdjustToRTL: false,\n sliderThumbs: [\n {\n id: 'VolumeSliderThumb',\n value: Math.round(this.props.currentVolume),\n ariaValueText: Math.round(this.props.currentVolume).toString(),\n ariaLabel: this.props.resources.volumeThumbLabel\n }\n ]\n };\n return <Slider {...volumeSliderProps} />;\n };\n\n private _getOffsetPosition(refDiv: React.RefObject<HTMLDivElement>): IOffsetPosition {\n const buttonWidth = refDiv.current!.children[0].clientWidth;\n const elementwidth = refDiv.current!.offsetWidth;\n const offsetLeft = refDiv.current!.offsetLeft + (elementwidth - buttonWidth) / 2;\n const offsetTop = refDiv.current!.offsetTop;\n return {\n offsetLeft,\n offsetTop\n };\n }\n\n private _onClosedCaptionClick(): void {\n this.currentMenu = ButtonMenuTypes.ClosedCaption;\n const offsetLeft = this._getOffsetPosition(this.closedCaptionButtonDiv).offsetLeft;\n this.focusedMenuItemIndex = 0;\n this.selectedMenuItems = [];\n const closedCaptionMenu = this.props.closedCaptionMenu!;\n this._resetFocusForCurrentMenu(closedCaptionMenu);\n closedCaptionMenu.items[this.focusedMenuItemIndex].hasFocus = true;\n this.setState({\n showMenu: this.currentMenu === ButtonMenuTypes.ClosedCaption && !this.state.showMenu,\n menuLeftPosition: offsetLeft - 120,\n currentMenu: closedCaptionMenu\n });\n this._updateSelectedMenu();\n }\n\n private _onOptionsButtonClick(): void {\n this.currentMenu = ButtonMenuTypes.Options;\n const offsetLeft = this._getOffsetPosition(this.optionButtonDiv).offsetLeft;\n this.focusedMenuItemIndex = 0;\n this.selectedMenuItems = [];\n const optionMenu = this.props.optionMenu!;\n this._resetFocusForCurrentMenu(optionMenu);\n optionMenu.items[this.focusedMenuItemIndex].hasFocus = true;\n this.setState({\n showMenu: this.currentMenu === ButtonMenuTypes.Options && !this.state.showMenu,\n menuLeftPosition: offsetLeft - 120,\n currentMenu: optionMenu\n });\n this._updateSelectedMenu();\n }\n\n private _hideVolumeControl(): void {\n window && window.clearTimeout(this.volumeAutoHideTimer);\n this.setState({\n showVolumeSlider: false\n });\n }\n\n /**\n * Handles the progresss tool tip.\n * @param tooltip - Tooltip number.\n * @returns - The elapsed time.\n */\n private readonly _handleProgressToolTipText = (tooltip: number) => () => {\n return this._toElapsedTimeString(tooltip);\n };\n\n private _toElapsedTimeString(seconds: number): string {\n const negative = seconds < 0;\n if (negative) {\n seconds *= -1;\n }\n\n const hours = Math.floor(seconds / 3600);\n const remainder = seconds % 3600;\n const minutes = Math.floor(remainder / 60);\n\n let elapsedTime = '';\n elapsedTime = hours > 0 ? `${hours}:` : '';\n\n seconds = Math.floor(remainder % 60);\n elapsedTime += `${(minutes < 10 ? '0' : '') + minutes.toString()}`;\n elapsedTime += `:${seconds === 0 ? '00' : (seconds < 10 ? '0' : '') + seconds.toString()}`;\n\n return negative ? `-${elapsedTime}` : elapsedTime;\n }\n\n private _applyTooltipClassOnWidthChange(videoControlWidth: number, viewportMax: number): void {\n if (videoControlWidth) {\n this.setState({\n toolTipClass:\n videoControlWidth > this.props.viewportMin! && videoControlWidth < viewportMax\n ? `${VideoControls.videoControlsClassName}__playpausebtn__tooltip`\n : ''\n });\n }\n }\n\n private _isIPhone(): boolean {\n const useragent = window && window.navigator.userAgent;\n return !!useragent.match(/iphone/i);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ninterface CarouselContext {\n direction?: string;\n}\n\n// Create a context wrapping some shared state\nexport default React.createContext<CarouselContext>({\n direction: 'right'\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { mapToCssModules, TransitionStatuses, TransitionTimeouts } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport Transition from 'react-transition-group/Transition';\n\nimport CarouselContext from './CarouselContext';\nimport { ICarouselItemProps } from './CarouselItem.props';\n\nexport interface ICarouselItemState {\n startAnimation: boolean;\n}\n\n/**\n * CarouselItem component.\n */\nexport default class CarouselItem extends React.Component<ICarouselItemProps, ICarouselItemState> {\n public static defaultProps: Partial<ICarouselItemProps> = {\n tag: 'div',\n timeout: TransitionTimeouts.Carousel,\n slide: true\n };\n\n public props: ICarouselItemProps;\n\n public state: ICarouselItemState;\n\n constructor(props: ICarouselItemProps) {\n super(props);\n this.props = props;\n\n this.state = {\n startAnimation: false\n };\n\n this.onEnter = this.onEnter.bind(this);\n this.onEntering = this.onEntering.bind(this);\n this.onExit = this.onExit.bind(this);\n this.onExiting = this.onExiting.bind(this);\n this.onExited = this.onExited.bind(this);\n }\n\n public onEnter = (node: HTMLElement, isAppearing: boolean) => {\n this.setState({ startAnimation: false });\n if (this.props.onEnter) {\n this.props.onEnter(node, isAppearing);\n }\n };\n\n public onEntering = (node: HTMLElement, isAppearing: boolean) => {\n // Getting this variable triggers a reflow\n const offsetHeight = node.offsetHeight;\n this.setState({ startAnimation: true });\n if (this.props.onEntering) {\n this.props.onEntering(node, isAppearing);\n }\n\n return offsetHeight;\n };\n\n public onExit = (node: HTMLElement) => {\n this.setState({ startAnimation: false });\n if (this.props.onExit) {\n this.props.onExit(node);\n }\n };\n\n public onExiting = (node: HTMLElement) => {\n this.setState({ startAnimation: true });\n node.dispatchEvent(new CustomEvent('slide.bs.carousel'));\n if (this.props.onExiting) {\n this.props.onExiting(node);\n }\n };\n\n public onExited = (node: HTMLElement) => {\n node.dispatchEvent(new CustomEvent('slid.bs.carousel'));\n if (this.props.onExited) {\n this.props.onExited(node);\n }\n };\n\n public shouldComponentUpdate(nextProps: ICarouselItemProps): boolean {\n if (nextProps.slide || this.props.slide !== nextProps.slide) {\n return true;\n }\n return false;\n }\n\n public render(): JSX.Element | null {\n const {\n children,\n cssModule,\n slide,\n tag,\n className,\n\n in: collapseIn,\n mountOnEnter,\n unmountOnExit,\n appear,\n enter,\n exit,\n timeout,\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n onExited,\n\n ...otherProps\n } = this.props;\n\n const timeoutOrDefault = timeout || TransitionTimeouts.Carousel;\n const Tag = tag || 'div';\n const transitionProps = {\n in: collapseIn,\n mountOnEnter,\n unmountOnExit,\n appear,\n enter,\n exit,\n timeout: timeoutOrDefault\n };\n\n return (\n <CarouselContext.Consumer>\n {({ direction }) => (\n <Transition\n {...transitionProps}\n enter={slide}\n exit={slide}\n in={collapseIn}\n onEnter={this.onEnter}\n onEntering={this.onEntering}\n onExit={this.onExit}\n onExiting={this.onExiting}\n onExited={this.onExited}\n >\n {(status: TransitionStatuses) => {\n const isActive = status === 'entered' || status === 'exiting';\n const directionClassName =\n (status === 'entering' || status === 'exiting') &&\n this.state.startAnimation &&\n (direction === 'right' ? 'msc-carousel__item__left' : 'msc-carousel__item__right');\n const orderClassName =\n status === 'entering' && (direction === 'right' ? 'msc-carousel__item__next' : 'msc-carousel__item__prev');\n const itemClasses = mapToCssModules(\n classNames(className, 'msc-carousel__item', isActive && 'active', directionClassName, orderClassName),\n cssModule\n );\n\n return (\n <Tag className={itemClasses} {...otherProps}>\n {children}\n </Tag>\n );\n }}\n </Transition>\n )}\n </CarouselContext.Consumer>\n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n IPayLoad,\n mapToCssModules,\n UncontrolledTooltip\n} from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport debounce from 'lodash/debounce';\nimport * as React from 'react';\n\nimport { ICarouselProps } from './Carousel.props';\nimport CarouselContext from './CarouselContext';\nimport CarouselItem from './CarouselItem';\n\nexport interface ICarouselState {\n direction: string;\n indicatorClicked: boolean;\n}\n\nexport type carouselTransition = 'slide' | 'fade';\n\n/**\n * Carousel component.\n */\nexport default class Carousel extends React.Component<ICarouselProps, ICarouselState> {\n public static defaultProps: Partial<ICarouselProps> = {\n interval: 5000,\n pause: 'hover',\n keyboard: true,\n slide: true,\n hideIndicator: false\n };\n\n public props: ICarouselProps;\n\n public state: ICarouselState;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public cycleInterval?: any;\n\n private scrollStart: number | undefined;\n\n private readonly payLoad: IPayLoad;\n\n private readonly scrollThreshold: number;\n\n private readonly linkRefPrev: React.RefObject<HTMLAnchorElement>;\n\n private readonly linkRefNext: React.RefObject<HTMLAnchorElement>;\n\n private readonly directionTextPrev: string = 'prev';\n\n private readonly directionTextNext: string = 'next';\n\n private readonly nextHandleInputThrottledEvent: (event: React.MouseEvent) => void;\n\n private readonly previousHandleInputThrottledEvent: (event: React.MouseEvent) => void;\n\n private readonly defaultThrottleThreshold: number = 200;\n\n private readonly throttleThreshold: number;\n\n constructor(props: ICarouselProps) {\n super(props);\n this.props = props;\n this.throttleThreshold = this.props.threshold || this.defaultThrottleThreshold;\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this._handleTouchStart = this._handleTouchStart.bind(this);\n this._handleTouchEnd = this._handleTouchEnd.bind(this);\n this.renderItems = this.renderItems.bind(this);\n this.hoverStart = this.hoverStart.bind(this);\n this.scrollThreshold = this.props.touchScrollThreshold !== undefined ? this.props.touchScrollThreshold : 100;\n this.state = {\n direction: 'right',\n indicatorClicked: false\n };\n this._onClickPrev = this._onClickPrev.bind(this);\n this._onClickNext = this._onClickNext.bind(this);\n this._handleKeyPressPrev = this._handleKeyPressPrev.bind(this);\n this._handleKeyPressNext = this._handleKeyPressNext.bind(this);\n this.linkRefPrev = React.createRef();\n this.linkRefNext = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n this.nextHandleInputThrottledEvent = debounce(this._onClickNext, this.throttleThreshold);\n this.previousHandleInputThrottledEvent = debounce(this._onClickPrev, this.throttleThreshold);\n }\n\n public componentDidMount(): void {\n // Set up the cycle\n if (this.props.ride === 'carousel') {\n this.setInterval();\n }\n\n if (this.props.keyboard as boolean) {\n document.addEventListener('keyup', this.handleKeyPress);\n }\n }\n\n // eslint-disable-next-line react/no-deprecated\n public componentWillReceiveProps(nextProps: ICarouselProps): void {\n this.setInterval(nextProps);\n\n const { activeIndex } = this.props;\n\n if (activeIndex !== null) {\n // Calculate the direction to turn\n if (activeIndex < nextProps.activeIndex) {\n this.setState({ direction: 'right' });\n } else if (activeIndex > nextProps.activeIndex) {\n this.setState({ direction: 'left' });\n }\n this.setState({ indicatorClicked: false });\n }\n }\n\n public componentWillUnmount(): void {\n this.clearInterval();\n document.removeEventListener('keyup', this.handleKeyPress);\n }\n\n public setInterval = (props: ICarouselProps = this.props) => {\n // Make sure not to have multiple intervals going...\n this.clearInterval();\n\n const { interval, autoplay } = props;\n if (interval && !(autoplay === false)) {\n this.cycleInterval = setInterval(\n () => {\n props.next();\n },\n\n interval\n );\n }\n };\n\n public clearInterval = () => {\n clearInterval(this.cycleInterval);\n };\n\n public hoverStart = (e: React.MouseEvent) => {\n const { pause, mouseEnter } = this.props;\n\n if (pause === 'hover') {\n this.clearInterval();\n }\n\n if (mouseEnter) {\n mouseEnter(e);\n }\n };\n\n public hoverEnd = (e: React.MouseEvent) => {\n const { pause, mouseLeave } = this.props;\n\n if (pause === 'hover') {\n this.setInterval();\n }\n\n if (mouseLeave) {\n mouseLeave(e);\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public handleKeyPress = (e: any) => {\n const { keyboard, previous, next } = this.props;\n\n if (keyboard) {\n if (e.keyCode === 37) {\n previous();\n } else if (e.keyCode === 39) {\n next();\n }\n }\n };\n\n public renderItems = (carouselItems: React.ReactNode[], className: string) => {\n const { slide, handleOnExiting, handleOnExited, activeIndex, keys } = this.props;\n\n const slides = ArrayExtensions.hasElements(carouselItems)\n ? carouselItems.map((slotContent: React.ReactNode, index: number) => {\n return (\n <CarouselItem key={keys ? keys[index] : index} onExiting={handleOnExiting} onExited={handleOnExited}>\n {slotContent}\n </CarouselItem>\n );\n })\n : [];\n\n return (\n <div className={className}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {slides.map((item: any, index: any) => {\n const isIn = index === activeIndex;\n\n return React.cloneElement(item, {\n in: isIn,\n slide\n });\n })}\n </div>\n );\n };\n\n public shouldComponentUpdate(nextProps: ICarouselProps, nextState: ICarouselState): boolean {\n const hasCurrentKeys = ArrayExtensions.hasElements(this.props.keys);\n const hasNextKeys = ArrayExtensions.hasElements(nextProps.keys);\n const isKeyDifferent = hasCurrentKeys && hasNextKeys && !ArrayExtensions.equals(this.props.keys!, nextProps.keys!);\n return (\n this.state !== nextState ||\n this.props.next !== nextProps.next ||\n this.props.previous !== nextProps.previous ||\n hasCurrentKeys !== hasNextKeys ||\n isKeyDifferent\n );\n }\n\n public render(): JSX.Element | null {\n const {\n cssModule,\n className,\n transitionType,\n dismissEnabled,\n hideFlipper,\n showPaginationTooltip,\n items,\n hideIndicator,\n isDisabledFunctionality\n } = this.props;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function carouselClass(transitionTypeValue: any): any {\n switch (transitionTypeValue) {\n case 'slide':\n return 'slide';\n case 'fade':\n return 'carousel-fade';\n default:\n return null;\n }\n }\n\n const showTooltip = showPaginationTooltip !== undefined ? showPaginationTooltip : true;\n\n const outerClasses = mapToCssModules(classNames(className, 'msc-carousel', carouselClass(transitionType)), cssModule);\n const innerClasses = mapToCssModules(classNames('msc-carousel__inner'), cssModule);\n const dismiss = dismissEnabled && this._renderDismissCarousel();\n const indicators = !hideIndicator && this._renderIndicators(showTooltip);\n const carouselControls = !hideFlipper && this._renderCarouselControls(showTooltip);\n const direction = { direction: this.state.direction };\n if (items && items.length) {\n // Rendering indicators, slides and controls\n return (\n <CarouselContext.Provider value={direction}>\n <div\n className={outerClasses}\n onMouseEnter={isDisabledFunctionality ? undefined : this.hoverStart}\n onMouseLeave={isDisabledFunctionality ? undefined : this.hoverEnd}\n onTouchStart={isDisabledFunctionality ? undefined : this._handleTouchStart}\n onTouchEnd={isDisabledFunctionality ? undefined : this._handleTouchEnd}\n >\n {items && items.length && this.renderItems(items, innerClasses)}\n {!isDisabledFunctionality && items && items.length > 1 && carouselControls}\n {!isDisabledFunctionality && items && items.length > 1 && indicators}\n {dismiss}\n </div>\n </CarouselContext.Provider>\n );\n }\n return null;\n }\n\n private _handleTouchStart(evt: React.TouchEvent<HTMLDivElement>): void {\n if (evt.touches.length === 0) {\n this.scrollStart = undefined;\n } else {\n this.scrollStart = evt.touches[0].screenX;\n }\n }\n\n private _handleTouchEnd(evt: React.TouchEvent<HTMLDivElement>): void {\n if (evt.changedTouches.length > 0 && this.scrollStart !== undefined) {\n const { previous, next } = this.props;\n const newTarget: number = evt.changedTouches[0].screenX;\n\n const delta = newTarget - this.scrollStart;\n\n if (delta > this.scrollThreshold) {\n previous();\n }\n\n if (delta < -this.scrollThreshold) {\n next();\n }\n }\n\n this.scrollStart = undefined;\n }\n\n private _renderIndicators(showTooltip: boolean): JSX.Element {\n const { items, activeIndex, cssModule, onIndicatorsClickHandler, indicatorAriaText } = this.props;\n\n const listClasses = mapToCssModules('msc-carousel__indicators', cssModule);\n const indicators =\n items &&\n items.length &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.map((item: any, idx: number) => {\n const indicatorClasses = mapToCssModules(classNames({ active: activeIndex === idx }), cssModule);\n\n const label = indicatorAriaText ? format(indicatorAriaText, idx + 1) : '';\n const indicatorId = 'indicatorSlide' + `${idx + 1}`;\n this.payLoad.contentAction.etext = (idx + 1).toString();\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <>\n <li\n id={indicatorId}\n aria-label={label}\n aria-setsize={items.length}\n aria-posinset={idx + 1}\n aria-selected={activeIndex === idx}\n key={`${item.key || item.src}${item.caption}${item.altText}`}\n role='tab'\n tabIndex={0}\n className={indicatorClasses}\n onClick={e => {\n e.preventDefault();\n onIndicatorsClickHandler(idx);\n this.setState({ indicatorClicked: true });\n }}\n {...attribute}\n />\n {showTooltip && (\n <UncontrolledTooltip trigger='hover focus' target={`${indicatorId}`}>\n {label}\n </UncontrolledTooltip>\n )}\n </>\n );\n });\n\n return (\n <ol className={listClasses} role='tablist'>\n {indicators}\n </ol>\n );\n }\n\n private _renderCarouselControls(showTooltip: boolean): JSX.Element {\n const { cssModule, directionTextPrev, directionTextNext } = this.props;\n\n const anchorClassesPrev = mapToCssModules('msc-carousel__control__prev', cssModule);\n const anchorClassesNext = mapToCssModules('msc-carousel__control__next', cssModule);\n const iconClassesPrev = mapToCssModules('msc-carousel__control__prev__icon', cssModule);\n const iconClassesNext = mapToCssModules('msc-carousel__control__next__icon', cssModule);\n const screenReaderClasses = mapToCssModules('screen-reader-only', cssModule);\n const indexNumber: number = 0;\n this.payLoad.contentAction.etext = this.directionTextPrev;\n const prevAttribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n this.payLoad.contentAction.etext = this.directionTextNext;\n const nextAttribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <>\n <a\n className={anchorClassesPrev}\n role='button'\n tabIndex={indexNumber}\n onClick={this.previousHandleInputThrottledEvent}\n onKeyUp={this._handleKeyPressPrev}\n ref={this.linkRefPrev}\n {...prevAttribute}\n >\n <span className={iconClassesPrev} aria-hidden='true' />\n <span className={screenReaderClasses}>{directionTextPrev || this.directionTextPrev}</span>\n </a>\n {showTooltip && (\n <UncontrolledTooltip trigger='hover focus' target={this.linkRefPrev}>\n {directionTextPrev}\n </UncontrolledTooltip>\n )}\n <a\n className={anchorClassesNext}\n role='button'\n tabIndex={indexNumber}\n onClick={this.nextHandleInputThrottledEvent}\n onKeyUp={this._handleKeyPressNext}\n ref={this.linkRefNext}\n {...nextAttribute}\n >\n <span className={iconClassesNext} aria-hidden='true' />\n <span className={screenReaderClasses}>{directionTextNext || this.directionTextNext}</span>\n </a>\n {showTooltip && (\n <UncontrolledTooltip trigger='hover focus' target={this.linkRefNext}>\n {directionTextNext}\n </UncontrolledTooltip>\n )}\n </>\n );\n }\n\n private _onClickPrev(e: React.MouseEvent): void {\n e.preventDefault();\n this.props.previous();\n }\n\n private _onClickNext(e: React.MouseEvent): void {\n e.preventDefault();\n this.props.next();\n }\n\n private readonly _handleKeyPressPrev = (e: React.KeyboardEvent) => {\n if (e.keyCode === 13) {\n e.preventDefault();\n this.props.previous();\n }\n };\n\n private readonly _handleKeyPressNext = (e: React.KeyboardEvent) => {\n // Handle Enter key\n if (e.keyCode === 13) {\n e.preventDefault();\n this.props.next();\n }\n };\n\n private _renderDismissCarousel(): JSX.Element {\n const { handleDismissCarousel, dismissCarouselAriaText } = this.props;\n return (\n <button className='msc-carousel__dismiss msi msi-times' aria-label={dismissCarouselAriaText} onClick={handleDismissCarousel} />\n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getUrlSync, IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nexport interface ICartIconData {\n cart?: ICartState;\n}\n\nexport interface ICartIconComponentProps extends IComponentProps<ICartIconData> {\n className?: string;\n cartLabel: string;\n cartQtyLabel: string;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ICartIconComponent extends IComponent<ICartIconComponentProps> {}\n\nconst CartIconComponentActions = {};\n\n/**\n *\n * CartIcon component.\n * @extends {React.FC<ICartIconComponentProps>}\n */\nconst CartIcon: React.FC<ICartIconComponentProps> = observer((props: ICartIconComponentProps) => {\n const {\n cartLabel,\n cartQtyLabel,\n data: { cart }\n } = props;\n const cartLink = getUrlSync('cart', props.context.actionContext);\n\n // If there are invoice lines, don't update mini cart item quantity\n const cartItem = cart ? cart.totalItemsInCart : 0;\n const qtyLabel = format(cartQtyLabel, cartItem);\n const label = format(cartLabel, cartItem);\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', props.telemetryContent!, 'cart-icon', '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const style: React.CSSProperties = {\n visibility: cart ? 'visible' : 'hidden'\n };\n return (\n <a\n title={label}\n className='msc-cart-icon msc-btn'\n href={cartLink}\n aria-label={label}\n {...attributes}\n onClick={onTelemetryClick(props.telemetryContent!, payLoad, 'cart-icon')}\n >\n <div className='msc-cart-icon__count' aria-hidden style={style}>\n {qtyLabel}\n </div>\n </a>\n );\n});\n\n// @ts-expect-error\nexport const CartIconComponent: React.FunctionComponent<ICartIconComponentProps> = msdyn365Commerce.createComponent<ICartIconComponent>(\n 'CartIcon',\n { component: CartIcon, ...CartIconComponentActions }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { PriceComponent } from '..';\n\nexport interface IPromoCodeProps extends IComponentProps<{}> {\n cart: ICartState | undefined;\n promoCodeHeadingText: string;\n appliedPromoCodeHeadingText: string;\n removePromoAriaLabelFormat: string;\n promoPlaceholderText: string;\n promoCodeApplyButtonText: string;\n collapseTimeOut: number;\n removePromoText: string;\n invalidPromoCodeErrorText: string;\n failedToAddPromoCodeErrorText: string;\n duplicatePromoCodeErrorText: string;\n failedToRemovePromoCodeErrorText: string;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n promoCodeApplyCallback?(): void;\n}\n\nexport interface IPromoCodeComponent extends IComponent<IPromoCodeProps> {}\n\nconst PromoCodeComponentActions = {};\n\ninterface IPromoCodeState {\n isCollapseOpen: boolean;\n promoCodeInputValue: string;\n error: string;\n canApply: boolean;\n}\n\n/**\n *\n * The PromoCode component renders the promocode section.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass PromoCode extends React.Component<IPromoCodeProps, IPromoCodeState> {\n private readonly payLoad: IPayLoad;\n\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\n this.state = {\n isCollapseOpen: false,\n promoCodeInputValue: '',\n error: '',\n canApply: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IPromoCodeProps): boolean {\n if (this.props.appliedPromoCodeHeadingText !== nextProps.appliedPromoCodeHeadingText) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n return (\n <div>\n <div className='msc-promo-code-heading'>{this.props.promoCodeHeadingText}</div>\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\n <p className={this.state.error ? 'msc-alert-danger' : ''} aria-live='assertive'>\n {this.state.error}\n </p>\n {this._renderAppliedPromoCode(this.props)}\n </div>\n );\n }\n\n private readonly _onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const error = e.target.value === '' ? '' : this.state.error;\n this.setState({\n promoCodeInputValue: e.target.value.trim(),\n error,\n canApply: !!e.target.value\n });\n };\n\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart) {\n return;\n }\n const appliedPromo = this.state.promoCodeInputValue;\n\n cartState\n .addPromoCode({ promoCode: appliedPromo })\n .then(result => {\n if (result.status === 'SUCCESS') {\n // Show success text\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\n } else if (result.substatus === 'ALREADYADDED') {\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\n } else {\n this.setState({ error: this.props.invalidPromoCodeErrorText });\n }\n })\n .catch(error => {\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\n });\n };\n\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\n const _onSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n this._applyPromotion(cartState);\n };\n const _applyPromotion = (event: React.MouseEvent<HTMLElement>) => {\n this._applyPromotion(cartState);\n };\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <form onSubmit={_onSubmit} className='msc-promo-code__form-container'>\n <div className='msc-promo-code__group'>\n <input\n className='msc-promo-code__input-box'\n aria-label={promoPlaceholderText}\n onChange={this._onInputChange}\n value={this.state.promoCodeInputValue}\n placeholder={promoPlaceholderText}\n />\n <Button\n title={promoCodeApplyButtonText}\n className='msc-promo-code__apply-btn btn'\n onClick={_applyPromotion}\n disabled={!this.state.canApply}\n {...attributes}\n >\n {promoCodeApplyButtonText}\n </Button>\n </div>\n </form>\n );\n };\n\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\n if (!cartState) {\n return;\n }\n const code = event.currentTarget.getAttribute('data-value') || '';\n cartState\n .removePromoCodes({\n promoCodes: [code]\n })\n .then(result => {\n if (result.status === 'SUCCESS') {\n this.setState({ error: '' });\n }\n })\n .catch(() => {\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\n });\n };\n\n private readonly _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\n return;\n }\n let discountAmount = 0;\n for (const line of cartState.cart.CartLines) {\n if (line.DiscountLines) {\n for (const discountLine of line.DiscountLines) {\n if (discountLine.DiscountCode === code) {\n discountAmount += discountLine.DiscountCost!;\n }\n }\n }\n }\n return discountAmount * -1;\n };\n\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\n return;\n }\n\n const _removePromotion = (event: React.MouseEvent<HTMLElement>) => {\n this._removePromotion(props.cart, event);\n };\n let totalCouponDiscountAmount = 0;\n for (const coupon of props.cart.cart.Coupons) {\n const discountAmount = this._calculateDiscount(coupon.Code ?? '', props.cart);\n if (discountAmount) {\n totalCouponDiscountAmount += discountAmount;\n }\n }\n\n return (\n <>\n <div className='msc-promo-code__discount'>\n <div className='msc-promo-code__discount-heading'>{this.props.appliedPromoCodeHeadingText}</div>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: totalCouponDiscountAmount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-promo-code__discount-value'\n />\n </div>\n {props.cart.cart.Coupons.map((coupon: Coupon) => {\n const ariaLabel = props.removePromoAriaLabelFormat\n ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code)\n : '';\n\n return (\n <div key={coupon.Code} className='msc-promo-code__line-container'>\n <div className='msc-promo-code__line-value'>\n {coupon.Code}\n {` `}\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: this._calculateDiscount(coupon.Code || '', props.cart)\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-promo-code__line-discount-value'\n />\n </div>\n <Button\n title={props.removePromoText}\n className='msc-promo-code__line__btn-remove'\n onClick={_removePromotion}\n data-value={coupon.Code}\n aria-label={ariaLabel}\n >\n {props.removePromoText}\n </Button>\n </div>\n );\n })}\n </>\n );\n };\n}\n\n// @ts-expect-error\nexport const PromoCodeComponent: React.FunctionComponent<IPromoCodeProps> = msdyn365Commerce.createComponent<IPromoCodeComponent>(\n 'PromoCode',\n { component: PromoCode, ...PromoCodeComponentActions }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport classnames from 'classnames';\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-action-menu';\nconst toggleMenuButtonClassName = `${componentClassName}__action-toggle`;\nconst actionsContainerClassName = `${componentClassName}__actions-container`;\n\n/**\n * IActionMenuComponent interface.\n */\ninterface IActionMenuComponent extends IComponent<IActionMenuProps> {}\n\n/**\n * IActionMenuProps interface.\n */\nexport interface IActionMenuProps extends IComponentProps<{}> {\n className?: string;\n isVisible?: boolean;\n isDisabled?: boolean;\n label?: string;\n ariaLabel?: string;\n title?: string;\n children?: React.ReactNode | React.ReactNode[];\n telemetryAttributes?: { [key: string]: string };\n onClick?: (showActions: boolean) => void;\n}\n\nlet setShowPreviousActions: React.Dispatch<React.SetStateAction<boolean>> | undefined;\n\n/**\n * Menu function.\n * @param isShowActions - Whether actions should be visible or not.\n * @param setShowActions - Function to change the state.\n */\nconst toggle = (isShowActions: boolean, setShowActions: React.Dispatch<React.SetStateAction<boolean>>) => {\n const shouldShowActions = !isShowActions;\n if (shouldShowActions) {\n if (setShowPreviousActions) {\n setShowPreviousActions(false);\n }\n setShowActions(shouldShowActions);\n setShowPreviousActions = setShowActions;\n } else {\n setShowPreviousActions = undefined;\n setShowActions(shouldShowActions);\n }\n};\n\n/**\n * ActionMenu component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst ActionMenuFunctionalComponent: React.FC<IActionMenuProps> = (props: IActionMenuProps) => {\n const [showActions, setShowActions] = React.useState(false);\n\n let children = props.children ?? [];\n children = Array.isArray(children) ? children : [children];\n\n const onClickHandler = (): void => {\n toggle(showActions, setShowActions);\n props.onClick?.(showActions);\n };\n\n const isVisible = props.isVisible ?? true;\n if (!isVisible) {\n return <></>;\n }\n\n return (\n <div className={classnames(props.className, componentClassName)}>\n <Button\n className={classnames(\n toggleMenuButtonClassName,\n showActions ? `${toggleMenuButtonClassName}-active` : '',\n props.isDisabled ? `${toggleMenuButtonClassName}-disabled` : ''\n )}\n title={props.title ?? ''}\n disabled={!!props.isDisabled}\n aria-label={props.ariaLabel ?? props.label ?? ''}\n aria-disabled={!!props.isDisabled}\n onClick={onClickHandler}\n {...props.telemetryAttributes}\n >\n {props.label}\n </Button>\n {showActions && <div className={classnames(actionsContainerClassName)}>{children}</div>}\n </div>\n );\n};\n\n/**\n * ActionMenu component.\n */\nexport const ActionMenuComponent: React.FunctionComponent<IActionMenuProps> = msdyn365Commerce.createComponent<IActionMenuComponent>(\n 'ActionMenuComponent',\n { component: ActionMenuFunctionalComponent }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { AsyncResult, CartLine, CommerceList, Customer, ProductDimension, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n addLinesAsync,\n createCommerceListAsync,\n createGetByCustomerInput,\n removeLinesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { buildWishlistLine, getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as Popper from 'popper.js';\nimport React, { useState } from 'react';\n\nexport interface IAddToWishlistComponentProps extends IComponentProps<IAddtoWishlistData> {\n className?: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n nameOfWishlist: string;\n\n addToWishlistMessage?: string;\n removedFromWishlistMessage?: string;\n addItemToWishlistError?: string;\n removeItemFromWishlistError?: string;\n\n showButtonText?: boolean;\n showButtonTooltip?: boolean;\n tooltipPosition?: Popper.Placement;\n showStatusMessage?: boolean;\n showRemoveButton?: boolean;\n disabled?: boolean;\n cartline?: CartLine;\n canAddMasterProduct?: boolean;\n ariaRole?: string;\n\n getSelectedProduct?: Promise<SimpleProduct | null>;\n\n onSuccess?(result: IWishlistActionSuccessResult, cartline?: CartLine): void;\n onError?(result: IWishlistActionErrorResult): void;\n}\n\nexport interface IWishlistActionSuccessResult {\n status: 'ADDED' | 'REMOVED';\n}\n\nexport interface IWishlistActionErrorResult {\n status: 'FAILED' | 'MISSINGDIMENSION';\n\n missingDimensions?: ProductDimension[];\n}\n\ninterface IAddToWishlistStateManager {\n waiting: boolean;\n canRemove: boolean;\n content: IAddtoWishlistContentState;\n\n setWaiting(newWaiting: boolean): void;\n setContent(newContent: IAddtoWishlistContentState): void;\n setCanRemove(newCanRemove: boolean): void;\n}\n\ninterface IAddtoWishlistContentState {\n showAlert?: boolean;\n wishlistTextMessage?: string;\n color?: string;\n}\n\ninterface IAddtoWishlistData {\n wishlists?: CommerceList[];\n product: SimpleProduct;\n}\n\nexport interface IAddtoWishlistComponent extends IComponent<IAddToWishlistComponentProps> {\n onClick(): (event: React.MouseEvent<HTMLElement>, props: IAddToWishlistComponentProps, state: IAddToWishlistStateManager) => void;\n}\n\nconst onClick = async (\n _event: React.MouseEvent<HTMLElement>,\n props: IAddToWishlistComponentProps,\n state: IAddToWishlistStateManager\n): Promise<void> => {\n const { user } = props.context.request;\n let { product } = props.data;\n\n if (state.waiting) {\n return;\n }\n\n if (!user.isAuthenticated && user.signInUrl && window) {\n window.location.assign(user.signInUrl);\n\n return;\n }\n\n state.setWaiting(true);\n if (!(props.getSelectedProduct === undefined)) {\n product = (await props.getSelectedProduct) || props.data.product;\n }\n\n await (doesProductExistInWishlist(product, props) ? removeFromWishlist(product, props, state) : addToWishlist(product, props, state));\n state.setWaiting(false);\n};\n\nconst onDismiss = (state: IAddToWishlistStateManager): void => {\n state.setContent({ color: 'success', showAlert: false });\n};\n\nconst AddToWishlistComponentActions = {\n onClick,\n onDismiss\n};\n\nconst AddToWishlist: React.FC<IAddToWishlistComponentProps> = (props: IAddToWishlistComponentProps) => {\n const [waiting, setWaiting] = useState(false);\n const [canRemove, setCanRemove] = useState(doesProductExistInWishlist(props.data.product, props));\n const [content, setContent] = useState({});\n const state: IAddToWishlistStateManager = {\n waiting,\n canRemove,\n content,\n\n setWaiting,\n setCanRemove,\n setContent\n };\n\n React.useEffect(() => {\n setCanRemove(doesProductExistInWishlist(props.data.product, props));\n }, [props]);\n\n const {\n removeFromWishlistButtonText,\n addToWishlistButtonText,\n ariaRole,\n showStatusMessage,\n showRemoveButton,\n showButtonText,\n className,\n disabled,\n showButtonTooltip,\n tooltipPosition\n } = props;\n\n const onClickHandler = (event: React.MouseEvent<HTMLElement>) => {\n return AddToWishlistComponentActions.onClick(event, props, state);\n };\n const onDismissHandler = () => {\n AddToWishlistComponentActions.onDismiss(state);\n };\n const ariaLabel = state.canRemove ? removeFromWishlistButtonText : addToWishlistButtonText;\n const addToWishlistRef: React.RefObject<HTMLButtonElement> = React.createRef();\n const removeFromWishlistRef: React.RefObject<HTMLButtonElement> = React.createRef();\n const showMessage = showStatusMessage !== undefined ? showStatusMessage : true;\n const showButton = showRemoveButton !== undefined ? showRemoveButton : true;\n const showTooltip = showButtonTooltip !== undefined ? showButtonTooltip : true;\n const tooltipPos = showButtonTooltip !== undefined ? tooltipPosition : 'right';\n const linkAriaRole = ariaRole !== undefined ? ariaRole : 'link';\n\n if (state.canRemove && !showButton) {\n return null;\n }\n\n return (\n <>\n {showButtonText ? (\n <>\n <button\n className={classnames(\n 'msc-add-to-wishlist',\n className,\n state.waiting ? 'msc-add-to-wishlist__waiting' : '',\n state.canRemove ? 'msc-add-to-wishlist__removing' : ''\n )}\n aria-label={ariaLabel}\n onClick={onClickHandler}\n disabled={disabled}\n ref={addToWishlistRef}\n role={linkAriaRole}\n >\n {ariaLabel}\n </button>\n {showTooltip && (\n <UncontrolledTooltip placement={tooltipPos} trigger='hover focus' target={addToWishlistRef}>\n {ariaLabel}\n </UncontrolledTooltip>\n )}\n </>\n ) : (\n <>\n <button\n className={classnames(\n 'msc-add-to-wishlist',\n className,\n state.waiting ? 'msc-add-to-wishlist__waiting' : '',\n state.canRemove ? 'msc-add-to-wishlist__removing' : ''\n )}\n aria-label={ariaLabel}\n onClick={onClickHandler}\n disabled={disabled}\n ref={removeFromWishlistRef}\n role={linkAriaRole}\n />\n {showTooltip && (\n <UncontrolledTooltip placement={tooltipPos} trigger='hover focus' target={addToWishlistRef}>\n {ariaLabel}\n </UncontrolledTooltip>\n )}\n </>\n )}\n {state.content.showAlert && showMessage ? (\n <div className='ms-wishlist-items__product-status'>\n <Alert color={state.content.color} isOpen={state.content.showAlert} toggle={onDismissHandler}>\n {state.content.wishlistTextMessage}\n </Alert>\n </div>\n ) : (\n ''\n )}\n </>\n );\n};\n\nconst doesProductExistInWishlist = (product: SimpleProduct, props: IAddToWishlistComponentProps): boolean => {\n const { wishlists } = props.data;\n\n if (!wishlists || !wishlists[0]) {\n return false;\n }\n\n const { CommerceListLines } = wishlists[0];\n\n if (!CommerceListLines || CommerceListLines.length === 0) {\n return false;\n }\n\n for (const wishlistItem of CommerceListLines) {\n if (wishlistItem.ProductId === product.RecordId) {\n return true;\n }\n }\n\n return false;\n};\n\nconst propagateSuccess = (props: IAddToWishlistComponentProps, result: IWishlistActionSuccessResult): void => {\n const { onSuccess, cartline } = props;\n\n if (onSuccess) {\n cartline ? onSuccess(result, props.cartline) : onSuccess(result);\n }\n};\n\nconst propagateError = (props: IAddToWishlistComponentProps, result: IWishlistActionErrorResult): void => {\n const { onError } = props;\n\n if (onError) {\n onError(result);\n }\n};\n\nconst addToWishlist = async (\n product: SimpleProduct,\n props: IAddToWishlistComponentProps,\n state: IAddToWishlistStateManager\n): Promise<void> => {\n const { canAddMasterProduct, context } = props;\n\n if (product.Dimensions && !canAddMasterProduct) {\n const missingDimensions = product.Dimensions.filter(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value));\n\n if (missingDimensions.length > 0) {\n // At least one dimension with no value exists on the product, won't be able to add to cart\n propagateError(props, { status: 'MISSINGDIMENSION', missingDimensions });\n\n return AsyncResult.resolve();\n }\n }\n\n if (context.request.user.isAuthenticated) {\n if (!props.data.wishlists || props.data.wishlists.length === 0) {\n const wishlistName = props.nameOfWishlist;\n const customer = await getCustomerAccount(props);\n if (customer && customer.AccountNumber) {\n const listData: CommerceList = {\n CustomerId: customer.AccountNumber,\n Name: wishlistName,\n\n // This is the type value specifically for a wishlist\n CommerceListTypeValue: 1,\n Id: 0\n };\n\n try {\n const commerceList = await createCommerceListAsync({ callerContext: context.actionContext }, listData);\n return callAddWishlistLine(props, state, commerceList.Id, product.RecordId);\n } catch (error) {\n if (context.telemetry) {\n context.telemetry.warning(error);\n context.telemetry.debug('Unable to create a wishlist');\n }\n propagateError(props, { status: 'FAILED' });\n }\n } else {\n context.telemetry.debug('Customer account number missing');\n }\n } else {\n return callAddWishlistLine(props, state, props.data.wishlists[0].Id, product.RecordId);\n }\n }\n\n return AsyncResult.resolve();\n};\n\nconst callAddWishlistLine = async (\n props: IAddToWishlistComponentProps,\n state: IAddToWishlistStateManager,\n wishlistId: number,\n productId: number\n): Promise<void> => {\n const { context } = props;\n\n try {\n const customer = await getCustomerAccount(props);\n if (customer && customer.AccountNumber) {\n const createdCommerceList = await addLinesAsync({ callerContext: context.actionContext }, wishlistId, [\n buildWishlistLine(productId, customer.AccountNumber, wishlistId)\n ]);\n context.actionContext.update(createGetByCustomerInput({}, null), [createdCommerceList]);\n if (context.telemetry) {\n context.telemetry.debug(`Added item to the wishlist ${createdCommerceList}`);\n }\n state.setCanRemove(true);\n state.setContent({\n color: 'success',\n showAlert: true,\n wishlistTextMessage: props.addToWishlistMessage ? props.addToWishlistMessage : 'Added to your wishlist'\n });\n propagateSuccess(props, { status: 'ADDED' });\n } else {\n context.telemetry.debug('Customer Account number missing');\n }\n } catch (error) {\n if (context.telemetry) {\n context.telemetry.warning(error);\n context.telemetry.debug(`Unable to add item to wishlist ${error}`);\n }\n\n state.setContent({\n color: 'danger',\n showAlert: true,\n wishlistTextMessage: props.addItemToWishlistError\n });\n propagateError(props, { status: 'FAILED' });\n }\n};\n\nconst removeFromWishlist = async (\n product: SimpleProduct,\n props: IAddToWishlistComponentProps,\n state: IAddToWishlistStateManager\n): Promise<void> => {\n const { context, data, removedFromWishlistMessage, removeItemFromWishlistError } = props;\n const { wishlists } = data;\n const { actionContext, telemetry } = context;\n\n // TODO Please fix customeraccount number null once Bug https://msdyneng.visualstudio.com/FinOps/_workitems/edit/481375 gets fixed.\n if (context.request.user.isAuthenticated) {\n if (wishlists && wishlists[0]) {\n const wishlistLine = wishlists[0].CommerceListLines!.find(line => line.ProductId === product.RecordId);\n\n if (wishlistLine) {\n try {\n const customer = await getCustomerAccount(props);\n const commerceList = await removeLinesAsync({ callerContext: actionContext }, wishlists[0].Id, [wishlistLine]);\n if (customer) {\n context.actionContext.update(createGetByCustomerInput({}, null), [commerceList]);\n } else {\n telemetry.debug('Customer Account Number missing');\n }\n\n if (telemetry) {\n telemetry.debug(`[WishlistButton] ${product.RecordId} removed from Wishlist ${commerceList.Id}`);\n }\n state.setCanRemove(false);\n state.setContent({\n color: 'success',\n showAlert: true,\n wishlistTextMessage: removedFromWishlistMessage ? removedFromWishlistMessage : 'Removed item from the wishlist'\n });\n propagateSuccess(props, { status: 'REMOVED' });\n } catch (error) {\n if (telemetry) {\n telemetry.warning(error);\n telemetry.debug('[WishlistButton] Error removing item from the wishlist');\n }\n\n state.setContent({\n color: 'danger',\n wishlistTextMessage: removeItemFromWishlistError\n });\n propagateError(props, { status: 'FAILED' });\n }\n }\n } else if (telemetry) {\n telemetry.debug(\"[WishlistButton] Can't remove from wishlist since no wishlist exisits OR there is no product data\");\n }\n }\n\n return AsyncResult.resolve();\n};\n\nconst getCustomerAccount = (props: IAddToWishlistComponentProps): AsyncResult<Customer> => {\n const { context } = props;\n const customerInput = new GetCustomerInput(context.actionContext.requestContext.apiSettings);\n return getCustomer(customerInput, context.actionContext);\n};\n\nexport const AddToWishlistComponent: React.FunctionComponent<IAddToWishlistComponentProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error\n IAddtoWishlistComponent\n>('AddToWishlist', { component: AddToWishlist, ...AddToWishlistComponentActions });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, SalesLine } from '@msdyn365-commerce/retail-proxy';\nimport { debounce } from 'lodash';\nimport { IPriceEditorResources, PriceEditor } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * Resources for the cart line price editor.\n */\nexport interface ICartLinePriceEditorResources extends IPriceEditorResources {}\n\n/**\n * The props required to render the component.\n */\nexport interface ICartLinePriceEditorProps {\n className: string;\n context: ICoreContext;\n\n resources: ICartLinePriceEditorResources;\n\n cartLine: CartLine | SalesLine;\n cartState: ICartState;\n}\n\n/**\n * The props required to render the component.\n */\nexport interface ICartLinePriceEditorState {\n currentValue: number;\n}\n\n/**\n * Quantity Component - This component is used to allow input of quantity between a\n * range of values.\n */\nexport class CartLinePriceEditor extends React.PureComponent<ICartLinePriceEditorProps, ICartLinePriceEditorState> {\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n private readonly waitTime: number = 500;\n\n public constructor(props: ICartLinePriceEditorProps) {\n super(props);\n }\n\n public render(): JSX.Element {\n const minimumPrice = 0.01;\n\n return (\n <PriceEditor\n className={this.props.className}\n resources={this.props.resources}\n defaultAmount={this.props.cartLine.Price!}\n maximumValue={this.props.cartLine.InvoiceAmount}\n minimumValue={minimumPrice}\n handleChange={this._handleChange}\n />\n );\n }\n\n /**\n * Handles updates of the input and updates the cart line amount.\n * @param newValue - New entered price for the cart line.\n */\n private readonly _handleChange = async (newValue: number) => {\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n this.cancellabelDebounce = debounce(async () => {\n await this.props.cartState.setInvoiceLinePrice({ cartLineId: this.props.cartLine.LineId ?? null, price: newValue });\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, {\n IComponentProps,\n IGridSettings,\n IImageSettings,\n Image,\n isChannelTypeB2B,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { CartLine, ProductCatalog, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n ArrayExtensions,\n getFallbackImageUrl,\n ObjectExtensions,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { PriceComponent } from '../price';\nimport { CartLinePriceEditor, ICartLinePriceEditorResources } from './components';\n\n/**\n * ICartlineResourceString: Interface for specifying the\n * resource strings that the component needs.\n */\nexport interface ICartlineResourceString {\n /**\n * Display string for discount label.\n */\n discountStringText: string;\n\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n\n /**\n * Display string for quantity label.\n */\n quantityDisplayString: string;\n\n /**\n * Display string for quantity label.\n */\n inputQuantityAriaLabel: string;\n\n /**\n * Aria label for the decrement button in quantity component.\n */\n decrementButtonAriaLabel?: string;\n\n /**\n * Aria label for the increment button in quantity component.\n */\n incrementButtonAriaLabel?: string;\n\n /**\n * Original text screen reader.\n */\n originalPriceText: string;\n\n /**\n * Current text screen reader.\n */\n currentPriceText: string;\n\n /**\n * Shipping Charges Text.\n */\n shippingChargesText: string;\n\n priceEditorResources?: ICartLinePriceEditorResources;\n\n /**\n * Sales agreement price prompt text.\n */\n salesAgreementPricePrompt?: string;\n\n /**\n * Shipping text.\n */\n shippingText?: string;\n\n /**\n * Shipping text.\n */\n confirmedShipDateLabel?: string;\n\n /**\n * Request Delivery text.\n */\n requestDeliveryDateLabel?: string;\n}\n\n/**\n * The data about the cart line and products.\n */\nexport interface ICartLineData {\n cartLine: CartLine | SalesLine;\n cartState?: ICartState;\n product?: SimpleProduct;\n catalogs?: ProductCatalog[];\n}\n\nexport type CartLineDisplayMode = 'DEFAULT' | 'COMPACT';\n\n/**\n * ICartLineProps: The props required to render cartLineitem.\n */\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\n /**\n * The flag to change the quantity component from interactivity to static.\n */\n disableQuantityInteractivity?: boolean;\n\n /**\n * The primary image url.\n */\n primaryImageUrl?: string;\n\n /**\n * The product url.\n */\n productUrl?: string;\n\n /**\n * GridSettings for the product image in cartLine.\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartLine.\n */\n imageSettings: IImageSettings;\n\n /**\n * Boolean flag to indicate if the item is out of stock.\n */\n isOutOfStock?: boolean;\n\n /**\n * Flag to make quantity section editable.\n */\n isQuantityEditable?: boolean;\n\n /**\n * Max quantity for line item.\n */\n maxQuantity?: number;\n\n /**\n * Current quantity for line item.\n */\n currentQuantity?: number;\n\n /**\n * Resource string for the component.\n */\n resources: ICartlineResourceString;\n\n /**\n * SalesLine flag.\n */\n isSalesLine?: boolean;\n\n /**\n * Error message to show in place of quantity.\n */\n errorMessage?: string;\n\n /**\n * Display mode to use.\n */\n displayMode?: CartLineDisplayMode;\n\n /**\n * Inventory information label.\n */\n inventoryInformationLabel?: string;\n\n /**\n * Inventory information class name.\n */\n inventoryLabelClassName?: string;\n\n /**\n * Flag to show/hide shipping charges for line items.\n */\n showShippingChargesForLineItems?: boolean;\n\n /**\n * Boolean flag to indicate if cart state status is ready.\n */\n isCartStateReady?: boolean;\n\n /**\n * Chanel Delivery Option configuration is from api.\n */\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n /**\n * The telemetry content.\n */\n telemetryContent?: ITelemetryContent;\n\n /**\n * The cart line index.\n */\n lineIndex?: number;\n\n /**\n * The cart line delivery location.\n */\n deliveryLocation?: string;\n\n /**\n * Quantity onChange callback.\n */\n quantityOnChange?(cartLine: CartLine, newQuantity: number, lineIndex?: number): void;\n priceCurrency?: string;\n\n /**\n * Sales line confirmed ship date.\n */\n confirmedShipDate?: string;\n\n /**\n * Sales line request delivery date.\n */\n requestDeliveryDate?: string;\n}\n\ninterface IDimensionStrings {\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n}\n\nconst CartLineItemFunctions = {\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\n if (!Product || !Product.Dimensions) {\n return [];\n }\n\n return Product.Dimensions.map(productDimension => {\n if (productDimension.DimensionTypeValue === 1) {\n return (\n <div key={`${Product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-color'>\n {DimensionStrings.colorString}\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 2) {\n return (\n <div key={`${Product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-configuration'>\n {DimensionStrings.configString}\n <span className='name'>{productDimension.DimensionValue?.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 3) {\n return (\n <div key={`${Product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-size'>\n {DimensionStrings.sizeString}\n <span className='name'>{productDimension.DimensionValue?.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 4) {\n return (\n <div key={`${Product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-style'>\n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}\n <span className='name'>{productDimension.DimensionValue?.Value}</span>\n </span>\n </div>\n );\n }\n return null;\n });\n },\n renderDiscountLines: (props: ICartLineProps) => {\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\n return null;\n }\n\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n return (\n <div key={discountLine.OfferId || index} className='msc-cart-line-item-product-discount'>\n <span className='msc-cart-line__product-savings-label'>\n {discountLine.OfferName ? discountLine.OfferName : ''}:{` ${props.resources.discountStringText || 'Discount'} `}\n </span>\n <span className='msc-cart-line__promo-codes'>\n {discountLine.DiscountCost && (\n <>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n CustomerContextualPrice: (props.data.cartLine as SalesLine).PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: props.data.cartLine.DiscountAmount,\n BasePrice: props.data.cartLine.DiscountAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__discount-value'\n currencyCode={props.priceCurrency}\n />\n </>\n )}\n </span>\n <span>{` (${discountLine.EffectivePercentage !== undefined ? discountLine.EffectivePercentage : ''}%)`}</span>\n </div>\n );\n });\n },\n renderInventoryLabel: (props: ICartLineProps) => {\n if (!props.inventoryInformationLabel) {\n return null;\n }\n const inventoryCssName = props.inventoryLabelClassName\n ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`\n : 'msc-cart-line__product-inventory-label';\n return <span className={inventoryCssName}>{props.inventoryInformationLabel}</span>;\n },\n\n /**\n * Gets the react node for product unit of measure display.\n * @param props - ICartLineProps props.\n * @returns The node representing markup for unit of measure component.\n */\n renderUnitOfMeasure: (props: ICartLineProps) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (\n props.context.app.config &&\n (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none')\n ) {\n return undefined;\n }\n\n const product = props.data.product;\n if (!product || !product.DefaultUnitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-cartline__product-unit-of-measure'>\n <span>{product.DefaultUnitOfMeasure}</span>\n </div>\n );\n },\n renderShippingLabel: (props: ICartLineProps) => {\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\n const cartline = props.data.cartLine;\n let hasShippingMethod = false;\n if (channelDeliveryOptionConfig !== undefined) {\n hasShippingMethod = !!(\n cartline.DeliveryMode &&\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode)\n );\n } else {\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\n }\n if (!hasShippingMethod) {\n return undefined;\n }\n\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\n\n if (shippingChargeLines.length === 0) {\n return undefined;\n }\n\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\n }, 0);\n\n const priceComponent = (\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: freightFee\n }\n }}\n freePriceText='Free'\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__freight-actual'\n currencyCode={props.priceCurrency}\n />\n );\n return (\n <>\n <label className='msc-cart-line__freight-label'>{`${props.resources.shippingChargesText}:`}</label>\n <span className='shipping-value'>{priceComponent}</span>\n </>\n );\n },\n renderOtherCharges: (props: ICartLineProps) => {\n const cartline = props.data.cartLine;\n const otherCharges = cartline.ChargeLines?.filter(chargeline => !chargeline.IsShipping);\n\n return (\n (otherCharges &&\n otherCharges.map((otherCharge, key) => {\n return otherCharge && otherCharge.CalculatedAmount ? (\n <div className='msc-cart-line__other-charges' key={key}>\n <label className='msc-cart-line__other-charges-label'>{`${otherCharge.Description}:`}</label>\n <span className='other-charge-value'>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: otherCharge.CalculatedAmount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__other-charges-actual'\n currencyCode={props.priceCurrency}\n />\n </span>\n </div>\n ) : (\n ''\n );\n })) ||\n undefined\n );\n },\n\n /**\n * Render the sales agreement prompt.\n * @param props - The ICartLineProps.\n * @returns The JSX.Element.\n */\n renderSalesAgreementPrompt: (props: ICartLineProps): JSX.Element | null => {\n if (props.data.cartLine.SalesAgreementLineRecordId === 0) {\n return null;\n }\n return <div className='msc-cart-line__sales-agreement-prompt'>{props.resources.salesAgreementPricePrompt}</div>;\n },\n\n renderConfirmedShipDate: (props: ICartLineProps) => {\n if (!props.isSalesLine || props.confirmedShipDate === undefined || StringExtensions.isNullOrEmpty(props.confirmedShipDate)) {\n return null;\n }\n const shipDateCssName = 'msc-cart-line__confirmed-ship-date';\n return (\n <>\n <span className={shipDateCssName}>{props.resources.confirmedShipDateLabel}</span>\n <span className={shipDateCssName}>{props.confirmedShipDate}</span>\n </>\n );\n },\n\n renderRequestDeliveryDate: (props: ICartLineProps) => {\n if (!props.isSalesLine || props.requestDeliveryDate === undefined || StringExtensions.isNullOrEmpty(props.requestDeliveryDate)) {\n return null;\n }\n const reqDateCssName = 'msc-cart-line__request-delivery-date';\n return (\n <>\n <span className={reqDateCssName}>{props.resources.requestDeliveryDateLabel}</span>\n <span className={reqDateCssName}>{props.requestDeliveryDate}</span>\n </>\n );\n }\n};\n\n/**\n * Renders catalog label for the cart line.\n * @param props - Cart line props.\n * @returns Catalog label.\n */\nconst CatalogLabelComponent: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const catalogId = props.data.cartLine.CatalogId;\n validateCatalogId(catalogId);\n\n if (!isChannelTypeB2B(props.context.actionContext.requestContext) || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\n return null;\n }\n\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\n\n if (!catalog || !catalog.Name) {\n return null;\n }\n\n return <div className='msc-cart-line__catalog-label'>{catalog.Name}</div>;\n};\n\n// eslint-disable-next-line no-redeclare\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const { isSalesLine, productUrl, resources } = props;\n const { product, cartLine } = props.data;\n\n const destructDimensionStrings = {\n sizeString: resources.sizeString,\n colorString: resources.colorString,\n styleString: resources.styleString,\n configString: resources.configString,\n amountString: resources.amountString\n };\n const fallbackImageUrl =\n product &&\n getFallbackImageUrl(\n product.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.app?.config?.OmniChannelMedia\n );\n const imageSettings = props.imageSettings;\n imageSettings.cropFocalRegion = !ObjectExtensions.isNullOrUndefined(imageSettings);\n const { inputQuantityAriaLabel } = props.resources;\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n const renderDiscountLines = CartLineItemFunctions.renderDiscountLines(props);\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\n const renderUnitOfMeasure = CartLineItemFunctions.renderUnitOfMeasure(props);\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\n const renderConfirmedShipDate = CartLineItemFunctions.renderConfirmedShipDate(props);\n const renderSalesAgreementPrompt = CartLineItemFunctions.renderSalesAgreementPrompt(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\n const prodAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const productName = product?.Name || cartLine.Description;\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\n\n const _generateErrorMessage = (): JSX.Element | null => {\n if (props.errorMessage) {\n return (\n <div className='msc-cart-line__error-message msc-alert__header'>\n <span className='msi-exclamation-triangle' />\n <span>{props.errorMessage}</span>\n </div>\n );\n }\n\n return null;\n };\n\n const _updateQuantity = (event: React.ChangeEvent<HTMLSelectElement>) => {\n if (props.quantityOnChange) {\n props.quantityOnChange(props.data.cartLine, Number.parseInt(event.target.value, 10), props.lineIndex);\n }\n };\n\n const _generateMenu = (quantity: number) => {\n const nodes = [];\n\n for (let i = 1; i <= quantity; i++) {\n nodes.push(\n <option className='msc-cart-line__quantity__select-menu__item' value={i}>\n {i}\n </option>\n );\n }\n\n return nodes;\n };\n\n const _generateSelectMenu = (quantity: number, currentQuantity: number | undefined): JSX.Element => {\n return (\n <select\n className='msc-cart-line__quantity__select-menu'\n aria-label={inputQuantityAriaLabel}\n value={currentQuantity}\n onChange={_updateQuantity}\n >\n {_generateMenu(quantity)}\n </select>\n );\n };\n\n const _generateQuantityAndPrice = (): JSX.Element[] | null => {\n const nodes = [];\n\n if (props.isOutOfStock) {\n return null;\n }\n\n // No quantity selector for invoice line\n if (!props.data.cartLine.IsInvoiceLine) {\n if (props.isQuantityEditable && !props.data.product?.IsGiftCard) {\n nodes.push(_generateSelectMenu(props.maxQuantity || 10, props.currentQuantity));\n } else {\n nodes.push(\n <div className={classNames('msc-cart-line__quantity', { 'single-quantity': props.data.cartLine.Quantity === 1 })}>\n <label className='quantity-label'>{resources.quantityDisplayString}</label>\n <span className='quantity-value'>{props.data.cartLine.Quantity}</span>\n </div>\n );\n }\n }\n\n nodes.push(\n <div className='msc-cart-line__product-price'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\n BasePrice: (props.data.cartLine as SalesLine).GrossAmount\n }\n }\n : {\n price: {\n CustomerContextualPrice: (props.data.cartLine as CartLine).ExtendedPrice,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='discount-value'\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n salesAgreementLineId={props.data.cartLine.SalesAgreementLineRecordId}\n currencyCode={props.priceCurrency}\n />\n </div>\n );\n\n return nodes;\n };\n\n if (props.displayMode === 'COMPACT') {\n const reducedDimensions: string = product?.Dimensions\n ? product.Dimensions.reduce<string>((str, productDimension) => {\n if (productDimension.DimensionValue?.Value) {\n if (str) {\n return `${str}, ${productDimension.DimensionValue.Value}`;\n }\n\n return `${productDimension.DimensionValue.Value}`;\n }\n\n return str;\n }, '')\n : '';\n\n return (\n <div className='msc-cart-line msc-cart-line__compact'>\n <div className={imgeClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n src={props.primaryImageUrl ?? 'empty'}\n fallBackSrc={fallbackImageUrl}\n altText={productName}\n gridSettings={props.gridSettings}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n <div className='msc-cart-line__content'>\n {MsDyn365.isBrowser ? (\n <a className='msc-cart-line__product-title' {...prodAttribute} href={productUrl} key={productUrl}>\n {productName}\n </a>\n ) : null}\n {reducedDimensions !== '' ? <div className='msc-cart-line__product-variants'>{reducedDimensions}</div> : ''}\n {renderUnitOfMeasure}\n {_generateQuantityAndPrice()}\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\n <CartLinePriceEditor\n className='msc-cart-line__price-editor-container'\n context={props.context}\n resources={props.resources.priceEditorResources}\n cartState={props.data.cartState}\n cartLine={props.data.cartLine}\n />\n )}\n </div>\n {_generateErrorMessage()}\n </div>\n );\n }\n\n return (\n <>\n <div className='msc-cart-line'>\n <div className={imgeClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n src={props.primaryImageUrl ?? ''}\n fallBackSrc={fallbackImageUrl}\n altText={productName}\n gridSettings={props.gridSettings}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n <div className='msc-cart-line__content'>\n <div className='msc-cart-line__product'>\n <CatalogLabelComponent {...props} />\n {MsDyn365.isBrowser ? (\n <a className='msc-cart-line__product-title' {...prodAttribute} href={productUrl} key={productUrl}>\n {productName}\n </a>\n ) : null}\n {ArrayExtensions.hasElements(productDimensions) ? (\n <div className='msc-cart-line__product-variants'>{productDimensions}</div>\n ) : (\n ''\n )}\n {renderUnitOfMeasure}\n {renderDiscountLines}\n {renderInventoryLabel}\n {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>{renderShippingLabel}</div>}\n {renderOtherCharges}\n {renderConfirmedShipDate}\n {renderSalesAgreementPrompt}\n </div>\n {_generateQuantityAndPrice()}\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\n <CartLinePriceEditor\n className='msc-cart-line__price-editor-container'\n context={props.context}\n resources={props.resources.priceEditorResources}\n cartState={props.data.cartState}\n cartLine={props.data.cartLine}\n />\n )}\n </div>\n </div>\n {_generateErrorMessage()}\n </>\n );\n};\n\n// @ts-expect-error\nexport const CartLineItemComponent: React.FunctionComponent<ICartLineProps> = msdyn365Commerce.createComponent<ICartline>('CartLineItem', {\n component: CartLine,\n ...CartLineItemFunctions\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\nimport { ISwatchItem, SwatchComponent } from '../../product-dimension';\n\n/**\n * Props for product component swatch.\n */\nexport interface IProductComponentSwatchProps {\n context: ICoreContext;\n swatches: ISwatchItem[];\n dimensionType?: string;\n onSelectDimension(coreContext: ICoreContext, swatchItem: ISwatchItem, dimensionType?: string): void;\n}\n\n/**\n * Swatch for the product component.\n * @param props - Swatch props.\n * @returns React element.\n */\nexport const ProductComponentSwatchComponent: React.FC<IProductComponentSwatchProps> = (props: IProductComponentSwatchProps) => {\n const { context, dimensionType, swatches, onSelectDimension } = props;\n\n const onSelectItem = React.useCallback(\n (item: ISwatchItem) => {\n onSelectDimension(context, item, dimensionType);\n },\n [onSelectDimension, context, dimensionType]\n );\n if (ArrayExtensions.hasElements(swatches)) {\n return <SwatchComponent apiSettings={context.request.apiSettings} list={swatches} onSelectItem={onSelectItem} />;\n }\n\n return <div className='msc-swatch-empty' />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n getCatalogId,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGridSettings,\n IImageData,\n IImageProps,\n IImageSettings,\n Image,\n IRequestContext,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport {\n AttributeSwatch,\n ProductDimension,\n ProductPrice,\n ProductSearchResult,\n ProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n checkIfShouldDisplayAsSwatch,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionSwatchDisplayTypes,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { IPriceComponentResources, PriceComponent } from '../price/price.components';\nimport { ISwatchItem } from '../product-dimension';\nimport { RatingComponent } from '../rating/rating.component';\nimport { ProductComponentSwatchComponent } from './components';\n\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult; productPrice?: ProductPrice }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n inventoryLabel?: string;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\n\nconst PriceComponentActions = {};\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: ProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\nconst ProductCard: React.FC<IProductComponentProps> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n inventoryLabel,\n isPriceMinMaxEnabled,\n priceResources,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n const productPrice = data.productPrice;\n const dimensionContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = dimensionContext.app.config.dimensionToPreSelectInProductCard;\n\n /**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n }\n\n /**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default swatch selected if any.\n */\n function getDefaultSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\n if (!productData || !productData.AttributeValues) {\n return null;\n }\n\n const attributeSwatches = productData.AttributeValues.find(\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\n )?.Swatches;\n\n if (!ArrayExtensions.hasElements(attributeSwatches)) {\n return null;\n }\n\n const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[0];\n return defaultSwatch;\n }\n\n /**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\n function getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(productData);\n const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\n if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\n return productData?.PrimaryImageUrl;\n }\n\n return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\n }\n\n /**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\n function getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: ProductSearchResult\n ): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(productData);\n if (!defaultSwatch?.SwatchValue) {\n return productUrl;\n }\n\n const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\n const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n }\n\n let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\n if (allowBack && productUrl) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === dimensionToPreSelectInProductCard) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n const swatchItems = ArrayExtensions.validValues(\n product.AttributeValues?.map(item => {\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(\n dimensionTypeValue as DimensionTypes,\n context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n );\n if (!shouldDisplayAsSwatch) {\n return null;\n }\n\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.Swatches?.map<ISwatchItem>(swatchItem => {\n return {\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\n value: swatchItem.SwatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.SwatchColorHexCode,\n imageUrl: swatchItem.SwatchImageUrl,\n productImageUrls: swatchItem.ProductImageUrls,\n isDefault: swatchItem.IsDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionType === dimensionToPreSelectInProductCard &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault)\n ) {\n swatches[0].isDefault = true;\n }\n return { recordId: item.RecordId, swatches };\n })\n );\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n /**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n <div className='msc-product__unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n }\n\n /**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n <div className='msc-product__availability'>\n <span>{inventoryAvailabilityLabel}</span>\n </div>\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(): JSX.Element | null {\n if (!ArrayExtensions.hasElements(swatchItems)) {\n return null;\n }\n\n return (\n <div className='msc-product__dimensions'>\n {swatchItems.map(item => {\n return (\n <ProductComponentSwatchComponent\n key={item.recordId}\n context={context}\n onSelectDimension={updatePageAndImageUrl}\n swatches={item.swatches}\n />\n );\n })}\n </div>\n );\n }\n\n /**\n * Gets the react node for product description.\n * @param quickview - Quick view node.\n * @param item - Product id to de displayed in quickview.\n * @returns The product quickview component.\n */\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\n return {\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n DimensionValue: {\n RecordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n /**\n * Gets the aria label for rating.\n * @param rating - Product rating.\n * @param ratingAriaLabelText - Aria label format for rating.\n * @returns The product rating aria label string.\n */\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\n if (rating && ratingAriaLabelText) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabelText || '', roundedRating, '5');\n }\n return '';\n }\n\n /**\n * Gets the aria label for review count.\n * @param reviewCount - Product review count.\n * @param ratingCountAriaLabelText - Aria label format for review.\n * @returns The product review count aria label string.\n */\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n }\n\n /**\n * Gets the aria label string for product that includes product name with its price and rating.\n * @param name - Product name.\n * @param price - Product price.\n * @param rating - Product rating.\n * @param ratingAriaLabelText - Rating aria label text.\n * @param reviewCount - Product review count.\n * @param ratingCountAriaLabelText - Number of ratings.\n * @returns The aria label string for the product card.\n */\n function renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string,\n availability?: string\n ): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n } ${availability ?? ''}`;\n }\n\n /**\n * Gets the react component for product rating.\n * @param productCardimageSettings - Module image settings for product card.\n * @param gridSettings - Grid settings defined in theme.\n * @param imageUrl - Image url.\n * @param fallbackImageUrl - Fallback url for imge.\n * @param altText - Image Alt text.\n * @param requestContext - Request context using the component.\n * @returns React component for product image.\n */\n function renderProductPlacementImage(\n productCardimageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n requestContext?: IRequestContext\n ): JSX.Element | null {\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = context.app.config.placeholderImageName as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const image: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps: IImageProps = { gridSettings };\n\n imageProps.gridSettings = gridSettings;\n imageProps.imageSettings = productCardimageSettings;\n imageProps.imageSettings.cropFocalRegion = true;\n return <Image {...image} {...imageProps} loadFailureBehavior='empty' requestContext={requestContext} bypassHideOnFailure />;\n }\n\n /**\n * Gets the react component for product rating.\n * @param coreContext - Context of the module using the component.\n * @param moduleTypeName - Module type name.\n * @param moduleId - Module id using the component.\n * @param productSearchResult - Product search result.\n * @param savingsPriceResourceText - Product price saving text.\n * @param freePriceResourceText - Product price free text.\n * @param originalPriceResourceText - Product price original text.\n * @param currentPriceResourceText - Product price current text.\n * @param productPrice - Product Price.\n * @returns React component for Product price.\n */\n function renderPrice(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n productSearchResult: ProductSearchResult,\n savingsPriceResourceText?: string,\n freePriceResourceText?: string,\n originalPriceResourceText?: string,\n currentPriceResourceText?: string,\n productPrice?: ProductPrice\n ): JSX.Element {\n const product: SimpleProduct = {\n // This is a fake product. The product type is only used for price component to determine if it should show price range or not.\n ProductTypeValue: productSearchResult.IsMasterProduct ? ProductType.Master : ProductType.Standalone\n } as SimpleProduct;\n\n const price: ProductPrice =\n productPrice ??\n ({\n BasePrice: productSearchResult.BasePrice,\n AdjustedPrice: productSearchResult.Price,\n CustomerContextualPrice: productSearchResult.Price,\n // TODO from [gaweiche]: We should not put productSearchResult.Price into min/max price.\n // To minimize the change in a backport PR, I'll keep it as is for now.\n MaxVariantPrice: productSearchResult.MaxVariantPrice ? productSearchResult.MaxVariantPrice : productSearchResult.Price,\n MinVariantPrice: productSearchResult.MinVariantPrice ? productSearchResult.MinVariantPrice : productSearchResult.Price\n } as ProductPrice);\n\n return (\n <PriceComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n product={product}\n data={{ price }}\n savingsText={savingsPriceResourceText}\n freePriceText={freePriceResourceText}\n originalPriceText={originalPriceResourceText}\n currentPriceText={currentPriceResourceText}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n />\n );\n }\n\n /**\n * Gets the react node for product description.\n * @param description - Product description.\n * @returns The product description component.\n */\n function renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-product__text'>{description}</p>;\n }\n\n /**\n * Gets the react component for product rating.\n * @param coreContext - Context of the module using the component.\n * @param moduleTypeName - Module type name.\n * @param moduleId - Module id using the component.\n * @param avgRating - Average rating.\n * @param totalRatings - Total rating.\n * @param ariaLabel - Aria label for rating.\n * @returns React component for Product rating.\n */\n function renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string\n ): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n <RatingComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabelText}\n ratingCountAriaLabel={ratingCountAriaLabelText}\n data={{}}\n />\n );\n }\n\n return (\n <>\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(\n product.Name,\n context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating,\n ratingAriaLabel,\n product.TotalRatings,\n ratingCountAriaLabel,\n inventoryLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context.actionContext.requestContext\n )}\n </div>\n <h2 className='msc-product__title'>{product.Name}</h2>\n </a>\n {renderProductDimensions()}\n <div className='msc-product__details'>\n {renderPrice(context, typeName, id, product, savingsText, freePriceText, originalPriceText, currentPriceText, productPrice)}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n {renderDescription(product.Description)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n </div>\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n </>\n );\n};\n\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponent<IProductComponent>(\n 'Product',\n { component: ProductCard, ...PriceComponentActions }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IDropdownItemProps, IDropdownProps } from './dropdown.props';\n\ninterface IDropdownState {\n /**\n * @friendlyName selectedIndex\n * @description selected index\n */\n selectedIndex: string;\n}\n\n/**\n *\n * DropDown component\n * @extends {React.PureComponent<IDropdownProps, IDropdownState>}\n */\nexport class Dropdown extends React.PureComponent<IDropdownProps, IDropdownState> {\n private readonly selectMenu: React.RefObject<HTMLSelectElement> = React.createRef<HTMLSelectElement>();\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IDropdownProps) {\n super(props);\n\n if (this.props.onInitialize) {\n this.props.onInitialize({\n initializedDimension: this.props.dropdownId\n });\n }\n\n const selectedItem = this.props.dropdownList.find(item => item.isDefault);\n if (selectedItem) {\n this.state = {\n selectedIndex: selectedItem.id.toString()\n };\n if (this.props.onChange) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Update for default.\n this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: selectedItem.id,\n selectedValue: selectedItem.value\n });\n }\n } else {\n this.state = {\n selectedIndex: ''\n };\n }\n this.payLoad = getPayloadObject('click', props.telemetryContent!, this.props.dropdownName);\n }\n\n public render(): JSX.Element {\n const { dropdownId, dropdownList, dropdownName, dropdownToggleName } = this.props;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <select\n id={`msc-dropdown__entry-${dropdownId}`}\n ref={this.selectMenu}\n aria-label={dropdownName}\n className='msc-dropdown__select'\n onChange={this._onChanged}\n {...attribute}\n >\n <option value='' aria-selected={this.state.selectedIndex === ''} selected={this.state.selectedIndex === ''} hidden disabled>\n {dropdownToggleName}\n </option>\n {dropdownList.map((item: IDropdownItemProps) => (\n <option\n value={item.id}\n key={item.id}\n selected={this.state.selectedIndex === item.id.toString()}\n aria-selected={this.state.selectedIndex === item.id.toString()}\n className={item.isDisabled ? 'msc-dropdown__select__disabled' : undefined}\n >\n {item.value}\n </option>\n ))}\n </select>\n );\n }\n\n private readonly _onChanged = async (event: React.ChangeEvent<HTMLSelectElement>) => {\n this.setState({ selectedIndex: event.target.value });\n\n if (this.props.onChange) {\n await this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: event.target.value,\n selectedValue: event.target.innerText\n });\n }\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { Dropdown, IDropdownItemProps, IDropdownOnInitializeNotification, IDropdownOnSelectionChangeNotification } from './dropdown';\nimport {\n IErrorState,\n IProductDimensionCallbacks,\n IProductDimensionConfigureDropdownViewProps,\n IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps\n} from './product-dimension-interface';\n\nlet telemetryContent: ITelemetryContent;\n\n// Quantity on change.\nconst onChange = async (\n notification: IDropdownOnSelectionChangeNotification,\n dimensionChanged: (newValue: number, selectedDimensionValue: string) => Promise<void>\n): Promise<void> => {\n await dimensionChanged(+notification.dropdownId, notification.selectId);\n};\n\nconst _onInitializedDimension = (\n notification: IDropdownOnInitializeNotification,\n initializeDimension?: (initializedDimension: string) => void\n): void => {\n if (initializeDimension) {\n initializeDimension(notification.initializedDimension);\n }\n};\n\n// This method will map all product dimension to correct value and returns respective dropdown.\nconst mapProductDimensionFullToDropdownViewProps = (\n productDimensionFull: ProductDimensionFull,\n moduleName: string,\n selectDimensionFormatString: string,\n resources: IProductDimensionConfigureResources,\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources) => string,\n dropdownCallback: (notification: IDropdownOnSelectionChangeNotification) => Promise<void>,\n onInitializedDimension: (notification: IDropdownOnInitializeNotification) => void,\n configureErrors?: { [configureId: string]: string | undefined }\n): IProductDimensionConfigureDropdownViewProps => {\n const dropdownName = getDropdownName(productDimensionFull.DimensionTypeValue, resources);\n const dropdownId = productDimensionFull.DimensionTypeValue.toString();\n const dropdownToggleName = selectDimensionFormatString.replace('{0}', dropdownName.toLocaleLowerCase());\n const dropdownList: IDropdownItemProps[] = productDimensionFull.DimensionValues\n ? productDimensionFull.DimensionValues.map<IDropdownItemProps>(dM => {\n return { value: dM.Value || '', id: dM.RecordId.toString() };\n })\n : [];\n const errorMessage = configureErrors ? configureErrors[dropdownId] : '';\n\n return {\n containerProps: {\n className: `${moduleName}__dropdown`\n },\n labelContainerProps: {\n tag: 'label',\n className: `${moduleName}__dropdown-quantity-label`,\n htmlFor: `${moduleName}__dropown-quantity-input-${dropdownId}`\n },\n errors: errorMessage && (\n <span className='msc-alert msc-alert-noborder msc-alert-danger'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n <span>{errorMessage}</span>\n </span>\n ),\n heading: <div>{dropdownName}</div>,\n select: (\n <Dropdown\n dropdownId={dropdownId}\n dropdownName={dropdownName}\n dropdownToggleName={dropdownToggleName}\n dropdownList={dropdownList}\n onChange={dropdownCallback}\n onInitialize={onInitializedDimension}\n telemetryContent={telemetryContent}\n />\n )\n };\n};\n\nexport const getProductConfigure = (\n moduleName: string,\n context: ICoreContext,\n pageName: string,\n telemetry: ITelemetry,\n selectDimensionFormatString: string,\n resources: IProductDimensionConfigureResources,\n callbacks: IProductDimensionCallbacks,\n product?: SimpleProduct,\n productDimensions?: ProductDimensionFull[],\n configureErrors?: IErrorState\n): IProductDimensionConfigureViewProps | undefined => {\n const { getDropdownName } = callbacks;\n\n if (!product || !productDimensions) {\n return undefined;\n }\n\n const onChanged = async (notification: IDropdownOnSelectionChangeNotification) =>\n onChange(notification, callbacks.dimensionSelectedAsync);\n\n const onInitializedDimension = async (notification: IDropdownOnInitializeNotification) =>\n _onInitializedDimension(notification, callbacks.initializeDimension);\n\n telemetryContent = getTelemetryObject(context.request.telemetryPageName!, pageName, telemetry);\n\n if (!ArrayExtensions.hasElements(productDimensions)) {\n return undefined;\n }\n\n const dropdowns = productDimensions.map((productDimensionFull: ProductDimensionFull) =>\n mapProductDimensionFullToDropdownViewProps(\n productDimensionFull,\n moduleName,\n selectDimensionFormatString,\n resources,\n getDropdownName,\n onChanged,\n onInitializedDimension,\n configureErrors?.configureErrors\n )\n );\n\n return {\n containerProps: {\n className: `${moduleName}__configure`\n },\n dropdowns\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\nimport { DimensionTypes, generateSwatchImageUrl, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\n/**\n * Swatch item data.\n */\nexport interface ISwatchItem {\n value: string;\n itemId: string;\n dimensionType: DimensionTypes;\n colorHexCode?: string;\n imageUrl?: string;\n productImageUrls?: string[];\n isDisabled?: boolean;\n isDefault?: boolean;\n swatchItemAriaLabel?: string;\n}\n\n/**\n * Swatch item configuration.\n */\nexport interface ISwatchItemProps {\n className: string;\n apiSettings: ICommerceApiSettings;\n\n isSelected: boolean;\n isSelectionEnabled?: boolean;\n\n item: ISwatchItem;\n isRefineItem?: boolean;\n\n onSelectItem(item: ISwatchItem): void;\n}\n\n/**\n * Represents a single item for swatch.\n * @param props - Item configuration.\n * @returns React node.\n */\nexport const SwatchItemComponent: React.FC<ISwatchItemProps> = (props: ISwatchItemProps) => {\n const { isSelected, className, onSelectItem, item } = props;\n const { itemId, value, colorHexCode, imageUrl, swatchItemAriaLabel, dimensionType } = item;\n\n const style: React.CSSProperties = {};\n\n let isColored = false;\n\n const hasColor = !StringExtensions.isNullOrWhitespace(colorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(imageUrl);\n\n const selectItem = React.useCallback(() => {\n onSelectItem(item);\n }, [onSelectItem, item]);\n\n const selectionHandler = props.isSelectionEnabled ? selectItem : undefined;\n\n if (hasImage) {\n const fullImageUrl = generateSwatchImageUrl(imageUrl!, props.apiSettings);\n return (\n <img\n key={`${itemId}-${item.isDisabled ? 'disabled' : 'enabled'}`}\n src={fullImageUrl}\n className={classnames(\n className,\n `${className}-${itemId}`,\n `${className}__image`,\n isSelected ? `${className}__selected` : `${className}__unselected`,\n item.isDisabled ? `${className}__disabled` : undefined\n )}\n style={style}\n onClick={selectionHandler}\n onKeyPress={selectionHandler}\n title={value}\n aria-label={value}\n alt={value}\n />\n );\n } else if (hasColor) {\n style.backgroundColor = colorHexCode;\n isColored = true;\n }\n\n const shouldDisplayText = !isColored;\n\n return (\n <button\n role='radio'\n key={`${itemId}-${item.isDisabled ? 'disabled' : 'enabled'}`}\n className={classnames(\n className,\n `${className}-${itemId}`,\n isSelected ? `${className}__selected` : `${className}__unselected`,\n isColored ? `${className}__colored` : `${className}__uncolored`,\n item.isDisabled ? `${className}__disabled` : undefined\n )}\n style={style}\n onClick={selectionHandler}\n onKeyPress={selectionHandler}\n title={value}\n {...(swatchItemAriaLabel ? { 'aria-label': format(swatchItemAriaLabel, dimensionType, value) } : null)}\n {...(props.isRefineItem ? { tabIndex: 0 } : null)}\n aria-checked={isSelected}\n >\n {shouldDisplayText && value}\n </button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ISwatchItem, SwatchItemComponent } from './swatch-item';\n\n/**\n * Swatch item configuration.\n */\nexport interface ISwatchProps {\n className?: string;\n apiSettings: ICommerceApiSettings;\n\n list: ISwatchItem[];\n isSelectionEnabled?: boolean;\n isRefineItem?: boolean;\n\n onSelectItem?(item: ISwatchItem): void;\n}\n\n/**\n * Represents a single item for swatch.\n * @param props - Item configuration.\n * @returns React node.\n */\nexport const SwatchComponent: React.FC<ISwatchProps> = (props: ISwatchProps) => {\n const containerClassName = 'msc-swatch-container';\n\n const [selectedItemId, setSelectedItemId] = React.useState<string | undefined>(undefined);\n const [didUserSetAnyItem, setDidUserSetAnyItem] = React.useState<boolean>(false);\n\n const isSelectionEnabled = props.isSelectionEnabled ?? true;\n\n const onSelectItemCallback = props.onSelectItem;\n\n const onSelectItem = React.useCallback(\n (item: ISwatchItem) => {\n setSelectedItemId(item.itemId);\n if (!ObjectExtensions.isNullOrUndefined(onSelectItemCallback)) {\n onSelectItemCallback(item);\n }\n setDidUserSetAnyItem(true);\n },\n [setSelectedItemId, onSelectItemCallback]\n );\n\n if (!didUserSetAnyItem) {\n const defaultItem = props.list.find(item => item.isDefault);\n if (defaultItem && defaultItem.itemId !== selectedItemId) {\n setSelectedItemId(defaultItem.itemId);\n if (!ObjectExtensions.isNullOrUndefined(onSelectItemCallback)) {\n onSelectItemCallback(defaultItem);\n }\n }\n }\n return (\n <div\n role='radiogroup'\n className={classnames(containerClassName, props.className)}\n {...(props.isRefineItem ? { 'aria-hidden': true } : null)}\n >\n {props.list.map(item => {\n const itemId = item.itemId;\n const isSelected = selectedItemId === itemId;\n\n return (\n <SwatchItemComponent\n key={`${itemId}-${item.isDisabled ? 'disabled' : 'enabled'}`}\n className={`${containerClassName}__item`}\n item={item}\n onSelectItem={onSelectItem}\n isSelected={isSelected}\n apiSettings={props.apiSettings}\n isSelectionEnabled={isSelectionEnabled}\n isRefineItem={props.isRefineItem}\n />\n );\n })}\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\nimport { ISwatchItem, SwatchComponent } from '../../product-dimension';\n\n/**\n * Props for product component swatch.\n */\nexport interface IProductComponentV2SwatchProps {\n context: ICoreContext;\n swatches: ISwatchItem[];\n dimensionType?: string;\n onSelectDimension(coreContext: ICoreContext, swatchItem: ISwatchItem, dimensionType?: string): void;\n}\n\n/**\n * Swatch for the product component.\n * @param props - Swatch props.\n * @returns React element.\n */\nexport const ProductComponentV2SwatchComponent: React.FC<IProductComponentV2SwatchProps> = (props: IProductComponentV2SwatchProps) => {\n const { context, dimensionType, swatches, onSelectDimension } = props;\n\n const onSelectItem = React.useCallback(\n (item: ISwatchItem) => {\n onSelectDimension(context, item, dimensionType);\n },\n [onSelectDimension, context, dimensionType]\n );\n\n if (ArrayExtensions.hasElements(swatches)) {\n return <SwatchComponent apiSettings={context.request.apiSettings} list={swatches} onSelectItem={onSelectItem} />;\n }\n\n return <div className='msc-swatch-empty' />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\nimport { generateSwatchImageUrl, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\n/**\n * Dimension item data.\n */\nexport interface IProductDimensionsMatrixDimensionItemData {\n value: string;\n itemId: string;\n colorHexCode?: string;\n imageUrl?: string;\n}\n\n/**\n * Swatch item configuration.\n */\nexport interface IProductDimensionsMatrixDimensionItemProps {\n className: string;\n apiSettings: ICommerceApiSettings;\n\n item: IProductDimensionsMatrixDimensionItemData;\n}\n\n/**\n * Represents a single item for the dimension.\n * @param props - Item configuration.\n * @returns React node.\n */\nexport const ProductDimensionsMatrixDimensionItemComponent: React.FC<IProductDimensionsMatrixDimensionItemProps> = (\n props: IProductDimensionsMatrixDimensionItemProps\n) => {\n const { className, item } = props;\n const { itemId, value, colorHexCode, imageUrl } = item;\n\n const style: React.CSSProperties = {};\n\n const hasColor = !StringExtensions.isNullOrWhitespace(colorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(imageUrl);\n\n let swatchContent: React.ReactElement | undefined;\n const swatchContainerClassName = 'msc-swatch-container';\n const swatchContentClassName = `${swatchContainerClassName}__item`;\n if (hasColor) {\n style.backgroundColor = colorHexCode;\n swatchContent = (\n <span\n key={itemId}\n className={classnames(swatchContentClassName, `${swatchContentClassName}__colored`)}\n style={style}\n title={value}\n aria-label={value}\n />\n );\n } else if (hasImage) {\n const fullImageUrl = generateSwatchImageUrl(imageUrl!, props.apiSettings);\n swatchContent = (\n <img\n key={itemId}\n src={fullImageUrl}\n className={classnames(swatchContentClassName, `${swatchContentClassName}__image`)}\n style={style}\n title={value}\n aria-label={value}\n alt={value}\n />\n );\n }\n\n return (\n <span className={classnames(className, `${className}-${itemId}`)}>\n {swatchContent && <span className={swatchContainerClassName}>{swatchContent}</span>}\n <span className={`${className}__value`}>{value}</span>\n </span>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionType } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Popover } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Resources for the product dimensions matrix dimension selection component.\n */\nexport interface IProductDimensionsMatrixDimensionSelectionResources {\n productDimensionTypeColor: string;\n productDimensionTypeConfiguration: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n}\n\n/**\n * Props for the product dimensions matrix dimension selection component.\n */\nexport interface IProductDimensionsMatrixDimensionSelectionProps {\n className: string;\n\n resources: IProductDimensionsMatrixDimensionSelectionResources;\n\n dimensionTypes: number[];\n currentDimensionType: number;\n\n onDimensionTypeChange(previousDimensionType: number, newDimensionType: number): void;\n}\n\n/**\n * Retrieves dimension localized name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources to use to retrieve localized text.\n * @returns Localized dimension name.\n */\nexport const getDimensionName = (dimensionType: number, resources: IProductDimensionsMatrixDimensionSelectionResources): string => {\n switch (dimensionType) {\n case ProductDimensionType.Color:\n return resources.productDimensionTypeColor;\n case ProductDimensionType.Configuration:\n return resources.productDimensionTypeConfiguration;\n case ProductDimensionType.Size:\n return resources.productDimensionTypeSize;\n case ProductDimensionType.Style:\n return resources.productDimensionTypeStyle;\n default:\n return '';\n }\n};\n\n/**\n * Props for the dimension item component.\n */\ninterface IProductDimensionsMatrixDimensionItemProps {\n className: string;\n\n resources: IProductDimensionsMatrixDimensionSelectionResources;\n\n dimensionType: number;\n\n onDimensionTypeSelect(dimensionType: number): void;\n}\n\n/**\n * Dimension item component which represents a single dimension from the list of dimensions.\n * @param props - Component props.\n * @returns React node.\n */\nconst ProductDimensionsMatrixDimensionItemComponent: React.FC<IProductDimensionsMatrixDimensionItemProps> = (\n props: IProductDimensionsMatrixDimensionItemProps\n) => {\n const changeCurrentDimension = React.useCallback(() => {\n props.onDimensionTypeSelect(props.dimensionType);\n }, [props]);\n\n const title = getDimensionName(props.dimensionType, props.resources);\n return (\n <Button key={props.dimensionType} className={props.className} title={title} onClick={changeCurrentDimension}>\n {title}\n </Button>\n );\n};\n\n/**\n * Dimension selection component for product dimensions matrix.\n * @param props - Component props.\n * @returns React node.\n */\nexport const ProductDimensionsMatrixDimensionSelectionComponent: React.FC<IProductDimensionsMatrixDimensionSelectionProps> = (\n props: IProductDimensionsMatrixDimensionSelectionProps\n) => {\n const buttonTogglingReference = React.createRef<HTMLButtonElement>();\n const [isPopoverShown, setIsPopoverShown] = React.useState(false);\n const [currentDimensionType, setCurrentDimensionType] = React.useState(props.currentDimensionType);\n const [currentDimensionTypeLabel, setCurrentDimensionTypeLabel] = React.useState(\n getDimensionName(props.currentDimensionType, props.resources)\n );\n\n const popoverClassName = `${props.className}__popover`;\n\n const togglePopoverHandler = React.useCallback(() => {\n setIsPopoverShown(!isPopoverShown);\n }, [isPopoverShown]);\n\n const changeCurrentDimension = React.useCallback(\n (dimensionType: number) => {\n props.onDimensionTypeChange(currentDimensionType, dimensionType);\n setCurrentDimensionType(dimensionType);\n setCurrentDimensionTypeLabel(getDimensionName(dimensionType, props.resources));\n },\n [currentDimensionType, props]\n );\n\n return (\n <div className={props.className}>\n <Button\n className={`${props.className}__toggle-button`}\n title={currentDimensionTypeLabel}\n innerRef={buttonTogglingReference}\n aria-expanded={isPopoverShown}\n aria-describedby={props.className}\n onClick={togglePopoverHandler}\n >\n {currentDimensionTypeLabel}\n </Button>\n <Popover\n className={popoverClassName}\n placement='bottom-start'\n isOpen={isPopoverShown}\n target={buttonTogglingReference}\n toggle={togglePopoverHandler}\n >\n <div className={`${popoverClassName}__content`}>\n {props.dimensionTypes.map(dimensionType => {\n return (\n <ProductDimensionsMatrixDimensionItemComponent\n key={dimensionType}\n className={`${popoverClassName}__content__item`}\n resources={props.resources}\n dimensionType={dimensionType}\n onDimensionTypeSelect={changeCurrentDimension}\n />\n );\n })}\n </div>\n </Popover>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, IncrementalQuantity, Popover } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Resources for the enter all quantities component.\n */\nexport interface IProductDimensionsMatrixEnterAllQuantitiesResources {\n productDimensionsMatrixInputQuantityAriaLabel: string;\n productDimensionsMatrixEnterAllQuantitiesButtonText: string;\n productDimensionsMatrixEnterAllQuantitiesDecrementButtonAriaLabel: string;\n productDimensionsMatrixEnterAllQuantitiesIncrementButtonAriaLabel: string;\n productDimensionsMatrixEnterAllQuantitiesQuantityText: string;\n productDimensionsMatrixEnterAllQuantitiesEachText: string;\n productDimensionsMatrixEnterAllQuantitiesApplyToAllText: string;\n}\n\n/**\n * Props for the enter all quantities component.\n */\nexport interface IProductDimensionsMatrixEnterAllQuantitiesProps {\n className: string;\n\n resources: IProductDimensionsMatrixEnterAllQuantitiesResources;\n\n defaultQuantity: number;\n minQuantityValue: number;\n maxQuantityValue: number;\n\n onApplyToAll(newQuantity: number): void;\n}\n\n/**\n * Popover content for the enter all quantities component.\n * @param props - Enter all quantities component props.\n * @returns React node with the content to be used in the popover.\n */\nconst ProductDimensionsMatrixEnterAllQuantitiesPopoverContentComponent: React.FC<IProductDimensionsMatrixEnterAllQuantitiesProps> = (\n props: IProductDimensionsMatrixEnterAllQuantitiesProps\n) => {\n const [currentQuantity, setCurrentQuantity] = React.useState(props.defaultQuantity);\n\n const handleQuantityChange = React.useCallback(\n (newQuantity?: number) => {\n setCurrentQuantity(newQuantity ?? props.defaultQuantity);\n return true;\n },\n [props.defaultQuantity]\n );\n\n const handleApplyAll = React.useCallback(() => {\n props.onApplyToAll(currentQuantity);\n return true;\n }, [props, currentQuantity]);\n\n return (\n <div className={props.className}>\n <div className={`${props.className}__quantity-label`}>\n {props.resources.productDimensionsMatrixEnterAllQuantitiesQuantityText}\n </div>\n <IncrementalQuantity\n currentCount={props.defaultQuantity}\n onChange={handleQuantityChange}\n inputQuantityAriaLabel={props.resources.productDimensionsMatrixInputQuantityAriaLabel}\n min={props.minQuantityValue}\n max={props.maxQuantityValue}\n decrementButtonAriaLabel={props.resources.productDimensionsMatrixEnterAllQuantitiesDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.productDimensionsMatrixEnterAllQuantitiesIncrementButtonAriaLabel}\n />\n <div className={`${props.className}__button-label`}>{props.resources.productDimensionsMatrixEnterAllQuantitiesEachText}</div>\n <div className={`${props.className}__apply-to-all-container`}>\n <Button\n className={`${props.className}__apply-to-all-container__button`}\n title={props.resources.productDimensionsMatrixEnterAllQuantitiesApplyToAllText}\n onClick={handleApplyAll}\n >\n {props.resources.productDimensionsMatrixEnterAllQuantitiesApplyToAllText}\n </Button>\n </div>\n </div>\n );\n};\n\n/**\n * Enter all quantities component to update all quantities in the product dimensions matrix.\n * @param props - Enter all quantities component props.\n * @returns React node.\n */\nexport const ProductDimensionsMatrixEnterAllQuantitiesComponent: React.FC<IProductDimensionsMatrixEnterAllQuantitiesProps> = (\n props: IProductDimensionsMatrixEnterAllQuantitiesProps\n) => {\n const buttonTogglingReference = React.createRef<HTMLButtonElement>();\n const [isPopoverShown, setIsPopoverShown] = React.useState(false);\n\n const popoverClassName = `${props.className}__popover`;\n\n const togglePopoverHandler = React.useCallback(() => {\n setIsPopoverShown(!isPopoverShown);\n }, [isPopoverShown]);\n\n const handleApplyAll = React.useCallback(\n (currentQuantity: number) => {\n setIsPopoverShown(false);\n props.onApplyToAll(currentQuantity);\n },\n [props]\n );\n\n return (\n <div className={props.className}>\n <Button\n className={`${props.className}__toggle-button`}\n title={props.resources.productDimensionsMatrixEnterAllQuantitiesButtonText}\n innerRef={buttonTogglingReference}\n aria-expanded={isPopoverShown}\n aria-describedby={props.className}\n onClick={togglePopoverHandler}\n >\n {props.resources.productDimensionsMatrixEnterAllQuantitiesButtonText}\n </Button>\n <Popover\n className={popoverClassName}\n placement='bottom-start'\n isOpen={isPopoverShown}\n target={buttonTogglingReference}\n toggle={togglePopoverHandler}\n >\n <ProductDimensionsMatrixEnterAllQuantitiesPopoverContentComponent\n {...props}\n className={`${popoverClassName}__content`}\n onApplyToAll={handleApplyAll}\n />\n </Popover>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\nimport msdyn365Commerce, { getUrlSync, ICoreContext } from '@msdyn365-commerce/core-internal';\nimport {\n Customer,\n InventoryAvailabilitySearchCriteria,\n ProductDimensionValueInventoryAvailability,\n ProductInventoryAvailability,\n ProductsDataActions\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DeliveryMode,\n Dictionary,\n getInventoryLevelCodeFromDimensionValue,\n getInventoryLevelCodeFromProductAvailability,\n IDimensionsApp,\n IDimensionsConfig,\n InventoryLevels,\n InventoryLevelValues,\n ObjectExtensions,\n OrderTemplate\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n Collapse,\n ILabeledDropdownOnChangeNotification,\n isMobile,\n LabeledDropdown,\n Quantity,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { AddToCartFunctionalComponent, IAddToCartResources } from '../add-to-cart';\nimport { AddProductsToOrderTemplateComponent, IAddProductsToOrderTemplateResources } from '../order-template';\nimport {\n getDimensionName,\n IProductDimensionsMatrixDimensionSelectionResources,\n IProductDimensionsMatrixEnterAllQuantitiesResources,\n ProductDimensionsMatrixDimensionItemComponent,\n ProductDimensionsMatrixDimensionSelectionComponent,\n ProductDimensionsMatrixEnterAllQuantitiesComponent\n} from './components';\n\n/**\n * Resources for the product dimensions matrix component.\n */\nexport interface IProductDimensionsMatrixResources\n extends IProductDimensionsMatrixEnterAllQuantitiesResources,\n IProductDimensionsMatrixDimensionSelectionResources,\n IAddProductsToOrderTemplateResources,\n IAddToCartResources {\n productDimensionsMatrixInputQuantityAriaLabel: string;\n productDimensionsMatrixTotalItemsLabel: string;\n productDimensionsMatrixOutOfStockLabel: string;\n productDimensionsMatrixClearAllText: string;\n productDimensionsMatrixAddItemsToCartButtonText: string;\n\n productDimensionsMatrixDisplayOrderLabel: string;\n productDimensionsMatrixDisplayOrderSeparator: string;\n}\n\n/**\n * Data for the product dimensions matrix component.\n */\nexport interface IProductDimensionsMatrixData {\n dimensions: IProductDimensionsWithAvailabilitiesFull[];\n orderTemplates?: OrderTemplate[];\n customerInformation?: Customer;\n}\n\n/**\n * Props for the product dimensions matrix component.\n */\nexport interface IProductDimensionsMatrixProps {\n className?: string;\n context: ICoreContext<IDimensionsApp>;\n\n data: IProductDimensionsMatrixData;\n\n resources: IProductDimensionsMatrixResources;\n\n onErrorMessage(result: string): void;\n dimensionOnChange?(): void;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n catalogId?: number | undefined;\n}\n\n/**\n * Represents a single node (cell data) in the matrix.\n */\nexport interface IProductDimensionsMatrixNode {\n dimensionIds: string[];\n\n isAvailable: boolean;\n\n quantity: number;\n\n productId?: number;\n}\n\n/**\n * State of the matrix.\n */\nexport interface IProductDimensionsMatrixState {\n dimensionsOrder: IProductDimensionsWithAvailabilitiesFull[];\n nodes: IProductDimensionsMatrixNode[];\n\n lastChangeAllDate: number;\n\n totalQuantity: number;\n\n dimensionsExpandState: Dictionary<string, boolean>;\n dimensionsExpandStateDate: number;\n}\n\n/**\n * Retrieves unique dimension id from the dimension data.\n * @param dimension - Dimension data.\n * @returns Unique id that represents the given dimension.\n */\nconst getDimensionId = (dimension: ProductDimensionValueInventoryAvailability) => {\n return `${dimension.DimensionTypeValue ?? ''}-${dimension.DimensionValue?.RecordId ?? ''}-${dimension.DimensionValue?.Value ?? ''}`;\n};\n\n/**\n * Retrieves dimension inventory level code.\n * @param dimensionId - Dimension id for which the code needs to be retrieved.\n * @param dimensions - List of the dimensions with the data.\n * @param inventoryLevel - Inventory level configuration.\n * @returns Inventory level code, for instance, available or out of stock.\n */\nconst retrieveDimensionInventoryLevelCode = (\n dimensionId: string,\n dimensions: ProductDimensionValueInventoryAvailability[],\n inventoryLevel?: InventoryLevels\n) => {\n const dimension = dimensions.find(item => getDimensionId(item) === dimensionId)!;\n return getInventoryLevelCodeFromDimensionValue(dimension, inventoryLevel);\n};\n\n/**\n * Checks whether the given dimension is available for purchase or not.\n * @param dimensionId - Dimension id for which the availability needs to be retrieved.\n * @param dimensions - List of the dimensions with the data.\n * @param config - Inventory configuration.\n * @returns True if the dimension is available, false otherwise.\n */\nexport const isDimensionAvailable = (\n dimensionId: string,\n dimensions: ProductDimensionValueInventoryAvailability[],\n config: IDimensionsConfig\n) => {\n const enableStockCheck = config.enableStockCheck;\n if (!enableStockCheck) {\n return true;\n }\n return retrieveDimensionInventoryLevelCode(dimensionId, dimensions, config.inventoryLevel) !== InventoryLevelValues.outOfStock;\n};\n\n/**\n * Checks whether the given product is available for purchase or not.\n * @param productAvailability - Product availability information.\n * @param inventoryLevel - Inventory level configuration.\n * @returns True if the product is available, false otherwise.\n */\nconst isProductAvailable = (productAvailability: ProductInventoryAvailability, inventoryLevel?: InventoryLevels) => {\n return getInventoryLevelCodeFromProductAvailability(productAvailability, inventoryLevel) !== InventoryLevelValues.outOfStock;\n};\n\n/**\n * Recursively builds matrix nodes based on the given dimensions data.\n * @param dimensionIds - Matrix of dimension ids for each dimension type.\n * @param dimensions - List of the dimensions with the data.\n * @param config - Inventory configuration.\n * @param defaultQuantity - Default quantity to use.\n * @returns List of created nodes.\n */\nconst retrieveEndDimensionsNode = (\n dimensionIds: string[][],\n dimensions: ProductDimensionValueInventoryAvailability[],\n config: IDimensionsConfig,\n defaultQuantity: number\n): IProductDimensionsMatrixNode[] => {\n if (!ArrayExtensions.hasElements(dimensionIds)) {\n return [];\n }\n\n if (dimensionIds.length === 1) {\n return dimensionIds[0].map(dimensionId => {\n const isAvailable = isDimensionAvailable(dimensionId, dimensions, config);\n return {\n dimensionIds: [dimensionId],\n isAvailable,\n quantity: isAvailable ? defaultQuantity : 0\n };\n });\n }\n\n const nodes = retrieveEndDimensionsNode(dimensionIds.slice(1), dimensions, config, defaultQuantity);\n let endNodes: IProductDimensionsMatrixNode[] = [];\n for (const node of nodes) {\n endNodes = endNodes.concat(\n dimensionIds[0].map(dimension => {\n const isNodeAvailable = node.isAvailable && isDimensionAvailable(dimension, dimensions, config);\n const nodeCopy: IProductDimensionsMatrixNode = {\n dimensionIds: node.dimensionIds.concat(dimension),\n isAvailable: isNodeAvailable,\n quantity: isNodeAvailable ? node.quantity : 0\n };\n\n return nodeCopy;\n })\n );\n }\n\n return endNodes;\n};\n\n/**\n * Generates a list of display orders.\n * @param dimensions - List of dimensions.\n * @param usedDimensions - List of used dimensions.\n * @returns List of display orders.\n */\nconst createDisplayOrders = (\n dimensions: ProductDimensionValueInventoryAvailability[],\n usedDimensions?: ProductDimensionValueInventoryAvailability[]\n) => {\n if (usedDimensions?.length === dimensions.length) {\n return [\n {\n dimensionTypes: usedDimensions.map(dimension => dimension.DimensionTypeValue!)\n }\n ];\n }\n\n let result: {\n dimensionTypes: number[];\n }[] = [];\n\n for (const dimension of dimensions) {\n if (usedDimensions?.includes(dimension)) {\n continue;\n }\n const currentDimensions = usedDimensions ? usedDimensions.concat(dimension) : [dimension];\n const currentResult = createDisplayOrders(dimensions, currentDimensions);\n result = result.concat(currentResult);\n }\n\n return result;\n};\n\n/**\n * Represents dimension matrix row data for the react view.\n */\ninterface IProductDimensionsMatrixRow {\n rows: React.ReactElement[][];\n newNodeIndex: number;\n}\n\n/**\n * Product dimensions matrix component which allows to purchase multiple product variants at the same time.\n */\nexport class ProductDimensionsMatrix extends React.PureComponent<IProductDimensionsMatrixProps, IProductDimensionsMatrixState> {\n private static readonly _className: string = 'msc-product-dimensions-matrix';\n\n private static readonly _defaultQuantityProps = {\n defaultQuantity: 0,\n minQuantity: 0,\n maxQuantity: 10_000_000\n };\n\n private readonly _displayOrderList: {\n dimensionTypes: number[];\n }[];\n\n public constructor(props: IProductDimensionsMatrixProps) {\n super(props);\n\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n const dimensions = props.data.dimensions;\n const nodes = ProductDimensionsMatrix._retrieveNodes(isMobileDevice ? ArrayExtensions.reverse(dimensions) : dimensions, props);\n const quantities = nodes.map(node => node.quantity);\n this.state = {\n dimensionsOrder: dimensions,\n nodes,\n totalQuantity: ArrayExtensions.hasElements(quantities) ? ArrayExtensions.calculateSum(quantities) : 0,\n lastChangeAllDate: Date.now(),\n dimensionsExpandState: new Dictionary(),\n\n // The state needs to be updated in order to make collapsing work for inner dimensions.\n // Probably some react bug that makes the state not change which in turn, doesn't update expand state of the dimensions on the page.\n // Needs to be updated in order to update expand/collapse states and not to reset the whole component (which resets scroll position).\n // eslint-disable-next-line react/no-unused-state -- See the reason above.\n dimensionsExpandStateDate: Date.now()\n };\n\n this._displayOrderList = createDisplayOrders(dimensions);\n\n if (msdyn365Commerce.isBrowser) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this.retrieveAvailabilitiesInformation();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n private static _retrieveNodes(dimensions: IProductDimensionsWithAvailabilitiesFull[], props: IProductDimensionsMatrixProps) {\n const dimensionIds = ArrayExtensions.validValues(\n dimensions.map(dimension => ArrayExtensions.validValues(dimension.dimensionValuesWithInventory?.map(getDimensionId)))\n );\n\n const dimensionsList = ArrayExtensions.flatten(dimensions.map(dimension => dimension.dimensionValuesWithInventory));\n\n const nodes = retrieveEndDimensionsNode(\n dimensionIds,\n dimensionsList,\n props.context.app.config,\n ProductDimensionsMatrix._defaultQuantityProps.defaultQuantity\n );\n\n for (const node of nodes) {\n const nodeDimensions = dimensionsList.filter(dimension => node.dimensionIds.includes(getDimensionId(dimension)));\n\n let productIds: number[] | undefined;\n for (const dimension of nodeDimensions) {\n const dimensionProductIds = dimension.ProductIds;\n if (!ArrayExtensions.hasElements(dimensionProductIds)) {\n continue;\n }\n if (productIds === undefined) {\n productIds = dimensionProductIds;\n continue;\n }\n productIds = productIds.filter(productId => dimensionProductIds.includes(productId));\n }\n if (productIds?.length === 1) {\n node.productId = productIds[0];\n }\n }\n\n return nodes;\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n private static _renderMatrixEmptyCell(className: string): React.ReactElement {\n return <div key='empty-placeholder' className={className} />;\n }\n\n public render(): React.ReactElement | null {\n if (!ArrayExtensions.hasElements(this.state.nodes)) {\n return null;\n }\n\n return (\n <div className={classnames(this.props.className, ProductDimensionsMatrix._className)}>\n {this._renderHeader(`${ProductDimensionsMatrix._className}__header`)}\n {this._renderMatrix(`${ProductDimensionsMatrix._className}__matrix`)}\n {this._renderFooter(`${ProductDimensionsMatrix._className}__footer`)}\n </div>\n );\n }\n\n public async retrieveAvailabilitiesInformation() {\n const productIds = this.state.nodes.map(node => node.productId!);\n const actionContext = this.props.context.actionContext;\n const enableStockCheck = this.props.context.app.config.enableStockCheck;\n const warehouseAggregation = this.props.context.app.config.warehouseAggregation;\n\n if (!enableStockCheck) {\n for (const node of this.state.nodes) {\n node.isAvailable = true;\n }\n } else {\n const availabilitiesSearchCriteria: InventoryAvailabilitySearchCriteria = {\n ProductIds: productIds,\n QuantityUnitTypeValue: 2,\n FilterByChannelFulfillmentGroup: true,\n DeliveryModeTypeFilterValue: DeliveryMode.shipping,\n DefaultWarehouseOnly: warehouseAggregation === 'individual'\n };\n\n const availabilities = await ProductsDataActions.getEstimatedAvailabilityAsync(\n { callerContext: actionContext },\n availabilitiesSearchCriteria\n );\n\n for (const node of this.state.nodes) {\n const availability = availabilities.AggregatedProductInventoryAvailabilities?.find(\n item => item.ProductId === node.productId\n );\n node.isAvailable =\n availability !== undefined && isProductAvailable(availability, this.props.context.app.config.inventoryLevel);\n }\n }\n\n this.setState({\n lastChangeAllDate: Date.now()\n });\n }\n\n private _renderHeader(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderDisplayOrderContainer(`${className}__display-order`)}\n {this._renderActions(`${className}__actions`)}\n </div>\n );\n }\n\n /**\n * Handles change of dimension.\n * @param selectedDimensions - Selected dimension order.\n */\n private readonly _handleDisplayOrderChange = (selectedDimensions: ILabeledDropdownOnChangeNotification) => {\n this.setState(state => {\n const displayOrder = this._displayOrderList.find(value => {\n return value.dimensionTypes.join('-') === selectedDimensions.selectedOption.key;\n })!;\n const newDimensions = displayOrder.dimensionTypes.map(\n dimensionType => state.dimensionsOrder.find(item => item.DimensionTypeValue === dimensionType)!\n );\n\n const newNodes = this._generateNodesByNewDimensions(ArrayExtensions.reverse(newDimensions), state.nodes);\n\n return {\n dimensionsOrder: newDimensions,\n nodes: newNodes,\n lastChangeAllDate: Date.now()\n };\n });\n };\n\n private _renderDisplayOrderContainer(className: string) {\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n if (!isMobileDevice) {\n return null;\n }\n\n const dropdowns = this._displayOrderList.map(value => {\n return {\n key: value.dimensionTypes.join('-'),\n value: value.dimensionTypes\n .map(dimension => getDimensionName(dimension, this.props.resources))\n .join(this.props.resources.productDimensionsMatrixDisplayOrderSeparator)\n };\n });\n\n return (\n <div className={className}>\n <LabeledDropdown\n labelClassname={`${className}__label`}\n labelText={this.props.resources.productDimensionsMatrixDisplayOrderLabel}\n dropdownOptions={dropdowns}\n selectedOption={dropdowns[0]}\n dropdownClassname={`${className}__dropdown`}\n onSelectOption={this._handleDisplayOrderChange}\n />\n </div>\n );\n }\n\n /**\n * Updates all quantities for each cell with the new given quantity, overrides any existing quantities.\n * @param newQuantity - Quantity to use for the cells.\n */\n private readonly _updateAllQuantities = (newQuantity: number) => {\n this.setState(state => {\n const nodes = state.nodes.map(node => {\n return {\n ...node,\n quantity: node.isAvailable ? newQuantity : 0\n };\n });\n const quantities = nodes.map(node => node.quantity);\n return {\n nodes,\n totalQuantity: ArrayExtensions.hasElements(quantities) ? ArrayExtensions.calculateSum(quantities) : 0,\n lastChangeAllDate: Date.now()\n };\n });\n };\n\n /**\n * Clears all quantities by setting all nodes to use the default quantity.\n */\n private readonly _clearAllQuantities = () => {\n this._updateAllQuantities(ProductDimensionsMatrix._defaultQuantityProps.defaultQuantity);\n };\n\n private _renderActions(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderEnterAllQuantities(`${className}__enter-all-quantities-container`)}\n {this._renderClearAllQuantities(`${className}__clear-all-quantities-container`)}\n </div>\n );\n }\n\n private _renderEnterAllQuantities(className: string): React.ReactElement {\n const maxQuantityForCartLineItem = this.props.context.app.config.maxQuantityForCartLineItem;\n return (\n <ProductDimensionsMatrixEnterAllQuantitiesComponent\n className={className}\n resources={this.props.resources}\n defaultQuantity={ProductDimensionsMatrix._defaultQuantityProps.defaultQuantity}\n minQuantityValue={ProductDimensionsMatrix._defaultQuantityProps.minQuantity}\n maxQuantityValue={maxQuantityForCartLineItem || ProductDimensionsMatrix._defaultQuantityProps.maxQuantity}\n onApplyToAll={this._updateAllQuantities}\n />\n );\n }\n\n private _renderClearAllQuantities(className: string): React.ReactElement {\n return (\n <div className={className}>\n <Button\n className={`${className}__button`}\n title={this.props.resources.productDimensionsMatrixClearAllText}\n onClick={this._clearAllQuantities}\n >\n {this.props.resources.productDimensionsMatrixClearAllText}\n </Button>\n </div>\n );\n }\n\n private _renderMatrixDesktop(className: string): React.ReactElement {\n const rowClassName = `${className}__row`;\n const cellClassName = `${rowClassName}__cell`;\n const dimensionsList = ArrayExtensions.flatten(this.state.dimensionsOrder.map(dimension => dimension.dimensionValuesWithInventory));\n const rows = this._renderMatrixRowsDesktop(rowClassName, dimensionsList, [], 0).rows;\n\n const reversedDimensions = ArrayExtensions.reverse(this.state.dimensionsOrder);\n\n return (\n <div className={className} key={JSON.stringify(this.state.dimensionsOrder)}>\n {this._renderMatrixDimensionsHeader(`${className}__dimensions-header`, reversedDimensions)}\n <div className={`${className}__content`}>\n <div className={rowClassName}>\n {reversedDimensions.map((dimension, index) => {\n if (index === reversedDimensions.length - 1) {\n return dimension.dimensionValuesWithInventory?.map(item =>\n this._renderMatrixDimensionCell(cellClassName, item)\n );\n }\n return ProductDimensionsMatrix._renderMatrixEmptyCell(cellClassName);\n })}\n </div>\n {rows.map(cells => {\n return (\n <div className={rowClassName} key='cells'>\n {cells}\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n /**\n * Handle collapse dimension.\n * @param dimensionId - Selected dimension id.\n * @returns Callback for collapse dimension button.\n */\n private readonly _handleCollapseDimension = (dimensionId: string) => () => {\n this.setState(state => {\n const isExpanded = state.dimensionsExpandState.getValueWithDefaultValue(dimensionId, false);\n state.dimensionsExpandState.setValue(dimensionId, !isExpanded);\n\n return {\n dimensionsExpandState: state.dimensionsExpandState,\n dimensionsExpandStateDate: Date.now()\n };\n });\n };\n\n private _renderMatrixMobile(className: string): React.ReactElement {\n const allDimensions = ArrayExtensions.flatten(this.state.dimensionsOrder.map(dimension => dimension.dimensionValuesWithInventory));\n\n const singleDimensionClassName = `${className}__single-dimension`;\n const cellClassName = `${className}__cell`;\n const dimensionsContainerClassName = `${cellClassName}__dimension-container`;\n\n return (\n <div\n className={classnames(className, this.state.dimensionsOrder.length === 1 ? singleDimensionClassName : '')}\n key={`${JSON.stringify(this.state.dimensionsOrder)}-${this.state.lastChangeAllDate}`}\n >\n {this._renderMatrixRowsMobile(dimensionsContainerClassName, allDimensions, [], 0).rows}\n </div>\n );\n }\n\n private _renderMatrix(className: string): React.ReactElement {\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n if (!isMobileDevice) {\n return this._renderMatrixDesktop(className);\n }\n\n return this._renderMatrixMobile(`${className}__mobile`);\n }\n\n private _generateNodesByNewDimensions(\n newDimensions: IProductDimensionsWithAvailabilitiesFull[],\n nodes: IProductDimensionsMatrixNode[]\n ) {\n return ProductDimensionsMatrix._retrieveNodes(newDimensions, this.props).map(node => {\n const previousNode = nodes.find(pastNode => ArrayExtensions.haveSameItems(node.dimensionIds, pastNode.dimensionIds))!;\n node.quantity = previousNode.quantity;\n node.isAvailable = previousNode.isAvailable;\n return node;\n });\n }\n\n /**\n * Handles change of dimension for a column by swapping previous and new dimension columns with each other.\n * @param previousDimensionType - Previous dimension used in the column.\n * @param newDimensionType - New dimension to display instead of the previous dimension.\n */\n private readonly _handleDimensionTypeChange = (previousDimensionType: number, newDimensionType: number) => {\n this.setState(\n state => {\n const previousDimension = state.dimensionsOrder.find(item => item.DimensionTypeValue === previousDimensionType)!;\n const newDimension = state.dimensionsOrder.find(item => item.DimensionTypeValue === newDimensionType)!;\n\n const newDimensions = state.dimensionsOrder.map(item => {\n if (item === previousDimension) {\n return newDimension;\n }\n if (item === newDimension) {\n return previousDimension;\n }\n return item;\n });\n\n const newNodes = this._generateNodesByNewDimensions(newDimensions, state.nodes);\n\n return {\n dimensionsOrder: newDimensions,\n nodes: newNodes,\n lastChangeAllDate: Date.now()\n };\n },\n () => {\n this.props.dimensionOnChange && this.props.dimensionOnChange();\n }\n );\n };\n\n private _renderMatrixDimensionsHeader(className: string, dimensions: IProductDimensionsWithAvailabilitiesFull[]): React.ReactElement {\n const cellClassName = `${className}__cell`;\n const dimensionsList = dimensions.map(dimension => dimension.DimensionTypeValue);\n\n return (\n <div className={className}>\n {dimensionsList.map(dimensionType => {\n return (\n <ProductDimensionsMatrixDimensionSelectionComponent\n key={dimensionType}\n className={cellClassName}\n resources={this.props.resources}\n dimensionTypes={dimensionsList}\n currentDimensionType={dimensionType}\n onDimensionTypeChange={this._handleDimensionTypeChange}\n />\n );\n })}\n </div>\n );\n }\n\n private _renderMatrixMainDimensionMobile(\n className: string,\n dimension: ProductDimensionValueInventoryAvailability,\n content: React.ReactElement\n ): React.ReactElement {\n const dimensionId = getDimensionId(dimension);\n const isExpanded = this.state.dimensionsExpandState.getValueWithDefaultValue(dimensionId, false);\n\n const expandButtonClassName = `${className}__expand-button`;\n const collapseClassName = `${className}__collapse`;\n const collapseItemClassName = `${collapseClassName}__item`;\n\n return (\n <div className={className} key={`${dimensionId}-${isExpanded ? 'expanded' : 'collapsed'}-${this.state.lastChangeAllDate}`}>\n <Button className={expandButtonClassName} onClick={this._handleCollapseDimension(dimensionId)} aria-expanded={isExpanded}>\n {this._renderMatrixDimensionCell(`${expandButtonClassName}__dimension`, dimension)}\n </Button>\n <Collapse className={collapseClassName} isOpen={isExpanded}>\n <div className={collapseItemClassName}>{content}</div>\n </Collapse>\n </div>\n );\n }\n\n private _renderMatrixRowsMobile(\n className: string,\n dimensions: ProductDimensionValueInventoryAvailability[],\n partialDimensions: string[],\n nodeIndex: number\n ): IProductDimensionsMatrixRow {\n const result: IProductDimensionsMatrixRow = {\n rows: [],\n newNodeIndex: nodeIndex\n };\n\n if (nodeIndex >= this.state.nodes.length) {\n return result;\n }\n\n const node = this.state.nodes[result.newNodeIndex];\n const nodeDimensionIdsLength = node.dimensionIds.length;\n const partialDimensionIdsLength = partialDimensions.length;\n const currentDimensionId = node.dimensionIds[partialDimensionIdsLength];\n const currentDimension = dimensions.find(dimension => getDimensionId(dimension) === currentDimensionId)!;\n\n const cellClassName = `${className}__cell`;\n\n if (nodeDimensionIdsLength === partialDimensionIdsLength + 1) {\n result.rows.push([]);\n\n if (node.dimensionIds.length === 1) {\n while (result.newNodeIndex < this.state.nodes.length) {\n const dimensionId = this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength];\n const lastDimension = dimensions.find(dimension => getDimensionId(dimension) === dimensionId)!;\n\n result.rows[0].push(\n <div className={cellClassName}>\n {this._renderMatrixDimensionCell(`${cellClassName}__dimension-label`, lastDimension)}\n {this._renderMatrixCell(`${cellClassName}__content`, result.newNodeIndex++)}\n </div>\n );\n }\n return result;\n }\n\n result.rows[0].push(\n <div className={cellClassName}>\n {this._renderMatrixDimensionCell(`${cellClassName}__dimension-label`, currentDimension)}\n {this._renderMatrixCell(`${cellClassName}__content`, result.newNodeIndex++)}\n </div>\n );\n\n if (partialDimensionIdsLength > 0) {\n const previousDimension = partialDimensions[partialDimensionIdsLength - 1];\n\n while (\n result.newNodeIndex < this.state.nodes.length &&\n previousDimension === this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength - 1]\n ) {\n const dimensionId = this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength];\n const lastDimension = dimensions.find(dimension => getDimensionId(dimension) === dimensionId)!;\n result.rows[0].push(\n <div className={cellClassName}>\n {this._renderMatrixDimensionCell(`${cellClassName}__dimension-label`, lastDimension)}\n {this._renderMatrixCell(`${cellClassName}__content`, result.newNodeIndex++)}\n </div>\n );\n }\n }\n\n return result;\n }\n\n const rows = this._renderMatrixRowsMobile(className, dimensions, partialDimensions.concat(currentDimensionId), result.newNodeIndex);\n result.newNodeIndex = rows.newNodeIndex;\n if (partialDimensionIdsLength === 0) {\n result.rows.push([this._renderMatrixMainDimensionMobile(`${className}__main-dimension`, currentDimension, <>{rows.rows}</>)]);\n } else {\n result.rows.push([\n <div className={`${className}__container`} key={currentDimensionId}>\n {this._renderMatrixDimensionCell(`${className}__container__dimension`, currentDimension)}\n <div className={`${className}__container__items`}>{rows.rows}</div>\n </div>\n ]);\n }\n\n if (partialDimensionIdsLength > 0) {\n const previousDimension = partialDimensions[partialDimensionIdsLength - 1];\n while (\n result.newNodeIndex < this.state.nodes.length &&\n previousDimension === this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength - 1]\n ) {\n const nextRows = this._renderMatrixRowsMobile(className, dimensions, partialDimensions, result.newNodeIndex);\n result.rows = result.rows.concat(nextRows.rows);\n result.newNodeIndex = nextRows.newNodeIndex;\n }\n } else {\n while (result.newNodeIndex < this.state.nodes.length) {\n const nextRows = this._renderMatrixRowsMobile(className, dimensions, partialDimensions, result.newNodeIndex);\n result.rows = result.rows.concat(nextRows.rows);\n result.newNodeIndex = nextRows.newNodeIndex;\n }\n }\n\n return result;\n }\n\n private _renderMatrixRowsDesktop(\n className: string,\n dimensions: ProductDimensionValueInventoryAvailability[],\n partialDimensions: string[],\n nodeIndex: number\n ): IProductDimensionsMatrixRow {\n const result: IProductDimensionsMatrixRow = {\n rows: [],\n newNodeIndex: nodeIndex\n };\n\n if (nodeIndex >= this.state.nodes.length) {\n return result;\n }\n\n const node = this.state.nodes[result.newNodeIndex];\n const nodeDimensionIdsLength = node.dimensionIds.length;\n const partialDimensionIdsLength = partialDimensions.length;\n const currentDimensionId = node.dimensionIds[partialDimensionIdsLength];\n const currentDimension = dimensions.find(dimension => getDimensionId(dimension) === currentDimensionId)!;\n\n const cellClassName = `${className}__cell`;\n\n if (nodeDimensionIdsLength === partialDimensionIdsLength + 1) {\n result.rows.push([]);\n\n if (node.dimensionIds.length === 1) {\n while (result.newNodeIndex < this.state.nodes.length) {\n result.rows[0].push(this._renderMatrixCell(cellClassName, result.newNodeIndex++));\n }\n return result;\n }\n\n result.rows[0].push(this._renderMatrixCell(cellClassName, result.newNodeIndex++));\n\n if (partialDimensionIdsLength > 0) {\n const previousDimension = partialDimensions[partialDimensionIdsLength - 1];\n\n while (\n result.newNodeIndex < this.state.nodes.length &&\n previousDimension === this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength - 1]\n ) {\n result.rows[0].push(this._renderMatrixCell(cellClassName, result.newNodeIndex++));\n }\n }\n\n return result;\n }\n\n const rows = this._renderMatrixRowsDesktop(\n className,\n dimensions,\n partialDimensions.concat(currentDimensionId),\n result.newNodeIndex\n );\n result.rows = result.rows.concat(\n rows.rows.map((cells, index) => {\n if (index === 0) {\n return [this._renderMatrixDimensionCell(cellClassName, currentDimension)].concat(cells);\n }\n return [ProductDimensionsMatrix._renderMatrixEmptyCell(cellClassName)].concat(cells);\n })\n );\n result.newNodeIndex = rows.newNodeIndex;\n\n if (partialDimensionIdsLength > 0) {\n const previousDimension = partialDimensions[partialDimensionIdsLength - 1];\n while (\n result.newNodeIndex < this.state.nodes.length &&\n previousDimension === this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength - 1]\n ) {\n const nextRows = this._renderMatrixRowsDesktop(className, dimensions, partialDimensions, result.newNodeIndex);\n result.rows = result.rows.concat(nextRows.rows);\n result.newNodeIndex = nextRows.newNodeIndex;\n }\n } else {\n while (result.newNodeIndex < this.state.nodes.length) {\n const nextRows = this._renderMatrixRowsDesktop(className, dimensions, partialDimensions, result.newNodeIndex);\n result.rows = result.rows.concat(nextRows.rows);\n result.newNodeIndex = nextRows.newNodeIndex;\n }\n }\n\n return result;\n }\n\n private _renderMatrixDimensionCell(className: string, dimension: ProductDimensionValueInventoryAvailability): React.ReactElement {\n const dimensionId = getDimensionId(dimension);\n\n return (\n <div className={className} key={dimensionId}>\n <ProductDimensionsMatrixDimensionItemComponent\n className={`${className}__dimension-item`}\n apiSettings={this.props.context.request.apiSettings}\n item={{\n itemId: dimensionId,\n value: dimension.DimensionValue?.Value ?? '',\n colorHexCode: dimension.DimensionValue?.ColorHexCode,\n imageUrl: dimension.DimensionValue?.ImageUrl\n }}\n />\n </div>\n );\n }\n\n private _renderMatrixCell(className: string, nodeIndex: number): React.ReactElement {\n const node = this.state.nodes[nodeIndex];\n\n return (\n <div\n key={`${JSON.stringify(node.dimensionIds)}-${this.state.lastChangeAllDate}`}\n className={classnames(className, node.isAvailable ? `${className}__available` : `${className}__unavailable`)}\n >\n {node.isAvailable ? this._renderMatrixQuantityCell(node) : this._renderMatrixOutOfStockCell(`${className}__out-of-stock`)}\n </div>\n );\n }\n\n private _renderMatrixOutOfStockCell(className: string): React.ReactElement {\n return (\n <div className={className} key='out-of-stock'>\n {this.props.resources.productDimensionsMatrixOutOfStockLabel}\n </div>\n );\n }\n\n private _renderMatrixQuantityCell(node: IProductDimensionsMatrixNode): React.ReactElement {\n const maxQuantityForCartLineItem = this.props.context.app.config.maxQuantityForCartLineItem;\n return (\n <Quantity\n key={`${JSON.stringify(node.dimensionIds)}-${this.state.lastChangeAllDate}`}\n currentCount={node.quantity}\n onChange={this._handleQuantityChange(node)}\n inputQuantityAriaLabel={this.props.resources.productDimensionsMatrixInputQuantityAriaLabel}\n min={ProductDimensionsMatrix._defaultQuantityProps.minQuantity}\n max={maxQuantityForCartLineItem || ProductDimensionsMatrix._defaultQuantityProps.maxQuantity}\n />\n );\n }\n\n private _renderTotalSummary(className: string): React.ReactElement {\n return (\n <div className={className}>\n <div className={`${className}__total-quantity`}>{this.state.totalQuantity}</div>\n <div className={`${className}__total-quantity-label`}>{this.props.resources.productDimensionsMatrixTotalItemsLabel}</div>\n </div>\n );\n }\n\n private _retrieveProducts(): { productId: number; quantity: number }[] {\n return this.state.nodes\n .filter(node => node.productId && node.quantity !== 0)\n .map(node => {\n return {\n productId: node.productId!,\n quantity: node.quantity\n };\n });\n }\n\n private _renderAddToOrderTemplate(className: string): React.ReactElement | null {\n if (ObjectExtensions.isNullOrUndefined(this.props.data.orderTemplates)) {\n return null;\n }\n\n return (\n <AddProductsToOrderTemplateComponent\n className={className}\n context={this.props.context}\n data={{\n orderTemplates: this.props.data.orderTemplates,\n products: this._retrieveProducts().map(item => {\n return {\n ProductId: item.productId,\n Quantity: item.quantity,\n UnitOfMeasure: ''\n };\n }),\n customerInformation: this.props.data.customerInformation\n }}\n resources={this.props.resources}\n isDisabled={this.state.totalQuantity === 0}\n isMultipleCatalogFeatureEnabledInHq={this.props.isMultipleCatalogFeatureEnabledInHq}\n catalogId={this.props.catalogId}\n />\n );\n }\n\n private _renderAddToCart(className: string): React.ReactElement {\n return (\n <AddToCartFunctionalComponent\n key={`${JSON.stringify(this.state.nodes)}`}\n addToCartText={this.props.resources.productDimensionsMatrixAddItemsToCartButtonText}\n addToCartArialLabel={this.props.resources.productDimensionsMatrixAddItemsToCartButtonText}\n id=''\n typeName=''\n className={className}\n navigationUrl={getUrlSync('cart', this.props.context.actionContext)}\n context={this.props.context}\n dialogStrings={this.props.resources}\n shouldSkipSiteSettings\n data={undefined}\n products={this._retrieveProducts()}\n disabled={this.state.totalQuantity === 0}\n onError={(result): void => {\n if (result.cartActionResult?.errorDetails?.LocalizedMessage) {\n this.props.onErrorMessage(result.cartActionResult.errorDetails.LocalizedMessage);\n }\n }}\n />\n );\n }\n\n private _renderFooter(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderTotalSummary(`${className}__total-summary`)}\n {this._renderFooterActions(`${className}__actions`)}\n </div>\n );\n }\n\n private _renderFooterActions(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderAddToOrderTemplate(`${className}__add-to-order-template`)}\n {this._renderAddToCart(`${className}__add-to-cart`)}\n </div>\n );\n }\n\n /**\n * Handles quantity change.\n * @param node - Node which needs to be updated.\n * @returns Handler method.\n */\n private readonly _handleQuantityChange = (node: IProductDimensionsMatrixNode) => (newValue: number = 0) => {\n if (!node.isAvailable) {\n return;\n }\n\n const difference = newValue - node.quantity;\n node.quantity = newValue;\n this.setState(state => {\n return {\n totalQuantity: state.totalQuantity + difference\n };\n });\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Refiner options type.\n */\nexport enum RefinerOptionsType {\n SingleSelect = 0,\n MultiSelect = 1\n}\n\n/**\n * Refiner item type.\n */\nexport enum RefinerItemType {\n Check = 0,\n DateRange = 1\n}\n\n/**\n * IRefinerItemData interface.\n */\nexport interface IRefinerItemData {\n refinerItemId: number; // must be unique within the refiner group (sourceTypeValue)\n sourceTypeValue: number;\n itemType: RefinerItemType;\n label: string;\n value?: string;\n isChecked?: boolean;\n minLabel?: string;\n maxLabel?: string;\n minValue?: string;\n maxValue?: string;\n}\n\n/**\n * IRefinerOptionsData interface.\n */\nexport interface IRefinerOptionsData {\n refinerOptionsId: number; // must be unique within the refiner (sourceTypeValue)\n sourceTypeValue: number;\n name?: string;\n typeValue: RefinerOptionsType;\n isExpanded?: boolean;\n refinerItems: IRefinerItemData[];\n selectedRefinerItems: IRefinerItemData[];\n}\n\n/**\n * IRefinerData interface.\n */\nexport interface IRefinerData {\n refinerOptions: IRefinerOptionsData[];\n}\n\n/**\n * IRefinerItemToggleNotification interface.\n */\nexport interface IRefinerItemToggleNotification {\n refinerOptionsData: IRefinerOptionsData;\n refinerItemData: IRefinerItemData;\n isSelecting: boolean;\n rangeStart?: string;\n rangeEnd?: string;\n}\n\n/**\n * Get updated refinement criteria.\n * @param itemToggleNotification - RefineItemToggleNotification object.\n * @param currentRefinementCriteria - Array of IRefineItemData.\n * @returns - Array of IRefineItemData.\n */\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefinerItemToggleNotification,\n currentRefinementCriteria: IRefinerItemData[]\n): IRefinerItemData[] {\n const updatedRefinementCriteria: IRefinerItemData[] = [];\n let isToggledItemFound = false;\n\n // Keep all the existing refinement criteria, except the given item toggle notification if it is not selected.\n for (const selectedCriterion of currentRefinementCriteria) {\n if (isMatchingRefinementCriterion(itemToggleNotification.refinerItemData, selectedCriterion)) {\n isToggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n minValue:\n itemToggleNotification.rangeStart !== undefined\n ? `${itemToggleNotification.rangeStart}`\n : selectedCriterion.minValue,\n maxValue:\n itemToggleNotification.rangeEnd !== undefined ? `${itemToggleNotification.rangeEnd}` : selectedCriterion.maxValue\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n }\n\n if (!isToggledItemFound) {\n const next = {\n ...itemToggleNotification.refinerItemData\n };\n\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (itemToggleNotification.refinerOptionsData.typeValue === RefinerOptionsType.SingleSelect) {\n for (const child of itemToggleNotification.refinerOptionsData.refinerItems) {\n if (!(child.refinerItemId === next.refinerItemId && child.label === next.label)) {\n const matchingIndex = updatedRefinementCriteria.findIndex(criterion => isMatchingRefinementCriterion(child, criterion));\n // eslint-disable-next-line max-depth -- Condition required.\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n }\n }\n }\n\n return updatedRefinementCriteria;\n}\n\n/**\n * Find the refinement criterion associated with this given refiner value.\n * @param refinerValue - Refiner value to match.\n * @param refinementCriterion - Selected refinement criteria.\n * @returns - Boolean.\n */\nexport function isMatchingRefinementCriterion(refinerValue: IRefinerItemData, refinementCriterion: IRefinerItemData): boolean {\n return (\n refinementCriterion.refinerItemId === refinerValue.refinerItemId &&\n refinementCriterion.label === refinerValue.label &&\n refinerValue.sourceTypeValue === refinementCriterion.sourceTypeValue\n );\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n Button,\n ITelemetryContent,\n TelemetryConstant,\n getPayloadObject,\n getTelemetryAttributes\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\n/**\n * Class names used in component.\n */\nconst componentClassName: string = 'msc-refiner-apply';\n\n/**\n * IRefinerApplyComponent interface.\n */\ninterface IRefinerApplyComponent extends IComponent<IRefinerApplyProps> {}\n\n/**\n * IRefinerApplyProps interface.\n */\nexport interface IRefinerApplyProps extends IComponentProps<{}> {\n className?: string;\n text?: string;\n ariaLabel?: string;\n isDisabled?: boolean;\n telemetryContent?: ITelemetryContent;\n onClick?(): void;\n}\n\n/**\n * RefinerApply component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerApplyFunctionalComponent: React.FC<IRefinerApplyProps> = (props: IRefinerApplyProps) => {\n const { className, text, ariaLabel, isDisabled, telemetryContent, onClick } = props;\n\n // define telemetry attributes\n const applyRefinerAttributes = getTelemetryAttributes(\n props.telemetryContent!,\n getPayloadObject('click', telemetryContent!, TelemetryConstant.ApplyRefiner)\n );\n\n return (\n <Button\n className={classnames(className, componentClassName)}\n disabled={isDisabled}\n aria-label={ariaLabel ?? text}\n aria-disabled={isDisabled}\n onClick={onClick}\n {...applyRefinerAttributes}\n >\n {text}\n </Button>\n );\n};\n\n/**\n * RefinerApply component.\n */\nexport const RefinerApplyComponent: React.FunctionComponent<IRefinerApplyProps> = msdyn365Commerce.createComponent<IRefinerApplyComponent>(\n 'Refiner-Apply',\n {\n component: React.memo(RefinerApplyFunctionalComponent)\n }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\nimport { IRefinerItemData, RefinerItemType } from './common';\n\n/**\n * Class names used in component.\n */\nconst componentClassName: string = 'msc-refiner-choice-summary';\nconst labelClassName: string = `${componentClassName}__label`;\nconst listClassName: string = `${componentClassName}__list`;\nconst listItemClassName: string = `${componentClassName}__list-item`;\nconst itemClassName: string = `${componentClassName}__item`;\nconst closeButtonGlyphClassName: string = `${componentClassName}__close-btn`;\nconst buttonGlyphClassName: string = `${componentClassName}__glyph`;\nconst clearAllButtonClassName: string = `${componentClassName}__clear-all`;\n\n/**\n * IRefinerChoiceSummaryClickNotification interface.\n */\nexport interface IRefinerChoiceSummaryClickNotification {\n selectedRefinerItem: IRefinerItemData | undefined;\n shouldClearAll: boolean;\n nextItemToFocus: HTMLElement | undefined;\n}\n\n/**\n * IRefinerChoiceSummaryComponent interface.\n */\ninterface IRefinerChoiceSummaryComponent extends IComponent<IRefinerChoiceSummaryProps> {}\n\n/**\n * IRefinerChoiceSummaryData interface.\n */\nexport interface IRefinerChoiceSummaryData {\n selectedChoices: IRefinerItemData[];\n}\n\n/**\n * IRefinerChoiceSummaryProps interface.\n */\nexport interface IRefinerChoiceSummaryProps extends IComponentProps<IRefinerChoiceSummaryData> {\n className?: string;\n clearAllText?: string;\n label?: string;\n choiceAriaLabel?: string;\n choiceFormat?: string;\n closeAriaLabel?: string;\n telemetryContent?: ITelemetryContent;\n onClickChoice(notification: IRefinerChoiceSummaryClickNotification): void;\n onClickClearAll(notification: IRefinerChoiceSummaryClickNotification): void;\n}\n\n/**\n * RefinerChoiceSummary component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerChoiceSummaryFunctionalComponent: React.FC<IRefinerChoiceSummaryProps> = (props: IRefinerChoiceSummaryProps) => {\n const {\n className,\n clearAllText,\n label,\n choiceAriaLabel,\n choiceFormat,\n closeAriaLabel,\n data: { selectedChoices },\n onClickChoice,\n onClickClearAll\n } = props;\n\n /**\n * Get choice summary name.\n * @param activeRefinerItem - Active refine Item data.\n * @returns - Returns the tag name.\n */\n const getTagName = (activeRefinerItem: IRefinerItemData): string => {\n /* eslint-disable @typescript-eslint/prefer-nullish-coalescing -- Required for string. */\n const overallFormat = choiceFormat ?? '{0}';\n\n const refinerLabel: string = activeRefinerItem.label;\n let refinerValue: string = activeRefinerItem.value ?? '';\n if (activeRefinerItem.itemType === RefinerItemType.DateRange) {\n const refinerMinValue: string = activeRefinerItem.minValue ?? '';\n const refinerMaxValue: string = activeRefinerItem.maxValue ?? '';\n refinerValue = '{0} - {1}'.replace('{0}', refinerMinValue).replace('{1}', refinerMaxValue);\n }\n\n return overallFormat.replace('{0}', refinerLabel).replace('{1}', refinerValue);\n /* eslint-enable @typescript-eslint/prefer-nullish-coalescing -- Required for string. */\n };\n\n const onClickChoiceHandler = React.useCallback(\n (selectedRefinerItem: IRefinerItemData) => (event: React.MouseEvent<HTMLAnchorElement, MouseEvent>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n const targetChoiceItem = event.currentTarget as HTMLElement;\n\n onClickChoice({\n selectedRefinerItem,\n shouldClearAll: false,\n nextItemToFocus: targetChoiceItem.nextSibling as HTMLElement\n });\n },\n [onClickChoice]\n );\n\n const onClickClearAllHandler = React.useCallback(\n () => (event: React.MouseEvent<HTMLAnchorElement, MouseEvent>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n const targetChoiceItem = event.currentTarget as HTMLElement;\n\n onClickClearAll({\n selectedRefinerItem: undefined,\n shouldClearAll: true,\n nextItemToFocus: targetChoiceItem.nextSibling as HTMLElement\n });\n },\n [onClickClearAll]\n );\n\n // define telemetry attributes\n const payLoad: IPayLoad = getPayloadObject('click', props.telemetryContent!, '');\n payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n <div className={componentClassName}>\n {ArrayExtensions.hasElements(selectedChoices) && label && <span className={labelClassName}>{label}</span>}\n <ul className={classnames(className, listClassName, 'list-unstyled')}>\n {ArrayExtensions.hasElements(selectedChoices) &&\n selectedChoices.map((choiceItem, index) => {\n const choiceItemName = getTagName(choiceItem);\n\n // define telemetry attributes\n payLoad.contentAction.etext = choiceItemName;\n const choiceItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n <li className={listItemClassName} key={index}>\n <a\n key={choiceItem.refinerItemId}\n className={itemClassName}\n role='button'\n aria-label={`${choiceItemName} ${choiceAriaLabel ?? ''}`}\n onClick={onClickChoiceHandler(choiceItem)}\n {...choiceItemAttribute}\n >\n {choiceItemName}\n <span\n className={classnames(closeButtonGlyphClassName, buttonGlyphClassName)}\n role='button'\n aria-label={closeAriaLabel}\n />\n </a>\n </li>\n );\n })}\n </ul>\n {ArrayExtensions.hasElements(selectedChoices) && clearAllText && (\n <a\n className={clearAllButtonClassName}\n aria-label={closeAriaLabel}\n onClick={onClickClearAllHandler()}\n {...clearAllAttributes}\n >\n {clearAllText}\n </a>\n )}\n </div>\n );\n};\n\n/**\n * RefinerChoiceSummary component.\n */\nexport const RefinerChoiceSummaryComponent: React.FunctionComponent<IRefinerChoiceSummaryProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error -- Required for this signature.\n IRefinerChoiceSummaryComponent\n>('Refiner-Choice-Summary', { component: React.memo(RefinerChoiceSummaryFunctionalComponent) });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\nimport { IRefinerApplyProps, RefinerApplyComponent } from './refiner-apply.component';\n\n/**\n * Class names used in component.\n */\nconst componentClassName: string = 'msc-refiner-footer';\nconst actionsWrapperClassName: string = `${componentClassName}__actions`;\nconst extraActionsWrapperClassName: string = `${componentClassName}__extra-actions`;\n\n/**\n * IRefinerFooterComponent interface.\n */\ninterface IRefinerFooterComponent extends IComponent<IRefinerFooterProps> {}\n\n/**\n * IRefinerFooterProps interface.\n */\nexport interface IRefinerFooterProps extends IComponentProps<{}> {\n className?: string;\n refinerApplyProps?: IRefinerApplyProps;\n extraActions?: React.ReactNode;\n}\n\n/**\n * RefinerFooter component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerFooterFunctionalComponent: React.FC<IRefinerFooterProps> = (props: IRefinerFooterProps) => {\n const { className, refinerApplyProps, extraActions } = props;\n\n return (\n <div className={classnames(className, componentClassName)}>\n <div className={actionsWrapperClassName}>\n {extraActions && <div className={extraActionsWrapperClassName}>{extraActions}</div>}\n {refinerApplyProps && <RefinerApplyComponent {...refinerApplyProps} />}\n </div>\n </div>\n );\n};\n\n/**\n * RefinerFooter component.\n */\nexport const RefinerFooterComponent: React.FunctionComponent<IRefinerFooterProps> = msdyn365Commerce.createComponent<\n IRefinerFooterComponent\n>('Refiner-Footer', {\n component: React.memo(RefinerFooterFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-toggle';\nconst expandedComponentClassName = `${componentClassName}__toggle_expanded`;\nconst collapsedComponentClassName = `${componentClassName}__toggle_collapsed`;\n\n/**\n * IRefinerToggleComponent interface.\n */\ninterface IRefinerToggleComponent extends IComponent<IRefinerToggleProps> {}\n\n/**\n * IRefinerToggleProps interface.\n */\nexport interface IRefinerToggleProps extends IComponentProps<{}> {\n className?: string;\n text?: string;\n ariaLabel?: string;\n isDisabled?: boolean;\n isExpanded?: boolean;\n onClick?(): void;\n}\n\n/**\n * RefinerToggle component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerToggleFunctionalComponent: React.FC<IRefinerToggleProps> = (props: IRefinerToggleProps) => {\n const { className, text, ariaLabel, isDisabled, isExpanded, onClick } = props;\n\n return (\n <Button\n className={classnames(className, isExpanded ? expandedComponentClassName : collapsedComponentClassName)}\n disabled={isDisabled}\n aria-label={ariaLabel ?? text}\n aria-expanded={!!isExpanded}\n aria-disabled={isDisabled}\n onClick={onClick}\n >\n {text}\n </Button>\n );\n};\n\n/**\n * RefinerToggle component.\n */\nexport const RefinerToggleComponent: React.FunctionComponent<IRefinerToggleProps> = msdyn365Commerce.createComponent<\n IRefinerToggleComponent\n>('Refiner-Toggle', {\n component: React.memo(RefinerToggleFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport classnames from 'classnames';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\nlet selectHtmlElement: React.RefObject<HTMLSelectElement>;\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-sort';\nconst sortOptionsClassName = `${componentClassName}__sort-options`;\nconst sortOptionClassName = `${componentClassName}__sort-option`;\nconst sortOptionSelectedClassName = `${componentClassName}__sort-option-selected`;\nconst labelId = `${componentClassName}__label`;\nconst selectLabelId = `${componentClassName}__select`;\nconst labelClassName = `${componentClassName}__label`;\n\n/**\n * IRefinerSortComponent interface.\n */\ninterface IRefinerSortComponent extends IComponent<IRefinerSortProps> {}\n\n/**\n * IRefinerSortData interface.\n */\nexport interface IRefinerSortData {\n options: IRefinerSortOption[];\n}\n\n/**\n * IRefinerSortOption interface.\n */\nexport interface IRefinerSortOption {\n label: string;\n value: string;\n}\n\n/**\n * IRefinerSortProps interface.\n */\nexport interface IRefinerSortProps extends IComponentProps<IRefinerSortData> {\n className?: string;\n currentSortOption?: IRefinerSortOption;\n label?: string;\n ariaLabel?: string;\n isDisabled?: boolean;\n telemetryContent?: ITelemetryContent;\n onSelectOption?(newSortOption?: IRefinerSortOption): void;\n}\n\n/**\n * RefinerSort component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerSortFunctionalComponent: React.FC<IRefinerSortProps> = (props: IRefinerSortProps) => {\n const [sortOptionState, setSortOptionState] = React.useState(props.currentSortOption);\n\n const onSelectOptionHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const value = event.target.value;\n const sortOption = props.data.options?.find((option: IRefinerSortOption) => option.value === value);\n setSortOptionState(sortOption);\n props.onSelectOption?.(sortOption);\n };\n\n // TODO: define telemetry attributes\n // const attributes = getTelemetryAttributes(\n // props.telemetryContent!,\n // getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Sort)\n // );\n\n return (\n <div className={classnames(props.className, componentClassName)}>\n {ArrayExtensions.hasElements(props.data.options) && (\n <label id={labelId} htmlFor={selectLabelId} className={labelClassName}>\n {props.label}\n <select\n id={selectLabelId}\n ref={selectHtmlElement}\n className={sortOptionsClassName}\n value={sortOptionState?.value}\n title={props.ariaLabel ?? ''}\n disabled={props.isDisabled}\n aria-label={props.ariaLabel ?? ''}\n aria-disabled={props.isDisabled}\n onChange={onSelectOptionHandler}\n >\n {props.data.options?.map((option: IRefinerSortOption) => {\n return (\n <option\n key={option.value}\n value={option.value}\n aria-label={option.label}\n aria-selected={option.value === sortOptionState?.value}\n className={classnames(\n sortOptionClassName,\n option.value === sortOptionState?.value ? sortOptionSelectedClassName : ''\n )}\n >\n {option.label}\n </option>\n );\n })}\n </select>\n </label>\n )}\n </div>\n );\n};\n\n/**\n * RefinerSort component.\n */\nexport const RefinerSortComponent: React.FunctionComponent<IRefinerSortProps> = msdyn365Commerce.createComponent<IRefinerSortComponent>(\n 'Refiner-Sort',\n { component: React.memo(RefinerSortFunctionalComponent) }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\nimport { IRefinerToggleProps, RefinerToggleComponent } from './refiner-toggle.component';\nimport { IRefinerChoiceSummaryProps, RefinerChoiceSummaryComponent } from './refiner-choice-summary.component';\nimport { IRefinerSortProps, RefinerSortComponent } from './refiner-sort.component';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-header';\nconst choiceSummaryWrapperClassName = `${componentClassName}__wrapper-choice-summary`;\nconst moreActionsWrapperClassName = `${componentClassName}__wrapper-more-actions`;\nconst extraActionsWrapperClassName = `${componentClassName}__wrapper-extra-actions`;\n\n/**\n * IRefinerHeaderComponent interface.\n */\ninterface IRefinerHeaderComponent extends IComponent<IRefinerHeaderProps> {}\n\n/**\n * IRefinerHeaderProps interface.\n */\nexport interface IRefinerHeaderProps extends IComponentProps<{}> {\n className?: string;\n refinerToggleProps?: IRefinerToggleProps;\n refinerChoiceSummaryProps?: IRefinerChoiceSummaryProps;\n refinerSortProps?: IRefinerSortProps;\n extraActions?: React.ReactNode;\n}\n\n/**\n * RefinerHeader component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerHeaderFunctionalComponent: React.FC<IRefinerHeaderProps> = (props: IRefinerHeaderProps) => {\n const { className, extraActions } = props;\n\n return (\n <Node className={classnames(className, componentClassName)}>\n {props.refinerToggleProps && <RefinerToggleComponent {...props.refinerToggleProps} />}\n {props.refinerChoiceSummaryProps && (\n <div className={choiceSummaryWrapperClassName}>\n <RefinerChoiceSummaryComponent {...props.refinerChoiceSummaryProps} />\n </div>\n )}\n <div className={moreActionsWrapperClassName}>\n {props.refinerSortProps && <RefinerSortComponent {...props.refinerSortProps} />}\n {extraActions && <div className={extraActionsWrapperClassName}>{extraActions}</div>}\n </div>\n </Node>\n );\n};\n\n/**\n * RefinerHeader component.\n */\nexport const RefinerHeaderComponent: React.FunctionComponent<IRefinerHeaderProps> = msdyn365Commerce.createComponent<\n IRefinerHeaderComponent\n>('Refiner-Header', {\n component: React.memo(RefinerHeaderFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport classnames from 'classnames';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-item-check';\nconst labelClassName = `${componentClassName}__label`;\n\n/**\n * IRefinerItemCheckComponent interface.\n */\ninterface IRefinerItemCheckComponent extends IComponent<IRefinerItemCheckProps> {}\n\n/**\n * IRefinerItemCheckProps interface.\n */\nexport interface IRefinerItemCheckProps extends IComponentProps<{}> {\n className?: string;\n label: string;\n ariaLabel?: string;\n isDisabled?: boolean;\n isSingleSelect: boolean;\n isChecked?: boolean;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\n/**\n * RefinerItemCheck component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerItemCheckFunctionalComponent: React.FC<IRefinerItemCheckProps> = (props: IRefinerItemCheckProps) => {\n const { className, isDisabled, label, ariaLabel, isSingleSelect, isChecked, onClick, telemetryContent } = props;\n\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n\n // define telemetry attributes\n const payLoad: IPayLoad = getPayloadObject('click', telemetryContent!, '');\n payLoad.contentAction.etext = label;\n const refinerItemAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n const onClickHandler = (event: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n !props.isDisabled && onClick();\n };\n\n return (\n <a\n tabIndex={0}\n className={classnames(className, componentClassName, itemTypeClassName, isDisabled ? 'disabled' : '')}\n role={isSingleSelect ? 'radio' : 'checkbox'}\n aria-label={ariaLabel ?? label}\n aria-checked={isChecked}\n aria-disabled={isDisabled}\n onClick={onClickHandler}\n {...refinerItemAttributes}\n >\n <span className={labelClassName} aria-hidden='true'>\n {label}\n </span>\n </a>\n );\n};\n\n/**\n * RefinerItemCheck component.\n */\nexport const RefinerItemCheckComponent: React.FunctionComponent<IRefinerItemCheckProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error -- Required for this signature.\n IRefinerItemCheckComponent\n>('Refiner-Item-Check', {\n component: React.memo(RefinerItemCheckFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport classnames from 'classnames';\n\nlet minInput: React.RefObject<HTMLInputElement>;\n\nlet maxInput: React.RefObject<HTMLInputElement>;\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-item-daterange';\nconst minLabelClassName = `${componentClassName}__label-min`;\nconst maxLabelClassName = `${componentClassName}__label-max`;\nconst minInputClassName = `${componentClassName}__input-min`;\nconst maxInputClassName = `${componentClassName}__input-max`;\nconst minLabelId = `${componentClassName}__label-min`;\nconst maxLabelId = `${componentClassName}__label-max`;\nconst minInputLabelId = `${componentClassName}__input-min`;\nconst maxInputLabelId = `${componentClassName}__input-max`;\nconst validationErrorMessageClassName = `${componentClassName}__error`;\n\n/**\n * IRefinerItemDateRangeComponent interface.\n */\ninterface IRefinerItemDateRangeComponent extends IComponent<IRefinerItemDateRangeProps> {}\n\n/**\n * IRefinerItemDateRangeProps interface.\n */\nexport interface IRefinerItemDateRangeProps extends IComponentProps<{}> {\n className?: string;\n minInputLabel?: string;\n maxInputLabel?: string;\n minInputAriaLabel?: string;\n maxInputAriaLabel?: string;\n isDisabled?: boolean;\n minRangeValue?: string;\n maxRangeValue?: string;\n validationErrorForRange?: string;\n fallbackPattern?: string;\n onChangeMinValue?(minValue: string): void;\n onChangeMaxValue?(maxValue: string): void;\n onBlurMinInput?(minValue: string): void;\n onBlurMaxInput?(maxValue: string): void;\n}\n\n/**\n * RefinerItemDateRange component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerItemDateRangeFunctionalComponent: React.FC<IRefinerItemDateRangeProps> = (props: IRefinerItemDateRangeProps) => {\n const {\n className,\n minInputLabel,\n maxInputLabel,\n minInputAriaLabel,\n maxInputAriaLabel,\n isDisabled,\n minRangeValue,\n maxRangeValue,\n validationErrorForRange,\n fallbackPattern,\n onChangeMinValue,\n onChangeMaxValue,\n onBlurMinInput,\n onBlurMaxInput\n } = props;\n const [selectedMinValue, setSelectedMinValue] = React.useState(minRangeValue);\n const [selectedMaxValue, setSelectedMaxValue] = React.useState(maxRangeValue);\n const [validationErrorMessageForRange, setValidationErrorMessageForRange] = React.useState('');\n\n const onChangeMinValueHandler = (event: React.FocusEvent<HTMLInputElement>): void => {\n const selectedFormattedValue = event.target.value;\n setSelectedMinValue(selectedFormattedValue);\n onChangeMinValue?.(selectedFormattedValue);\n };\n\n const onChangeMaxValueHandler = (event: React.FocusEvent<HTMLInputElement>): void => {\n const selectedFormattedValue = event.target.value;\n setSelectedMaxValue(selectedFormattedValue);\n onChangeMaxValue?.(selectedFormattedValue);\n };\n\n function validateRange(minimum?: string, maximum?: string): boolean {\n if (validationErrorForRange && minimum && maximum && minimum > maximum) {\n setValidationErrorMessageForRange(validationErrorForRange);\n return false;\n }\n setValidationErrorMessageForRange('');\n return true;\n }\n\n const onBlurMinValueHandler = (event: React.FocusEvent<HTMLInputElement>) => {\n const userSelectedMinValue = event.target.value;\n setSelectedMinValue(userSelectedMinValue);\n const updatedMinInput = userSelectedMinValue;\n if (validateRange(updatedMinInput, selectedMaxValue)) {\n onBlurMinInput?.(updatedMinInput);\n }\n };\n\n const onBlurMaxValueHandler = (event: React.FocusEvent<HTMLInputElement>) => {\n const userSelectedMaxValue = event.target.value;\n setSelectedMaxValue(userSelectedMaxValue);\n const updatedMaxInput = userSelectedMaxValue;\n if (validateRange(selectedMinValue, updatedMaxInput)) {\n onBlurMaxInput?.(updatedMaxInput);\n }\n };\n\n return (\n <form\n className={classnames(className, componentClassName)}\n aria-disabled={isDisabled}\n data-testid='range-refine-input-item-container'\n >\n <label id={minLabelId} htmlFor={minInputLabelId} className={minLabelClassName}>\n {minInputLabel}\n <input\n className={minInputClassName}\n type='date'\n onChange={onChangeMinValueHandler}\n onBlur={onBlurMinValueHandler}\n value={selectedMinValue}\n id={minInputLabelId}\n ref={minInput}\n aria-label={minInputAriaLabel ?? minInputLabel}\n aria-disabled={isDisabled}\n pattern={fallbackPattern}\n />\n </label>\n <label id={maxLabelId} htmlFor={maxInputLabelId} className={maxLabelClassName}>\n {maxInputLabel}\n <input\n className={maxInputClassName}\n type='date'\n onChange={onChangeMaxValueHandler}\n onBlur={onBlurMaxValueHandler}\n value={selectedMaxValue}\n id={maxInputLabelId}\n ref={maxInput}\n aria-label={maxInputAriaLabel ?? maxInputLabel}\n aria-disabled={isDisabled}\n pattern={fallbackPattern}\n />\n </label>\n {validationErrorMessageForRange && validationErrorMessageForRange !== '' && (\n <span className={validationErrorMessageClassName}>{validationErrorMessageForRange}</span>\n )}\n </form>\n );\n};\n\n/**\n * RefinerItemDateRange component.\n */\nexport const RefinerItemDateRangeComponent: React.FunctionComponent<IRefinerItemDateRangeProps> = msdyn365Commerce.createComponent<\n IRefinerItemDateRangeComponent\n>('Refiner-Item-DateRange', { component: React.memo(RefinerItemDateRangeFunctionalComponent) });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\nimport { IRefinerSortProps, RefinerSortComponent } from './refiner-sort.component';\n\n/**\n * Class names used in component\n */\nconst componentModalClassName = 'msc-refiner-modal';\nconst closeModalClassName = `${componentModalClassName}__close`;\nconst modalContentClassName = `${componentModalClassName}__content`;\nconst modalContentWrapperClassName = `${componentModalClassName}__wrapper`;\nconst modalContentWrapper2ClassName = `${componentModalClassName}__wrapper-internal`;\nconst componentModalToggleClassName = `${componentModalClassName}-toggle`;\n\n/**\n * IRefinerModalToggleComponent interface.\n */\ninterface IRefinerModalToggleComponent extends IComponent<IRefinerModalToggleProps> {}\n\n/**\n * IRefinerModalComponent interface.\n */\ninterface IRefinerModalComponent extends IComponent<IRefinerModalProps> {}\n\n/**\n * IRefinerModalToggleProps interface.\n */\nexport interface IRefinerModalToggleProps extends IComponentProps<{}> {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\n/**\n * IRefinerModalProps interface.\n */\nexport interface IRefinerModalProps extends IComponentProps<{}> {\n modalTitle?: string;\n modalCloseButtonText?: string;\n isOpen?: boolean;\n returnRef?: React.RefObject<HTMLButtonElement> | undefined;\n refinerSortProps?: IRefinerSortProps;\n refinerOptions?: React.ReactNode[];\n onToggle?(): void;\n}\n\n/**\n * Returns the modal.\n * @param props - IRefinerModalProps.\n * @returns Modal node.\n */\nconst modalNode = (props: IRefinerModalProps) => {\n return (\n <Modal\n autoFocus\n applicationNode='renderPage'\n returnFocusRef={props.returnRef}\n isOpen={props.isOpen}\n toggle={props.onToggle}\n className={componentModalClassName}\n zIndex={1050}\n />\n );\n};\n\n/**\n * Returns the modal header.\n * @param props - IRefinerModalProps.\n * @returns ModalHeader node.\n */\nconst modalHeaderNode = (props: IRefinerModalProps) => {\n return <ModalHeader toggle={props.onToggle}>{props.modalTitle}</ModalHeader>;\n};\n\n/**\n * Returns the modal footer.\n * @param props - IRefinerModalProps.\n * @returns ModalFooter node.\n */\nconst modalFooterNode = (props: IRefinerModalProps) => {\n return (\n <ModalFooter>\n <Button onClick={props.onToggle} className={closeModalClassName}>\n {props.modalCloseButtonText}\n </Button>\n </ModalFooter>\n );\n};\n\n/**\n * RefinerToggle component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nexport const RefinerModalToggleFunctionalComponent: React.FC<IRefinerModalToggleProps> = (props: IRefinerModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n <button id={id} className={componentModalToggleClassName} aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\n {text}\n </button>\n );\n};\n\n/**\n * RefinerModal component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerModalFunctionalComponent: React.FC<IRefinerModalProps> = (props: IRefinerModalProps) => {\n return (\n <>\n {React.cloneElement(\n modalNode(props),\n {},\n modalHeaderNode(props),\n <ModalBody className={modalContentClassName}>\n <div className={modalContentWrapperClassName}>\n <div className={modalContentWrapper2ClassName}>\n {props.refinerSortProps && <RefinerSortComponent {...props.refinerSortProps} />}\n {props.refinerOptions &&\n props.refinerOptions.map((item, index) => <React.Fragment key={index}>{item}</React.Fragment>)}\n </div>\n </div>\n </ModalBody>,\n modalFooterNode(props)\n )}\n </>\n );\n};\n\n/**\n * RefinerModalToggle component.\n */\nexport const RefinerModalToggleComponent: React.FunctionComponent<IRefinerModalToggleProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error -- Required for this signature.\n IRefinerModalToggleComponent\n>('Refiner-Modal-Toggle', {\n component: React.memo(RefinerModalToggleFunctionalComponent)\n});\n\n/**\n * RefinerModal component.\n */\nexport const RefinerModalComponent: React.FunctionComponent<IRefinerModalProps> = msdyn365Commerce.createComponent<IRefinerModalComponent>(\n 'Refiner-Modal',\n {\n component: React.memo(RefinerModalFunctionalComponent)\n }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, IComponent, IComponentProps, ICoreContext, IGeneric, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Button, ITelemetryContent, Collapse } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport classnames from 'classnames';\n\nimport { IRefinerItemDateRangeProps, RefinerItemDateRangeComponent } from './refiner-item-daterange.component';\nimport { IRefinerItemCheckProps, RefinerItemCheckComponent } from './refiner-item-check.component';\nimport {\n IRefinerItemData,\n IRefinerItemToggleNotification,\n IRefinerOptionsData,\n RefinerItemType,\n RefinerOptionsType,\n isMatchingRefinementCriterion\n} from './common';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention -- This is the standard rule for naming a constant.\nconst DEFAULT_REFINER_OPTIONS_EXPAND_TIMEOUT = 350;\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-options';\nconst expandedClassName = `${componentClassName}__toggle_expanded`;\nconst collapsedClassName = `${componentClassName}__toggle_collapsed`;\nconst listClassName = `${componentClassName}__list`;\nconst listItemClassName = `${componentClassName}__list-item`;\n\n/**\n * IRefinerOptionsComponent interface.\n */\ninterface IRefinerOptionsComponent extends IComponent<IRefinerOptionsProps> {}\n\n/**\n * IRefinerOptionsProps interface.\n */\nexport interface IRefinerOptionsProps extends IComponentProps<IRefinerOptionsData> {\n context: ICoreContext<IGeneric<IAny>>;\n className: string;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n expandTimeout?: number;\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notification: IRefinerItemToggleNotification): void;\n}\n\n/**\n * RefinerOptions component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerOptionsFunctionalComponent: React.FC<IRefinerOptionsProps> = (props: IRefinerOptionsProps) => {\n const {\n className,\n context,\n id: moduleId,\n typeName,\n data,\n isDisabled,\n isExpandedOnInitialLoad,\n expandTimeout,\n telemetryContent,\n onUpdateRefiners\n } = props;\n\n const [shouldRefinerExpand, setShouldRefinerExpand] = React.useState(isExpandedOnInitialLoad);\n const [isRefinerExpanded, setIsRefinerExpanded] = React.useState(false);\n\n const onEntering = React.useCallback(() => {\n setIsRefinerExpanded(!isRefinerExpanded);\n }, [isRefinerExpanded]);\n\n const onToggleRefinerOptions = React.useCallback(() => {\n setShouldRefinerExpand(!shouldRefinerExpand);\n }, [shouldRefinerExpand]);\n\n const onClickRefinerItem = React.useCallback(\n (selectedRefinerItem: IRefinerItemData) => () => {\n onUpdateRefiners({\n refinerOptionsData: data,\n refinerItemData: selectedRefinerItem,\n isSelecting: !selectedRefinerItem.isChecked\n });\n },\n [onUpdateRefiners, data]\n );\n\n const onMinValueUpdate = React.useCallback(\n (selectedRefinerItem: IRefinerItemData) => (updatedMin: string) => {\n onUpdateRefiners({\n refinerOptionsData: data,\n refinerItemData: selectedRefinerItem,\n isSelecting: true,\n rangeStart: updatedMin\n });\n },\n [onUpdateRefiners, data]\n );\n\n const onMaxValueUpdate = React.useCallback(\n (selectedRefinerItem: IRefinerItemData) => (updatedMax: string) => {\n onUpdateRefiners({\n refinerOptionsData: data,\n refinerItemData: selectedRefinerItem,\n isSelecting: true,\n rangeEnd: updatedMax\n });\n },\n [onUpdateRefiners, data]\n );\n\n /**\n * Renders RefinerItem components.\n * @param refineItems - Contains the refiner items.\n * @returns - Refiner item components.\n */\n const renderRefinerItems = (refinerItems: IRefinerItemData[]) => {\n return refinerItems.map((refinerItem, index) => {\n const isSingleSelectValue = data.typeValue === RefinerOptionsType.SingleSelect;\n const selectedItem = data.selectedRefinerItems.find((selectedItem: IRefinerItemData) =>\n isMatchingRefinementCriterion(refinerItem, selectedItem)\n );\n\n refinerItem.isChecked = !!selectedItem;\n refinerItem.minValue = selectedItem?.minValue;\n refinerItem.maxValue = selectedItem?.maxValue;\n\n const refinerItemCheckProps = {\n context: context,\n id: moduleId,\n typeName: typeName,\n data: refinerItem,\n label: refinerItem.label ?? '',\n ariaLabel: refinerItem.label ?? '',\n isChecked: refinerItem.isChecked,\n isSingleSelect: isSingleSelectValue,\n isDisabled: isDisabled,\n telemetryContent: telemetryContent,\n onClick: onClickRefinerItem(refinerItem)\n } as IRefinerItemCheckProps;\n\n switch (refinerItem.itemType) {\n case RefinerItemType.DateRange:\n const refinerDataRangeProps = {\n context: context,\n id: moduleId,\n typeName: typeName,\n data: refinerItem,\n minInputLabel: refinerItem.minLabel ?? '',\n maxInputLabel: refinerItem.maxLabel ?? '',\n minInputAriaLabel: refinerItem.minLabel ?? '',\n maxInputAriaLabel: refinerItem.maxLabel ?? '',\n minRangeValue: refinerItem.minValue,\n maxRangeValue: refinerItem.maxValue,\n isDisabled: isDisabled,\n onBlurMinInput: onMinValueUpdate(refinerItem),\n onBlurMaxInput: onMaxValueUpdate(refinerItem)\n } as IRefinerItemDateRangeProps;\n\n return (\n <li className={listItemClassName} id={`${refinerItem.label}_${index}`} key={refinerItem.refinerItemId}>\n <RefinerItemCheckComponent {...refinerItemCheckProps} />\n {refinerItem.isChecked && <RefinerItemDateRangeComponent {...refinerDataRangeProps} />}\n </li>\n );\n default:\n return (\n <li className={listItemClassName} id={`${refinerItem.label}_${index}`} key={refinerItem.refinerItemId}>\n <RefinerItemCheckComponent {...refinerItemCheckProps} />\n </li>\n );\n }\n });\n };\n\n return (\n <div className={classnames(className, componentClassName, 'list-group', data.name ?? '')} key={data.name}>\n <Button\n className={shouldRefinerExpand ? expandedClassName : collapsedClassName}\n aria-label={data.name}\n aria-expanded={shouldRefinerExpand}\n onClick={onToggleRefinerOptions}\n >\n {data.name}\n </Button>\n <Collapse\n isOpen={shouldRefinerExpand}\n onEntering={onEntering}\n timeout={expandTimeout ?? DEFAULT_REFINER_OPTIONS_EXPAND_TIMEOUT}\n >\n <ul className={classnames(listClassName, data.name ?? '')} aria-label={data.name}>\n {renderRefinerItems(data.refinerItems)}\n </ul>\n </Collapse>\n </div>\n );\n};\n\n/**\n * RefinerOptions component.\n */\nexport const RefinerOptionsComponent: React.FunctionComponent<IRefinerOptionsProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error -- Required for this signature.\n IRefinerOptionsComponent\n>('Refiner-Options', {\n component: React.memo(RefinerOptionsFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\nimport { IRefinerHeaderProps, RefinerHeaderComponent } from './refiner-header.component';\nimport { RefinerChoiceSummaryComponent } from './refiner-choice-summary.component';\nimport { IRefinerFooterProps, RefinerFooterComponent } from './refiner-footer.component';\nimport {\n IRefinerModalProps,\n IRefinerModalToggleProps,\n RefinerModalComponent,\n RefinerModalToggleComponent\n} from './refiner-modal.component';\n\n/**\n * Class names used in component\n */\nconst componentClassName: string = 'msc-refiner';\nconst refinerContentWrapperClassName: string = `${componentClassName}__wrapper`;\nconst refinerOptionsWrapperClassName: string = `${componentClassName}__wrapper-internal`;\nconst modalToggleWrapperClassName: string = `${componentClassName}__wrapper-refiner-modal-toggle`;\nconst modalToggleMoreActionsWrapperClassName = `${modalToggleWrapperClassName}__wrapper-more-actions`;\nconst modalToggleExtraActionsWrapperClassName = `${modalToggleWrapperClassName}__wrapper-extra-actions`;\n\n/**\n * IRefinerComponent interface.\n */\ninterface IRefinerComponent extends IComponent<IRefinerProps> {}\n\n/**\n * IRefinerProps interface.\n */\nexport interface IRefinerProps extends IComponentProps<{}> {\n className?: string;\n refinerModalToggleProps?: IRefinerModalToggleProps;\n refinerModalProps?: IRefinerModalProps;\n refinerHeaderProps?: IRefinerHeaderProps;\n refinerFooterProps?: IRefinerFooterProps;\n refinerOptions?: React.ReactNode[];\n isMobileView?: boolean;\n isExpanded?: boolean;\n}\n\nfunction createComponentInMobileView(props: IRefinerProps): React.ReactNode {\n const refinerChoiceSummaryProps = props.refinerHeaderProps?.refinerChoiceSummaryProps;\n\n return (\n <>\n {refinerChoiceSummaryProps && <RefinerChoiceSummaryComponent {...refinerChoiceSummaryProps} />}\n {props.refinerModalToggleProps && (\n <div className={modalToggleWrapperClassName}>\n <RefinerModalToggleComponent {...props.refinerModalToggleProps} />\n <div className={modalToggleMoreActionsWrapperClassName}>\n {props.refinerHeaderProps?.extraActions && (\n <div className={modalToggleExtraActionsWrapperClassName}>{props.refinerHeaderProps.extraActions}</div>\n )}\n </div>\n </div>\n )}\n {props.refinerModalProps && <RefinerModalComponent {...props.refinerModalProps} />}\n </>\n );\n}\n\nfunction createComponentInDesktopView(props: IRefinerProps): React.ReactNode {\n const { refinerOptions, isExpanded } = props;\n\n return (\n <>\n {props.refinerHeaderProps && <RefinerHeaderComponent {...props.refinerHeaderProps} />}\n\n {refinerOptions && ArrayExtensions.hasElements(refinerOptions) && isExpanded && (\n <Node className={refinerContentWrapperClassName}>\n <Node className={refinerOptionsWrapperClassName}>\n {refinerOptions.map((item, index) => (\n <React.Fragment key={index}>{item}</React.Fragment>\n ))}\n </Node>\n\n {props.refinerFooterProps && refinerOptions && ArrayExtensions.hasElements(refinerOptions) && isExpanded && (\n <RefinerFooterComponent {...props.refinerFooterProps} />\n )}\n </Node>\n )}\n </>\n );\n}\n\n/**\n * Refiner component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerFunctionalComponent: React.FC<IRefinerProps> = (props: IRefinerProps) => {\n const renderMobile = props.isMobileView && props.refinerModalProps;\n\n return (\n <Node className={classnames(props.className, componentClassName)}>\n {renderMobile && createComponentInMobileView(props)}\n {!renderMobile && createComponentInDesktopView(props)}\n </Node>\n );\n};\n\n/**\n * Refiner component.\n */\nexport const RefinerComponent: React.FunctionComponent<IRefinerProps> = msdyn365Commerce.createComponent<IRefinerComponent>('Refiner', {\n component: React.memo(RefinerFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n Button,\n ITelemetryContent,\n TelemetryConstant,\n getPayloadObject,\n getTelemetryAttributes\n} from '@msdyn365-commerce-modules/utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\nimport classnames from 'classnames';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-search-bar';\nconst filterOptionsClassName = `${componentClassName}__search-options`;\nconst filterOptionClassName = `${componentClassName}__search-option`;\nconst filterOptionSelectedClassName = `${componentClassName}__search-option-selected`;\nconst searchBarClassName = `${componentClassName}__search-text`;\nconst buttonClassName = `${componentClassName}__search-button`;\n\n/**\n * ISearchBarComponent interface.\n */\ninterface ISearchBarComponent extends IComponent<ISearchBarProps> {}\n\n/**\n * ISearchBarResources interface.\n */\nexport interface ISearchBarResources {\n searchOptionsAriaLabel?: string;\n searchBarPlaceholder?: string;\n searchBarAriaLabel?: string;\n searchButtonLabel?: string;\n searchButtonAriaLabel?: string;\n}\n\n/**\n * ISearchBarData interface.\n */\nexport interface ISearchBarData {\n options: ISearchBarOption[];\n}\n\n/**\n * ISearchBarOption interface.\n */\nexport interface ISearchBarOption {\n label: string;\n value: string;\n}\n\n/**\n * ISearchBarProps interface.\n */\nexport interface ISearchBarProps extends IComponentProps<ISearchBarData> {\n className?: string;\n resources?: ISearchBarResources;\n currentSearchOption?: ISearchBarOption;\n currentSearchText?: string;\n telemetryContent?: ITelemetryContent;\n clearSearchTextOnOptionChange?: boolean;\n onSelectOption?(newSearchOption?: ISearchBarOption): void;\n onChange?(searchOption?: ISearchBarOption, searchText?: string): void;\n onBlur?(searchOption?: ISearchBarOption, searchText?: string): void;\n onClick?(searchOption?: ISearchBarOption, searchText?: string): void;\n}\n\n/**\n * SearchBar component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst SearchBarFunctionalComponent: React.FC<ISearchBarProps> = (props: ISearchBarProps) => {\n const [searchOptionState, setSearchOptionState] = React.useState(props.currentSearchOption);\n const [searchTextState, setSearchTextState] = React.useState(props.currentSearchText);\n\n const onSelectOptionHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const value = event.currentTarget.value;\n const searchOption = props.data.options?.find((option: ISearchBarOption) => option.value === value);\n setSearchOptionState(searchOption);\n if (props.clearSearchTextOnOptionChange) {\n setSearchTextState('');\n }\n props.onSelectOption?.(searchOption);\n };\n\n const onChangeHandler = (event: React.FocusEvent<HTMLInputElement>): void => {\n const value = event.currentTarget.value;\n setSearchTextState(value);\n props.onChange?.(searchOptionState, value);\n };\n\n const onBlurHandler = (event: React.FocusEvent<HTMLInputElement>) => {\n const value = event.currentTarget.value;\n setSearchTextState(value);\n props.onBlur?.(searchOptionState, value);\n };\n\n const onClickHandler = () => {\n props.onClick?.(searchOptionState, searchTextState);\n };\n\n // define telemetry attributes\n const searchButtonAttributes = getTelemetryAttributes(\n props.telemetryContent!,\n getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Search)\n );\n\n return (\n <div className={classnames(props.className, componentClassName)}>\n {ArrayExtensions.hasElements(props.data.options) && (\n <select\n className={filterOptionsClassName}\n title={props.resources?.searchOptionsAriaLabel}\n aria-label={props.resources?.searchOptionsAriaLabel}\n onChange={onSelectOptionHandler}\n >\n {props.data.options?.map((option: ISearchBarOption) => {\n return (\n <option\n key={option.value}\n value={option.value}\n aria-label={option.label}\n aria-selected={option.value === searchOptionState?.value}\n className={classnames(\n filterOptionClassName,\n option.value === searchOptionState?.value ? filterOptionSelectedClassName : ''\n )}\n >\n {option.label}\n </option>\n );\n })}\n </select>\n )}\n <input\n type='text'\n className={classnames(searchBarClassName, ArrayExtensions.hasElements(props.data.options) ? '' : 'full-width')}\n placeholder={props.resources?.searchBarPlaceholder}\n title={props.resources?.searchBarAriaLabel}\n aria-label={props.resources?.searchBarAriaLabel}\n value={searchTextState}\n onChange={onChangeHandler}\n onBlur={onBlurHandler}\n />\n <Button\n className={buttonClassName}\n aria-label={props.resources?.searchButtonAriaLabel ?? props.resources?.searchButtonLabel}\n title={props.resources?.searchButtonAriaLabel ?? props.resources?.searchButtonLabel}\n onClick={onClickHandler}\n {...searchButtonAttributes}\n >\n {props.resources?.searchButtonLabel}\n </Button>\n </div>\n );\n};\n\n/**\n * SearchBar component.\n */\nexport const SearchBarComponent: React.FunctionComponent<ISearchBarProps> = msdyn365Commerce.createComponent<ISearchBarComponent>(\n 'SearchBarComponent',\n { component: SearchBarFunctionalComponent }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React, { ReactElement } from 'react';\n\nimport classnames from 'classnames';\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-table';\nconst headerClassName = `${componentClassName}__header`;\nconst headerRowClassName = `${componentClassName}__header-row`;\nconst headerCellClassName = `${componentClassName}__header-cell`;\nconst rowClassName = `${componentClassName}__row`;\nconst rowCellClassName = `${componentClassName}__row-cell`;\n\n/**\n * Table cell content type.\n */\nexport enum TableCellContentType {\n Text = 'text',\n Number = 'number',\n Amount = 'amount',\n Date = 'date'\n}\n\n/**\n * ITableComponent interface.\n */\ninterface ITableComponent extends IComponent<ITableProps> {}\n\n/**\n * ITableHeaderComponent interface.\n */\ninterface ITableHeaderComponent extends IComponent<ITableHeaderProps> {}\n\n/**\n * ITableRowComponent interface.\n */\ninterface ITableRowComponent extends IComponent<ITableRowProps> {}\n\n/**\n * ITableProps interface.\n */\nexport interface ITableProps extends IComponentProps<{}> {\n className?: string;\n children?: React.ReactNode | React.ReactNode[];\n}\n\n/**\n * ITableHeaderProps interface.\n */\nexport interface ITableHeaderProps extends IComponentProps<{}> {\n className?: string;\n isVisible?: boolean;\n children?: ReactElement<ITableCellProps> | ReactElement<ITableCellProps>[];\n}\n\n/**\n * ITableRowProps interface.\n */\nexport interface ITableRowProps extends IComponentProps<{}> {\n className?: string;\n isVisible?: boolean;\n children?: ReactElement<ITableCellProps> | ReactElement<ITableCellProps>[];\n}\n\n/**\n * ITableCellProps interface.\n */\nexport interface ITableCellProps extends IComponentProps<{}> {\n className?: string;\n isVisible?: boolean;\n children?: React.ReactNode;\n contentType: TableCellContentType;\n}\n\n/**\n * TableHeader component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst TableHeaderFunctionalComponent: React.FC<ITableHeaderProps> = (props: ITableHeaderProps) => {\n const isVisible = props.isVisible ?? true;\n if (!isVisible) {\n return <></>;\n }\n\n let children = props.children ?? [];\n children = Array.isArray(children) ? children : [children];\n\n return (\n <thead className={classnames(props.className, headerClassName)}>\n <tr className={headerRowClassName}>\n {ArrayExtensions.hasElements(children) &&\n children.map((child, index) => {\n const childIsVisible = child.props.isVisible ?? true;\n return (\n childIsVisible && (\n <th key={index} className={classnames(child.props.className, headerCellClassName, child.props.contentType)}>\n {child.props.children}\n </th>\n )\n );\n })}\n </tr>\n </thead>\n );\n};\n\n/**\n * TableHeader component.\n */\nexport const TableHeaderComponent: React.FunctionComponent<ITableHeaderProps> = msdyn365Commerce.createComponent<ITableHeaderComponent>(\n 'TableHeaderComponent',\n { component: TableHeaderFunctionalComponent }\n);\n\n/**\n * TableRow component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst TableRowFunctionalComponent: React.FC<ITableRowProps> = (props: ITableRowProps) => {\n const isVisible = props.isVisible ?? true;\n if (!isVisible) {\n return <></>;\n }\n\n let children = props.children ?? [];\n children = Array.isArray(children) ? children : [children];\n\n return (\n <tr className={classnames(props.className, rowClassName)}>\n {ArrayExtensions.hasElements(children) &&\n children.map((child, index) => {\n const childIsVisible = child.props.isVisible ?? true;\n return (\n childIsVisible && (\n <td key={index} className={classnames(child.props.className, rowCellClassName, child.props.contentType)}>\n {child.props.children}\n </td>\n )\n );\n })}\n </tr>\n );\n};\n\n/**\n * TableRow component.\n */\nexport const TableRowComponent: React.FunctionComponent<ITableRowProps> = msdyn365Commerce.createComponent<ITableRowComponent>(\n 'TableRowComponent',\n { component: TableRowFunctionalComponent }\n);\n\n/**\n * TableCell component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst TableCellFunctionalComponent: React.FC<ITableCellProps> = (props: ITableCellProps) => {\n return <>{props.children}</>;\n};\n\n/**\n * TableCell component.\n */\nexport const TableCellComponent: React.FunctionComponent<ITableCellProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error -- Required for this signature.\n ITableCellComponent\n>('TableCellComponent', { component: TableCellFunctionalComponent });\n\n/**\n * Table component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst TableFunctionalComponent: React.FC<ITableProps> = (props: ITableProps) => {\n return <table className={classnames(props.className, componentClassName)}>{props.children}</table>;\n};\n\n/**\n * Table component.\n */\nexport const TableComponent: React.FunctionComponent<ITableProps> = msdyn365Commerce.createComponent<ITableComponent>('TableComponent', {\n component: TableFunctionalComponent\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getUrlSync, IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick,\n UncontrolledTooltip\n} from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport * as React from 'react';\n\nexport interface IWishlistIconComponentProps extends IComponentProps<{}> {\n className?: string;\n wishlistTooltipText: string;\n showButtonTooltip?: boolean;\n telemetryContent?: ITelemetryContent;\n wishlistCountLabel?: string;\n wishlistCount?: number;\n isDispayWishlistCount?: boolean;\n}\n\nexport interface IWishlistIconComponent extends IComponent<IWishlistIconComponentProps> {}\n\nconst WishlistIconComponentActions = {};\n\n/**\n * WishlistIcon component.\n * @param props\n * @extends {React.PureComponent<IWishlistIconProps>}\n */\nconst WishlistIcon: React.FC<IWishlistIconComponentProps> = (props: IWishlistIconComponentProps) => {\n const wishlistIconRef: React.RefObject<HTMLButtonElement> = React.createRef();\n const text = props.wishlistTooltipText;\n const showButtonIconTooltip = props.showButtonTooltip;\n const wishlistUrl = getUrlSync('wishlist', props.context.actionContext);\n const signInUrl = `${props.context.request.user.signInUrl}?ru=${wishlistUrl}`;\n const url = props.context.request.user.isAuthenticated ? wishlistUrl : signInUrl;\n const showTooltip = showButtonIconTooltip !== undefined ? showButtonIconTooltip : true;\n const shouldShowCount = props.isDispayWishlistCount !== undefined ? props.isDispayWishlistCount : false;\n const wishlistCountlbl = props.wishlistCountLabel !== undefined ? props.wishlistCountLabel : '';\n const wishlistItemCount = props.wishlistCount !== undefined ? props.wishlistCount : '';\n const countLabel = format(wishlistCountlbl, wishlistItemCount);\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', props.telemetryContent!, text, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n <>\n <Button\n className={classname('msc-wishlist-icon', props.className)}\n href={url}\n aria-label={text}\n innerRef={wishlistIconRef}\n {...attributes}\n onClick={onTelemetryClick(props.telemetryContent!, payLoad, text)}\n >\n {shouldShowCount && <div className='msc-wishlist-icon__count'>{countLabel}</div>}\n <span className='msc-wishlist-icon__text'>{text}</span>\n </Button>\n {showTooltip && (\n <UncontrolledTooltip trigger='hover focus' target={wishlistIconRef}>\n {text}\n </UncontrolledTooltip>\n )}\n </>\n );\n};\n\nexport const WishListIconComponent: React.FunctionComponent<IWishlistIconComponentProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error\n IWishlistIconComponent\n>('WishListIcon', { component: WishlistIcon, ...WishlistIconComponentActions });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Player Options Interface.\n */\nexport interface IPlayerOptions {\n autoplay?: boolean;\n mute?: boolean;\n loop?: boolean;\n playPauseTrigger?: boolean;\n controls?: boolean;\n maskLevel?: number;\n market?: string;\n playbackSpeed?: boolean;\n download?: boolean;\n playFullScreen?: boolean;\n hidePosterFrame?: boolean;\n autoCaptions?: string;\n flexSize?: boolean;\n aspectRatio?: number;\n userMinimumAge?: number;\n showEndImage?: boolean;\n showImageForVideoError?: boolean;\n inviewPlay?: boolean;\n inviewThreshold?: number;\n inViewWidthFraction?: number;\n inViewHeightFraction?: number;\n controlPanelTimeout?: number;\n thumbnailFullWidth?: boolean;\n ageGate?: boolean;\n lazyLoad?: boolean;\n mobileVideoQuality?: MobileVideoQuality;\n shouldDisableAutoPlayOnMobile?: boolean;\n isMobileDevice?: boolean;\n}\n\n/**\n * Mobile video quality.\n */\nexport enum MobileVideoQuality {\n hdx = 'hdx',\n hq = 'hq',\n sd = 'sd',\n lo = 'lo'\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n getCatalogId,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGridSettings,\n IImageData,\n IImageProps,\n IImageSettings,\n Image,\n IRequestContext,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport {\n ArrayExtensions,\n checkIfShouldDisplayAsSwatch,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionSwatchDisplayTypes,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { IPriceComponentResources, PriceComponent } from '../price/price.components';\nimport { ISwatchItem } from '../product-dimension';\nimport { RatingComponent } from '../rating/rating.component';\nimport { ProductComponentV2SwatchComponent } from './components';\nimport { IAttributeSwatch, IProductDimension, IProductSearchResult } from './interface';\n\n/**\n * Product component props interface.\n */\nexport interface IProductComponentV2Props extends IComponentProps<{ product?: IProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n isAllowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n inventoryLabel?: string;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\n/**\n * Product component interface.\n */\nexport interface IProductComponentV2 extends IComponent<IProductComponentV2Props> {}\n\nconst priceComponentActions = {};\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: IProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Product for the product component.\n * @param props - Product props.\n * @returns React element.\n */\nconst ProductCardV2: React.FC<IProductComponentV2Props> = (props: IProductComponentV2Props) => {\n const {\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n isAllowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n inventoryLabel,\n isPriceMinMaxEnabled,\n priceResources,\n dimensionAvailabilities,\n swatchItemAriaLabel\n } = props;\n const product = data.product;\n\n /**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n }\n\n /**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\n function getDefaultColorSwatchSelected(productData?: IProductSearchResult): IAttributeSwatch | null {\n if (!productData || !productData.attributeValues) {\n return null;\n }\n\n const colorAttribute = productData.attributeValues.find(\n attributeValue => attributeValue.keyName?.toLocaleLowerCase() === DimensionTypes.color\n );\n if (!ArrayExtensions.hasElements(colorAttribute?.swatches)) {\n return null;\n }\n\n const defaultSwatch = colorAttribute!.swatches.find(item => item.isDefault === true) ?? colorAttribute!.swatches[0];\n return defaultSwatch;\n }\n\n /**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: IProductSearchResult): string | undefined {\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productData?.primaryImageUrl;\n }\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.productImageUrls)\n ? generateImageUrl(defaultSwatch.productImageUrls[0], coreContext.request.apiSettings)\n : productData?.primaryImageUrl;\n }\n\n /**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\n function getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: IProductSearchResult\n ): string | undefined {\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productUrl;\n }\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n if (!defaultSwatch || !defaultSwatch.swatchValue) {\n return productUrl;\n }\n\n const queryString = `color=${defaultSwatch.swatchValue}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n }\n\n let productUrl = product ? getProductPageUrlSync(product.name ?? '', product.recordId, context.actionContext, undefined) : '';\n if (isAllowBack && productUrl) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.primaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === DimensionTypes.color) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n const swatchItems = ArrayExtensions.validValues(\n product.attributeValues?.map(item => {\n const dimensionTypeValue = item.keyName?.toLocaleLowerCase() ?? '';\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(\n dimensionTypeValue as DimensionTypes,\n context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n );\n if (!shouldDisplayAsSwatch) {\n return null;\n }\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.swatches?.map<ISwatchItem>(swatchItem => {\n return {\n itemId: `${item.recordId ?? ''}-${dimensionTypeValue}-${swatchItem.swatchValue ?? ''}`,\n value: swatchItem.swatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.swatchColorHexCode,\n imageUrl: swatchItem.swatchImageUrl,\n productImageUrls: swatchItem.productImageUrls,\n isDefault: swatchItem.isDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.swatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionToPreSelectInProductCard !== DimensionTypes.none &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault) &&\n dimensionType === DimensionTypes.color\n ) {\n swatches[0].isDefault = true;\n }\n return { recordId: item.recordId, swatches };\n })\n );\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.recordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n /**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n <div className='msc-product__unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n }\n\n /**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n <div className='msc-product__availability'>\n <span>{inventoryAvailabilityLabel}</span>\n </div>\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(): JSX.Element | null {\n if (!ArrayExtensions.hasElements(swatchItems)) {\n return null;\n }\n\n return (\n <div className='msc-product__dimensions'>\n {swatchItems.map(item => {\n return (\n <ProductComponentV2SwatchComponent\n key={item.recordId}\n context={context}\n onSelectDimension={updatePageAndImageUrl}\n swatches={item.swatches}\n />\n );\n })}\n </div>\n );\n }\n\n /**\n * Gets the react node for product description.\n * @param quickview - Quick view node.\n * @param item - Product id to de displayed in quickview.\n * @returns The product quickview component.\n */\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: IProductDimension[] = selectedSwatchItems.getValues().map<IProductDimension>(swatches => {\n return {\n dimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n DimensionValue: {\n RecordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n /**\n * Gets the aria label for rating.\n * @param rating - Product rating.\n * @param ratingAriaLabelText - Aria label format for rating.\n * @returns The product rating aria label string.\n */\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\n if (rating && ratingAriaLabelText) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabelText || '', roundedRating, '5');\n }\n return '';\n }\n\n /**\n * Gets the aria label for review count.\n * @param reviewCount - Product review count.\n * @param ratingCountAriaLabelText - Aria label format for review.\n * @returns The product review count aria label string.\n */\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n }\n\n /**\n * Gets the aria label string for product that includes product name with its price and rating.\n * @param name - Product name.\n * @param price - Product price.\n * @param rating - Product rating.\n * @param ratingAriaLabelText - Rating aria label text.\n * @param reviewCount - Product review count.\n * @param ratingCountAriaLabelText - Number of ratings.\n * @returns The aria label string for the product card.\n */\n function renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string,\n availability?: string\n ): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n } ${availability ?? ''}`;\n }\n\n /**\n * Gets the react component for product rating.\n * @param productCardimageSettings - Module image settings for product card.\n * @param gridSettings - Grid settings defined in theme.\n * @param imageUrl - Image url.\n * @param fallbackImageUrl - Fallback url for imge.\n * @param altText - Image Alt text.\n * @param requestContext - Request context using the component.\n * @returns React component for product image.\n */\n function renderProductPlacementImage(\n productCardimageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n requestContext?: IRequestContext\n ): JSX.Element | null {\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = context.app.config.placeholderImageName as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const image: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps: IImageProps = { gridSettings };\n\n imageProps.gridSettings = gridSettings;\n imageProps.imageSettings = productCardimageSettings;\n imageProps.imageSettings.cropFocalRegion = true;\n return <Image {...image} {...imageProps} loadFailureBehavior='empty' requestContext={requestContext} bypassHideOnFailure />;\n }\n\n /**\n * Gets the react component for product rating.\n * @param coreContext - Context of the module using the component.\n * @param moduleTypeName - Module type name.\n * @param moduleId - Module id using the component.\n * @param productBasePrice - Product base price.\n * @param adjustedProductPrice - Product adjusted price.\n * @param maxVariantProductPrice - Product variant max price.\n * @param minVariantPrice - Product variant min price.\n * @param savingsPriceResourceText - Product price saving text.\n * @param freePriceResourceText - Product price free text.\n * @param originalPriceResourceText - Product price original text.\n * @param currentPriceResourceText - Product price current text.\n * @returns React component for Product price.\n */\n function renderPrice(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n productBasePrice?: number,\n adjustedProductPrice?: number,\n maxVariantProductPrice?: number,\n minVariantPrice?: number,\n savingsPriceResourceText?: string,\n freePriceResourceText?: string,\n originalPriceResourceText?: string,\n currentPriceResourceText?: string\n ): JSX.Element | null {\n const price = {\n BasePrice: productBasePrice,\n AdjustedPrice: adjustedProductPrice,\n CustomerContextualPrice: adjustedProductPrice,\n MaxVariantPrice: maxVariantProductPrice ? maxVariantProductPrice : adjustedProductPrice,\n MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedProductPrice\n };\n\n const channelConfig = coreContext.request.channel;\n return (\n <PriceComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n savingsText={savingsPriceResourceText}\n freePriceText={freePriceResourceText}\n originalPriceText={originalPriceResourceText}\n currentPriceText={currentPriceResourceText}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n currencyCode={channelConfig?.Currency}\n />\n );\n }\n\n /**\n * Gets the react node for product description.\n * @param description - Product description.\n * @returns The product description component.\n */\n function renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-product__text'>{description}</p>;\n }\n\n /**\n * Gets the react component for product rating.\n * @param coreContext - Context of the module using the component.\n * @param moduleTypeName - Module type name.\n * @param moduleId - Module id using the component.\n * @param avgRating - Average rating.\n * @param totalRatings - Total rating.\n * @param ariaLabel - Aria label for rating.\n * @returns React component for Product rating.\n */\n function renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string\n ): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() ?? undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n <RatingComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabelText}\n ratingCountAriaLabel={ratingCountAriaLabelText}\n data={{}}\n />\n );\n }\n\n return (\n <>\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.name!)}\n aria-label={renderLabel(\n product.name,\n context.cultureFormatter.formatCurrency(product.price),\n product.averageRating,\n ratingAriaLabel,\n product.totalRatings,\n ratingCountAriaLabel,\n inventoryLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.primaryImageUrl,\n product.name,\n context.actionContext.requestContext\n )}\n </div>\n <div className='msc-product__title'>{product.name}</div>\n </a>\n {renderProductDimensions()}\n <div className='msc-product__details'>\n {renderPrice(\n context,\n typeName,\n id,\n product.basePrice,\n product.price,\n product.maxVariantPrice,\n product.minVariantPrice,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.defaultUnitOfMeasure)}\n {renderDescription(product.description)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.averageRating, product.totalRatings, ratingAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n </div>\n {quickViewButton && renderQuickView(quickViewButton, product.recordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n </>\n );\n};\n\n/**\n * Export product component interface.\n */\nexport const ProductComponentV2: React.FunctionComponent<IProductComponentV2Props> = msdyn365Commerce.createComponent<IProductComponentV2>(\n 'ProductV2',\n { component: ProductCardV2, ...priceComponentActions }\n);\n"],"names":["ScriptInjector","React","constructor","props","super","render","config","this","_debug","id","typeName","placeHolderPropsRegEx","RegExp","placeHolders","originalSource","scriptSource","resolvedSource","hasMorePlaceHolders","exec","length","_resolvePlaceHolder","MsDyn365","_isUrl","src","async","defer","loadPoint","dangerouslySetInnerHTML","__html","debugMessage","telemetry","log","LogLevel","Debug","source","test","placeHolderToken","placeHolderTokens","split","propertyContext","propertyName","replace","context","request","user","query","KeyCodes","format","formatSpecifier","_len","arguments","parameters","Array","_key","match","index","value","toString","isNullOrWhiteSpace","trim","startsWith","prefix","ignoreCase","undefined","toLocaleLowerCase","getText","element","textContent","addClass","cssClass","classList","contains","className","includes","hasClass","add","nodeListToArray","nodeList","elements","n","push","selectElements","selector","selectElementsT","currentContext","document","getElementsByClassName","slice","querySelectorAll","querySelector","getElementsByTagName","css","property","style","getComputedStyle","removeInnerHtml","parentElement","innerHTML","selectFirstElement","elementsSelected","PlayerUtility","static","url","done","failed","ajaxRequest","window","XDomainRequest","addEventListener","responseText","_removeFromPendingAjaxRequests","pendingAjaxRequests","XMLHttpRequest","onreadystatechange","readyState","result","status","ontimeout","open","send","obj","i","splice","createElement","extend","recursive","target","paramIndex","key","Object","keys","hasOwnProperty","isSourceArray","isArray","call","isTargetArray","isSourceObject","isTargetObject","arrayIndex","entries","getDimensions","containerElement","width","clientWidth","height","clientHeight","isSafari","navigator","vendor","userAgent","getOriginalPrice","_c","_b","_a","data","price","AdjustedPrice","TradeAgreementPrice","BasePrice","formatCurrency","shouldUseFreePriceText","currencyCode","freePriceText","cultureFormatter","showPriceRangeForMasterProduct","isPriceMinMaxEnabled","product","ProductTypeValue","ProductType","Master","KitMaster","MinVariantPrice","MaxVariantPrice","renderCurrentPrice","maxVariantPrice","minVariantPrice","itemProp","priceResources","priceRangeSeparator","CustomerContextualPrice","getActivePrice","PriceComponent","msdyn365Commerce","createComponent","__assign","component","isSalesAgreementPriceFeatureEnabled","SalesAgreementPrice","_d","__read","isExpanded_1","setIsExpanded_1","classnames","Button","salesAgreementPricePrompt","onClick","tabIndex","firstPriceLine","AttainablePriceLines","salesAgreementExpirationDatePrompt","formatDate","EffectiveDate","ExpirationDate","_e","salesAgreementCommittedQuantityPrompt","CommittedQuantity","_g","_f","salesAgreementRemainingQuantityPrompt","RemainingQuantity","renderSalesAgreementDetail","originalSalesPrice","activeSalesPrice","showStrikethroughPricing","initialPrice","originalPriceText","currentPriceText","savingsText","renderCurrentPriceWithOriginalPrice","OrderTemplateProductsPreviewComponent","products","imageSettings","renderOrderTemplateImages","renderOrderTemplateImage","Image","requestContext","actionContext","ProductDetails","PrimaryImageUrl","fallBackSrc","getFallbackImageUrl","ItemId","apiSettings","app","OmniChannelMedia","gridSettings","viewports","xs","q","w","h","lg","xl","lazyload","loadFailureBehavior","altText","Name","ccCultureLocStrings","ccLanguageCodes","PlayerLocKeys","LocalizationConstants","playVideoAriaLabel","playAriaLabel","pauseAriaLabel","closeAriaLabel","optionAriaLabel","muteAriaLabel","unMuteAriaLabel","fullScreenAriaLabel","exitFullScreenAriaLabel","playingAriaLabel","pausedAriaLabel","seekBarLabel","sliderThumbLabel","volumeThumbLabel","videoTimeDurationLabel","closedCaptionLabel","audio_tracks","descriptive_audio","closecaption_off","audio_tracks_default","cc_customize","cc_text_font","cc_text_color","cc_color_black","cc_color_blue","cc_color_cyan","cc_color_green","cc_color_grey","cc_color_magenta","cc_color_red","cc_color_white","cc_color_yellow","cc_font_name_casual","cc_font_name_cursive","cc_font_name_monospacedsansserif","cc_font_name_monospacedserif","cc_font_name_proportionalserif","cc_font_name_proportionalsansserif","cc_font_name_smallcapitals","cc_text_size","cc_text_size_default","cc_text_size_extralarge","cc_text_size_large","cc_text_size_maximum","cc_text_size_small","cc_appearance","cc_preset1","cc_preset2","cc_preset3","cc_preset4","cc_preset5","cc_presettings","cc_text_background_color","cc_text_background_opacity","cc_text_opacity","cc_percent_0","cc_percent_100","cc_percent_25","cc_percent_50","cc_percent_75","cc_text_edge_color","cc_text_edge_style","cc_text_edge_style_depressed","cc_text_edge_style_dropshadow","cc_text_edge_style_none","cc_text_edge_style_raised","cc_text_edge_style_uniform","cc_window_color","cc_window_opacity","cc_reset","LocalizationHelper","playerResources","getLocalizedValue","getLanguageCodeFromLocale","locale","getLanguageNameFromLocale","ClosedCaptionHelper","playerHelper","localizationHelper","playerMetaData","checkClosedCaptionsFiles","ccFiles","getClosedCaptionMenu","ccMenuItems","ccFile","ccType","ClosedCaptionTypes","TTML","lang","toLowerCase","ccMenuItem","addIdPrefix","label","language","selected","selectable","persistOnClick","ariaLabel","subMenu","_getClosedCaptionsSettingsMenu","unshift","category","MenuCategories","ClosedCaption","items","getUpdatedClosedCaptionSetting","currentClosedCaptionsSetting","settingKey","optionKey","videoClosedCaptionsConstant","presetKey","presetValue","closedCaptionsPresetMap","window_color","window_opacity","text_background_color","text_background_opacity","text_color","text_edge_style","text_font","text_opacity","text_size","preset","_getOptionValue","getClosedCaptionURLFromLocale","setting","closedCaptionsSettingsMap","option","closedCaptionsSettingsOptions","map","settingsMenuItems","optionMenuItem","_getCCMenuItemId","pre","isBackButton","_getCCSettingsMenuId","ClosedCaptionSettings","settingsMenu","presetItems","presetSetting","font","color","ariaLabelValue","hasMouseHoverEvents","settingId","optionId","PlayerHelper","isMobileDevice","onErrorCallback","errorType","message","console","playerProps","_isMobileDevice","getMetadata","_mapVideoFiles","_setCCFiles","_setAudioTracks","playerData","metaData","updatePlayerProps","_clearVideoPlayerMetaData","getOptionMenu","audioTracks","_getAudioTracksMenu","optionMenuItems","Options","getPosterFrameUrl","posterFrameUrl","options","hidePosterFrame","posterframeUrl","_removeProtocolFromUrl","thumbnailFullWidth","indexOf","PlayerConstants","thumbnailFullHeight","getVideoFileToPlay","videoFile","mediaType","MediaTypes","MP4","quality","MediaQuality","LO","videoMetaData","mpVideoFiles","_getVideoFileByType","videoFiles","mobileVideoQuality","mobileVideoFile","_getVideoFileByQuality","toUpperCase","hdVideoFile","HDX","hqVideoFile","HQ","sdVideoFile","SD","loVideoFile","isEmptyOrUndefined","childId","playerId","removeIdPrefix","substring","audioTracksMenuItems","descriptiveAudioTrackCount","track","isDescriptiveAudio","trackIndex","audioTrack","languageCode","descriptiveAudioLabel","audioMenuItem","AudioTracks","videoBinaryReferences","binaryRef","extension","$type","sourceHref","audioType","bitrate","name","alias","clientHref","videoBinaryFiles","mediaTypeAndQuality","_getMediaTypeAndQuality","urlRef","formatCode","mType","mQuality","HD","SMOOTH","HLS","DASH","file","RatingComponentActions","onSliderChanged","event","setRating","Number","parseInt","rating","lastSelectedRating","onChange","onMouseLeave","_event","onMouseOver","getIndex","readOnly","Rating","initialRating","avgRating","useState","useEffect","newRating","shouldShowDescription","shouldShowFullRatingDescription","starControl","ratingCountAriaLabel","renderStars","ratingCount","defaultProps","currentRating","reviewCountAriaLabel","type","min","max","step","mouseOver","floor","Math","remainder","filled","half","stars","glyphClass","role","getAttribute","RatingComponent","xmlNS","TtmlSettings","settingsOverrides","ttmlNamespace","ttmlStyleNamespace","ttmlParameterNamespace","ttmlMetaNamespace","idPrefix","mediaFrameRate","mediaFrameRateMultiplier","mediaSubFrameRate","mediaTickRate","supportedTimeBase","rootContainerRegionDimensions","relatedMediaObjectRegion","cellResolution","rows","columns","defaultRegionStyle","backgroundColor","direction","display","displayAlign","extent","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","opacity","origin","overflow","padding","showBackground","textAlign","textDecoration","textOutline","unicodeBidi","visibility","wrapOption","writingMode","fontMap","default","monospaceSerif","proportionalSerif","monospaceSansSerif","proportionalSansSerif","casual","cursive","smallCaps","monospace","sansSerif","serif","TtmlContext","translateToHtml","applicableStyleSet","preserveSpace","translation","innerNode","_getTagNameEquivalent","htmlName","htmlClass","TtmlParser","getAttributeNS","settings","agent","_defaultStyle","ownerDocument","title","setAttribute","appendChild","_translateStyle","outerNode","ttmlTextDecoration","parts","mappedColor","rgbaRegEx","red","green","blue","alpha","round","substr","TtmlNamedColorMap","transparent","setOwnerDocument","updateRelatedMediaObjectRegion","dimensions","hasEvents","events","resetCurrentEvents","currentEvents","updateCurrentEvents","time","timeEvents","_getTemporallyActiveEvents","currentEventsLength","currentEventsTime","getCues","cues","root","regions","layout","getElementsByTagNameNS","region","regionId","anonymousId","_translate","_isInRegion","pruneResult","_prune","inheritableStyleSet","cueBody","prunedElement","hasPreservedContent","showAlways","children","removeAttribute","rcr","rootContainerRegion","cue","filter","_isTemporallyActive","inheritedStyleSet","translator","computedStyleSet","tag","_getComputedStyleSet","_getApplicableStyleSet","_getInheritableStyleSet","tagName","_applyStyle","ignoreAncestors","child","childNodes","nodeType","Node","COMMENT_NODE","TEXT_NODE","createTextNode","childPreserveSpace","spaceAttr","pruneRecord","ancestor","parentNode","ELEMENT_NODE","body","styleSetCache","sets","set","applyInlineStyles","fontSizes","_appendSpanFontSizes","_isStyleApplicable","elemRegion","_getRegionId","node","namespaceURI","getLocalTagName","nameSpace","mappedValue","_ttmlToCssColor","coords","_ttmlToCssUnits","size","_ttmlToCssFontSize","values","parseFloat","isNaN","contextRect","first","second","third","forth","_ttmlToCssTextDecoration","defaultColor","_ttmlToCssTextOutline","ttmlUnits","cssUnits","unit","charAt","container","containerSize","scaleFactor","isRegion","textShadow","thickness","blur","firstChar","lengthRegEx","units","x","y","black","silver","gray","white","maroon","purple","fuchsia","magenta","lime","olive","yellow","navy","teal","aqua","cyan","TtmlTimeParser","_mediaFrameRate","_mediaTickRate","parse","ttmlTime","absoluteTime","absoluteTimeRegex","hours","minutes","seconds","subseconds","_getTimeUnitMultiplier","relativeTime","relativeTimeRegex","timeUnit","localName","baseName","namespace","attribute","attributes","lookupNamespaceURI","ttmlDocument","_parseXml","ttmlContext","_verifyRoot","_getFirstElementByTagNameNS","_parseTtAttrs","head","_ensureRegions","timeBase","_processAnonymousSpans","timeParser","_applyTiming","start","mediaStart","end","mediaEnd","_applyStyling","sort","event1","event2","styleSet","nodeValue","xmlString","xml","DOMParser","parseFromString","domParser","ActiveXObject","loadXML","candidate","documentElement","cellRes","cellGrid","createElementNS","extents","setAttributeNS","anonymousRegion","_isTagNS","textNodeGroups","prevNodeType","group","anonSpan","replaceChild","bound","isParallelContext","beginAttribute","startTime","endTime","duration","durationAttribute","endAttribute","minEnd","styling","styles","_applyStylesheet","empty","styleAttribute","ids","styleId","matches","ClosedCaptions","userPreferences","text","closedCaptionDiv","lastPlayPosition","resetCaptions","clicked","bind","closedCaptionDivStyle","bottom","isVideoControlVisible","transition","ref","showClosedCaptions","onClosedCaptionClick","componentDidMount","ccURL","_setCcLanguage","updateCaptions","currentTime","shouldComponentUpdate","nextProps","shouldRender","componentWillUnmount","removeEventListener","componentDidUpdate","prevProps","ccLanguage","applySettings","setTimeout","showSampleCaptions","mockCaptions","_onClosedCaptionsLoaded","current","playPosition","output","tick","_applyUserPreferencesOverrides","outerHTML","prefs","currentSettings","tempClosedCaptionsSettings","currentClosedCaptionsSettings","optionValue","_getPrefsCss","_loadClosedCaptions","href","ajax","errorCallback","errorDesc","error","winElement","prefsCss","pref","propVal","pVal","colorValue","opacityValue","_formatAsRgba","cssColor","colorStart","fullColorString","colorLenght","uncurryThis","fixRegExpWellKnownSymbolLogic","anObject","isNullOrUndefined","requireObjectCoercible","speciesConstructor","advanceStringIndex","toLength","getMethod","regExpExec","stickyHelpers","fails","UNSUPPORTED_Y","stringSlice","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","re","originalExec","apply","BUGGY","SPLIT","nativeSplit","maybeCallNative","internalSplit","separator","limit","O","splitter","string","rx","S","res","C","unicodeMatching","unicode","flags","multiline","lim","p","A","lastIndex","e","z","SocialMedia","SocialMediaComponent","setShareLinks","alt","socialMediaName","socialMedia","pageUrl","encodeURIComponent","postUrl","mediaImage","getElementsByName","Facebook","Twitter","postTitle","Pinterest","Mail","Linkedin","Customization","socialShareURL","left","screen","params","openWindow","AddToCartBehavior","getTotalItems","addedInput","totalCount","addedInput_1","__values","addedInput_1_1","next","count","ItemsAddedErrorComponent","errorMessage","StringExtensions","isNullOrEmpty","ItemsAddedToCartDialogComponent","dialogProps","dialogStrings","isModalOpen","itemsString","itemsAddedToCartFormatText","itemsAddedToCartHeaderText","linesString","linesAddedToCartFormatText","fullProducts","item","Modal","isOpen","toggle","onClose","ModalHeader","ModalBody","itemsAddedValidationErrorMessage","ModalFooter","viewCartButtonText","getUrlSync","closeButtonLabel","ItemSuccessfullyAddedToCartNotificationComponent","_super","__extends","prototype","payLoad","getPayloadObject","notification","telemetryContent","TelemetryConstant","ContinueShopping","shouldDisplayUnitOfMeasure","unitOfMeasureDisplayType","contentAction","etext","ViewBagAndCheckout","viewBagAttribute","getTelemetryAttributes","fallbackImageUrl","cropFocalRegion","reducedDimensions","Dimensions","reduce","str","productDimension","DimensionValue","Value","contentClassName","NotificationContent","footerClassName","NotificationFooter","ClosableNotificationWrapper","DismissibleNotificationWrapper","NotificationInstance","NotificationHeader","NotificationTitle","NotificationCloseButton","resources","DefaultUnitOfMeasure","isNullOrWhitespace","addedQuantityText","productQuantity","navigationUrl","goToCartText","BaseNotificationComponent","ItemSuccessfullyAddedToCartNotification","componentId","_this","headerItemOneText","headerItemFormatText","headerMessageText","isClosed","closeNotificationLabel","setValue","NotificationEvents","Close","Event","close","getValue","trigger","__decorate","withNotificationComponent","DismissibleNotification","MultiItemsSuccessfullyAddedToCartNotificationComponent","NotificationDescription","MultiItemsSuccessfullyAddedToCartNotification","descriptionLines","propagateResult","onAdd","propagateError","onError","getAddToCartInputFromProps","__awaiter","orderDetailsProducts","ObjectExtensions","simpleProduct","emailDeliveryModeCode","channel","EmailDeliveryModeCode","input","deliveryOption","salesLine","DeliveryMode","Quantity","catalogId","CatalogId","isAddEmailDeliveryItemToCart","ArrayExtensions","hasElements","apiSettings_1","getCatalogId","validateCatalogId","searchCriteriaInput","Context","ChannelId","channelId","IncludeAttributes","Ids","productId","ProductsDataActions","callerContext","searchResult","sent","productSearchResultsWithImages_1","productSearchResult","newProductSearchResult","newImageUrl","generateProductImageUrl","productData","find","RecordId","Variant","Price","quantity","addOneItemToCart","setDisabled","openModal","addToCartBehavior","addToCartInput","getCartState","addProductToCart","availableQuantity","productAvailability","AvailableQuantity","additionalProperties","validateQuantity","isOrderQuantityLimitsFeatureEnabled","enableStockCheck","isPriceKeyedIn","customPrice","customPriceAmount","shouldSkipSiteSettings","addToCartResult","showModal","showNotification","NotificationsManager","instance","addNotification","isBrowser","isNavigationToCartPageDisabled","goToCart","location","assign","ErrorNotification","errorDetails","LocalizedMessage","failureReason","cartActionResult","handleAddItemsToCartSuccess","setItemsAddedToCartDialogOpen","setErrorMessage","cartState","CartsDataActions","bypassCache","cart","Id","Version","validationResult","errorCount","ValidationFailuresByCartLines","errorText","oneErrorText","multiErrorsText","validationErrorMessage","itemsAddedResource","headerLinesFormatText","addItemsToCart","addProductsToCart","buyAgainNotificationTitle","buyAgainNotificationCloseAriaLabel","AddToCartComponentActions","cartError","addToCartError","hasOrderDetailsProducts","hasProducts","hasMultipleProducts","AddToCartFunctionalComponent","_w","disabled","_x","modalOpen","setModalOpen","_y","isItemsAddedToCartDialogOpen","_z","_0","setAddToCartInput","closeItemsAddedToCartDialog","priceComponent","popupProps","_h","_k","_j","_m","_l","_p","_o","_r","_q","_t","_s","renderModalPopup","Popup","getLinkText","payload","TelemetryEvent","AddToCart","buttonClassName","retrievedInput","_u","addToCartArialLabel","_v","isIntermediateState","shouldShowOutOfStock","outOfStockText","addToCartText","isCustomPriceSelected","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","missingDimensions","dimension","stockLeft","includeCurrentQuantity","isLoading","isProductQuantityLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","isAddServiceItemToCart","hasAvailableProducts","includedQuantityNumber","AddToCartComponent","OrderDetailsProduct","productUrl","isSelected","isProductAvailable","observable","buttonEventReference","LinesAddedToCartDialog","orderTemplate","linesCount","lineItemsString","linesAddedToCartHeaderLinesOneText","linesAddedToCartHeaderLinesFormatText","linesAddedToCartHeaderItemsOneText","linesAddedToCartHeaderMessageText","orderTemplateCloseButtonText","setUploadStatus","setLinesAddedToCartDialogOpen","setAddedLinesCount","isMultipleCatalogFeatureEnabledInHq","addOrderTemplateToCartInput","AddOrderTemplateToCartInput","productList","CartLines","cartLine","IsInvoiceLine","addOrderTemplateToCartAction","addedCartLines","orderTemplateErrorMessage","AddOrderTemplateToCartComponent","uploadStatus","addedLinesCount","linesAddedToCartDialogOpen","modalText","errorMsg","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","_getModalText","processStatusClass","closeWindowButtonText","AddOrderTemplateToCart","addOrderTemplateAttribute","PopupProducts","orderTemplateLines","line","fullProduct","totalLines","linesAddedToCartDialogResources","focus","OrderTemplateNameDialog","isUpdateDialog","existingOrderTemplate","onCancel","onSuccess","parentElementRef","orderTemplateName","setOrderTemplateName","cancel","orderTemplateModalAriaLabel","orderTemplateHeaderLabel","htmlFor","orderTemplateTitleLabel","orderTemplateNameAriaLabel","placeholder","defaultOrderTemplateName","maxLength","orderTemplateDescription","orderTemplateButtonLabel","UpdateOrderTemplateHeaderInput","updateOrderTemplateHeader","Error","CreateOrderTemplateInput","createOrderTemplate","orderTemplateCancelButtonLabel","OrderTemplateComponent","lineItemsText","actionButtonText","orderTemplateAction","renderAddToOrderTemplatesForExistingOrderTemplatesDialog","closeDialog","showOrderTemplateNameDialog","onAddToOrderTemplateButtonClick","boldText","patternToFind","addToOrderTemplateDialogResources","orderTemplates","createOrderTemplateImageUrl","getAsset","addToOrderTemplateHeader","selectTemplatesText","createNewOrderTemplateButtonText","addToTemplateButtonText","AddToOrderTemplateDialog","addToOrderTemplateDialog","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","onOrderTemplateSelected","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","renderAddToOrderTemplatesWhenEmptyOrderTemplatesDialog","createOrderTemplateDialogResources","LinesAddedToOrderTemplateDialog","itemsCount","reload","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","addedProducts","DimensionTypeValue","ProductDimensionType","Style","filteredProducts","linesAddedToOrderTemplateHeaderMessageText","Alert","assertive","linesAddedToOrderTemplateCustomPriceAlertMessageText","viewOrderTemplateButtonText","continueShoppingButtonText","AddProductsToOrderTemplateComponent","chosenOrderTemplate","setChosenOrderTemplate","setAddedProducts","isAddToOrderTemplateModalOpen","setIsAddToOrderTemplateModalOpen","isLinesAddedToOrderTemplateDialogOpen","setIsLinesAddedToOrderTemplateDialogOpen","addedItemsCount","setAddedItemsCount","linesToAdd","ProductListId","allProductInputs","linesToAdd_1","linesToAdd_1_1","listLine","ProductId","FullProductInput","getProductDetailsCriteriaFromActionInput","getFullProducts","allProducts","ProductListsDataActions","addedLines","quantities","calculateSum","onAddProductsToOrderTemplateClick","isChannelTypeB2B","addToOrderTemplateReference","addProductsToOrderTemplateButton","innerRef","isDisabled","DuplicateItemsWhenAddingToOrderTemplateDialog","executeOverrideQuantity","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","ItemAddedToOrderTemplateDialog","orderTemplateId","productPrice","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","join","AddToOrderTemplateComponentActions","state","waiting","isAuthenticated","signInUrl","addToOrderTemplate","setWaiting","onDismiss","setContent","showAlert","canAddMasterProduct","AddToOrderTemplateComponent","content","addToOrderTemplateModalOpen","setAddToOrderTemplateModalOpen","chosenOrderTemplateId","setChosenOrderTemplateId","setProductPrice","itemAddedToOrderTemplateDialogOpen","setItemAddedToOrderTemplateDialogOpen","duplicateItemsWhenAddingToOrderTemplateDialogOpen","setDuplicateItemsWhenAddingToOrderTemplateDialogOpen","addToOrderTemplateButtonText","showStatusMessage","showButtonText","showButtonTooltip","shouldShowButtonFailedTooltip","disableButton","tooltipPosition","addToOrderTemplateButtonTooltip","addToOrderTemplateRef","showMessage","showTooltip","tooltipPos","dialogData","UncontrolledTooltip","placement","orderTemplateTextMessage","AddItemToOrderTemplateInput","addItemToOrderTemplate","then","getPriceForSelectedVariant","PriceForSelectedVariantInput","retrievedProductPrice","catch","AsyncResult","reject","resolve","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","UpdateOrderTemplateInput","updateOrderTemplateAction","ItemAddedToCartDialog","itemAddedToCartHeaderItemOneText","itemAddedToCartHeaderItemFormatText","itemAddedToCartHeaderMessageText","renderImage","RenameOrderTemplateComponent","renameOrderTemplateButtonText","renameOrderTemplateDialogStrings","renameOrderTemplateDialogOpen","debug","onRenameTemplate","SaveCartToOrderTemplateActions","SaveCartToOrderTemplateComponent","linesAddedToOrderTemplateDialogOpen","setLinesAddedToOrderTemplateDialogOpen","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","getFullProductsDetails","productLines","allProdInputs","forEach","lines","updateLinesCounts","firstQuantity","secondQuantity","areAllCartlinesPriceKeyedIn","cartLines","cartline","IsPriceKeyedIn","allProductListLines","UnitOfMeasure","UnitOfMeasureSymbol","filteredProductListLines","addProductListLinesAsync","filteredAddedLines","linesAddedToOrderTemplateDialogResources","newLinesToupdate","getLinesInput","GetProductListLinesInput","getProductListLines","linesState","linesToUpdate","productListLine","lineToUpdate","updateProductListLinesAsync","updatedLines","Player","controlPanelTimer","player","audio","playerContainer","videoControl","ageGateContainer","videoUrl","seekFrom","closedCaptionHelper","closedCaptionMenu","optionsMenu","selectedClosedCaptionsLocale","isPlayerManuallyPaused","isPlayerLoaded","_renderClosedCaptions","VideoPlayerNames","videoplayerContainer","closedCaptionLanguage","closedCaptionsURL","isControlPanelVisible","doControlsHaveFocus","_onTriggerClicked","_renderPlayPauseTrigger","maskLevelStyle","autoplay","shouldAutoPlay","playPauseTrigger","isPlayPauseTrigger","controls","isControlsEnabled","shouldDisableAutoPlayOnMobile","isTriggerEnabled","isAgegateEnabled","PlayPauseTrigger","toggled","playing","mouseHovered","onFocus","_onTriggerFocus","onBlur","_onTriggerBlur","_renderVideoControls","VideoControls","onPlayClick","optionMenu","videoSeekSteps","defaultVideoSliderSteps","volumeSeekSteps","defaultVolumeSliderSteps","isMuted","onMuteClick","_setMuted","onVolumeChange","_onVolumeChange","onProgressChange","_onProgressChange","currentClosedCaptionLanguage","currentVolume","isInFullScreen","toggleFullScreen","_toggleFullScreen","handleControlsKeyDownHandler","_handleControlsKeyDownEvent","_onVideoControlsFocus","_onVideoControlsBlur","onMenuItemClick","_onPlayerMenuItemClick","onMenuItemFocus","_onPlayerMenuItemFocus","onMenuItemBlur","_onPlayerMenuItemBlur","currentAudioTrack","currentAudioTrackURL","optionButtonLabel","_renderAgeGate","AgeGate","onSubmitClick","_validateAgeSubmitHandler","minmumAge","minimumAge","isAutoPlay","ageGate","isAgeGateEnabled","mute","lazyLoad","isLazyLoaded","_isMobile","_shouldAutoPlay","defaultVolume","previousVolume","showSpinner","showErrorMessage","screenReaderText","mounted","closedCaptionsSettingDefaults","videoErrorMessage","bufferedDuration","playerState","_onMouseEvent","_onPlay","_onPause","_triggerEvents","_triggerAudioEvents","_onFullScreenChanged","_showControlBar","_onFullscreenError","_onPlayerKeyDown","_onContextMenuClicked","doc","fullscreenEnabled","mozFullScreenEnabled","webkitFullscreenEnabled","webkitSupportsFullscreen","msFullscreenEnabled","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","nextState","loop","isLoop","_getMaskLevelStyle","isEditor","_loadPlayer","loadMetaData","onKeyDown","onMouseEnter","preload","muted","autoPlay","onPlay","onPause","onContextMenu","poster","playsInline","Waiting","play","_onVideoError","_onAudioError","pause","_onVideoLoadedData","mediaEvent","MediaEvents","volume","load","autoCaptionsLang","autoCaptions","autoCaptionsLocale","setState","getCalculatedAge","_displayErrorMessage","_setCCSettings","_setCC","ccLanguageId","selectedOption","updatePreferences","dataSplit","currentSetting","JSON","paused","_updateState","seeking","currentPlayer","_onTimeUpdate","_stop","_getError","errorCode","VideoErrorCodes","MediaErrorAborted","MediaErrorNetwork","MediaErrorDecode","MediaErrorSourceNotSupported","_stopMedia","msgToDisplay","contentErrorCode","code","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","MediaErrorUnknown","keycode","keyCode","Home","stopPropagation","preventDefault","End","ArrowLeft","ArrowRight","jumpToTime","ArrowUp","ArrowDown","showVolumeControl","firstThumbValue","newVolume","_updateScreenReaderElement","onTelemetryClick","Tab","_showControlsBasedOnState","autoHide","clearTimeout","_hideControlBar","defaultControlPanelTimeout","_onFullscreenExit","_onFullscreenEnter","_exitFullScreen","_enterFullScreen","_isNativeFullscreenEnabled","elementInFullScreen","_getElementInFullScreen","requestFullscreen","msRequestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","webkitEnterFullScreen","cancelFullScreen","msExitFullscreen","mozCancelFullScreen","webkitCancelFullScreen","position","_getPlayPosition","_getBufferedDuration","buffered","abs","defaultPositionUpdateThreshold","setFocusOnPause","setFocusOnPlay","playFullScreen","_seek","maskLevel","defaultMaskLevel","newState","_showSpinnerBasedOnState","_hideSpinner","_showSpinner","isIphone","isSilk","isWindowsPhone","isAndroid","playerName","videoId","description","shareUrl","externalPlayerUrl","externalSourceId","ActionToggle","_divRef","_focusElement","_onClick","getSnapshotBeforeUpdate","_this$_divRef$current","activeElement","_this$props","_objectWithoutProperties","_excluded","classes","hidden","actionToggle","focusTarget","ageGateDiv","day","dayValue","month","monthValue","year","yearValue","today","Date","age","getFullYear","birthdayMonthHasNotHappenedYet","getMonth","birthdayDayHasNotHappenedYet","getDate","renderSelectMonth","allMonth","monthList","toFixed","_filterDateMonthYear","renderSelectDay","allDay","dayList","renderSelectYear","thisYear","allYear","yearList","enabled","regxForAgeGateInputValidation","defaultPlayGlyphIcon","defaultPauseGlyphIcon","defaultMuteGlyphIcon","defaultUnMuteGlyphIcon","defaultFullScreenGlyphIcon","defaultExitFullScreenGlyphIcon","closedCaptionGlyphClassName","ccLangPrefKey","mutePrefKey","volumePrefKey","PlaybackSpeed","Quality","Share","Download","DownloadableMediaTypes","preset1","preset2","preset3","preset4","preset5","monospacedsansserif","monospacedserif","proportionalsansserif","proportionalserif","smallcapitals","percent","small","large","extralarge","maximum","grey","none","depressed","dropshadow","raised","uniform","Menu","handleDocumentClick","_onKeyDown","_onKeyUp","getMenuWidth","offsetWidth","playerMenu","menuItems","onKeyUp","menuItem","MenuItem","image","imageAlt","itemCount","itemIndex","glyph","hasChildren","onMouseOut","hasFocus","onDocumentClick","_onFocus","_onMouseOver","_onMouseOut","_onBlur","_objectDestructuringEmpty","playRef","pauseRef","ButtonMenuTypes","selectedMenuItems","volumeButtonDiv","playButtonRef","pauseButtonRef","closedCaptionRef","optionButtonRef","fullscreenButtonRef","exitFullScreenButtonRef","videoControlDiv","closedCaptionButtonDiv","optionButtonDiv","menuRef","muteButtonRef","unMuteButtonRef","_fullScreenReference","autohide","offsetPosition","_getOffsetPosition","volumeAutoHideTimer","showVolumeSlider","volumeSliderLeftPosition","offsetLeft","volumeSliderTopPosition","offsetTop","firstChild","_hideVolumeControl","volumeAutoHideTimeout","_onDocumentClick","currentMenu","showMenu","_renderClosedCaptionButton","videoControlsClassName","_onClosedCaptionClick","_renderOptionButton","_onOptionsButtonClick","_renderFullScreenButton","_renderVolumeButton","volumeButtonProps","_renderVideoSlider","videoProps","inForm","fillTrackValue","orientation","showProgressBar","showLabels","shouldSliderAdjustToRTL","handleTooltipText","_handleProgressToolTipText","sliderThumbs","ariaValueText","Slider","_renderVolumeSlider","volumeSliderProps","tooltip","_toElapsedTimeString","focusedMenuItemIndex","_onMenuItemClick","_reevaluateWidth","_onMenuBlur","_onMenuFocus","_onMenuKeyDown","_onMenuKeyUp","menuLeftPosition","toolTipClass","_objectSpread","previousProps","_updateSelectedMenu","volumeDivStyle","top","menuDivStyle","setFocusOnMenuButton","_this$_fullScreenRefe","_isIPhone","rowDiv","controlBarButtonsWidth","sliderWidth","videoControlWidth","viewportMax","innerWidth","_applyTooltipClassOnWidthChange","button","_onMenuKeyPressed","Space","currentMenuItem","_resetFocusForCurrentMenu","Enter","forceUpdate","PageUp","PageDown","Escape","shiftKey","currentTarget","_getSelectedMenuFromList","pop","stringify","refDiv","buttonWidth","elementwidth","negative","elapsedTime","viewportMin","CarouselItem","onEnter","isAppearing","startAnimation","onEntering","offsetHeight","onExit","onExiting","dispatchEvent","CustomEvent","onExited","slide","cssModule","collapseIn","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","otherProps","onEntered","__rest","timeoutOrDefault","TransitionTimeouts","Carousel","Tag","transitionProps","CarouselContext","Consumer","Transition","isActive","directionClassName","orderClassName","itemClasses","mapToCssModules","classNames","directionTextPrev","directionTextNext","defaultThrottleThreshold","setInterval","clearInterval","interval","cycleInterval","hoverStart","mouseEnter","hoverEnd","mouseLeave","handleKeyPress","keyboard","previous","renderItems","carouselItems","handleOnExiting","handleOnExited","activeIndex","slides","slotContent","isIn","_handleKeyPressPrev","_handleKeyPressNext","throttleThreshold","threshold","_handleTouchStart","_handleTouchEnd","scrollThreshold","touchScrollThreshold","indicatorClicked","_onClickPrev","_onClickNext","linkRefPrev","linkRefNext","nextHandleInputThrottledEvent","debounce","previousHandleInputThrottledEvent","ride","componentWillReceiveProps","hasCurrentKeys","hasNextKeys","isKeyDifferent","equals","transitionType","dismissEnabled","hideFlipper","showPaginationTooltip","hideIndicator","isDisabledFunctionality","outerClasses","transitionTypeValue","carouselClass","innerClasses","dismiss","_renderDismissCarousel","indicators","_renderIndicators","carouselControls","_renderCarouselControls","Provider","onTouchStart","onTouchEnd","evt","touches","scrollStart","screenX","changedTouches","delta","onIndicatorsClickHandler","indicatorAriaText","listClasses","idx","indicatorClasses","active","indicatorId","caption","anchorClassesPrev","anchorClassesNext","iconClassesPrev","iconClassesNext","screenReaderClasses","prevAttribute","nextAttribute","handleDismissCarousel","dismissCarouselAriaText","CartIcon","observer","cartLabel","cartQtyLabel","cartLink","cartItem","totalItemsInCart","qtyLabel","CartIconComponent","PromoCode","_onInputChange","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","promoCode","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","onSubmit","_removePromotion","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_calculateDiscount","discountAmount","DiscountLines","e_2","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","totalCouponDiscountAmount","coupon","Code","appliedPromoCodeHeadingText","removePromoAriaLabelFormat","removePromoText","ApplyPromoCode","isCollapseOpen","promoCodeHeadingText","PromoCodeComponent","setShowPreviousActions","componentClassName","toggleMenuButtonClassName","ActionMenuComponent","showActions","setShowActions","isVisible","isShowActions","shouldShowActions","telemetryAttributes","AddToWishlistComponentActions","getSelectedProduct","doesProductExistInWishlist","removeFromWishlist","addToWishlist","wishlists","CommerceListLines","CommerceListLines_1","CommerceListLines_1_1","propagateSuccess","wishlistName","nameOfWishlist","getCustomerAccount","customer","AccountNumber","listData","CustomerId","CommerceListTypeValue","createCommerceListAsync","commerceList","callAddWishlistLine","warning","error_1","wishlistId","addLinesAsync","buildWishlistLine","createdCommerceList","update","createGetByCustomerInput","setCanRemove","wishlistTextMessage","addToWishlistMessage","error_2","addItemToWishlistError","removedFromWishlistMessage","removeItemFromWishlistError","wishlistLine","removeLinesAsync","error_3","customerInput","GetCustomerInput","getCustomer","AddToWishlistComponent","canRemove","removeFromWishlistButtonText","addToWishlistButtonText","ariaRole","showRemoveButton","onClickHandler","addToWishlistRef","removeFromWishlistRef","linkAriaRole","CartLinePriceEditor","waitTime","_handleChange","newValue","cancellabelDebounce","_debounce","setInvoiceLinePrice","cartLineId","LineId","PriceEditor","defaultAmount","maximumValue","InvoiceAmount","minimumValue","handleChange","CartLineItemFunctions","renderProductDimensions","Product","DimensionStrings","colorString","configString","sizeString","IsGiftCard","amountString","styleString","renderDiscountLines","OfferId","OfferName","discountStringText","isSalesLine","PeriodicDiscount","DiscountAmount","priceCurrency","EffectivePercentage","renderInventoryLabel","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","renderUnitOfMeasure","renderShippingLabel","pickupDeliveryModeCode","PickupDeliveryModeCode","channelDeliveryOptionConfig","PickupDeliveryModeCodes","some","deliveryMode","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","chargeTotal","CalculatedAmount","shippingChargesText","renderOtherCharges","otherCharges","chargeline","otherCharge","Description","renderSalesAgreementPrompt","SalesAgreementLineRecordId","renderConfirmedShipDate","confirmedShipDate","shipDateCssName","confirmedShipDateLabel","renderRequestDeliveryDate","requestDeliveryDate","reqDateCssName","requestDeliveryDateLabel","CatalogLabelComponent","catalogs","catalog","CartLineItemComponent","destructDimensionStrings","inputQuantityAriaLabel","productDimensions","prodAttribute","productName","imgeClassName","_generateErrorMessage","_updateQuantity","quantityOnChange","lineIndex","_generateSelectMenu","currentQuantity","nodes","_generateMenu","_generateQuantityAndPrice","isOutOfStock","isQuantityEditable","maxQuantity","quantityDisplayString","NetAmountWithAllInclusiveTax","GrossAmount","ExtendedPrice","NetPrice","salesAgreementLineId","displayMode","primaryImageUrl","priceEditorResources","showShippingChargesForLineItems","ProductComponentSwatchComponent","dimensionType","swatches","onSelectDimension","onSelectItem","SwatchComponent","list","ProductComponent","ratingAriaLabel","allowBack","quickViewButton","productComparisonButton","inventoryLabel","dimensionAvailabilities","swatchItemAriaLabel","dimensionToPreSelectInProductCard","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","search","pathname","getDefaultSwatchSelected","AttributeValues","attributeSwatches","attributeValue","KeyName","Swatches","IsDefault","getProductPageUrlSync","defaultSwatch","swatchProductImageUrls","productImageUrlFromSwatch","ProductImageUrls","generateImageUrl","productPageUrlFromSwatch","SwatchValue","queryStringEncoded","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","updatePageAndImageUrl","swatchItem","productPageUrlWithSwatch","newUrl","searchParams","delete","swatchProductImageUrl","productImageUrls","inventoryAvailabilityLabel","unitOfMeasure","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","availability","reviewCountArialableText","swatchItems","validValues","dimensionTypeValue","checkIfShouldDisplayAsSwatch","DimensionSwatchDisplayTypes","productCard","itemId","colorHexCode","SwatchColorHexCode","imageUrl","SwatchImageUrl","isDefault","dimensionAvailability","swatch","recordId","isUnitOfMeasureEnabled","getRatingAriaLabel","roundedRating","getReviewAriaLabel","AverageRating","TotalRatings","productCardimageSettings","emptyPlaceHolderImage","placeholderImageName","fallbackImageSource","imageProps","bypassHideOnFailure","renderProductPlacementImage","moduleTypeName","moduleId","savingsPriceResourceText","freePriceResourceText","originalPriceResourceText","currentPriceResourceText","IsMasterProduct","Standalone","renderPrice","hideRating","totalRatings","numberRatings","renderRating","quickview","selectedDimensions","getValues","convertDimensionTypeToProductDimensionType","selectedProductId","renderQuickView","renderProductComparisonButton","Dropdown","selectMenu","_onChanged","selectedIndex","dropdownId","selectId","selectedValue","innerText","onInitialize","initializedDimension","selectedItem","dropdownList","dropdownName","dropdownToggleName","dimensionChanged","_onInitializedDimension","initializeDimension","getProductConfigure","moduleName","pageName","selectDimensionFormatString","callbacks","configureErrors","getDropdownName","onChanged","__generator","dimensionSelectedAsync","onInitializedDimension","getTelemetryObject","telemetryPageName","dropdowns","productDimensionFull","dropdownCallback","DimensionValues","dM","containerProps","labelContainerProps","errors","heading","select","mapProductDimensionFullToDropdownViewProps","SwatchItemComponent","isColored","hasColor","hasImage","selectItem","selectionHandler","isSelectionEnabled","fullImageUrl","generateSwatchImageUrl","onKeyPress","shouldDisplayText","isRefineItem","containerClassName","selectedItemId","setSelectedItemId","didUserSetAnyItem","setDidUserSetAnyItem","onSelectItemCallback","defaultItem","ProductComponentV2SwatchComponent","ProductDimensionsMatrixDimensionItemComponent","swatchContent","swatchContainerClassName","swatchContentClassName","getDimensionName","Color","productDimensionTypeColor","Configuration","productDimensionTypeConfiguration","Size","productDimensionTypeSize","productDimensionTypeStyle","changeCurrentDimension","onDimensionTypeSelect","ProductDimensionsMatrixDimensionSelectionComponent","buttonTogglingReference","isPopoverShown","setIsPopoverShown","currentDimensionType","setCurrentDimensionType","currentDimensionTypeLabel","setCurrentDimensionTypeLabel","popoverClassName","togglePopoverHandler","onDimensionTypeChange","Popover","dimensionTypes","ProductDimensionsMatrixEnterAllQuantitiesPopoverContentComponent","defaultQuantity","setCurrentQuantity","handleQuantityChange","newQuantity","handleApplyAll","onApplyToAll","productDimensionsMatrixEnterAllQuantitiesQuantityText","IncrementalQuantity","currentCount","productDimensionsMatrixInputQuantityAriaLabel","minQuantityValue","maxQuantityValue","decrementButtonAriaLabel","productDimensionsMatrixEnterAllQuantitiesDecrementButtonAriaLabel","incrementButtonAriaLabel","productDimensionsMatrixEnterAllQuantitiesIncrementButtonAriaLabel","productDimensionsMatrixEnterAllQuantitiesEachText","productDimensionsMatrixEnterAllQuantitiesApplyToAllText","ProductDimensionsMatrixEnterAllQuantitiesComponent","productDimensionsMatrixEnterAllQuantitiesButtonText","getDimensionId","isDimensionAvailable","dimensionId","inventoryLevel","getInventoryLevelCodeFromDimensionValue","retrieveDimensionInventoryLevelCode","InventoryLevelValues","outOfStock","retrieveEndDimensionsNode","dimensionIds","isAvailable","endNodes","concat","isNodeAvailable","nodes_1","nodes_1_1","createDisplayOrders","usedDimensions","dimensions_1","dimensions_1_1","currentDimensions","currentResult","ProductDimensionsMatrix","_handleDisplayOrderChange","newDimensions","_displayOrderList","dimensionsOrder","_generateNodesByNewDimensions","reverse","lastChangeAllDate","now","_updateAllQuantities","totalQuantity","_clearAllQuantities","_defaultQuantityProps","_handleCollapseDimension","isExpanded","dimensionsExpandState","getValueWithDefaultValue","dimensionsExpandStateDate","_handleDimensionTypeChange","previousDimensionType","newDimensionType","previousDimension","newDimension","dimensionOnChange","_handleQuantityChange","difference","isMobile","variant","VariantType","Viewport","_retrieveNodes","retrieveAvailabilitiesInformation","dimensionValuesWithInventory","dimensionsList","flatten","nodeDimensions","productIds","dimensionProductIds","ProductIds","nodeDimensions_1","e_4","nodeDimensions_1_1","nodes_2","nodes_2_1","_renderMatrixEmptyCell","_className","_renderHeader","_renderMatrix","_renderFooter","warehouseAggregation","availabilitiesSearchCriteria","QuantityUnitTypeValue","FilterByChannelFulfillmentGroup","DeliveryModeTypeFilterValue","shipping","DefaultWarehouseOnly","availabilities","AggregatedProductInventoryAvailabilities","this_1","getInventoryLevelCodeFromProductAvailability","_renderDisplayOrderContainer","_renderActions","productDimensionsMatrixDisplayOrderSeparator","LabeledDropdown","labelClassname","labelText","productDimensionsMatrixDisplayOrderLabel","dropdownOptions","dropdownClassname","onSelectOption","_renderEnterAllQuantities","_renderClearAllQuantities","maxQuantityForCartLineItem","minQuantity","productDimensionsMatrixClearAllText","_renderMatrixDesktop","rowClassName","cellClassName","_renderMatrixRowsDesktop","reversedDimensions","_renderMatrixDimensionsHeader","_renderMatrixDimensionCell","cells","_renderMatrixMobile","allDimensions","singleDimensionClassName","dimensionsContainerClassName","_renderMatrixRowsMobile","previousNode","pastNode","haveSameItems","_renderMatrixMainDimensionMobile","expandButtonClassName","collapseClassName","collapseItemClassName","Collapse","partialDimensions","nodeIndex","newNodeIndex","nodeDimensionIdsLength","partialDimensionIdsLength","currentDimensionId","currentDimension","this_2","lastDimension","_renderMatrixCell","this_3","nextRows","ColorHexCode","ImageUrl","_renderMatrixQuantityCell","_renderMatrixOutOfStockCell","productDimensionsMatrixOutOfStockLabel","_renderTotalSummary","productDimensionsMatrixTotalItemsLabel","_retrieveProducts","_renderAddToOrderTemplate","customerInformation","_renderAddToCart","productDimensionsMatrixAddItemsToCartButtonText","onErrorMessage","_renderFooterActions","RefinerOptionsType","RefinerItemType","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","isToggledItemFound","currentRefinementCriteria_1","currentRefinementCriteria_1_1","selectedCriterion","isMatchingRefinementCriterion","refinerItemData","isSelecting","minValue","rangeStart","maxValue","rangeEnd","refinerOptionsData","typeValue","SingleSelect","refinerItemId","matchingIndex","findIndex","criterion","refinerItems","refinerValue","refinementCriterion","sourceTypeValue","RefinerApplyFunctionalComponent","applyRefinerAttributes","ApplyRefiner","RefinerApplyComponent","RefinerChoiceSummaryFunctionalComponent","clearAllText","choiceAriaLabel","choiceFormat","selectedChoices","onClickChoice","onClickClearAll","onClickChoiceHandler","selectedRefinerItem","targetChoiceItem","shouldClearAll","nextItemToFocus","nextSibling","onClickClearAllHandler","clearAllAttributes","choiceItem","choiceItemName","activeRefinerItem","overallFormat","refinerLabel","itemType","DateRange","refinerMinValue","refinerMaxValue","getTagName","choiceItemAttribute","RefinerChoiceSummaryComponent","RefinerFooterFunctionalComponent","refinerApplyProps","extraActions","RefinerFooterComponent","RefinerToggleFunctionalComponent","RefinerToggleComponent","selectLabelId","RefinerSortFunctionalComponent","currentSortOption","sortOptionState","setSortOptionState","selectHtmlElement","sortOption","RefinerSortComponent","RefinerHeaderFunctionalComponent","refinerToggleProps","refinerChoiceSummaryProps","refinerSortProps","RefinerHeaderComponent","RefinerItemCheckFunctionalComponent","isSingleSelect","isChecked","itemTypeClassName","refinerItemAttributes","RefinerItemCheckComponent","minInputLabelId","maxInputLabelId","RefinerItemDateRangeFunctionalComponent","minInputLabel","maxInputLabel","minInputAriaLabel","maxInputAriaLabel","minRangeValue","maxRangeValue","validationErrorForRange","fallbackPattern","onChangeMinValue","onChangeMaxValue","onBlurMinInput","onBlurMaxInput","selectedMinValue","setSelectedMinValue","selectedMaxValue","setSelectedMaxValue","validationErrorMessageForRange","setValidationErrorMessageForRange","validateRange","minimum","selectedFormattedValue","userSelectedMinValue","updatedMinInput","minInput","pattern","userSelectedMaxValue","updatedMaxInput","maxInput","RefinerItemDateRangeComponent","componentModalClassName","RefinerModalToggleFunctionalComponent","RefinerModalFunctionalComponent","autoFocus","applicationNode","returnFocusRef","returnRef","onToggle","zIndex","modalNode","modalTitle","modalHeaderNode","refinerOptions","modalCloseButtonText","modalFooterNode","RefinerModalToggleComponent","RefinerModalComponent","listItemClassName","RefinerOptionsFunctionalComponent","isExpandedOnInitialLoad","expandTimeout","onUpdateRefiners","shouldRefinerExpand","setShouldRefinerExpand","isRefinerExpanded","setIsRefinerExpanded","onToggleRefinerOptions","onClickRefinerItem","onMinValueUpdate","updatedMin","onMaxValueUpdate","updatedMax","refinerItem","isSingleSelectValue","selectedRefinerItems","refinerItemCheckProps","refinerDataRangeProps","minLabel","maxLabel","RefinerOptionsComponent","modalToggleWrapperClassName","RefinerFunctionalComponent","renderMobile","isMobileView","refinerModalProps","refinerHeaderProps","refinerModalToggleProps","createComponentInMobileView","refinerFooterProps","createComponentInDesktopView","RefinerComponent","SearchBarComponent","currentSearchOption","searchOptionState","setSearchOptionState","currentSearchText","searchTextState","setSearchTextState","searchButtonAttributes","Search","searchOptionsAriaLabel","searchOption","clearSearchTextOnOptionChange","searchBarPlaceholder","searchBarAriaLabel","searchButtonAriaLabel","searchButtonLabel","TableCellContentType","TableHeaderComponent","contentType","TableRowComponent","TableCellComponent","TableComponent","WishListIconComponent","wishlistIconRef","wishlistTooltipText","showButtonIconTooltip","wishlistUrl","shouldShowCount","isDispayWishlistCount","wishlistCountlbl","wishlistCountLabel","wishlistItemCount","wishlistCount","countLabel","classname","MobileVideoQuality","isAllowBack","getDefaultColorSwatchSelected","attributeValues","colorAttribute","keyName","DimensionTypes","getProductImageUrlFromDefaultColorSwatch","swatchValue","swatchColorHexCode","swatchImageUrl","averageRating","productBasePrice","adjustedProductPrice","maxVariantProductPrice","channelConfig","Currency","basePrice","defaultUnitOfMeasure"],"sourceRoot":""}