{"version":3,"file":"static/js/fe4bb7efcc14fcfc69e5.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"],"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\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 === 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 === 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 === 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 === 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 (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 === 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 && 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 { AttributeValue } from '@msdyn365-commerce/retail-proxy';\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\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"],"names":["getAttributeNumberOrDefault","attributes","attributeName","defaultValue","attribute","find","x","Name","result","DataTypeValue","CurrencyValue","FloatValue","IntegerValue","getAttributeString","attributeOrName","suffix","_attribute","_attribute$CurrencyVa","_attribute$DateTimeOf","_attribute$FloatValue","_attribute$IntegerVal","_attribute$TextValue","_attribute$BooleanVal","Error","toString","DateTimeOffsetValue","toUTCString","TextValue","BooleanValue","getAttributeStringOrDefault","_attribute$CurrencyVa2","_attribute$DateTimeOf2","_attribute$FloatValue2","_attribute$IntegerVal2","_attribute$TextValue2","_attribute$BooleanVal2","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","replace","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","sort","sortAttributesByGroupOrder","map","product","index","_product$ExtensionPro","attrFind","ExtensionProperties","e","Key","Value","trim","push","attributeGroup","_attributeGroup$attri","mostCommonNameIndex","getMostUsedAttributeNameIndex","attributesToUse","modelVersion","undefined","shouldUseAttributeSet","_attributes$find","forEach","split","_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","i","y","_arrayOfNameArrays$i","reduce","acc","curr","arr","count"],"sourceRoot":""}