{"version":3,"sources":["webpack:///./src/modules/dobbies-product-carousel/dobbies-product-carousel.view.tsx?113a","webpack:///./src/modules/dobbies-product-carousel/active-image-utilities/active-product.tsx?a285","webpack:///./src/modules/dobbies-product-carousel/active-image-utilities/additional-content.tsx?2f21","webpack:///./src/modules/dobbies-product-carousel/active-image-utilities/image-mapper.tsx?5fd4","webpack:///./src/modules/dobbies-product-carousel/active-image-utilities/active-products-carousel.tsx?96f3","webpack:///./src/modules/dobbies-product-carousel/dobbies-product-carousel.tsx?a9ab","webpack:///src/modules/actions/get-active-image-products.ts?a551","webpack:///external \"React\"?c481","webpack:///external \"ReactDOM\"?4b2d","webpack:///./lib/dobbies-product-carousel/module-registration.js?ac1d"],"names":["activeImageView","props","React","Module","Object","activePointContainer","Node","activePointImageContainer","imageMapper","additionalContent","productCard","activePointDetailsContainer","featuredProducts","ActiveProductComponent","data","context","imageSettings","savingsText","freePriceText","originalPriceText","seeMoreButtonText","typeName","id","product","url","className","requestContext","gridSettings","imageUrl","altText","imgData","src","imageProps","cropFocalRegion","Image","loadFailureBehavior","renderProductPlacementImage","actionContext","request","PrimaryImageUrl","Name","productId","basePrice","adjustedPrice","price","BasePrice","AdjustedPrice","CustomerContextualPrice","PriceComponent","renderPrice","Price","href","assembleNode","item","additionalContentNode","text","subtext","additionalContentParagraphText","Msdyn365","tag","editProps","onEdit","event","handleAdditionalTextChange","renderParagraph","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","CanvasCalculations","CanvasStyles","ImageMapper","Component","constructor","super","_context","getActiveImageWidth","MsDyn365","isBrowser","activeImageReferenceValue","this","activeImageRefs","current","clientWidth","getActiveImageHeight","clientHeight","drawMinus","coords","color","x","y","radius","_canvas","getContext","length","innerPadding","strokeStyle","lineWidth","strokeRatio","beginPath","moveTo","lineTo","stroke","drawPlus","drawCircle","doubleMultiplier","startAngle","fillStyle","arc","Math","PI","closePath","fill","scaleCoords","imgWidth","defaultWidth","defaultScale","width","scale","renderPrefilledAreas","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","clearRect","height","areaMap","activeArea","areas","forEach","area","scaledCoords","black","white","computeCenter","hoverOn","index","onMouseEnter","hoverOff","onMouseLeave","renderAreas","buttonText","imageMapperResources","map","center","extendedArea","areaKey","altTextWithProductName","replace","productSearchResult","key","shape","join","onFocus","onBlur","tabIndex","alt","initCanvas","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","style","createRef","componentDidMount","componentDidUpdate","shouldComponentUpdate","nextProps","shouldRender","render","imageData","ref","useMap","name","ActiveProductsCarousel","activeIndex","products","next","prev","Carousel","previous","interval","onClick","disabled","CarouselItem","DeviceType","ActiveImageConstants","ActiveImage","_defaultProdutCardHight","_activePoints","detailsRef","overlayRef","addActivePoints","productUrl","push","areaId","RecordId","toString","primaryImageUrl","updateClientWidth","viewport","isMobile","variant","VariantType","Browser","device","Mobile","Tablet","Desktop","backgroundColor","fontColor","config","classList","add","background","display","gradientColor","setState","undefined","resetState","onNext","min","state","onPrev","max","renderAllFeaturedProducts","activePoints","allFeaturedHeading","productImageSettings","lazyload","disableLazyLoad","SingleSlideCarousel","point","ProductContainer","role","ProductComponent","telemetryContent","_telemetryContent","resources","renderActiveProductsCarousel","renderProductComponent","renderAdditionalContent","isDesktop","detailsColors","detailsContainer","detailsContainerCta","title","renderActiveImageDetailsHeading","links","renderActiveImageDetailsLinks","handleAdditionalParagraphChange","handleAdditionalLinkTextChange","renderImageMapper","productResult","productsCarousel","result","filteredProducts","filter","AttributeValues","some","TextValue","productResults","includes","console","log","configProduct","ItemId","itemId","getProductPageUrlSync","xPosition","yPosition","find","activePoint","JSON","stringify","mappedArea","_activeImageClass","activeImage","viewPort","enterArea","leaveArea","_activeImageRefs","altTextForSeeMoreButtonWithProductName","timeout","clearTimeout","type","toLocaleLowerCase","window","open","setTimeout","leaveDelay","baseImageUrl","apiSettings","renderProductCard","productCardleftPosition","getProductCardPositionX","productCardtopPosition","getProductCardPositionY","top","left","_productCardDivRef","defaultPopupWidth","cardGap","defaultRadius","extraSpace","productCardWidth","pointPositionX","leftAllignPosition","position","defaultImageSettings","getDefaultImageSettings","productImageSettingsHeight","viewports","lg","h","produtCardHight","xs","q","w","xl","keyDown","enterKey","target","nodeName","escKey","handleTextChange","handleParagraphChange","payLoad","getPayloadObject","linkData","contentAction","etext","linkText","attributes","getTelemetryAttributes","linkId","editableLink","ariaLabel","linkUrl","destinationUrl","openInNewTab","willOpenInNewTab","additionalProperties","link","onTextChange","handleLinkTextChange","heading","getActiveImageId","_handleOutsideClick","contains","getTelemetryObject","telemetryPageName","friendlyName","telemetry","Type","addEventListener","document","timeoutInterval","images","getElementsByClassName","ArrayExtensions","hasElements","Array","from","removeAttribute","componentWillUnmount","removeEventListener","showAllFeatured","viewProps","moduleProps","classnames","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","renderView","linkIndex","Number","value","ActiveImageInput","_cacheKey","getCacheObjectType","getCacheKey","dataCacheType","activePointData","createInput","inputData","getActiveImageproductAction","async","input","itemIds","searchCriteriaInput","Context","ChannelId","channelId","CatalogId","catalogId","module","exports","ReactDOM","binding","modules","dataActions","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","md","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","registerSanitizedActionPath","__bindings__","viewDictionary","cn"],"mappings":"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","file":"static/js/112.fa840a2c92e470df3b1c.chunk.js","sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IActiveImageViewProps } from './dobbies-product-carousel'\r\n\r\nexport const activeImageView: React.FC = props => {\r\n return (\r\n \r\n \r\n {props.imageMapper}\r\n {props.additionalContent}\r\n \r\n {props.productCard}\r\n {props.featuredProducts}\r\n \r\n );\r\n};\r\n\r\nexport default activeImageView;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport {\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageData,\r\n IImageSettings,\r\n Image,\r\n IRequestContext\r\n} from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\n\r\n/**\r\n * IActiveProductProps interface.\r\n */\r\nexport interface IActiveProductProps extends IComponentProps<{ product?: ProductSearchResult; url?: string }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n seeMoreButtonText?: string;\r\n}\r\n\r\n/**\r\n * IActiveProduct interface.\r\n */\r\nexport interface IActiveProduct extends IComponent {}\r\n\r\n/**\r\n * RenderPrice function.\r\n * @param context - The core context.\r\n * @param typeName - The type name of the module.\r\n * @param productId - The product id.\r\n * @param basePrice - The base price of the product.\r\n * @param adjustedPrice - The adjusted price of the product.\r\n * @param savingsText - The savings text of the product.\r\n * @param freePriceText - The free price text.\r\n * @param originalPriceText - The original price text.\r\n * @returns - Returns JSX.Element | null.\r\n */\r\nfunction renderPrice(\r\n context: ICoreContext,\r\n typeName: string,\r\n productId: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n savingsText?: string,\r\n freePriceText?: string,\r\n originalPriceText?: string\r\n): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\n/**\r\n * RenderProductPlacementImage function.\r\n * @param requestContext - RequestContext.\r\n * @param imageSettings - The product image settings.\r\n * @param gridSettings - The viewport gird settings.\r\n * @param imageUrl - The product image url.\r\n * @param altText - The product image alt text.\r\n * @returns - Returns JSX.Element | null.\r\n */\r\nfunction renderProductPlacementImage(\r\n requestContext: IRequestContext,\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n altText?: string\r\n): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const imgData: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings\r\n };\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return ;\r\n}\r\n\r\n/**\r\n * ActiveProduct constant.\r\n * @param props - The active product props.\r\n * @param props.data - The product search result data.\r\n * @param props.context - The core context.\r\n * @param props.imageSettings - The prodcut image settings.\r\n * @param props.savingsText - The product savings text.\r\n * @param props.freePriceText - The free price text.\r\n * @param props.originalPriceText - The original price text.\r\n * @param props.ratingAriaLabel - The product rating aria label.\r\n * @param props.typeName - The type name of the module.\r\n * @param props.id - The id of the product.\r\n * @returns - Returns JSX.Element | null.\r\n */\r\nexport const ActiveProductComponent: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n seeMoreButtonText,\r\n typeName,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Do not need naming convention check for library prameters\r\n id\r\n}) => {\r\n const { product, url } = data;\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n {renderProductPlacementImage(\r\n context.actionContext.requestContext,\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name\r\n )}\r\n
\r\n
\r\n

{product.Name}

\r\n
\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText)}\r\n \r\n {seeMoreButtonText}\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ActiveProductComponent;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\n/**\r\n * IAdditionalContentData: Interface for\r\n * Active content.\r\n */\r\ninterface IAdditionalContentData {\r\n subtext?: string;\r\n}\r\n\r\n/**\r\n * IActiveImageAdditionalContentProps: Interface for\r\n * Active Image Additional Content Component props.\r\n */\r\nexport interface IActiveImageAdditionalContentProps {\r\n requestContext: Msdyn365.IRequestContext;\r\n additionalContent: IAdditionalContentData | undefined;\r\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\r\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\r\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\r\n}\r\n\r\n/**\r\n * IActiveImageAdditionalContentViewProps: Interface for\r\n * Active Image Additional Content view props.\r\n */\r\nexport interface IActiveImageAdditionalContentViewProps {\r\n additionalContentNode: INodeProps;\r\n text: React.ReactNode;\r\n additionalContentContainer: INodeProps;\r\n additionalContentItemLinks: INodeProps;\r\n}\r\n\r\n/**\r\n * Renders additional content heading.\r\n * @param additionalContentParagraphText - Additional content paragraph text.\r\n * @param props - Active Image Additional content component props.\r\n * @returns Paragraph Node.\r\n */\r\nconst renderParagraph = (additionalContentParagraphText: string, props: IActiveImageAdditionalContentProps) => {\r\n const requestContext = props.requestContext;\r\n return (\r\n {\r\n props.handleAdditionalTextChange(event);\r\n },\r\n requestContext\r\n }}\r\n />\r\n );\r\n};\r\n\r\n/**\r\n * Create node for each additonal content item.\r\n * @param item - Active Image additonal content item props.\r\n * @param props - Active Image Additional content component props.\r\n * @returns IActiveImageAdditionalContentItemViewProps.\r\n */\r\nconst assembleNode = (item: IAdditionalContentData, props: IActiveImageAdditionalContentProps): IActiveImageAdditionalContentViewProps => {\r\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\r\n\r\n return {\r\n additionalContentNode: { className: 'msc-active-image__details__additional-content' },\r\n text: paragraphNode,\r\n additionalContentContainer: { className: 'msc-active-image__details__additional-content__container' },\r\n additionalContentItemLinks: { className: 'msc-active-image__details__additional__content__cta' }\r\n };\r\n};\r\n\r\n/**\r\n * ActiveImageAdditionalContent component.\r\n * @param props - Active Image Additional content component props.\r\n * @returns Active Image Additional content view props.\r\n */\r\nexport const activeImageAdditionalContent = (\r\n props: IActiveImageAdditionalContentProps\r\n): IActiveImageAdditionalContentViewProps | undefined => {\r\n const { additionalContent } = props;\r\n if (!additionalContent?.subtext) {\r\n return undefined;\r\n }\r\n\r\n return assembleNode(additionalContent, props);\r\n};\r\n\r\nexport default activeImageAdditionalContent;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, { IImageData, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\n\r\ntype AreaEvent = Event | React.MouseEvent | React.FocusEvent;\r\n\r\nexport interface IRgbColor {\r\n rValue: number;\r\n gValue: number;\r\n bValue: number;\r\n}\r\n\r\nexport interface IArea {\r\n areaId: string;\r\n coords: number[];\r\n center?: number[];\r\n primaryImageUrl?: string;\r\n productUrl: string;\r\n productSearchResult?: ProductSearchResult;\r\n}\r\nexport interface IAreaMap {\r\n name: string;\r\n areas: IArea[];\r\n}\r\n\r\nexport enum CanvasCalculations {\r\n defaultWidth = 0,\r\n defaultHeight = 0,\r\n defaultPositionX = 0,\r\n defaultPositionY = 0,\r\n defaultScale = 1,\r\n halfDivisor = 2,\r\n doubleMultiplier = 2,\r\n buttonHeight = 30,\r\n buttonPadding = 30,\r\n paddingAdjustment = 3,\r\n expandAnimationStartWidth = 10,\r\n expandAnimationEndWidth = 40,\r\n collapseAnimationStartWidth = 40,\r\n collapseAnimationEndWidth = 8,\r\n expandRadius = 12,\r\n collapseRadius = 8,\r\n rotation = 1.57,\r\n startAngle = 0,\r\n endAngle = 7,\r\n clearMargin = 50,\r\n clearHeight = 100,\r\n clearWidth = 100,\r\n textFadeInStartValue = 0,\r\n textFadeOutStartValue = 0.5,\r\n textFadeInterval = 0.01,\r\n innerPadding = 0.4,\r\n strokeRatio = 0.15\r\n}\r\n\r\nexport enum CanvasStyles {\r\n black = 'rgba(30, 30, 30, 0.95)',\r\n white = 'rgba(235, 235, 235, 0.95)'\r\n}\r\n\r\nexport interface IImageMapperResources {\r\n buttonText?: string;\r\n altText?: string;\r\n}\r\n\r\nexport interface IImageMapperProps {\r\n imageData: IImageData;\r\n areaMap: IAreaMap;\r\n activeArea?: IArea;\r\n viewPort: string;\r\n requestContext: IRequestContext;\r\n color?: string;\r\n buttonTextClor?: string;\r\n width?: number;\r\n imgWidth?: number;\r\n activeImageRefs: React.RefObject;\r\n imageMapperResources?: IImageMapperResources;\r\n onLoad?(): void;\r\n onClick?(area: IArea, event: AreaEvent): void;\r\n onFocus?(area: IArea, event: AreaEvent): void;\r\n onMouseEnter?(area: IArea, index: number, event: AreaEvent): void;\r\n onMouseLeave?(area: IArea, index: number, event: AreaEvent): void;\r\n}\r\nexport class ImageMapper extends React.Component {\r\n private readonly _backgroundImage: React.RefObject;\r\n\r\n private readonly _container: React.RefObject;\r\n\r\n private readonly _canvas: React.RefObject;\r\n\r\n private _context: CanvasRenderingContext2D | null | undefined = null;\r\n\r\n public constructor(props: IImageMapperProps) {\r\n super(props);\r\n this._backgroundImage = React.createRef();\r\n this._container = React.createRef();\r\n this._canvas = React.createRef();\r\n }\r\n\r\n /**\r\n * ComponentDidMount method.\r\n */\r\n public componentDidMount(): void {\r\n this.initCanvas();\r\n this.renderAreas();\r\n this._context = null;\r\n }\r\n\r\n /**\r\n * ComponentDidUpdate method.\r\n */\r\n public componentDidUpdate(): void {\r\n this.initCanvas();\r\n }\r\n\r\n /**\r\n * ShouldComponentUpdate method.\r\n * @param nextProps - Next props.\r\n * @returns Returns boolean.\r\n */\r\n public shouldComponentUpdate(nextProps: IImageMapperProps): boolean {\r\n let shouldRender = false;\r\n if (nextProps !== this.props) {\r\n shouldRender = true;\r\n }\r\n return shouldRender;\r\n }\r\n\r\n /**\r\n * GetActiveImageWidth method - Gets the active image width.\r\n * @returns Returns number | undefined.\r\n */\r\n public getActiveImageWidth = (): number | undefined => {\r\n if (MsDyn365.isBrowser) {\r\n const activeImageReferenceValue = this.props.activeImageRefs;\r\n if (activeImageReferenceValue.current !== null) {\r\n return activeImageReferenceValue.current.clientWidth;\r\n }\r\n }\r\n return undefined;\r\n };\r\n\r\n /**\r\n * GetActiveImageHeight method - Gets the active image height.\r\n * @returns Returns number | undefined.\r\n */\r\n public getActiveImageHeight = (): number | undefined => {\r\n if (MsDyn365.isBrowser) {\r\n const activeImageReferenceValue = this.props.activeImageRefs;\r\n if (activeImageReferenceValue.current !== null) {\r\n return activeImageReferenceValue.current.clientHeight;\r\n }\r\n }\r\n return undefined;\r\n };\r\n\r\n private drawMinus = (coords: number[], color: string): void => {\r\n const [x, y, radius] = coords;\r\n const context = this._canvas.current?.getContext('2d') ?? this._context;\r\n if (!context) {\r\n return;\r\n }\r\n const length = radius - radius * CanvasCalculations.innerPadding;\r\n context.strokeStyle = color;\r\n context.lineWidth = CanvasCalculations.strokeRatio * radius;\r\n context.beginPath();\r\n context.moveTo(x - length, y);\r\n context.lineTo(x + length, y);\r\n context.stroke();\r\n };\r\n\r\n private drawPlus = (coords: number[], color: string): void => {\r\n const [x, y, radius] = coords;\r\n const context = this._canvas.current?.getContext('2d') ?? this._context;\r\n if (!context) {\r\n return;\r\n }\r\n const length = radius - radius * CanvasCalculations.innerPadding;\r\n context.strokeStyle = color;\r\n context.lineWidth = CanvasCalculations.strokeRatio * radius;\r\n context.beginPath();\r\n context.moveTo(x - length, y);\r\n context.lineTo(x + length, y);\r\n context.stroke();\r\n context.beginPath();\r\n context.moveTo(x, y - length);\r\n context.lineTo(x, y + length);\r\n context.stroke();\r\n };\r\n\r\n /**\r\n * DrawCircle method - Renders active points.\r\n * @param coords -Coordinates.\r\n */\r\n public drawCircle = (coords: number[], color: string): void => {\r\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\r\n const startAngle: number = CanvasCalculations.startAngle;\r\n const context = this._canvas.current?.getContext('2d') ?? this._context;\r\n const radius = coords[2];\r\n if (!context) {\r\n return;\r\n }\r\n context.fillStyle = color;\r\n context.beginPath();\r\n context.strokeStyle = color;\r\n context.arc(coords[0], coords[1], radius, startAngle, Math.PI * doubleMultiplier);\r\n context.closePath();\r\n context.stroke();\r\n context.fill();\r\n };\r\n\r\n /**\r\n * ScaleCoords method - To scale the active point coordinates based on the window size.\r\n * @param coords -Coordinates.\r\n * @returns -Returns number[].\r\n */\r\n public scaleCoords = (coords: number[]): number[] => {\r\n const { imgWidth } = this.props;\r\n const defaultWidth: number = CanvasCalculations.defaultWidth;\r\n const defaultScale: number = CanvasCalculations.defaultScale;\r\n\r\n // Calculate scale based on current 'width' and the original 'imgWidth'\r\n const width = this.getActiveImageWidth();\r\n const scale = width && imgWidth && imgWidth > defaultWidth ? width / imgWidth : defaultScale;\r\n return [coords[0] * scale, coords[1] * scale, coords[2]];\r\n };\r\n\r\n /**\r\n * RenderPrefilledAreas method - To render active points in case of events.\r\n */\r\n public renderPrefilledAreas = (): void => {\r\n if (this._canvas.current) {\r\n const context = this._canvas.current.getContext('2d') ?? this._context;\r\n if (!context) return;\r\n const canvasPositionX: number = CanvasCalculations.defaultPositionX;\r\n const canvasPositionY: number = CanvasCalculations.defaultPositionY;\r\n context.clearRect(canvasPositionX, canvasPositionY, this._canvas.current.width, this._canvas.current.height);\r\n const { areaMap, activeArea } = this.props;\r\n areaMap.areas.forEach(area => {\r\n const scaledCoords = this.scaleCoords(area.coords);\r\n if (activeArea && area.coords[0] === activeArea.coords[0] && area.coords[1] === activeArea.coords[1]) {\r\n this.drawCircle(scaledCoords, CanvasStyles.black);\r\n this.drawMinus(scaledCoords, CanvasStyles.white);\r\n } else {\r\n this.drawCircle(scaledCoords, CanvasStyles.white);\r\n this.drawPlus(scaledCoords, CanvasStyles.black);\r\n }\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * ComputeCenter method - To re-calculate the center of active point based on window size.\r\n * @param area -IArea.\r\n * @returns -Returns number[].\r\n */\r\n public computeCenter = (area: IArea): number[] => {\r\n const scaledCoords = this.scaleCoords(area.coords);\r\n return [scaledCoords[0], scaledCoords[1]];\r\n };\r\n\r\n /**\r\n * HoverOn method - Mouse hover on event.\r\n * @param area -IArea.\r\n * @param index - Number.\r\n * @returns - Void.\r\n */\r\n public hoverOn = (area: IArea, index: number) => (event: AreaEvent): void => {\r\n const { onMouseEnter } = this.props;\r\n onMouseEnter && onMouseEnter(area, index, event);\r\n };\r\n\r\n /**\r\n * HoverOff method - Mouse hover off event.\r\n * @param area - IArea.\r\n * @param index - Number.\r\n * @returns - Void.\r\n */\r\n public hoverOff = (area: IArea, index: number) => (event: AreaEvent): void => {\r\n const { onMouseLeave } = this.props;\r\n onMouseLeave && onMouseLeave(area, index, event);\r\n };\r\n\r\n /**\r\n * RenderAreas method - Renders active points at given coordinates.\r\n * @returns -Returns JSX.Element[].\r\n */\r\n public renderAreas = (): JSX.Element[] => {\r\n const { areaMap } = this.props;\r\n const buttonText = this.props.imageMapperResources?.buttonText ? this.props.imageMapperResources.buttonText : '';\r\n const altText = this.props.imageMapperResources?.altText ? this.props.imageMapperResources.altText : '';\r\n\r\n return areaMap.areas.map((area, index) => {\r\n const scaledCoords = this.scaleCoords(area.coords);\r\n const center = this.computeCenter(area);\r\n const extendedArea = { ...area, scaledCoords, center };\r\n const areaKey = `area-${index}`;\r\n const altTextWithProductName = altText\r\n .replace('{buttonText}', buttonText ? buttonText : '')\r\n .replace('{productName}', area.productSearchResult?.Name ? area.productSearchResult.Name : '');\r\n return (\r\n \r\n );\r\n });\r\n };\r\n\r\n /**\r\n * InitCanvas method - To render the canvas.\r\n */\r\n public initCanvas = (): void => {\r\n if (!this._canvas.current || !this._backgroundImage.current || !this._container.current) {\r\n return;\r\n }\r\n\r\n const { color, onLoad } = this.props;\r\n const defaultWidth: number = CanvasCalculations.defaultWidth;\r\n const defaultHeight: number = CanvasCalculations.defaultHeight;\r\n\r\n const canvasWidth = this.getActiveImageWidth() ?? defaultWidth;\r\n const canvasHeight = this.getActiveImageHeight() ?? defaultHeight;\r\n\r\n this._canvas.current.width = canvasWidth;\r\n this._canvas.current.height = canvasHeight;\r\n this._container.current.style.width = `${canvasWidth}px`;\r\n\r\n const context = this._canvas.current.getContext('2d') ?? this._context;\r\n if (!context) {\r\n return;\r\n }\r\n context.fillStyle = color ?? '';\r\n\r\n if (onLoad) {\r\n onLoad();\r\n }\r\n\r\n this.renderPrefilledAreas();\r\n };\r\n\r\n /**\r\n * Render method - To render the image mapper component with active image, canvas and active points.\r\n * @returns -Returns JSX.Element | null.\r\n */\r\n public render(): JSX.Element | null {\r\n const { imageData, areaMap, requestContext } = this.props;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {this.renderAreas()}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default ImageMapper;\r\n","import React from 'react';\r\nimport { Carousel, CarouselItem } from 'reactstrap';\r\n\r\ninterface IActiveProductsCarouselProps {\r\n activeIndex?: number;\r\n products: React.ReactNode[];\r\n next: () => void;\r\n prev: () => void;\r\n}\r\n\r\nconst ActiveProductsCarousel: React.FC = ({ activeIndex = 0, products, next, prev }) => {\r\n return (\r\n \r\n \r\n {products.map(product => (\r\n {product}\r\n ))}\r\n \r\n \r\n );\r\n};\r\n\r\nexport { ActiveProductsCarousel };\r\nexport default ActiveProductsCarousel;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ProductComponent } from '@msdyn365-commerce/components';\r\n\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IModuleProps,\r\n INodeProps,\r\n isMobile,\r\n ITelemetryContent,\r\n VariantType,\r\n Node,\r\n SingleSlideCarousel\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n activeImageAdditionalContent,\r\n ActiveProductComponent,\r\n ActiveProductsCarousel,\r\n IArea,\r\n IAreaMap,\r\n ImageMapper\r\n} from './active-image-utilities';\r\nimport { IDobbiesProductCarouselData } from './dobbies-product-carousel.data';\r\nimport { IDobbiesProductCarouselProps } from './dobbies-product-carousel.props.autogenerated';\r\n\r\n/**\r\n * @type AreaEvent for active points\r\n */\r\ntype AreaEvent = Event | React.MouseEvent | React.FocusEvent;\r\n\r\n/**\r\n * @interface IActiveImageViewProps\r\n * @classdesc - The IActiveImageViewProps interface contract.\r\n */\r\nexport interface IActiveImageViewProps extends IDobbiesProductCarouselProps<{}> {\r\n featuredProducts: React.ReactNode;\r\n activePointContainer: IModuleProps;\r\n activePointImageContainer: INodeProps;\r\n activePointDetailsContainer: INodeProps;\r\n imageMapper: React.ReactNode;\r\n imgWidth?: number;\r\n productCard: React.ReactNode;\r\n title?: React.ReactNode;\r\n text?: React.ReactNode;\r\n links?: React.ReactNode;\r\n detailsContainer?: INodeProps;\r\n detailsContainerCta?: INodeProps;\r\n additionalContent?: React.ReactNode;\r\n handleAdditionalText?(event: MsDyn365.ContentEditableEvent): void;\r\n handleAdditionalParagraph?(event: MsDyn365.ContentEditableEvent): void;\r\n handleAdditionalLinkText?(event: MsDyn365.ContentEditableEvent): void;\r\n}\r\n\r\n/**\r\n * @interface IActiveImageLinksData\r\n * @classdesc - The IActiveImageLinksData interface contract.\r\n */\r\nexport interface IActiveImageLinksData {\r\n linkText?: string;\r\n linkUrl: MsDyn365.ILinkData;\r\n ariaLabel?: string;\r\n willOpenInNewTab?: boolean;\r\n}\r\n\r\nexport const enum DeviceType {\r\n Desktop,\r\n Mobile,\r\n Tablet\r\n}\r\n\r\n/**\r\n * @interface IActiveImageState\r\n * @classdesc - The IActiveImageState interface contract.\r\n */\r\ninterface IActiveImageState {\r\n clientWidth: number;\r\n index?: number;\r\n area?: IArea;\r\n viewport: string;\r\n device: DeviceType;\r\n}\r\n\r\n/**\r\n * @enum ActiveImageConstants\r\n * @description - The active image constants enum.\r\n */\r\nexport enum ActiveImageConstants {\r\n defaultPopupWidth = 350,\r\n backgroundColor = '#ffffff',\r\n fontColor = '#000000',\r\n totalXPadding = 40,\r\n cardGap = 10,\r\n defaultRadius = 5,\r\n leaveDelay = 150,\r\n timeoutInterval = 100,\r\n enterKey = 'Enter',\r\n escKey = 'Escape'\r\n}\r\n\r\n/**\r\n *\r\n * ActiveImage class.\r\n * @extends {React.PureComponent, IActiveImageState>}\r\n */\r\n\r\nexport class ActiveImage extends React.PureComponent, IActiveImageState> {\r\n private readonly _telemetryContent: ITelemetryContent;\r\n\r\n private readonly _defaultProdutCardHight: number = 490;\r\n\r\n private readonly _activePoints: IArea[] = [];\r\n\r\n private readonly _activeImageRefs: React.RefObject;\r\n\r\n private readonly _activeImageClass: string;\r\n\r\n private readonly _productCardDivRef: React.RefObject;\r\n\r\n private readonly detailsRef = React.createRef();\r\n\r\n private readonly overlayRef = React.createRef();\r\n\r\n private timeout?: NodeJS.Timeout;\r\n\r\n public constructor(props: IDobbiesProductCarouselProps) {\r\n super(props);\r\n this._telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n const mobile = this.props.context.request?.device?.Type === 'Mobile';\r\n const device = mobile || viewport === 'xs' ? DeviceType.Mobile : viewport === 'sm' ? DeviceType.Tablet : DeviceType.Desktop;\r\n this._activeImageClass = `msc-active-image-${this.getActiveImageId()}`;\r\n this.state = {\r\n device,\r\n clientWidth: 0,\r\n viewport\r\n };\r\n this._activeImageRefs = React.createRef();\r\n this._productCardDivRef = React.createRef();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('resize', this.updateClientWidth);\r\n document.addEventListener('keydown', this.keyDown, false);\r\n document.addEventListener('mousedown', this._handleOutsideClick);\r\n }\r\n setTimeout(this.updateClientWidth, ActiveImageConstants.timeoutInterval);\r\n if (MsDyn365.msdyn365Commerce.isBrowser && this._activeImageRefs.current) {\r\n const images: HTMLCollectionOf = this._activeImageRefs.current.getElementsByClassName(\r\n 'msc-thumbnail_image msc-active-image-img'\r\n );\r\n if (ArrayExtensions.hasElements(Array.from(images))) {\r\n images[0].removeAttribute('usemap');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * AddActivePoints method - To handle add Active Points.\r\n * @param area - IArea.\r\n * @param product - ProductSearchResult.\r\n * @param coords - Coords.\r\n * @param productUrl - String.\r\n */\r\n public addActivePoints = (area: IArea | undefined, product: ProductSearchResult, coords: number[], productUrl: string): void => {\r\n if (!area) {\r\n this._activePoints.push({\r\n areaId: product.RecordId.toString(),\r\n coords,\r\n primaryImageUrl: product.PrimaryImageUrl ?? '',\r\n productUrl,\r\n productSearchResult: product\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * ComponentWillUnmount method.\r\n */\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('resize', this.updateClientWidth);\r\n document.removeEventListener('keydown', (this.keyDown as unknown) as EventListener, false);\r\n document.removeEventListener('mousedown', this._handleOutsideClick, false);\r\n }\r\n }\r\n\r\n /**\r\n * UpdateClientWidth method to update client width in state.\r\n */\r\n public updateClientWidth = (): void => {\r\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n const device = viewport === 'xs' ? DeviceType.Mobile : viewport === 'sm' ? DeviceType.Tablet : DeviceType.Desktop;\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n if (device !== DeviceType.Desktop && this.detailsRef.current) {\r\n const { backgroundColor = ActiveImageConstants.backgroundColor, fontColor = ActiveImageConstants.fontColor } =\r\n this.props.config?.additionalContent || {};\r\n this.detailsRef.current.classList.add('vertical-align');\r\n this.detailsRef.current.style.background = backgroundColor;\r\n this.detailsRef.current.style.color = fontColor;\r\n if (this.overlayRef.current) this.overlayRef.current.style.display = 'none';\r\n } else if (this.overlayRef.current) {\r\n const gradientColor = this.props.config.additionalContent?.gradientColor;\r\n this.overlayRef.current.style.background = gradientColor || '';\r\n this.overlayRef.current.style.display = 'block';\r\n }\r\n }\r\n this.setState({ clientWidth: this.getActiveImageWidth(), viewport, index: undefined, area: undefined, device });\r\n this.resetState();\r\n };\r\n\r\n private onNext = () => {\r\n const index = Math.min((this.state.index ?? 0) + 1, this._activePoints.length - 1);\r\n const area = this._activePoints[index];\r\n this.setState({ area, index });\r\n };\r\n private onPrev = () => {\r\n const index = Math.max((this.state.index ?? 0) - 1, 0);\r\n const area = this._activePoints[index];\r\n this.setState({ area, index });\r\n };\r\n\r\n private renderAllFeaturedProducts = () => {\r\n if (!this.props.config.activePoints?.length) return null;\r\n const { allFeaturedHeading, productImageSettings } = this.props.config;\r\n if (productImageSettings) productImageSettings.lazyload = !productImageSettings.disableLazyLoad;\r\n return (\r\n
\r\n {allFeaturedHeading &&

{allFeaturedHeading}

}\r\n \r\n {this._activePoints.map((point, index) => {\r\n const ProductContainer: INodeProps = {\r\n tag: 'li',\r\n className: 'ms-product-collection__item msc-active-shadow',\r\n role: 'listitem',\r\n key: index\r\n };\r\n return (\r\n \r\n \r\n \r\n {this.props.resources.seeMoreButtonText}\r\n \r\n \r\n );\r\n })}\r\n \r\n
\r\n );\r\n };\r\n\r\n private renderActiveProductsCarousel = (): React.ReactNode => {\r\n if (this.state.index === undefined || !this.props.config.activePoints?.length) return null;\r\n return (\r\n \r\n );\r\n };\r\n\r\n private renderAdditionalContent = () => {\r\n const { backgroundColor = ActiveImageConstants.backgroundColor, fontColor = ActiveImageConstants.fontColor } =\r\n this.props.config.additionalContent || {};\r\n const isDesktop = this.state.device === DeviceType.Desktop;\r\n const detailsColors = isDesktop ? {} : { background: backgroundColor, color: fontColor };\r\n const detailsContainer = {\r\n className: `msc-active-image__details ${isDesktop ? '' : 'vertical-align'}`,\r\n style: detailsColors,\r\n ref: this.detailsRef\r\n };\r\n const detailsContainerCta = { className: 'msc-active-image__details__cta' };\r\n const title = this.renderActiveImageDetailsHeading();\r\n const links = this.renderActiveImageDetailsLinks();\r\n const additionalContent = activeImageAdditionalContent({\r\n requestContext: this.props.context.request,\r\n additionalContent: { subtext: this.props.config.additionalContent?.subtext },\r\n handleAdditionalTextChange: this.handleAdditionalTextChange,\r\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\r\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\r\n });\r\n if (!(title || links || additionalContent)) return null;\r\n return (\r\n <>\r\n
\r\n \r\n {title}\r\n {additionalContent && (\r\n \r\n {additionalContent.text}\r\n \r\n )}\r\n \r\n {links}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n /**\r\n * Render method.\r\n * @returns - Returns JSX.Element | null.\r\n */\r\n public render(): JSX.Element | null {\r\n const { showAllFeatured } = this.props.config;\r\n const { device } = this.state;\r\n const viewProps: IActiveImageViewProps = {\r\n ...this.props,\r\n activePointContainer: {\r\n moduleProps: this.props,\r\n className: classnames('msc-active-image', this._activeImageClass, this.props.config.className)\r\n },\r\n activePointImageContainer: {\r\n tag: 'div',\r\n className: classnames('msc-active-image-wrapper', this._activeImageClass, this.props.config.className),\r\n ref: this._activeImageRefs\r\n },\r\n activePointDetailsContainer: {\r\n tag: 'div',\r\n className: classnames('msc-active-image-details-container', this._activeImageClass, this.props.config.className)\r\n },\r\n imgWidth: this.props.config.canvasWidth,\r\n imageMapper: this.renderImageMapper(),\r\n productCard: device === DeviceType.Mobile ? this.renderActiveProductsCarousel() : this.renderProductCard(),\r\n featuredProducts: showAllFeatured && this.renderAllFeaturedProducts(),\r\n additionalContent: this.renderAdditionalContent(),\r\n handleAdditionalText: this.handleAdditionalTextChange,\r\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\r\n handleAdditionalLinkText: this.handleAdditionalTextChange\r\n };\r\n\r\n return this.props.renderView(viewProps);\r\n }\r\n\r\n /**\r\n * RenderImageMapper method - To render image mapper.\r\n * @returns - Returns React.ReactNode | null.\r\n */\r\n public renderImageMapper = (): React.ReactNode | null => {\r\n const { config, context } = this.props;\r\n const { device, area, index } = this.state;\r\n const defaultPosition: number = 0;\r\n const defaultLength: number = 0;\r\n const productResult = this.props.data.productsCarousel.result;\r\n const filteredProducts= productResult?.filter(x=>x.AttributeValues?.some(y=>y.TextValue==\"Out of stock\"))\r\n const productResults = productResult?.filter(item => !filteredProducts?.includes(item));\r\n\r\n console.log(\"productsResults\", productResults);\r\n\r\n \r\n if (config.activePoints && productResults) {\r\n for (const product of productResults) {\r\n for (const configProduct of config.activePoints) {\r\n if (product.ItemId === configProduct.itemId) {\r\n const productUrl = getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined);\r\n const coords = [\r\n configProduct.xPosition ?? defaultPosition,\r\n configProduct.yPosition ?? defaultPosition,\r\n configProduct.radius ?? defaultPosition\r\n ];\r\n const area = this._activePoints.find(activePoint => JSON.stringify(activePoint.coords) != JSON.stringify(coords));\r\n this.addActivePoints(area, product, coords, productUrl);\r\n }\r\n }\r\n }\r\n }\r\n const mappedArea: IAreaMap = {\r\n name: `map-${this._activeImageClass}`,\r\n areas: this._activePoints.length > defaultLength ? this._activePoints : []\r\n };\r\n const activeArea = device === DeviceType.Mobile ? (index === undefined ? undefined : this._activePoints[index]) : area;\r\n if (this.props.config.activeImage) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * EnterArea method - To handle mouse enter event.\r\n * @param area - Active point area.\r\n * @param index - Active point index.\r\n * @param event - Active point AreaEvent.\r\n */\r\n public enterArea = (area: IArea, index?: number, event?: AreaEvent): void => {\r\n this.timeout && clearTimeout(this.timeout);\r\n this.timeout = undefined;\r\n this.setState({ area, index: index ?? this.state.index });\r\n if (event?.type.toLocaleLowerCase() === 'click') {\r\n window.open(area.productUrl, '_self');\r\n }\r\n };\r\n\r\n /**\r\n * LeaveArea method - To handle mouse leave event.\r\n */\r\n public leaveArea = (): void => {\r\n if (this.state.device !== DeviceType.Mobile) {\r\n this.timeout && clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => this.resetState(), ActiveImageConstants.leaveDelay);\r\n }\r\n };\r\n\r\n /**\r\n * ResetState method - To reset the state for area and overlayclass.\r\n */\r\n public resetState = (): void => {\r\n this.setState({ area: undefined, index: undefined });\r\n };\r\n\r\n /**\r\n * RenderProductComponent method - To render the product card with product information.\r\n * @returns - Returns React.ReactNode.\r\n */\r\n public renderProductComponent = (area?: IArea): React.ReactNode => {\r\n if (area?.productSearchResult) {\r\n const baseImageUrl: string = this.props.context.request.apiSettings.baseImageUrl;\r\n const imageUrl: string = area.primaryImageUrl ?? '';\r\n const primaryImageUrl: string = `${baseImageUrl}${imageUrl}`;\r\n const product: ProductSearchResult = area.productSearchResult;\r\n product.PrimaryImageUrl = primaryImageUrl;\r\n const { productImageSettings } = this.props.config;\r\n if (productImageSettings) productImageSettings.lazyload = !productImageSettings.disableLazyLoad;\r\n\r\n return (\r\n \r\n );\r\n }\r\n return React.Fragment;\r\n };\r\n\r\n /**\r\n * RenderProductCard method - To render product cards.\r\n * @returns - Returns React.ReactNode.\r\n */\r\n public renderProductCard = (): React.ReactNode => {\r\n const { index, area } = this.state;\r\n const productCardleftPosition = this.getProductCardPositionX();\r\n const productCardtopPosition = this.getProductCardPositionY();\r\n if (!area) return null;\r\n return (\r\n \r\n this.enterArea(area, index)}\r\n onMouseLeave={this.leaveArea}\r\n onFocus={() => this.enterArea(area, index)}\r\n onBlur={this.leaveArea}\r\n style={{ width: ActiveImageConstants.defaultPopupWidth }}\r\n >\r\n
\r\n {area.productSearchResult && this.renderProductComponent(area)}\r\n
\r\n \r\n \r\n );\r\n };\r\n\r\n /**\r\n * GetProductCardPositionX method - Provides product card x position to the left or right of active point based on available space.\r\n * For xs, sm and md viewports it provides x position for the center alignment.\r\n * @returns - Returns number.\r\n */\r\n public getProductCardPositionX = (): number => {\r\n const { area, clientWidth } = this.state;\r\n const { cardGap, defaultRadius, defaultPopupWidth } = ActiveImageConstants;\r\n const { activePoints } = this.props.config;\r\n const currentRadius =\r\n activePoints?.find(point => area?.center && point.xPosition === area.center[0] && point.yPosition === area.center[1])?.radius ||\r\n defaultRadius;\r\n const extraSpace = cardGap + currentRadius;\r\n const defaultPositionX: number = 0;\r\n const halfDivisor: number = 2;\r\n const productCardWidth = defaultPopupWidth;\r\n const pointPositionX = area?.center?.[0] ?? clientWidth / halfDivisor;\r\n const leftAllignPosition = pointPositionX - productCardWidth - extraSpace;\r\n const rightAllignPosition = pointPositionX + extraSpace;\r\n let position: number = (clientWidth - productCardWidth) / halfDivisor;\r\n if (leftAllignPosition < defaultPositionX) {\r\n position = rightAllignPosition;\r\n } else {\r\n position = leftAllignPosition;\r\n }\r\n return position;\r\n };\r\n\r\n /**\r\n * GetProductCardPositionY method - Provides product card y position in center with respect to active point.\r\n * For xs, sm and md viewports it provides y position for the center alignment.\r\n * @returns - Returns number.\r\n */\r\n public getProductCardPositionY = (): number => {\r\n const defaultImageSettings = this.getDefaultImageSettings();\r\n const productImageSettingsHeight = this.props.config.productImageSettings?.viewports\r\n ? this.props.config.productImageSettings.viewports.lg?.h\r\n : defaultImageSettings.viewports.lg?.h;\r\n const halfDivisor: number = 2;\r\n const { area } = this.state;\r\n const produtCardHight: number = productImageSettingsHeight ? productImageSettingsHeight : this._defaultProdutCardHight;\r\n const pointPositionY = (this.getActiveImageHeight() - produtCardHight) / halfDivisor;\r\n let position: number = pointPositionY;\r\n position = (area?.center?.[1] ?? this.getActiveImageHeight() / halfDivisor) - produtCardHight / halfDivisor;\r\n return position;\r\n };\r\n\r\n /**\r\n * GetDefaultImageSettings method.\r\n * @returns MsDyn365.IImageSettings.\r\n */\r\n public getDefaultImageSettings = (): MsDyn365.IImageSettings => {\r\n const defaultImageSettings: MsDyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\r\n lg: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\r\n xl: { q: 'w=275&h=275&m=6', w: 275, h: 275 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return defaultImageSettings;\r\n };\r\n\r\n /**\r\n * KeyDown method - To handle keydown event.\r\n * @param event - KeyboardEvent.\r\n */\r\n public keyDown = (event: KeyboardEvent): void => {\r\n if (event.key === ActiveImageConstants.enterKey) {\r\n const target: HTMLElement = event.target as HTMLElement;\r\n if (target.nodeName === 'AREA') {\r\n const area: HTMLAreaElement = target as HTMLAreaElement;\r\n if (area.href) {\r\n window.open(area.href, '_self');\r\n }\r\n }\r\n }\r\n if (event.key === ActiveImageConstants.escKey) {\r\n this.resetState();\r\n }\r\n };\r\n\r\n /**\r\n * GetActiveImageWidth method - To get active image width.\r\n * @returns Returns number.\r\n */\r\n public getActiveImageWidth = (): number => {\r\n const defaultWidth: number = 0;\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n const activeImageReferenceValue = this._activeImageRefs;\r\n if (activeImageReferenceValue.current !== null) {\r\n return activeImageReferenceValue.current.clientWidth;\r\n }\r\n }\r\n return defaultWidth;\r\n };\r\n\r\n /**\r\n * GetActiveImageHeight method - To get active image height.\r\n * @returns Returns number.\r\n */\r\n public getActiveImageHeight = (): number => {\r\n const defaultHeight: number = 0;\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n const activeImageReferenceValue = this._activeImageRefs;\r\n if (activeImageReferenceValue.current !== null) {\r\n return activeImageReferenceValue.current.clientHeight;\r\n }\r\n }\r\n return defaultHeight;\r\n };\r\n\r\n /**\r\n * HandleLinkTextChange method - To handle link text change event.\r\n * @param linkIndex - The link index.\r\n * @param event - The dialog that is allowed to remain open.\r\n */\r\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {}\r\n\r\n /**\r\n * HandleTextChange method - To handle text change event.\r\n * @param event - The dialog that is allowed to remain open.\r\n */\r\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {};\r\n\r\n /**\r\n * HandleParagraphChange method - To handle paragraph change event.\r\n * @param event - The dialog that is allowed to remain open.\r\n */\r\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {};\r\n\r\n /**\r\n * HandleAdditionalTextChange method - To handle additional text change event.\r\n * @param event - The dialog that is allowed to remain open.\r\n */\r\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {}\r\n\r\n /**\r\n * HandleAdditionalLinkTextChange method - To handle additional link text change event.\r\n * @param linkIndex - The link index.\r\n * @param event - The dialog that is allowed to remain open.\r\n */\r\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\r\n const additionalContent = this.props.config.additionalContent ?? {};\r\n if (additionalContent.links) {\r\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\r\n }\r\n }\r\n\r\n /**\r\n * HandleAdditionalParagraphChange method - To handle additional paragraph change event.\r\n * @param event - The dialog that is allowed to remain open.\r\n */\r\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\r\n if (this.props.config.additionalContent) {\r\n this.props.config.additionalContent.subtext = event.target.value;\r\n }\r\n }\r\n\r\n /**\r\n * RenderActiveImageDetailsLinks method - To render active image details links.\r\n * @returns - React node.\r\n */\r\n public renderActiveImageDetailsLinks = (): React.ReactNode[] | undefined => {\r\n const links = this.props.config.additionalContent?.links;\r\n if (!links?.length) return undefined;\r\n const payLoad = getPayloadObject('click', this._telemetryContent, '');\r\n\r\n return links?.map((linkData: IActiveImageLinksData, index: number) => {\r\n payLoad.contentAction.etext = linkData.linkText;\r\n const attributes = getTelemetryAttributes(this._telemetryContent, payLoad);\r\n const linkId = index;\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: linkData.ariaLabel,\r\n className: 'msc-active-image__details__cta__link',\r\n linkText: linkData.linkText,\r\n linkUrl: linkData.linkUrl.destinationUrl,\r\n openInNewTab: linkData.willOpenInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n {\r\n this.handleLinkTextChange(index, event);\r\n },\r\n requestContext: this.props.context.request\r\n }}\r\n />\r\n );\r\n });\r\n };\r\n\r\n /**\r\n * RenderActiveImageDetailsHeading method - To render active image details heading.\r\n * @returns - React.ReactNode | undefined.\r\n */\r\n public renderActiveImageDetailsHeading = (): React.ReactNode | undefined => {\r\n const heading = this.props.config.additionalContent?.heading;\r\n const text = heading?.text;\r\n\r\n return (\r\n heading &&\r\n text && (\r\n \r\n )\r\n );\r\n };\r\n\r\n /**\r\n * GetActiveImageId - To get active image id from src.\r\n * @returns - String.\r\n */\r\n public getActiveImageId = (): string => {\r\n return this.props.id;\r\n };\r\n\r\n /**\r\n * Handle outside click method - To handle outside click of the active image product.\r\n * @param event - Mouse event.\r\n */\r\n private readonly _handleOutsideClick = (event: MouseEvent) => {\r\n if (this._productCardDivRef.current?.contains(event.target as Node)) {\r\n return;\r\n }\r\n const { device } = this.state;\r\n device !== DeviceType.Mobile && this.resetState();\r\n };\r\n}\r\nexport default ActiveImage;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport {\n CacheType,\n createObservableDataAction,\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 } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IActiveImageConfig, IActivePointsData } from '../active-image';\n\n/**\n * ActiveImageInput.\n */\nexport class ActiveImageInput implements IActionInput {\n\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 searchCriteriaInput.Context = { ChannelId: context.requestContext.apiSettings.channelId, CatalogId: context.requestContext.apiSettings.catalogId };\n searchCriteriaInput.IncludeAttributes = true;\n searchCriteriaInput.ItemIds = itemIds;\n return await ProductsDataActions.searchByCriteriaAsync({ callerContext: context }, searchCriteriaInput);\n\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","module.exports = React;","module.exports = ReactDOM;","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['dobbies-product-carousel'] = {\n c: () => require('partner/modules/dobbies-product-carousel/dobbies-product-carousel.tsx'),\n $type: 'contentModule',\n da: [{name:'productsCarousel', path:'modules/dobbies-product-carousel/actions/get-active-image-products', runOn: 1}],\n \n iNM: false,\n ns: '__local__',\n n: 'dobbies-product-carousel',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/dobbies-product-carousel'\n });\n \n\n {\n const sanitizedActionPath = 'modules/dobbies-product-carousel/actions/get-active-image-products';\n let dataAction = require('partner/modules/dobbies-product-carousel/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['__local__|__local__|modules|dobbies-product-carousel|dobbies-product-carousel'] = {\n c: () => require('partner/modules/dobbies-product-carousel/dobbies-product-carousel.view.tsx'),\n cn: '__local__-__local__-dobbies-product-carousel'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };"],"sourceRoot":""}