{"version":3,"file":"static/js/be9ce9fd11c6ab816a2f.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/Utilities/get-html-parser-value.ts?1fb6","webpack://mattressfirm/./src/data-actions/get-attributes-for-selected-variant.ts?4859","webpack://mattressfirm/./src/data-actions/get-selected-variant.override.action.ts?02a3","webpack://mattressfirm/./src/modules/mfrm-product-page-summary/get-product-recordId.action.ts?a795","webpack://mattressfirm/./src/modules/mfrm-product-page-summary/mfrm-product-page-summary.action.ts?7926","webpack://mattressfirm/./node_modules/@msdyn365-commerce/bootloader/node_modules/core-js/modules/es.promise.all-settled.js?ad9a","webpack://mattressfirm/./node_modules/@msdyn365-commerce/bootloader/node_modules/core-js/modules/esnext.promise.all-settled.js?b32a"],"sourcesContent":["import ReactHtmlParser from 'react-html-parser';\r\n\r\nconst getHtmlParserValue = (value?: string) => {\r\n let parsedValue = '';\r\n const parsedArr = value && ReactHtmlParser(value);\r\n if (parsedArr && parsedArr?.length > 0) {\r\n parsedValue = parsedArr[0] ? parsedArr[0].toString() : '';\r\n }\r\n return parsedValue;\r\n};\r\n\r\nexport default getHtmlParserValue;","import {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { getSelectedProductIdFromActionInput, getSelectedVariant, SelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getAttributeValuesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\n/**\r\n * Chains getting the SelectedVariant with GetActivePrice\r\n */\r\nexport class AttributesForSelectedVariantInput implements IActionInput {\r\n public productId: number;\r\n public channelId: number;\r\n public catalogId: number;\r\n public selectedProduct: SimpleProduct | undefined;\r\n\r\n constructor(productId: number, channelId: number, selectedProduct?: SimpleProduct, catalogId?: number) {\r\n this.productId = productId;\r\n this.channelId = channelId;\r\n this.selectedProduct = selectedProduct;\r\n this.catalogId = catalogId || 0;\r\n }\r\n\r\n public getCacheKey = () => `AttributesForSelectedVariant`;\r\n public getCacheObjectType = () => 'ProductAttributeValue';\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\nexport const createAttributesForSelectedVariantInput = (\r\n inputData: ICreateActionContext>\r\n): AttributesForSelectedVariantInput => {\r\n const productId = getSelectedProductIdFromActionInput(inputData);\r\n if (productId) {\r\n return new AttributesForSelectedVariantInput(+productId, +inputData.requestContext.apiSettings.channelId);\r\n } else {\r\n throw new Error('Unable to create PriceForSelectedVariantInput, no productId found on module config or query');\r\n }\r\n};\r\n\r\n/**\r\n * Calls the Retail API a get a list of dimension values for a given product.\r\n */\r\nexport async function getAttributesForSelectedVariantAction(\r\n input: AttributesForSelectedVariantInput,\r\n ctx: IActionContext\r\n): Promise {\r\n // @ts-ignore: Promise vs. ObservablePromise typing conflict\r\n return Promise.resolve()\r\n .then(() => {\r\n const activeProduct: SimpleProduct | undefined = input.selectedProduct;\r\n\r\n if (!activeProduct) {\r\n const selectedVariantInput = new SelectedVariantInput(input.productId, input.channelId);\r\n\r\n return getSelectedVariant(selectedVariantInput, ctx);\r\n }\r\n\r\n return activeProduct;\r\n })\r\n .then((productResult: SimpleProduct | null) => {\r\n const activeProduct: SimpleProduct | undefined = productResult;\r\n\r\n if (activeProduct) {\r\n return getAttributeValuesAsync(\r\n { callerContext: ctx, queryResultSettings: {} },\r\n activeProduct.RecordId,\r\n input.channelId,\r\n input.catalogId\r\n );\r\n }\r\n\r\n return null;\r\n })\r\n .then((attributeValues: AttributeValue[] | null) => {\r\n const resultArray = attributeValues;\r\n if (resultArray) {\r\n return resultArray;\r\n }\r\n\r\n return [];\r\n })\r\n .catch((error: Error) => {\r\n ctx.trace(error.message);\r\n throw new Error(`[getPriceForSelectedVariantAction]Error executing action ${error.message}`);\r\n });\r\n}\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/product-info/get-attributes-for-selected-variant',\r\n action: >getAttributesForSelectedVariantAction,\r\n input: createAttributesForSelectedVariantInput\r\n});\r\n","import { generateProductImageUrl, getSelectedProductIdFromActionInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport {\r\n getByIdAsync,\r\n getDimensionValuesAsync,\r\n getVariantsByDimensionValuesAsync,\r\n searchByCriteriaAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport {\r\n AttributeValue,\r\n CommerceProperty,\r\n ProductDimension,\r\n ProductDimensionValue,\r\n ProductSearchCriteria,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { variantQueryStringName } from '../Utilities/constants';\r\nimport getAttributesForSelectedVariant, { AttributesForSelectedVariantInput } from './get-attributes-for-selected-variant';\r\nimport { getQueryParamsFromQueryByName } from './utilities/utils';\r\n// import { AttributesForSelectedVariantInput, getAttributesForSelectedVariantAction } from '@msdyn365-commerce-modules/product-specification/src/dataActions/get-attributes-for-selected-variant';\r\n\r\nexport interface IDefaultDimension {\r\n dimensionType: number;\r\n dimensionValue: string;\r\n}\r\n\r\nlet shouldDefaultSet: boolean = true;\r\n/**\r\n * Get selected variant action input class\r\n */\r\nexport class SelectedVariantInput implements IActionInput {\r\n public productId: number;\r\n public channelId: number;\r\n public matchingDimensionValues: ProductDimension[];\r\n\r\n constructor(productId: number, channelId: number, matchingDimensionValues?: ProductDimension[]) {\r\n this.productId = productId;\r\n this.channelId = channelId;\r\n this.matchingDimensionValues = matchingDimensionValues || [];\r\n }\r\n\r\n public getCacheKey = () => `SelectedVariant`;\r\n public getCacheObjectType = () => 'SimpleProduct';\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\n/**\r\n * CreateInput method for the getSelectedVariant data action\r\n * @param inputData The input data passed to the createInput method\r\n */\r\nconst createInput = (inputData: ICreateActionContext>): SelectedVariantInput => {\r\n const productId = getSelectedProductIdFromActionInput(inputData);\r\n if (productId) {\r\n return new SelectedVariantInput(+productId, +inputData.requestContext.apiSettings.channelId, []);\r\n } else {\r\n throw new Error('Unable to create SelectedVariantInput, no productId found on module config or query');\r\n }\r\n};\r\n\r\n/**\r\n * Action method for the getSelectedVariant data aciton\r\n * @param input The action input class\r\n * @param ctx The action context\r\n */\r\n// tslint:disable-next-line:cyclomatic-complexity max-func-body-length\r\nasync function getSelectedVariantAction(input: SelectedVariantInput, ctx: IActionContext): Promise {\r\n //TODO: what is the use case for `matchingDimensionValues` to ever have values?\r\n // the `createInput` always passes an empty array to the input constructor. Where\r\n // else / how else is this getting called that would pass a populated array?\r\n const matchingDimensionValues = input.matchingDimensionValues ?? [];\r\n const variantId = ctx.requestContext.app.config.queryBasedVariantSelection\r\n ? getQueryParamsFromQueryByName(\r\n MsDyn365.isBrowser\r\n ? new URL(window.location.href.toString())\r\n : ctx.requestContext.url.requestUrl,\r\n variantQueryStringName)\r\n : undefined;\r\n let getByIdResponse;\r\n try {\r\n getByIdResponse = await getByIdAsync(\r\n { callerContext: ctx },\r\n matchingDimensionValues?.length === 0 && variantId && !Number.isNaN(Number(variantId))\r\n ? Number(variantId)\r\n : await getDefaultVariantId(input.productId, ctx) ?? input.productId,\r\n input.channelId);\r\n } catch (error) {\r\n console.log('[getByIdAsync Error calling API]', error);\r\n }\r\n // bellow cond will only be 1 if we have invalid variantid\r\n if (!getByIdResponse && variantId) {\r\n getByIdResponse = await getByIdAsync(\r\n { callerContext: ctx },\r\n input.productId,\r\n input.channelId);\r\n }\r\n\r\n // below condition will only be true if we have masterid in url and query\r\n if (getByIdResponse && !getByIdResponse?.MasterProductId) {\r\n getByIdResponse = await getByIdAsync(\r\n { callerContext: ctx },\r\n await getDefaultVariantId(getByIdResponse.RecordId, ctx) ?? input.productId,\r\n input.channelId);\r\n }\r\n\r\n const baseProduct: SimpleProduct = Array.isArray(getByIdResponse)\r\n ? getByIdResponse[0]\r\n : getByIdResponse;\r\n // Need to dereference this before editing it. Otherwise we might not\r\n // properly get the mobx events because if things aren't properly observable\r\n // they won't fire when you set them, and then if you don't deref the value in\r\n // the cache will match the value when you try to save it, so it won't detect any\r\n // changes there either\r\n let product: SimpleProduct | null = { ...baseProduct };\r\n const originalDimensionLength = product.Dimensions ? product.Dimensions.length : 0;\r\n\r\n if (product && product.RecordId > 0) {\r\n let baseProductHadUnmatchedDimension: boolean = false;\r\n\r\n product.Dimensions?.forEach(dimension => {\r\n const matchedTargetDimension = matchingDimensionValues.find(\r\n targetDimension => targetDimension.DimensionTypeValue === dimension.DimensionTypeValue\r\n );\r\n\r\n if (matchedTargetDimension) {\r\n dimension.DimensionValue = matchedTargetDimension?.DimensionValue;\r\n } else {\r\n baseProductHadUnmatchedDimension = true;\r\n }\r\n });\r\n\r\n const actionInput = new AttributesForSelectedVariantInput(\r\n product.RecordId,\r\n input.channelId,\r\n product\r\n );\r\n const productSpecificationData: AttributeValue[] = await getAttributesForSelectedVariant(actionInput, ctx)\r\n .catch((error: Error) => {\r\n error;\r\n }) || [];\r\n\r\n // check if default variant is given for product\r\n // const productSpecificationData: AttributeValue[] = await getAttributeValuesAsync({ callerContext: ctx, queryResultSettings: {} }, product.RecordId, input.channelId, 0);\r\n const defaultValues = productSpecificationData.find(data => data.Name?.toLowerCase().trim() === 'default variants')?.TextValue;\r\n const parsedDefaultData = defaultValues\r\n ? parseDefaultDimensionsData(defaultValues)\r\n : undefined;\r\n const productPreSelectionDimensions: ProductDimensionFull[] = [];\r\n\r\n //new - literally 10x faster!\r\n if (!product.MasterProductId) {\r\n // const now = (new Date()).valueOf()\r\n // console.time(`productPreSelectionDimensions${now}`);\r\n const asyncCalls = product.Dimensions?.map(async dimension => {\r\n const dimensionValues = await getDimensionValuesAsync(\r\n { callerContext: ctx, queryResultSettings: {} },\r\n product?.MasterProductId\r\n ? product.MasterProductId\r\n // @ts-ignore: nested in `if(product && product.RecordId > 0)`\r\n : product.RecordId,\r\n input.channelId,\r\n dimension.DimensionTypeValue,\r\n matchingDimensionValues.filter(value => value.DimensionTypeValue !== dimension.DimensionTypeValue),\r\n null\r\n );\r\n\r\n // if dimensionValues have a length of exactly one then we need to make\r\n // it as selected dimension for getting variant of the product\r\n if (dimensionValues.length === 1 && shouldDefaultSet) {\r\n dimension.DimensionValue = dimensionValues[0];\r\n } else {\r\n // search through default dimensions to find current dimension\r\n const defaultValueToFind = parsedDefaultData\r\n ?.find(defaultData => defaultData.dimensionType === dimension.DimensionTypeValue)\r\n ?.dimensionValue.toLowerCase()\r\n .trim();\r\n\r\n // look through all dimension values to find the default one\r\n const defaultDimension: ProductDimensionValue | undefined = dimensionValues.find(\r\n availableDimensionValue => availableDimensionValue.Value?.toLowerCase().trim() === defaultValueToFind || availableDimensionValue.DimensionId?.toLowerCase().trim() === defaultValueToFind\r\n );\r\n\r\n if (defaultDimension && shouldDefaultSet) {\r\n dimension.DimensionValue = defaultDimension;\r\n }\r\n }\r\n\r\n const fullDimension: ProductDimensionFull = {\r\n ...dimension,\r\n DimensionValues: dimensionValues\r\n };\r\n\r\n productPreSelectionDimensions.push(fullDimension);\r\n }) || [];\r\n\r\n await Promise.allSettled(asyncCalls);\r\n }\r\n //*/\r\n\r\n // if there is any selection in productPreSelectionDimensions array then get the variant\r\n if (productPreSelectionDimensions.length > 0) {\r\n const mappedDimensions = productPreSelectionDimensions\r\n .filter(dimension => dimension && dimension.DimensionValue)\r\n .map(dimension => {\r\n return {\r\n DimensionTypeValue: dimension.DimensionTypeValue,\r\n DimensionValue: dimension.DimensionValue,\r\n ExtensionProperties: dimension.ExtensionProperties\r\n };\r\n });\r\n //console.log(\"mappedDimensions: \",mappedDimensions)\r\n if (originalDimensionLength > 0 && originalDimensionLength === mappedDimensions.length) {\r\n const variants = await getVariantsByDimensionValuesAsync(\r\n { callerContext: ctx, queryResultSettings: {} },\r\n baseProduct.RecordId,\r\n input.channelId,\r\n mappedDimensions\r\n );\r\n if (variants && variants.length === 1) {\r\n //TODO: why is the `product` variable that has been built up through the rest of the code\r\n // being overwriten in the final steps?\r\n product = variants[0];\r\n }\r\n }\r\n }\r\n else if (productPreSelectionDimensions.length === 0 && !baseProductHadUnmatchedDimension && matchingDimensionValues.length > 0) {\r\n const variants = await getVariantsByDimensionValuesAsync(\r\n { callerContext: ctx, queryResultSettings: {} },\r\n baseProduct.RecordId,\r\n input.channelId,\r\n matchingDimensionValues\r\n );\r\n\r\n if (variants && variants.length > 0) {\r\n //TODO: why is the `product` variable that has been built up through the rest of the code\r\n // being overwriten in the final steps?\r\n product = variants[0];\r\n }\r\n }\r\n else {\r\n //TODO: what should happen here??\r\n //console.log(\"in 'else' for getVariantsByDimensionValuesAsync\")\r\n }\r\n\r\n const newImageUrl = generateProductImageUrl(product, ctx.requestContext.apiSettings);\r\n\r\n if (newImageUrl) {\r\n product.PrimaryImageUrl = newImageUrl;\r\n }\r\n }\r\n\r\n shouldDefaultSet = false;\r\n\r\n return product;\r\n}\r\n\r\nconst parseDefaultDimensionsData = (defaultValue: string): IDefaultDimension[] | undefined => {\r\n try {\r\n const defaultDimensions: IDefaultDimension[] = [];\r\n\r\n const splitDimensionTypes = defaultValue.split(',');\r\n splitDimensionTypes.forEach(dimensionData => {\r\n const [dimensionTypeString, dimensionValue] = dimensionData.split('_');\r\n const dimensionType = parseInt(dimensionTypeString, 10);\r\n defaultDimensions.push({\r\n dimensionType,\r\n dimensionValue\r\n });\r\n });\r\n\r\n return defaultDimensions;\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nexport const getDefaultVariantId = async (masterId: number, context: IActionContext): Promise => {\r\n const productSearchCriteria: ProductSearchCriteria = {\r\n Ids: [masterId],\r\n Context: {\r\n ChannelId: +context.requestContext.apiSettings.channelId,\r\n CatalogId: +context.requestContext.apiSettings.catalogId\r\n },\r\n IncludeAttributes: true,\r\n SearchCondition: '*'\r\n };\r\n try {\r\n const productSearchResults = await searchByCriteriaAsync(\r\n { callerContext: context },\r\n productSearchCriteria\r\n );\r\n // If the ProductSearchResult API finds the products then populate the product image urls and return\r\n // otherwise if the API does not exist or does not return products proceed to the legacy flows for legacy/backward compatibility reasons\r\n context.telemetry.debug('Product search results returned', JSON.stringify(productSearchResults));\r\n if (productSearchResults.length > 0) {\r\n const defaultVariantId = productSearchResults[0]?.ExtensionProperties && productSearchResults[0]?.ExtensionProperties.find(\r\n (property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantID\"\r\n )?.Value?.LongValue;\r\n return !defaultVariantId || defaultVariantId === 0 ? undefined : defaultVariantId;\r\n }\r\n return undefined;\r\n } catch (e) {\r\n // In case of an error fall back to legacy flow\r\n context.telemetry.error(`Error while getting productSearchResult: ${e}`);\r\n return undefined;\r\n }\r\n};\r\n\r\n/**\r\n * The complete getSelectedVariant data action\r\n */\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/retail-actions/get-selected-variant',\r\n action: >getSelectedVariantAction,\r\n input: createInput\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getSelectedProductIdFromActionInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getByIdAsync,\r\n getVariantsByDimensionValuesAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport {\r\n ProductDimension,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\n\r\nexport class GetProductRecordidInput implements Msdyn365.IActionInput {\r\n public productId: number;\r\n public channelId: number;\r\n public matchingDimensionValues: ProductDimension[];\r\n\r\n constructor(productId: number, channelId: number, matchingDimensionValues?: ProductDimension[]) {\r\n this.productId = productId;\r\n this.channelId = channelId;\r\n this.matchingDimensionValues = matchingDimensionValues || [];\r\n }\r\n\r\n public getCacheKey = () => `GetProductRecord`;\r\n public getCacheObjectType = () => 'SimpleProduct';\r\n public dataCacheType = (): Msdyn365.CacheType => 'none';\r\n}\r\n\r\n// Create a data model here or import one to capture the response of the action\r\nexport interface IGetProductRecordidData {\r\n text: string;\r\n}\r\n\r\n/**\r\n * Use this function to create the input required to make the action call\r\n */\r\nconst createInput = (inputData: Msdyn365.ICreateActionContext): GetProductRecordidInput => {\r\n const productId = getSelectedProductIdFromActionInput(inputData);\r\n if (productId) {\r\n return new GetProductRecordidInput(+productId, +inputData.requestContext.apiSettings.channelId, []);\r\n } else {\r\n throw new Error('Unable to create SelectedVariantInput, no productId found on module config or query');\r\n }\r\n};\r\n\r\n/**\r\n * Use this function to call your action and process the results as needed\r\n */\r\nasync function action(input: GetProductRecordidInput, ctx: Msdyn365.IActionContext): Promise {\r\n let baseProduct: SimpleProduct | null = null;\r\n if (!ctx.requestContext.app.config.queryBasedVariantSelection) {\r\n const response = await getByIdAsync({ callerContext: ctx }, input.productId, input.channelId);\r\n baseProduct = Array.isArray(response) ? response[0] : response;\r\n }\r\n const matchingDimensionValues = input.matchingDimensionValues ?? [];\r\n const data = await getVariantsByDimensionValuesAsync(\r\n { callerContext: ctx, queryResultSettings: {} },\r\n baseProduct && baseProduct?.MasterProductId ? baseProduct.MasterProductId : input.productId,\r\n input.channelId,\r\n matchingDimensionValues\r\n );\r\n\r\n return data;\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >action,\r\n // Give your data action a unique id\r\n id: 'GetProductRecordId',\r\n input: createInput\r\n // Uncomment the below line if this is a meant to be a batched data action\r\n // isBatched: true\r\n});\r\n","/* eslint-disable no-duplicate-imports */\r\nimport { IPageSummaryData } from '@msdyn365-commerce-modules/page-summary';\r\nimport { buildCacheKey, generateImageUrl, getProductUrlSync, getSelectedProductIdFromActionInput, QueryResultSettingsProxy, removeDomainQspFromUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport MsDyn365, {\r\n CacheType, createObservableDataAction, IAction, IActionContext, IActionInput,\r\n ICommerceApiSettings, ICreateActionContext, IRequestContext, getCatalogId\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getAttributeValuesAsync, getByIdsAsync, getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport getHtmlParserValue from '../../Utilities/get-html-parser-value';\r\nimport { IMfrmProductPageSummaryConfig } from './mfrm-product-page-summary.props.autogenerated';\r\nimport getSelectedVariant, { SelectedVariantInput } from '../../data-actions/get-selected-variant.override.action';\r\nimport { getQueryParamsFromQueryByName } from '../../data-actions/utilities/utils';\r\nimport { variantQueryStringName } from '../../Utilities/constants';\r\n//import { getAllVariantsForProduct, BuyboxGetDimensionVariantAvailabilityInput } from '../../data-actions/buybox-get-all-variants-list';\r\n\r\n/** Product Page Summary Input */\r\nexport class ProductPageSummaryInput implements IActionInput {\r\n public apiSettings: ICommerceApiSettings;\r\n public config: IMfrmProductPageSummaryConfig;\r\n public productId: number;\r\n public catalogId?: number;\r\n\r\n public constructor(config: IMfrmProductPageSummaryConfig, apiSettings: ICommerceApiSettings, productId: number, requestContext?: IRequestContext) {\r\n this.config = config || {};\r\n this.apiSettings = apiSettings;\r\n this.productId = productId;\r\n\r\n if (requestContext) {\r\n this.catalogId = getCatalogId(requestContext);\r\n }\r\n }\r\n\r\n public getCacheObjectType = (): string => 'ProductPageSummary';\r\n public getCacheKey = (): string => `${buildCacheKey('ProductPageSummary', this.apiSettings)}-${this.config.title}-${this.productId}-${this.catalogId ?? 0}`;\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\n//TODO: move to .data.ts\r\nexport interface IProductPageSummary extends IPageSummaryData {\r\n price?: number;\r\n variantId?: number;\r\n masterProductId?: number;\r\n productBrand?: string;\r\n priceValidUntil?: string;\r\n itemCondition?: string;\r\n isOutOfStockArray?: { key: string, value: string }[];\r\n gtinArray?: { key: string, value: string }[];\r\n}\r\n\r\n//NOTE: needed for `export default createObservableDataAction({})`\r\nconst createInput = (args: ICreateActionContext) => {\r\n const productId = getSelectedProductIdFromActionInput(args);\r\n\r\n if (productId) {\r\n return new ProductPageSummaryInput(args.config, args.requestContext.apiSettings, +productId, args.requestContext);\r\n } else {\r\n throw new Error('Unable to create ProductPageSummaryAction input, no productId found on module config or query');\r\n }\r\n\r\n};\r\n\r\n//TODO: move in a common utility file\r\nfunction _getAttributeByName(attributeValues: AttributeValue[] | undefined, keyValue: string) {\r\n return attributeValues && attributeValues.find(currAttribute => currAttribute.Name && currAttribute.Name.toLowerCase().trim() === keyValue.toLowerCase().trim());\r\n}\r\n\r\n//TODO: move to utility file\r\nfunction parseAttributeTextArray(text: string | string[] | undefined): { key: string, value: string }[] {\r\n const rtn: { key: string, value: string }[] = [];\r\n\r\n if (text !== undefined) {\r\n if (!(text instanceof Array)) {\r\n text = [text];\r\n }\r\n\r\n text.forEach(str => {\r\n str?.replace(/[\\[\\]\"\\s]/g, '').split(',').forEach(it => {\r\n const keyVal = it.split('|');\r\n rtn.push({\r\n key: keyVal[0],\r\n value: keyVal[1]\r\n });\r\n });\r\n });\r\n }\r\n\r\n return rtn;\r\n}\r\n\r\nconst action = async (input: ProductPageSummaryInput, context: IActionContext): Promise => {\r\n const {\r\n config,\r\n productId,\r\n apiSettings,\r\n apiSettings: {\r\n channelId\r\n }\r\n } = input;\r\n const url = MsDyn365.isBrowser\r\n ? new URL(window.location.href.toString())\r\n : context.requestContext.url.requestUrl;\r\n //TODO: move get variantId from url logic into utility file and use in `createInput` methode\r\n let variantId = Number(getQueryParamsFromQueryByName(url, variantQueryStringName)) || undefined;\r\n if (!variantId) {\r\n try {\r\n const input = new SelectedVariantInput(productId, channelId);\r\n const selectedVariant = await getSelectedVariant(input, context) || undefined;\r\n variantId = selectedVariant?.RecordId;\r\n if (!variantId) {\r\n throw new Error(`Error - Had to fallback to MasterProductId for SEO Schema at ${url}`);\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n variantId = productId;\r\n }\r\n }\r\n\r\n const byIdAsync = productId && getByIdsAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\r\n },\r\n apiSettings.channelId,\r\n [productId],\r\n null,\r\n input.catalogId ?? 0\r\n ).catch(e => {\r\n // Do nothing, if there's an error we fall back to values defined from config\r\n console.error(\"Error while calling getByIdAsync: \", e);\r\n });\r\n const attributeValuesAsync = getAttributeValuesAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\r\n },\r\n productId,\r\n apiSettings.channelId,\r\n apiSettings.catalogId\r\n ).catch(e => {\r\n // Do nothing, if error fall back to config values\r\n console.error(\"Error while calling getAttributeValuesAsync: \", e);\r\n });\r\n const activePricesAsync = getActivePricesAsync(\r\n { callerContext: context },\r\n {\r\n ChannelId: context.requestContext.apiSettings.channelId,\r\n CatalogId: context.requestContext.apiSettings.catalogId\r\n },\r\n [+variantId],\r\n new Date(),\r\n null,\r\n [],\r\n true\r\n ).catch(e => {\r\n // Do nothing, if error fall back to config values\r\n console.error(\"Error while calling getActivePricesAsync: \", e);\r\n });\r\n //wait for all async to resolve\r\n const asynValues = await Promise.allSettled([\r\n byIdAsync,\r\n attributeValuesAsync,\r\n activePricesAsync\r\n ]);\r\n\r\n //results from async calls\r\n const simpleProductsData = asynValues[0].status === \"fulfilled\" ? asynValues[0].value || undefined : undefined;\r\n const productAttributes = asynValues[1].status === \"fulfilled\" ? asynValues[1].value || undefined : undefined;\r\n const productActivePrices = asynValues[2].status === \"fulfilled\" ? asynValues[2].value || undefined : undefined;\r\n const productActivePrice = productActivePrices && productActivePrices[0];\r\n const simpleProductData: SimpleProduct | undefined = simpleProductsData && simpleProductsData[0];\r\n const itemCondition = 'NewCondition';\r\n\r\n const pageTitleAttribute = _getAttributeByName(productAttributes, 'pageTitle')?.TextValue;\r\n const pageTitle = pageTitleAttribute ? getHtmlParserValue(pageTitleAttribute) : '';\r\n\r\n const pageDescriptionAttribute = _getAttributeByName(productAttributes, 'pageDescription')?.TextValue;\r\n const pageDescription = pageDescriptionAttribute ? getHtmlParserValue(pageDescriptionAttribute) : '';\r\n\r\n const priceValidUntil = productActivePrice?.DiscountLines && productActivePrice.DiscountLines[0]?.ValidTo?.toISOString();\r\n\r\n const isOutOfStockArray = parseAttributeTextArray(\r\n ['EcomAllVariantOOSInfo1',\r\n 'EcomAllVariantOOSInfo2',\r\n 'EcomAllVariantOOSInfo3'\r\n ].map(attributeName => {\r\n return _getAttributeByName(productAttributes, attributeName)?.TextValue || '';\r\n })\r\n );\r\n\r\n const gtinArray = parseAttributeTextArray(\r\n ['EcomAllVariantWithGTIN1',\r\n 'EcomAllVariantWithGTIN2',\r\n 'EcomAllVariantWithGTIN3',\r\n 'EcomAllVariantWithGTIN4',\r\n 'EcomAllVariantWithGTIN5',\r\n 'EcomAllVariantWithGTIN6',\r\n 'EcomAllVariantWithGTIN7',\r\n 'EcomAllVariantWithGTIN8',\r\n 'EcomAllVariantWithGTIN9'\r\n ].map(attributeName => {\r\n return _getAttributeByName(productAttributes, attributeName)?.TextValue || '';\r\n })\r\n );\r\n\r\n if (simpleProductData) {\r\n let productUrl: string | undefined;\r\n let productBrand: string | undefined;\r\n\r\n try {\r\n productUrl = getProductUrlSync(simpleProductData, context);\r\n const canonicalDomain = context.requestContext.canonicalDomain;\r\n if (productUrl && canonicalDomain) {\r\n productUrl = `https://${canonicalDomain}${productUrl}`.toLocaleLowerCase();\r\n productUrl = removeDomainQspFromUrl(productUrl, context.requestContext);\r\n } else {\r\n productUrl = undefined;\r\n }\r\n } catch (e) {\r\n productUrl = undefined;\r\n }\r\n\r\n if (productAttributes) {\r\n productBrand = _getAttributeByName(productAttributes, 'Brand')?.TextValue; //getProductBrand(productAttributes);\r\n } else {\r\n productBrand = undefined;\r\n }\r\n\r\n return {\r\n title: pageTitle || simpleProductData.Name,\r\n description: pageDescription || simpleProductData.Description,\r\n sharingImageUrl: generateImageUrl(simpleProductData.PrimaryImageUrl, apiSettings),\r\n canonicalUrl: `${productUrl}?variantid=${variantId}`,\r\n faviconUrl: config && config.faviconUrl,\r\n variantId: variantId,\r\n masterProductId: simpleProductData.RecordId,\r\n price: productActivePrice?.CustomerContextualPrice,\r\n productBrand: productBrand,\r\n itemCondition: itemCondition,\r\n isOutOfStockArray: isOutOfStockArray,\r\n priceValidUntil: priceValidUntil,\r\n gtinArray: gtinArray\r\n };\r\n // If the action fails fallback to values defined from config\r\n } else if (config) {\r\n return {\r\n title: pageTitle || config.title,\r\n description: pageDescription || config.description,\r\n sharingImageUrl: config.sharingImage && config.sharingImage.src,\r\n faviconUrl: config && config.faviconUrl\r\n };\r\n } else {\r\n return {};\r\n }\r\n};\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/page-summary/product-page-summary',\r\n action: >action,\r\n input: createInput\r\n});","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.allSettled` method\n// https://tc39.es/ecma262/#sec-promise.allsettled\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n allSettled: function allSettled(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call(promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'fulfilled', value: value };\n --remaining || resolve(values);\n }, function (error) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'rejected', reason: error };\n --remaining || resolve(values);\n });\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nrequire('../modules/es.promise.all-settled.js');\n"],"names":["value","parsedValue","parsedArr","ReactHtmlParser","length","toString","AttributesForSelectedVariantInput","constructor","productId","channelId","selectedProduct","catalogId","getCacheKey","getCacheObjectType","dataCacheType","this","createAttributesForSelectedVariantInput","inputData","getSelectedProductIdFromActionInput","requestContext","apiSettings","Error","async","getAttributesForSelectedVariantAction","input","ctx","Promise","resolve","then","activeProduct","selectedVariantInput","SelectedVariantInput","getSelectedVariant","productResult","getAttributeValuesAsync","callerContext","queryResultSettings","RecordId","attributeValues","catch","error","trace","message","createObservableDataAction","id","action","shouldDefaultSet","matchingDimensionValues","parseDefaultDimensionsData","defaultValue","defaultDimensions","split","forEach","dimensionData","dimensionTypeString","dimensionValue","dimensionType","parseInt","push","e","console","log","getDefaultVariantId","masterId","context","productSearchCriteria","Ids","Context","ChannelId","CatalogId","IncludeAttributes","SearchCondition","productSearchResults","searchByCriteriaAsync","telemetry","debug","JSON","stringify","_productSearchResults","_productSearchResults2","defaultVariantId","ExtensionProperties","find","property","Key","Value","LongValue","undefined","_input$matchingDimens","_getByIdResponse","variantId","app","config","queryBasedVariantSelection","getQueryParamsFromQueryByName","MsDyn365","isBrowser","URL","window","location","href","url","requestUrl","variantQueryStringName","getByIdResponse","_await$getDefaultVari","getByIdAsync","Number","isNaN","_await$getDefaultVari2","MasterProductId","baseProduct","Array","isArray","product","_objectSpread","originalDimensionLength","Dimensions","_product$Dimensions","_productSpecification","baseProductHadUnmatchedDimension","dimension","matchedTargetDimension","targetDimension","DimensionTypeValue","DimensionValue","actionInput","defaultValues","getAttributesForSelectedVariant","data","_data$Name","Name","toLowerCase","trim","TextValue","parsedDefaultData","productPreSelectionDimensions","_product$Dimensions2","asyncCalls","map","_product","dimensionValues","getDimensionValuesAsync","filter","_parsedDefaultData$fi","defaultValueToFind","defaultData","defaultDimension","availableDimensionValue","_availableDimensionVa","_availableDimensionVa2","DimensionId","fullDimension","DimensionValues","allSettled","mappedDimensions","variants","getVariantsByDimensionValuesAsync","newImageUrl","generateProductImageUrl","PrimaryImageUrl","GetProductRecordidInput","Msdyn365","_baseProduct","response","ProductPageSummaryInput","_this$catalogId","buildCacheKey","title","getCatalogId","_getAttributeByName","keyValue","currAttribute","parseAttributeTextArray","text","rtn","str","replace","it","keyVal","key","_input$catalogId","_getAttributeByName2","_getAttributeByName3","_productActivePrice$D","selectedVariant","byIdAsync","getByIdsAsync","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","attributeValuesAsync","activePricesAsync","getActivePricesAsync","Date","asynValues","simpleProductsData","status","productAttributes","productActivePrices","productActivePrice","simpleProductData","pageTitleAttribute","pageTitle","getHtmlParserValue","pageDescriptionAttribute","pageDescription","priceValidUntil","DiscountLines","ValidTo","toISOString","isOutOfStockArray","attributeName","_getAttributeByName4","gtinArray","_getAttributeByName5","productUrl","productBrand","getProductUrlSync","canonicalDomain","toLocaleLowerCase","removeDomainQspFromUrl","_getAttributeByName6","description","Description","sharingImageUrl","generateImageUrl","canonicalUrl","faviconUrl","masterProductId","price","CustomerContextualPrice","itemCondition","sharingImage","src","args","$","call","aCallable","newPromiseCapabilityModule","perform","iterate","target","stat","forced","iterable","C","capability","f","reject","result","promiseResolve","values","counter","remaining","promise","index","alreadyCalled","reason"],"sourceRoot":""}