{"version":3,"file":"static/js/2c712cb067624ceb1e6f.bundle.js","mappings":"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","sources":["webpack://bju-press/./src/modules/quickview/utilities/helper.ts?c92a","webpack://bju-press/./src/modules/quickview/utilities/get-valid-product-images.ts?8145","webpack://bju-press/./src/modules/quickview/quickview.tsx?8e99","webpack://bju-press/./src/modules/quickview/utilities/get-product-details.ts?0cc4","webpack://bju-press/./src/modules/quickview/quickview.view.tsx?b19c","webpack://bju-press/./src/utilities/class-name-helper.ts?dd10","webpack://bju-press/./lib/quickview/module-registration.js?f71d","webpack://bju-press/./src/modules/adventureworks/views/quickview.view.tsx?8e29","webpack://bju-press/external var \"React\"?0d3b","webpack://bju-press/external var \"ReactDOM\"?853b"],"sourcesContent":["/*!\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\nimport { IRequestContext } from '@msdyn365-commerce/core';\r\n\r\n/**\r\n * Gets correct alt text for image based on configuration of site.\r\n * @param context Current request context.\r\n * @param shouldUseCmsAltText Should use CMS alt text.\r\n * @param productName Product name.\r\n * @param imageAltText Alt-text from CMS image.\r\n */\r\nexport function getAltText(\r\n context: IRequestContext,\r\n shouldUseCmsAltText: boolean,\r\n productName?: string,\r\n imageAltText?: string\r\n): string | undefined {\r\n if (!context?.app?.config?.OmniChannelMedia) {\r\n return productName;\r\n }\r\n if (shouldUseCmsAltText) {\r\n return imageAltText;\r\n }\r\n return productName;\r\n}\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\nimport { commerceApiRequest, getCatalogId, IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getAltText } from './helper';\r\n\r\nexport async function getValidProductImages(\r\n productId: number,\r\n channelId: number,\r\n actionContext: IActionContext,\r\n imageSettings: IImageSettings,\r\n selectedProduct?: SimpleProduct\r\n): Promise {\r\n const catalogId = getCatalogId(actionContext.requestContext);\r\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\r\n\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return Promise.all(mediaLocations.map(async mediaLocation => validateMediaLocaionAsync(mediaLocation, imageSettings))).then(\r\n pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n }\r\n );\r\n }\r\n return [];\r\n })\r\n .catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n return [];\r\n });\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unused-vars-experimental -- .\r\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings?: IImageSettings): Promise<[IImageData, boolean]> {\r\n const imageData = {\r\n src: mediaLocation.Uri || '',\r\n altText: mediaLocation.AltText || ''\r\n };\r\n\r\n if (imageData.src === '') {\r\n return [imageData, false];\r\n }\r\n\r\n return new Promise<[IImageData, boolean]>(resolve => {\r\n try {\r\n const http = new XMLHttpRequest();\r\n http.open('HEAD', imageData.src, true);\r\n\r\n http.addEventListener('load', () => {\r\n resolve([imageData, http.status === 200 || http.status === 201]);\r\n });\r\n\r\n http.addEventListener('error', () => {\r\n resolve([imageData, false]);\r\n });\r\n\r\n http.send();\r\n } catch {\r\n resolve([imageData, false]);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\r\n * @param productId Product record id.\r\n * @param shouldUseCmsAltText Alt-text source to use.\r\n * @param channelId Current channel id.\r\n * @param actionContext Current action context.\r\n * @param productName Product name.\r\n * @param selectedProduct Currently selected variant product.\r\n * @returns List of images.\r\n */\r\n\r\nexport async function getProductImages(\r\n productId: number,\r\n shouldUseCmsAltText: boolean,\r\n channelId: number,\r\n actionContext: IActionContext,\r\n productName?: string,\r\n selectedProduct?: SimpleProduct\r\n): Promise {\r\n const catalogId = getCatalogId(actionContext.requestContext);\r\n if (actionContext.requestContext?.params?.isPreview) {\r\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\r\n productId: productId,\r\n channelId: channelId,\r\n catalogId: catalogId\r\n });\r\n if (response.status !== 200) {\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\r\n return [];\r\n }\r\n const previewImageData = response?.data as MediaLocation[];\r\n if (previewImageData) {\r\n return previewImageData.map(mediaLocation => {\r\n return {\r\n src: mediaLocation.Uri ?? '',\r\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\r\n additionalProperties: mediaLocation.IsApplicableForChildEntities\r\n ? {\r\n isApplicableForChildEntities: 'true'\r\n }\r\n : undefined\r\n };\r\n });\r\n }\r\n return [];\r\n }\r\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return mediaLocations.map(mediaLocation => {\r\n return {\r\n src: mediaLocation.Uri ?? '',\r\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\r\n additionalProperties: mediaLocation.IsApplicableForChildEntities\r\n ? {\r\n isApplicableForChildEntities: 'true'\r\n }\r\n : undefined\r\n };\r\n });\r\n }\r\n return [];\r\n })\r\n .catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n return [];\r\n });\r\n}\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\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\r\nimport msdyn365Commerce, { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport {\r\n ProductDeliveryOptions,\r\n ProductDimension,\r\n ProductDimensionValue,\r\n ProductPrice,\r\n ReleasedProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n convertProductDimensionTypeToDimensionTypes,\r\n FinitePromiseQueue,\r\n FinitePromiseQueueError,\r\n getDeliveryOptionsForSelectedVariant,\r\n GetDeliveryOptionsForSelectedVariantInput,\r\n getDimensionsForSelectedVariant,\r\n GetDimensionsForSelectedVariantInput,\r\n getPriceForSelectedVariant,\r\n getProductAvailabilitiesForSelectedVariant,\r\n getProductPageUrlSync,\r\n getSelectedVariant,\r\n IProductInventoryInformation,\r\n IPromiseQueue,\r\n ISelectedProduct,\r\n ObjectExtensions,\r\n PriceForSelectedVariantInput,\r\n ProductAvailabilitiesForSelectedVariantInput,\r\n QueryResultSettingsProxy,\r\n SelectedVariantInput,\r\n StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IComponentNodeProps,\r\n IModuleProps,\r\n IncrementalQuantity,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n isMobile,\r\n ITelemetryContent,\r\n KeyCodes,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader,\r\n NodeTag,\r\n onTelemetryClick,\r\n SingleSlideCarousel,\r\n TelemetryConstant,\r\n updateMaxQuantityForCartLineItem,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\r\nimport React, { ReactNode } from 'react';\r\n\r\nimport {\r\n getBuyboxAddToCart,\r\n getBuyBoxInventoryLabel,\r\n getBuyboxKeyInPrice,\r\n getBuyboxProductAddToWishlist,\r\n getBuyboxProductDescription,\r\n getBuyboxProductPrice,\r\n getBuyboxProductRating,\r\n getBuyboxProductTitle,\r\n getBuyboxProductUnitOfMeasure,\r\n getQuantityLimitsMessages,\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxAddToOrderTemplateViewProps,\r\n IBuyboxAddToWishlistViewProps,\r\n IBuyboxCallbacks,\r\n IBuyboxCommonData,\r\n IBuyboxExtentedProps,\r\n IBuyboxKeyInPriceViewProps,\r\n IBuyboxProductConfigureViewProps,\r\n IBuyboxProductQuantityViewProps,\r\n IBuyboxState,\r\n IErrorState,\r\n IProductDetails,\r\n RetailDefaultOrderQuantityLimitsFeatureName,\r\n EcommerceQuantityLimitConfigurationsFeatureName\r\n} from '@msdyn365-commerce-modules/buybox';\r\nimport { getBuyboxProductConfigure } from '@msdyn365-commerce-modules/buybox';\r\nimport { IQuickviewData } from './quickview.data';\r\nimport { IQuickviewProps, IQuickviewResources } from './quickview.props.autogenerated';\r\nimport { getProductDetails } from './utilities/get-product-details';\r\nimport { getProductImages, getValidProductImages } from './utilities/get-valid-product-images';\r\nimport { RecentlyViewedState } from '@msdyn365-commerce-modules/buybox';\r\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\n/**\r\n * QuickView props Interface.\r\n */\r\nexport interface IQuickviewViewProps extends IQuickviewProps {\r\n quickView: IModuleProps;\r\n quickViewButton: React.ReactNode;\r\n ModalContainer: IModuleProps;\r\n ModalHeaderContainer: INodeProps;\r\n ModalHeaderContent: React.ReactNode;\r\n ModalFooterContainer: INodeProps;\r\n ModalBodyContainer: INodeProps;\r\n cartContainerProps: INodeProps;\r\n state: IBuyboxState;\r\n ModuleProps?: IModuleProps;\r\n ProductInfoContainerProps: INodeProps;\r\n MediaGalleryContainerProps: INodeProps;\r\n callbacks?: IBuyboxCallbacks;\r\n title?: React.ReactNode;\r\n description?: React.ReactNode;\r\n configure?: IBuyboxProductConfigureViewProps;\r\n inventoryLabel?: React.ReactNode;\r\n rating?: React.ReactNode;\r\n price?: React.ReactNode;\r\n addToCart?: IBuyboxAddToCartViewProps;\r\n addToOrderTemplate?: IBuyboxAddToOrderTemplateViewProps;\r\n addToWishlist?: IBuyboxAddToWishlistViewProps;\r\n max: number | undefined;\r\n keyInPrice?: IBuyboxKeyInPriceViewProps;\r\n quantity?: IBuyboxProductQuantityViewProps;\r\n quantityLimitsMessages?: React.ReactNode;\r\n CarouselProps: INodeProps;\r\n Thumbnails: IQuickViewThumbnailsViewProps;\r\n seeDetailsbutton: React.ReactNode;\r\n isModalOpen: boolean;\r\n loading?: React.ReactNode;\r\n unitOfMeasure?: React.ReactNode;\r\n productDetails?: IProductDetails | undefined;\r\n isMobileDevice?: boolean;\r\n addedToCart?: boolean;\r\n}\r\n\r\n/**\r\n * QuickView extend props Interface.\r\n */\r\nexport interface IQuickviewExtentedProps extends IQuickviewProps {\r\n selectedProductId?: number;\r\n selectedDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * QuickView thumbnails props Interface.\r\n */\r\nexport interface IQuickViewThumbnailsViewProps {\r\n ThumbnailsContainerProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n items?: IQuickViewThumbnailItemViewProps[];\r\n}\r\n\r\n/**\r\n * QuickView thumbnail item view props Interface.\r\n */\r\nexport interface IQuickViewThumbnailItemViewProps {\r\n ThumbnailItemContainerProps: INodeProps;\r\n Picture: React.ReactElement;\r\n}\r\n\r\n/**\r\n * QuickView state Interface.\r\n */\r\nexport interface IQuickViewState extends IBuyboxState {\r\n isDataLoaded: boolean;\r\n addedToCart: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * Quickview component.\r\n * @extends {React.Component>}\r\n */\r\nclass Quickview extends React.Component, IQuickViewState> {\r\n /**\r\n * A queue of tasks of processing the changes in the dimensions.\r\n * Limit to two processes:\r\n * 1 - for the current process, which is under execution at the moment.\r\n * 2 - next process, which will process the latest version of data.\r\n * @remark Enqueueing new promises will discard the previous ones (except the one which is under processing).\r\n */\r\n private readonly dimensionUpdateQueue: IPromiseQueue = new FinitePromiseQueue(2);\r\n\r\n private dimensions: { [id: number]: string } = {};\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private productDetails: IProductDetails | undefined;\r\n\r\n private readonly quickViewCallbacks: IBuyboxCallbacks = {\r\n updateQuantity: (newQuantity: number): boolean => {\r\n const errorState = { ...this.state.errorState };\r\n errorState.quantityError = undefined;\r\n errorState.otherError = undefined;\r\n\r\n this.setState({ quantity: newQuantity, errorState });\r\n return true;\r\n },\r\n updateErrorState: (newErrorState: IErrorState): void => {\r\n this.setState({ errorState: newErrorState });\r\n },\r\n updateSelectedProduct: (\r\n newSelectedProduct: Promise,\r\n newInventory: IProductInventoryInformation | undefined,\r\n newPrice: ProductPrice | undefined,\r\n newDeliveryOptions: ProductDeliveryOptions | undefined\r\n ): void => {\r\n this.setState({\r\n selectedProduct: newSelectedProduct,\r\n productAvailableQuantity: newInventory,\r\n productDeliveryOptions: newDeliveryOptions\r\n });\r\n this._updatePrice(newPrice);\r\n },\r\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise => {\r\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\r\n return this.dimensionUpdateQueue\r\n .enqueue(async () => {\r\n return this._updateDimensions();\r\n })\r\n .catch((error: unknown) => {\r\n // Ignore discarded processes.\r\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\r\n throw error;\r\n }\r\n });\r\n },\r\n getDropdownName: (dimensionType: number, resources: IQuickviewResources): string => {\r\n return this._getDropdownName(dimensionType, resources);\r\n },\r\n changeModalOpen: (isModalOpen: boolean): void => {\r\n this._addItemQuickViewDialog();\r\n },\r\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\r\n this.setState({ isUpdatingDimension });\r\n },\r\n updateKeyInPrice: (customPrice: number): void => {\r\n // Remove custom amount error when updating the custom price\r\n const errorState = { ...this.state.errorState };\r\n errorState.customAmountError = undefined;\r\n\r\n this.setState({ isPriceKeyedIn: true, keyInPriceAmount: customPrice, errorState });\r\n this._updatePrice(this.state.productPrice, customPrice);\r\n }\r\n };\r\n\r\n private readonly defaultGalleryImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\r\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\r\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n public constructor(props: IQuickviewProps) {\r\n super(props);\r\n\r\n // @CUSTOM: need to bypass default behavior to avoid multiple modals\r\n this.props.app.config.addToCartBehavior = 'nothing';\r\n\r\n this.state = {\r\n modalOpen: false,\r\n quantity: 1,\r\n min: undefined,\r\n max: undefined,\r\n errorState: {\r\n configureErrors: {}\r\n },\r\n selectedProduct: undefined,\r\n productPrice: undefined,\r\n productDeliveryOptions: undefined,\r\n isUpdatingDimension: false,\r\n activeIndex: 0,\r\n animating: false,\r\n mediaGalleryItems: undefined,\r\n isDataLoaded: false,\r\n addedToCart: false\r\n };\r\n\r\n this._quickViewCloseButtonclick = this._quickViewCloseButtonclick.bind(this);\r\n this.telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n }\r\n\r\n /**\r\n * React should component udpate function.\r\n * @param nextProps - Next Props.\r\n * @param nextState - Next State.\r\n * @returns Boolean - Whether the module will rerender or not.\r\n */\r\n public shouldComponentUpdate(nextProps: IQuickviewProps, nextState: IBuyboxState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n config: { className = '' },\r\n resources\r\n } = this.props;\r\n const { max } = this.state;\r\n const product = this.productDetails?.product ? this.productDetails.product : undefined;\r\n const props = this.props as IBuyboxExtentedProps;\r\n const defaultMinimumKeyInPrice = 10;\r\n const defaultMaximumKeyInPrice = 100;\r\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\r\n const viewprops: IQuickviewViewProps = {\r\n ...(this.props as IQuickviewExtentedProps),\r\n state: this.state,\r\n productDetails: this.productDetails,\r\n isModalOpen: this.state.modalOpen!,\r\n addedToCart: this.state.addedToCart,\r\n quickView: {\r\n moduleProps: this.props,\r\n className: classnames('ms-quickView', className),\r\n tag: 'div'\r\n },\r\n isMobileDevice,\r\n quickViewButton: (\r\n \r\n ),\r\n ModalContainer: {\r\n moduleProps: this.props,\r\n tag: Modal,\r\n className: 'ms-quickView__dialog',\r\n isOpen: this.state.modalOpen,\r\n 'aria-label': format(resources.quickViewAriaLabel, this.productDetails?.product?.Name),\r\n toggle: this._quickViewCloseButtonclick,\r\n modalTransition: { timeout: 0 },\r\n shouldUpdateFocusToFirstElement: this.state.isDataLoaded\r\n },\r\n ModalHeaderContainer: {\r\n tag: ModalHeader,\r\n className: 'ms-quickView__header',\r\n toggle: this._quickViewCloseButtonclick\r\n },\r\n ModalFooterContainer: {\r\n tag: ModalFooter,\r\n className: 'ms-quickView__footer'\r\n },\r\n ModalHeaderContent: '',\r\n ModalBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-quickView__body'\r\n },\r\n cartContainerProps: {\r\n className: 'ms-quickView__product-add-to-cart'\r\n },\r\n ProductInfoContainerProps: {\r\n className: 'ms-quickView__content'\r\n },\r\n MediaGalleryContainerProps: {\r\n className: 'ms-quickView__media-gallery'\r\n },\r\n seeDetailsbutton: this._renderSeeDetailButton(product),\r\n loading: !this.state.isDataLoaded && (\r\n \r\n ),\r\n callbacks: this.quickViewCallbacks,\r\n title: this.state.isDataLoaded && getBuyboxProductTitle(props, this.productDetails),\r\n description: this.state.isDataLoaded && getBuyboxProductDescription(props, this.productDetails),\r\n configure: this.state.isDataLoaded\r\n ? getBuyboxProductConfigure(props, this.state, this.quickViewCallbacks, this.productDetails, this.props.selectedDimensions)\r\n : undefined,\r\n price: this.state.isDataLoaded && getBuyboxProductPrice(props, this.state),\r\n unitOfMeasure: this.state.isDataLoaded && getBuyboxProductUnitOfMeasure(props, this.productDetails),\r\n rating:\r\n this.state.isDataLoaded && !this.props.context.app.config.hideRating && getBuyboxProductRating(props, this.productDetails),\r\n addToCart: this.state.isDataLoaded\r\n ? getBuyboxAddToCart(\r\n props,\r\n this.state,\r\n this.quickViewCallbacks,\r\n defaultMinimumKeyInPrice,\r\n defaultMaximumKeyInPrice,\r\n this.productDetails\r\n )\r\n : undefined,\r\n keyInPrice:\r\n this.state.isDataLoaded && this.props.config.enableKeyInPrice && this.state.isCustomPriceSelected\r\n ? getBuyboxKeyInPrice(props, this.state, this.quickViewCallbacks)\r\n : undefined,\r\n quantity: product?.IsGiftCard ? undefined : this._renderQuantity(this.props, this.state, this.quickViewCallbacks),\r\n inventoryLabel: this.state.isDataLoaded && getBuyBoxInventoryLabel(props, this.productDetails),\r\n addToWishlist: this.state.isDataLoaded\r\n ? getBuyboxProductAddToWishlist(props, this.state, this.quickViewCallbacks, this.productDetails)\r\n : undefined,\r\n quantityLimitsMessages: this.state.isDataLoaded && getQuantityLimitsMessages(props, this.state),\r\n max,\r\n CarouselProps: this._renderCarousel(),\r\n Thumbnails: this._renderThumbnails()\r\n };\r\n\r\n return this.props.renderView(viewprops) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Method to render detail button on quick view.\r\n * @param product - Simple product object.\r\n * @returns JSX element.\r\n */\r\n private readonly _renderSeeDetailButton = (product: SimpleProduct | undefined): JSX.Element => {\r\n const { config } = this.props;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.seeDetails, '');\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n\r\n return (\r\n \r\n {config.seeDetailsLinkText}\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Method to return carousel.\r\n * @returns Node props.\r\n */\r\n private readonly _renderCarousel = (): INodeProps => {\r\n const { config, resources } = this.props;\r\n let mediaGalleryItems: ReactNode[];\r\n let keys: (string | undefined)[];\r\n const galleryImageSettings = config.galleryImageSettings;\r\n if (galleryImageSettings) {\r\n galleryImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(this.state.mediaGalleryItems)) {\r\n mediaGalleryItems = this.state.mediaGalleryItems.map((item: IImageData, index: number) => {\r\n return this._renderCarouselItemImageView(item, galleryImageSettings || this.defaultGalleryImageSettings, index);\r\n });\r\n keys = [...this.state.mediaGalleryItems.map(item => item.src)];\r\n } else {\r\n mediaGalleryItems = [this._renderEmptyImage(galleryImageSettings)];\r\n keys = ['empty'];\r\n }\r\n\r\n const props: IComponentNodeProps = {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items: mediaGalleryItems,\r\n activeIndex: this.state.activeIndex ?? 0,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n indicatorAriaText: resources.ariaLabelForSlide,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n key: keys\r\n };\r\n\r\n return props;\r\n };\r\n\r\n /**\r\n * Method to render thumbnails.\r\n * @returns QuickView Thumbnails view props.\r\n */\r\n private readonly _renderThumbnails = (): IQuickViewThumbnailsViewProps => {\r\n const { config, id, resources } = this.props;\r\n\r\n const thumbnailImageSettings = config.thumbnailImageSettings;\r\n if (thumbnailImageSettings) {\r\n thumbnailImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n let mediaGalleryItems: IQuickViewThumbnailItemViewProps[];\r\n let keys: (string | undefined)[];\r\n if (ArrayExtensions.hasElements(this.state.mediaGalleryItems)) {\r\n mediaGalleryItems = this.state.mediaGalleryItems.map((item: IImageData, index: number) => {\r\n return this._getThumbnailItem(\r\n item,\r\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n index,\r\n this.state.activeIndex!\r\n );\r\n });\r\n keys = [...this.state.mediaGalleryItems.map(item => item.src)];\r\n } else {\r\n mediaGalleryItems = [];\r\n keys = [];\r\n }\r\n\r\n return {\r\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: 'ms-media-gallery__thumbnails',\r\n flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n flipperNextLabel: resources.nextScreenshotFlipperText,\r\n parentId: id,\r\n useTabList: true,\r\n key: JSON.stringify(keys)\r\n } as IComponentNodeProps,\r\n items: mediaGalleryItems\r\n };\r\n };\r\n\r\n private _updateMediaItems(lastUpdatedTime: number): void {\r\n const product = this.productDetails?.product;\r\n if (!this.state.mediaGalleryItems && product?.PrimaryImageUrl) {\r\n this.setState({\r\n mediaGalleryItems: [this._mapProductToImageData(product)],\r\n lastUpdate: lastUpdatedTime\r\n });\r\n }\r\n }\r\n\r\n private _updatePrice(newPrice: ProductPrice | undefined, customPrice: number | undefined = this.state.keyInPriceAmount): void {\r\n if (this.state.isCustomPriceSelected && newPrice) {\r\n newPrice.CustomerContextualPrice = customPrice;\r\n }\r\n this.setState({ productPrice: newPrice });\r\n }\r\n\r\n private readonly _updateDimensions = async (): Promise => {\r\n const {\r\n context: {\r\n actionContext,\r\n request: {\r\n apiSettings: { channelId }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const { product, productDimensions } = this.productDetails!;\r\n\r\n if (!product || !productDimensions) {\r\n return;\r\n }\r\n\r\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\r\n this.setState({ isUpdatingDimension: true });\r\n\r\n // Step 1: Clear error state to display relevant errors\r\n if (this.state.errorState.otherError || this.state.errorState.quantityError) {\r\n const clearErrorState = { ...this.state.errorState };\r\n clearErrorState.otherError = undefined;\r\n if (this.state.errorState.errorHost === 'ADDTOCART') {\r\n clearErrorState.quantityError = undefined;\r\n clearErrorState.errorHost = undefined;\r\n }\r\n this.setState({ errorState: clearErrorState });\r\n }\r\n\r\n // Step 2: Clear any errors indicating the dimension wasn't selected\r\n for (const key of Object.keys(dimensionsToUpdate)) {\r\n if (this.state.errorState.configureErrors[key]) {\r\n const errorState = { ...this.state.errorState };\r\n errorState.configureErrors[key] = undefined;\r\n\r\n this.setState({ errorState });\r\n }\r\n }\r\n\r\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\r\n // over the information in data\r\n const mappedDimensions = productDimensions\r\n .map(dimension => {\r\n return {\r\n DimensionTypeValue: dimension.DimensionTypeValue,\r\n DimensionValue:\r\n this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) || dimension.DimensionValue,\r\n ExtensionProperties: dimension.ExtensionProperties\r\n };\r\n })\r\n .filter(dimension => {\r\n return dimension && dimension.DimensionValue;\r\n });\r\n\r\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\r\n // so that places like add to cart can await it\r\n const selectedProduct = new Promise(async resolve => {\r\n const newProduct = await getSelectedVariant(\r\n new SelectedVariantInput(\r\n product.MasterProductId ? product.MasterProductId : product.RecordId,\r\n channelId,\r\n mappedDimensions,\r\n undefined,\r\n this.props.context.request\r\n ),\r\n actionContext\r\n );\r\n if (newProduct) {\r\n // @ts-expect-error\r\n this.productDetails.productDimensions = await getDimensionsForSelectedVariant(\r\n new GetDimensionsForSelectedVariantInput(\r\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\r\n channelId,\r\n mappedDimensions,\r\n this.props.context.request\r\n ),\r\n actionContext\r\n );\r\n }\r\n\r\n resolve(newProduct);\r\n });\r\n\r\n this.setState({ selectedProduct });\r\n const variantProduct = await selectedProduct;\r\n\r\n if (variantProduct && this.productDetails) {\r\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\r\n // so that places like add to cart can await it\r\n this.productDetails.product = variantProduct;\r\n let images: IImageData[] = await this.getImagesForProduct(product, variantProduct);\r\n images = this._filterMasterImageFromVariant(images, variantProduct);\r\n this.setState({\r\n mediaGalleryItems: [...images],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n\r\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\r\n new ProductAvailabilitiesForSelectedVariantInput(variantProduct.RecordId, channelId),\r\n actionContext\r\n );\r\n\r\n this.productDetails.productAvailableQuantity = newAvailableQuantity!;\r\n\r\n const isCustompriceSelected = variantProduct.Dimensions?.find(\r\n dimension => dimension.DimensionTypeValue === 4 && dimension.DimensionValue?.Value?.toLowerCase() === 'custom'\r\n );\r\n\r\n if (isCustompriceSelected) {\r\n this.setState({ isCustomPriceSelected: true });\r\n } else {\r\n // Remove custom amount error when unselect the custom amount\r\n const errorState = { ...this.state.errorState };\r\n errorState.customAmountError = undefined;\r\n\r\n this.setState({ isCustomPriceSelected: false, isPriceKeyedIn: false, errorState });\r\n }\r\n\r\n if (newAvailableQuantity && newAvailableQuantity.length > 0) {\r\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\r\n } else {\r\n this.setState({ productAvailableQuantity: undefined });\r\n }\r\n\r\n // Step 6. Use these dimensions hydrate the product price.\r\n const newPrice = await getPriceForSelectedVariant(\r\n new PriceForSelectedVariantInput(variantProduct.RecordId, channelId),\r\n actionContext\r\n );\r\n\r\n if (newPrice) {\r\n this._updatePrice(newPrice);\r\n }\r\n\r\n const RetailMulitplePickupMFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n\r\n // Step 7. Use these dimensions hydrate the product delivery options.\r\n const newDeliveryOptions = await getDeliveryOptionsForSelectedVariant(\r\n new GetDeliveryOptionsForSelectedVariantInput(\r\n variantProduct.RecordId,\r\n channelId,\r\n undefined,\r\n undefined,\r\n RetailMulitplePickupMFeatureState?.IsEnabled\r\n ),\r\n actionContext\r\n );\r\n\r\n if (newDeliveryOptions) {\r\n this.setState({ productDeliveryOptions: newDeliveryOptions });\r\n }\r\n\r\n this.setState({ isUpdatingDimension: false });\r\n await this._updateQuantitiesInState(variantProduct);\r\n }\r\n };\r\n\r\n private _getProductURL(product: SimpleProduct | undefined): string {\r\n if (!product || !msdyn365Commerce.isBrowser) {\r\n return '';\r\n }\r\n\r\n let productUrl = '';\r\n productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, this.props.context.actionContext, undefined);\r\n\r\n const fullUrl = new URL(productUrl, window.location.href);\r\n product.Dimensions?.map(dimension => {\r\n const dimensionValue = dimension.DimensionValue?.Value;\r\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\r\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\r\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\r\n }\r\n });\r\n return fullUrl.href;\r\n }\r\n\r\n private shouldUseCmsAltText = (): boolean => {\r\n if (this.props.config.altTextSource === 'product') {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n private async _updateQuantitiesInState(product: SimpleProduct): Promise {\r\n const isOrderQuantityLimitsFeatureEnabled = await this._isOrderQuantityLimitsFeatureEnabled();\r\n const isChannelLimitsFeatureEnabled = await this._isChannelLimitsFeatureEnabled();\r\n\r\n const min: number = this._getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled, product);\r\n const max: number = this._getMaxQuantityForCartLineItem(\r\n isChannelLimitsFeatureEnabled || isOrderQuantityLimitsFeatureEnabled,\r\n product\r\n );\r\n\r\n this.setState({\r\n min,\r\n max\r\n });\r\n }\r\n\r\n private _getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\r\n if (isOrderQuantityLimitsFeatureEnabled && product?.Behavior?.MinimumQuantity && product.Behavior.MinimumQuantity > 0) {\r\n return product.Behavior.MinimumQuantity;\r\n }\r\n\r\n return 1;\r\n }\r\n\r\n private _getMaxQuantityForCartLineItem(isQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\r\n if (isQuantityLimitsFeatureEnabled && product?.Behavior?.MaximumQuantity && product.Behavior.MaximumQuantity > 0) {\r\n return product.Behavior.MaximumQuantity;\r\n }\r\n\r\n return updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem);\r\n }\r\n\r\n private _filterMasterImageFromVariant(images?: IImageData[], product?: ISelectedProduct | null): IImageData[] {\r\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\r\n let variantImages = images ?? [];\r\n const isVariantProduct =\r\n !ObjectExtensions.isNullOrUndefined(product?.MasterProductId) || !ObjectExtensions.isNullOrUndefined(product?.productVariant);\r\n const itemId = product?.ItemId;\r\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\r\n variantImages = variantImages.filter(item => {\r\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\r\n return !isApplicableForChildEntities;\r\n });\r\n if (!ArrayExtensions.hasElements(variantImages)) {\r\n variantImages = images ?? [];\r\n }\r\n }\r\n return variantImages;\r\n }\r\n\r\n private readonly _updateDimensionValue = (\r\n productDimensionFull: ProductDimensionFull,\r\n newValueId: string | undefined\r\n ): ProductDimensionValue | undefined => {\r\n if (newValueId && productDimensionFull.DimensionValues) {\r\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n private readonly _getDropdownName = (dimensionType: number, resources: IQuickviewResources): string => {\r\n const isGiftCard = this.productDetails?.product?.IsGiftCard;\r\n\r\n switch (dimensionType) {\r\n case 1: // ProductDimensionType.Color\r\n return resources.productDimensionTypeColor;\r\n case 2: // ProductDimensionType.Configuration\r\n return resources.productDimensionTypeConfiguration;\r\n case 3: // ProductDimensionType.Size\r\n return resources.productDimensionTypeSize;\r\n case 4: // ProductDimensionType.Style\r\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n private async _isOrderQuantityLimitsFeatureEnabled(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context.request.app.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n const featureStatuses = await this.props.data.featureState;\r\n const isFeatureEnabledInHq = featureStatuses.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)\r\n ?.IsEnabled;\r\n if (!isFeatureEnabledInHq) {\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n let customerInfo;\r\n try {\r\n customerInfo = await this.props.data.customerInformation;\r\n } catch (error) {\r\n this.props.telemetry.information(error as string);\r\n this.props.telemetry.debug('Unable to receive Customer Information. May be user is not authorized');\r\n return false;\r\n }\r\n\r\n return (\r\n customerInfo !== undefined &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n }\r\n\r\n private async _isChannelLimitsFeatureEnabled(): Promise {\r\n const featureStatuses = await this.props.data.featureState;\r\n\r\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\r\n featureState => featureState.Name === EcommerceQuantityLimitConfigurationsFeatureName\r\n )?.IsEnabled;\r\n\r\n return isChannelLimitsFeatureEnabledInHq ?? false;\r\n }\r\n\r\n private readonly onExiting = () => {\r\n this.setState({ animating: true });\r\n };\r\n\r\n private readonly onExited = () => {\r\n this.setState({ animating: false });\r\n };\r\n\r\n private readonly next = (): void => {\r\n if (this.isLastItem() === undefined) {\r\n return;\r\n }\r\n\r\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex! + 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private readonly previous = (): void => {\r\n const nextIndex = this.isFirstItem()\r\n ? this.state.mediaGalleryItems\r\n ? this.state.mediaGalleryItems.length - 1\r\n : 0\r\n : this.state.activeIndex! - 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private readonly goToIndex = (index: number): void => {\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _renderCarouselItemImageView(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n return <>{this._getCarouselItem(image, imageSettings, index)};\r\n }\r\n\r\n private readonly _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\r\n \r\n );\r\n\r\n private readonly _getThumbnailItem = (\r\n image: IImageData,\r\n imageSettings: IImageSettings,\r\n index: number,\r\n modifiedActiveIndex: number\r\n ): IQuickViewThumbnailItemViewProps => {\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: index,\r\n 'aria-label': image.altText,\r\n 'aria-selected': modifiedActiveIndex === index,\r\n 'aria-controls': `${this.props.id}__carousel-item__${index}`,\r\n onClick: this._generateOnThumbnailClick(index),\r\n onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n };\r\n\r\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\r\n return (event: React.KeyboardEvent) => {\r\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\r\n event.preventDefault();\r\n this.goToIndex(index);\r\n }\r\n };\r\n };\r\n\r\n private readonly _generateOnThumbnailClick = (index: number) => {\r\n return (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n this.goToIndex(index);\r\n };\r\n };\r\n\r\n private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n return {\r\n src: product.PrimaryImageUrl || '',\r\n altText: product.Name\r\n };\r\n }\r\n\r\n private readonly isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private readonly isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\r\n\r\n private readonly onClickHandler = async (event: React.MouseEvent) => {\r\n return this._onClick(event, this.props);\r\n };\r\n\r\n private readonly _onClick = async (_event: React.MouseEvent, props: IQuickviewExtentedProps) => {\r\n if (!ObjectExtensions.isNullOrUndefined(props.selectedProductId)) {\r\n const {\r\n context: {\r\n actionContext,\r\n request: {\r\n apiSettings: { channelId }\r\n }\r\n }\r\n } = this.props;\r\n\r\n if (this.props.selectedProductId) {\r\n this.setState({ modalOpen: true });\r\n const productId = this.props.selectedProductId;\r\n const selectedDimensions = this.props.selectedDimensions;\r\n this.productDetails = await getProductDetails(productId, channelId, actionContext, selectedDimensions);\r\n const { product, productPrice } = this.productDetails;\r\n const currentTime: number = Date.now();\r\n this._updateMediaItems(currentTime);\r\n if (productPrice) {\r\n this._updatePrice(productPrice);\r\n }\r\n\r\n if (product) {\r\n const { context } = this.props;\r\n if (context.app.config.maxRecentlyViewedItemsCount > 0) {\r\n RecentlyViewedState.instance(this.props.context, context.app.config.maxRecentlyViewedItemsCount, product.RecordId);\r\n }\r\n // Check if the product is service or not by product type\r\n if (product.ItemTypeValue === ReleasedProductType.Service) {\r\n this.setState({ isServiceItem: true });\r\n }\r\n await this._updateQuantitiesInState(product);\r\n let images = await this.getImagesForProduct(product, product);\r\n images = this._filterMasterImageFromVariant(images);\r\n this.setState({\r\n mediaGalleryItems: [...images],\r\n activeIndex: 0,\r\n lastUpdate: currentTime\r\n });\r\n // update product delivery options on product on quickview popUp load\r\n const newDeliveryOptions = await getDeliveryOptionsAsync(\r\n {\r\n callerContext: this.props.context.actionContext,\r\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(\r\n this.props.context.actionContext\r\n )\r\n },\r\n [this.props.selectedProductId]\r\n );\r\n if (newDeliveryOptions && newDeliveryOptions.length > 0) {\r\n this.setState({ productDeliveryOptions: newDeliveryOptions[0] });\r\n }\r\n }\r\n this.setState({ isDataLoaded: true });\r\n }\r\n }\r\n };\r\n\r\n private getImagesForProduct = async (product: ISelectedProduct, variantProduct: ISelectedProduct): Promise => {\r\n let images: IImageData[];\r\n if (this.props.context.app?.config?.OmniChannelMedia) {\r\n images = await getProductImages(\r\n product.RecordId,\r\n this.shouldUseCmsAltText(),\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n product.Name,\r\n product.productVariant ?? variantProduct\r\n );\r\n } else {\r\n images = await getValidProductImages(\r\n product.RecordId || 0,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n product.productVariant ?? variantProduct\r\n );\r\n }\r\n return images;\r\n };\r\n\r\n private readonly _quickViewCloseButtonclick = () => {\r\n this._hideQuickViewDialog();\r\n };\r\n\r\n private _hideQuickViewDialog(): void {\r\n this.dimensions = [];\r\n this.setState({\r\n modalOpen: false,\r\n quantity: 1,\r\n min: undefined,\r\n max: undefined,\r\n errorState: {\r\n configureErrors: {}\r\n },\r\n selectedProduct: undefined,\r\n productPrice: undefined,\r\n productDeliveryOptions: undefined,\r\n isUpdatingDimension: false,\r\n productAvailableQuantity: undefined,\r\n lastUpdate: undefined,\r\n activeIndex: undefined,\r\n animating: undefined,\r\n mediaGalleryItems: [],\r\n isDataLoaded: false,\r\n addedToCart: false\r\n });\r\n }\r\n\r\n private _addItemQuickViewDialog(): void {\r\n this.setState({\r\n addedToCart: true\r\n });\r\n }\r\n\r\n /**\r\n * Quantity Change Handler.\r\n * @param callbacks -Buybox callbacks.\r\n * @returns Update quantity.\r\n */\r\n private readonly onChangeHandler = (callbacks: IBuyboxCallbacks) => (newValue: number): boolean => {\r\n if (callbacks.updateQuantity) {\r\n return callbacks.updateQuantity(newValue);\r\n }\r\n return true;\r\n };\r\n\r\n private readonly _renderQuantity = (\r\n props: IQuickviewExtentedProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks\r\n ): IBuyboxProductQuantityViewProps => {\r\n const { resources } = props;\r\n\r\n const {\r\n quantity,\r\n max,\r\n errorState: { quantityError }\r\n } = state;\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-quickView__quantity'\r\n },\r\n LabelContainerProps: {\r\n tag: 'label',\r\n className: 'ms-quickView__product-quantity-label',\r\n htmlFor: 'ms-quickView__product-quantity-input'\r\n },\r\n heading:
{resources.productQuantityHeading}
,\r\n errors: quantityError && (\r\n \r\n \r\n ),\r\n input: (\r\n \r\n )\r\n };\r\n };\r\n\r\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\nexport default Quickview;\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\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { getCartStateData, GetCartStateDataInput } from '@msdyn365-commerce/global-state';\r\nimport { ProductDimension } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getDimensionsForSelectedVariant,\r\n GetDimensionsForSelectedVariantInput,\r\n getPriceForSelectedVariant,\r\n getProductAvailabilitiesForSelectedVariant,\r\n getRatingsSummary,\r\n GetRatingsSummaryInput,\r\n getRnrEndpointId,\r\n getRnrPartnerId,\r\n getSelectedVariant,\r\n PriceForSelectedVariantInput,\r\n ProductAvailabilitiesForSelectedVariantInput,\r\n SelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { IProductDetails } from '@msdyn365-commerce-modules/buybox';\r\n\r\n/**\r\n * Calls the Retail API and returns the product details.\r\n * @param productId\r\n * @param channelId\r\n * @param ctx\r\n * @param selectedDimensions - Dimensions previously selected for the product variant.\r\n */\r\nexport async function getProductDetails(\r\n productId: number,\r\n channelId: number,\r\n ctx: IActionContext,\r\n selectedDimensions?: ProductDimension[]\r\n): Promise {\r\n const productDetails: IProductDetails = {};\r\n\r\n if (productId > 0 && channelId > 0) {\r\n const tenantId = getRnrPartnerId(ctx);\r\n const serviceEndPoint = getRnrEndpointId(ctx);\r\n\r\n // Get Product Details\r\n await getSelectedVariant(new SelectedVariantInput(productId, channelId, selectedDimensions, 'get', ctx.requestContext), ctx)\r\n .then(async productResult => {\r\n if (productResult) {\r\n productDetails.product = productResult;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n\r\n // Get Product Availability\r\n await getProductAvailabilitiesForSelectedVariant(new ProductAvailabilitiesForSelectedVariantInput(productId, channelId), ctx)\r\n .then(productAvailabilities => {\r\n if (productAvailabilities) {\r\n productDetails.productAvailableQuantity = productAvailabilities;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n\r\n // Get Product Price\r\n await getPriceForSelectedVariant(new PriceForSelectedVariantInput(productId, channelId, undefined), ctx)\r\n .then(productPrice => {\r\n if (productPrice) {\r\n productDetails.productPrice = productPrice;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n\r\n // Get product dimensions\r\n await getDimensionsForSelectedVariant(\r\n new GetDimensionsForSelectedVariantInput(productId, channelId, selectedDimensions, ctx.requestContext),\r\n ctx\r\n )\r\n .then(productDimensions => {\r\n if (productDimensions) {\r\n productDetails.productDimensions = productDimensions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n\r\n // Get Cart State\r\n await getCartStateData(new GetCartStateDataInput(ctx.requestContext.apiSettings, ctx.requestContext), ctx)\r\n .then(cartState => {\r\n productDetails.cart = cartState;\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n\r\n // Get Product Ratings\r\n if (tenantId && serviceEndPoint) {\r\n await getRatingsSummary(new GetRatingsSummaryInput(productId.toString(), tenantId, serviceEndPoint), ctx)\r\n .then(ratingsSummaryData => {\r\n if (ratingsSummaryData) {\r\n productDetails.ratingsSummary = ratingsSummaryData;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n }\r\n }\r\n\r\n return productDetails;\r\n}\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\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxAddToWishlistViewProps,\r\n IBuyboxKeyInPriceViewProps,\r\n IBuyboxProductConfigureDropdownViewProps,\r\n IBuyboxProductConfigureViewProps,\r\n IBuyboxProductQuantityViewProps,\r\n} from '@msdyn365-commerce-modules/buybox';\r\n\r\n//----------------------------------------------------------\r\n// @CUSTOM: Imports for customizations\r\n//----------------------------------------------------------\r\nimport { clsHelper } from '../../utilities/class-name-helper';\r\nimport { labelResources, attrNames } from '../../utilities/global-constants';\r\nimport { convertProductAttributes, convertCustomerAttributes, AttributesWithMetadata } from '../../utilities/data-attribute-parser';\r\n\r\nimport { getCatalogId, RichTextComponent } from '@msdyn365-commerce/core';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\nimport { IQuickviewViewProps } from './quickview';\r\nimport { IQuickviewProps } from './quickview.props.autogenerated';\r\nimport { AddToCartComponent } from '@msdyn365-commerce/components';\r\n//----------------------------------------------------------\r\n\r\n//----------------------------------------------------------\r\n// @CUSTOM: Class name utility for customizations that\r\n// want to use the same base class\r\n//----------------------------------------------------------\r\nconst BASE_CLASS = 'ms-quickView';\r\nconst cls = (fragment?: string) => clsHelper(BASE_CLASS, fragment);\r\n//----------------------------------------------------------\r\n\r\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n const buttonProps = React.isValidElement(addToCart.button) && addToCart.button.props;\r\n\r\n return (\r\n \r\n {errorBlock}\r\n {button && }\r\n \r\n );\r\n};\r\n\r\nconst _renderAddToWishlist = (addToWishlist: IBuyboxAddToWishlistViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToWishlist;\r\n\r\n return (\r\n \r\n {errorBlock}\r\n {button}\r\n \r\n );\r\n};\r\n\r\nconst _renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\r\n\r\n return (\r\n \r\n \r\n {heading}\r\n {errors}\r\n \r\n {select}\r\n \r\n );\r\n};\r\n\r\nconst _renderQuickViewPopup = (props: IQuickviewViewProps & IQuickviewProps<{}>): JSX.Element => { // @CUSTOM: Added extended definition props\r\n const {\r\n ModalContainer,\r\n ModalHeaderContainer,\r\n ModalFooterContainer,\r\n ModalHeaderContent,\r\n ModalBodyContainer,\r\n // @CUSTOM: Moved below nodes to the body\r\n // addToWishlist,\r\n // addToCart,\r\n // cartContainerProps\r\n } = props;\r\n\r\n return (\r\n \r\n {ModalHeaderContent}\r\n \r\n {_renderBodyContent(props)}\r\n \r\n \r\n {/* @CUSTOM: Moved the below TSX to the body */}\r\n {/* \r\n {addToCart && _renderAddToCart(addToCart)}\r\n {addToWishlist && _renderAddToWishlist(addToWishlist)}\r\n */}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps, quantityLimitsMessages: React.ReactNode): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\r\n\r\n return (\r\n \r\n \r\n {heading}\r\n {errors}\r\n \r\n {input}\r\n {quantityLimitsMessages}\r\n \r\n );\r\n};\r\n\r\nconst _renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\r\n\r\n return (\r\n \r\n {heading}\r\n {input}\r\n \r\n );\r\n};\r\n\r\nconst _renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\r\n const { ContainerProps, dropdowns } = configure;\r\n\r\n return {dropdowns.map(_renderConfigureDropdown)};\r\n};\r\n\r\nconst _renderBodyContent = (props: IQuickviewViewProps & IQuickviewProps<{}>): JSX.Element => { // @CUSTOM: Added extended definition props\r\n const {\r\n title,\r\n price,\r\n rating,\r\n keyInPrice,\r\n quantity,\r\n configure,\r\n inventoryLabel,\r\n quantityLimitsMessages,\r\n seeDetailsbutton,\r\n loading,\r\n ProductInfoContainerProps,\r\n MediaGalleryContainerProps,\r\n CarouselProps,\r\n unitOfMeasure,\r\n // @CUSTOM: Added the nodes below from the footer\r\n addToWishlist,\r\n addToCart,\r\n cartContainerProps,\r\n\r\n } = props;\r\n if (loading) {\r\n return <>{loading};\r\n }\r\n //------------------------------------------------------\r\n // @CUSTOM: Getting product item ID for SKU display\r\n //------------------------------------------------------\r\n const product = props.productDetails?.product;\r\n const itemId = product?.ItemId;\r\n const skuDisplay = itemId && (\r\n
\r\n {labelResources.sku}\r\n {itemId}\r\n
\r\n );\r\n //------------------------------------------------------\r\n\r\n //------------------------------------------------------\r\n // @CUSTOM: Getting product attributes for product\r\n // description display, uses itemId from above\r\n //------------------------------------------------------\r\n const [productAttr, productAttrLoaded] = React.useState({} as AttributesWithMetadata);\r\n itemId && React.useEffect(() => {\r\n const productAttributesInput = {\r\n ItemIds: [{ ItemId: itemId }],\r\n IncludeProductsFromDescendantCategories: false,\r\n SkipVariantExpansion: true,\r\n IncludeAttributes: true,\r\n Context: {\r\n ChannelId: props.context.request.apiSettings.channelId,\r\n CatalogId: getCatalogId(props.context.request)\r\n },\r\n };\r\n\r\n searchByCriteriaAsync({ callerContext: props.context.actionContext }, productAttributesInput).then((products) => {\r\n if (products.length) {\r\n const productSpecificationData = products[0].AttributeValues;\r\n const productAttributes = productSpecificationData && convertProductAttributes(productSpecificationData) || {};\r\n productAttrLoaded(productAttributes);\r\n }\r\n });\r\n }, []);\r\n\r\n const description = props.config.descriptionOverride && productAttr[props.config.descriptionOverride] || product?.Description;\r\n const descriptionDisplay = description &&

{description}

;\r\n //------------------------------------------------------\r\n\r\n\r\n //------------------------------------------------------\r\n // @CUSTOM: Getting license data for blocking\r\n // duplicate purchase of license\r\n //------------------------------------------------------\r\n const customerData = props.data?.customerInformation?.result?.Attributes;\r\n const customerAttributes = customerData && convertCustomerAttributes(customerData);\r\n\r\n const isLicense = productAttr && (productAttr[attrNames.productType] === attrNames.troveAnnualLicense);\r\n const licenseParticipant = customerAttributes && customerAttributes[attrNames.troveParticipant];\r\n\r\n const licenseDuplicate = (isLicense && licenseParticipant);\r\n //------------------------------------------------------\r\n\r\n // @CUSTOM: signed out addtocart replacement\r\n const isSignedIn = props.context.request.user.isAuthenticated;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {title}\r\n {/* @CUSTOM: Description Display */}\r\n {descriptionDisplay}\r\n {/* @CUSTOM: SKU Display */}\r\n {skuDisplay}\r\n {/* @CUSTOM: Moved seeDetailsbutton from above inventoryLabel */}\r\n {seeDetailsbutton}\r\n {price}\r\n {unitOfMeasure}\r\n {rating}\r\n {configure && _renderConfigure(configure)}\r\n {keyInPrice && _renderKeyInPrice(keyInPrice)}\r\n {inventoryLabel}\r\n\r\n {/* @CUSTOM: Duplicate license warning */}\r\n {licenseDuplicate && (\r\n
\r\n \r\n
\r\n )}\r\n\r\n {/* @CUSTOM: Signed out addtocart replacement message */}\r\n {!licenseDuplicate && !isSignedIn && (\r\n
\r\n \r\n
\r\n )}\r\n\r\n {/* @CUSTOM: add to cart success message */}\r\n {props.addedToCart && (\r\n
\r\n \r\n
\r\n )}\r\n\r\n {/* @CUSTOM: Added the node below from the footer, and added the quantity that used to be below keyInPrice inside the node below */}\r\n \r\n {!licenseDuplicate && isSignedIn &&
\r\n {quantity && _renderQuantity(quantity, quantityLimitsMessages)}\r\n {addToCart && _renderAddToCart(addToCart)}\r\n {addToWishlist && _renderAddToWishlist(addToWishlist)}\r\n
}\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Functional component which renders quick view button and popup based by the given props file.\r\n * @param {IQuickviewViewProps} props - Configuration for the quick view component.\r\n * @returns {React.FC} - Functional component of the quick view.\r\n */\r\nexport const QuickViewFunctionalComponent: React.FC> = (props: IQuickviewViewProps & IQuickviewProps<{}>) => { // @CUSTOM: Added extended definition props\r\n const { quickView, quickViewButton, isModalOpen, isMobileDevice } = props;\r\n return (\r\n \r\n {!isMobileDevice && quickViewButton}\r\n {isModalOpen && _renderQuickViewPopup(props)}\r\n \r\n );\r\n};\r\n\r\nexport default QuickViewFunctionalComponent;","//==============================================================================\r\n// Class Name Helper\r\n//\r\n// Tool to standardize CSS class naming in module components and elements\r\n//==============================================================================\r\n\r\nexport function clsHelper(baseClass: string, fragment?: string, separator: string = '__'): string | undefined {\r\n return fragment ? `${baseClass}${separator}${fragment}` : undefined;\r\n}\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['quickview'] = {\n c: () => require('partner/modules/quickview/quickview.tsx'),\n $type: 'containerModule',\n da: [{name:'customerInformation', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer', runOn: 0},{name:'featureState', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state', runOn: 0},{name:'wishlists', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'quickview',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/quickview'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id');\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|quickview|quickview'] = {\n c: () => require('partner/modules/quickview/quickview.view.tsx'),\n cn: '__local__-__local__-quickview'\n };\nviewDictionary['@msdyn365-commerce-modules|buybox|modules|quickview|quickview'] = {\n c: () => require('@msdyn365-commerce-modules/buybox/dist/lib/modules/quickview/quickview.view.js'),\n cn: '@msdyn365-commerce-modules-buybox-quickview'\n };\nviewDictionary['@msdyn365-commerce-theme|adventureworks-theme-kit|modules|adventureworks|views|quickview'] = {\n c: () => require('@msdyn365-commerce-theme/adventureworks-theme-kit/dist/lib/modules/adventureworks/views/quickview.view.js'),\n cn: '@msdyn365-commerce-theme-adventureworks-theme-kit-quickview'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToWishlistComponent, IWishlistActionErrorResult } from '@msdyn365-commerce/components';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n getConfigureErrors,\n IBuyboxAddToCartViewProps,\n IBuyboxCallbacks,\n IBuyboxCommonResources,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureDropdownViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxState,\n IQuickviewViewProps\n} from '@msdyn365-commerce-modules/buybox';\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickviewProps as IQuickviewPropsExtend } from '../definition-extensions/quickview.ext.props.autogenerated';\n\n/**\n * RenderAddToCart.\n * @param addToCart - AddToCart.\n * @returns -- Returns.\n */\nconst renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\n const { ContainerProps, errorBlock, button } = addToCart;\n\n return (\n \n {errorBlock}\n {button}\n \n );\n};\n\n/**\n * Add to wishlist failed function.\n * @param callbacks -Buybox callbacks.\n * @param resources -Buybox resources.\n * @param product -Simple product.\n * @returns Update error state.\n */\nconst onAddToWishlistFailed = (\n callbacks: IBuyboxCallbacks | undefined,\n resources: IBuyboxCommonResources,\n product: SimpleProduct | undefined\n) => (result: IWishlistActionErrorResult) => {\n callbacks?.updateErrorState({\n errorHost: 'WISHLIST',\n configureErrors:\n result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\n });\n};\n\n/**\n * RenderAddToWishlist.\n * @param props - Buybox viewprops.\n * @param state - Buybox state.\n * @param callbacks - Buybox callbacks.\n * @param product - Product data.\n * @returns -- Returns.\n */\nconst renderAddtoWishlistButton = (\n props: IQuickviewViewProps,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks | undefined,\n product: SimpleProduct\n): React.ReactNode => {\n const { context, resources } = props;\n const wishlists = props.data.wishlists.result;\n const isShowWishlitButtonText = true;\n return (\n \n );\n};\n\n/**\n * RenderAddToWishlist.\n * @param props - Buybox viewprops.\n * @param state - Buybox state.\n * @param callbacks - Buybox callbacks.\n * @returns -- Returns.\n */\nconst renderAddToWishlist = (\n props: IQuickviewViewProps,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks | undefined\n): JSX.Element | null => {\n const product = props.productDetails?.product;\n if (!props.addToWishlist || !product) {\n return null;\n }\n\n const wishlistButton = renderAddtoWishlistButton(props, state, callbacks, product);\n return (\n \n {props.addToWishlist.errorBlock}\n {wishlistButton}\n \n );\n};\n\n/**\n * RenderQuantity.\n * @param quantity - Quantity.\n * @param quantityLimitsMessages - QuantityLimitsMessages.\n * @param props - Props.\n * @returns -- Returns.\n */\nconst renderQuantity = (\n quantity: IBuyboxProductQuantityViewProps,\n quantityLimitsMessages: React.ReactNode,\n props: IQuickviewViewProps\n): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\n const { unitOfMeasure } = props;\n\n return (\n \n {heading}\n {input}\n {unitOfMeasure}\n {quantityLimitsMessages}\n {errors}\n \n );\n};\n\n/**\n * KenderKeyInPrice.\n * @param keyInPrice - KeyInPrice.\n * @returns -- Returns.\n */\nconst renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\n\n return (\n \n {heading}\n {input}\n \n );\n};\n\n/**\n * RenderConfigureDropdown.\n * @param dropdown - Buybox product configure dropdown view props.\n * @returns -- Returns JSX.Element.\n */\nconst renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\n\n return (\n \n {heading}\n {select}\n {errors}\n \n );\n};\n\n/**\n * RenderConfigure.\n * @param configure - Buybox product configure view props.\n * @returns -- Returns JSX.Element.\n */\nconst renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\n const { ContainerProps, dropdowns } = configure;\n\n return {dropdowns.map(renderConfigureDropdown)};\n};\n\n/**\n * RenderBodyContent.\n * @param props - Props.\n * @returns -- Returns.\n */\nconst renderBodyContent = (props: IQuickviewViewProps & IQuickviewPropsExtend<{}>): JSX.Element => {\n const {\n price,\n keyInPrice,\n quantity,\n inventoryLabel,\n quantityLimitsMessages,\n loading,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\n ProductInfoContainerProps,\n MediaGalleryContainerProps,\n CarouselProps,\n addToWishlist,\n configure,\n callbacks,\n state\n } = props;\n if (loading) {\n return <>{loading};\n }\n\n return (\n <>\n \n \n \n \n \n \n {props.resources.priceText}\n {price}\n \n {addToWishlist && renderAddToWishlist(props, state, callbacks)}\n \n {configure && renderConfigure(configure)}\n {keyInPrice && renderKeyInPrice(keyInPrice)}\n {quantity && renderQuantity(quantity, quantityLimitsMessages, props)}\n {inventoryLabel}\n \n \n );\n};\n\n/**\n * RenderQuickViewPopup.\n * @param props - Props.\n * @returns -- Returns.\n */\nconst renderQuickViewPopup = (props: IQuickviewViewProps & IQuickviewPropsExtend<{}>): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\n const {\n ModalContainer,\n ModalHeaderContainer,\n ModalFooterContainer,\n ModalHeaderContent,\n ModalBodyContainer,\n addToCart,\n cartContainerProps,\n seeDetailsbutton\n } = props;\n\n return (\n \n \n {ModalHeaderContent}\n \n {props.title}\n {!props.loading && !StringExtensions.isNullOrEmpty(props.state.productPrice?.ItemId) ? (\n \n {props.resources.skuText}\n {props.state.productPrice?.ItemId}\n \n ) : (\n ''\n )}\n {props.rating}\n \n \n {renderBodyContent(props)}\n \n \n {addToCart && seeDetailsbutton}\n {addToCart && renderAddToCart(addToCart)}\n \n \n \n );\n};\n\n/**\n * Functional component which renders quick view button and popup based by the given props file.\n * @param props - Configuration for the quick view component.\n * @returns - Functional component of the quick view.\n */\nexport const QuickViewFunctionalComponent: React.FC> = (\n props: IQuickviewViewProps & IQuickviewPropsExtend<{}>\n) => {\n const { quickView, quickViewButton, isModalOpen } = props;\n const quickViewUpdatedProps: IModuleProps = { ...quickView, title: props.resources.quickViewbuttonText };\n return (\n \n {quickViewButton}\n {isModalOpen && renderQuickViewPopup(props)}\n \n );\n};\n\nexport default QuickViewFunctionalComponent;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["getAltText","context","shouldUseCmsAltText","productName","imageAltText","_context$app","app","config","OmniChannelMedia","async","getValidProductImages","productId","channelId","actionContext","imageSettings","selectedProduct","catalogId","getCatalogId","requestContext","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","then","mediaLocations","Promise","all","map","mediaLocation","imageData","src","Uri","altText","AltText","resolve","http","XMLHttpRequest","open","addEventListener","status","send","_unused","validateMediaLocaionAsync","pairs","filter","pair","catch","error","telemetry","exception","debug","Quickview","React","constructor","props","super","dimensionUpdateQueue","FinitePromiseQueue","dimensions","quickViewCallbacks","updateQuantity","newQuantity","errorState","_objectSpread","this","state","quantityError","undefined","otherError","setState","quantity","updateErrorState","newErrorState","updateSelectedProduct","newSelectedProduct","newInventory","newPrice","newDeliveryOptions","productAvailableQuantity","productDeliveryOptions","_updatePrice","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","resources","_getDropdownName","changeModalOpen","isModalOpen","_addItemQuickViewDialog","changeUpdatingDimension","isUpdatingDimension","updateKeyInPrice","customPrice","customAmountError","isPriceKeyedIn","keyInPriceAmount","productPrice","defaultGalleryImageSettings","viewports","xs","q","w","h","sm","md","lg","lazyload","cropFocalRegion","defaultThumbnailImageSettings","_renderSeeDetailButton","product","payLoad","getPayloadObject","telemetryContent","TelemetryConstant","seeDetails","attributes","getTelemetryAttributes","Button","Object","assign","className","onClick","onTelemetryClick","seeDetailsLinkText","href","_getProductURL","_renderCarousel","_this$state$activeInd","mediaGalleryItems","keys","galleryImageSettings","ArrayExtensions","hasElements","item","index","_renderCarouselItemImageView","_renderEmptyImage","tag","Carousel","items","activeIndex","next","previous","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","indicatorAriaText","ariaLabelForSlide","onIndicatorsClickHandler","goToIndex","handleOnExited","onExited","handleOnExiting","onExiting","key","_renderThumbnails","id","thumbnailImageSettings","_getThumbnailItem","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","useTabList","JSON","stringify","request","apiSettings","productDimensions","productDetails","dimensionsToUpdate","clearErrorState","errorHost","configureErrors","mappedDimensions","dimension","DimensionTypeValue","DimensionValue","_updateDimensionValue","ExtensionProperties","newProduct","getSelectedVariant","SelectedVariantInput","MasterProductId","RecordId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","_variantProduct$Dimen","_this$props$data$feat","images","getImagesForProduct","_filterMasterImageFromVariant","lastUpdate","Date","now","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","Dimensions","find","_dimension$DimensionV","Value","toLowerCase","isCustomPriceSelected","length","getPriceForSelectedVariant","PriceForSelectedVariantInput","RetailMulitplePickupMFeatureState","data","featureState","result","Name","getDeliveryOptionsForSelectedVariant","GetDeliveryOptionsForSelectedVariantInput","IsEnabled","_updateQuantitiesInState","altTextSource","productDimensionFull","newValueId","DimensionValues","_this$productDetails","isGiftCard","IsGiftCard","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeSize","productDimensionTypeAmount","productDimensionTypeStyle","animating","isLastItem","nextIndex","isFirstItem","_getCarouselItem","image","Image","gridSettings","loadFailureBehavior","role","modifiedActiveIndex","ThumbnailItemContainerProps","classnames","tabIndex","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","event","which","KeyCodes","Enter","Space","preventDefault","onClickHandler","_onClick","_event","ObjectExtensions","isNullOrUndefined","selectedProductId","modalOpen","selectedDimensions","ctx","tenantId","getRnrPartnerId","serviceEndPoint","getRnrEndpointId","productResult","productAvailabilities","getCartStateData","GetCartStateDataInput","cartState","cart","getRatingsSummary","GetRatingsSummaryInput","toString","ratingsSummaryData","ratingsSummary","getProductDetails","currentTime","_updateMediaItems","maxRecentlyViewedItemsCount","RecentlyViewedState","instance","ItemTypeValue","ReleasedProductType","Service","isServiceItem","getDeliveryOptionsAsync","callerContext","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","isDataLoaded","_this$props$context$a","_product$productVaria","_this$props$config$th","_product$productVaria2","_actionContext$reques","params","isPreview","response","commerceApiRequest","previewImageData","_mediaLocation$Uri","additionalProperties","IsApplicableForChildEntities","isApplicableForChildEntities","_mediaLocation$Uri2","getProductImages","productVariant","_quickViewCloseButtonclick","_hideQuickViewDialog","onChangeHandler","callbacks","newValue","_renderQuantity","max","ContainerProps","LabelContainerProps","htmlFor","heading","productQuantityHeading","errors","input","IncrementalQuantity","currentCount","onChange","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","minQuantityText","maxQuantityText","disabled","addToCartBehavior","min","addedToCart","bind","getTelemetryObject","telemetryPageName","friendlyName","shouldComponentUpdate","nextProps","nextState","render","_this$productDetails2","_this$productDetails3","isMobileDevice","isMobile","variant","VariantType","Viewport","viewprops","quickView","moduleProps","quickViewButton","quickViewbuttonText","ModalContainer","Modal","isOpen","format","quickViewAriaLabel","toggle","modalTransition","timeout","shouldUpdateFocusToFirstElement","ModalHeaderContainer","ModalHeader","ModalFooterContainer","ModalFooter","ModalHeaderContent","ModalBodyContainer","ModalBody","cartContainerProps","ProductInfoContainerProps","MediaGalleryContainerProps","seeDetailsbutton","loading","Spinner","label","loadingText","size","SpinnerSize","large","title","getBuyboxProductTitle","description","getBuyboxProductDescription","configure","getBuyboxProductConfigure","price","getBuyboxProductPrice","unitOfMeasure","getBuyboxProductUnitOfMeasure","rating","hideRating","getBuyboxProductRating","addToCart","getBuyboxAddToCart","keyInPrice","enableKeyInPrice","getBuyboxKeyInPrice","inventoryLabel","getBuyBoxInventoryLabel","addToWishlist","getBuyboxProductAddToWishlist","quantityLimitsMessages","getQuantityLimitsMessages","CarouselProps","Thumbnails","renderView","lastUpdatedTime","_this$productDetails4","PrimaryImageUrl","_mapProductToImageData","arguments","CustomerContextualPrice","_product$Dimensions","msdyn365Commerce","isBrowser","productUrl","getProductPageUrlSync","fullUrl","URL","window","location","_dimension$DimensionV2","dimensionValue","StringExtensions","isNullOrWhitespace","dimensionName","convertProductDimensionTypeToDimensionTypes","searchParams","set","isOrderQuantityLimitsFeatureEnabled","_isOrderQuantityLimitsFeatureEnabled","isChannelLimitsFeatureEnabled","_isChannelLimitsFeatureEnabled","_getMinQuantityForCartLineItem","_getMaxQuantityForCartLineItem","_product$Behavior","Behavior","MinimumQuantity","isQuantityLimitsFeatureEnabled","_product$Behavior2","MaximumQuantity","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","_this$props$config$sh","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","itemId","ItemId","_item$additionalPrope","_this$props$context$r","_featureStatuses$find","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","RetailDefaultOrderQuantityLimitsFeatureName","customerInfo","customerInformation","information","IsB2b","_featureStatuses$find2","featureStatuses","isChannelLimitsFeatureEnabledInHq","EcommerceQuantityLimitConfigurationsFeatureName","cls","fragment","clsHelper","_renderConfigureDropdown","dropdown","select","Node","_renderBodyContent","_props$productDetails","_props$data","skuDisplay","labelResources","sku","productAttr","productAttrLoaded","productAttributesInput","ItemIds","IncludeProductsFromDescendantCategories","SkipVariantExpansion","IncludeAttributes","Context","ChannelId","CatalogId","searchByCriteriaAsync","products","productSpecificationData","AttributeValues","productAttributes","convertProductAttributes","descriptionOverride","Description","descriptionDisplay","customerData","Attributes","customerAttributes","convertCustomerAttributes","isLicense","attrNames","productType","troveAnnualLicense","licenseParticipant","troveParticipant","licenseDuplicate","isSignedIn","user","isAuthenticated","dropdowns","_renderConfigure","_renderKeyInPrice","RichTextComponent","text","signedOutMessage","addedToCartMessage","errorBlock","button","buttonProps","AddToCartComponent","_renderAddToCart","_renderAddToWishlist","QuickViewFunctionalComponent","Module","_renderQuickViewPopup","baseClass","separator","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","onAddToWishlistFailed","getConfigureErrors","missingDimensions","renderAddToWishlist","wishlistButton","renderAddtoWishlistButton","wishlists","AddToWishlistComponent","addToWishlistButtonText","removeFromWishlistButtonText","addToWishlistMessage","removedFromWishlistMessage","addItemToWishlistError","removeItemFromWishlistError","nameOfWishlist","typeName","onError","getSelectedProduct","showButtonText","showButtonTooltip","renderConfigureDropdown","renderBodyContent","priceText","renderConfigure","renderKeyInPrice","renderQuantity","renderQuickViewPopup","_props$state$productP","_props$state$productP2","isNullOrEmpty","skuText","renderAddToCart","quickViewUpdatedProps","module","exports","ReactDOM"],"sourceRoot":""}