{"version":3,"file":"static/js/47c5482013136a3ad52b.bundle.js","mappings":"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","sources":["webpack://sgi-bookstore/./lib/active-image/module-registration.js?d2eb","webpack://sgi-bookstore/./src/modules/actions/get-active-image-products.ts?0501","webpack://sgi-bookstore/./src/modules/active-image-utilities/active-product.tsx?69b2","webpack://sgi-bookstore/./src/modules/active-image-utilities/additional-content.tsx?6946","webpack://sgi-bookstore/./src/modules/active-image-utilities/image-mapper.tsx?dd86","webpack://sgi-bookstore/./src/modules/active-image/active-image.tsx?00d3","webpack://sgi-bookstore/./src/modules/active-image/active-image.view.tsx?a935","webpack://sgi-bookstore/external var \"React\"?0d3b","webpack://sgi-bookstore/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 searchCriteriaInput.IncludeAttributes = true;\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","additionalContentNode","heading","renderHeading","additionalContentHeading","Msdyn365","text","tag","editProps","onEdit","event","handleAdditionalTextChange","subtext","renderParagraph","additionalContentParagraphText","links","ctaLink","index","renderLinks","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","isOpenInNewTab","role","key","link","onTextChange","handleAdditionalLinkTextChange","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":""}