{"version":3,"file":"static/js/e78eab2955cb37d02965.bundle.js","mappings":"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","sources":["webpack://@msdyn365-commerce-partners/fabrikam/./lib/active-image/module-registration.js?d2eb","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/actions/get-active-image-products.ts?0501","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/active-image-utilities/active-product.tsx?69b2","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/active-image-utilities/additional-content.tsx?6946","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/active-image-utilities/image-mapper.tsx?dd86","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/active-image/active-image.tsx?00d3","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/active-image/active-image.view.tsx?a935","webpack://@msdyn365-commerce-partners/fabrikam/external var \"React\"?0d3b","webpack://@msdyn365-commerce-partners/fabrikam/external var \"ReactDOM\"?853b"],"sourcesContent":["const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['active-image'] = {\n c: () => require('@msdyn365-commerce-modules/active-image/dist/lib/modules/active-image/active-image'),\n $type: 'contentModule',\n da: [{name:'products', path:'@msdyn365-commerce-modules/active-image/dist/lib/modules/actions/get-active-image-products', runOn: 0}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'active-image',\n p: 'active-image',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/active-image/dist/lib/modules/active-image'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/active-image/dist/lib/modules/actions/get-active-image-products';\n let dataAction = require('@msdyn365-commerce-modules/active-image/dist/lib/modules/actions/get-active-image-products');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['@msdyn365-commerce-modules|active-image|modules|active-image|active-image'] = {\n c: () => require('@msdyn365-commerce-modules/active-image/dist/lib/modules/active-image/active-image.view.js'),\n cn: '@msdyn365-commerce-modules-active-image-active-image'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { ProductLookupClause, ProductsDataActions, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IActiveImageConfig, IActivePointsData } from '../active-image';\n\n/**\n * ActiveImageInput.\n */\nexport class ActiveImageInput implements IActionInput {\n public config: IActiveImageConfig;\n\n private readonly _cacheKey: string = 'ActiveImage';\n\n public constructor(config: IActiveImageConfig) {\n this.config = config;\n\n if (this.config.activePoints && ArrayExtensions.hasElements(this.config.activePoints)) {\n for (const activePointData of this.config.activePoints) {\n if (activePointData.itemId) {\n this._cacheKey = `${this._cacheKey}-${activePointData.itemId.toString()}`;\n }\n }\n }\n }\n\n /**\n * GetCacheObjectType.\n * @returns - Returns string.\n */\n public getCacheObjectType = (): string => 'ActiveImageFullProductSearchResult';\n\n /**\n * GetCacheKey.\n * @returns - Returns string.\n */\n public getCacheKey = (): string => this._cacheKey;\n\n /**\n * DataCacheType.\n * @returns - CacheType string.\n */\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * CreateInput.\n * @param inputData - IActionContext.\n * @returns - IActionInput.\n */\nexport const createInput = (inputData: ICreateActionContext): IActionInput => {\n return new ActiveImageInput(inputData.config as IActiveImageConfig);\n};\n\n/**\n * Action.\n * @param input - ActiveImageInput.\n * @param context - IActionContext.\n * @returns - ProductSearchResult[].\n */\nexport const getActiveImageproductAction = async (input: ActiveImageInput, context: IActionContext): Promise => {\n const { config } = input;\n const itemIds: ProductLookupClause[] = [];\n if (config.activePoints) {\n config.activePoints.map((activePointData: IActivePointsData) => itemIds.push({ ItemId: activePointData.itemId }));\n }\n const searchCriteriaInput: ProductSearchCriteria = {};\n const catalogId = getCatalogId(context.requestContext);\n validateCatalogId(catalogId);\n\n searchCriteriaInput.Context = {\n ChannelId: context.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n };\n if (process.env.NODE_ENV === 'development' && process.env.ENABLE_CLOUD_SEARCH?.toLowerCase() !== 'true') {\n searchCriteriaInput.IncludeAttributes = false;\n } else {\n searchCriteriaInput.IncludeAttributes = true;\n }\n searchCriteriaInput.ItemIds = itemIds;\n if (!config.activePoints || !ArrayExtensions.hasElements(config.activePoints)) {\n throw new Error('Fail to call ActiveImage API no active points configured.');\n }\n // eslint-disable-next-line no-return-await -- Disable because we want to return the promise.\n return await ProductsDataActions.searchByCriteriaAsync({ callerContext: context }, searchCriteriaInput);\n};\n\n/**\n * Action.\n * @param id - Id.\n * @param action - Action.\n * @returns - Results.\n */\nexport const actionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/active-image/get-active-image-products',\n action: getActiveImageproductAction as IAction,\n input: createInput\n});\n\nexport default actionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent, RatingComponent } from '@msdyn365-commerce/components';\nimport {\n IComponent,\n IComponentProps,\n ICoreContext,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * IActiveProductProps interface.\n */\nexport interface IActiveProductProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n}\n\n/**\n * IActiveProduct interface.\n */\nexport interface IActiveProduct extends IComponent {}\n\n/**\n * RenderDescription function.\n * @param description - Product description string.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderDescription(description?: string): JSX.Element | null {\n return

{description}

;\n}\n\n/**\n * GetRatingAriaLabel function.\n * @param rating - Product rating number.\n * @param ratingAriaLabel - Product rating aria label.\n * @returns - Returns string.\n */\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n const numberTwo: number = 2;\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(numberTwo);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\n/**\n * RenderRating function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param ratingId - The rating id.\n * @param avgRating - The average rating.\n * @param totalRatings - The total ratings.\n * @param ariaLabel - The rating aria label.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderRating(\n context: ICoreContext,\n typeName: string,\n ratingId: 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 ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\n\n return (\n \n );\n}\n\n/**\n * RenderPrice function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param productId - The product id.\n * @param basePrice - The base price of the product.\n * @param adjustedPrice - The adjusted price of the product.\n * @param savingsText - The savings text of the product.\n * @param freePriceText - The free price text.\n * @param originalPriceText - The original price text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n productId: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string\n): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n \n );\n}\n\n/**\n * RenderProductPlacementImage function.\n * @param requestContext - RequestContext.\n * @param imageSettings - The product image settings.\n * @param gridSettings - The viewport gird settings.\n * @param imageUrl - The product image url.\n * @param altText - The product image alt text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderProductPlacementImage(\n requestContext: IRequestContext,\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const imgData: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return ;\n}\n\n/**\n * ActiveProduct constant.\n * @param props - The active product props.\n * @param props.data - The product search result data.\n * @param props.context - The core context.\n * @param props.imageSettings - The prodcut image settings.\n * @param props.savingsText - The product savings text.\n * @param props.freePriceText - The free price text.\n * @param props.originalPriceText - The original price text.\n * @param props.ratingAriaLabel - The product rating aria label.\n * @param props.typeName - The type name of the module.\n * @param props.id - The id of the product.\n * @returns - Returns JSX.Element | null.\n */\nexport const ActiveProductComponent: React.FC = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n ratingAriaLabel,\n typeName,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Do not need naming convention check for library prameters\n id\n}) => {\n const product = data.product;\n if (!product) {\n return null;\n }\n\n return (\n <>\n
\n
\n {renderProductPlacementImage(\n context.actionContext.requestContext,\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name\n )}\n
\n
\n

{product.Name}

\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText)}\n {renderDescription(product.Description)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\n
\n
\n \n );\n};\n\nexport default ActiveProductComponent;\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 { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * ILinksData: Interface for\n * Additional content.\n */\ninterface ILinksData {\n linkText?: string;\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n isOpenInNewTab?: boolean;\n}\n\n/**\n * IAdditionalContentData: Interface for\n * Active content.\n */\ninterface IAdditionalContentData {\n heading?: string;\n subtext?: string;\n links?: ILinksData[];\n}\n\n/**\n * IActiveImageAdditionalContentProps: Interface for\n * Active Image Additional Content Component props.\n */\nexport interface IActiveImageAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IActiveImageAdditionalContentViewProps: Interface for\n * Active Image Additional Content view props.\n */\nexport interface IActiveImageAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Active Image Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Active Image Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Active Image Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IActiveImageAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'msc-active-image__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.isOpenInNewTab,\n role: 'button'\n };\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Active Image additonal content item props.\n * @param props - Active Image Additional content component props.\n * @returns IActiveImageAdditionalContentItemViewProps.\n */\nconst assembleNode = (item: IAdditionalContentData, props: IActiveImageAdditionalContentProps): IActiveImageAdditionalContentViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n additionalContentNode: { className: 'msc-active-image__details__additional-content' },\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentContainer: { className: 'msc-active-image__details__additional-content__container' },\n additionalContentItemLinks: { className: 'msc-active-image__details__additional__content__cta' }\n };\n};\n\n/**\n * ActiveImageAdditionalContent component.\n * @param props - Active Image Additional content component props.\n * @returns Active Image Additional content view props.\n */\nexport const activeImageAdditionalContent = (\n props: IActiveImageAdditionalContentProps\n): IActiveImageAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n return assembleNode(additionalContent, props);\n};\n\nexport default activeImageAdditionalContent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IImageData, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent | React.FocusEvent;\n\n/**\n * @interface IRgbColor\n * @description - The IRgbColor interface contract.\n */\nexport interface IRgbColor {\n rValue: number;\n gValue: number;\n bValue: number;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IArea {\n areaId: string;\n coords: number[];\n href?: string;\n center?: number[];\n primaryImageUrl?: string;\n productUrl: string;\n productSearchResult?: ProductSearchResult;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IAreaMap {\n name: string;\n areas: IArea[];\n}\n\n/**\n * @enum CanvasCalculations\n * @description - The canvas calculations enum.\n */\nexport enum CanvasCalculations {\n defaultWidth = 0,\n defaultHeight = 0,\n defaultPositionX = 0,\n defaultPositionY = 0,\n defaultScale = 1,\n halfDivisor = 2,\n doubleMultiplier = 2,\n buttonHeight = 30,\n buttonPadding = 30,\n paddingAdjustment = 3,\n expandAnimationStartWidth = 10,\n expandAnimationEndWidth = 40,\n collapseAnimationStartWidth = 40,\n collapseAnimationEndWidth = 8,\n expandRadius = 12,\n collapseRadius = 8,\n rotation = 1.57,\n startAngle = 0,\n endAngle = 7,\n clearMargin = 50,\n clearHeight = 100,\n clearWidth = 100,\n textFadeInStartValue = 0,\n textFadeOutStartValue = 0.5,\n textFadeInterval = 0.01\n}\n\n/**\n * @enum CanvasStyles\n * @description - The canvas styles enum.\n */\nexport enum CanvasStyles {\n color = '#FFFFFF',\n buttonTextClor = '#000000'\n}\n\n/**\n * @enum\n * @description - The canvas styles enum.\n */\nexport interface IImageMapperResources {\n buttonText?: string;\n altText?: string;\n}\n\n/**\n * @interface IImageMapperProps\n * @description - The IImageMapperProps interface contract.\n */\nexport interface IImageMapperProps {\n imageData: IImageData;\n areaMap: IAreaMap;\n viewPort: string;\n requestContext: IRequestContext;\n color?: string;\n buttonTextClor?: string;\n width?: number;\n imgWidth?: number;\n activeImageRefs: React.RefObject;\n imageMapperResources?: IImageMapperResources;\n onLoad?(): void;\n onClick?(area: IArea, index: number, event: AreaEvent): void;\n onFocus?(area: IArea, index: number, event: AreaEvent): void;\n onMouseEnter?(area: IArea, index: number, event: AreaEvent): void;\n onMouseLeave?(area: IArea, index: number, event: AreaEvent): void;\n}\n\n/**\n * ImageMapper.\n */\nexport class ImageMapper extends React.Component {\n private readonly _backgroundImage: React.RefObject;\n\n private readonly _container: React.RefObject;\n\n private readonly _canvas: React.RefObject;\n\n private _isDesktopViewPort: boolean = false;\n\n private _context: CanvasRenderingContext2D | null | undefined = null;\n\n public constructor(props: IImageMapperProps) {\n super(props);\n this._backgroundImage = React.createRef();\n this._container = React.createRef();\n this._canvas = React.createRef();\n }\n\n /**\n * ComponentDidMount method.\n */\n public componentDidMount(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n this.renderAreas();\n this._context = null;\n }\n\n /**\n * ComponentDidUpdate method.\n */\n public componentDidUpdate(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n }\n\n /**\n * ShouldComponentUpdate method.\n * @param nextProps - Next props.\n * @returns Returns boolean.\n */\n public shouldComponentUpdate(nextProps: IImageMapperProps): boolean {\n let shouldRender = false;\n if (nextProps !== this.props) {\n shouldRender = true;\n }\n return shouldRender;\n }\n\n /**\n * GetActiveImageWidth method - Gets the active image width.\n * @returns Returns number | undefined.\n */\n public getActiveImageWidth = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return undefined;\n };\n\n /**\n * GetActiveImageHeight method - Gets the active image height.\n * @returns Returns number | undefined.\n */\n public getActiveImageHeight = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return undefined;\n };\n\n /**\n * ConvertHexToRgb method - This method takes color in HEX format and returns IRgbColor color object.\n * @param hexColor -The color hex value.\n * @returns -Returns IRgbColor object.\n */\n public convertHexToRgb = (hexColor: string): IRgbColor => {\n // RegEx used to execute the conversion of the hex color to rgb value.\n const regEx = new RegExp('^#?([a-f\\\\d]{2})([a-f\\\\d]{2})([a-f\\\\d]{2})$', 'u');\n\n // RegEx.exec method executes a search for a match in a specified string. Returns a result array, or null.\n const result = regEx.exec(hexColor);\n const defaultValue = 0;\n return result\n ? {\n rValue: Number.parseInt(result[1], 16),\n gValue: Number.parseInt(result[2], 16),\n bValue: Number.parseInt(result[3], 16)\n }\n : {\n rValue: defaultValue,\n gValue: defaultValue,\n bValue: defaultValue\n };\n };\n\n /**\n * ApplyFadingTransition method - Applys fading transition to button text.\n * @param text -The button text.\n * @param coords -The coordinates.\n * @param rgbColor -The RGB color object.\n * @param alpha -The alpha value of the button text.\n */\n public applyFadingTransition = (text: string, coords: number[], rgbColor: IRgbColor, alpha: number): void => {\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n context.fillStyle = `rgba(${rgbColor.rValue}, ${rgbColor.gValue}, ${rgbColor.bValue}, ${alpha} )`;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * Draw button method - Draws button and contains fixed hight, padding values.\n * @param text -The button text.\n * @param coords -The coordinates.\n */\n public drawButton = (text: string, coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonHeight = CanvasCalculations.buttonHeight;\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n const buttonPositionX = coords[0] - buttonWidth / halfDivisor;\n const buttonPositionY = coords[1] - buttonHeight / halfDivisor;\n const arcsize = buttonHeight / halfDivisor;\n\n context.beginPath();\n context.moveTo(buttonPositionX + arcsize, buttonPositionY);\n context.lineTo(buttonPositionX + buttonWidth - arcsize, buttonPositionY);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY,\n buttonPositionX + buttonWidth,\n buttonPositionY + arcsize,\n arcsize\n );\n context.lineTo(buttonPositionX + buttonWidth, buttonPositionY + buttonHeight - arcsize);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY + buttonHeight,\n buttonPositionX + buttonWidth - arcsize,\n buttonPositionY + buttonHeight,\n arcsize\n );\n context.lineTo(buttonPositionX + arcsize, buttonPositionY + buttonHeight);\n context.arcTo(buttonPositionX, buttonPositionY + buttonHeight, buttonPositionX, buttonPositionY - arcsize, arcsize);\n context.lineTo(buttonPositionX, buttonPositionY + arcsize);\n context.arcTo(buttonPositionX, buttonPositionY, buttonPositionX + arcsize, buttonPositionY, arcsize);\n context.lineTo(buttonPositionX + arcsize, buttonPositionY);\n context.stroke();\n context.closePath();\n context.fillStyle = color;\n context.fill();\n context.fillStyle = buttonTextClor;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * ExpandAnimation method - Shows expand animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public expandAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.expandAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.expandAnimationEndWidth;\n const radius = CanvasCalculations.expandRadius;\n const rotation = CanvasCalculations.rotation;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeInValue = CanvasCalculations.textFadeInStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Reders expand animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n context.fillStyle = color;\n if (buttonText) {\n if (animationStartWidth < animationEndWidth) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeInValue);\n textFadeInValue += CanvasCalculations.textFadeInterval;\n animationStartWidth++;\n } else {\n this.drawButton(buttonText, [pointPositionX, pointPositionY]);\n }\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * CollapseAnimation method - Shows collapse animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public collapseAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.collapseAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.collapseAnimationEndWidth;\n const rotation = CanvasCalculations.rotation;\n const clearMargin = CanvasCalculations.clearMargin;\n const clearHeight = CanvasCalculations.clearHeight;\n const clearWidth = CanvasCalculations.clearWidth;\n const radius = CanvasCalculations.collapseRadius;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeOutValue = CanvasCalculations.textFadeOutStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Renders collapse animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.clearRect(pointPositionX - clearMargin, pointPositionY - clearMargin, clearWidth, clearHeight);\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n if (animationEndWidth < animationStartWidth && buttonText) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeOutValue);\n textFadeOutValue -= CanvasCalculations.textFadeInterval;\n animationStartWidth--;\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * DrawCircle method - Renders active points.\n * @param coords -Coordinates.\n */\n public drawCircle = (coords: number[]): void => {\n const { color = CanvasStyles.color, viewPort } = this.props;\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n const startAngle: number = CanvasCalculations.startAngle;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n const radius = viewPort === 'xs' || viewPort === 'sm' ? coords[2] * doubleMultiplier : coords[2];\n if (!context) {\n return;\n }\n context.fillStyle = color;\n context.beginPath();\n context.strokeStyle = color;\n context.arc(coords[0], coords[1], radius, startAngle, Math.PI * doubleMultiplier);\n context.closePath();\n context.stroke();\n context.fill();\n };\n\n /**\n * ScaleCoords method - To scale the active point coordinates based on the window size.\n * @param coords -Coordinates.\n * @returns -Returns number[].\n */\n public scaleCoords = (coords: number[]): number[] => {\n const { imgWidth } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultScale: number = CanvasCalculations.defaultScale;\n\n // Calculate scale based on current 'width' and the original 'imgWidth'\n const width = this.getActiveImageWidth();\n const scale = width && imgWidth && imgWidth > defaultWidth ? width / imgWidth : defaultScale;\n return coords.map(coord => coord * scale);\n };\n\n /**\n * RenderPrefilledAreas method - To render active points in case of events.\n */\n public renderPrefilledAreas = (): void => {\n const { areaMap } = this.props;\n areaMap.areas.map(area => {\n this.drawCircle(this.scaleCoords(area.coords));\n return null;\n });\n };\n\n /**\n * ComputeCenter method - To re-calculate the center of active point based on window size.\n * @param area -IArea.\n * @returns -Returns number[].\n */\n public computeCenter = (area: IArea): number[] => {\n const scaledCoords = this.scaleCoords(area.coords);\n return [scaledCoords[0], scaledCoords[1]];\n };\n\n /**\n * HandleHoverOn method - To handle mouse hover on event.\n * @param area -IArea.\n */\n public handleHoverOn = (area: IArea): void => {\n if (area.center && this._canvas.current) {\n this.drawCircle(this.scaleCoords(area.coords));\n this.expandAnimation(area.center);\n }\n };\n\n /**\n * HandleHoverOff method - To handle mouse hover off event.\n * @param area -IArea.\n */\n public handleHoverOff = (area: IArea): void => {\n if (this._canvas.current) {\n const context = this._canvas.current.getContext('2d') ?? this._context;\n const canvasPositionX: number = CanvasCalculations.defaultPositionX;\n const canvasPositionY: number = CanvasCalculations.defaultPositionY;\n\n if (!context) {\n return;\n }\n context.clearRect(canvasPositionX, canvasPositionY, this._canvas.current.width, this._canvas.current.height);\n this.renderPrefilledAreas();\n if (area.center) {\n this.collapseAnimation(area.center);\n }\n }\n };\n\n /**\n * Click method - Mouse click event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public click = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onClick } = this.props;\n if (onClick) {\n event.preventDefault();\n onClick(area, index, event);\n }\n };\n\n /**\n * HoverOn method - Mouse hover on event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOn = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseEnter } = this.props;\n this.handleHoverOn(area);\n if (onMouseEnter) {\n onMouseEnter(area, index, event);\n }\n };\n\n /**\n * HoverOff method - Mouse hover off event.\n * @param area - IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOff = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseLeave } = this.props;\n\n this.handleHoverOff(area);\n\n if (onMouseLeave) {\n onMouseLeave(area, index, event);\n }\n };\n\n /**\n * RenderAreas method - Renders active points at given coordinates.\n * @returns -Returns JSX.Element[].\n */\n public renderAreas = (): JSX.Element[] => {\n const { areaMap, viewPort } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText ? this.props.imageMapperResources.buttonText : '';\n const altText = this.props.imageMapperResources?.altText ? this.props.imageMapperResources.altText : '';\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n\n return areaMap.areas.map((area, index) => {\n const scaledCoords = this.scaleCoords(area.coords);\n const xsRadius = area.coords[2] * doubleMultiplier;\n if (viewPort === 'xs') {\n scaledCoords[2] = xsRadius;\n }\n const center = this.computeCenter(area);\n const extendedArea = { ...area, scaledCoords, center };\n const areaKey = `area-${index}`;\n const altTextWithProductName = altText\n .replace('{buttonText}', buttonText ? buttonText : '')\n .replace('{productName}', area.productSearchResult?.Name ? area.productSearchResult.Name : '');\n return (\n \n );\n });\n };\n\n /**\n * InitCanvas method - To render the canvas.\n */\n public initCanvas = (): void => {\n if (!this._canvas.current || !this._backgroundImage.current || !this._container.current) {\n return;\n }\n\n const { color, onLoad } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultHeight: number = CanvasCalculations.defaultHeight;\n\n const canvasWidth = this.getActiveImageWidth() ?? defaultWidth;\n const canvasHeight = this.getActiveImageHeight() ?? defaultHeight;\n\n this._canvas.current.width = canvasWidth;\n this._canvas.current.height = canvasHeight;\n this._container.current.style.width = `${canvasWidth}px`;\n\n const context = this._canvas.current.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.fillStyle = color ?? '';\n\n if (onLoad) {\n onLoad();\n }\n\n this.renderPrefilledAreas();\n };\n\n /**\n * Render method - To render the image mapper component with active image, canvas and active points.\n * @returns -Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const { imageData, areaMap, requestContext } = this.props;\n\n return (\n
\n \n \n \n {this.renderAreas()}\n \n
\n );\n }\n}\n\nexport default ImageMapper;\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 { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n activeImageAdditionalContent,\n ActiveProductComponent,\n IActiveImageAdditionalContentViewProps,\n IArea,\n IAreaMap,\n IImageMapperProps,\n ImageMapper\n} from '../active-image-utilities';\nimport { IActiveImageData } from './active-image.data';\nimport { IActiveImageProps } from './active-image.props.autogenerated';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent | React.FocusEvent;\n\n/**\n * @interface IActiveImageViewProps\n * @classdesc - The IActiveImageViewProps interface contract.\n */\nexport interface IActiveImageViewProps extends IActiveImageProps<{}>, IImageMapperProps {\n activePointContainer: IModuleProps;\n activePointDetailsContainer: INodeProps;\n imageMapper: React.ReactNode;\n overlay: React.ReactNode;\n productCard: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IActiveImageAdditionalContentViewProps;\n productCardleftPosition: number;\n productCardtopPosition: number;\n handleAdditionalText?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalParagraph?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalLinkText?(event: MsDyn365.ContentEditableEvent): void;\n}\n\n/**\n * @interface IActiveImageLinksData\n * @classdesc - The IActiveImageLinksData interface contract.\n */\nexport interface IActiveImageLinksData {\n linkText?: string;\n linkUrl: MsDyn365.ILinkData;\n ariaLabel?: string;\n willOpenInNewTab?: boolean;\n}\n\n/**\n * @interface IActiveImageState\n * @classdesc - The IActiveImageState interface contract.\n */\ninterface IActiveImageState {\n clientWidth: number;\n area: IArea | null;\n viewport: string;\n overlayClass: string;\n}\n\n/**\n * @enum ActiveImageConstants\n * @description - The active image constants enum.\n */\nexport enum ActiveImageConstants {\n timeoutInterval = 200,\n enterKey = 'Enter',\n escKey = 'Escape'\n}\n\n/**\n *\n * ActiveImage class.\n * @extends {React.PureComponent & IImageMapperProps, IActiveImageState>}\n */\nexport class ActiveImage extends React.PureComponent & IImageMapperProps, IActiveImageState> {\n private readonly _telemetryContent: ITelemetryContent;\n\n private _isDesktopViewPort: boolean;\n\n private readonly _defaultProductCardWidth: number = 315;\n\n private readonly _defaultProdutCardHight: number = 490;\n\n private readonly _activePoints: IArea[] = [];\n\n private readonly _activeImageRefs: React.RefObject;\n\n private readonly _activeImageClass: string;\n\n private readonly _productCardDivRef: React.RefObject;\n\n public constructor(props: IActiveImageProps & IImageMapperProps) {\n super(props);\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this._activeImageClass = `msc-active-image-${this.getActiveImageId()}`;\n this.state = {\n clientWidth: 0,\n area: null,\n viewport,\n overlayClass: ''\n };\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n this._activeImageRefs = React.createRef();\n this._productCardDivRef = React.createRef();\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('resize', this.updateClientWidth);\n document.addEventListener('keydown', this.keyDown, false);\n document.addEventListener('mousedown', this._handleOutsideClick);\n }\n setTimeout(() => {\n this.updateClientWidth();\n }, ActiveImageConstants.timeoutInterval);\n\n if (MsDyn365.msdyn365Commerce.isBrowser && this._activeImageRefs.current) {\n const images: HTMLCollectionOf = this._activeImageRefs.current.getElementsByClassName(\n 'msc-thumbnail_image msc-active-image-img'\n );\n if (ArrayExtensions.hasElements(Array.from(images))) {\n images[0].removeAttribute('usemap');\n }\n }\n }\n\n /**\n * AddActivePoints method - To handle add Active Points.\n * @param area - IArea.\n * @param product - ProductSearchResult.\n * @param coords - Coords.\n * @param productUrl - String.\n */\n public addActivePoints = (area: IArea | undefined, product: ProductSearchResult, coords: number[], productUrl: string): void => {\n if (!area) {\n this._activePoints.push({\n areaId: product.RecordId.toString(),\n coords,\n primaryImageUrl: product.PrimaryImageUrl ?? '',\n productUrl,\n productSearchResult: product\n });\n }\n };\n\n /**\n * ComponentWillUnmount method.\n */\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('resize', this.updateClientWidth);\n document.removeEventListener('keydown', (this.keyDown as unknown) as EventListener, false);\n document.removeEventListener('mousedown', this._handleOutsideClick, false);\n }\n }\n\n /**\n * UpdateClientWidth method to update client width in state.\n */\n public updateClientWidth = (): void => {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this.setState({ clientWidth: this.getActiveImageWidth(), viewport });\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n };\n\n /**\n * Render method.\n * @returns - Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const viewProps: IActiveImageViewProps = {\n ...(this.props as IImageMapperProps & IActiveImageProps<{}>),\n activePointContainer: {\n moduleProps: this.props,\n className: classnames('msc-active-image', this._activeImageClass, this.props.config.className)\n },\n activePointDetailsContainer: {\n tag: 'div',\n className: classnames('msc-active-image-wrapper', this._activeImageClass, this.props.config.className),\n ref: this._activeImageRefs\n },\n imgWidth: this.props.config.canvasWidth,\n imageMapper: this.renderImageMapper(),\n overlay: this.renderOverlay(),\n productCard: this.renderProductCard(),\n productCardleftPosition: this.getProductCardPositionX(),\n productCardtopPosition: this.getProductCardPositionY(),\n title: this.renderActiveImageDetailsHeading(),\n text: this.renderActiveImageDetailsParagraph(),\n links: this.renderActiveImageDetailsLinks(),\n detailsContainer: { className: 'msc-active-image__details' },\n detailsContainerCta: { className: 'msc-active-image__details__cta' },\n additionalContent: activeImageAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleAdditionalLinkText: this.handleAdditionalTextChange\n };\n\n return this.props.renderView(viewProps);\n }\n\n /**\n * RenderImageMapper method - To render image mapper.\n * @returns - Returns React.ReactNode | null.\n */\n public renderImageMapper = (): React.ReactNode | null => {\n const { config, context } = this.props;\n const defaultPosition: number = 0;\n const defaultLength: number = 0;\n const productResults = this.props.data.products.result;\n if (config.activePoints && productResults) {\n for (const product of productResults) {\n for (const configProduct of config.activePoints) {\n if (product.ItemId === configProduct.itemId) {\n const productUrl = getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined);\n const coords = [\n configProduct.xPosition ?? defaultPosition,\n configProduct.yPosition ?? defaultPosition,\n configProduct.radius ?? defaultPosition\n ];\n const area = this._activePoints.find(activePoint => JSON.stringify(activePoint.coords) === JSON.stringify(coords));\n this.addActivePoints(area, product, coords, productUrl);\n }\n }\n }\n }\n const mappedArea: IAreaMap = {\n name: `map-${this._activeImageClass}`,\n areas: this._activePoints.length > defaultLength ? this._activePoints : []\n };\n\n // If image is null, we want to render the placeholder SVG - by passing image data with empty src\n return (\n \n );\n };\n\n /**\n * EnterArea method - To handle mouse enter event.\n * @param area - Active point area.\n * @param index - Active point index.\n * @param event - Active point AreaEvent.\n */\n public enterArea = (area: IArea, index: number, event: AreaEvent): void => {\n this.setState({ area, overlayClass: 'msc-active-image-overlay' });\n if (this.props.onMouseEnter) {\n this.props.onMouseEnter(area, index, event);\n }\n if (event.type.toLocaleLowerCase() === 'click' && this._isDesktopViewPort) {\n window.open(area.productUrl, '_self');\n }\n };\n\n /**\n * LeaveArea method - To handle mouse leave event.\n */\n public leaveArea = (): void => {\n if (this._isDesktopViewPort) {\n this.resetState();\n }\n };\n\n /**\n * ResetState method - To reset the state for area and overlayclass.\n */\n public resetState = (): void => {\n this.setState({ area: null, overlayClass: '' });\n };\n\n /**\n * RenderProductComponent method - To render the product card with product information.\n * @returns - Returns React.ReactNode.\n */\n public renderProductComponent = (): React.ReactNode => {\n if (this.state.area?.productSearchResult) {\n const baseImageUrl: string = this.props.context.request.apiSettings.baseImageUrl;\n const imageUrl: string = this.state.area.primaryImageUrl ?? '';\n const primaryImageUrl: string = `${baseImageUrl}${imageUrl}`;\n const product: ProductSearchResult = this.state.area.productSearchResult;\n product.PrimaryImageUrl = primaryImageUrl;\n\n return (\n \n );\n }\n return React.Fragment;\n };\n\n /**\n * RenderProductCard method - To render product cards.\n * @returns - Returns React.ReactNode.\n */\n public renderProductCard = (): React.ReactNode => {\n const { area } = this.state;\n\n return (\n <>\n {area?.center && (\n
\n
\n {!this._isDesktopViewPort &&
\n
\n )}\n \n );\n };\n\n /**\n * RenderOverlay method - To render overlay for non desktop viewports.\n * @returns - Returns React.ReactNode.\n */\n public renderOverlay = (): React.ReactNode => {\n return <>{!this._isDesktopViewPort &&
};\n };\n\n /**\n * GetProductCardPositionX method - Provides product card x position to the left or right of active point based on available space.\n * For xs, sm and md viewports it provides x position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionX = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsWidth = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.w\n : defaultImageSettings.viewports.lg?.w;\n const defaultPositionX: number = 0;\n const halfDivisor: number = 2;\n const productCardWidth: number = productImageSettingsWidth ? productImageSettingsWidth : this._defaultProductCardWidth;\n const { area, clientWidth, viewport } = this.state;\n const pointPositionX = area?.center?.[0] ?? clientWidth / halfDivisor;\n const leftAllignPosition = pointPositionX - productCardWidth - productCardWidth / halfDivisor;\n const rightAllignPosition = pointPositionX + productCardWidth / halfDivisor;\n let position: number = (clientWidth - productCardWidth) / halfDivisor;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n if (leftAllignPosition < defaultPositionX) {\n position = rightAllignPosition;\n } else {\n position = leftAllignPosition;\n }\n }\n return position;\n };\n\n /**\n * GetProductCardPositionY method - Provides product card y position in center with respect to active point.\n * For xs, sm and md viewports it provides y position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionY = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsHeight = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.h\n : defaultImageSettings.viewports.lg?.h;\n const halfDivisor: number = 2;\n const { area, viewport } = this.state;\n const produtCardHight: number = productImageSettingsHeight ? productImageSettingsHeight : this._defaultProdutCardHight;\n const pointPositionY = (this.getActiveImageHeight() - produtCardHight) / halfDivisor;\n let position: number = pointPositionY;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n position = (area?.center?.[1] ?? this.getActiveImageHeight() / halfDivisor) - produtCardHight / halfDivisor;\n }\n return position;\n };\n\n /**\n * GetDefaultImageSettings method.\n * @returns MsDyn365.IImageSettings.\n */\n public getDefaultImageSettings = (): MsDyn365.IImageSettings => {\n const defaultImageSettings: MsDyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n lg: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n xl: { q: 'w=275&h=275&m=6', w: 275, h: 275 }\n },\n lazyload: true\n };\n\n return defaultImageSettings;\n };\n\n /**\n * KeyDown method - To handle keydown event.\n * @param event - KeyboardEvent.\n */\n public keyDown = (event: KeyboardEvent): void => {\n if (event.key === ActiveImageConstants.enterKey) {\n const target: HTMLElement = event.target as HTMLElement;\n if (target.nodeName === 'AREA') {\n const area: HTMLAreaElement = target as HTMLAreaElement;\n if (area.href) {\n window.open(area.href, '_self');\n }\n }\n }\n if (event.key === ActiveImageConstants.escKey) {\n this.resetState();\n }\n };\n\n /**\n * GetActiveImageWidth method - To get active image width.\n * @returns Returns number.\n */\n public getActiveImageWidth = (): number => {\n const defaultWidth: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return defaultWidth;\n };\n\n /**\n * GetActiveImageHeight method - To get active image height.\n * @returns Returns number.\n */\n public getActiveImageHeight = (): number => {\n const defaultHeight: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return defaultHeight;\n };\n\n /**\n * HandleLinkTextChange method - To handle link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleTextChange method - To handle text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * HandleParagraphChange method - To handle paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * HandleAdditionalTextChange method - To handle additional text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalLinkTextChange method - To handle additional link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalParagraphChange method - To handle additional paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * RenderActiveImageDetailsLinks method - To render active image details links.\n * @returns - React node.\n */\n public renderActiveImageDetailsLinks = (): React.ReactNode[] | undefined => {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this._telemetryContent, '');\n\n return links?.map((linkData: IActiveImageLinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this._telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'msc-active-image__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.willOpenInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n };\n\n /**\n * RenderActiveImageDetailsHeading method - To render active image details heading.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsHeading = (): React.ReactNode | undefined => {\n const { heading } = this.props.config;\n\n return (\n heading && (\n \n )\n );\n };\n\n /**\n * RenderActiveImageDetailsParagraph method - To render active image details paragraph.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsParagraph = (): React.ReactNode | undefined => {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n \n )\n );\n };\n\n /**\n * GetActiveImageId - To get active image id from src.\n * @returns - String.\n */\n public getActiveImageId = (): string => {\n const { activeImage } = this.props.config;\n let activeImageId: string = '';\n if (activeImage?.src) {\n const activeImageSource = activeImage.src.split('/');\n const decrementOne: number = 1;\n const activeImageIdPart = activeImageSource[activeImageSource.length - decrementOne].split('?');\n activeImageId = activeImageIdPart[0] ?? '';\n }\n return activeImageId;\n };\n\n /**\n * Handle outside click method - To handle outside click of the active image product.\n * @param event - Mouse event.\n */\n private readonly _handleOutsideClick = (event: MouseEvent) => {\n if (this._productCardDivRef.current?.contains(event.target as Node)) {\n return;\n }\n this.resetState();\n };\n}\nexport default ActiveImage;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IActiveImageAdditionalContentViewProps } from '../active-image-utilities';\nimport { IActiveImageViewProps } from './active-image';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IActiveImageAdditionalContentViewProps) => {\n return (\n \n {additionalContent.heading}\n \n {additionalContent.text}\n {additionalContent.links}\n \n \n );\n};\n\n/**\n * Render View.\n * @param props - The view props.\n * @returns -The JSX Element.\n */\nexport const activeImageView: React.FC = props => {\n return (\n \n \n {props.imageMapper}\n \n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n \n {props.links}\n \n \n \n \n {props.overlay}\n {props.productCard}\n \n \n );\n};\n\nexport default activeImageView;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["binding","modules","dataActions","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","md","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","id","window","__bindings__","_objectSpread","viewDictionary","cn","ActiveImageInput","constructor","config","_cacheKey","getCacheObjectType","getCacheKey","this","dataCacheType","activePoints","ArrayExtensions","hasElements","activePointData","itemId","toString","createInput","inputData","getActiveImageproductAction","async","input","context","itemIds","map","push","ItemId","searchCriteriaInput","catalogId","getCatalogId","requestContext","validateCatalogId","Context","ChannelId","apiSettings","channelId","CatalogId","IncludeAttributes","ItemIds","ProductsDataActions","callerContext","actionDataAction","createObservableDataAction","action","renderRating","typeName","ratingId","avgRating","totalRatings","ariaLabel","_totalRatings$toStrin","numberRatings","undefined","ratingAriaLabel","rating","roundedRating","toFixed","format","getRatingAriaLabel","React","RatingComponent","ratingCount","readOnly","data","ActiveProductComponent","_ref","imageSettings","savingsText","freePriceText","originalPriceText","product","className","gridSettings","imageUrl","altText","imgData","src","imageProps","cropFocalRegion","Image","Object","assign","loadFailureBehavior","renderProductPlacementImage","actionContext","request","PrimaryImageUrl","Name","productId","basePrice","adjustedPrice","price","BasePrice","AdjustedPrice","CustomerContextualPrice","PriceComponent","renderPrice","Price","description","Description","app","hideRating","AverageRating","TotalRatings","assembleNode","item","props","_item$links","headingNode","heading","renderHeading","additionalContentHeading","Msdyn365","text","tag","editProps","onEdit","event","handleAdditionalTextChange","paragraphNode","subtext","renderParagraph","additionalContentParagraphText","linksNode","links","ctaLink","index","renderLinks","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","isOpenInNewTab","role","key","link","onTextChange","handleAdditionalLinkTextChange","additionalContentNode","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","super","_isDesktopViewPort","_context","getActiveImageWidth","MsDyn365","isBrowser","activeImageReferenceValue","activeImageRefs","current","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","result","RegExp","exec","rValue","Number","parseInt","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","_this$_canvas$current","_this$_canvas$current2","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","width","fillStyle","document","body","parentElement","getAttribute","fillText","drawButton","_this$_canvas$current3","_this$_canvas$current4","color","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","_this$props$imageMapp","buttonText","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","radius","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","toLocaleLowerCase","animate","_this$_canvas$current5","_this$_canvas$current6","ellipse","requestAnimationFrame","textFadeInterval","collapseAnimation","_this$props$imageMapp2","collapseAnimationStartWidth","collapseAnimationEndWidth","clearMargin","clearHeight","clearWidth","collapseRadius","textFadeOutValue","textFadeOutStartValue","_this$_canvas$current7","_this$_canvas$current8","clearRect","drawCircle","_this$_canvas$current9","_this$_canvas$current10","viewPort","doubleMultiplier","strokeStyle","arc","Math","PI","scaleCoords","imgWidth","defaultWidth","defaultScale","scale","coord","renderPrefilledAreas","areaMap","areas","area","computeCenter","scaledCoords","handleHoverOn","center","handleHoverOff","_this$_canvas$current11","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","height","click","onClick","preventDefault","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","_this$props$imageMapp3","_this$props$imageMapp4","_area$productSearchRe","xsRadius","extendedArea","areaKey","altTextWithProductName","replace","productSearchResult","shape","join","onFocus","onBlur","href","productUrl","tabIndex","alt","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","style","componentDidMount","componentDidUpdate","shouldComponentUpdate","nextProps","shouldRender","render","_requestContext$gridS","imageData","ref","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","_product$PrimaryImage","areaId","RecordId","primaryImageUrl","updateClientWidth","viewport","isMobile","variant","VariantType","Browser","setState","renderImageMapper","_this$props$config$ac","productResults","products","configProduct","_product$Name","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","getProductPageUrlSync","xPosition","yPosition","find","activePoint","JSON","stringify","mappedArea","_activeImageClass","length","state","enterArea","leaveArea","activeImage","_activeImageRefs","resources","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","type","open","resetState","renderProductComponent","_this$state$area","_this$state$area$prim","_product$ItemId","baseImageUrl","productImageSettings","renderProductCard","_productCardDivRef","renderOverlay","getProductCardPositionX","_this$props$config$pr","_this$props$config$pr2","_defaultImageSettings","_area$center$","_area$center","defaultImageSettings","getDefaultImageSettings","productImageSettingsWidth","viewports","lg","w","productCardWidth","leftAllignPosition","position","getProductCardPositionY","_this$props$config$pr3","_this$props$config$pr4","_defaultImageSettings2","productImageSettingsHeight","h","produtCardHight","_area$center$2","_area$center2","xs","q","xl","lazyload","keyDown","enterKey","target","nodeName","escKey","handleTextChange","value","handleParagraphChange","paragraph","renderActiveImageDetailsLinks","payLoad","getPayloadObject","_telemetryContent","linkData","contentAction","etext","attributes","getTelemetryAttributes","linkId","willOpenInNewTab","additionalProperties","handleLinkTextChange","renderActiveImageDetailsHeading","_heading$tag","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","_activeImageIdPart$","activeImageSource","split","decrementOne","_handleOutsideClick","_this$_productCardDiv","contains","getTelemetryObject","telemetryPageName","friendlyName","telemetry","addEventListener","setTimeout","timeoutInterval","images","getElementsByClassName","Array","from","removeAttribute","componentWillUnmount","removeEventListener","viewProps","activePointContainer","moduleProps","classnames","activePointDetailsContainer","imageMapper","overlay","productCard","productCardleftPosition","productCardtopPosition","title","detailsContainer","detailsContainerCta","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","renderView","_this$props$config$ad","activeImageView","Module","Node","top","left","module","exports","ReactDOM"],"sourceRoot":""}