{"version":3,"file":"static/js/ceab257ab8cd2155e48e.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/shared-utils/attributes/attributes.ts?f392","webpack://Msdyn365.Commerce.Online/./src/shared-utils/attributes/attributes-map.ts?19ca","webpack://Msdyn365.Commerce.Online/./src/shared-utils/attributes/attribute-sorters.ts?85e1","webpack://Msdyn365.Commerce.Online/./src/shared-utils/attributes/get-most-used-attribute-name-index.ts?6ba6","webpack://Msdyn365.Commerce.Online/./src/shared-utils/base64.ts?35d0"],"sourcesContent":["import { AttributeValue, Customer } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport nbNO from './locale/nb-NO.json';\r\nimport enUS from './locale/en-US.json';\r\nimport { decodeBase64String, isBase64EncodePrefixed } from \"../base64\";\r\n\r\nexport function getAttribute(attributes: AttributeValue[] | undefined, attributeName: string): AttributeValue {\r\n if (!attributes) {\r\n throw new Error(`No attributes found.`);\r\n }\r\n\r\n const attribute = attributes?.find(x => x.Name?.replace('{base64}:', '') === attributeName);\r\n\r\n if (!attribute) {\r\n throw new Error(`Attribute ${attributeName} not found.`);\r\n }\r\n\r\n return attribute;\r\n}\r\n\r\nexport function getAttributeNumber(attributes: AttributeValue[] | undefined, attributeName: string): number {\r\n if (!attributes) {\r\n throw new Error(`No attributes found.`);\r\n }\r\n\r\n const attribute = attributes?.find(x => x.Name?.replace('{base64}:', '') === attributeName);\r\n let result: number | undefined;\r\n\r\n if (!attribute) {\r\n throw new Error(`Attribute ${attributeName} not found.`);\r\n }\r\n\r\n switch (attribute.DataTypeValue) {\r\n case 1: // Currency\r\n result = attribute.CurrencyValue;\r\n break;\r\n case 3: // Decimal\r\n result = attribute.FloatValue;\r\n break;\r\n case 4: // Integer\r\n result = attribute.IntegerValue;\r\n break;\r\n case 0: // None\r\n case 2: // DateTime\r\n case 5: // Text\r\n case 6: // TrueFalse\r\n throw new Error(`Attribute ${attributeName} is not a number.`);\r\n }\r\n\r\n return result || 0;\r\n}\r\n\r\nexport function getAttributeNumberOrDefault(attributes: AttributeValue[] | undefined, attributeName: string, defaultValue: number): number {\r\n if (!attributes) {\r\n return defaultValue;\r\n }\r\n\r\n const attribute = attributes?.find(x => x.Name?.replace('{base64}:', '') === attributeName);\r\n let result: number | undefined;\r\n\r\n if (!attribute) {\r\n return defaultValue;\r\n }\r\n\r\n switch (attribute.DataTypeValue) {\r\n case 1: // Currency\r\n result = attribute.CurrencyValue;\r\n break;\r\n case 3: // Decimal\r\n result = attribute.FloatValue;\r\n break;\r\n case 4: // Integer\r\n result = attribute.IntegerValue;\r\n break;\r\n case 0: // None\r\n case 2: // DateTime\r\n case 5: // Text\r\n case 6: // TrueFalse\r\n result = defaultValue;\r\n break;\r\n }\r\n\r\n return result || 0;\r\n}\r\n\r\nexport function getAttributeString(attributes: AttributeValue[] | undefined, attributeOrName: AttributeValue | string, suffix?: string): string {\r\n if (!attributes) {\r\n throw new Error(`No attributes found.`);\r\n }\r\n\r\n let attribute, result;\r\n\r\n if (typeof attributeOrName === 'string') {\r\n attribute = attributes?.find(x => x.Name?.replace('{base64}:', '') === attributeOrName);\r\n } else {\r\n attribute = attributeOrName;\r\n }\r\n\r\n switch (attribute?.DataTypeValue) {\r\n case 0: // None\r\n result = `-`;\r\n break;\r\n case 1: // Currency\r\n result = attribute.CurrencyValue?.toString();\r\n break;\r\n case 2: // DateTime\r\n result = attribute.DateTimeOffsetValue?.toUTCString();\r\n break;\r\n case 3: // Decimal\r\n result = attribute.FloatValue?.toString();\r\n break;\r\n case 4: // Integer\r\n result = attribute.IntegerValue?.toString();\r\n break;\r\n case 5: // Text\r\n result = attribute.TextValue?.toString();\r\n break;\r\n case 6: // TrueFalse\r\n result = attribute.BooleanValue?.toString();\r\n break;\r\n }\r\n\r\n if (!result) {\r\n throw new Error(`Attribute ${attributeOrName} not found`);\r\n }\r\n\r\n if (isBase64EncodePrefixed(attribute)) {\r\n result = decodeBase64String(result);\r\n }\r\n\r\n if (result !== '-' && suffix) {\r\n result += suffix;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function getAttributeStringOrDefault(attributes: AttributeValue[] | undefined, attributeName: string, defaultValue: T, suffix?: string): T | string {\r\n if (!attributes) {\r\n return defaultValue;\r\n }\r\n\r\n const attribute = attributes?.find(x => x.Name?.replace('{base64}:', '') === attributeName);\r\n let result;\r\n\r\n if (!attribute) {\r\n return defaultValue;\r\n }\r\n\r\n switch (attribute?.DataTypeValue) {\r\n case 0: // None\r\n result = `-`;\r\n break;\r\n case 1: // Currency\r\n result = attribute.CurrencyValue?.toString();\r\n break;\r\n case 2: // DateTime\r\n result = attribute.DateTimeOffsetValue?.toUTCString();\r\n break;\r\n case 3: // Decimal\r\n result = attribute.FloatValue?.toString();\r\n break;\r\n case 4: // Integer\r\n result = attribute.IntegerValue?.toString();\r\n break;\r\n case 5: // Text\r\n result = attribute.TextValue?.toString();\r\n break;\r\n case 6: // TrueFalse\r\n result = attribute.BooleanValue?.toString();\r\n break;\r\n default:\r\n result = '';\r\n break;\r\n }\r\n\r\n if (result && isBase64EncodePrefixed(attribute)) {\r\n result = decodeBase64String(result);\r\n }\r\n\r\n if (result && result !== '-' && suffix) {\r\n result += suffix;\r\n }\r\n\r\n return result || '';\r\n}\r\n\r\nexport function getAttributesLocale(lang: string): typeof nbNO {\r\n switch (lang) {\r\n case 'nb-NO':\r\n return nbNO;\r\n case 'en-US':\r\n return {...nbNO, ...enUS};\r\n default:\r\n return nbNO;\r\n }\r\n}\r\n\r\nexport function hasAttribute(attributes: AttributeValue[] | undefined, attributeName: string): boolean {\r\n if (!attributes) {\r\n return false;\r\n }\r\n\r\n return attributes?.some(x => x.Name === attributeName);\r\n}\r\n\r\nexport function hasAccessToBuy(context: ICoreContext, customer: Customer | undefined, productAttributes: AttributeValue[] | undefined) {\r\n if (!productAttributes || productAttributes.length === 0) {\r\n // No product attributes available, default to true\r\n return true;\r\n }\r\n\r\n const locale = getAttributesLocale(context.request.locale);\r\n const licensesToCheck = [\r\n locale.alcoholProduct,\r\n locale.bama,\r\n locale.cocacola,\r\n locale.dutyFreeSugar,\r\n locale.nortura,\r\n locale.tobacco,\r\n locale.transit\r\n ];\r\n let hasAccess = true;\r\n\r\n const forsvaretAttributeId = context.request.app.config?.forsvaretAttributeRecordId;\r\n\r\n if (forsvaretAttributeId) {\r\n const productForsvaretAttribute = productAttributes?.find(x => x.RecordId === Number(forsvaretAttributeId))?.IntegerValue || 0;\r\n const customerForsvaretAttribute = customer?.Attributes?.find(x => x.RecordId === Number(forsvaretAttributeId))?.AttributeValue?.IntegerValue || 0;\r\n\r\n // If customer has Forsvaret attribute set to 1 don't allow buying of products with Forsvaret attribute set to 0\r\n if (customerForsvaretAttribute === 1 && productForsvaretAttribute === 0) {\r\n return false;\r\n }\r\n }\r\n\r\n if (checkForSvalbard(context, customer, productAttributes) === false) {\r\n return false;\r\n }\r\n\r\n for (const license of licensesToCheck) {\r\n const productAttribute = Number(productAttributes?.find(x => x.Name === license)?.TextValue);\r\n const customerAttribute = Number(customer?.Attributes?.find(x => x.Name === license)?.AttributeValue?.StringValue);\r\n\r\n // Product doesn't have the attribute. Default to has access\r\n if (isNaN(productAttribute) || productAttribute === 0) {\r\n continue;\r\n }\r\n\r\n // Product has the attribute and it's more than 0, but customer doesn't have it at all. No access\r\n if (isNaN(customerAttribute)) {\r\n hasAccess = false;\r\n break;\r\n }\r\n\r\n // Product has the attribute, but customer has a lower value. No access\r\n if (customerAttribute < productAttribute) {\r\n hasAccess = false;\r\n break;\r\n }\r\n }\r\n\r\n return hasAccess;\r\n}\r\n\r\nfunction checkForSvalbard(context: ICoreContext, customer: Customer | undefined, productAttributes: AttributeValue[] | undefined) {\r\n const svalbardAttributeId = context.request.app.config?.svalbardAttributeRecordId;\r\n const blockedSvalbardAttributeId = context.request.app.config?.blockedSvalbardAttributeRecordId;\r\n\r\n if (!svalbardAttributeId || !blockedSvalbardAttributeId) {\r\n return true;\r\n }\r\n\r\n const customerSvalbardAttribute = customer?.Attributes?.find(x => x.RecordId === Number(svalbardAttributeId))?.AttributeValue?.IntegerValue || 0;\r\n const productSvalbardAttribute = productAttributes?.find(x => x.RecordId === Number(blockedSvalbardAttributeId))?.IntegerValue || 0;\r\n\r\n if (productSvalbardAttribute > 0 && customerSvalbardAttribute > 0) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n","import { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { getAttributeStringOrDefault, getAttributesLocale } from './attributes';\r\nimport { getMostUsedAttributeNameIndex, sortAttributes, sortAttributesByGroupOrder } from '.';\r\nimport { AttributeDataType, AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { decodeBase64String, isBase64EncodePrefixed } from '../base64';\r\n\r\nexport interface IAttributeGroupMapAttribute {\r\n name: string | string[];\r\n label?: string;\r\n hideIfEmpty?: boolean;\r\n transform?: (value: string) => string;\r\n transformName?: (key: string) => string;\r\n}\r\n\r\nexport interface IAttributeGroupMap {\r\n type: AttributeGroupType;\r\n group: string;\r\n attributes?: (string | IAttributeGroupMapAttribute)[];\r\n transform?: (value: string) => string;\r\n defaultValue?: string;\r\n nullValues?: string[];\r\n /** The attribute to use as source. If set this will look for the attributes inside this attribute. */\r\n attributeSource?: string;\r\n attributeSourceSet?: { source: string, value: string }[];\r\n exclude?: string[];\r\n}\r\n\r\nexport type AttributeGroupType = 'default' | 'allergens';\r\nexport type ModelVersion = '1.0' | '2.0' | '3.0';\r\n\r\nexport interface IParsedAttributeMap {\r\n type: AttributeGroupType;\r\n name: string;\r\n attributes: IParsedAttribute[];\r\n modelVersion?: ModelVersion;\r\n}\r\n\r\nexport interface IParsedAttribute {\r\n name: string;\r\n value: string;\r\n}\r\n\r\nexport const replaceCommaWithDot = (value: string): string => {\r\n // Shouldn't need to replace anything if both are present\r\n if (value.includes(',') && value.includes('.')) {\r\n return value.replace(' ', '');\r\n }\r\n\r\n // Only replace the last occurance of a comma with a dot\r\n const lastCommaIndex = value.lastIndexOf(',');\r\n if (lastCommaIndex !== -1) {\r\n return `${value.substring(0, lastCommaIndex)}.${value.substring(lastCommaIndex + 1)}`.replace(' ', '');\r\n }\r\n\r\n // If no comma is present, return the value as is\r\n return value.replace(' ', '');\r\n\r\n // return value.replace(',', '.').replace(' ', '');\r\n};\r\nexport const padValue = (value: string): string => {\r\n return Number(value.replace(',', '')).toFixed(2).toString();\r\n};\r\nexport const addCelsiusSign = (value: string): string => {\r\n return value ? `${value}°` : value;\r\n};\r\nexport const addDashPrefix = (key: string): string => {\r\n return ` - ${key}`;\r\n};\r\nexport const addLeftPaddingHTML = (value: string): string => {\r\n return `\\t${value}`;\r\n};\r\n\r\nfunction findAttribute(attributeName: string): (attribute: string | IAttributeGroupMapAttribute) => boolean {\r\n return (attribute: string | IAttributeGroupMapAttribute) => {\r\n if (typeof attribute === 'string') {\r\n return attribute === attributeName;\r\n } else {\r\n return attribute.name === attributeName;\r\n }\r\n };\r\n}\r\n\r\nexport function parseAttributesMap(context: ICoreContext, attributes: AttributeValue[] | undefined, attributesMap?: IAttributeGroupMap[]): IParsedAttributeMap[] {\r\n if (!attributesMap) {\r\n attributesMap = getAttributesMap(context);\r\n }\r\n\r\n const attributesLocale = getAttributesLocale(context.request.locale);\r\n const groups: {\r\n [key: string]: AttributeValue[];\r\n } = {};\r\n attributes = JSON.parse(JSON.stringify(attributes));\r\n\r\n if (attributes) {\r\n for (let i = 0; i < attributes.length; i++) {\r\n const attribute = attributes[i];\r\n if (isBase64EncodePrefixed(attribute)) {\r\n attribute.Name = attribute.Name?.replace('{base64}:', '');\r\n attribute.KeyName = attribute.KeyName?.replace('{base64}:', '');\r\n\r\n if (attribute.DataTypeValue === AttributeDataType.Text && attribute.TextValue) {\r\n attribute.TextValue = attribute.TextValue.split('|').map(decodeBase64String).join('|');\r\n }\r\n }\r\n }\r\n }\r\n\r\n attributes!.sort(sortAttributesByGroupOrder).map((product: AttributeValue, index) => {\r\n const attrFind = product.ExtensionProperties?.find((e: any) => {\r\n return e.Key === 'ATTRGROUPNAME';\r\n });\r\n if(attrFind && attrFind.Value && attrFind.Value.StringValue){\r\n const key = attrFind.Value.StringValue.trim();\r\n if (groups[key]) {\r\n groups[key].push(product);\r\n } else {\r\n groups[key] = [];\r\n groups[key].push(product);\r\n }\r\n }\r\n });\r\n\r\n const parsed: IParsedAttributeMap[] = attributesMap.map((attributeGroup) => {\r\n const mostCommonNameIndex = getMostUsedAttributeNameIndex(attributes, attributeGroup, attributesLocale.notFound);\r\n\r\n if (!attributeGroup.attributes && !groups[attributeGroup.group]) {\r\n return {\r\n type: attributeGroup.type,\r\n name: attributeGroup.group,\r\n attributes: []\r\n };\r\n }\r\n\r\n let modelVersion: ModelVersion = '1.0';\r\n let attributesToUse: AttributeValue[] | undefined;\r\n const attributeSource = attributeGroup.attributeSource\r\n ? attributes!.find((attribute: AttributeValue) => attribute.Name === attributeGroup.attributeSource)\r\n : undefined;\r\n const shouldUseAttributeSet = attributeGroup.attributeSourceSet?.some((source) => {\r\n return attributes?.find((attribute: AttributeValue) => attribute.Name === source.source)?.TextValue;\r\n });\r\n\r\n if (shouldUseAttributeSet) {\r\n modelVersion = '3.0';\r\n attributesToUse = [];\r\n\r\n attributeGroup.attributeSourceSet!.forEach((source) => {\r\n const attribute = attributes?.find((attribute: AttributeValue) => attribute.Name === source.source);\r\n\r\n if (!attribute || !attribute.TextValue) {\r\n return;\r\n }\r\n\r\n attributesToUse!.push(...attribute.TextValue.split('|').map((attribute) => {\r\n return {\r\n Name: attribute,\r\n DataTypeValue: 5,\r\n TextValue: source.value,\r\n ExtensionProperties: [\r\n {\r\n Key: 'ATTRORDER',\r\n Value: {\r\n DecimalValue: (attributeGroup.attributes?.findIndex((attr) => {\r\n if (typeof attr === 'string') {\r\n return attr === attribute;\r\n } else {\r\n return attr.name === attribute;\r\n }\r\n }) ?? -1) + 1\r\n }\r\n }\r\n ]\r\n } as AttributeValue;\r\n }));\r\n });\r\n } else if (attributeGroup.attributeSource && attributeSource?.TextValue) {\r\n modelVersion = '2.0';\r\n attributesToUse = attributeSource?.TextValue?.split('|').map((attribute) => {\r\n return {\r\n Name: attribute.split(':')[0],\r\n DataTypeValue: 5,\r\n TextValue: attribute.split(':')[1]\r\n } as AttributeValue;\r\n });\r\n } else {\r\n attributesToUse = attributes;\r\n }\r\n\r\n const attrs = !shouldUseAttributeSet && attributeGroup.attributes\r\n ? attributeGroup.attributes.map((attribute: IAttributeGroupMapAttribute | string) => {\r\n if (typeof attribute === 'string') {\r\n let value = getAttributeStringOrDefault(attributesToUse, attribute, attributesLocale.notFound);\r\n\r\n if (attributeGroup.transform) {\r\n value = attributeGroup.transform(value);\r\n }\r\n\r\n return {\r\n name: attribute,\r\n value\r\n };\r\n } else {\r\n let name: string;\r\n let value: string | undefined;\r\n\r\n if (typeof attribute.name === 'string') {\r\n name = attribute.label || attribute.name;\r\n value = getAttributeStringOrDefault(attributesToUse,\r\n attribute.name,\r\n attributeGroup.defaultValue);\r\n } else {\r\n const values: {\r\n [key: string]: string | undefined\r\n } = {};\r\n\r\n attribute.name.forEach((name: string) => {\r\n values[name] = getAttributeStringOrDefault(attributesToUse, name, attributeGroup.defaultValue);\r\n });\r\n\r\n if (Object.values(values).every((v) => !v || attributeGroup.nullValues?.includes(v))) {\r\n name = attribute.name[mostCommonNameIndex];\r\n value = attributeGroup.defaultValue;\r\n } else {\r\n const found = Object.entries(values).find(([key, val]) => val && !attributeGroup.nullValues?.includes(val));\r\n\r\n if (!found) {\r\n name = attribute.label || attribute.name[mostCommonNameIndex];\r\n value = attributeGroup.defaultValue;\r\n } else {\r\n name = attribute.label || found[0];\r\n value = found[1];\r\n }\r\n }\r\n }\r\n\r\n if (attribute.transformName) {\r\n name = attribute.transformName(name);\r\n }\r\n\r\n if (value && attribute.transform) {\r\n value = attribute.transform(value);\r\n } else if (value && attributeGroup.transform) {\r\n value = attributeGroup.transform(value);\r\n }\r\n\r\n if (attribute.hideIfEmpty === true && value === undefined) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n name,\r\n value: value || attributesLocale.notFound\r\n };\r\n }\r\n })\r\n : ((shouldUseAttributeSet || attributeGroup.attributeSource && attributeSource?.TextValue) ? attributesToUse! : groups[attributeGroup.group]).sort(sortAttributes).map((attribute: AttributeValue) => {\r\n if (!attribute.Name) {\r\n throw new Error(`Attribute name is missing.`);\r\n }\r\n\r\n if (attributeGroup.exclude && attributeGroup.exclude.includes(attribute.Name)) {\r\n return undefined;\r\n }\r\n\r\n let name = attribute.Name;\r\n let value = getAttributeStringOrDefault(attributesToUse,\r\n attribute.Name,\r\n attributeGroup.defaultValue || attributesLocale.notFound);\r\n\r\n if (attributeGroup.transform) {\r\n value = attributeGroup.transform(value);\r\n }\r\n\r\n const findAttributeFromAttributes = attributeGroup.attributes?.find(findAttribute(attribute.Name));\r\n\r\n if (typeof findAttributeFromAttributes === 'object') {\r\n if (findAttributeFromAttributes.transformName) {\r\n name = findAttributeFromAttributes.transformName(attribute.Name);\r\n }\r\n }\r\n\r\n return {\r\n name,\r\n value\r\n };\r\n });\r\n\r\n return {\r\n type: attributeGroup.type,\r\n name: attributeGroup.group,\r\n attributes: attrs.filter(x => x).map((attribute) => {\r\n const { name, value } = attribute || {};\r\n\r\n return {\r\n name: name as string,\r\n value: value as string\r\n };\r\n }),\r\n modelVersion\r\n };\r\n });\r\n\r\n return parsed;\r\n}\r\n\r\nexport function getAttributesMap(context: ICoreContext): IAttributeGroupMap[] {\r\n const attributesLocale = getAttributesLocale(context.request.locale);\r\n\r\n return [\r\n {\r\n type: 'default',\r\n group: attributesLocale.groups.nutrients,\r\n transform: (value) => {\r\n value = replaceCommaWithDot(value);\r\n value = padValue(value);\r\n return value;\r\n },\r\n defaultValue: '0.00',\r\n nullValues: ['0', '0.00', attributesLocale.notFound],\r\n attributeSource: attributesLocale.groups.nutrients,\r\n attributes: [\r\n {\r\n name: [\r\n attributesLocale.energyKjPer100g,\r\n attributesLocale.energyKjPer100ml,\r\n attributesLocale.energyKjPer100gml\r\n ]\r\n },\r\n {\r\n name: [\r\n attributesLocale.energyKcalPer100g,\r\n attributesLocale.energyKcalPer100ml,\r\n attributesLocale.energyKcalPer100gml\r\n ]\r\n },\r\n {\r\n name: [\r\n attributesLocale.fatPer100g,\r\n attributesLocale.fatPer100ml,\r\n attributesLocale.fatPer100gml\r\n ]\r\n },\r\n {\r\n name: [\r\n attributesLocale.saturatedFattyAcidsPer100g,\r\n attributesLocale.saturatedFattyAcidsPer100ml,\r\n attributesLocale.saturatedFattyAcidsPer100gml\r\n ],\r\n transformName: addDashPrefix\r\n },\r\n {\r\n name: [\r\n attributesLocale.monounsaturatedFattyAcidsPer100g,\r\n attributesLocale.monounsaturatedFattyAcidsPer100ml,\r\n attributesLocale.monounsaturatedFattyAcidsPer100gml\r\n ],\r\n transformName: addDashPrefix\r\n },\r\n {\r\n name: [\r\n attributesLocale.polyunsaturatedFattyAcidsPer100g,\r\n attributesLocale.polyunsaturatedFattyAcidsPer100ml,\r\n attributesLocale.polyunsaturatedFattyAcidsPer100gml\r\n ],\r\n transformName: addDashPrefix\r\n },\r\n {\r\n name: [\r\n attributesLocale.carbohydratesPer100g,\r\n attributesLocale.carbohydratesPer100ml,\r\n attributesLocale.carbohydratesPer100gml\r\n ]\r\n },\r\n {\r\n name: [\r\n attributesLocale.sugarsPer100g,\r\n attributesLocale.sugarsPer100ml,\r\n attributesLocale.sugarsPer100gml\r\n ],\r\n transformName: addDashPrefix\r\n },\r\n {\r\n name: [\r\n attributesLocale.dietaryFibersPer100g,\r\n attributesLocale.dietaryFibersPer100ml,\r\n attributesLocale.dietaryFibersPer100gml\r\n ]\r\n },\r\n {\r\n name: [\r\n attributesLocale.proteinsPer100g,\r\n attributesLocale.proteinsPer100ml,\r\n attributesLocale.proteinsPer100gml\r\n ]\r\n },\r\n {\r\n name: [\r\n attributesLocale.saltPer100g,\r\n attributesLocale.saltPer100ml,\r\n attributesLocale.saltPer100gml\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n type: 'allergens',\r\n group: attributesLocale.groups.allergens,\r\n attributeSource: attributesLocale.groups.allergens,\r\n attributeSourceSet: [\r\n {\r\n source: attributesLocale.groups.allergensContains,\r\n value: attributesLocale.labels.yes\r\n },\r\n {\r\n source: attributesLocale.groups.allergensCanContainTraces,\r\n value: attributesLocale.labels.canContains\r\n },\r\n {\r\n source: attributesLocale.groups.allergensDoesNotContain,\r\n value: attributesLocale.labels.freeFrom\r\n }\r\n ],\r\n attributes: [\r\n attributesLocale.allergens.molluscs,\r\n attributesLocale.allergens.eggs,\r\n attributesLocale.allergens.fish,\r\n attributesLocale.allergens.gluten,\r\n {\r\n name: attributesLocale.allergens.barleyGluten,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.oatGluten,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.wheatGluten,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.khorasanWheatGluten,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.ryeGluten,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.speltGluten,\r\n transformName: addLeftPaddingHTML\r\n },\r\n attributesLocale.allergens.lupin,\r\n attributesLocale.allergens.milk,\r\n attributesLocale.allergens.nuts,\r\n {\r\n name: attributesLocale.allergens.hazelnuts,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.cashews,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.macadamiaNuts,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.almonds,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.brazilNuts,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.peanuts,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.pecans,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.pistachios,\r\n transformName: addLeftPaddingHTML\r\n },\r\n {\r\n name: attributesLocale.allergens.walnuts,\r\n transformName: addLeftPaddingHTML\r\n },\r\n attributesLocale.allergens.celery,\r\n attributesLocale.allergens.mustard,\r\n attributesLocale.allergens.sesameSeeds,\r\n attributesLocale.allergens.shellfish,\r\n attributesLocale.allergens.soy,\r\n attributesLocale.allergens.sulphurDioxideOrSulfites\r\n ],\r\n exclude: [\r\n attributesLocale.groups.allergens,\r\n attributesLocale.groups.allergensContains,\r\n attributesLocale.groups.allergensCanContainTraces,\r\n attributesLocale.groups.allergensDoesNotContain\r\n ],\r\n transform: (value: string) => {\r\n switch (value) {\r\n case attributesLocale.values.contains:\r\n return attributesLocale.labels.yes;\r\n case attributesLocale.values.containsNot:\r\n return attributesLocale.labels.freeFrom;\r\n case attributesLocale.values.canContainTraces:\r\n return attributesLocale.labels.canContains;\r\n default:\r\n return value;\r\n }\r\n }\r\n },\r\n {\r\n type: 'default',\r\n group: attributesLocale.groups.productInformation,\r\n attributes: [\r\n {\r\n name: attributesLocale.temperatureMin,\r\n transform: addCelsiusSign\r\n },\r\n {\r\n name: attributesLocale.temperatureMax,\r\n transform: addCelsiusSign\r\n },\r\n attributesLocale.gtin,\r\n attributesLocale.countryOfOrigin,\r\n attributesLocale.quantity\r\n ]\r\n }\r\n ];\r\n}\r\n","import { AttributeValue } from \"@msdyn365-commerce/retail-proxy\";\r\n\r\nexport const sortAttributes = (a: AttributeValue, b: AttributeValue): number => {\r\n const a_order = a.ExtensionProperties?.find(prop => prop.Key === 'ATTRORDER')?.Value?.DecimalValue;\r\n const b_order = b.ExtensionProperties?.find(prop => prop.Key === 'ATTRORDER')?.Value?.DecimalValue;\r\n\r\n if (!a_order) {\r\n return 1;\r\n }\r\n if (!b_order) {\r\n return -1;\r\n }\r\n\r\n if (a_order < b_order) {\r\n return -1;\r\n }\r\n if (a_order > b_order) {\r\n return 1;\r\n }\r\n return 0;\r\n};\r\n\r\nexport const sortAttributesByGroupOrder = (a: AttributeValue, b: AttributeValue): number => {\r\n const a_order = a.ExtensionProperties?.find(prop => prop.Key === 'ATTRGROUPORDER')?.Value?.DecimalValue;\r\n const b_order = b.ExtensionProperties?.find(prop => prop.Key === 'ATTRGROUPORDER')?.Value?.DecimalValue;\r\n\r\n if (!a_order) {\r\n return 1;\r\n }\r\n if (!b_order) {\r\n return -1;\r\n }\r\n\r\n if (a_order < b_order) {\r\n return -1;\r\n }\r\n if (a_order > b_order) {\r\n return 1;\r\n }\r\n return 0;\r\n};\r\n","import { AttributeValue } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { IAttributeGroupMap, IAttributeGroupMapAttribute } from \"./attributes-map\";\r\nimport { getAttributeStringOrDefault } from \"./\";\r\n\r\n/**\r\n * Returns the index of the most used attribute name in the given array of product specifications named from attribute map.\r\n */\r\nexport function getMostUsedAttributeNameIndex(attributes: AttributeValue[] | undefined, attributeGroup: IAttributeGroupMap, notFoundDefaultValue: string) {\r\n const usedNameIndicies: number[] = [];\r\n const attributeGroupsWithNameArray = attributeGroup.attributes?.filter(x => typeof x !== 'string' && x.name instanceof Array) as IAttributeGroupMapAttribute[];\r\n const arrayOfNameArrays = attributeGroupsWithNameArray?.map(x => x.name) as (string[])[];\r\n\r\n if (arrayOfNameArrays && arrayOfNameArrays.length > 0) {\r\n for (let i = 0; i < arrayOfNameArrays.length; i++) {\r\n if (!arrayOfNameArrays[i]) {\r\n continue;\r\n }\r\n for (let y = 0; y < arrayOfNameArrays[i]?.length; y++) {\r\n const value = getAttributeStringOrDefault(attributes,\r\n arrayOfNameArrays[i][y],\r\n attributeGroup.defaultValue || notFoundDefaultValue);\r\n\r\n if (!attributeGroup.nullValues?.includes(value)) {\r\n usedNameIndicies.push(y);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Get the number that appears the most in 'usedNameIndicies' array\r\n const mostCommonNameIndex = usedNameIndicies.reduce((acc, curr, i, arr) => {\r\n const count = arr.filter((x) => x === curr).length;\r\n return count > acc.count ? { count, index: curr } : acc;\r\n }, { count: 0, index: 0 }).index;\r\n\r\n return mostCommonNameIndex;\r\n}\r\n","import { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { Buffer } from 'buffer/';\r\n\r\nexport function decodeBase64String(base64String: string): string {\r\n return Buffer.from(base64String, 'base64').toString('utf-8');\r\n}\r\n\r\nexport function encodeBase64String(string: string): string {\r\n return Buffer.from(string).toString('base64');\r\n}\r\n\r\nexport function isBase64Encoded(str: string | undefined): boolean {\r\n if (!str || str === '' || str.trim() === '') {\r\n return false;\r\n }\r\n\r\n // Base64 strings should have a length that is a multiple of 4\r\n if (str.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n // A basic regex for base64 strings\r\n const base64Regex = /^[A-Za-z0-9+/]+={0,2}$/;\r\n\r\n return base64Regex.test(str);\r\n}\r\n\r\nexport function isBase64EncodePrefixed(attribute: AttributeValue | IProductRefinerHierarchy | undefined): boolean {\r\n if (!attribute) {\r\n return false;\r\n }\r\n\r\n if (attribute.KeyName?.toLowerCase().startsWith('{base64}:')) {\r\n return true;\r\n }\r\n\r\n if ('Name' in attribute) {\r\n return !!attribute?.Name?.toLowerCase().startsWith('{base64}:');\r\n }\r\n\r\n return false;\r\n}\r\n"],"names":["getAttributeNumberOrDefault","attributes","attributeName","defaultValue","attribute","find","x","_x$Name3","Name","replace","result","DataTypeValue","CurrencyValue","FloatValue","IntegerValue","getAttributeString","attributeOrName","suffix","_attribute","_attribute$CurrencyVa","_attribute$DateTimeOf","_attribute$FloatValue","_attribute$IntegerVal","_attribute$TextValue","_attribute$BooleanVal","Error","_x$Name4","toString","DateTimeOffsetValue","toUTCString","TextValue","BooleanValue","isBase64EncodePrefixed","decodeBase64String","getAttributeStringOrDefault","_attribute$CurrencyVa2","_attribute$DateTimeOf2","_attribute$FloatValue2","_attribute$IntegerVal2","_attribute$TextValue2","_attribute$BooleanVal2","_x$Name5","getAttributesLocale","lang","nbNO","_objectSpread","enUS","hasAttribute","some","hasAccessToBuy","context","customer","productAttributes","_context$request$app$","length","locale","request","licensesToCheck","alcoholProduct","bama","cocacola","dutyFreeSugar","nortura","tobacco","transit","hasAccess","forsvaretAttributeId","app","config","forsvaretAttributeRecordId","_productAttributes$fi","_customer$Attributes","productForsvaretAttribute","RecordId","Number","Attributes","AttributeValue","_context$request$app$2","_context$request$app$3","_customer$Attributes3","_productAttributes$fi3","svalbardAttributeId","svalbardAttributeRecordId","blockedSvalbardAttributeId","blockedSvalbardAttributeRecordId","customerSvalbardAttribute","checkForSvalbard","license","_productAttributes$fi2","_customer$Attributes2","productAttribute","customerAttribute","StringValue","isNaN","addCelsiusSign","value","addDashPrefix","key","addLeftPaddingHTML","parseAttributesMap","attributesMap","attributesLocale","type","group","groups","nutrients","transform","toFixed","padValue","includes","lastCommaIndex","lastIndexOf","substring","replaceCommaWithDot","nullValues","notFound","attributeSource","name","energyKjPer100g","energyKjPer100ml","energyKjPer100gml","energyKcalPer100g","energyKcalPer100ml","energyKcalPer100gml","fatPer100g","fatPer100ml","fatPer100gml","saturatedFattyAcidsPer100g","saturatedFattyAcidsPer100ml","saturatedFattyAcidsPer100gml","transformName","monounsaturatedFattyAcidsPer100g","monounsaturatedFattyAcidsPer100ml","monounsaturatedFattyAcidsPer100gml","polyunsaturatedFattyAcidsPer100g","polyunsaturatedFattyAcidsPer100ml","polyunsaturatedFattyAcidsPer100gml","carbohydratesPer100g","carbohydratesPer100ml","carbohydratesPer100gml","sugarsPer100g","sugarsPer100ml","sugarsPer100gml","dietaryFibersPer100g","dietaryFibersPer100ml","dietaryFibersPer100gml","proteinsPer100g","proteinsPer100ml","proteinsPer100gml","saltPer100g","saltPer100ml","saltPer100gml","allergens","attributeSourceSet","source","allergensContains","labels","yes","allergensCanContainTraces","canContains","allergensDoesNotContain","freeFrom","molluscs","eggs","fish","gluten","barleyGluten","oatGluten","wheatGluten","khorasanWheatGluten","ryeGluten","speltGluten","lupin","milk","nuts","hazelnuts","cashews","macadamiaNuts","almonds","brazilNuts","peanuts","pecans","pistachios","walnuts","celery","mustard","sesameSeeds","shellfish","soy","sulphurDioxideOrSulfites","exclude","values","contains","containsNot","canContainTraces","productInformation","temperatureMin","temperatureMax","gtin","countryOfOrigin","quantity","getAttributesMap","JSON","parse","stringify","i","_attribute$Name","_attribute$KeyName","KeyName","AttributeDataType","Text","split","map","join","sort","sortAttributesByGroupOrder","product","index","_product$ExtensionPro","attrFind","ExtensionProperties","e","Key","Value","trim","push","attributeGroup","_attributeGroup$attri","mostCommonNameIndex","getMostUsedAttributeNameIndex","attributesToUse","modelVersion","undefined","shouldUseAttributeSet","_attributes","forEach","_attributes2","_attributeGroup$attri2","_attributeGroup$attri3","DecimalValue","findIndex","attr","_attributeSource$Text","attrs","label","Object","every","v","_attributeGroup$nullV","found","entries","_ref","_attributeGroup$nullV2","val","hideIfEmpty","sortAttributes","_attributeGroup$attri4","findAttributeFromAttributes","filter","a","b","_a$ExtensionPropertie","_b$ExtensionPropertie","a_order","prop","b_order","_a$ExtensionPropertie2","_b$ExtensionPropertie2","notFoundDefaultValue","usedNameIndicies","attributeGroupsWithNameArray","Array","arrayOfNameArrays","y","_arrayOfNameArrays$i","reduce","acc","curr","arr","count","base64String","Buffer","from","toLowerCase","startsWith"],"sourceRoot":""}