{"version":3,"file":"static/js/e2fa632938cc267721de.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 getAttributeBooleanOrDefault(attributes: AttributeValue[] | undefined, attributeName: string, defaultValue: boolean = false): boolean {\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\r\n if (!attribute) {\r\n return defaultValue;\r\n }\r\n\r\n return attribute.BooleanValue || defaultValue;\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":["getAttributeBooleanOrDefault","attributes","attributeName","defaultValue","arguments","length","undefined","attribute","find","x","_x$Name2","Name","replace","BooleanValue","getAttributeNumberOrDefault","_x$Name4","result","DataTypeValue","CurrencyValue","FloatValue","IntegerValue","getAttributeString","attributeOrName","suffix","_attribute","_attribute$CurrencyVa","_attribute$DateTimeOf","_attribute$FloatValue","_attribute$IntegerVal","_attribute$TextValue","_attribute$BooleanVal","Error","_x$Name5","toString","DateTimeOffsetValue","toUTCString","TextValue","isBase64EncodePrefixed","decodeBase64String","getAttributeStringOrDefault","_attribute$CurrencyVa2","_attribute$DateTimeOf2","_attribute$FloatValue2","_attribute$IntegerVal2","_attribute$TextValue2","_attribute$BooleanVal2","_x$Name6","getAttributesLocale","lang","nbNO","_objectSpread","enUS","hasAttribute","some","hasAccessToBuy","context","customer","productAttributes","_context$request$app$","locale","request","licensesToCheck","alcoholProduct","bama","cocacola","dutyFreeSugar","nortura","tobacco","transit","hasAccess","forsvaretAttributeId","app","config","forsvaretAttributeRecordId","_productAttributes$fi","_customer$Attributes","_customer$Attributes$","_customer$Attributes$2","productForsvaretAttribute","RecordId","Number","Attributes","AttributeValue","_context$request$app$2","_context$request$app$3","_customer$Attributes5","_customer$Attributes6","_customer$Attributes7","_productAttributes$fi3","svalbardAttributeId","svalbardAttributeRecordId","blockedSvalbardAttributeId","blockedSvalbardAttributeRecordId","customerSvalbardAttribute","checkForSvalbard","license","_productAttributes$fi2","_customer$Attributes2","_customer$Attributes3","_customer$Attributes4","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","split","map","join","sort","sortAttributesByGroupOrder","product","index","_product$ExtensionPro","attrFind","ExtensionProperties","e","Key","Value","trim","push","attributeGroup","_attributeGroup$attri","mostCommonNameIndex","getMostUsedAttributeNameIndex","attributesToUse","modelVersion","shouldUseAttributeSet","_attributes","_attributes$find","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","_a$ExtensionPropertie2","_a$ExtensionPropertie3","_b$ExtensionPropertie","_b$ExtensionPropertie2","_b$ExtensionPropertie3","a_order","prop","b_order","_a$ExtensionPropertie4","_a$ExtensionPropertie5","_a$ExtensionPropertie6","_b$ExtensionPropertie4","_b$ExtensionPropertie5","_b$ExtensionPropertie6","notFoundDefaultValue","usedNameIndicies","attributeGroupsWithNameArray","Array","arrayOfNameArrays","y","_arrayOfNameArrays$i","reduce","acc","curr","arr","count","base64String","Buffer","toLowerCase","startsWith"],"sourceRoot":""}