{"version":3,"sources":["webpack:///./src/modules/citta-collapsible-recommendations/citta-collapsible-recommendations.tsx?9e9f","webpack:///src/modules/cookie-compliance/components/accept-button.tsx?1709","webpack:///src/modules/cookie-compliance/components/links.tsx?807e","webpack:///src/modules/cookie-compliance/cookie-compliance.tsx?5f7e","webpack:///./src/modules/citta-product-attribute-link/citta-product-attribute-link.view.tsx?f1a5","webpack:///./src/modules/citta-collapsible-recommendations/citta-collapsible-recommendations.view.tsx?ee1d","webpack:///./src/themes/citta/views/media-gallery.view.tsx?cae3","webpack:///src/modules/cookie-compliance/cookie-compliance.view.tsx?b30b","webpack:///src/modules/product-comparison-button/product-comparison-button.tsx?934c","webpack:///./src/modules/citta-product-attribute-link/citta-product-attribute-link.tsx?daf4","webpack:///src/modules/product-comparison-button/product-comparison-button.view.tsx?68cc"],"names":["CittaCollapsibleRecommendations","React","constructor","props","super","render","wrapperClass","this","config","darkArrowDesktop","darkArrowMobile","displayPreviewText","viewProps","_objectSpread","collapsibleRecommendationContainer","moduleProps","className","classnames","cittaCollapsibleRecommendations","_cittaCollapsibleRecommendations","renderView","slots","recommendations","length","undefined","Drawer","collapseProps","timeout","toggleButtonText","openGlyph","closeGlyph","glyphPlacement","toggleButtonProps","color","tag","CookieComplianceAcceptButton","_ref","acceptCookiesButtonText","acceptCookiesButtonAriaLabel","telemetryContent","onClose","payLoad","getPayloadObject","attributes","getTelemetryAttributes","Object","assign","type","onClick","CookieComplianceLinks","_mapEditableLinks","linkdata","editableLinks","forEach","link","index","linkText","contentAction","etext","editableLink","ariaLabel","linkUrl","destinationUrl","openInNewTab","role","additionalProperties","onTelemetryClick","push","links","Msdyn365","editProps","onTextChange","requestContext","CookieCompliance","getTelemetryObject","context","request","telemetryPageName","friendlyName","telemetry","handleLinkTextChange","linkIndex","event","_this$props$config$ac","actionLinks","target","value","handleContentChange","content","state","visible","cookieRef","_onDismiss","bind","componentDidMount","cookies","isConsentGiven","setState","resources","acceptCookiesAriaLabel","moduleConfig","error","MsDyn365","isBrowser","onDismiss","CookieComplianceBanner","ref","AlertProps","fade","Content","text","onEdit","ArrayExtensions","hasElements","acceptButton","setConsentCookie","location","reload","ContentBlockView","contentBlockContainer","linkItem","Module","renderThumbnailItem","thumbnail","ThumbnailItemContainerProps","Picture","createElement","Node","GetThumbnailItemComponent","image","imageSettings","imageId","modifiedActiveIndex","_props$config$thumbna","key","Button","altText","id","onKeyDown","_props$callbackToggle","_props$callbackThumbn","keyCode","KeyCodes","Enter","preventDefault","callbackToggle","call","callbackThumbnailClick","activeIndex","Image","actionContext","gridSettings","thumbnailImageSettings","loadFailureBehavior","GetEmptyThumbnailItemComponent","_props$config$thumbna2","tabIndex","src","defaultThumbnailImageSettings","viewports","xs","q","w","h","xl","lazyload","cropFocalRegion","mediaGalleryView","CarouselProps","Thumbnails","MediaGallery","Modal","renderThumbnails","thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","mediaGalleryItems","items","map","item","getMediaGalleryItems","lastUpdate","CookieComplianceView","Alert","ProductComparisonButton","PureComponent","_addToProductComparison","_this$props$data$acco","ProductComparisonItem","product","RecordId","catalogId","ProductComparisonState","instance","data","accountInformation","result","addItem","_removeFromProductComparison","_this$props$data$acco2","removeItemById","comparisonItemId","_getNewState","_this$props$data$acco3","getItemId","products","_getProdutComparisonDataByCatalogId","canProductBeAddedToProductComparison","hasItemById","currentProductsCount","_className","_instanceId","Random","Guid","generateGuid","_shouldUsePreview","_productComparisonPreview","_renderProductComparisonPreview","productComparisonPreview","buttonText","title","onClickHandler","isDisabled","ObjectExtensions","isNullOrUndefined","Fragment","disabled","_this$props$data$acco4","listModifiedEvent","subscribe","instanceId","handler","getSnapshotBeforeUpdate","previousProps","componentWillUnmount","_this$props$data$acco5","unsubscribe","buttonClassName","shouldDisplayText","removeFromComparisonButtonText","productComparisonButton","_renderProductComparisonButton","productsLimit","_getProductsLimit","addToComparisonLimitReachedButtonText","addToComparisonButtonText","viewport","isMobile","variant","VariantType","Browser","app","productComparisonMobileProductsLimit","productComparisonDesktopProductsLimit","_this$props$data$acco6","_items$filter","getCatalogId","filter","CittaProductAttributeLink","_renderLink","_goToLink","window","baseUrl","origin","linkAttribute","find","attribute","Name","attributeName","TextValue","contentBlockviewProps","ProductComparisonButtonViewFunctionalComponent"],"mappings":"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","file":"static/js/20.6405d1a9e5f6fe51df30.chunk.js","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Drawer,IModuleProps } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ICittaCollapsibleRecommendationsData } from './citta-collapsible-recommendations.data';\r\nimport { ICittaCollapsibleRecommendationsProps } from './citta-collapsible-recommendations.props.autogenerated';\r\n\r\nexport interface ICittaCollapsibleRecommendationsViewProps extends ICittaCollapsibleRecommendationsProps {\r\n cittaCollapsibleRecommendations:React.ReactNode;\r\n collapsibleRecommendationContainer:IModuleProps;\r\n}\r\n\r\n/**\r\n *\r\n * CittaCollapsibleRecommendations component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass CittaCollapsibleRecommendations extends React.PureComponent> {\r\n public constructor(props: ICittaCollapsibleRecommendationsProps) {\r\n super(props);\r\n }\r\n public render(): JSX.Element | null {\r\n const desktopClass = this.props.config.darkArrowDesktop ? 'dark-desktop' : '';\r\n const mobileClass = this.props.config.darkArrowMobile ? 'dark-mobile' : '';\r\n const displayPreview = this.props.config.displayPreviewText ? 'display-preview' : '';\r\n const wrapperClass = `citta-collapsible-recommendations ${desktopClass} ${mobileClass} ${displayPreview}`;\r\n const viewProps = {\r\n collapsibleRecommendationContainer: {\r\n moduleProps: this.props,\r\n className: classnames(wrapperClass)\r\n },\r\n ...this.props,\r\n cittaCollapsibleRecommendations: this. _cittaCollapsibleRecommendations()\r\n\r\n };\r\n return this.props.renderView(viewProps);\r\n }\r\n private _cittaCollapsibleRecommendations(): React.ReactNode {\r\n const { slots } = this.props;\r\n const recommendations = slots && slots.recommendations && slots.recommendations.length ? slots.recommendations : undefined;\r\n return(\r\n
\r\n {recommendations &&\r\n \r\n
\r\n {recommendations}\r\n
\r\n \r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default CittaCollapsibleRecommendations;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ICookieComplianceAcceptButton {\n acceptCookiesButtonText?: string;\n acceptCookiesButtonAriaLabel?: string;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n}\n\nexport const CookieComplianceAcceptButton: React.FC = ({\n acceptCookiesButtonText,\n acceptCookiesButtonAriaLabel,\n telemetryContent,\n onClose\n}) => {\n const payLoad: IPayLoad = getPayloadObject('click', telemetryContent!, 'accept cookies');\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n return (\n \n {acceptCookiesButtonText}\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IActionLinksData } from '../cookie-compliance.props.autogenerated';\n\nexport interface ICookieComplianceLinks {\n links: IActionLinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\n/**\n *\n * ContentCardLinks component.\n * @extends {React.PureComponent}\n */\nexport class CookieComplianceLinks extends React.PureComponent {\n public render(): JSX.Element {\n const editableLinks = this._mapEditableLinks(this.props.links);\n return (\n \n {editableLinks && editableLinks.length > 0 ? (\n \n ) : null}\n \n );\n }\n\n private readonly _mapEditableLinks = (linkdata: IActionLinksData[]): Msdyn365.ILinksData[] | null => {\n if (!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link, index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', this.props.telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.props.telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: attributes,\n onClick: onTelemetryClick(this.props.telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n };\n}\n\nexport default CookieComplianceLinks;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IAlertProps, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { CookieComplianceAcceptButton, CookieComplianceLinks } from './components';\nimport { ICookieComplianceConfig, ICookieComplianceProps } from './cookie-compliance.props.autogenerated';\n\n/**\n * Alert state interface.\n */\nexport interface IAlertState {\n visible: boolean;\n}\n\n/**\n * Cookie compliance view props interface.\n */\nexport interface ICookieComplianceViewProps extends ICookieComplianceProps<{}> {\n CookieComplianceBanner: IModuleProps;\n AlertProps: IAlertProps;\n Content: INodeProps;\n text?: React.ReactNode;\n links?: React.ReactNode;\n acceptButton?: React.ReactNode;\n className: string;\n onDismiss(): void;\n}\n\n/**\n *\n * CookieCompliance component.\n * @extends {React.PureComponent>}\n */\nclass CookieCompliance extends React.PureComponent, IAlertState> {\n private readonly cookieRef: React.RefObject;\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n public constructor(props: ICookieComplianceProps) {\n super(props);\n this.state = { visible: false };\n this.cookieRef = React.createRef();\n this._onDismiss = this._onDismiss.bind(this);\n }\n\n public componentDidMount(): void {\n const { context } = this.props;\n\n if (context && context.request && context.request.cookies && !context.request.cookies.isConsentGiven()) {\n this.setState({ visible: true });\n }\n }\n\n public render(): JSX.Element | null {\n const { config, context, resources, telemetry } = this.props;\n const { acceptCookiesButtonText, acceptCookiesAriaLabel } = resources;\n const { visible } = this.state;\n\n const isConsentGiven = context && context.request && context.request.cookies && context.request.cookies.isConsentGiven();\n let moduleConfig: ICookieComplianceConfig;\n\n try {\n moduleConfig = config;\n } catch (error) {\n telemetry.error(`Something went wrong while rendering the alert module ------${error}`);\n return
{error}
;\n }\n\n if (isConsentGiven && !visible) {\n this.props.context.telemetry.error('Cookie Compliance content is empty, module wont render.');\n return null;\n }\n\n if (!MsDyn365.msdyn365Commerce.isBrowser) {\n return <>;\n }\n\n const viewProps = {\n ...this.props,\n onDismiss: this._onDismiss,\n CookieComplianceBanner: {\n moduleProps: this.props,\n className: classnames('ms-cookie-compliance', moduleConfig.className),\n ref: this.cookieRef\n },\n AlertProps: {\n className: 'ms-cookie-compliance__container',\n color: 'white',\n fade: false\n },\n Content: {\n className: 'ms-cookie-compliance__content'\n },\n text: moduleConfig.content && (\n \n ),\n links: ArrayExtensions.hasElements(moduleConfig.actionLinks) && (\n \n ),\n acceptButton: (\n \n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handles Link content change event.\n * @param linkIndex - Index of link in linkarray.\n * @returns Void.\n */\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent): void => {\n if (this.props.config.actionLinks?.[linkIndex]) {\n this.props.config.actionLinks[linkIndex].linkText = event.target.value;\n }\n };\n\n /**\n * Handles content change event.\n * @param event - Event.\n */\n public handleContentChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.content = event.target.value;\n };\n\n private _onDismiss(): void {\n const { context } = this.props;\n\n if (context && context.request && context.request.cookies) {\n context.request.cookies.setConsentCookie();\n location.reload();\n }\n this.setState({ visible: false });\n }\n}\n\nexport default CookieCompliance;\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Module } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ICitttaProductAttributeLinkViewProps } from './citta-product-attribute-link';\r\n\r\nconst ContentBlockView: React.FC = (props) => {\r\n const {\r\n contentBlockContainer,\r\n linkItem\r\n } = props;\r\n\r\n if (linkItem) {\r\n return (\r\n \r\n { /* @ts-ignore */ }\r\n {linkItem}\r\n \r\n );\r\n } else {\r\n return (null);\r\n }\r\n};\r\n\r\nexport default ContentBlockView;\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\nimport { Module } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ICittaCollapsibleRecommendationsViewProps } from './citta-collapsible-recommendations';\r\n\r\nexport default (props: ICittaCollapsibleRecommendationsViewProps) => {\r\n const { cittaCollapsibleRecommendations, collapsibleRecommendationContainer } = props;\r\n return (\r\n \r\n {cittaCollapsibleRecommendations}\r\n \r\n );\r\n};\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 { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { IMediaGalleryThumbnailItemViewProps,\r\n IMediaGalleryThumbnailsViewProps,\r\n IMediaGalleryViewProps\r\n} from '@msdyn365-commerce-modules/media-gallery';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\n\r\n/**\r\n * Render the thumbnail item images.\r\n * @param thumbnail - The carousel thumbnail line props.\r\n * @returns Return HTML having thumnailcontainer props with image.\r\n */\r\nconst renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n return (\r\n \r\n {Picture}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Gets the thumbnail item to display media gallery images.\r\n * @param image - The media gallery images.\r\n * @param imageSettings - Image settings for the image gallery items.\r\n * @param imageId - Image id.\r\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render images.\r\n */\r\nconst GetThumbnailItemComponent = (\r\n image: IImageData,\r\n imageSettings: IImageSettings,\r\n imageId: number,\r\n modifiedActiveIndex: number,\r\n props: IMediaGalleryViewProps\r\n): IMediaGalleryThumbnailItemViewProps => {\r\n\r\n /**\r\n * OnClick method of media gallery item.\r\n * */\r\n const onClick = () => {\r\n // @ts-ignore\r\n props.callbackToggle?.();\r\n // @ts-ignore\r\n props.callbackThumbnailClick?.(imageId);\r\n props.state.activeIndex = imageId;\r\n };\r\n\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n /**\r\n * Keydown event of media gallery item.\r\n * @param event - React.KeyboardEvent.\r\n * */\r\n const handleKeyDown = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === KeyCodes.Enter) {\r\n event.preventDefault();\r\n onClick();\r\n }\r\n };\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'presentation',\r\n key: imageId\r\n },\r\n Picture: (\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/**\r\n * Gets the empty thumbnail item to display media gallery images.\r\n * @param imageSettings - Image settings for the image gallery items.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render empty images.\r\n */\r\nconst GetEmptyThumbnailItemComponent = (imageSettings: IImageSettings, props: IMediaGalleryViewProps): IMediaGalleryThumbnailItemViewProps => {\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: 'ms-media-gallery__thumbnail-item',\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: 0,\r\n 'aria-label': '',\r\n 'aria-selected': true\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n};\r\n\r\n/**\r\n * Update media gallery items method.\r\n * @param items - The media gallery thumbnail item view props.\r\n * @returns The IImageData array.\r\n */\r\nconst getMediaGalleryItems = (items?: IMediaGalleryThumbnailItemViewProps[]): IImageData[] | undefined => {\r\n return items?.map(item => {\r\n return {\r\n altText: item.Picture.props.altText,\r\n src: item.Picture.props.src\r\n };\r\n });\r\n};\r\n\r\nconst defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 },\r\n xl: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n};\r\n\r\n/**\r\n * Render the Media gallery thumbnails to represent images in grid view.\r\n * @param thumbnails - The thumbnail view props.\r\n * @param props - The media gallery view props.\r\n * @returns - The single slide carousel component to render as media gallery image.\r\n */\r\nconst renderThumbnails = (\r\n thumbnails: IMediaGalleryThumbnailsViewProps,\r\n props: IMediaGalleryViewProps\r\n): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\r\n const { state, Thumbnails } = props;\r\n const mediaGalleryItems = getMediaGalleryItems(Thumbnails.items);\r\n\r\n const items: IMediaGalleryThumbnailItemViewProps[] | undefined =\r\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\r\n state.lastUpdate && !ArrayExtensions.hasElements(mediaGalleryItems) ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)] :\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\r\n mediaGalleryItems?.map((item: IImageData, id: number) => GetThumbnailItemComponent(item,\r\n defaultThumbnailImageSettings, id, state.activeIndex, props));\r\n\r\n return (\r\n \r\n \r\n {items?.map(renderThumbnailItem)}\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render the Media gallery items using viewprops.\r\n * @param props - The media gallery view props.\r\n * @returns The media gallery module wrapping up images node.\r\n */\r\nconst mediaGalleryView: React.FC = props => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\r\n return (\r\n \r\n \r\n {Modal}\r\n {renderThumbnails(Thumbnails, props)}\r\n \r\n );\r\n};\r\n\r\nexport default mediaGalleryView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Alert, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICookieComplianceViewProps } from './cookie-compliance';\n\nconst CookieComplianceView: React.FC = props => {\n const { CookieComplianceBanner, AlertProps, Content, acceptButton, text, links } = props;\n\n return (\n \n \n \n {text}\n {links}\n \n {acceptButton}\n \n \n );\n};\nexport default CookieComplianceView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AsyncResult, Customer, ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, ObjectExtensions, Random } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IModuleProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { getCatalogId } from '@msdyn365-commerce/core';\nimport { ProductComparisonItem, ProductComparisonState } from '../product-comparison-state';\nimport { IProductComparisonButtonProps } from './product-comparison-button.props.autogenerated';\n\n/**\n * Represents product comparison view props.\n */\nexport interface IProductComparisonButtonViewProps extends IProductComparisonButtonProps<{}> {\n moduleProps: IModuleProps;\n productComparisonButton?: React.ReactNode;\n productComparisonPreview?: React.ReactNode;\n}\n\n/**\n * Represents the data which is required for the product comparison button to be rendered.\n */\nexport interface IProductComparisonButtonData {\n accountInformation?: AsyncResult;\n}\n\n/**\n * Extended props for the module including info about the product.\n */\nexport interface IProductComparisonButtonFullProps extends IProductComparisonButtonProps {\n product: ProductSearchResult | SimpleProduct;\n catalogId: number;\n}\n\n/**\n * Extended props for the module including info about the product.\n */\nexport interface IProductComparisonButtonState {\n canProductBeAddedToProductComparison: boolean;\n currentProductsCount: number;\n comparisonItemId: string;\n}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductComparisonButton extends React.PureComponent {\n private static _productComparisonPreview?: React.ReactNode;\n\n private readonly _className: string;\n\n private readonly _instanceId: string;\n\n private readonly _shouldUsePreview: boolean;\n\n private static _renderProductComparisonPreview(props: IProductComparisonButtonFullProps): React.ReactNode {\n if (!ProductComparisonButton._productComparisonPreview && ArrayExtensions.hasElements(props.slots.productComparisonPreview)) {\n ProductComparisonButton._productComparisonPreview = props.slots.productComparisonPreview[0];\n }\n\n return ProductComparisonButton._productComparisonPreview;\n }\n\n private static _renderProductComparisonButton(\n className: string,\n buttonText: string | undefined,\n title: string,\n onClickHandler?: () => void\n ): React.ReactNode {\n const isDisabled = ObjectExtensions.isNullOrUndefined(onClickHandler);\n let content: React.ReactNode;\n if (buttonText) {\n content = (\n <>\n
\n
{buttonText}
\n \n );\n }\n return (\n \n );\n }\n\n public constructor(props: IProductComparisonButtonFullProps) {\n super(props);\n\n this._className = 'ms-product-comparison-button';\n this._instanceId = `${this._className}-${this.props.id}-${Random.Guid.generateGuid()}`;\n\n this.state = this._getNewState();\n\n this._shouldUsePreview = !ProductComparisonButton._productComparisonPreview;\n ProductComparisonButton._renderProductComparisonPreview(this.props);\n }\n\n public componentDidMount(): void {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).listModifiedEvent.subscribe(\n {\n instanceId: this._instanceId,\n\n /**\n * Updates the state in case the state for the particular product was changed.\n */\n handler: () => {\n this.setState(this._getNewState());\n }\n }\n );\n }\n\n public getSnapshotBeforeUpdate(previousProps: Readonly): void {\n if (previousProps.product.RecordId !== this.props.product.RecordId || previousProps.catalogId !== this.props.catalogId) {\n this.setState(this._getNewState());\n }\n }\n\n public componentWillUnmount(): void {\n ProductComparisonState.instance(\n this.props.context.request,\n this.props.data.accountInformation?.result\n ).listModifiedEvent.unsubscribe(this._instanceId);\n }\n\n public render(): React.ReactNode | null {\n const isConsentGiven = this.props.context.request.cookies.isConsentGiven();\n if (!isConsentGiven) {\n return null;\n }\n\n const viewProps: IProductComparisonButtonViewProps = {\n ...this.props,\n moduleProps: {\n moduleProps: this.props,\n className: this._className\n }\n };\n\n if (this._shouldUsePreview) {\n viewProps.productComparisonPreview = ProductComparisonButton._productComparisonPreview;\n }\n\n const buttonClassName = this.props.config.shouldDisplayText ? `${this._className}__button` : `${this._className}__icon`;\n\n if (!this.state.canProductBeAddedToProductComparison) {\n const buttonText = this.props.config.shouldDisplayText ? this.props.resources.removeFromComparisonButtonText : undefined;\n viewProps.productComparisonButton = ProductComparisonButton._renderProductComparisonButton(\n classnames(`${buttonClassName}__removing`, buttonClassName),\n buttonText,\n this.props.resources.removeFromComparisonButtonText,\n this._removeFromProductComparison\n );\n return this.props.renderView(viewProps);\n }\n\n const productsLimit = this._getProductsLimit();\n if (!ObjectExtensions.isNullOrUndefined(productsLimit) && productsLimit <= this.state.currentProductsCount) {\n const buttonText = this.props.config.shouldDisplayText ? this.props.resources.addToComparisonLimitReachedButtonText : undefined;\n viewProps.productComparisonButton = ProductComparisonButton._renderProductComparisonButton(\n buttonClassName,\n buttonText,\n this.props.resources.addToComparisonLimitReachedButtonText\n );\n return this.props.renderView(viewProps);\n }\n\n const buttonText = this.props.config.shouldDisplayText ? this.props.resources.addToComparisonButtonText : undefined;\n viewProps.productComparisonButton = ProductComparisonButton._renderProductComparisonButton(\n buttonClassName,\n buttonText,\n this.props.resources.addToComparisonButtonText,\n this._addToProductComparison\n );\n return this.props.renderView(viewProps);\n }\n\n private _getProductsLimit(): number | undefined | null {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n if (viewport === 'xs' || viewport === 'sm') {\n return this.props.context.app.config.productComparisonMobileProductsLimit;\n }\n return this.props.context.app.config.productComparisonDesktopProductsLimit;\n }\n\n /**\n * Adds current product to a product comparison list.\n */\n private readonly _addToProductComparison: () => void = () => {\n const item = new ProductComparisonItem(this.props.product.RecordId, this.props.catalogId);\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).addItem(item);\n };\n\n /**\n * Removes current product from the product comparison list where it was added earlier.\n */\n private readonly _removeFromProductComparison: () => void = () => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).removeItemById(\n this.state.comparisonItemId\n );\n };\n\n private _getProdutComparisonDataByCatalogId(): ProductComparisonItem[] {\n const items = ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).items;\n const catalogId = getCatalogId(this.props.context.request);\n const productByCatalogId = items?.filter(product => product.catalogId === catalogId) ?? [];\n return productByCatalogId;\n }\n\n /**\n * Retrieves the state of the component based on the comparison data.\n * @returns State object for the component.\n */\n private readonly _getNewState: () => IProductComparisonButtonState = () => {\n const comparisonItemId = ProductComparisonItem.getItemId(this.props.product.RecordId, this.props.catalogId);\n const products = this._getProdutComparisonDataByCatalogId();\n return {\n comparisonItemId,\n canProductBeAddedToProductComparison: !ProductComparisonState.instance(\n this.props.context.request,\n this.props.data.accountInformation?.result\n ).hasItemById(comparisonItemId),\n currentProductsCount: products.length\n };\n };\n}\n\nexport default ProductComparisonButton;\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ICittaProductAttributeLinkData } from './citta-product-attribute-link.data';\r\nimport { ICittaProductAttributeLinkProps } from './citta-product-attribute-link.props.autogenerated';\r\n\r\nexport interface ICitttaProductAttributeLinkViewProps extends ICittaProductAttributeLinkProps {\r\n linkItem?: INodeProps;\r\n className?: string;\r\n contentBlockContainer: IModuleProps;\r\n}\r\n/**\r\n *\r\n * ContentCard component\r\n * @extends {React.PureComponent>}\r\n */\r\n\r\nclass CittaProductAttributeLink extends React.PureComponent> {\r\n \r\n public render(): JSX.Element | null {\r\n const {\r\n className\r\n } = this.props.config;\r\n\r\n const content: ICittaProductAttributeLinkData = this.props.data;\r\n\r\n const attributes = content.attributes.result;\r\n const linkAttribute = attributes?.find(attribute => attribute.Name === this.props.resources.attributeName);\r\n\r\n if (!linkAttribute || !linkAttribute.TextValue) {\r\n return null;\r\n }\r\n \r\n const contentBlockviewProps = {\r\n ...this.props,\r\n linkItem: this._renderLink(linkAttribute.TextValue),\r\n contentBlockContainer: {\r\n moduleProps: this.props,\r\n className: classnames('product-attribute-link', className),\r\n }\r\n };\r\n return this.props.renderView(contentBlockviewProps) as React.ReactElement;\r\n }\r\n\r\n private _renderLink = (linkUrl: String) => {\r\n const {\r\n linkText\r\n } = this.props.config;\r\n return this._goToLink(linkUrl)}>{linkText || 'Discover more'}\r\n };\r\n\r\n private _goToLink = (linkUrl: String) => {\r\n if (MsDyn365.isBrowser && typeof window !== 'undefined') {\r\n const baseUrl = window.location.origin;\r\n if (baseUrl.length) {\r\n window.location.assign(`${baseUrl}${linkUrl}`);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default CittaProductAttributeLink;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IProductComparisonButtonViewProps } from './product-comparison-button';\n\n/**\n * Represents product comparison button view.\n * @param props - View props for product comparison button.\n * @returns Functional component of product comparison button.\n */\nexport const ProductComparisonButtonViewFunctionalComponent: React.FC = props => {\n const { productComparisonButton, productComparisonPreview } = props;\n\n return (\n \n {productComparisonButton}\n {productComparisonPreview}\n \n );\n};\n\nexport default ProductComparisonButtonViewFunctionalComponent;\n"],"sourceRoot":""}