{"version":3,"file":"static/js/c38e1bcc13260528922d.bundle.js","mappings":"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","sources":["webpack://Dobbies.Commerce/./src/modules/dobbies-product-carousel/active-image-utilities/active-product.tsx?5fcc","webpack://Dobbies.Commerce/./src/modules/dobbies-product-carousel/active-image-utilities/additional-content.tsx?9c3c","webpack://Dobbies.Commerce/./src/modules/dobbies-product-carousel/active-image-utilities/image-mapper.tsx?7343","webpack://Dobbies.Commerce/./src/modules/dobbies-product-carousel/active-image-utilities/active-products-carousel.tsx?366b","webpack://Dobbies.Commerce/./src/modules/dobbies-product-carousel/dobbies-product-carousel.tsx?67cd","webpack://Dobbies.Commerce/./src/modules/dobbies-product-carousel/dobbies-product-carousel.view.tsx?8cb5","webpack://Dobbies.Commerce/./lib/dobbies-product-carousel/module-registration.js?ac1d","webpack://Dobbies.Commerce/./src/modules/actions/get-active-image-products.ts?0501","webpack://Dobbies.Commerce/external var \"React\"?0d3b","webpack://Dobbies.Commerce/external var \"ReactDOM\"?853b"],"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 { 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) {\r\n return;\r\n }\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.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\n\r\n/* eslint-disable security/detect-object-injection */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\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\n// import { ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ProductComponent } from '../../themes/dobbies/views/components/product.component';\r\n//import { getCartFromCustomer } from '@msdyn365-commerce/global-state';\r\nimport { getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\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\nimport { ProductPrice, ProjectionDomain, DiscountLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { reaction } from 'mobx';\r\nimport { IProductWithModes } from '../dobbies-search-result-container/components';\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 discountLines: (DiscountLine[] | undefined)[];\r\n products: ProductSearchResult[];\r\n nonClubPlusDiscount: ProductPrice[];\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 = '#f8f8f8',\r\n fontColor = '#111111',\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 discountLines: [],\r\n products: [],\r\n nonClubPlusDiscount: []\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 reaction(\r\n () => this.props.data.productsCarousel.result,\r\n async () => {\r\n if (this.props.config.enableAffiliationBasedPricing) {\r\n void this.updateProductsPrices(this.props.data.productsCarousel.result);\r\n } else {\r\n this.setState({ products: this.props.data.productsCarousel.result ? this.props.data.productsCarousel.result : [] });\r\n void this.getNonClubPlusDiscountPrices();\r\n }\r\n }\r\n );\r\n }\r\n\r\n private readonly getNonClubPlusDiscountPrices = async (): Promise => {\r\n const products = this.props.data.productsCarousel.result || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n };\r\n await getActivePricesAsync(\r\n {\r\n callerContext: this.props.context.actionContext,\r\n queryResultSettings: {}\r\n },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n null,\r\n true\r\n )\r\n .then((activePricesResponse: ProductPrice[]) => {\r\n if (activePricesResponse && activePricesResponse.length > 0) {\r\n activePricesResponse = activePricesResponse.filter(prod => {\r\n const activePrice = products?.find(price => price.RecordId === prod.ProductId);\r\n if (activePrice) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n this.setState({\r\n nonClubPlusDiscount: activePricesResponse\r\n });\r\n }\r\n })\r\n .catch((error: Error) => {\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(\r\n '[get Affiliation based price on search result container ]Error executing action'\r\n );\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n };\r\n\r\n private updateProductsPrices = async (rawProducts: ProductSearchResult[] | undefined): Promise => {\r\n const priceAffiliations = [\r\n {\r\n AffiliationId: this.props.context.app.config.AffiliationId,\r\n LoyaltyTierId: this.props.context.app.config.LoyaltyTierId,\r\n AffiliationTypeValue: this.props.context.app.config.AffiliationTypeValue,\r\n ReasonCodeLines: [],\r\n CustomerId: '',\r\n ExtensionProperties: []\r\n }\r\n ];\r\n const productRecIds = ArrayExtensions.hasElements(rawProducts) ? rawProducts.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n };\r\n // const cart = await getCartFromCustomer(this.props.context.actionContext);\r\n await getActivePricesAsync(\r\n {\r\n callerContext: this.props.context.actionContext,\r\n queryResultSettings: {}\r\n },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n priceAffiliations,\r\n true\r\n )\r\n .then((activePricesResponse: ProductPrice[]) => {\r\n const discountLines = activePricesResponse.map(priceResp => priceResp.DiscountLines);\r\n if (this.state.discountLines.length <= 0 && discountLines) {\r\n this.setState({\r\n discountLines: discountLines\r\n });\r\n }\r\n\r\n let updatedProducts = rawProducts?.map(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(\r\n activePrice.BasePrice || 0,\r\n activePrice.TradeAgreementPrice || 0,\r\n activePrice.AdjustedPrice || 0\r\n );\r\n }\r\n return prod;\r\n });\r\n updatedProducts = updatedProducts?.filter(prod => {\r\n const activePrice = activePricesResponse?.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n if (updatedProducts) {\r\n this.setState({ products: updatedProducts });\r\n }\r\n return;\r\n })\r\n .catch((error: Error) => {\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(\r\n '[get Affiliation based price on search result container ]Error executing action'\r\n );\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n if (rawProducts) {\r\n this.setState({ products: rawProducts });\r\n }\r\n return;\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 for (const ap of this._activePoints) {\r\n if (ap.areaId === product.RecordId.toString()) {\r\n return;\r\n }\r\n }\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) {\r\n this.overlayRef.current.style.display = 'none';\r\n }\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) {\r\n return null;\r\n }\r\n const { allFeaturedHeading, productImageSettings } = this.props.config;\r\n if (productImageSettings) {\r\n productImageSettings.lazyload = !productImageSettings.disableLazyLoad;\r\n }\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 const prodWithDelivery: IProductWithModes = {\r\n ...point.productSearchResult!,\r\n isCnC: false,\r\n isHomeDelivery: false,\r\n clubPlusBanner: false\r\n };\r\n return (\r\n \r\n 0\r\n ? this.state.discountLines[index]\r\n : []\r\n }\r\n nonClubPlusDiscount={\r\n this.state.nonClubPlusDiscount?.filter(item => item.ProductId === prodWithDelivery.RecordId)[0]\r\n }\r\n isNewCarouselDesign={this.props.config.isNewCarouselDesign}\r\n />\r\n {!this.props.config.isNewCarouselDesign ? (\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 );\r\n };\r\n\r\n private renderActiveProductsCarousel = (): React.ReactNode => {\r\n if (this.state.index === undefined || !this.props.config.activePoints?.length) {\r\n return null;\r\n }\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)) {\r\n return null;\r\n }\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 private reorderActivePoints() {\r\n const reOrderedActivePoints: IArea[] = [];\r\n if (this.props.config.activePoints) {\r\n for (const cap of this.props.config.activePoints) {\r\n for (const ap of this._activePoints) {\r\n if (cap.itemId === ap.areaId) {\r\n reOrderedActivePoints.push(ap);\r\n }\r\n }\r\n }\r\n this._activePoints.splice(0, this._activePoints.length);\r\n reOrderedActivePoints.map(rap => {\r\n this._activePoints.push(rap);\r\n });\r\n }\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.state.products; //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 if (config.activePoints && productResults) {\r\n for (const product of productResults) {\r\n for (const configProduct of config.activePoints) {\r\n if (product.RecordId === Number(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 this.reorderActivePoints();\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) {\r\n productImageSettings.lazyload = !productImageSettings.disableLazyLoad;\r\n }\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) {\r\n return null;\r\n }\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) {\r\n return undefined;\r\n }\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","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\n\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","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 };","/*--------------------------------------------------------------\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;"],"names":["ActiveProductComponent","_ref","data","context","imageSettings","savingsText","freePriceText","originalPriceText","seeMoreButtonText","typeName","id","product","url","React","className","requestContext","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","href","assembleNode","item","props","additionalContentNode","text","subtext","renderParagraph","additionalContentParagraphText","Msdyn365","tag","editProps","onEdit","event","handleAdditionalTextChange","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","constructor","super","_context","getActiveImageWidth","MsDyn365","isBrowser","activeImageReferenceValue","this","activeImageRefs","current","clientWidth","getActiveImageHeight","clientHeight","drawMinus","coords","color","_this$_canvas$current","_this$_canvas$current2","x","y","radius","_canvas","getContext","length","innerPadding","strokeStyle","lineWidth","strokeRatio","beginPath","moveTo","lineTo","stroke","drawPlus","_this$_canvas$current3","_this$_canvas$current4","drawCircle","_this$_canvas$current5","_this$_canvas$current6","doubleMultiplier","startAngle","fillStyle","arc","Math","PI","closePath","fill","scaleCoords","imgWidth","defaultWidth","defaultScale","width","scale","renderPrefilledAreas","_this$_canvas$current7","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","clearRect","height","areaMap","activeArea","areas","forEach","area","scaledCoords","black","white","computeCenter","hoverOn","index","onMouseEnter","hoverOff","onMouseLeave","renderAreas","_this$props$imageMapp","_this$props$imageMapp2","buttonText","imageMapperResources","map","_area$productSearchRe","center","extendedArea","_objectSpread","areaKey","altTextWithProductName","replace","productSearchResult","key","shape","join","onFocus","onBlur","tabIndex","alt","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current8","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","style","componentDidMount","componentDidUpdate","shouldComponentUpdate","nextProps","shouldRender","render","_requestContext$gridS","imageData","ref","useMap","name","ActiveProductsCarousel","activeIndex","products","next","prev","Carousel","previous","interval","onClick","disabled","CarouselItem","DeviceType","ActiveImageConstants","ActiveImage","_this$props$context$r","_defaultProdutCardHight","_activePoints","detailsRef","overlayRef","getNonClubPlusDiscountPrices","async","productsCarousel","result","productRecIds","ArrayExtensions","hasElements","prod","RecordId","projectDomain","ChannelId","apiSettings","channelId","CatalogId","catalogId","getActivePricesAsync","callerContext","queryResultSettings","Date","then","activePricesResponse","filter","find","ProductId","setState","nonClubPlusDiscount","catch","error","trace","message","telemetry","exception","debug","Error","updateProductsPrices","priceAffiliations","AffiliationId","app","config","LoyaltyTierId","AffiliationTypeValue","ReasonCodeLines","CustomerId","ExtensionProperties","rawProducts","_updatedProducts","discountLines","priceResp","DiscountLines","state","updatedProducts","activePrice","_activePrice$Customer","max","TradeAgreementPrice","addActivePoints","productUrl","_product$PrimaryImage","ap","areaId","toString","push","primaryImageUrl","updateClientWidth","viewport","isMobile","variant","VariantType","Browser","device","Mobile","Tablet","Desktop","_this$props$config","backgroundColor","fontColor","classList","add","background","display","_this$props$config$ad","gradientColor","undefined","resetState","onNext","_this$state$index","min","onPrev","_this$state$index2","renderAllFeaturedProducts","_this$props$config$ac","activePoints","allFeaturedHeading","productImageSettings","lazyload","disableLazyLoad","SingleSlideCarousel","point","_this$state$nonClubPl","ProductContainer","role","prodWithDelivery","isCnC","isHomeDelivery","clubPlusBanner","Node","ProductComponent","telemetryContent","_telemetryContent","discountLine","isNewCarouselDesign","resources","renderActiveProductsCarousel","_this$props$config$ac2","renderProductComponent","renderAdditionalContent","_this$props$config$ad2","isDesktop","detailsContainer","detailsContainerCta","title","renderActiveImageDetailsHeading","links","renderActiveImageDetailsLinks","handleAdditionalParagraphChange","handleAdditionalLinkTextChange","renderImageMapper","productResult","filteredProducts","_x$AttributeValues","AttributeValues","some","TextValue","productResults","includes","configProduct","Number","itemId","_product$Name","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","getProductPageUrlSync","xPosition","yPosition","activePoint","JSON","stringify","reorderActivePoints","mappedArea","_activeImageClass","activeImage","viewPort","enterArea","leaveArea","_activeImageRefs","altTextForSeeMoreButtonWithProductName","timeout","clearTimeout","type","toLocaleLowerCase","window","open","setTimeout","leaveDelay","_area$primaryImageUrl","_product$ItemId","baseImageUrl","ItemId","renderProductCard","productCardleftPosition","getProductCardPositionX","productCardtopPosition","getProductCardPositionY","top","left","_productCardDivRef","defaultPopupWidth","_activePoints$find","_area$center$","_area$center","cardGap","defaultRadius","extraSpace","productCardWidth","pointPositionX","leftAllignPosition","position","_this$props$config$pr","_this$props$config$pr2","_defaultImageSettings","_area$center$2","_area$center2","defaultImageSettings","getDefaultImageSettings","productImageSettingsHeight","viewports","lg","h","produtCardHight","xs","q","w","xl","keyDown","enterKey","target","nodeName","escKey","handleTextChange","handleParagraphChange","_this$props$config$ad3","payLoad","getPayloadObject","linkData","contentAction","etext","linkText","attributes","getTelemetryAttributes","linkId","editableLink","ariaLabel","linkUrl","destinationUrl","openInNewTab","willOpenInNewTab","additionalProperties","link","onTextChange","handleLinkTextChange","_this$props$config$ad4","_heading$tag","heading","getActiveImageId","_handleOutsideClick","_this$_productCardDiv","contains","getTelemetryObject","telemetryPageName","friendlyName","Type","addEventListener","document","timeoutInterval","images","getElementsByClassName","Array","from","removeAttribute","reaction","enableAffiliationBasedPricing","componentWillUnmount","removeEventListener","showAllFeatured","viewProps","activePointContainer","moduleProps","classnames","activePointImageContainer","activePointDetailsContainer","imageMapper","productCard","featuredProducts","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","renderView","reOrderedActivePoints","cap","splice","rap","linkIndex","_this$props$config$ad5","value","activeImageView","Module","binding","modules","dataActions","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","md","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","__bindings__","viewDictionary","cn","ActiveImageInput","_cacheKey","getCacheObjectType","getCacheKey","activePointData","createInput","inputData","getActiveImageproductAction","input","itemIds","searchCriteriaInput","Context","getCatalogId","IncludeAttributes","Ids","module","exports","ReactDOM"],"sourceRoot":""}