{"version":3,"file":"static/js/02d1a9eec12da67e0108.bundle.js","mappings":"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","sources":["webpack://sgi-bookstore/./src/modules/sgi-new-arrival/get-all-refiners-for-collection.ts?e0d9","webpack://sgi-bookstore/./src/modules/sgi-new-arrival/sgi-new-arrival.props.autogenerated.ts?618a","webpack://sgi-bookstore/./src/modules/sgi-new-arrival/sgi-new-arrival.tsx?5e4a","webpack://sgi-bookstore/./src/modules/sgi-new-arrival/sgi-new-arrival.view.tsx?ae4f","webpack://sgi-bookstore/./src/themes/sgi-theme/views/Utilities/utility.ts?1838","webpack://sgi-bookstore/./src/themes/sgi-theme/views/components/product.component.tsx?f1a3","webpack://sgi-bookstore/./lib/sgi-new-arrival/module-registration.js?066a","webpack://sgi-bookstore/external var \"React\"?0d3b","webpack://sgi-bookstore/external var \"ReactDOM\"?853b"],"sourcesContent":["import { IQueryResultSettings, ProductRefiner } from '@msdyn365-commerce/retail-proxy';\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\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, ICreateActionContext } from '@msdyn365-commerce/core';\r\n\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\n/**\r\n * Refiners-by-Collection Input action.\r\n */\r\nexport class AllRefinersInput implements IActionInput {\r\n public getCacheKey = () => `ProductRefiner`;\r\n\r\n public getCacheObjectType = () => 'ProductRefiner';\r\n\r\n public dataCacheType = (): Msdyn365.CacheType => 'application';\r\n}\r\n\r\n/**\r\n * Create input method which creates an ActionInput for fetching list page refiners.\r\n * @param args\r\n */\r\nconst createInput = (args: ICreateActionContext): IActionInput => {\r\n return new AllRefinersInput();\r\n};\r\n\r\n/**\r\n * Action method which fetches refiners for the given list page.\r\n * @param input\r\n * @param ctx\r\n */\r\nasync function getAllRefinersAction(input: AllRefinersInput, ctx: IActionContext): Promise {\r\n const queryResultSettings: IQueryResultSettings = {\r\n count: true,\r\n Sorting: {\r\n Columns: [\r\n {\r\n ColumnName: 'name',\r\n IsDescending: true\r\n }\r\n ]\r\n }\r\n };\r\n const searchCriteria = {\r\n SearchCondition: '*',\r\n Context: {\r\n ChannelId: ctx.requestContext.apiSettings.channelId,\r\n CatalogId: ctx.requestContext.apiSettings.catalogId\r\n }\r\n };\r\n return getProductSearchRefinersAsync({ callerContext: ctx, queryResultSettings }, searchCriteria).then(\r\n (productRefiners: ProductRefiner[]) => {\r\n if (!productRefiners) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no refiners');\r\n return [];\r\n }\r\n\r\n const result = (productRefiners || []).map((productRefiner: ProductRefiner) => productRefiner);\r\n\r\n if (result.length === 0) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no IProductRefinerHierarchy objects');\r\n return [];\r\n }\r\n\r\n return result;\r\n }\r\n );\r\n}\r\n\r\nexport const actionDataAction = createObservableDataAction({\r\n id: 'get-all-refiners-for-collection',\r\n action: >getAllRefinersAction,\r\n input: createInput\r\n});\r\n\r\nexport default actionDataAction;\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * ISgiNewArrival containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum layout {\r\n carousel = 'carousel',\r\n grid = 'grid'\r\n}\r\n\r\nexport interface ISgiNewArrivalConfig extends Msdyn365.IModuleConfig {\r\n heading?: IHeadingData;\r\n layout?: layout;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n clientRender?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n className?: string;\r\n newArrivalAttrKeyName?: string;\r\n newArrivalDateAttrKeyName?: string;\r\n newArrivalRefinerName?: string;\r\n newArrivalRefinerLVSValue?: string;\r\n}\r\n\r\nexport interface ISgiNewArrivalResources {\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingCountAriaLabel: string;\r\n ratingCountAriaLabelSingleUser: string;\r\n}\r\n\r\nexport const enum HeadingTag {\r\n h1 = 'h1',\r\n h2 = 'h2',\r\n h3 = 'h3',\r\n h4 = 'h4',\r\n h5 = 'h5',\r\n h6 = 'h6'\r\n}\r\n\r\nexport interface IHeadingData {\r\n text: string;\r\n tag?: HeadingTag;\r\n}\r\n\r\nexport interface ISgiNewArrivalProps extends Msdyn365.IModule {\r\n resources: ISgiNewArrivalResources;\r\n config: ISgiNewArrivalConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\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\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n getPriceForProductSearchResult,\r\n IDimensionsApp,\r\n ObjectExtensions,\r\n PriceForProductSearchResultInput,\r\n generateImageUrl\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n IComponentNodeProps,\r\n IModuleProps,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n ITelemetryContent,\r\n NodeTag,\r\n SingleSlideCarousel\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ISgiNewArrivalData } from './sgi-new-arrival.data';\r\nimport { ISgiNewArrivalProps, layout } from './sgi-new-arrival.props.autogenerated';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { getAttributeByKeyName } from '../../themes/sgi-theme/views/Utilities/utility';\r\nimport ProductComponent from '../../themes/sgi-theme/views/components/product.component';\r\n\r\nexport interface IProductCollectionViewProps extends ISgiNewArrivalProps {\r\n heading?: React.ReactNode;\r\n ProductCollectionContainer: IModuleProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n GridComponentProps: INodeProps;\r\n products: IProductComponentViewProps[];\r\n isCarousel: boolean;\r\n productPrices?: ProductPrice[];\r\n}\r\n\r\nexport interface IProductComponentViewProps {\r\n ProductContainer: INodeProps;\r\n productComponent: React.ReactNode;\r\n}\r\nexport interface IProductComponentState {\r\n products: ProductSearchResult[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\n/**\r\n * ProductCollection component.\r\n */\r\nclass ProductCollection extends React.PureComponent, IProductComponentState> {\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n constructor(props: ISgiNewArrivalProps) {\r\n super(props);\r\n this.productPrices = [];\r\n this.state = {\r\n products: []\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n\r\n this.getProductBasedOnRefinerAsync()\r\n .then(products => {\r\n if (products) {\r\n const filteredproducts = products.filter(product => {\r\n const isNewArrival = getAttributeByKeyName(product.AttributeValues, this.props.config.newArrivalAttrKeyName)\r\n ?.BooleanValue;\r\n const isNewArrivalDateValid = getAttributeByKeyName(\r\n product?.AttributeValues,\r\n this.props.config.newArrivalDateAttrKeyName\r\n )?.DateTimeOffsetValue;\r\n return isNewArrival && isNewArrivalDateValid && isNewArrivalDateValid >= new Date() && product;\r\n });\r\n if (filteredproducts && filteredproducts.length > 0) {\r\n this.setState({ products: filteredproducts });\r\n }\r\n }\r\n })\r\n .catch(err => console.log('Error [getProductBasedOnRefinerAsync]', err));\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext.user.isAuthenticated) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data loading.\r\n this._getActivePrice();\r\n }\r\n }\r\n\r\n private getProductBasedOnRefinerAsync = async (): Promise => {\r\n const {\r\n config: { newArrivalRefinerName, newArrivalRefinerLVSValue }\r\n } = this.props;\r\n if (newArrivalRefinerName && newArrivalRefinerLVSValue) {\r\n return this.props.data.refiners\r\n .then(refiners => {\r\n const filteredRefiner = refiners\r\n ?.find(refiner => refiner.KeyName?.toLowerCase() === newArrivalRefinerName.toLowerCase())\r\n ?.Values.find(value => value.LeftValueBoundString?.toLowerCase() === newArrivalRefinerLVSValue.toLowerCase());\r\n if (filteredRefiner) {\r\n const productSearchCriteria: ProductSearchCriteria = {\r\n Refinement: [filteredRefiner],\r\n Context: {\r\n ChannelId: +this.props.context.actionContext.requestContext.apiSettings.channelId,\r\n CatalogId: +this.props.context.actionContext.requestContext.apiSettings.catalogId\r\n },\r\n IncludeAttributes: true,\r\n SkipVariantExpansion: true\r\n };\r\n return searchByCriteriaAsync({ callerContext: this.props.context.actionContext }, productSearchCriteria);\r\n }\r\n\r\n return null;\r\n })\r\n .catch(() => null);\r\n }\r\n return null;\r\n };\r\n public render(): JSX.Element | null {\r\n const { heading, className } = this.props.config;\r\n const { resources } = this.props;\r\n\r\n // Initiallize state in case if the products were not found during initial module render\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data if not there.\r\n // this.initProductState(this.props.config.productCollection);\r\n\r\n const products = this.state.products;\r\n const isCarousel = this.props.config.layout === layout.carousel;\r\n const headingLabel = heading ? heading.text : '';\r\n const headingComponent = heading && (\r\n \r\n );\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\r\n const updatedProducts = products?.map((item: ProductSearchResult, index: number) => {\r\n const getProductData = this._getProduct(item, index);\r\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\r\n });\r\n\r\n const productCollectionViewProps = {\r\n ...this.props,\r\n heading: headingComponent,\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: '',\r\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\r\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\r\n parentId: this.props.id,\r\n telemetryContent: this.telemetryContent\r\n } as IComponentNodeProps,\r\n ProductCollectionContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-product-collection', className)\r\n },\r\n GridComponentProps: {\r\n tag: 'ul' as NodeTag,\r\n className: 'ms-product-collection__items'\r\n },\r\n isCarousel,\r\n\r\n products:\r\n ArrayExtensions.hasElements(updatedProducts) &&\r\n updatedProducts.filter(item => {\r\n return item !== undefined;\r\n }),\r\n productPrices: this.productPrices\r\n };\r\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\r\n }\r\n\r\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @param products - Products.\r\n * @returns Promise.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise => {\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n const validProducts = ArrayExtensions.validValues(products);\r\n if (\r\n ArrayExtensions.hasElements(validProducts) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)\r\n ) {\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(validProducts, this.props.context as ICoreContext),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n }\r\n };\r\n\r\n private readonly _getProduct = (product: ProductSearchResult, index: number): IProductComponentViewProps | null => {\r\n if (!product || !product.Name) {\r\n this.props.telemetry.trace('[product-collection] Product or product name is null');\r\n return null;\r\n }\r\n product.PrimaryImageUrl = generateImageUrl(product?.PrimaryImageUrl, this.props.context.request.apiSettings);\r\n const telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const resources = this.props.resources;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const quickviewSlot =\r\n this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\r\n const reviewCount = 1;\r\n const reviewTotalRatings = Number(product.TotalRatings);\r\n const reviewCountAriaLabelValue =\r\n reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\r\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return {\r\n ProductContainer: {\r\n tag: 'li' as NodeTag,\r\n className: 'ms-product-collection__item',\r\n role: 'listitem',\r\n key: index\r\n },\r\n productComponent: (\r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n // eslint-disable-next-line\r\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId)\r\n )}\r\n />\r\n )\r\n };\r\n };\r\n\r\n /**\r\n * Get the active price for products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n const productsList = this.state.products;\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext\r\n );\r\n\r\n await this._getProductsDimensionsAvailabilities(products);\r\n\r\n this.setState({ products });\r\n };\r\n}\r\n\r\nexport default ProductCollection;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './sgi-new-arrival';\r\n\r\nconst ProductCollectionView: React.FC = props => {\r\n const { heading, ProductCollectionContainer, products, SingleSlideCarouselComponentProps, GridComponentProps, isCarousel } = props;\r\n\r\n if (products) {\r\n return (\r\n
\r\n \r\n {heading}\r\n {isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)}\r\n \r\n
\r\n );\r\n }\r\n props.context.telemetry.error('Product collection content is empty, module wont render.');\r\n return null;\r\n};\r\n\r\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\n\r\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\n\r\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\r\n const { ProductContainer, productComponent } = product;\r\n\r\n return {productComponent};\r\n};\r\n\r\nexport default ProductCollectionView;\r\n","import { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport const getAttributeByName = (attributes: AttributeValue[] | undefined, keyName: string | undefined): AttributeValue | undefined => {\r\n return attributes?.find((attr: AttributeValue) => attr.Name?.toLowerCase() === keyName?.toLowerCase());\r\n};\r\nexport const getAttributeByKeyName = (\r\n attributes: AttributeValue[] | undefined,\r\n keyName: string | undefined\r\n): AttributeValue | undefined => {\r\n return attributes?.find((attr: AttributeValue) => attr.KeyName?.toLowerCase() === keyName?.toLowerCase());\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 { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n IPriceComponentResources,\r\n ISwatchItem,\r\n PriceComponent,\r\n ProductComponentSwatchComponent,\r\n RatingComponent\r\n} from '@msdyn365-commerce/components';\r\nimport {\r\n IAny,\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGeneric,\r\n IGridSettings,\r\n IImageData,\r\n IImageSettings,\r\n Image,\r\n msdyn365Commerce\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeSwatch, AttributeValue, ProductDimension, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n convertDimensionTypeToProductDimensionType,\r\n Dictionary,\r\n DimensionTypes,\r\n generateImageUrl,\r\n getProductPageUrlSync,\r\n IDimensionsApp,\r\n StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\nimport { getAttributeByName } from '../Utilities/utility';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n isEnabledProductDescription?: boolean;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n inventoryLabel?: string;\r\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\r\n swatchItemAriaLabel?: string;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\n/**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\nfunction getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(\r\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color\r\n );\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n}\r\n\r\n/**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\nfunction getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productData?.PrimaryImageUrl;\r\n }\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls)\r\n ? generateImageUrl(defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings)\r\n : productData?.PrimaryImageUrl;\r\n}\r\n\r\n/**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n}\r\n\r\n/**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n
\r\n {unitOfMeasure}\r\n
\r\n );\r\n}\r\n\r\n/**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {inventoryAvailabilityLabel}\r\n
\r\n );\r\n}\r\n\r\n/**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\nfunction getProductPageUrlFromDefaultSwatch(\r\n coreContext: ICoreContext,\r\n productUrl: string,\r\n productData?: ProductSearchResult\r\n): string | undefined {\r\n const siteContext = coreContext as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productUrl;\r\n }\r\n\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n}\r\n\r\nconst ProductCard: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n isEnabledProductDescription,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n inventoryLabel,\r\n dimensionAvailabilities,\r\n swatchItemAriaLabel\r\n}) => {\r\n const product = data.product;\r\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\r\n if (allowBack) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n let productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl, setProductPageUrl] = useState(productPageUrlFromSwatch);\r\n const [productImageUrl, setProductImageUrl] = useState(productImageUrlFromSwatch);\r\n React.useEffect(() => {\r\n setProductPageUrl(productPageUrlFromSwatch);\r\n setProductImageUrl(productImageUrlFromSwatch);\r\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\r\n const [selectedSwatchItems] = useState(new Dictionary());\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\r\n const enableStockCheck = context.app.config.enableStockCheck;\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback(\r\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n selectedSwatchItems.setValue(dimensionType, swatchItem);\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\r\n ? swatchItem.productImageUrls[0]\r\n : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n },\r\n [selectedSwatchItems, context, productPageUrl]\r\n );\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n\r\n const siteContext = context as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches =\r\n item.Swatches?.map(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault,\r\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\r\n isDisabled:\r\n enableStockCheck &&\r\n dimensionAvailabilities?.find(\r\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\r\n )?.isDisabled\r\n };\r\n }) ?? [];\r\n if (\r\n dimensionToPreSelectInProductCard !== DimensionTypes.none &&\r\n ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) &&\r\n dimensionType === DimensionTypes.color\r\n ) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map(swatches => {\r\n return {\r\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: swatches.value\r\n }\r\n };\r\n });\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n const bookAuthorAttributeKey: string = (context.app.config && context.app.config.bookAuthorAttribute) || 'bookAuthor';\r\n return (\r\n <>\r\n {isEnabledProductDescription ? (\r\n \r\n
\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context\r\n )}\r\n
\r\n
\r\n
{product.Name}
\r\n {renderBookAuthor(product.AttributeValues!, bookAuthorAttributeKey)}\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n isPriceMinMaxEnabled,\r\n priceResources\r\n )}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n
\r\n
\r\n \r\n ) : (\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context\r\n )}\r\n
\r\n
\r\n
{product.Name}
\r\n {renderBookAuthor(product.AttributeValues!, bookAuthorAttributeKey)}\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n )}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n
\r\n \r\n )}\r\n {renderProductDimensions(product.AttributeValues)}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n \r\n );\r\n};\r\n\r\nfunction renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string\r\n): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\r\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\r\n }`;\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return

{description}

;\r\n}\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n}\r\n\r\nfunction renderRating(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string,\r\n ratingCountAriaLabel?: string\r\n): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderPrice(\r\n context: ICoreContext,\r\n typeName: string,\r\n id: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n savingsText?: string,\r\n freePriceText?: string,\r\n originalPriceText?: string,\r\n currentPriceText?: string,\r\n isPriceMinMaxEnabled?: boolean,\r\n priceResources?: IPriceComponentResources\r\n): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n fallbackImageUrl?: string,\r\n altText?: string,\r\n context?: ICoreContext>\r\n): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\r\n const contextConfig = context?.app.config?.placeholderImageName;\r\n const emptyPlaceHolderImage = contextConfig as string;\r\n let fallbackImageSource = fallbackImageUrl;\r\n if (emptyPlaceHolderImage && fallbackImageUrl) {\r\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageSource\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings\r\n };\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderBookAuthor(attributeValues: AttributeValue[], attributeKey: string): JSX.Element | null {\r\n const bookAuthorAttribute = getAttributeByName(attributeValues, attributeKey);\r\n if (bookAuthorAttribute) {\r\n return

{bookAuthorAttribute?.TextValue}

;\r\n }\r\n return null;\r\n}\r\n\r\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;\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['sgi-new-arrival'] = {\n c: () => require('partner/modules/sgi-new-arrival/sgi-new-arrival.tsx'),\n $type: 'containerModule',\n da: [{name:'featureState', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state', runOn: 0},{name:'refiners', path:'modules/sgi-new-arrival/get-all-refiners-for-collection', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'sgi-new-arrival',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/sgi-new-arrival'\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 = 'modules/sgi-new-arrival/get-all-refiners-for-collection';\n let dataAction = require('partner/modules/sgi-new-arrival/get-all-refiners-for-collection');\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|sgi-new-arrival|sgi-new-arrival'] = {\n c: () => require('partner/modules/sgi-new-arrival/sgi-new-arrival.view.tsx'),\n cn: '__local__-__local__-sgi-new-arrival'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["AllRefinersInput","constructor","getCacheKey","getCacheObjectType","dataCacheType","actionDataAction","createObservableDataAction","id","action","async","input","ctx","searchCriteria","SearchCondition","Context","ChannelId","requestContext","apiSettings","channelId","CatalogId","catalogId","getProductSearchRefinersAsync","callerContext","queryResultSettings","count","Sorting","Columns","ColumnName","IsDescending","then","productRefiners","trace","result","map","productRefiner","length","args","layout","HeadingTag","ProductCollection","React","props","super","getProductBasedOnRefinerAsync","config","newArrivalRefinerName","newArrivalRefinerLVSValue","this","data","refiners","_refiners$find","filteredRefiner","find","refiner","_refiner$KeyName","KeyName","toLowerCase","Values","value","_value$LeftValueBound","LeftValueBoundString","productSearchCriteria","Refinement","context","actionContext","IncludeAttributes","SkipVariantExpansion","searchByCriteriaAsync","catch","handleHeadingChange","event","heading","text","target","_getProductsDimensionsAvailabilities","dimensionsToDisplayOnProductCard","app","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","ArrayExtensions","validValues","products","hasElements","includes","DimensionTypes","none","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","setState","_getProduct","product","index","_this$props$data$feat","_this$state$productsD","Name","telemetry","PrimaryImageUrl","generateImageUrl","request","telemetryContent","getTelemetryObject","telemetryPageName","friendlyName","imageSettings","allowBackNavigation","resources","breaCrumbType","breadcrumbType","allowBack","quickviewSlot","slots","quickview","reviewCountAriaLabelValue","Number","TotalRatings","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","isPriceMinMaxEnabled","featureState","priceResources","priceRangeSeparator","ProductContainer","tag","className","role","key","productComponent","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","typeName","quickViewButton","IsEnabled","dimensionAvailabilities","state","dimensionAvailability","_product$MasterProduc","masterProductId","MasterProductId","RecordId","_getActivePrice","productsList","getPriceForProductSearchResult","PriceForProductSearchResultInput","productPrices","filteredproducts","filter","_getAttributeByKeyNam","_getAttributeByKeyNam2","isNewArrival","getAttributeByKeyName","AttributeValues","newArrivalAttrKeyName","BooleanValue","isNewArrivalDateValid","newArrivalDateAttrKeyName","DateTimeOffsetValue","Date","err","console","log","componentDidMount","enableAffiliationBasedPricing","user","isAuthenticated","render","isCarousel","carousel","headingLabel","headingComponent","Msdyn365","editProps","onEdit","updatedProducts","item","getProductData","ObjectExtensions","isNullOrUndefined","undefined","productCollectionViewProps","_objectSpread","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperPrevious","flipperNextLabel","flipperNext","parentId","ProductCollectionContainer","moduleProps","classnames","GridComponentProps","renderView","_renderCarousel","carouselContainer","items","Node","Object","assign","_renderProduct","_renderGrid","gridContainer","Module","error","getAttributeByName","attributes","keyName","attr","_attr$Name","_attr$KeyName","getDefaultColorSwatchSelected","productData","_colorAttribute$Swatc","_colorAttribute$Swatc2","_colorAttribute$Swatc3","colorAttribute","attributeValue","_attributeValue$KeyNa","toLocaleLowerCase","color","defaultSwatch","Swatches","IsDefault","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","search","href","pathname","renderProductUnitOfMeasure","unitOfMeasure","renderLabel","name","price","rating","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","roundedRating","toFixed","format","renderPrice","basePrice","adjustedPrice","savingsText","BasePrice","AdjustedPrice","CustomerContextualPrice","PriceComponent","renderProductPlacementImage","gridSettings","imageUrl","fallbackImageUrl","altText","_context$app$config","contextConfig","placeholderImageName","fallbackImageSource","img","src","fallBackSrc","imageProps","cropFocalRegion","Image","loadFailureBehavior","bypassHideOnFailure","renderBookAuthor","attributeValues","attributeKey","bookAuthorAttribute","TextValue","msdyn365Commerce","createComponentOverride","component","_ref","_product$Name","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","isEnabledProductDescription","inventoryLabel","swatchItemAriaLabel","productUrl","getProductPageUrlSync","MIN_VALUE","productImageUrlFromSwatch","dimensionToPreSelectInProductCard","ProductImageUrls","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","useState","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","enableStockCheck","updatePageAndImageUrl","swatchItem","dimensionType","setValue","StringExtensions","isNullOrWhitespace","productPageUrlWithSwatch","newUrl","searchParams","delete","toString","swatchProductImageUrl","productImageUrls","newImageUrl","payLoad","getPayloadObject","attribute","getTelemetryAttributes","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","bookAuthorAttributeKey","onClick","onTelemetryClick","cultureFormatter","formatCurrency","Price","AverageRating","DefaultUnitOfMeasure","description","Description","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","itemId","colorHexCode","SwatchColorHexCode","SwatchImageUrl","isDefault","isDisabled","_swatchItem$SwatchVal3","some","swatch","ProductComponentSwatchComponent","onSelectDimension","hideRating","moduleTypeName","moduleId","avgRating","totalRatings","ariaLabel","numberRatings","RatingComponent","ratingCount","readOnly","renderRating","inventoryAvailabilityLabel","selectedDimensions","getValues","DimensionTypeValue","convertDimensionTypeToProductDimensionType","DimensionValue","Value","selectedProductId","renderQuickView","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","md","window","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}