@sis-cc/dotstatsuite-components 24.0.1 → 24.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/rules/src/dimension-utils.js","../src/rules/src/constants.js","../src/rules/src/observation-formater.js","../src/rules/src/factories/sample-series.js","../src/rules/src/factories/scatter-series.js","../src/rules/src/factories/timeline-series.js","../src/rules/src/factories/symbol-series.js","../src/rules/src/factories/stacked-series.js","../src/rules/src/factories/choro-series.js","../src/rules/src/factories/series.js","../src/rules/src/properties/utils.js","../src/rules/src/properties/focus.js","../src/rules/src/properties/scatter.js","../src/rules/src/properties/symbol.js","../src/rules/src/properties/stacked.js","../src/rules/src/properties/linear.js","../src/rules/src/properties/getHeaderProps.js","../src/rules/src/properties/getStringifiedSubtitle.js","../src/rules/src/properties/index.js","../src/rules/src/sdmx-data/index.js","../src/rules/src/date.js","../src/rules2/src/constants.js","../src/rules2/src/parseMetadataSeries.js","../src/rules2/src/getNotDisplayedIds.js","../src/rules2/src/getHCodelistsRefsInData.js","../src/rules2/src/getMetadataCoordinates.js","../src/rules2/src/duplicateObservations.js","../src/rules2/src/hierarchiseDimensionWithAdvancedHierarchy2.js","../src/rules2/src/hierarchiseDimensionWithNativeHierarchy2.js","../src/rules2/src/getCombinationDefinitions.js","../src/rules2/src/refineTimePeriod.js","../src/rules/src/get-values-enhanced.js","../src/rules2/src/getAttributes.js","../src/rules2/src/refineDimensions.js","../src/rules2/src/parseAttributes.js","../src/rules2/src/parseCombinations.js","../src/rules2/src/refineAttributes.js","../src/rules/src/preparators/formatValue.js","../src/rules2/src/enhanceObservations.js","../src/rules2/src/getAttributesSeries.js","../src/rules2/src/table/getFlagsAndNotes.js","../src/rules2/src/getManyValuesDimensions.js","../src/rules2/src/getOneValueDimensions.js","../src/rules2/src/getDataflowAttributes.js","../src/rules2/src/getHeaderTitle.js","../src/rules2/src/getHeaderSubtitle.js","../src/rules2/src/getSeriesCombinations.js","../src/rules2/src/combinedValuesDisplay.js","../src/rules2/src/getHeaderCombinations.js","../src/rules2/src/getHeaderCoordinates.js","../src/rules2/src/table/getLayout.js","../src/rules2/src/table/getSortedLayoutIndexes.js","../src/rules2/src/table/refineLayoutSize2.js","../src/rules2/src/utils.js","../src/rules2/src/table/getLayoutData2.js","../src/rules2/src/table/getCellsAttributesIds.js","../src/rules2/src/table/getCellsMetadataCoordinates.js","../src/rules2/src/table/getIndexedCombinationsByDisplay.js","../src/rules2/src/table/getCells.js","../src/rules2/src/hasCellMetadata.js","../src/rules2/src/table/getCuratedCells.js","../src/rules/src/preparators/getObservations.js","../src/rules2/src/applyHierarchicalCodesToDim.js","../src/rules/src/preparators/getReportingYearStart.js","../src/rules2/src/table/declineObservationsOverAttributes.js","../src/rules2/src/table/parseSeriesIndexesHierarchies.js","../src/rules2/src/table/getTableLayoutIds.js","../src/rules2/src/getDataflowTooltipAttributesIds.js","../src/rules2/src/getDimensionValuesIndexes.js","../src/rules2/src/getMSDInformations.js","../src/rules2/src/table/getTableLabelAccessor.js","../src/rules2/src/table/getTableProps.js","../src/rules2/src/parseHierarchicalCodelist.js","../src/rules2/src/table/parseValueHierarchy.js","../src/rules2/src/prepareData.js","../src/rules2/src/sdmx3.0DataFormatPatch.js","../src/rules/src/layout.js","../src/rules/src/table/factories/getCellValue.js","../src/rules/src/chart/getAxisOptions.js","../src/rules/src/chart/getBaseOptions.js","../src/rules/src/chart/getGridOptions.js","../src/rules/src/chart/getTooltipOptions.js","../src/rules/src/chart/getChartOptions.js","../src/rules/src/factories/focus.js","../src/rules/src/factories/scatter-focus.js","../src/rules/src/factories/timeline-focus.js","../src/rules/src/factories/sample-focus.js","../src/rules/src/properties/getAvailableChartTypes.js","../src/rules/src/properties/getObservationsType.js","../src/rules/src/factories/getChartSeries.js"],"sourcesContent":["import * as R from 'ramda';\n\nexport const parseDisplay = display =>\n R.isNil(display) || !R.includes(display, ['both', 'code']) ? 'label' : display;\n\nexport const dimensionValueDisplay =\n (display, accessors = {}) =>\n dimensionValue => {\n const id = R.propOr('', accessors.id || 'id', dimensionValue);\n const name = R.propOr('', accessors.name || 'name', dimensionValue);\n // a non-coded component (dim | attr) has no name, names nor label\n // the only valid thing to display is the id\n if (R.propOr(false, 'isNonCoded', dimensionValue)) return id;\n //auto-generated flags have no id nor name\n if (R.isEmpty(id) && R.isEmpty(name)) return '';\n switch (display) {\n case 'label':\n return R.isEmpty(name) ? `[${id}]` : name;\n case 'code':\n return id;\n case 'both':\n if (R.isNil(id) || R.isEmpty(id)) return name;\n return `(${id}) ${name}`;\n default:\n return null;\n }\n };\n\nexport const dimensionValueDisplayAt = (dimension, index, display) => {\n const dimensionValue = R.pathOr({}, ['values', Number(index)], dimension);\n return dimensionValueDisplay(display)(dimensionValue);\n};\n\nexport const categoryDisplay = (\n splitObservationKey,\n dimensions,\n dimensionsWithValuesIndexedById,\n rejectedId,\n display,\n) => {\n return R.pipe(\n R.addIndex(R.reduce)((acc, dimensionValueIndex, dimensionIndex) => {\n const dimension = R.nth(dimensionIndex, dimensions) || {};\n if (R.has(dimension.id, dimensionsWithValuesIndexedById) && dimension.id !== rejectedId) {\n return R.append(dimensionValueDisplayAt(dimension, dimensionValueIndex, display), acc);\n }\n return acc;\n }, []),\n R.join(' - '),\n )(splitObservationKey);\n};\n","export const BAR = 'BarChart';\nexport const ROW = 'RowChart';\nexport const SCATTER = 'ScatterChart';\nexport const TIMELINE = 'TimelineChart';\nexport const H_SYMBOL = 'HorizontalSymbolChart';\nexport const V_SYMBOL = 'VerticalSymbolChart';\nexport const STACKED_BAR = 'StackedBarChart';\nexport const STACKED_ROW = 'StackedRowChart';\nexport const CHORO = 'ChoroplethChart';\nexport const PERCENT = 'percent';\nexport const VALUES = 'values';\nexport const TYPES = {\n [BAR]: BAR,\n [ROW]: ROW,\n [SCATTER]: SCATTER,\n [TIMELINE]: TIMELINE,\n [H_SYMBOL]: H_SYMBOL,\n [V_SYMBOL]: V_SYMBOL,\n [STACKED_BAR]: STACKED_BAR,\n [STACKED_ROW]: STACKED_ROW,\n [CHORO]: CHORO,\n};\n\nexport const OBS_TYPE_NUMBER = 'OBS_TYPE_NUMBER';\nexport const OBS_TYPE_NUMERICAL_STRING = 'OBS_TYPE_NUMERICAL_STRING';\nexport const OBS_TYPE_STRING = 'OBS_TYPE_STRING';\nexport const REPORTING_YEAR_START_DAY = 'REPORTING_YEAR_START_DAY';\nexport const REPYEARSTART = 'REPYEARSTART';\n","import numeral from 'numeral';\nimport * as R from 'ramda';\n\nconst DEFAULT_PREFSCALE_ATTR_IDS = ['PREF_SCALE'];\n\nconst DEFAULT_DECIMALS_ATTR_IDS = ['DECIMALS'];\n\nconst getFormaterAttribute = (ids, attributes) =>\n R.find(attr => R.includes(attr.id, ids), attributes);\n\nconst parseAttributeFormaterIds = (ids = {}) => {\n let prefscale = R.prop('prefscale', ids);\n let decimals = R.prop('decimals', ids);\n decimals = R.isNil(decimals) ? DEFAULT_DECIMALS_ATTR_IDS : decimals;\n prefscale = R.isNil(prefscale) ? DEFAULT_PREFSCALE_ATTR_IDS : prefscale;\n return {\n decimals: R.is(Array, decimals) ? decimals : [decimals],\n prefscale: R.is(Array, prefscale) ? prefscale : [prefscale],\n };\n};\n\nexport const getObservationsFormaterAttributes = (attributes = [], ids = {}) => {\n const { decimals, prefscale } = parseAttributeFormaterIds(ids);\n return {\n decimals: getFormaterAttribute(decimals, attributes),\n prefscale: getFormaterAttribute(prefscale, attributes),\n };\n};\n\nconst getObservationFormaterValue = (observation, attribute) => {\n const attributeIndex = R.prop('index', attribute);\n const attributeValueIndex = R.nth(attributeIndex, observation);\n return R.nth(attributeValueIndex, R.propOr([], 'values', attribute));\n};\n\nconst getObservationFormaterValues = formaterAttributes => observation => ({\n decimals: getObservationFormaterValue(observation, R.prop('decimals', formaterAttributes)),\n prefscale: getObservationFormaterValue(observation, R.prop('prefscale', formaterAttributes)),\n});\n\nconst makeObservationFormater = formaterValues => {\n let prefscale = 0;\n if (!R.isNil(R.prop('prefscale', formaterValues))) {\n prefscale = Number(R.propOr('0', 'id', formaterValues.prefscale));\n }\n let decimals = null;\n if (!R.isNil(R.prop('decimals', formaterValues))) {\n let _decimals = Number(R.prop('id', formaterValues.decimals));\n decimals = R.is(Number, _decimals) && !Number.isNaN(_decimals) ? _decimals : null;\n }\n let format = '0,0';\n if (R.isNil(decimals)) {\n format = R.concat(format, '.[0000000]');\n } else if (decimals > 0) {\n format = R.concat(format, `.[${'0'.repeat(decimals)}]`);\n }\n return value =>\n numeral(Number(value))\n .multiply(Math.pow(10, R.negate(prefscale)))\n .format(format);\n};\n\nexport const getObservationFormater = (observation, formaterAttributes) => {\n return R.pipe(\n R.tail,\n getObservationFormaterValues(formaterAttributes),\n makeObservationFormater,\n )(observation);\n};\n\nexport const getFormatedObservation = (observation, formaterAttributes) => {\n const formater = getObservationFormater(observation, formaterAttributes);\n return formater(R.head(observation));\n};\n","import * as R from 'ramda';\nimport { categoryDisplay } from '../dimension-utils';\nimport { getFormatedObservation } from '../observation-formater';\n\nconst getDatapoints = (\n keys,\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n sortDirection,\n display,\n formaterAttrs,\n) => {\n const [categoryKey, valueKey] = keys;\n const sortFunc = dp => dp[valueKey] * sortDirection;\n\n return R.pipe(\n R.keys,\n R.map(observationKey => {\n const observationValue = R.prop(observationKey, observations);\n const value = R.head(observationValue);\n const splitKey = R.split(':', observationKey);\n const category = categoryDisplay(\n splitKey,\n dimensions,\n dimensionsWithValuesIndexedById,\n null,\n display,\n );\n const categoryIds = categoryDisplay(\n splitKey,\n dimensions,\n dimensionsWithValuesIndexedById,\n null,\n 'code',\n );\n const formatedValue = getFormatedObservation(observationValue, formaterAttrs);\n\n let key = categoryIds;\n if (R.isNil(key) || R.isEmpty(key)) {\n key = 'uniq-dp';\n }\n\n return { value, category, [valueKey]: value, [categoryKey]: category, key, formatedValue };\n }),\n R.sortBy(sortFunc),\n )(observations);\n};\n\nconst series = (\n keys,\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n sortDirection,\n display,\n formaterAttrs,\n) => {\n return [\n {\n datapoints: getDatapoints(\n keys,\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n sortDirection,\n display,\n formaterAttrs,\n ),\n },\n ];\n};\n\nexport default (\n chartType,\n { observations, dimensions },\n dimensionsWithValuesIndexedById,\n display,\n formaterAttrs,\n) => {\n switch (chartType) {\n case 'BarChart':\n return series(\n ['x', 'y'],\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n 1,\n display,\n formaterAttrs,\n );\n case 'RowChart':\n return series(\n ['y', 'x'],\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n -1,\n display,\n formaterAttrs,\n );\n default:\n return [];\n }\n};\n","import * as R from 'ramda';\nimport { dimensionValueDisplay } from '../dimension-utils';\nimport { getFormatedObservation } from '../observation-formater';\n\nfunction dimensionValueIsValid(dimensionValue, chartDimension) {\n return R.includes(\n R.prop('id', dimensionValue),\n R.map(k => R.prop(`${k}Id`, chartDimension), ['x', 'y']),\n );\n}\n\nfunction getDimensionValues(\n dimensionValuesIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimensionId,\n display,\n) {\n const dimensionsWithValuesIds = R.keys(dimensionsWithValuesIndexedById);\n return R.addIndex(R.reduce)(\n (acc, dvi, i) => {\n const dimension = R.nth(i, dimensions);\n const dimensionId = R.prop('id', dimension);\n const dimensionValue = R.nth(dvi, R.propOr([], 'values', dimension || {}));\n if (dimensionId !== chartDimensionId && R.includes(dimensionId, dimensionsWithValuesIds)) {\n return R.assoc(\n dimensionId,\n { ...dimensionValue, name: dimensionValueDisplay(display)(dimensionValue) },\n acc,\n );\n }\n return acc;\n },\n {},\n dimensionValuesIndexes,\n );\n}\n\nfunction getDimensionValueKey(chartDimension, dimensionValue) {\n return R.prop('xId', chartDimension) === R.prop('id', dimensionValue) ? 'x' : 'y';\n}\n\nfunction datapoints(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimension,\n display,\n formaterAttrs,\n) {\n const chartDimensionId = R.prop('id', chartDimension);\n const chartDimensionIndex = R.findIndex(R.propEq(chartDimensionId, 'id'), dimensions);\n const datapoints = R.reduce(\n (acc, k) => {\n const o = R.prop(k, observations);\n const oDimensionValuesIndexes = R.split(':', k);\n const oDimensionValueIndex = oDimensionValuesIndexes[chartDimensionIndex];\n const _chartDimension = R.nth(chartDimensionIndex, dimensions);\n const oDimensionValue = R.nth(\n oDimensionValueIndex,\n R.propOr([], 'values', _chartDimension || {}),\n );\n if (dimensionValueIsValid(oDimensionValue, chartDimension)) {\n const oPartialKey = R.pipe(\n R.addIndex(R.reject)((_, i) => i === chartDimensionIndex),\n R.join(':'),\n )(oDimensionValuesIndexes);\n\n if (!R.has(oPartialKey, acc)) {\n const dimensionValues = getDimensionValues(\n oDimensionValuesIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimensionId,\n display,\n );\n acc[oPartialKey] = { dimensionValues };\n }\n const dimensionValueKey = getDimensionValueKey(chartDimension, oDimensionValue);\n acc[oPartialKey][dimensionValueKey] = R.head(o);\n acc[oPartialKey][`${dimensionValueKey}Format`] = getFormatedObservation(o, formaterAttrs);\n }\n return acc;\n },\n {},\n R.keys(observations),\n );\n // it is possible to have null observations or incomplete datapoints (just an x or y)\n return R.pipe(\n R.filter(dp => !R.isNil(dp.x) && !R.isNil(dp.y)),\n R.values,\n )(datapoints);\n}\n\nconst series = (\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimension,\n display,\n formaterAttrs,\n) => {\n const values = R.pipe(\n R.prop(R.prop('id', chartDimension || {})),\n R.propOr([], 'values'),\n )(dimensionsWithValuesIndexedById);\n const xValue = R.find(R.propEq(R.prop('xId', chartDimension), 'id'), values);\n const yValue = R.find(R.propEq(R.prop('yId', chartDimension), 'id'), values);\n return [\n {\n dimensionValues: {\n x: { ...xValue, name: dimensionValueDisplay(display)(xValue) },\n y: { ...yValue, name: dimensionValueDisplay(display)(yValue) },\n },\n datapoints: datapoints(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimension,\n display,\n formaterAttrs,\n ),\n },\n ];\n};\n\nexport default (\n { observations, dimensions },\n dimensionsWithValuesIndexedById,\n chartDimension,\n display,\n formaterAttrs,\n) =>\n series(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimension,\n display,\n formaterAttrs,\n );\n","import * as R from 'ramda';\nimport { getTimePeriodDimension } from '@sis-cc/dotstatsuite-sdmxjs';\nimport { categoryDisplay, dimensionValueDisplayAt } from '../dimension-utils';\nimport { getFormatedObservation } from '../observation-formater';\n\nconst getDimensionValues = (\n splitObservationKey,\n dimensions,\n dimensionsWithValuesIndexedById,\n rejectedId,\n display,\n) =>\n R.addIndex(R.reduce)(\n (acc, dimensionValueIndex, dimensionIndex) => {\n const dimension = R.nth(dimensionIndex, dimensions) || {};\n if (R.has(dimension.id, dimensionsWithValuesIndexedById) && dimension.id !== rejectedId) {\n const dimensionValue = R.pathOr({}, ['values', dimensionValueIndex], dimension);\n return R.set(\n R.lensPath([dimensionValue.id, 'name']),\n dimensionValueDisplayAt(dimension, dimensionValueIndex, display),\n acc,\n );\n }\n return acc;\n },\n {},\n splitObservationKey,\n );\n\nconst series = (\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n timePeriodDimensionIndex,\n display,\n formaterAttrs,\n) => {\n const rawSeries = R.reduce(\n (acc, k) => {\n const o = observations[k];\n const oDimensionValuesIndexes = R.split(':', k);\n\n const timePeriodDimension = R.nth(timePeriodDimensionIndex, dimensions);\n const timePeriodDimensionValueIndex = R.nth(\n timePeriodDimensionIndex,\n oDimensionValuesIndexes,\n );\n const timePeriod = R.path(['values', timePeriodDimensionValueIndex], timePeriodDimension);\n\n const datapoint = {\n x: timePeriod.start,\n y: R.head(o),\n timeLabel: timePeriod.name,\n formatedValue: getFormatedObservation(o, formaterAttrs),\n dimensionValues: getDimensionValues(\n oDimensionValuesIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n timePeriodDimension.id,\n display,\n ),\n };\n\n const category = categoryDisplay(\n oDimensionValuesIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n timePeriodDimension.id,\n display,\n );\n let key = categoryDisplay(\n oDimensionValuesIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n timePeriodDimension.id,\n 'code',\n );\n if (R.isNil(key) || R.isEmpty(key)) {\n key = 'uniq-dp';\n }\n const serieIndex = R.findIndex(serie => serie.key === key, acc);\n\n if (serieIndex !== -1)\n return R.over(R.lensPath([serieIndex, 'datapoints']), R.append(datapoint), acc);\n\n return R.append({ datapoints: [datapoint], category, key }, acc);\n },\n [],\n R.keys(observations),\n );\n return R.map(\n serie => ({ ...serie, datapoints: R.sortBy(R.prop('x'), serie.datapoints) }),\n rawSeries,\n );\n};\n\nexport default (\n { observations, dimensions },\n dimensionsWithValuesIndexedById,\n display,\n formaterAttrs,\n) => {\n const timePeriodDimension = getTimePeriodDimension({ dimensions });\n const timePeriodDimensionIndex = timePeriodDimension ? timePeriodDimension.__index : -1;\n const timePeriodDimensionHasManyPeriods = !R.has(\n R.prop('id', timePeriodDimension),\n dimensionsWithValuesIndexedById,\n );\n if (\n !timePeriodDimensionIndex ||\n timePeriodDimensionIndex === -1 ||\n timePeriodDimensionHasManyPeriods\n )\n return [];\n\n return series(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n timePeriodDimensionIndex,\n display,\n formaterAttrs,\n );\n};\n","import * as R from 'ramda';\nimport { categoryDisplay, dimensionValueDisplay } from '../dimension-utils';\nimport { getFormatedObservation } from '../observation-formater';\n\nconst series = (\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n symbolDimension,\n sortDirection,\n display,\n formaterAttrs,\n) => {\n const symbolDimensionId = R.propOr(null, 'id', symbolDimension);\n if (symbolDimensionId === null) return [];\n const symbolDimIndex = R.findIndex(d => d.id === symbolDimensionId, dimensions);\n const datapoints = R.pipe(\n R.keys,\n R.reduce((acc, obsKey) => {\n const obs = observations[obsKey];\n if (R.isNil(R.head(obs)) || R.isEmpty(R.head(obs))) {\n return acc;\n }\n const obsDimsValsIndexes = R.split(':', obsKey);\n const symbolValIndex = Number(R.nth(symbolDimIndex, obsDimsValsIndexes));\n const symbolValId = R.path([symbolDimIndex, 'values', symbolValIndex, 'id'], dimensions);\n const symbolIndex = R.findIndex(R.propEq(symbolValId, 'id'), symbolDimension.serie);\n if (symbolIndex === -1) {\n return acc;\n }\n const category = categoryDisplay(\n obsDimsValsIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n symbolDimensionId,\n display,\n );\n const ids = categoryDisplay(\n obsDimsValsIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n symbolDimensionId,\n 'code',\n );\n const key = R.isNil(ids) || R.isEmpty(ids) ? 'uniq-dp' : ids;\n const dpIndex = R.findIndex(R.propEq(key, 'key'), acc);\n const dp = R.pipe(\n dpIndex =>\n dpIndex === -1\n ? {\n category,\n formatedValues: new Array(R.length(symbolDimension.serie)),\n values: new Array(R.length(symbolDimension.serie)),\n key,\n }\n : R.nth(dpIndex, acc),\n R.set(R.lensPath(['values', symbolValIndex]), R.head(obs)),\n R.set(\n R.lensPath(['formatedValues', symbolValIndex]),\n getFormatedObservation(obs, formaterAttrs),\n ),\n )(dpIndex);\n return dpIndex === -1 ? R.append(dp, acc) : R.set(R.lensIndex(dpIndex), dp, acc);\n }, []),\n R.sortBy(d => R.head(d.values) * sortDirection),\n )(observations);\n\n const symbolValues = R.map(dimensionValueDisplay(display), symbolDimension.serie);\n return [{ datapoints, symbolValues }];\n};\n\nexport default (\n { observations, dimensions },\n chartType,\n dimensionsWithValuesIndexedById,\n symbolDimension,\n display,\n formaterAttrs,\n) => {\n switch (chartType) {\n case 'HorizontalSymbolChart':\n return series(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n symbolDimension,\n -1,\n display,\n formaterAttrs,\n );\n case 'VerticalSymbolChart':\n return series(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n symbolDimension,\n 1,\n display,\n formaterAttrs,\n );\n default:\n return [];\n }\n};\n","import { isTimePeriodDimension } from '@sis-cc/dotstatsuite-sdmxjs';\nimport { dimensionValueDisplay } from '../dimension-utils';\nimport { getObservationFormater } from '../observation-formater';\nimport * as R from 'ramda';\n\nconst flatDatapoints = (\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n serieDimensionId,\n display,\n formaterAttrs,\n [stackKey, categoryKey],\n) => {\n const datapoints = R.mapObjIndexed((observationValue, observationKey) => {\n let category = null;\n const value = Number(R.head(observationValue));\n const formater = getObservationFormater(observationValue, formaterAttrs);\n const splittedKey = R.split(':', observationKey);\n let layerKey = [];\n const layerDimensions = R.addIndex(R.reduce)(\n (memo, dimensionValueIndex, dimensionIndex) => {\n const dimension = R.nth(dimensionIndex, dimensions);\n const _dimensionValue = R.pathOr({}, ['values', Number(dimensionValueIndex)], dimension);\n const label = dimensionValueDisplay(display)(_dimensionValue);\n const dimensionValue = {\n ..._dimensionValue,\n index: Number(dimensionValueIndex),\n label,\n };\n if (dimension.id === serieDimensionId) {\n category = dimensionValue;\n } else if (R.has(dimension.id, dimensionsWithValuesIndexedById)) {\n memo.push(dimensionValue);\n layerKey.push(dimensionValueIndex);\n }\n return memo;\n },\n [],\n splittedKey,\n );\n return {\n formater,\n [categoryKey]: category,\n [stackKey]: value,\n layerDimensions,\n layerKey: R.join(':', layerKey),\n };\n }, observations);\n\n return R.values(datapoints);\n};\n\nconst serie = (\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n singularity,\n display,\n formaterAttrs,\n [stackKey, categoryKey],\n) => {\n const serieDimensionId = R.propOr(null, 'id', singularity);\n const serieDimension = R.find(R.propEq(serieDimensionId, 'id'), dimensions);\n if (R.isNil(serieDimension)) {\n return { datapoints: [], layerSeries: [] };\n }\n const _flatDatapoints = flatDatapoints(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n serieDimensionId,\n display,\n formaterAttrs,\n [stackKey, categoryKey],\n );\n const layeredDatapoints = R.groupBy(R.prop('layerKey'), _flatDatapoints); // { [layeredKey]: [dps] }\n\n const layerFullSeries = R.map(\n datapoints => ({\n layerDimensions: R.prop('layerDimensions', R.head(datapoints)),\n layerKey: R.prop('layerKey', R.head(datapoints)),\n }),\n R.values(layeredDatapoints),\n ); // [{ layerDimensions, layerKey }]\n\n const layerLimit = R.propOr(Infinity, 'limit', singularity);\n const layerSeries = R.take(layerLimit, R.sortBy(R.prop('layerKey'), layerFullSeries));\n\n const layeredDatapointsKeyedByCategory = R.mapObjIndexed(\n R.indexBy(R.path([categoryKey, 'id'])),\n layeredDatapoints,\n ); // { [layeredKey]: { [x.id]: dp } }\n\n const datapoints = R.addIndex(R.map)((serieValue, index) => {\n const serieValueId = serieValue.id;\n const category = dimensionValueDisplay(display)(serieValue);\n const values = R.map(\n ({ layerKey }) =>\n R.pathOr(null, [layerKey, serieValueId, stackKey], layeredDatapointsKeyedByCategory),\n layerSeries,\n );\n const formaters = R.map(\n ({ layerKey }) =>\n R.pathOr(null, [layerKey, serieValueId, 'formater'], layeredDatapointsKeyedByCategory),\n layerSeries,\n );\n return {\n category,\n formaters,\n index,\n [categoryKey]: category,\n [stackKey]: values,\n key: serieValueId,\n };\n }, serieDimension.values);\n\n const _datapoints = R.when(\n R.pipe(R.length, R.equals(1)),\n R.pipe(R.set(R.lensPath([0, 'category']), ''), R.set(R.lensPath([0, categoryKey]), '')),\n datapoints,\n );\n\n return {\n datapoints: _datapoints,\n layerSeries: R.map(\n layer => ({\n id: R.pipe(R.prop('layerDimensions'), R.pluck('id'), R.join(' - '))(layer),\n label: R.pipe(R.prop('layerDimensions'), R.pluck('label'), R.join(' - '))(layer),\n }),\n layerSeries,\n ),\n };\n};\n\nconst percentSerie = stackKey =>\n R.pipe(\n R.over(\n R.lensProp('datapoints'),\n R.map(dp => {\n const total = R.pipe(\n R.map(v => Math.abs(v)),\n R.sum,\n )(dp[stackKey]);\n if (!total) {\n return dp;\n }\n return {\n ...dp,\n [stackKey]: R.map(v => (Math.abs(v) / total) * 100, dp[stackKey]),\n formaters: null,\n };\n }),\n ),\n res => R.of(Array, res),\n );\n\nconst serieSortedByTotal = stackKey =>\n R.pipe(\n R.over(\n R.lensProp('datapoints'),\n R.sortBy(\n R.pipe(\n R.prop(stackKey),\n R.map(v => (v > 0 ? R.negate(v) : 0)),\n R.sum,\n ),\n ),\n ),\n res => R.of(Array, res),\n );\n\nconst serieSortedByDataOrder = R.pipe(\n R.over(R.lensProp('datapoints'), R.sortBy(R.prop('index'))),\n res => R.of(Array, res),\n);\n\nexport default (\n { observations, dimensions },\n dimensionsWithValuesIndexedById,\n singularity,\n display,\n formaterAttrs,\n [stackKey, categoryKey],\n) => {\n const mode = R.propOr('values', 'mode', singularity);\n const serieDimensionId = R.propOr(null, 'id', singularity);\n const _serie = serie(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n singularity,\n display,\n formaterAttrs,\n [stackKey, categoryKey],\n );\n if (mode === 'percent') {\n return percentSerie(stackKey)(_serie);\n } else if (isTimePeriodDimension({ id: serieDimensionId })) {\n return serieSortedByDataOrder(_serie);\n }\n return serieSortedByTotal(stackKey)(_serie);\n};\n","import * as R from 'ramda';\nimport { getRefAreaDimension } from '@sis-cc/dotstatsuite-sdmxjs';\nimport { categoryDisplay, dimensionValueDisplay } from '../dimension-utils';\n\nconst parseByAreas = (observations, refAreaDimension) => {\n if (R.isNil(refAreaDimension)) {\n return null;\n }\n const { __index, values = [] } = refAreaDimension;\n\n return R.pipe(\n R.keys,\n R.reduce((acc, key) => {\n const value = observations[key];\n const splitedKey = R.split(':', key);\n const areaValueIndex = Number(R.nth(__index, splitedKey));\n const areaValue = isNaN(areaValueIndex) ? null : R.nth(areaValueIndex, values);\n const areaId = R.prop('id', areaValue || {});\n return R.over(\n R.lensProp(areaId),\n vals => R.append({ splitedKey, value, areaValueIndex }, vals || []),\n acc,\n );\n }, {}),\n )(observations);\n};\n\nexport default (\n { observations, dimensions },\n dimensionsWithValuesIndexedById,\n topoMap,\n display,\n) => {\n const refAreaDimension = getRefAreaDimension({ dimensions });\n const observationsByAreas = parseByAreas(observations, refAreaDimension);\n const topology = R.propOr({}, 'topology', topoMap);\n const areaSelection = R.propOr(null, 'areaSelection', topoMap);\n const topoAreas = R.pathOr(null, ['objects', areaSelection], topology);\n if (!observationsByAreas || !topoAreas) {\n return null;\n }\n const topoAreasWithData = R.map(areaGeometry => {\n const areaObservation = R.pipe(\n R.pathOr(null, ['properties', 'id']),\n id => R.propOr([], id, observationsByAreas),\n R.head,\n )(areaGeometry);\n const areaValueIndex = R.propOr(null, 'areaValueIndex', areaObservation);\n const areaValue = R.pathOr(null, ['values', areaValueIndex], refAreaDimension);\n return {\n ...areaGeometry,\n properties: {\n ...R.propOr({}, 'properties', areaGeometry),\n label: dimensionValueDisplay(display)(areaValue),\n value: R.head(R.propOr([], 'value', areaObservation)),\n category: categoryDisplay(\n R.propOr([], 'splitedKey', areaObservation),\n dimensions,\n dimensionsWithValuesIndexedById,\n refAreaDimension.id,\n display,\n ),\n },\n };\n }, topoAreas.geometries);\n return {\n objects: {\n areas: {\n type: topoAreas.type,\n geometries: topoAreasWithData,\n },\n },\n arcs: topology.arcs,\n bbox: topology.bbox,\n transform: topology.transform,\n };\n};\n","import * as R from 'ramda';\nimport sampleSeries from './sample-series';\nimport scatterSeries from './scatter-series';\nimport timelineSeries from './timeline-series';\nimport symbolSeries from './symbol-series';\nimport stackedSeries from './stacked-series';\nimport choroSeries from './choro-series';\nimport { getObservationsFormaterAttributes } from '../observation-formater';\n\nexport default ({ type, data, options, singularity }) => {\n const { display, formatterIds, map } = options;\n\n const { attributes = [] } = data;\n const formaterAttributes = getObservationsFormaterAttributes(attributes, formatterIds);\n\n const indexedDimensions = R.reduce(\n (acc, dim) => {\n if (dim.header) {\n return acc;\n }\n return R.assoc(dim.id, dim, acc);\n },\n {},\n data.dimensions || [],\n );\n\n switch (type) {\n case 'BarChart':\n case 'RowChart':\n return sampleSeries(type, data, indexedDimensions, display, formaterAttributes);\n case 'ScatterChart':\n return scatterSeries(data, indexedDimensions, singularity, display, formaterAttributes);\n case 'TimelineChart':\n return timelineSeries(data, indexedDimensions, display, formaterAttributes);\n case 'HorizontalSymbolChart':\n case 'VerticalSymbolChart':\n return symbolSeries(data, type, indexedDimensions, singularity, display, formaterAttributes);\n case 'StackedBarChart':\n return stackedSeries(data, indexedDimensions, singularity, display, formaterAttributes, [\n 'y',\n 'x',\n ]);\n case 'StackedRowChart':\n return stackedSeries(data, indexedDimensions, singularity, display, formaterAttributes, [\n 'x',\n 'y',\n ]);\n case 'ChoroplethChart':\n return choroSeries(data, indexedDimensions, map, display);\n default:\n return [];\n }\n};\n","import {\n equals,\n find,\n groupBy,\n has,\n is,\n isEmpty,\n isNil,\n length,\n map,\n not,\n omit,\n pipe,\n prop,\n propEq,\n propOr,\n reject,\n head,\n} from 'ramda';\nimport { isRefAreaDimension, isTimePeriodDimension } from '@sis-cc/dotstatsuite-sdmxjs';\nimport { parseDisplay } from '../dimension-utils';\nimport { CHORO, STACKED_BAR, STACKED_ROW, TYPES } from '../constants';\nimport { dimensionValueDisplay } from '../dimension-utils';\n\nexport const isNumber = input => {\n const value = Number(input);\n return not(isNil(value) || isNaN(value));\n};\n\nexport const isPositiveNumber = input => {\n return isNumber(input) && Number(input) >= 0;\n};\n\nexport const isNaturalInt = value => isNil(value) || /^\\d+$/.test(String(value));\n\nexport const isChart = type => has(type, TYPES);\n\nexport const hasFocus = type => has(type, omit([CHORO], TYPES));\n\nexport const getDimensionsWithValues = data =>\n pipe(\n propOr([], 'dimensions'),\n reject(d => d.header || isEmpty(d.values || [])),\n )(data);\n\nexport const toState = artefact => prop('id', artefact);\n\nexport const getPropertyDimension = property => (data, state) => {\n const dimensionId = prop(property, state);\n const { dimensions = [] } = data || {};\n\n return find(propEq(dimensionId, 'id'), dimensions);\n};\n\nexport const getGroupedDimensions = pipe(\n getDimensionsWithValues,\n groupBy(dimension => {\n if (isRefAreaDimension(dimension)) {\n return 'area';\n }\n if (isTimePeriodDimension(dimension)) {\n return 'time';\n }\n return 'other';\n }),\n);\n\nexport const optionParser = option =>\n pipe(\n option => (is(Array, option) ? head(option) : option),\n option => (is(Object, option) ? prop('value', option) : option),\n option => (is(String, option) ? option : undefined),\n )(option);\n\nexport const artefactToOption = display => artefact =>\n isNil(artefact)\n ? undefined\n : {\n label: dimensionValueDisplay(parseDisplay(display))(artefact),\n value: prop('id', artefact),\n };\n\nexport const chartDimensionToOption =\n property =>\n ({ data, display }, state) =>\n pipe(getPropertyDimension(property), artefactToOption(display))(data, state);\n\nexport const chartDimensionOptions = ({ data, type, display }, typeValidator) => {\n if (!typeValidator(type)) {\n return [];\n }\n const dimensions = getDimensionsWithValues(data);\n if ((equals(type, STACKED_BAR) || equals(type, STACKED_ROW)) && length(dimensions) === 1) {\n return [];\n }\n return map(artefactToOption(display), dimensions);\n};\n","import * as R from 'ramda';\nimport getSeries from '../factories/series';\nimport { BAR, ROW, TIMELINE } from '../constants';\nimport { hasFocus } from './utils';\nimport { dimensionValueDisplay, parseDisplay } from '../dimension-utils';\n\nconst sampleFocusTypes = { [BAR]: BAR, [ROW]: ROW, [TIMELINE]: TIMELINE };\n\nconst focusComparator = (op1, op2) => op1.value === op2.value;\n\nconst focus = (data, type, dimension, _display) => {\n const display = parseDisplay(_display);\n const id = R.prop('id', dimension);\n switch (type) {\n case 'RowChart':\n case 'BarChart':\n case 'HorizontalSymbolChart':\n case 'VerticalSymbolChart':\n case 'StackedBarChart':\n case 'StackedRowChart':\n return R.pipe(\n getSeries,\n R.pathOr([], [0, 'datapoints']),\n R.map(dp => ({ label: dp.category, value: dp.key })),\n )({ data, type, options: { display }, singularity: dimension });\n case 'TimelineChart':\n return R.pipe(\n getSeries,\n R.map(serie => ({ label: serie.category, value: serie.key })),\n )({ data, type, options: { display }, singularity: dimension });\n case 'ScatterChart':\n if (R.isNil(id)) return [];\n return R.pipe(\n R.propOr([], 'dimensions'),\n R.reduce((acc, dim) => {\n if (dim.header || dim.id === id) {\n return acc;\n }\n const dimOptions = R.map(\n val => ({\n label: `${dimensionValueDisplay(display)(dim)} - ${dimensionValueDisplay(display)(val)}`,\n options: { dimensionId: dim.id, dimensionValueId: val.id },\n value: `${dim.id}-${val.id}`,\n }),\n R.propOr([], 'values', dim),\n );\n return R.concat(acc, dimOptions);\n }, []),\n )(data);\n default:\n return [];\n }\n};\n\nexport const parseFocus = (data, type, dimension, display, { baseline, highlight }) => {\n const options = focus(data, type, dimension, display);\n const optionsSet = new Set(R.pluck('value', options));\n\n const parseSelection = R.reject(({ value }) => !optionsSet.has(value));\n\n return { baseline: parseSelection(baseline), highlight: parseSelection(highlight) };\n};\n\nexport const focusOptions = (props, state, otherFocus, singularity) => {\n if (!hasFocus(props.type)) {\n return [];\n }\n const options = focus(props.data, props.type, singularity, props.display);\n return R.differenceWith(focusComparator, options, R.prop(otherFocus, state));\n};\n\nexport const onChangeFocusSelection = _value => {\n const value = R.isNil(_value) ? [] : _value;\n return R.is(Array, value) ? value : [value];\n};\n\nconst toKey = () => R.prop('value');\n\nconst filterFocus = (focus, keyedOptions, type) =>\n R.reduce(\n (acc, entry) => {\n const entryKey = toKey(type)(entry);\n if (R.has(entryKey, keyedOptions)) {\n return R.append(R.prop(entryKey, keyedOptions), acc);\n }\n return acc;\n },\n [],\n focus,\n );\n\nexport const focusStateFromNewProps = ({ data, display, type }, singularity, state) => {\n const highlightState = R.propOr([], 'highlight', state);\n const baselineState = R.propOr([], 'baseline', state);\n const options = focus(data, type, singularity, display);\n const keyedOptions = R.indexBy(toKey(type), options);\n return {\n baseline: filterFocus(baselineState, keyedOptions, R.prop('type', state)),\n highlight: filterFocus(highlightState, keyedOptions, R.prop('type', state)),\n };\n};\n\n/*\n This props/state parser which will be exposed in highlight/baseline properties,\n only deals for Bar and Row Chart (no chart dimension singularity involved).\n For other chart types, their own chart dimension singularity parser will handle focus management.\n*/\n\nexport const sampleFocusStateFromNewProps = (props, state) => {\n if (!R.has(props.type, sampleFocusTypes) || R.isNil(props.data)) {\n return {}; //no changes\n }\n return focusStateFromNewProps(props, null, state);\n};\n","import * as R from 'ramda';\nimport { isRefAreaDimension } from '@sis-cc/dotstatsuite-sdmxjs';\nimport { SCATTER } from '../constants';\nimport { artefactToOption, getDimensionsWithValues, getPropertyDimension, toState } from './utils';\nimport { focusStateFromNewProps } from './focus';\n\nconst getScatterDimension = getPropertyDimension('scatterDimension');\n\nconst toScatterState = (dim, xVal, yVal) => ({\n scatterDimension: toState(dim),\n scatterX: toState(xVal),\n scatterY: toState(yVal),\n});\n\nexport const toScatterSingularity = state => ({\n id: R.prop('scatterDimension', state),\n xId: R.prop('scatterX', state),\n yId: R.prop('scatterY', state),\n});\n\nexport const isScatter = type => type === SCATTER;\n\nexport const scatterValueOptions = ({ data, type, display }, state) => {\n if (!isScatter(type)) {\n return [];\n }\n const scatterDimension = getScatterDimension(data, state);\n if (R.isNil(scatterDimension)) {\n return [];\n }\n return R.map(artefactToOption(display), R.prop('values', scatterDimension));\n};\n\nexport const onChangeScatterDim = (props, state) => value => {\n const { data } = props;\n const dimension = getScatterDimension(data, { scatterDimension: value });\n if (R.isNil(dimension)) {\n return {};\n }\n\n const [xVal, yVal] = R.take(2, R.prop('values', dimension));\n\n const newScatterState = toScatterState(dimension, xVal, yVal);\n\n return {\n ...newScatterState,\n ...focusStateFromNewProps(props, toScatterSingularity(newScatterState), state),\n };\n};\n\nexport const scatterStateValueToOption = (property, props, state) => {\n const dimension = getScatterDimension(props.data, state);\n if (R.isNil(dimension) || !isScatter(props.type)) {\n return undefined;\n }\n const value = R.find(R.propEq(R.prop(property, state), 'id'), R.prop('values', dimension));\n return artefactToOption(props.display)(value);\n};\n\nexport const onChangeScatterVal =\n ({ data, type }, state, valKey, otherValKey) =>\n value => {\n const options = scatterValueOptions({ data, type }, state);\n const [matching, otherOptions] = R.partition(R.propEq(value, 'value'), options);\n if (R.isEmpty(matching)) {\n return {};\n }\n const stateOtherValue = R.prop(otherValKey, state);\n return {\n [valKey]: value,\n [otherValKey]:\n stateOtherValue === value ? R.prop('value', R.head(otherOptions)) : stateOtherValue,\n };\n };\n\n//----------------------------------------------------------------------------------------------------\n\nexport const scatterStateFromNewProps = (props, state) => {\n const { data, type } = props;\n const undefinedState = toScatterState(undefined, undefined, undefined);\n if (!isScatter(type)) {\n return undefinedState;\n }\n if (R.isNil(data)) {\n return {};\n }\n const dimensions = getDimensionsWithValues(data);\n if (R.isEmpty(dimensions)) {\n return { ...undefinedState, highlight: [], baseline: [] };\n }\n\n let scatterDimension = getScatterDimension(props.data, state);\n if (R.isNil(scatterDimension)) {\n const refinedDimensions = R.reject(isRefAreaDimension, dimensions);\n scatterDimension = R.head(R.isEmpty(refinedDimensions) ? dimensions : refinedDimensions);\n }\n\n const values = R.prop('values', scatterDimension);\n\n const stateScatterX = R.prop('scatterX', state);\n let stateScatterY = R.prop('scatterY', state);\n\n if (stateScatterX === stateScatterY) {\n stateScatterY = undefined;\n }\n\n let _scatterX = undefined;\n let _scatterY = undefined;\n\n R.forEach(value => {\n if (R.prop('id', value) === stateScatterX) {\n _scatterX = value;\n } else if (R.prop('id', value) === stateScatterY) {\n _scatterY = value;\n }\n }, values);\n\n //dirty as f\n const scatterX = R.isNil(_scatterX)\n ? R.head(R.reject(R.propEq(R.prop('id', _scatterY), 'id'), values))\n : _scatterX;\n const scatterY = R.isNil(_scatterY)\n ? R.head(R.reject(R.propEq(R.prop('id', scatterX), 'id'), values))\n : _scatterY;\n\n const scatterState = toScatterState(scatterDimension, scatterX, scatterY);\n\n return {\n ...scatterState,\n ...focusStateFromNewProps(props, toScatterSingularity(scatterState), state),\n };\n};\n","import * as R from 'ramda';\nimport { H_SYMBOL, V_SYMBOL } from '../constants';\nimport {\n getDimensionsWithValues,\n getGroupedDimensions,\n getPropertyDimension,\n toState,\n} from './utils';\nimport { focusStateFromNewProps } from './focus';\n\nconst getSymbolDimension = getPropertyDimension('symbolDimension');\n\nexport const isSymbol = type => type === H_SYMBOL || type === V_SYMBOL;\n\nconst toSymbolState = dimension => ({\n symbolDimension: toState(dimension),\n});\n\nexport const toSymbolSingularity = (data, state) => {\n const symbolDimension = getSymbolDimension(data, state);\n const res = {\n id: R.isNil(symbolDimension) ? undefined : R.prop('id', symbolDimension),\n serie: R.pipe(\n R.prop('values'),\n values => (R.isNil(values) ? [] : values),\n R.take(5),\n )(symbolDimension),\n };\n return res;\n};\n\nexport const symbolStateFromNewProps = (props, state) => {\n const { data, type } = props;\n if (!isSymbol(type)) {\n return toSymbolState(undefined);\n }\n if (R.isNil(data)) {\n return {};\n }\n const dimensions = getDimensionsWithValues(data);\n if (R.isEmpty(dimensions)) {\n return { ...toSymbolState(undefined), baseline: [], highlight: [] };\n }\n let symbolDimension = getSymbolDimension(data, state);\n if (R.isNil(symbolDimension)) {\n const { area, other, time } = getGroupedDimensions(data);\n if (!R.isNil(other) && !R.isEmpty(other)) {\n symbolDimension = R.head(other);\n } else if (!R.isNil(time) && !R.isEmpty(time)) {\n symbolDimension = R.head(time);\n } else {\n symbolDimension = R.head(area);\n }\n }\n const symbolState = toSymbolState(symbolDimension);\n return {\n ...symbolState,\n ...focusStateFromNewProps(props, toSymbolSingularity(data, symbolState), state),\n };\n};\n\nexport const onChangeSymbolDim =\n ({ data }) =>\n option => {\n const dimension = getSymbolDimension(data, { symbolDimension: option });\n if (R.isNil(dimension)) {\n return {};\n }\n return {\n ...toSymbolState(dimension),\n highlight: [],\n baseline: [],\n };\n };\n","import * as R from 'ramda';\nimport { PERCENT, STACKED_BAR, STACKED_ROW, VALUES } from '../constants';\nimport {\n getDimensionsWithValues,\n getGroupedDimensions,\n getPropertyDimension,\n toState,\n} from './utils';\nimport { focusStateFromNewProps } from './focus';\n\nconst getStackedDimension = getPropertyDimension('stackedDimension');\n\nconst stackedModes = { [PERCENT]: PERCENT, [VALUES]: VALUES };\n\nexport const isStacked = type => type === STACKED_BAR || type === STACKED_ROW;\n\nconst toStackedState = (dimension, mode) => ({\n stackedDimension: toState(dimension),\n stackedMode: mode,\n});\n\nexport const toStackedSingularity = state => ({\n id: R.prop('stackedDimension', state),\n mode: R.prop('stackedMode', state),\n limit: 5,\n});\n\nexport const onChangeStackedDimension =\n ({ data }, state) =>\n value => {\n const dimension = getStackedDimension(data, { stackedDimension: value });\n if (R.isNil(dimension)) {\n return {};\n }\n return {\n stackedDimension: toState(dimension),\n highlight: [],\n baseline: [],\n };\n };\n\nexport const stackedModeOptions = [{ value: VALUES }, { value: PERCENT }];\n\nexport const isStackedDimActive = ({ data, type }) => {\n const dimensions = getDimensionsWithValues(data);\n if (R.length(dimensions) < 2) {\n return false;\n }\n return isStacked(type);\n};\n\nexport const onChangeStackedMode = value =>\n R.has(value, stackedModes) ? { stackedMode: value } : {};\n\nexport const stackedStateFromNewProps = (props, state) => {\n const { data, type } = props;\n if (!isStacked(type)) {\n return toStackedState(undefined, undefined);\n }\n if (R.isNil(data)) {\n return {};\n }\n const dimensions = getDimensionsWithValues(data);\n if (R.isEmpty(dimensions)) {\n return { ...toStackedState(undefined, undefined), baseline: [], highlight: [] };\n }\n\n let dimension = getStackedDimension(data, state);\n if (R.isNil(dimension)) {\n if (R.length(dimensions) === 1) {\n dimension = R.find(R.prop('header'), data.dimensions);\n } else {\n const { area, time, other } = getGroupedDimensions(data);\n if (!R.isNil(area) && !R.isEmpty(area)) {\n dimension = R.head(area);\n } else if (!R.isNil(time) && !R.isEmpty(time)) {\n dimension = R.head(time);\n } else {\n dimension = R.head(other);\n }\n }\n }\n const _mode = R.prop('stackedMode', state);\n const mode = R.has(_mode, stackedModes) ? _mode : VALUES;\n const stackedState = toStackedState(dimension, mode);\n return {\n ...stackedState,\n ...focusStateFromNewProps(props, toStackedSingularity(stackedState), state),\n };\n};\n","import * as R from 'ramda';\nimport {\n BAR,\n H_SYMBOL,\n ROW,\n SCATTER,\n STACKED_BAR,\n STACKED_ROW,\n TIMELINE,\n V_SYMBOL,\n} from '../constants';\nimport { isNumber, isPositiveNumber } from './utils';\nimport { isStacked } from './stacked';\n\nconst hasXLinear = type => R.includes(type, [H_SYMBOL, ROW, SCATTER, STACKED_ROW]);\n\nconst hasYLinear = type => R.includes(type, [BAR, SCATTER, STACKED_BAR, TIMELINE, V_SYMBOL]);\n\nconst hasXPivot = type => R.equals(ROW, type);\nconst hasYPivot = type => R.equals(BAR, type);\n\nconst xInitialState = {\n computedMaxX: undefined,\n computedMinX: undefined,\n computedStepX: undefined,\n computedPivotX: undefined,\n maxX: undefined,\n minX: undefined,\n pivotX: undefined,\n stepX: undefined,\n};\n\nconst yInitialState = {\n computedMaxY: undefined,\n computedMinY: undefined,\n computedStepY: undefined,\n computedPivotY: undefined,\n maxY: undefined,\n minY: undefined,\n pivotY: undefined,\n stepY: undefined,\n};\n\nexport const initialState = { ...xInitialState, ...yInitialState };\n\nexport const linearStateFromNewProps = type => {\n const xLinearState = hasXLinear(type) ? {} : xInitialState;\n const YLinearState = hasYLinear(type) ? {} : yInitialState;\n return {\n ...xLinearState,\n ...R.when(R.always(isStacked(type)), R.assoc('pivotY', 0))(YLinearState),\n };\n};\n\nexport const toProperties = (props, state, onChange) => ({\n maxX: {\n id: 'maxX',\n isActive: hasXLinear(props.type),\n onChange: value =>\n onChange({\n maxX: isNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.maxX) ? String(state.computedMaxX) : state.maxX,\n },\n maxY: {\n id: 'maxY',\n isActive: hasYLinear(props.type),\n onChange: value =>\n onChange({\n maxY: isNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.maxY) ? String(state.computedMaxY) : state.maxY,\n },\n minX: {\n id: 'minX',\n isActive: hasXLinear(props.type),\n onChange: value =>\n onChange({\n minX: isNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.minX) ? String(state.computedMinX) : state.minX,\n },\n minY: {\n id: 'minY',\n isActive: hasYLinear(props.type),\n onChange: value =>\n onChange({\n minY: isNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.minY) ? String(state.computedMinY) : state.minY,\n },\n pivotX: {\n id: 'pivotX',\n isActive: hasXPivot(props.type),\n onChange: value =>\n onChange({\n pivotX: isNumber(value) ? value : undefined,\n }),\n value: R.when(\n v => R.isNil(v) && (R.propEq(ROW, 'type')(props) || R.propEq(STACKED_ROW, 'type')(props)),\n R.always(0),\n )(R.isNil(state.pivotX) ? String(state.computedPivotX) : state.pivotX),\n },\n pivotY: {\n id: 'pivotY',\n isActive: hasYPivot(props.type),\n onChange: value =>\n onChange({\n pivotY: isNumber(value) ? value : undefined,\n }),\n value: R.when(\n v => R.isNil(v) && (R.propEq(BAR, 'type')(props) || R.propEq(STACKED_BAR, 'type')(props)),\n R.always(0),\n )(R.isNil(state.pivotY) ? String(state.computedPivotY) : state.pivotY),\n },\n stepX: {\n id: 'stepX',\n isActive: hasXLinear(props.type),\n onChange: value =>\n onChange({\n stepX: isPositiveNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.stepX) ? String(state.computedStepX) : state.stepX,\n },\n stepY: {\n id: 'stepY',\n isActive: hasYLinear(props.type),\n onChange: value =>\n onChange({\n stepY: isPositiveNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.stepY) ? String(state.computedStepY) : state.stepY,\n },\n});\n","import * as R from 'ramda';\nimport { dimensionValueDisplay, parseDisplay } from '../dimension-utils';\nimport { isChart } from './utils';\n\nconst isCustomInvalid =\n ({ type }) =>\n value =>\n R.isNil(value) || !isChart(type);\n\nconst getDataflowName = props => {\n const dataflow = R.propOr({}, 'dataflow', props);\n const display = parseDisplay(props.display);\n return dimensionValueDisplay(display)(dataflow);\n};\n\nexport const getSourceLabel = (props, state) =>\n R.when(\n isCustomInvalid({ type: props.type }),\n R.always(getDataflowName(props)),\n )(state.sourceLabel);\n\nexport const getFooterProps = (props, state) => ({\n withCopyright: isChart(props.type) ? state.withCopyright : true,\n withLogo: isChart(props.type) ? state.withLogo : true,\n sourceLabel: getSourceLabel(props, state),\n});\n","import * as R from 'ramda';\n\nexport const stringifySubtitle = R.pipe(\n R.map(({ header, label }) => (R.isNil(header) ? label : `${header} ${label}`)),\n R.join(' · '),\n);\n","import * as R from 'ramda';\nimport { H_SYMBOL, SCATTER, STACKED_BAR, STACKED_ROW, TIMELINE, V_SYMBOL } from '../constants';\nimport { onChangeFocusSelection, focusOptions, sampleFocusStateFromNewProps } from './focus';\nimport {\n isScatter,\n onChangeScatterDim,\n onChangeScatterVal,\n scatterStateFromNewProps,\n scatterStateValueToOption,\n scatterValueOptions,\n toScatterSingularity,\n} from './scatter';\nimport {\n isSymbol,\n onChangeSymbolDim,\n symbolStateFromNewProps,\n toSymbolSingularity,\n} from './symbol';\nimport {\n isStacked,\n isStackedDimActive,\n onChangeStackedDimension,\n onChangeStackedMode,\n stackedModeOptions,\n stackedStateFromNewProps,\n toStackedSingularity,\n} from './stacked';\nimport {\n linearStateFromNewProps,\n initialState as linearInitialState,\n toProperties as toLinearProperties,\n} from './linear';\nimport {\n chartDimensionOptions,\n chartDimensionToOption,\n hasFocus,\n isChart,\n isNaturalInt,\n optionParser,\n} from './utils';\nimport { getSourceLabel } from './getHeaderProps';\nimport { stringifySubtitle } from './getStringifiedSubtitle';\n\n/*\n - width/height -> initial undefined, if undefined or blank, replaced by options.base\n*/\n\nexport const toSingularity = ({ data, type }, state) => {\n switch (type) {\n case SCATTER:\n return toScatterSingularity(state);\n case H_SYMBOL:\n case V_SYMBOL:\n return toSymbolSingularity(data, state);\n case STACKED_BAR:\n case STACKED_ROW:\n return toStackedSingularity(state);\n default:\n return null;\n }\n};\n\nconst toFloat = value => {\n const float = parseFloat(value);\n return isNaN(float) ? undefined : float;\n};\n\nconst toOption = (stateValue, optionValue) =>\n R.isNil(stateValue) ? optionValue : toFloat(stateValue);\n\nconst getFreqStepOption = (props, state) => {\n if (props.type !== TIMELINE) {\n return null;\n }\n const inputState = toFloat(state.freqStep);\n return R.isNil(inputState) ? 1 : inputState;\n};\n\nexport const toChartOptions = (props, state) => {\n const options = R.propOr({}, 'options', props);\n const base = R.propOr({}, 'base', options);\n const axis = R.propOr({}, 'axis', options);\n const axeX = R.propOr({}, 'x', axis);\n const axeY = R.propOr({}, 'y', axis);\n const linearX = R.propOr({}, 'linear', axeX);\n const linearY = R.propOr({}, 'linear', axeY);\n const tickX = R.propOr({}, 'tick', axeX);\n const pivotX = R.propOr({}, 'pivot', linearX);\n const pivotY = R.propOr({}, 'pivot', linearY);\n const map = R.propOr({}, 'map', props);\n return {\n ...options,\n axis: {\n ...axis,\n x: {\n ...axeX,\n tick: {\n ...tickX,\n step: getFreqStepOption(props, state),\n },\n linear: {\n ...linearX,\n max: toOption(state.maxX, linearX.max),\n min: toOption(state.minX, linearX.min),\n pivot: {\n value: toOption(state.pivotX, pivotX.value),\n },\n step: toOption(props.type === TIMELINE ? 1 : state.stepX, linearX.step),\n },\n },\n y: {\n ...axeY,\n linear: {\n ...linearY,\n max: toOption(state.maxY, linearY.max),\n min: toOption(state.minY, linearY.min),\n pivot: {\n value: toOption(state.pivotY, pivotY.value),\n },\n step: toOption(state.stepY, linearY.step),\n },\n },\n },\n map: R.pick(['projection', 'scale'], map),\n base: {\n ...base,\n height: toOption(state.fixedHeight, base.height),\n width: toOption(state.fixedWidth, base.width),\n },\n };\n};\n\nexport const stateFromNewProps = (props, state) => {\n const focusState = sampleFocusStateFromNewProps(props, state);\n const scatterState = scatterStateFromNewProps(props, state);\n const symbolState = symbolStateFromNewProps(props, state);\n const stackedState = stackedStateFromNewProps(props, state);\n const linearState = linearStateFromNewProps(props.type);\n return {\n ...focusState,\n ...scatterState,\n ...symbolState,\n ...stackedState,\n ...linearState,\n fixedWidth: R.prop('fixedWidth', state),\n fixedHeight: R.prop('fixedHeight', state),\n responsiveWidth: R.prop('responsiveWidth', state),\n responsiveHeight: R.prop('responsiveHeight', state),\n freqStep: props.type === TIMELINE ? R.prop('freqStep', state) || '1' : undefined,\n type: R.prop('type', props),\n };\n};\n\nexport const toProperties = (props, state, onChange) => ({\n ...toLinearProperties(props, state, onChange),\n highlight: {\n id: 'highlight',\n isActive: hasFocus(props.type),\n onChange: R.pipe(onChangeFocusSelection, selection => {\n onChange({ highlight: selection });\n }),\n options: focusOptions(props, state, 'baseline', toSingularity(props, state)),\n value: R.prop('highlight', state),\n },\n baseline: {\n id: 'baseline',\n isActive: hasFocus(props.type),\n onChange: R.pipe(onChangeFocusSelection, selection => onChange({ baseline: selection })),\n options: focusOptions(props, state, 'highlight', toSingularity(props, state)),\n value: R.prop('baseline', state),\n },\n width: {\n id: 'width',\n isActive: isChart(props.type),\n onChange: value =>\n onChange({\n fixedWidth: isNaturalInt(value) ? value : undefined,\n }),\n placeholder: R.when(R.complement(R.isNil), value => String(Math.floor(Number(value))))(\n state.responsiveWidth,\n ),\n value: R.prop('fixedWidth', state),\n },\n height: {\n id: 'height',\n isActive: isChart(props.type),\n onChange: value =>\n onChange({\n fixedHeight: isNaturalInt(value) ? value : undefined,\n }),\n placeholder: R.when(R.complement(R.isNil), value => String(Math.floor(Number(value))))(\n state.responsiveHeight,\n ),\n },\n freqStep: {\n id: 'freqStep',\n isActive: props.type === TIMELINE,\n onChange: value =>\n onChange({\n freqStep: isNaturalInt(value) ? String(value) : undefined,\n }),\n value: R.prop('freqStep', state),\n },\n title: {\n id: 'title',\n isActive: isChart(props.type),\n isDefault: R.isNil(state.title),\n onChange: value => onChange({ title: value }),\n value:\n R.isNil(state.title) || R.isEmpty(state.title)\n ? R.pathOr('', ['title', 'label'], props)\n : state.title,\n onReset: R.isNil(state.title) ? null : () => onChange({ title: null }),\n },\n subtitle: {\n id: 'subtitle',\n isActive: isChart(props.type),\n isDefault: R.isNil(state.subtitle),\n onChange: value => onChange({ subtitle: value }),\n value:\n R.isNil(state.subtitle) || R.isEmpty(state.subtitle)\n ? stringifySubtitle(props.subtitle || [])\n : state.subtitle,\n onReset: R.isNil(state.subtitle) ? null : () => onChange({ subtitle: null }),\n },\n source: {\n id: 'source',\n isActive: isChart(props.type),\n isDefault: R.isNil(state.sourceLabel),\n onChange: value => onChange({ sourceLabel: value }),\n value: getSourceLabel(props, state),\n onReset: R.isNil(state.sourceLabel) ? null : () => onChange({ sourceLabel: null }),\n },\n scatterDimension: {\n id: 'scatterDimension',\n isActive: isScatter(props.type),\n onChange: R.pipe(optionParser, onChangeScatterDim(props, state), onChange),\n options: chartDimensionOptions(props, isScatter),\n value: chartDimensionToOption('scatterDimension')(props, state),\n },\n scatterX: {\n id: 'scatterX',\n isActive: isScatter(props.type),\n onChange: R.pipe(\n optionParser,\n onChangeScatterVal(props, state, 'scatterX', 'scatterY'),\n onChange,\n ),\n options: scatterValueOptions(props, state),\n value: scatterStateValueToOption('scatterX', props, state),\n },\n scatterY: {\n id: 'scatterY',\n isActive: isScatter(props.type),\n onChange: R.pipe(\n optionParser,\n onChangeScatterVal(props, state, 'scatterY', 'scatterX'),\n onChange,\n ),\n options: scatterValueOptions(props, state),\n value: scatterStateValueToOption('scatterY', props, state),\n },\n symbolDimension: {\n id: 'symbolDimension',\n isActive: isSymbol(props.type),\n options: chartDimensionOptions(props, isSymbol),\n onChange: R.pipe(optionParser, onChangeSymbolDim(props), onChange),\n value: chartDimensionToOption('symbolDimension')(props, state),\n },\n stackedDimension: {\n id: 'stackedDimension',\n isActive: isStackedDimActive(props),\n options: chartDimensionOptions(props, isStacked),\n onChange: R.pipe(optionParser, onChangeStackedDimension(props, state), onChange),\n value: chartDimensionToOption('stackedDimension')(props, state),\n },\n stackedMode: {\n id: 'stackedMode',\n isActive: isStacked(props.type),\n options: stackedModeOptions,\n onChange: R.pipe(optionParser, onChangeStackedMode, onChange),\n value: R.prop('stackedMode', state),\n },\n logo: {\n id: 'logo',\n isActive: isChart(props.type),\n checked: !state.withLogo,\n onChange: () => onChange({ withLogo: !state.withLogo }),\n },\n copyright: {\n id: 'copyright',\n isActive: isChart(props.type),\n checked: !state.withCopyright,\n onChange: () => onChange({ withCopyright: !state.withCopyright }),\n },\n});\n","import * as R from 'ramda';\n\nconst NOT_DISPLAYED = 'NOT_DISPLAYED';\n\nexport const getIsHidden = annotations =>\n R.pipe(R.find(R.propEq(NOT_DISPLAYED, 'type')), R.complement(R.isNil))(annotations);\n\nexport const getFullName = R.identity;\n","import * as R from 'ramda';\nimport * as dateFns from 'date-fns';\nimport { fr, de, enUS as en, es, ar, it, nl, th } from 'date-fns/locale';\n\nconst isValidDate = period =>\n R.and(dateFns.isDate, date => R.not(R.equals(date.getTime(date), NaN)))(new Date(period));\n\nexport const dateWithoutTZ = date => dateFns.addMinutes(date, date.getTimezoneOffset());\n\nexport const getLocale = R.cond([\n [R.equals('fr'), R.always(fr)],\n [R.equals('de'), R.always(de)],\n [R.equals('es'), R.always(es)],\n [R.equals('ar'), R.always(ar)],\n [R.equals('it'), R.always(it)],\n [R.equals('nl'), R.always(nl)],\n [R.equals('th'), R.always(th)],\n [R.T, R.always(en)],\n]);\n\nconst formaterPeriod = (locale, format) => date =>\n dateFns.format(date, format, { locale: getLocale(locale) });\n\nexport const getReportedTimePeriodLabel =\n (freq, _format, locale) =>\n (reportYearStart, { id, start, reportedStart }) => {\n const year = dateFns.getYear(start);\n const reportStartDate = new Date(year, reportYearStart.month, reportYearStart.day);\n const isReportFirstDate = dateFns.isEqual(reportStartDate, new Date(year, 1, 1));\n if (isReportFirstDate || freq === 'D') {\n return R.isNil(_format) || freq !== 'M'\n ? id\n : dateFns.format(start, _format, { locale: getLocale(locale) });\n }\n const nextYear = year + 1;\n if (freq === 'A') {\n return `${year}/${nextYear}`;\n }\n if (freq === 'S') {\n const [semester] = R.match(/S\\d/, id);\n return `${year}/${nextYear}-${semester}`;\n }\n if (freq === 'Q') {\n const [quarter] = R.match(/Q\\d/, id);\n return `${year}/${nextYear}-${quarter}`;\n }\n if (freq === 'M') {\n const isFirstDayOfMonth = dateFns.isFirstDayOfMonth(reportedStart);\n if (isFirstDayOfMonth) {\n return R.isNil(_format)\n ? id\n : dateFns.format(reportedStart, _format, { locale: getLocale(locale) });\n }\n const [month] = R.match(/M[\\d]{2}/, id);\n return `${year}/${nextYear}-${month}`;\n }\n const [week] = R.match(/W[\\d]{2}/, id);\n return `${year}/${nextYear}-${week}`;\n };\n\nexport const getReportedTimePeriod = (reportYearStart, value, freq) => {\n let start = new Date(R.prop('start', value));\n let end = dateWithoutTZ(new Date(R.prop('end', value)));\n if (reportYearStart.month === '01' && reportYearStart.day === '01') {\n return { start, end };\n }\n start = dateFns.addMonths(start, reportYearStart.month - 1);\n start = dateFns.addDays(start, reportYearStart.day - 1);\n if (freq === 'A') {\n end = dateFns.addYears(start, 1);\n }\n if (freq === 'S') {\n end = dateFns.addMonths(start, 6);\n }\n if (freq === 'Q') {\n end = dateFns.addMonths(start, 3);\n }\n if (freq === 'M') {\n end = dateFns.addMonths(start, 6);\n }\n if (freq === 'W' || freq === 'B') {\n end = dateFns.addDays(start, 7);\n }\n if (freq === 'D') {\n end = dateFns.addDays(start, 1);\n }\n if (freq === 'H') {\n end = dateFns.addHours(start, 1);\n }\n if (freq === 'N') {\n end = dateFns.addMinutes(start, 1);\n }\n end = dateFns.subSeconds(end, 1);\n return { start, end };\n};\n\nexport const getReportedTimePeriodNote = (reportYearStart, start, end, freq) => {\n if (reportYearStart.month === '01' && reportYearStart.day === '01') {\n return null;\n }\n if (R.includes(freq, ['D', 'H', 'N'])) {\n return null;\n }\n const isFirstDayOfMonth = dateFns.isFirstDayOfMonth(start);\n if (freq === 'M' && isFirstDayOfMonth) {\n return null;\n }\n const formatedStart = dateFns.format(start, 'yyyy-MM-dd');\n const formatedEnd = dateFns.format(end, 'yyyy-MM-dd');\n return { value: { name: `${formatedStart} - ${formatedEnd}` } };\n};\n\nexport const getTimePeriodLabel = (locale, format = 'yyyy MMM') =>\n R.pipe(R.when(R.isNil, R.always('')), R.when(isValidDate, formaterPeriod(locale, format)));\n","export const SDMX_3_0_JSON_DATA_FORMAT = 'application/vnd.sdmx.data+json;version=2.0';\nexport const SDMX_3_0_CSV_DATA_FORMAT = 'application/vnd.sdmx.data+csv;version=2.0';\nexport const EMPTY_ATTACHMENT_LEVEL_CHAR = '~';\nexport const REPORTING_YEAR_START_DAY = 'REPORTING_YEAR_START_DAY';\nexport const REPYEARSTART = 'REPYEARSTART';\nexport const REJECTED_VALUE_IDS = ['_L', '_T', '_Z'];\n","import * as R from 'ramda';\nimport { EMPTY_ATTACHMENT_LEVEL_CHAR } from './constants';\n\nconst dimensionValueDisplay = display => data => {\n if (display === 'code') {\n return R.prop('id', data);\n }\n const name = R.prop('name')(data);\n if (display === 'both') {\n return `${R.prop('id', data)}: ${name}`;\n }\n return name;\n};\n// options = { locale, display, dimensions = [], attributes = { [id]: { format, parent } } };\nexport const parseMetadataSeries = (metadataJson, options) => {\n const metadataAttributes = R.pathOr(\n [],\n ['data', 'structures', 0, 'attributes', 'dimensionGroup'],\n metadataJson,\n );\n const metaAttrLength = R.length(metadataAttributes);\n\n if (!metaAttrLength) {\n return {};\n }\n\n const dimensions = R.pipe(\n R.pathOr([], ['data', 'structures', 0, 'dimensions']),\n ({ series = [], observation = [] }) => R.concat(series, observation),\n dims =>\n R.isEmpty(options.dimensions || [])\n ? dims\n : R.props(R.pluck('id', options.dimensions), R.indexBy(R.prop('id'), dims)),\n )(metadataJson);\n\n const { notDisplayedIds = {} } = options;\n\n const metadataSeries = R.pipe(\n R.pathOr({}, ['data', 'dataSets', 0, 'dimensionGroupAttributes']),\n series =>\n R.reduce(\n (acc, serieKey) => {\n const indexes = series[serieKey];\n const metaIndexes = R.take(metaAttrLength, indexes);\n\n const evolvedKey = R.pipe(\n R.split(':'),\n R.addIndex(R.map)((vInd, dInd) => {\n if (R.isEmpty(vInd) || R.equals(EMPTY_ATTACHMENT_LEVEL_CHAR, vInd)) {\n return '';\n }\n const dim = R.nth(dInd, dimensions);\n const val = R.nth(Number(vInd), dim.values || []);\n\n const originalVal = R.find(R.propEq(val.id, 'id'))(\n R.propOr([], 'values', R.nth(dInd, options.dimensions)),\n );\n return R.propOr('', '__index', originalVal);\n }),\n R.join(':'),\n )(serieKey);\n\n const attributes = R.pipe(\n R.addIndex(R.reduce)((acc, valueIndex, attrIndex) => {\n const attribute = R.nth(attrIndex, metadataAttributes);\n const isHidden = R.has(attribute.id, notDisplayedIds);\n if ((R.isNil(valueIndex) && !attribute.isPresentational) || isHidden) {\n return acc;\n }\n const attrOptions = R.pathOr({}, ['attributes', attribute.id], options);\n const id = attrOptions.id;\n const label = dimensionValueDisplay(options.display)({ ...attribute, id });\n\n const _value = R.prop('value', R.nth(valueIndex, attribute.values || []));\n const value = R.is(Object, _value) ? R.prop(options.locale, _value) : _value;\n\n return R.append(\n {\n ...(R.isNil(value) ? {} : { value }),\n id: attribute.id,\n label,\n handlerProps: R.omit(['id'], R.pathOr({}, ['attributes', attribute.id], options)),\n },\n acc,\n );\n }, []),\n attributes => {\n // missing parents in metadata response\n const groupedAttrs = R.groupBy(\n R.pathOr('#ROOT', ['handlerProps', 'parent']),\n attributes,\n );\n const indexedAttrs = R.indexBy(R.prop('id'), attributes);\n\n return R.reduce(\n (acc, id) => {\n if (R.has(id, indexedAttrs) || id === '#ROOT') {\n return acc;\n }\n return R.append(\n {\n id,\n label: dimensionValueDisplay(options.display)({\n id,\n name: R.path(['attributes', id, 'name'], options),\n }),\n handlerProps: R.omit(['id'], R.pathOr({}, ['attributes', id], options)),\n },\n acc,\n );\n },\n attributes,\n R.keys(groupedAttrs),\n );\n },\n attributes => {\n const groupedAttrs = R.groupBy(\n R.pathOr('#ROOT', ['handlerProps', 'parent']),\n attributes,\n );\n const makeTree = R.map(attr => {\n if (R.has(attr.id, groupedAttrs)) {\n const children = makeTree(R.prop(attr.id, groupedAttrs));\n return R.assoc('children', children, attr);\n }\n return attr;\n });\n\n return makeTree(R.propOr([], '#ROOT', groupedAttrs));\n },\n )(metaIndexes);\n\n return R.assoc(evolvedKey, attributes, acc);\n },\n {},\n R.keys(series),\n ),\n )(metadataJson);\n\n return metadataSeries;\n};\n","import * as R from 'ramda';\nimport { getNotDisplayedCombinations } from '@sis-cc/dotstatsuite-sdmxjs';\n\nconst getNotDisplayedValues = annot => {\n if (R.isNil(annot)) {\n return {};\n }\n const ids = R.split(',', annot.title || '');\n return R.reduce(\n (acc, entry) => {\n if (R.isEmpty(entry)) {\n return acc;\n }\n const parsed = R.split('=', entry);\n const dimensionId = parsed[0];\n if (R.length(parsed) === 1) {\n return R.assoc(dimensionId, dimensionId, acc);\n }\n const values = R.split('+', parsed[1]);\n if (R.length(values) === 1 && R.isEmpty(values[0])) {\n return R.assoc(dimensionId, dimensionId, acc);\n }\n return R.reduce(\n (_acc, val) => {\n let _val = val;\n if (R.isEmpty(val)) {\n return _acc;\n }\n if (R.test('/[()]/')) {\n _val = R.replace(/[()]/g, '')(val);\n }\n const key = R.isEmpty(_val) ? dimensionId : `${dimensionId}.${_val}`;\n return R.assoc(key, key, _acc);\n },\n acc,\n values,\n );\n },\n {},\n ids,\n );\n};\n\nexport const getNotDisplayedIds = annotations =>\n R.pipe(\n R.find(R.propEq('NOT_DISPLAYED', 'type')),\n R.converge(\n (hiddenValues, hiddenCombinations) => ({\n hiddenValues,\n hiddenCombinations,\n }),\n [getNotDisplayedValues, (annot = { title: '' }) => getNotDisplayedCombinations(annot)],\n ),\n )(annotations);\n","import * as R from 'ramda';\n\nexport const getHCodelistsRefs = annotations =>\n R.reduce(\n (acc, annotation) => {\n if (annotation.type !== 'HIER_CONTEXT') {\n return acc;\n }\n const references = annotation.text || annotation.title || '';\n const refs = R.pipe(\n R.split(','),\n R.reduce((acc2, ref) => {\n const match = ref.match(/([\\w@_.]+):([\\w@_.]+):([\\w@_.]+)\\(([\\d.]+)\\).([\\w@_.]+)$/);\n if (R.isNil(match)) {\n return acc2;\n }\n const [codelistId, agencyId, code, version, hierarchy] = R.tail(match);\n return R.assoc(codelistId, { agencyId, code, version, hierarchy, codelistId }, acc2);\n }, {}),\n )(references);\n return R.mergeRight(acc, refs);\n },\n {},\n annotations,\n );\n\nexport const getHCodelistsRefsInData = sdmxJson => {\n const annotations = R.pathOr([], ['data', 'structure', 'annotations'], sdmxJson);\n return getHCodelistsRefs(annotations);\n};\n","import * as R from 'ramda';\n\nexport const getMetadataCoordinates = sdmxJson => {\n const dimensions = R.pathOr([], ['data', 'structure', 'dimensions', 'observation'], sdmxJson);\n const annotations = R.pathOr([], ['data', 'structure', 'annotations'], sdmxJson);\n const metadataAvailKeys = R.pipe(\n R.pathOr([], ['data', 'dataSets', 0, 'dimensionGroupAttributes']),\n R.map(indexes => R.props(indexes, annotations)),\n R.filter(R.find(a => a && R.propEq('HAS_METADATA', 'type', a))),\n R.keys,\n )(sdmxJson);\n\n return R.map(key => {\n const indexes = R.split(':', key);\n return R.addIndex(R.reduce)(\n (acc, vIndex, dimIndex) => {\n if (R.isNil(vIndex) || R.isEmpty(vIndex)) {\n return acc;\n }\n const dim = R.nth(dimIndex, dimensions);\n if (R.isNil(dim) || R.prop('rejected', dim)) {\n return acc;\n }\n const val = R.path(['values', Number(vIndex)], dim);\n if (R.isNil(val)) {\n return acc;\n }\n return R.assoc(dim.id, val.id, acc);\n },\n {},\n indexes,\n );\n }, metadataAvailKeys);\n};\n","import * as R from 'ramda';\n\nexport const duplicateObs = (dims, observations) => {\n const obsValues = R.values(observations);\n if (R.length(dims) === 0) {\n return observations;\n }\n const duplicated = R.reduce(\n (obs, dim) => {\n const groupedObs = R.groupBy(o => R.prop(dim.id, o.indexedDimValIds), obs);\n const enhancedObs = R.addIndex(R.map)((value, index) => {\n const matchingObs = R.propOr([], value.id, groupedObs);\n\n return R.map(\n obs =>\n R.over(R.lensProp('orderedDimIndexes'), _indexes => {\n const indexes = R.isNil(_indexes)\n ? R.map(i => Number(i), obs.dimValuesIndexes)\n : _indexes;\n return R.set(R.lensIndex(dim.__index), index)(indexes);\n })(obs),\n matchingObs,\n );\n }, dim.values);\n return R.unnest(enhancedObs);\n },\n obsValues,\n dims,\n );\n const res = R.indexBy(R.pipe(R.prop('orderedDimIndexes'), R.join(':')), duplicated);\n return res;\n};\n","import * as R from 'ramda';\n\nconst uniq = R.pipe(\n R.reduce(\n ({ ids, list }, id) => {\n if (R.has(id, list)) {\n return { ids, list };\n }\n return { ids: R.append(id, ids), list: R.assoc(id, id, list) };\n },\n { ids: [], list: {} },\n ),\n R.prop('ids'),\n);\n\nexport const refinePartialHierarchy = (hier, indexed) => {\n const { intact, broken } = R.pipe(\n R.keys,\n R.reduce(\n ({ intact, broken }, key) => {\n const ids = R.filter(id => R.has(id, indexed), hier[key]);\n if (key === '#ROOT') {\n return { broken, intact: R.assoc(key, ids, intact) };\n }\n const splitKey = R.split('.', key);\n const filtered = R.takeLastWhile(id => R.has(id, indexed), splitKey);\n if (R.length(filtered) === R.length(splitKey)) {\n return { broken, intact: R.assoc(key, ids, intact) };\n }\n const refinedKey = R.isEmpty(filtered) ? '#ROOT' : R.join('.', filtered);\n return {\n intact,\n broken: R.over(\n R.lensProp(refinedKey),\n R.ifElse(R.isNil, R.always([ids]), R.append(ids)),\n )(broken),\n };\n },\n { intact: {}, broken: {} },\n ),\n )(hier);\n const intactIds = R.pipe(R.values, R.unnest)(intact);\n const refinedBroken = R.pipe(\n R.omit(intactIds),\n R.over(\n R.lensProp('#ROOT'),\n R.pipe(i => (R.isNil(i) ? [] : i), R.unnest, R.reject(R.flip(R.includes)(intactIds))),\n ),\n R.map(R.pipe(R.unnest, uniq)),\n )(broken);\n\n return {\n ...refinedBroken,\n ...intact,\n '#ROOT': R.concat(refinedBroken['#ROOT'], intact['#ROOT']),\n };\n};\n","import * as R from 'ramda';\n\nexport const hierarchiseDimensionWithNativeHierarchy = dimension => {\n const values = R.sortBy(R.prop('__indexPosition'), dimension.values || []);\n const indexed = R.indexBy(R.prop('id'), values);\n const grouped = R.groupBy(\n val => (val.parent && R.has(val.parent, indexed) ? val.parent : '#ROOT'),\n values,\n );\n\n let index = -1;\n const getChildren = ({ parentsIndexes, parentId }) => {\n const childs = R.propOr([], parentId, grouped);\n return R.reduce(\n (acc, child) => {\n index = index + 1;\n const refined = R.pipe(\n R.assoc('__indexPosition', index),\n R.assoc('parents', parentsIndexes),\n R.assoc('parent', R.isEmpty(parentsIndexes) ? undefined : parentId),\n )(child);\n const children = getChildren({\n parentsIndexes: R.propOr(false, 'isSelected', child)\n ? R.append(index, parentsIndexes)\n : parentsIndexes,\n parentId: child.id,\n });\n return R.concat(acc, R.prepend(refined, children));\n },\n [],\n childs,\n );\n };\n\n return R.set(\n R.lensProp('values'),\n getChildren({ parentsIndexes: [], parentId: '#ROOT' }),\n )(dimension);\n};\n","import * as R from 'ramda';\n\nconst parseTexts = texts =>\n R.reduce(\n (acc, text) => {\n const splitted = R.split(':', text);\n if (R.length(splitted) !== 2) {\n return acc;\n }\n const [id, name] = splitted;\n return R.assoc(id, name, acc);\n },\n {},\n texts,\n );\n\nexport const parseCombinationDefinition = locale => (title, texts) =>\n R.useWith(\n (titles, texts) =>\n R.reduce(\n (acc, title) => {\n const split = R.split(':', title);\n if (R.length(split) !== 2) {\n return acc;\n }\n const [id, codes] = split;\n if (R.isEmpty(codes)) {\n return acc;\n }\n return R.append(\n {\n id,\n concepts: R.split(',', codes),\n name: R.hasPath([locale, id], texts) ? R.path([locale, id], texts) : `[${id}]`,\n },\n acc,\n );\n },\n [],\n titles,\n ),\n [R.split(';'), R.map(R.pipe(R.split(';'), parseTexts))],\n )(title, texts);\n\nexport const getCombinationDefinitions = (annotations, locale) => {\n const annotation = R.find(annot => annot.type === 'COMBINED_CONCEPTS', annotations);\n if (R.isNil(annotation)) {\n return [];\n }\n const title = R.propOr('', 'title', annotation);\n const texts = R.propOr({}, 'texts', annotation);\n\n return parseCombinationDefinition(locale)(title, texts);\n};\n","import * as R from 'ramda';\nimport * as dateFns from 'date-fns';\nimport { getLocale } from '../../rules/src/date';\n\nconst computeDisplayFreq = (start, duration) => {\n const startMinute = dateFns.startOfMinute(start);\n const startHour = dateFns.startOfHour(start);\n const startDay = dateFns.startOfDay(start);\n if (!dateFns.isEqual(start, startMinute) || duration === 'S') {\n return 'S';\n } else if (\n !dateFns.isEqual(start, startHour) ||\n !dateFns.isEqual(start, startDay) ||\n duration === 'H' ||\n duration === 'm'\n ) {\n return 'm';\n } else if (dateFns.getDate(start) !== 1 || duration === 'D') {\n return 'D';\n } else if (dateFns.getMonth(start) !== 0 || duration === 'M') {\n return 'M';\n }\n return 'Y';\n};\n\nconst getAdder = duration => {\n if (duration === 'S') return dateFns.addSeconds;\n if (duration === 'm') return dateFns.addMinutes;\n if (duration === 'H') return dateFns.addHours;\n if (duration === 'D') return dateFns.addDays;\n if (duration === 'M') return dateFns.addMonths;\n return dateFns.addYears;\n};\n\nconst getFormat = freqDisplay => {\n if (freqDisplay === 'Y') return 'yyyy';\n if (freqDisplay === 'D') return 'yyyy-MM-dd';\n if (freqDisplay === 'H' || freqDisplay === 'm') {\n return 'HH:mm';\n }\n if (freqDisplay === 'S') {\n return 'HH:mm:ss';\n }\n return 'yyyy-MMM';\n};\n\nconst getEndDate = (start, mult, duration) => {\n const adder = getAdder(duration);\n const endDate = adder(start, Number(mult));\n return dateFns.subSeconds(endDate, 1);\n};\n\nconst computeName = (start, end, freqDisplay, locale, format) => {\n const opts = { locale: getLocale(locale) };\n const isSameDay = dateFns.isSameDay(start, end);\n const isSameYear = dateFns.isSameYear(start, end);\n if (freqDisplay === 'H' || freqDisplay === 'm' || freqDisplay === 'S') {\n const dayFormat = getFormat('D');\n if (isSameDay)\n return `${dateFns.format(start, dayFormat, opts)} ${dateFns.format(start, format, opts)} - ${dateFns.format(end, format, opts)}`;\n return (\n `${dateFns.format(start, dayFormat, opts)} ${dateFns.format(start, format, opts)} - ` +\n `${dateFns.format(end, dayFormat, opts)} ${dateFns.format(end, format, opts)}`\n );\n }\n if (freqDisplay !== 'M') {\n return `${dateFns.format(start, format, opts)} - ${dateFns.format(end, format, opts)}`;\n }\n\n if (isSameYear && !R.includes('-', format)) {\n const yearFormatMatch = R.match(/([y]+)/, format);\n const monthFormatMatch = R.match(/([M]+|Mo)/, format);\n const yearFormat = R.length(yearFormatMatch) >= 2 ? R.nth(1, yearFormatMatch) : null;\n const monthFormat = R.length(monthFormatMatch) >= 2 ? R.nth(1, monthFormatMatch) : null;\n const formattedYear = yearFormat ? dateFns.format(start, yearFormat, opts) : null;\n const formattedMonths = monthFormat\n ? `${dateFns.format(start, monthFormat, opts)} - ${dateFns.format(end, monthFormat, opts)}`\n : null;\n if (monthFormat) {\n return R.pipe(\n format => (yearFormat ? R.replace(yearFormat, formattedYear, format) : format),\n R.replace(monthFormat, formattedMonths),\n )(format);\n }\n }\n return `${dateFns.format(start, format, opts)} - ${dateFns.format(end, format, opts)}`;\n};\n\nconst getStartDate = value =>\n typeof value === 'string' ? dateFns.parseISO(value) : new Date(value);\nconst dateWithTZ = date => dateFns.addMinutes(date, -date.getTimezoneOffset());\n\nexport const refineTimePeriod = (timePeriod, { locale, monthlyFormat = 'yyyy-MMM' }) => {\n const { id } = timePeriod;\n const split = R.split('/', id);\n if (R.length(split) !== 2) {\n const start = getStartDate(R.prop('start', timePeriod));\n const end = getStartDate(R.prop('end', timePeriod));\n return {\n ...timePeriod,\n start: dateWithTZ(start).toISOString(),\n end: dateWithTZ(end).toISOString(),\n };\n }\n const [start, range] = split;\n const startDate = getStartDate(start);\n const match = R.match(/^P(T?)(\\d+)([YMDHS])$/, range);\n if (R.isEmpty(match) || !dateFns.isValid(startDate)) {\n return timePeriod;\n }\n const [timeIndicator, mult, _duration] = R.tail(match);\n const duration = !R.isEmpty(timeIndicator) && _duration === 'M' ? 'm' : _duration;\n const endDate = getEndDate(startDate, mult, duration);\n const freqDisplay = computeDisplayFreq(startDate, duration);\n const format = freqDisplay === 'M' ? monthlyFormat : getFormat(freqDisplay);\n const name = computeName(startDate, endDate, freqDisplay, locale, format);\n\n return {\n ...timePeriod,\n id,\n name,\n start: dateWithTZ(startDate).toISOString(),\n end: dateWithTZ(endDate).toISOString(),\n };\n};\n","import * as R from 'ramda';\nimport getTime from 'date-fns/getTime';\nimport { getCodeOrder } from '@sis-cc/dotstatsuite-sdmxjs';\nimport { getIsHidden } from './sdmx-data';\nimport {\n getReportedTimePeriodLabel,\n getReportedTimePeriodNote,\n getReportedTimePeriod,\n} from './date';\nimport { refineTimePeriod } from '../../rules2/src/refineTimePeriod';\n\nconst isNonCoded = R.both(R.has('value'), R.pipe(R.has('id'), R.not));\n\nconst getId = (value, fallbackId) => {\n const valueId = R.prop('id', value);\n if (valueId) return valueId;\n if (isNonCoded(value)) return R.prop('value', value);\n // Fallback (value has no id but is not a non-coded)\n return fallbackId;\n};\n\nconst getName =\n ({ isTimeDimension, options, locale, start, reportYearStart }) =>\n value => {\n if (!isTimeDimension) return R.prop('name')(value);\n return getReportedTimePeriodLabel(\n options.frequency,\n options.timeFormat,\n locale,\n )(reportYearStart, {\n id: value.id,\n reportedStart: start,\n start: new Date(value.start),\n });\n };\n\nexport const getValuesEnhanced = ({\n locale = '',\n annotations = [],\n isTimeDimension = false,\n parent = '',\n reportYearStart,\n hiddenIds = {},\n options = {},\n selection = [],\n}) => {\n const selectionSet = new Set(selection);\n return R.pipe(\n R.addIndex(R.map)((value, __index) => {\n const id = getId(value, `${parent}-${__index}`);\n\n const valueAnnotations = R.pipe(\n R.propOr([], 'annotations'),\n R.flip(R.props)(annotations),\n )(value);\n\n const isHidden = R.has(`${parent}.${id}`, hiddenIds) || getIsHidden(valueAnnotations);\n\n const { start, notes } = isTimeDimension\n ? getTimePeriodAttributes({ reportYearStart, options })(value)\n : { notes: [] };\n\n let __indexPosition = NaN;\n if (isNaN(__indexPosition)) {\n __indexPosition = getCodeOrder({ annotations: valueAnnotations });\n }\n const isSelected =\n selectionSet.has(value.id) ||\n R.isNil(selection) ||\n R.isEmpty(selection) ||\n R.isEmpty(R.head(selection));\n let res = {\n // names is explicitely skipped because of metadata \"standard\"\n // not completely aligned with NSI \"standard\"\n // value is explicitely skipped (non-coded) into id\n ...R.omit(['names', 'value'], value),\n id,\n isSelected,\n empty: !isSelected,\n display: !isHidden,\n start: start ? start.toISOString() : null,\n flags: notes,\n __indexPosition,\n __index,\n isNonCoded: isNonCoded(value),\n };\n if (!isNonCoded(value)) {\n res = R.assoc(\n 'name',\n getName({ isTimeDimension, options, locale, start, reportYearStart })(value),\n res,\n );\n }\n if (isTimeDimension) {\n res = refineTimePeriod(res, {\n locale,\n monthlyFormat: options.timeFormat,\n });\n }\n return res;\n }),\n // __indexPosition is used for pre-sorting\n R.sortWith(isTimeDimension ? timeDimensionSorts : defaultSorts),\n // __indexPosition is reset after pre-sorting\n R.addIndex(R.map)((val, index) => R.assoc('__indexPosition', index, val)),\n // values are re-sorted by __index after __indexPosition settlement\n R.sortBy(R.prop('__index')),\n );\n};\n\nconst getDateForSort = key => val => getTime(new Date(R.prop(key, val)));\nconst byStartDate = R.ascend(getDateForSort('start'));\nconst byEndDate = R.descend(getDateForSort('end'));\nconst timeDimensionSorts = [byStartDate, byEndDate];\nconst byIndexPosition = R.ascend(R.prop('__indexPosition'));\nconst byOrder = R.ascend(R.propOr(-1, 'order'));\nconst defaultSorts = [byIndexPosition, byOrder];\n\nconst getTimePeriodAttributes =\n ({ reportYearStart, options }) =>\n value => {\n const reported = getReportedTimePeriod(reportYearStart, value, options.frequency);\n const start = reported.start;\n const end = reported.end;\n const reportTimeNote = getReportedTimePeriodNote(\n reportYearStart,\n start,\n end,\n options.frequency,\n options.isRtl,\n );\n const notes = R.isNil(reportTimeNote) ? [] : R.append(reportTimeNote, []);\n return { start, notes };\n };\n","import * as R from 'ramda';\nimport { getIsHidden } from '../../rules/src/sdmx-data';\nimport { getValuesEnhanced } from '../../rules/src/get-values-enhanced';\n\nexport const getAttributes = ({ attributes, annotations, options }) => {\n const { hiddenCombinations = {}, hiddenValues = {}, locale = '', ...restOptions } = options;\n\n const datasetAttributes = R.propOr([], 'dataSet', attributes);\n const obsAttributes = R.propOr([], 'observation', attributes);\n\n return R.pipe(\n R.concat,\n R.addIndex(R.map)((attr, index) => {\n const attrAnnotations = R.props(attr.annotations || [], annotations);\n return {\n ...attr,\n __index: index,\n display: !R.has(attr.id, hiddenValues) && !getIsHidden(attrAnnotations),\n values: getValuesEnhanced({\n locale,\n annotations,\n parent: attr.id,\n hiddenIds: hiddenValues,\n options: restOptions,\n })(attr.values || []),\n };\n }),\n )(obsAttributes, datasetAttributes);\n};\n","import * as R from 'ramda';\nimport { isTimePeriodDimension } from '@sis-cc/dotstatsuite-sdmxjs';\nimport { getValuesEnhanced } from '../../rules/src/get-values-enhanced';\nimport { getIsHidden } from '../../rules/src/sdmx-data';\n\nconst TIME_PERIOD_ID = 'TIME_PERIOD';\n\nexport const refineDimensions = ({ annotations = [], dimensions = [], options = {} }) => {\n const {\n dataquery = '',\n hiddenCombinations = {},\n hiddenValues = {},\n locale = '',\n reportYearStart,\n ...restOptions\n } = options;\n const selectionIds = R.pipe(R.split('.'), R.map(R.split('+')))(dataquery);\n\n const getIsAllDimHidden = ({ id, values }) => {\n if (!R.has(id, hiddenCombinations)) {\n return false;\n }\n const valuesIds = R.pluck('id', values);\n return R.isEmpty(R.difference(valuesIds, hiddenCombinations[id]));\n };\n\n return R.addIndex(R.map)((dim, index) => {\n const selection = R.nth(index, selectionIds);\n const isEmptySelection =\n R.isNil(selection) || R.isEmpty(selection) || R.isEmpty(R.head(selection));\n const isTimeDimension = isTimePeriodDimension(dim);\n const dimAnnotations = R.props(dim.annotations || [], annotations);\n const values = getValuesEnhanced({\n annotations,\n hiddenIds: hiddenValues,\n isTimeDimension,\n locale,\n options: restOptions,\n parent: dim.id,\n reportYearStart,\n selection,\n })(dim.values || []);\n\n const size = R.length(values);\n const isAllDimHidden = getIsAllDimHidden({ id: dim.id, values });\n const isHidden = isAllDimHidden || R.has(dim.id, hiddenValues) || getIsHidden(dimAnnotations);\n return {\n ...dim,\n display: !isHidden,\n header: size === 1 || (size > 1 && R.length(selection) === 1 && !isEmptySelection),\n __index: index,\n rejected: isAllDimHidden || !size,\n role: isTimeDimension ? TIME_PERIOD_ID : R.head(dim.roles || []),\n values,\n };\n }, dimensions);\n};\n","import * as R from 'ramda';\nimport { REPORTING_YEAR_START_DAY, REPYEARSTART } from './constants';\n\nexport const parseAttributes = (attributes, dimensions, customAttributes) => {\n const indexedDimensions = R.indexBy(R.prop('id'), dimensions);\n return R.addIndex(R.map)((attr, index) => {\n let res = R.assoc('index', index, attr);\n const displayableValuesCount = R.pipe(R.filter(R.propOr(true, 'display')), R.length)(attr);\n if (\n R.isEmpty(attr.values || []) ||\n !R.propOr(true, 'display', attr) ||\n displayableValuesCount < 1 ||\n attr.id === REPORTING_YEAR_START_DAY ||\n attr.id === REPYEARSTART\n ) {\n return R.assoc('display', false, res);\n }\n if (R.propEq(customAttributes.prefscale, 'id', attr)) {\n return R.assoc('prefscale', true, res);\n }\n if (R.propEq(customAttributes.decimals, 'id', attr)) {\n return R.assoc('decimals', true, res);\n }\n if (\n R.hasPath(['relationship', 'none'], attr) ||\n R.hasPath(['relationship', 'dataflow'], attr)\n ) {\n return { ...res, header: true, relationship: [] };\n }\n if (\n R.hasPath(['relationship', 'primaryMeasure'], attr) ||\n R.hasPath(['relationship', 'observation'], attr)\n ) {\n return { ...res, series: true, relationship: [] };\n }\n const seriesDimensions = R.pipe(\n R.pathOr([], ['relationship', 'dimensions']),\n R.filter(id => {\n const dimension = R.prop(id, indexedDimensions);\n return !dimension.header && R.length(dimension.values || []) > 1 && !dimension.rejected;\n }),\n )(attr);\n if (R.length(seriesDimensions) > 0) {\n return { ...res, series: true, relationship: seriesDimensions };\n }\n return { ...res, header: true, relationship: R.prop('dimensions', attr.relationship || []) };\n }, attributes);\n};\n","import * as R from 'ramda';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nconst getDisplayableValues = values =>\n R.filter(\n val => !R.includes(R.prop('id', val), REJECTED_VALUE_IDS) && R.propOr(true, 'display', val),\n values,\n );\n\n// invalid concepts:\n// - empty/null/undefined/!array values (so far)\nconst hasInvalidValues = R.pipe(\n R.prop('values'),\n R.anyPass([R.isNil, R.complement(R.is(Array)), R.isEmpty]),\n);\nconst isConceptInvalid = R.anyPass([hasInvalidValues /* add more... */]);\nconst filterValidConcepts = R.reject(isConceptInvalid);\n// concepts is an array of ids... (misnamed!)\nconst rejectInvalidConceptIds =\n (concepts = []) =>\n (combinations = []) => {\n const validConceptIds = R.pluck('id', filterValidConcepts(concepts));\n return R.reduce(\n (acc, comb) => {\n const refinedConcepts = R.intersection(validConceptIds, comb.concepts);\n if (R.length(refinedConcepts) < 1) {\n return acc;\n }\n return R.append({ ...comb, concepts: refinedConcepts }, acc);\n },\n [],\n combinations,\n );\n };\n\nexport const parseCombinations = (combinations, parsedAttributes, dimensions) => {\n const concepts = R.concat(dimensions, parsedAttributes);\n\n const indexedDimensions = R.indexBy(R.prop('id'), dimensions);\n const indexedAttributes = R.indexBy(R.prop('id'), parsedAttributes);\n\n return R.pipe(\n rejectInvalidConceptIds(concepts),\n R.reduce((acc, comb) => {\n let relationship = [];\n let ids = {};\n let displayable_values_count = 0;\n const seriesConcepts = R.filter(concept => {\n if (R.has(concept, ids)) {\n return false;\n }\n if (R.has(concept, indexedDimensions)) {\n const dimension = R.prop(concept, indexedDimensions);\n relationship = !dimension.header ? R.append(concept, relationship) : relationship;\n ids = { ...ids, [concept]: concept };\n displayable_values_count += R.length(dimension.values || []);\n return !dimension.header;\n } else if (!R.has(concept, indexedAttributes)) {\n return false;\n }\n const attribute = R.prop(concept, indexedAttributes);\n const displayableValues = getDisplayableValues(attribute.values || []);\n const isDisplayable =\n R.length(displayableValues) !== 0 && R.propOr(true, 'display', attribute);\n relationship =\n attribute.series && isDisplayable\n ? R.pipe(\n R.reject(id => R.has(id, ids)),\n R.concat(relationship),\n )(attribute.relationship)\n : relationship;\n ids =\n attribute.series && isDisplayable\n ? { ...ids, ...R.indexBy(R.identity, attribute.relationship) }\n : ids;\n displayable_values_count = isDisplayable\n ? displayable_values_count + R.length(displayableValues)\n : displayable_values_count;\n return attribute.series && isDisplayable;\n }, comb.concepts);\n if (R.isEmpty(seriesConcepts)) {\n return R.append({ ...comb, header: true, display: displayable_values_count > 0 }, acc);\n }\n return R.append(\n {\n ...comb,\n series: true,\n relationship,\n display: displayable_values_count > 0,\n },\n acc,\n );\n }, []),\n )(combinations);\n};\n","import * as R from 'ramda';\n\nexport const refineAttributes = (parsedAttributes, seriesCombinations) => {\n const indexedRelationships = R.reduce(\n (acc, comb) =>\n R.reduce((_acc, concept) => R.assoc(concept, comb.relationship, _acc), acc, comb.concepts),\n {},\n seriesCombinations,\n );\n return R.map(attr => {\n if (R.has(attr.id, indexedRelationships)) {\n return {\n ...attr,\n series: true,\n relationship: R.prop(attr.id, indexedRelationships),\n combined: true,\n };\n }\n return attr;\n }, parsedAttributes);\n};\n","import * as R from 'ramda';\nimport numeral from 'numeral';\n\nconst isValidNumber = R.both(R.is(Number), R.complement(R.equals(NaN)));\nconst parseValidNumber = R.pipe(\n v => (R.isNil(v) ? null : Number(v)),\n v => (isNaN(v) ? null : v),\n);\n\nconst getFormatAttributesValues = (observation, formatAttributesIndexes, attributes) =>\n R.mapObjIndexed(attributeIndex => {\n let valueIndex;\n const relationship = R.pipe(R.nth(attributeIndex), R.propOr({}, 'relationship'))(attributes);\n //if (!R.isNil(attributeIndex) && attributeIndex >= R.length(R.propOr([], 'attrValuesIndexes', observation))) {\n if (R.has('none', relationship) || R.has('dataflow', relationship)) {\n valueIndex = 0;\n } else {\n valueIndex = R.pipe(\n R.propOr([], 'attrValuesIndexes'),\n R.nth(attributeIndex),\n parseValidNumber,\n )(observation);\n }\n\n return R.pipe(\n R.path([attributeIndex, 'values', valueIndex, 'id']),\n parseValidNumber,\n )(attributes);\n }, formatAttributesIndexes);\n\nexport const formatValue = (observation, formatAttributesIndexes, attributes) => {\n const value = R.prop('value', observation);\n if (R.is(Boolean, value)) {\n return value;\n }\n if (R.is(String, value)) {\n const monthMatch = value.match(/^--([\\d]{2})$/);\n if (R.is(Array, monthMatch)) {\n return R.nth(1, monthMatch);\n }\n const monthDayMatch = value.match(/^--([\\d]{2}-[\\d]{2})$/);\n if (R.is(Array, monthDayMatch)) {\n return R.nth(1, monthDayMatch);\n }\n const dayMatch = value.match(/^---([\\d]{2})$/);\n if (R.is(Array, dayMatch)) {\n return R.nth(1, dayMatch);\n }\n return value;\n }\n\n const { prefscale, decimals } = getFormatAttributesValues(\n observation,\n formatAttributesIndexes,\n attributes,\n );\n\n const formatScale = R.when(R.always(isValidNumber(prefscale)), value =>\n numeral(value)\n .multiply(Math.pow(10, -1 * Number(prefscale)))\n .value(),\n );\n const _decimals = !decimals ? 2 : decimals;\n\n const formatSeparator = value => numeral(value).format(`0,0.[0000000]`);\n const formatDecimals = R.ifElse(\n R.always(isValidNumber(decimals)),\n v => {\n const num = Number(v);\n const isTiny = Math.abs(num) < Math.pow(10, -_decimals);\n const displayNum = isTiny ? 0 : num;\n const decimalFormat = R.ifElse(\n R.equals(0),\n R.always('0,0'),\n d => `0,0.${R.join('', R.times(R.always('0'), d))}`,\n )(decimals);\n\n const res = numeral(displayNum).format(decimalFormat);\n return res;\n },\n formatSeparator,\n );\n return R.ifElse(\n isValidNumber,\n R.pipe(formatScale, formatDecimals, res => (res === 'NaN' ? String(value) : res)),\n R.always('..'),\n )(observation.value);\n};\n","import * as R from 'ramda';\nimport { formatValue } from '../../rules/src/preparators/formatValue';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nconst parseAttributesValues = (obs, attributes, indexedDimensions) => {\n const { attrValuesIndexes, dimValuesIndexes } = obs;\n return R.addIndex(R.reduce)(\n (acc, valueIndex, attrIndex) => {\n const attribute = R.nth(attrIndex, attributes);\n if (R.isNil(attribute) || !R.prop('series', attribute)) {\n return acc;\n }\n const _value = R.nth(valueIndex, attribute.values || []);\n let value = R.isNil(_value)\n ? _value\n : R.over(\n R.lensProp('display'),\n (display = true) => display && !R.includes(_value.id, REJECTED_VALUE_IDS),\n )(_value);\n\n const isAttrNotDisplayed = !(attribute?.display ?? true);\n const isValueNotDisplayed = !(value?.display ?? true);\n const isValueNull = value?.id == null; // 0 is not null\n if (isAttrNotDisplayed || isValueNotDisplayed || isValueNull) value = null;\n\n const relationship = R.propOr([], 'relationship', attribute);\n let coordinates = {};\n const serieKey = R.pipe(\n dims => (R.isEmpty(relationship) ? R.values(dims) : R.props(relationship, dims)),\n R.map(dim => {\n const valueIndex = R.nth(dim.__index, dimValuesIndexes);\n const valueId = R.path(['values', valueIndex, 'id'], dim);\n coordinates = R.assoc(dim.id, valueId, coordinates);\n return `${dim.id}=${valueId}`;\n }),\n R.ifElse(R.isEmpty, R.always(null), R.join(':')),\n )(indexedDimensions);\n\n return R.assoc(\n attribute.id,\n {\n ...R.pick(['id', 'name', 'relationship', 'display', 'combined'], attribute),\n value,\n serieKey,\n coordinates,\n isObs: R.isEmpty(relationship),\n },\n acc,\n );\n },\n {},\n attrValuesIndexes,\n );\n};\n\nconst getFormatAttributesIndexes = (attributes, customAttributes) =>\n R.addIndex(R.reduce)(\n (acc, attribute, index) => {\n if (R.equals(attribute.id, customAttributes.decimals)) {\n return { ...acc, decimals: index };\n }\n if (R.equals(attribute.id, customAttributes.prefscale)) {\n return { ...acc, prefscale: index };\n }\n return acc;\n },\n { prefscale: null, decimals: null },\n attributes,\n );\n\nexport const enhanceObservations = (\n dimensions = [],\n observations = {},\n attributes = [],\n options = {},\n) => {\n const formatAttributesIndexes = getFormatAttributesIndexes(\n attributes,\n R.propOr({}, 'customAttributes', options),\n );\n const indexedDimensions = R.indexBy(R.prop('id'), dimensions);\n\n return R.map(observation => {\n const { dimValuesIndexes } = observation;\n\n const indexedDimValIds = R.addIndex(R.reduce)(\n (acc, dimension, dimensionIndex) => {\n const id = dimension.id;\n const valueIndex = R.nth(dimensionIndex, dimValuesIndexes);\n const valueId = R.path(['values', Number(valueIndex), 'id'], dimension);\n return R.assoc(id, valueId, acc);\n },\n {},\n dimensions,\n );\n\n return {\n ...observation,\n attributes: parseAttributesValues(observation, attributes, indexedDimensions),\n formattedValue: formatValue(observation, formatAttributesIndexes, attributes),\n indexedDimValIds,\n };\n }, observations);\n};\n","import * as R from 'ramda';\n\nexport const getAttributesSeries = observations =>\n R.pipe(\n R.values,\n R.reduce(\n (acc, { attributes }) => {\n let res = acc.res;\n let rejected = acc.rejected;\n R.forEachObjIndexed(attribute => {\n if (!R.isNil(attribute.serieKey) && !attribute.isObs) {\n if (R.isNil(attribute.value)) {\n res = R.dissocPath([attribute.serieKey, attribute.id], res);\n rejected = R.assocPath([attribute.serieKey, attribute.id], true, rejected);\n }\n if (R.path([attribute.serieKey, attribute.id], rejected)) {\n return;\n }\n const valueInRes = R.path([attribute.serieKey, attribute.id, 'value', 'id'], res);\n if (!R.isNil(valueInRes) && valueInRes !== R.path(['value', 'id'], attribute)) {\n res = R.dissocPath([attribute.serieKey, attribute.id], res);\n rejected = R.assocPath([attribute.serieKey, attribute.id], true, rejected);\n } else {\n res = R.assocPath([attribute.serieKey, attribute.id], attribute, res);\n }\n }\n }, attributes);\n return { res, rejected };\n },\n { res: {}, rejected: {} },\n ),\n R.prop('res'),\n )(observations);\n","import * as R from 'ramda';\nimport { REJECTED_VALUE_IDS } from '../constants';\n\nexport const getFlagsAndNotes = (attributesValues, customAttributes) => {\n const flagsIds = R.propOr([], 'flags', customAttributes);\n const notesIds = R.propOr([], 'notes', customAttributes);\n\n return R.addIndex(R.reduce)(\n (acc, id, index) => {\n if (!R.has(id, attributesValues)) {\n return acc;\n }\n const attr = R.pick(['id', 'name', 'value', 'display'], R.prop(id, attributesValues));\n if (\n R.isNil(attr.value) ||\n !R.pathOr(true, ['value', 'display'], attr) ||\n !R.propOr(true, 'display', attr) ||\n R.includes(R.path(['value', 'id'], attr), REJECTED_VALUE_IDS)\n ) {\n return acc;\n }\n return R.append(\n index < flagsIds.length ? R.assoc('code', R.path(['value', 'id'], attr), attr) : attr,\n acc,\n );\n },\n [],\n R.concat(flagsIds, notesIds),\n );\n};\n","import * as R from 'ramda';\nimport { getFlagsAndNotes } from './table/getFlagsAndNotes';\n\nexport const getManyValuesDimensions = (\n dimensions,\n attributesSeries,\n customAttributes,\n combinations,\n) => {\n const combConceptsIds = R.pipe(R.pluck('concepts'), R.unnest)(combinations);\n return R.reduce(\n (acc, dim) => {\n if (dim.header || dim.rejected) {\n return acc;\n }\n const enhancedValues = R.map(val => {\n const attrSeries = R.propOr({}, `${dim.id}=${val.id}`, attributesSeries);\n if (R.isEmpty(attrSeries)) {\n return val;\n }\n const flags = getFlagsAndNotes(attrSeries, customAttributes);\n const hasAdvancedAttributes = R.pipe(\n R.omit(\n R.unnest([customAttributes.flags || [], customAttributes.notes || [], combConceptsIds]),\n ),\n R.complement(R.isEmpty),\n )(attrSeries);\n return { ...val, flags, hasAdvancedAttributes };\n }, dim.values);\n return R.append(R.assoc('values', enhancedValues, dim), acc);\n },\n [],\n dimensions,\n );\n};\n","import * as R from 'ramda';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nexport const getOneValueDimensions = (dimensions, attributes) => {\n const indexedRelevantAttributes = R.reduce(\n (acc, attr) => {\n if (\n !attr.header ||\n !R.propOr(true, 'display', attr) ||\n R.length(attr.relationship || []) !== 1\n ) {\n return acc;\n }\n const value = R.path(['values', 0], attr);\n if (\n R.isNil(value) ||\n !R.propOr(true, 'display', value) ||\n R.includes(R.prop('id', value), REJECTED_VALUE_IDS)\n ) {\n return acc;\n }\n const dim = R.head(attr.relationship);\n return R.over(R.lensProp(dim), (values = {}) => ({\n ...values,\n [attr.id]: { ...attr, value },\n }))(acc);\n },\n {},\n attributes,\n );\n return R.reduce(\n (acc, dim) => {\n if (!dim.header) {\n return acc;\n }\n const attrValues = R.propOr({}, dim.id, indexedRelevantAttributes);\n return R.append({ ...dim, attrValues }, acc);\n },\n [],\n dimensions,\n );\n};\n","import * as R from 'ramda';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nexport const getDataflowAttributes = (attributes, combinations) => {\n const combinationsConceptsIds = R.pipe(R.pluck('concepts'), R.unnest)(combinations);\n return R.reduce(\n (acc, attribute) => {\n if (\n !R.prop('header', attribute) ||\n !R.isEmpty(attribute.relationship) ||\n R.includes(attribute.id, combinationsConceptsIds)\n ) {\n return acc;\n }\n const value = R.head(attribute.values);\n if (\n !R.propOr(true, 'display', attribute) ||\n R.isNil(value) ||\n !R.propOr(true, 'display', value) ||\n R.includes(R.prop('id', value), REJECTED_VALUE_IDS)\n ) {\n return acc;\n }\n return R.assoc(attribute.id, { ...R.pick(['id', 'name'], attribute), value }, acc);\n },\n {},\n attributes,\n );\n};\n","import * as R from 'ramda';\nimport { dimensionValueDisplay } from '../../rules/src/dimension-utils';\nimport { getFlagsAndNotes } from './table/getFlagsAndNotes';\n\nexport const getHeaderTitle = (dataflow, attributes, display, customAttributes) => ({\n label: dimensionValueDisplay(display)(dataflow),\n flags: R.pipe(\n getFlagsAndNotes,\n R.map(entry => ({\n code: entry.code,\n header: `${dimensionValueDisplay(display)(entry)}:`,\n label: dimensionValueDisplay(display)(entry.value),\n })),\n )(attributes, customAttributes),\n});\n","import * as R from 'ramda';\nimport { getFlagsAndNotes } from './table/getFlagsAndNotes';\nimport { dimensionValueDisplay } from '../../rules/src/dimension-utils';\n\nexport const getHeaderSubtitle = (\n dimensions,\n combinations,\n customAttributes,\n display,\n microdataDimension,\n) => {\n const combinationsConepts = R.pipe(R.pluck('concepts'), R.unnest)(combinations);\n const DEFAULT_REJECTED_SUBTITLE_IDS = ['_L', '_T', '_Z'];\n\n return R.reduce(\n (acc, dim) => {\n if (\n !R.propOr(true, 'display', dim) ||\n R.propEq(microdataDimension, 'id', dim) ||\n R.includes(dim.id, combinationsConepts)\n ) {\n return acc;\n }\n const value = R.path(['values', 0], dim);\n if (\n !R.propOr(true, 'display', value) ||\n R.includes(value.id, DEFAULT_REJECTED_SUBTITLE_IDS)\n ) {\n return acc;\n }\n const header = `${dimensionValueDisplay(display)(dim)}:`;\n const label = dimensionValueDisplay(display)(value);\n const flags = R.pipe(\n getFlagsAndNotes,\n R.map(entry => ({\n code: entry.code,\n header: `${dimensionValueDisplay(display)(entry)}:`,\n label: dimensionValueDisplay(display)(entry.value),\n })),\n )(dim.attrValues, customAttributes);\n return R.append({ header, label, flags }, acc);\n },\n [],\n dimensions,\n );\n};\n","import * as R from 'ramda';\n\nexport const getSeriesCombinations = (combinations, oneValuesDimensions) => {\n const indexedValues = R.reduce(\n (acc, dim) => {\n const value = R.head(dim.values);\n return R.assoc(dim.id, value, acc);\n },\n {},\n oneValuesDimensions,\n );\n\n return R.reduce(\n (acc, comb) => {\n if (!R.prop('series', comb)) {\n return acc;\n }\n const fixedDimValues = R.pick(comb.concepts, indexedValues);\n return R.append({ ...comb, fixedDimValues }, acc);\n },\n [],\n combinations,\n );\n};\n","import * as R from 'ramda';\nimport { dimensionValueDisplay } from '../../rules/src/dimension-utils';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nconst getRefinedMissinParentsLabels = R.pipe(\n R.propOr([], 'missingParents'),\n R.reduce((acc, par) => {\n if (!R.propOr(true, 'display', par) || R.includes(par.id, REJECTED_VALUE_IDS)) {\n return acc;\n }\n return R.append(dimensionValueDisplay('label')(par), acc);\n }, []),\n);\n\nexport const singleValueDisplay = (display, value) => {\n if (display === 'label') {\n return R.converge(\n (missingParents, label) =>\n R.isEmpty(missingParents) ? label : R.join(' > ', R.append(label, missingParents)),\n [getRefinedMissinParentsLabels, dimensionValueDisplay(display)],\n )(value);\n } else if (display === 'both') {\n return `(${singleValueDisplay('code', value)}) ${singleValueDisplay('label', value)}`;\n }\n return dimensionValueDisplay(display)(value);\n};\n\nconst _combinedValuesDisplay = _display => values =>\n R.pipe(\n R.reduce((acc, val) => {\n if (R.isNil(val)) return acc;\n const isDisplayed = R.propOr(true, 'display', val);\n const isRejected = R.includes(val.id, REJECTED_VALUE_IDS);\n if ((!isDisplayed || isRejected) && _display === 'label') return acc;\n return R.append(singleValueDisplay(_display, val), acc);\n }, []),\n labels => {\n if (!R.isEmpty(labels) || _display !== 'label') {\n return R.join(', ', labels);\n }\n const totalValue = R.find(R.propEq('_T', 'id'), values);\n if (!R.isNil(totalValue)) {\n return dimensionValueDisplay('label')(totalValue);\n }\n if (R.isEmpty(values)) {\n return '';\n }\n const firstValue = R.head(values);\n return dimensionValueDisplay('label')(firstValue);\n },\n )(values);\n\nexport const combinedValuesDisplay = (display, values) => {\n if (display === 'both') {\n return R.converge(\n (_ids, labels) => {\n return dimensionValueDisplay('both')({\n id: _ids,\n name: labels,\n });\n },\n [_combinedValuesDisplay('code'), _combinedValuesDisplay('label')],\n )(values);\n }\n return _combinedValuesDisplay(display)(values);\n};\n","import * as R from 'ramda';\nimport { dimensionValueDisplay } from '../../rules/src/dimension-utils';\nimport { combinedValuesDisplay } from './combinedValuesDisplay';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nexport const getHeaderCombinations = (combinations, dimensions, attributes, display) => {\n const indexedDimensions = R.indexBy(R.prop('id'), dimensions);\n const indexedAttributes = R.indexBy(R.prop('id'), attributes);\n return R.reduce(\n (acc, comb) => {\n if (!R.prop('header', comb) || !R.propOr(true, 'display', comb)) {\n return acc;\n }\n\n const header = `${dimensionValueDisplay(display)(comb)}:`;\n\n const label = R.pipe(\n R.reduce((_acc, concept) => {\n const artefact = R.has(concept, indexedDimensions)\n ? R.prop(concept, indexedDimensions)\n : R.prop(concept, indexedAttributes);\n if (R.isNil(artefact)) {\n return _acc;\n }\n const value = R.path(['values', 0], artefact);\n if (R.isNil(value)) {\n return _acc;\n }\n if (\n R.has(concept, indexedAttributes) &&\n (!R.propOr(true, 'display', value) ||\n !R.propOr(true, 'artefact', value) ||\n R.includes(value.id, REJECTED_VALUE_IDS))\n ) {\n return _acc;\n }\n return R.append(value, _acc);\n }, []),\n values => combinedValuesDisplay(display, values),\n )(comb.concepts || []);\n if (R.isEmpty(label)) {\n return acc;\n }\n return R.append({ header, label }, acc);\n },\n [],\n combinations,\n );\n};\n","import * as R from 'ramda';\n\nexport const getHeaderCoordinates = oneValueDimensions =>\n R.reduce(\n (acc, dim) => R.assoc(dim.id, R.path(['values', 0, 'id'], dim), acc),\n {},\n oneValueDimensions,\n );\n","import * as R from 'ramda';\nimport { isTimePeriodDimension } from '@sis-cc/dotstatsuite-sdmxjs';\n\nconst getConceptsSet = (ids, indexedCombinations, _upper) => {\n const upper = R.isNil(_upper) ? new Set([]) : _upper;\n const res = new Set([]);\n R.forEach(id => {\n if (!R.has(id, indexedCombinations)) {\n res.add(id);\n } else {\n const comb = R.prop(id, indexedCombinations);\n R.forEach(c => {\n if (!upper.has(c)) {\n res.add(c);\n }\n }, comb.concepts);\n }\n }, ids);\n return res;\n};\n\nconst parseCombination = (_upperIds, _excludedIds) => (comb, indexedDimensions) => {\n const upperIds = R.isNil(_upperIds) ? new Set([]) : _upperIds;\n const excludedIds = R.isNil(_excludedIds) ? new Set([]) : _excludedIds;\n\n const { concepts, relationship } = comb;\n const dimensions = R.reduce(\n (acc, id) => {\n if (upperIds.has(id) || !R.has(id, indexedDimensions)) {\n return acc;\n }\n const dim = R.prop(id, indexedDimensions);\n return R.append(dim, acc);\n },\n [],\n concepts,\n );\n const excludedDep = R.find(i => excludedIds.has(i), relationship);\n if (excludedDep) {\n return dimensions;\n }\n return R.assoc('dimensions', dimensions, comb);\n};\n\nexport const getLayout = (_layoutIds, dimensions, combinations, isTimeInverted) => {\n const layoutIds = R.mergeRight({ header: [], sections: [], rows: [] }, _layoutIds);\n const applyInversionOnTimeDim = dim =>\n isTimePeriodDimension(dim) && isTimeInverted ? R.assoc('isInverted', true, dim) : dim;\n\n const indexedDimensions = R.reduce(\n (acc, dim) => R.assoc(dim.id, applyInversionOnTimeDim(dim), acc),\n {},\n dimensions,\n );\n\n const indexedCombinations = R.indexBy(R.prop('id'), combinations);\n const headerConceptsSet = getConceptsSet(layoutIds.header, indexedCombinations);\n const sectionsConceptsSet = getConceptsSet(layoutIds.sections, indexedCombinations);\n const rowsConceptsSet = getConceptsSet(\n R.concat(layoutIds.sections, layoutIds.rows),\n indexedCombinations,\n );\n\n const getLayoutLevel = (_upperIds, _excludedIds) => ids =>\n R.reduce(\n (acc, id) => {\n if (R.has(id, indexedDimensions)) {\n const dim = R.prop(id, indexedDimensions);\n return R.append(dim, acc);\n }\n if (!R.has(id, indexedCombinations)) {\n return acc;\n }\n const comb = R.prop(id, indexedCombinations);\n const parsedCombination = parseCombination(_upperIds, _excludedIds)(\n comb,\n indexedDimensions,\n );\n if (R.is(Array, parsedCombination)) {\n return R.concat(acc, parsedCombination);\n }\n return R.append(parsedCombination, acc);\n },\n [],\n ids,\n );\n\n const header = getLayoutLevel(null, rowsConceptsSet)(layoutIds.header);\n const sections = getLayoutLevel(null, headerConceptsSet)(layoutIds.sections);\n const rows = getLayoutLevel(sectionsConceptsSet, headerConceptsSet)(layoutIds.rows);\n\n return { header, sections, rows };\n};\n","import * as R from 'ramda';\n\n/*\n const layout = {\n header: [\n { id, __index },\n { id: COMB, dimensions: [{ id, __index }] }\n ],\n sections: [],\n rows: []\n }\n\n*/\n\nconst getLayoutPivots = layoutEntry => {\n const valIndexGetter = d =>\n R.pipe(R.nth(R.prop('__index', d)), ind => (d.isInverted ? R.negate(ind) : ind));\n return indexes =>\n R.map(\n R.ifElse(\n R.has('dimensions'),\n c => R.map(d => valIndexGetter(d)(indexes), R.prop('dimensions', c)),\n d => {\n if (d.id === 'OBS_ATTRIBUTES') {\n return R.last(indexes);\n }\n return valIndexGetter(d)(indexes);\n },\n ),\n layoutEntry,\n );\n};\n\nconst comparator = (firstSerie, secondSerie) => {\n const firstIndexes = firstSerie.indexes;\n const secondIndexes = secondSerie.indexes;\n const size = R.length(firstIndexes);\n let i = 0;\n while (i < size) {\n if (R.is(Array, firstIndexes[i])) {\n const firstSubIndexes = firstIndexes[i];\n const secondSubIndexes = secondIndexes[i];\n const _size = R.length(firstSubIndexes);\n let j = 0;\n while (firstSubIndexes[j] === secondSubIndexes[j] && j < _size) {\n j++;\n }\n if (firstSubIndexes[j] !== secondSubIndexes[j]) {\n return firstSubIndexes[j] - secondSubIndexes[j];\n }\n } else if (firstIndexes[i] !== secondIndexes[i]) {\n return firstIndexes[i] - secondIndexes[i];\n }\n i++;\n }\n return firstIndexes[i] - secondIndexes[i];\n};\n\nconst uniqIndexes = R.pipe(\n R.reduce((acc, { indexes, rejected }) => {\n const key = R.join(':', R.unnest(indexes));\n if (R.has(key, acc)) {\n return R.over(\n R.lensPath([key, 'rejected']),\n R.addIndex(R.map)((v, i) => (v === R.nth(i, rejected) ? v : null)),\n )(acc);\n }\n return R.assoc(key, { indexes, rejected, key }, acc);\n }, {}),\n R.values,\n);\n\nexport const getSortedLayoutIndexes = (layout, observations, rejectedDims = []) => {\n const dimIndexes = R.pipe(R.values, R.map(R.propOr([], 'orderedDimIndexes')))(observations);\n\n const headerPivots = getLayoutPivots(layout.header);\n const sectionsPivots = getLayoutPivots(R.concat(layout.sections, layout.rows));\n const rejectedPivots = getLayoutPivots(rejectedDims);\n\n const sectionLength = R.length(layout.sections);\n const { header, sections } = R.pipe(\n R.reduce(\n (acc, indexes) => {\n const headerIndexes = headerPivots(indexes);\n const sectionsIndexes = sectionsPivots(indexes);\n const rejectedIndexes = rejectedPivots(indexes);\n\n return {\n header: R.append({ indexes: headerIndexes, rejected: rejectedIndexes }, acc.header),\n sections: R.append({ indexes: sectionsIndexes, rejected: rejectedIndexes }, acc.sections),\n };\n },\n { header: [], sections: [] },\n ),\n R.mapObjIndexed(uniqIndexes),\n R.evolve({\n header: R.sort(comparator),\n sections: R.sort(comparator),\n }),\n indexes => ({\n ...indexes,\n sections: R.reduce(\n (acc, { indexes, rejected, key }) => {\n const [sectionIndexes, rowIndexes] = R.splitAt(sectionLength, indexes);\n const sectionKey = R.join(':', sectionIndexes);\n const previousSecKey = R.pipe(R.nth(-1), v => (R.isNil(v) ? null : R.head(v).key))(acc);\n if (R.equals(sectionKey, previousSecKey)) {\n return R.over(\n R.lensIndex(-1),\n R.pipe(\n R.over(R.lensIndex(1), R.append({ indexes: rowIndexes, rejected, key })),\n R.over(R.lensIndex(0), v => ({\n ...v,\n rejected: R.addIndex(R.map)(\n (val, i) => (val === R.nth(i, rejected) ? val : null),\n v.rejected,\n ),\n })),\n ),\n )(acc);\n }\n\n return R.append(\n [\n { indexes: sectionIndexes, rejected, key: sectionKey },\n [{ indexes: rowIndexes, rejected, key }],\n ],\n acc,\n );\n },\n [],\n indexes.sections,\n ),\n }),\n )(dimIndexes);\n\n return { header, sections };\n};\n","import * as R from 'ramda';\n\nconst toKey = indexes =>\n R.reduce(\n (acc, _ind) => {\n const ind = R.is(Array, _ind) ? toKey(_ind) : String(Math.abs(_ind));\n if (R.isEmpty(ind)) {\n return acc;\n }\n return R.isEmpty(acc) ? ind : `${acc}:${ind}`;\n },\n '',\n indexes,\n );\n\nconst getPivotKey = indexes => R.pipe(R.props(indexes), R.join(':'));\n\nconst getPivots = (layout, shape) =>\n R.pipe(\n R.props(shape),\n R.map(\n R.pipe(\n R.map(entry =>\n R.has('dimensions', entry) ? R.pluck('__index', entry.dimensions || []) : entry.__index,\n ),\n R.unnest,\n getPivotKey,\n ),\n ),\n )(layout);\n\nconst indexWithPivots = (pivots, observations) =>\n R.pipe(\n R.values,\n R.reduce((acc, obs) => {\n const path = R.map(pivot => pivot(obs.orderedDimIndexes), pivots);\n return R.over(R.lensPath(path), R.ifElse(R.isNil, R.always([obs]), R.append(obs)))(acc);\n }, {}),\n )(observations);\n\nconst getCuratedCells = ({ layout, observations, shape }) => {\n const pivots = getPivots(layout, shape);\n return indexWithPivots(pivots, observations);\n};\n\nconst filterSeries = (series, getHasStillData) => {\n let removedMissingIndexes = [];\n return R.reduce(\n (acc, serie) => {\n const hasStillData = getHasStillData(serie);\n const serieParentsSets = R.map(p => new Set(p), R.propOr([], 'parentsIndexes', serie));\n if (!hasStillData) {\n removedMissingIndexes = R.addIndex(R.map)((mIs, ind) => {\n const filtered = R.filter(\n i => serieParentsSets[ind].has(i),\n R.nth(ind, removedMissingIndexes) || [],\n );\n return R.concat(filtered, mIs);\n }, serie.missingIndexes || []);\n return acc;\n }\n const _serie = R.pipe(\n R.over(R.lensProp('missingIndexes'), (missingIndexes = []) =>\n R.addIndex(R.map)((mIs, ind) => {\n const removed = R.nth(ind, removedMissingIndexes) || [];\n if (R.isEmpty(removed)) {\n return mIs;\n }\n const filteredRemoved = R.filter(i => serieParentsSets[ind].has(i), removed);\n return R.concat(filteredRemoved, mIs || []);\n }, missingIndexes),\n ),\n R.over(R.lensProp('parentsIndexes'), (parentsIndexes = []) =>\n R.addIndex(R.map)((p, ind) => {\n return R.reject(i => R.includes(i, R.nth(ind, removedMissingIndexes) || []), p || []);\n }, parentsIndexes),\n ),\n )(serie);\n removedMissingIndexes = [];\n return R.append(_serie, acc);\n },\n [],\n series,\n );\n};\n\nconst refineSections = (sections, extractedKeys, curatedObs) =>\n R.pipe(\n R.map(section => {\n const sectionKey = toKey(R.propOr([], 'indexes', R.head(section)));\n const getHasRowStillData = row => {\n const rowKey = toKey(R.prop('indexes', row));\n return R.pipe(\n R.path([sectionKey, rowKey]),\n R.omit(extractedKeys),\n R.isEmpty,\n R.not,\n )(curatedObs);\n };\n return R.over(R.lensIndex(1), rows => filterSeries(rows, getHasRowStillData))(section);\n }),\n R.filter(R.pipe(R.nth(1), R.isEmpty, R.not)),\n )(sections);\n\nconst refineHeader = (headers, extractedKeys, curatedObs) => {\n const getHasHeaderStillData = header => {\n const headerKey = toKey(R.prop('indexes', header));\n return R.pipe(\n R.prop(headerKey),\n sections => {\n return R.pickBy(\n (rows, section) =>\n R.pipe(R.omit(R.propOr([], section, extractedKeys)), R.isEmpty, R.not)(rows),\n sections,\n );\n },\n R.isEmpty,\n R.not,\n )(curatedObs);\n };\n return filterSeries(headers, getHasHeaderStillData);\n};\n\nconst getSerieLinesCount = serie => {\n const missingParents = R.propOr([], 'missingParents', serie);\n const missingParentsRowsCount = R.pipe(R.flatten, R.length)(missingParents);\n return missingParentsRowsCount + 1;\n};\n\nconst truncateSectionRows = (n, sectionsData) => {\n let truncated = sectionsData;\n let extractedKeys = {};\n let _n = n;\n while (_n > 0) {\n const lastSection = R.last(truncated);\n const rows = lastSection[1];\n const rowsLength = R.length(rows);\n let truncatedRowsCount = 0;\n while (_n > 0 && truncatedRowsCount !== rowsLength) {\n const rowsCount = getSerieLinesCount(R.nth(-1 * truncatedRowsCount, rows));\n _n = _n - rowsCount;\n truncatedRowsCount++;\n }\n const sectionKey = R.pipe(R.head, R.prop('indexes'), toKey)(lastSection);\n extractedKeys = {\n ...extractedKeys,\n [sectionKey]: R.pipe(\n R.takeLast(truncatedRowsCount),\n R.map(r => toKey(R.prop('indexes', r))),\n )(rows),\n };\n if (_n > 0) {\n truncated = R.dropLast(1, truncated);\n } else {\n truncated = R.over(\n R.lensIndex(-1),\n R.over(R.lensIndex(1), R.dropLast(truncatedRowsCount)),\n )(truncated);\n }\n }\n return { truncated, extractedKeys };\n};\n\nconst truncateHeader = (n, headerData) => {\n let { truncated, extractedKeys } = { truncated: headerData, extractedKeys: [] };\n let _n = n;\n while (_n > 0) {\n const lastHeader = R.last(truncated);\n const columnsCount = getSerieLinesCount(lastHeader);\n const extractedKey = toKey(R.prop('indexes', lastHeader));\n extractedKeys = R.append(extractedKey, extractedKeys);\n truncated = R.dropLast(1, truncated);\n _n = _n - columnsCount;\n }\n return { truncated, extractedKeys };\n};\n\nconst truncateLayout = isVertical =>\n R.ifElse(R.always(isVertical), truncateSectionRows, truncateHeader);\n\nconst refineLayout = isVertical => R.ifElse(R.always(isVertical), refineHeader, refineSections);\n\nconst getShape = isVertical =>\n isVertical ? ['header', 'sections', 'rows'] : ['sections', 'rows', 'header'];\n\nconst getRefinedLayout = (isVertical, truncated, refined) =>\n R.ifElse(\n R.always(isVertical),\n R.pipe(R.assoc('sections', truncated), R.assoc('header', refined)),\n R.pipe(R.assoc('header', truncated), R.assoc('sections', refined)),\n )({});\n\nconst segregateLayout = isVertical =>\n R.ifElse(R.always(isVertical), R.props(['sections', 'header']), R.props(['header', 'sections']));\n\nexport const refineLayoutSize =\n ({ layout, observations, limit }) =>\n layoutIndexes => {\n const { header, sections } = layoutIndexes;\n if (R.isNil(limit) || limit === 0 || R.all(R.isEmpty, [header, sections])) {\n return R.pipe(\n R.set(R.lensProp('truncated'), false),\n R.set(R.lensProp('totalCells'), null),\n )(layoutIndexes);\n }\n\n //number of dimensions in header\n const headerDimCount = R.pipe(\n R.head, // first column\n R.when(R.isNil, R.always({})),\n R.propOr([], 'indexes'),\n R.length, // number of dims\n )(header);\n\n //number of columns for values\n const headerValuesCount = R.pipe(\n R.reduce((acc, header) => {\n const columnsCount = getSerieLinesCount(header);\n return acc + columnsCount;\n }, 0),\n R.when(R.equals(0), R.always(1)),\n )(header);\n\n //total of cells in header\n const headerCellsCount = headerDimCount * (headerValuesCount + 1);\n\n // number of dimensions in a row\n const rowDimCount = R.pipe(\n R.head, // firstSection\n R.last, // rows,\n R.head, // first row\n R.propOr([], 'indexes'),\n R.length,\n )(sections);\n\n // number of cells in a row\n const rowCellsCount = rowDimCount + headerValuesCount + 1;\n\n // number of rows\n const rowsCount = R.pipe(\n R.map(R.last),\n R.unnest,\n R.reduce((acc, row) => {\n const rowsCount = getSerieLinesCount(row);\n return acc + rowsCount;\n }, 1),\n )(sections);\n\n // total of cells in all rows\n const rowsCellsCount = rowCellsCount * rowsCount;\n\n // number of sections cells\n const sectionsCellsCount = R.ifElse(\n R.pipe(R.head, R.head, R.propOr([], 'indexes'), R.length, R.equals(0)),\n R.always(0),\n R.length,\n )(sections);\n\n const total = rowsCellsCount + sectionsCellsCount + headerCellsCount;\n\n const excess = total - limit;\n if (excess <= 0) {\n return R.pipe(\n R.set(R.lensProp('truncated'), false),\n R.set(R.lensProp('totalCells'), total),\n )(layoutIndexes);\n }\n\n // total of cells in one column\n const columnCellsCount = headerDimCount + rowsCount;\n\n const isVertical = columnCellsCount > rowCellsCount;\n\n const [toTruncate, toRefine] = segregateLayout(isVertical)(layoutIndexes);\n\n let cutLength = R.pipe(\n R.ifElse(R.identity, R.always(rowCellsCount), R.always(columnCellsCount)),\n R.divide(excess),\n Math.ceil,\n )(isVertical);\n\n const maxCutLength = isVertical ? rowsCount - 2 : headerValuesCount - 1;\n cutLength = cutLength > maxCutLength ? maxCutLength : cutLength;\n\n const { truncated, extractedKeys } = truncateLayout(isVertical)(cutLength, toTruncate);\n\n const dimsLength = R.pipe(\n R.values,\n R.head,\n R.propOr([], 'orderedDimIndexes'),\n R.length,\n )(observations);\n const _layout = R.map(\n R.map(entry =>\n entry.id === 'OBS_ATTRIBUTES' ? R.assoc('__index', dimsLength - 1, entry) : entry,\n ),\n layout,\n );\n const curatedObs = R.pipe(getShape, shape =>\n getCuratedCells({ layout: _layout, observations, shape }),\n )(isVertical);\n\n const refined = refineLayout(isVertical)(toRefine, extractedKeys, curatedObs);\n\n const result = getRefinedLayout(isVertical, truncated, refined);\n\n return R.pipe(\n R.set(R.lensProp('truncated'), true),\n R.set(R.lensProp('totalCells'), total),\n )(result);\n };\n","import * as R from 'ramda';\n\nexport const getLayoutCoordinatesValidator =\n (layoutCoordinates, topCoordinates = {}) =>\n coordinates => {\n if (R.isEmpty(coordinates)) {\n return false;\n }\n if (R.has('OBS_ATTRIBUTES', layoutCoordinates) || R.has('OBS_ATTRIBUTES', topCoordinates)) {\n const obsAttrCoord =\n R.prop('OBS_ATTRIBUTES', layoutCoordinates) || R.prop('OBS_ATTRIBUTES', topCoordinates);\n if (obsAttrCoord !== 'OBS_VALUE') {\n return false;\n }\n }\n const keys = R.keys(coordinates);\n let res = true;\n let notInTop = {};\n R.forEach(key => {\n if (R.prop(key, layoutCoordinates) !== R.prop(key, coordinates)) {\n res = false;\n }\n if (!R.has(key, topCoordinates)) {\n notInTop[key] = key;\n }\n }, keys);\n return res && !R.isEmpty(notInTop);\n };\n","import * as R from 'ramda';\nimport { getFlagsAndNotes } from './getFlagsAndNotes';\nimport { getLayoutCoordinatesValidator } from '../utils';\n\nconst getValueData = (index, dimension, parentsIndexes, missingParents = []) => ({\n dimension: R.pick(['id', 'name', '__index'], dimension),\n value: {\n ...R.pipe(\n R.pathOr({}, ['values', index]),\n R.pick(['id', 'name', 'isNonCoded', 'flags', 'hasAdvancedAttributes', 'display']),\n )(dimension),\n parents: parentsIndexes,\n missingParents,\n },\n});\n\nconst addCoordinatesToKey = (key, dimensionId, valueId) =>\n `${key}${R.isEmpty(key) ? '' : ':'}${dimensionId}=${valueId}`;\n\nconst simpleValueDataSetter = (valueData, datas = []) => R.append(valueData, datas);\n\nconst combinedValueDataSetter = (valueData, datas = []) =>\n R.over(\n R.lensIndex(-1),\n d => ({ ...d, values: R.append(R.prop('value', valueData), d.values) }),\n datas,\n );\n\nconst addValueToSerieData =\n dataSetter => (index, parentsIndexes, dimension, serieData, missingParents) => {\n const valueData = getValueData(index, dimension, parentsIndexes, missingParents);\n const valueId = R.path(['value', 'id'], valueData);\n return {\n ...serieData,\n data: dataSetter(valueData, R.prop('data', serieData)),\n key: addCoordinatesToKey(R.prop('key', serieData), R.prop('id', dimension), valueId),\n };\n };\n\nconst addSimpleValueToSerieData = addValueToSerieData(simpleValueDataSetter);\n\nconst addCombinedValueToSerieData = addValueToSerieData(combinedValueDataSetter);\n\nconst getHasAdvancedAttributes = (attrValues, customAttributes) =>\n R.pipe(\n R.omit(R.concat(customAttributes.flags || [], customAttributes.notes || [])),\n R.isEmpty,\n R.not,\n )(attrValues);\n\nconst getCoordinates = (indexes, topCoordinates, definition) =>\n R.addIndex(R.reduce)(\n (acc, entry, index) => {\n if (R.has('dimensions', entry)) {\n return R.addIndex(R.reduce)(\n (_acc, dim, _index) => {\n const valInd = R.path([index, _index], indexes);\n return R.assoc(dim.id, R.path(['values', Math.abs(valInd), 'id'], dim), _acc);\n },\n acc,\n entry.dimensions,\n );\n }\n const valInd = R.nth(index, indexes);\n if (R.isNil(valInd)) {\n return acc;\n }\n return R.assoc(entry.id, R.path(['values', Math.abs(valInd), 'id'], entry), acc);\n },\n topCoordinates,\n definition,\n );\n\nconst getAttributesSeries = (validator, attributesSeries) =>\n R.reduce(\n (acc, attrs) => {\n const attr = R.head(R.values(attrs)) || {};\n const coordinates = R.propOr({}, 'coordinates', attr);\n const isValid = validator(coordinates);\n if (!isValid && !R.prop('isObs', attr)) {\n return acc;\n }\n const filtered = R.reject(\n a => !R.propOr(false, 'combined', a) && R.length(a.relationship || []) === 1,\n attrs,\n );\n return { ...acc, ...filtered };\n },\n {},\n R.values(attributesSeries),\n );\n\nconst combineConcepts = (combDimValues, definition, attrValues) =>\n R.over(\n R.lensProp('data'),\n R.over(R.lensIndex(-1), data => ({\n ...data,\n values: R.reduce(\n (acc, conceptId) => {\n if (R.has(conceptId, combDimValues)) {\n return R.append(R.prop(conceptId, combDimValues), acc);\n }\n if (R.has(conceptId, definition.fixedDimValues || {})) {\n return R.append(R.prop(conceptId, definition.fixedDimValues), acc);\n }\n if (R.has(conceptId, attrValues)) {\n const value = R.path([conceptId, 'value'], attrValues);\n return R.append(value, acc);\n }\n return acc;\n },\n [],\n definition.concepts,\n ),\n })),\n );\n\nconst getSerieFlagsAndSideProps = (\n coordinates,\n validator,\n attributesValues,\n customAttributes,\n metadataCoordinates,\n data,\n) => {\n const layoutAttrValues = R.reject(\n attr => R.prop('isObs', attr) && !validator(attr.coordinates),\n attributesValues,\n );\n const flags = getFlagsAndNotes(layoutAttrValues, customAttributes);\n const hasMetadata = !R.isNil(R.find(validator, metadataCoordinates));\n const hasDataAdvancedAttributes = R.any(\n d =>\n R.has('value', d)\n ? R.prop('hasAdvancedAttributes', d.value)\n : R.any(R.prop('hasAdvancedAttributes'), d.values),\n data,\n );\n const hasAdvancedAttributes =\n hasDataAdvancedAttributes || getHasAdvancedAttributes(layoutAttrValues, customAttributes);\n const sideProps =\n hasMetadata || hasAdvancedAttributes\n ? { hasMetadata, hasAdvancedAttributes, coordinates }\n : null;\n return { flags, sideProps };\n};\n\nconst getSerieDimensionsData = (serie, definition, attributesValues, missingParentsGetter) =>\n R.addIndex(R.reduce)(\n (onGoingSerie, entry, index) => {\n if (R.has('dimensions', entry)) {\n const combValuesIndexes = R.pathOr([], ['indexes', index], serie);\n const combParentsIndexes = R.pathOr([], ['parentsIndexes', index], serie);\n const combMissingParentsIndexes = R.pathOr([], ['missingIndexes', index], serie);\n let combDimValues = {};\n const res = R.addIndex(R.reduce)(\n (combSerie, dimension, dimIndex) => {\n const valueIndex = Math.abs(R.nth(dimIndex, combValuesIndexes));\n const _parentsIndexes = R.nth(dimIndex, combParentsIndexes) || [];\n const missingParentsIndexes = R.nth(dimIndex, combMissingParentsIndexes) || [];\n const { parentsIndexes, missingParents } = missingParentsGetter(\n combinedValueDataSetter,\n )(missingParentsIndexes, _parentsIndexes, dimension, combSerie);\n const next = addCombinedValueToSerieData(\n valueIndex,\n parentsIndexes,\n dimension,\n combSerie,\n missingParents,\n );\n const value = R.pipe(R.prop('data'), R.last, R.prop('values'), R.last)(next);\n combDimValues = R.assoc(dimension.id, value, combDimValues);\n return next;\n },\n R.over(\n R.lensProp('data'),\n R.append({ dimension: R.pick(['id', 'name'], entry), values: [] }),\n )(onGoingSerie),\n R.propOr([], 'dimensions', entry),\n );\n\n const combined = combineConcepts(combDimValues, entry, onGoingSerie.attributes)(res);\n return R.over(R.lensProp('attributes'), R.omit(entry.concepts), combined);\n }\n\n const valueIndex = Math.abs(R.path(['indexes', index], serie));\n const _parentsIndexes = R.pathOr([], ['parentsIndexes', index], serie);\n const missingParentsIndexes = R.pathOr([], ['missingIndexes', index], serie);\n const { parentsIndexes, missingParents } = missingParentsGetter(simpleValueDataSetter)(\n missingParentsIndexes,\n _parentsIndexes,\n entry,\n onGoingSerie,\n );\n return addSimpleValueToSerieData(\n valueIndex,\n parentsIndexes,\n entry,\n onGoingSerie,\n missingParents,\n );\n },\n { data: [], key: '', attributes: attributesValues },\n definition,\n );\n\nexport const getSerieDataWithMissingLines = (\n serie,\n definition,\n topCoordinates,\n attributesSeries,\n customAttributes,\n metadataCoordinates,\n rejectedDims = [],\n) => {\n const lines = [];\n const coordinates = getCoordinates(serie.indexes, topCoordinates, definition);\n const serieCoordinates = getCoordinates(serie.rejected || [], coordinates, rejectedDims);\n const coordinatesValidator = getLayoutCoordinatesValidator(serieCoordinates, topCoordinates);\n const attributesValues = getAttributesSeries(coordinatesValidator, attributesSeries);\n\n const getMissingParents =\n dataSetter => (missingParentsIndexes, _parentsIndexes, dim, serieData) =>\n R.reduce(\n (acc, index) => {\n const missingParentData = addValueToSerieData(dataSetter)(\n index,\n acc.parentsIndexes,\n dim,\n serieData,\n );\n lines.push({\n ...R.dissoc('attributes', missingParentData),\n sideProps: null,\n flags: [],\n isEmpty: true,\n });\n return R.over(R.lensProp('parentsIndexes'), R.append(index), acc);\n },\n { parentsIndexes: _parentsIndexes, missingParents: [] },\n missingParentsIndexes,\n );\n const { attributes, ...serieData } = getSerieDimensionsData(\n serie,\n definition,\n attributesValues,\n getMissingParents,\n );\n const topCoordinatesValidator = getLayoutCoordinatesValidator(topCoordinates);\n const flagsValidator = coordinates =>\n coordinatesValidator(coordinates) && !topCoordinatesValidator(coordinates);\n const { flags, sideProps } = getSerieFlagsAndSideProps(\n serieCoordinates,\n flagsValidator,\n attributes,\n customAttributes,\n metadataCoordinates,\n serieData.data,\n );\n return R.append({ ...serieData, flags, sideProps, coordinates: serieCoordinates }, lines);\n};\n\nexport const getSerieDataWithoutMissingLines = (\n serie,\n definition,\n topCoordinates,\n attributesSeries,\n customAttributes,\n metadataCoordinates,\n rejectedDims = [],\n) => {\n const coordinates = getCoordinates(serie.indexes, topCoordinates, definition);\n const serieCoordinates = getCoordinates(serie.rejected || [], coordinates, rejectedDims);\n const coordinatesValidator = getLayoutCoordinatesValidator(serieCoordinates, topCoordinates);\n const attributesValues = getAttributesSeries(coordinatesValidator, attributesSeries);\n\n const getMissingParents = () => (missingParentsIndexes, _parentsIndexes, dim) =>\n R.reduce(\n (acc, index) => ({\n parentsIndexes: R.append(index, acc.parentsIndexes),\n missingParents: R.append(\n R.prop('value', getValueData(index, dim, acc.parentsIndexes)),\n acc.missingParents,\n ),\n }),\n { parentsIndexes: _parentsIndexes, missingParents: [] },\n missingParentsIndexes,\n );\n\n const { attributes, ...serieData } = getSerieDimensionsData(\n serie,\n definition,\n attributesValues,\n getMissingParents,\n );\n const { flags, sideProps } = getSerieFlagsAndSideProps(\n serieCoordinates,\n coordinatesValidator,\n attributes,\n customAttributes,\n metadataCoordinates,\n serieData.data,\n );\n return { ...serieData, flags, sideProps, coordinates: serieCoordinates };\n};\n\nexport const getLayoutData = (\n layoutIndexes,\n layout,\n {\n metadataCoordinates,\n attributesSeries,\n customAttributes,\n topCoordinates = {},\n rejectedDimensions = [],\n },\n) => {\n const { header, sections, ...rest } = layoutIndexes;\n const headerData = R.reduce(\n (acc, serie) => {\n const datas = getSerieDataWithMissingLines(\n serie,\n layout.header,\n topCoordinates,\n attributesSeries,\n customAttributes,\n metadataCoordinates,\n rejectedDimensions,\n );\n return R.concat(acc, datas);\n },\n [],\n header,\n );\n\n const sectionsData = R.map(([sectionSerie, rowsSeries]) => {\n const sectionData = getSerieDataWithoutMissingLines(\n sectionSerie,\n layout.sections,\n topCoordinates,\n attributesSeries,\n customAttributes,\n metadataCoordinates,\n rejectedDimensions,\n );\n return [\n sectionData,\n R.reduce(\n (acc, serie) => {\n const datas = getSerieDataWithMissingLines(\n serie,\n layout.rows,\n R.propOr(topCoordinates, 'coordinates', sectionData),\n attributesSeries,\n customAttributes,\n metadataCoordinates,\n rejectedDimensions,\n );\n return R.concat(acc, datas);\n },\n [],\n rowsSeries,\n ),\n ];\n }, sections);\n\n return { headerData, sectionsData, ...rest };\n};\n","import * as R from 'ramda';\n\nexport const getCellsAttributesIds = (layoutIds, attributes) => {\n return R.reduce(\n (acc, attr) => {\n if (!attr.series) {\n return acc;\n }\n if (R.isEmpty(attr.relationship || [])) {\n return R.assoc(attr.id, attr.id, acc);\n }\n const indexedHeaderIds = R.indexBy(R.identity, layoutIds.header);\n const indexedSectionsIds = R.indexBy(R.identity, layoutIds.sections);\n const indexedRowsIds = { ...indexedSectionsIds, ...R.indexBy(R.identity, layoutIds.rows) };\n const [idsInHeader, rest] = R.partition(id => R.has(id, indexedHeaderIds), attr.relationship);\n if (R.isEmpty(rest)) {\n return acc;\n } else if (!R.isEmpty(idsInHeader)) {\n return R.assoc(attr.id, attr.id, acc);\n } else {\n const idsNotInSections = R.reject(id => R.has(id, indexedSectionsIds), attr.relationship);\n if (R.isEmpty(idsNotInSections)) {\n return acc;\n }\n const idsNotInRows = R.reject(id => R.has(id, indexedRowsIds), idsNotInSections);\n if (R.isEmpty(idsNotInRows)) {\n return acc;\n }\n }\n return R.assoc(attr.id, attr.id, acc);\n },\n {},\n attributes,\n );\n};\n","import * as R from 'ramda';\n\nexport const getCellsMetadataCoordinates = (metadataCoordinates, oneValueDimensions, layoutIds) => {\n const oneValueDimsIds = R.pluck('id', oneValueDimensions);\n return R.reject(coordinates => {\n const columnIds = R.concat(layoutIds.header, oneValueDimsIds);\n if (R.isEmpty(R.omit(columnIds, coordinates))) {\n return true;\n }\n const rowsIds = [...layoutIds.sections, ...layoutIds.rows, ...oneValueDimsIds];\n return R.isEmpty(R.omit(rowsIds, coordinates));\n }, metadataCoordinates);\n};\n","import * as R from 'ramda';\n\nexport const getIndexedCombinationsByDisplay = (layout, combinations) => {\n const layoutIds = R.pipe(R.map(R.pluck('id')), R.values, R.unnest, R.indexBy(R.identity))(layout);\n\n const [combsInLayout, combsInCells] = R.partition(\n comb => R.has(comb.id, layoutIds),\n combinations,\n );\n return { cells: combsInCells, layout: combsInLayout };\n};\n","import * as R from 'ramda';\nimport { getFlagsAndNotes } from './getFlagsAndNotes';\nimport { hasCellMetadata } from '../hasCellMetadata';\n\nconst getCellRelevantAttributes = (attributes, attributesSeries, cellAttributeIds) =>\n R.filter(attr => {\n if (R.isNil(attr.value)) {\n return false;\n }\n if (R.has(attr.id, cellAttributeIds)) {\n return true;\n }\n const attrInSerie = R.path([attr.serieKey, attr.id], attributesSeries);\n return R.isNil(attrInSerie);\n }, attributes);\n\nconst getCellCombinedSeries = (attributes, combinations) =>\n R.reduce(\n (acc, comb) => {\n const values = R.reduce(\n (acc, concept) => {\n if (R.has(concept, comb.fixedDimValues || {})) {\n return R.append(R.prop(concept, comb.fixedDimValues), acc);\n }\n if (R.has(concept, attributes || {})) {\n return R.append(R.path([concept, 'value'], attributes), acc);\n }\n return acc;\n },\n [],\n comb.concepts,\n );\n\n if (R.isEmpty(values)) {\n return acc;\n }\n return R.append({ ...R.pick(['id', 'name'], comb), values }, acc);\n },\n [],\n combinations,\n );\n\n// combinations = { cells, layout };\nexport const getCells =\n (customAttributes, cellsAttributesId, combinations, attributesSeries, metadataCoordinates) =>\n observations => {\n const attributesInLayoutCombination = R.pipe(\n R.propOr([], 'layout'),\n R.pluck('concepts'),\n R.unnest,\n )(combinations);\n\n const attributesInCellsCombination = R.pipe(\n R.propOr([], 'cells'),\n R.pluck('concepts'),\n R.unnest,\n )(combinations);\n\n const _customAttributes = R.over(R.lensProp('notes'), notes =>\n R.pipe(R.concat, R.uniq)(notes || [], attributesInLayoutCombination),\n )(customAttributes);\n\n return R.mapObjIndexed(obs => {\n const isAttrCell = R.pathOr('OBS_VAL', ['indexedDimValIds', 'OBS_ATTR'], obs) !== 'OBS_VAL';\n const relevantAttributes = isAttrCell\n ? []\n : getCellRelevantAttributes(obs.attributes, attributesSeries, cellsAttributesId);\n const flagsAndNotes = isAttrCell\n ? []\n : getFlagsAndNotes(\n R.omit(attributesInCellsCombination, relevantAttributes),\n _customAttributes,\n );\n const combinedSeries = isAttrCell\n ? []\n : getCellCombinedSeries(relevantAttributes, combinations.cells || []);\n const hasAdvancedAttributes = isAttrCell\n ? false\n : R.pipe(\n R.omit(\n R.unnest([\n _customAttributes.flags || [],\n _customAttributes.notes || [],\n attributesInCellsCombination,\n ]),\n ),\n res => !R.isEmpty(res),\n )(relevantAttributes);\n\n const advancedAttributes = R.omit(\n R.unnest([\n _customAttributes.flags || [],\n _customAttributes.notes || [],\n attributesInCellsCombination,\n ]),\n R.filter(attr => !R.isNil(attr.value), obs.attributes),\n );\n\n const hasMetadata = isAttrCell\n ? false\n : hasCellMetadata(metadataCoordinates, obs.indexedDimValIds);\n\n return {\n ...R.pick(['indexedDimValIds', 'key'], obs),\n flags: R.concat(flagsAndNotes, combinedSeries),\n sideProps:\n hasAdvancedAttributes || hasMetadata\n ? { hasMetadata, coordinates: obs.indexedDimValIds, advancedAttributes }\n : null,\n intValue: R.is(Number, obs.value) ? obs.value : null,\n value: obs.formattedValue,\n };\n }, observations);\n };\n","import * as R from 'ramda';\n\nexport const hasCellMetadata = (metadataCoordinates, cellCoordinates) => {\n if (R.propOr('OBS_VALUE', 'OBS_ATTRIBUTES', cellCoordinates) !== 'OBS_VALUE') {\n return false;\n }\n return R.pipe(\n R.find(coordinates => {\n const mergedCoord = R.mergeLeft(coordinates, cellCoordinates);\n return !R.isEmpty(coordinates) && R.equals(mergedCoord, cellCoordinates);\n }),\n R.complement(R.isNil),\n )(metadataCoordinates);\n};\n","import * as R from 'ramda';\n\nexport const getCuratedCells = (cells, layout) => {\n const layoutIds = R.map(\n R.pipe(\n R.map(entry =>\n R.has('dimensions', entry) ? R.pluck('id', entry.dimensions || []) : entry.id,\n ),\n R.unnest,\n ),\n )(layout);\n return R.pipe(\n R.values,\n R.reduce((acc, cell) => {\n const keys = R.map(\n R.pipe(\n R.map(dim => {\n const val = R.prop(dim, cell.indexedDimValIds);\n return `${dim}=${val}`;\n }),\n R.join(':'),\n ),\n layoutIds,\n );\n\n return R.over(\n R.lensPath(R.props(['header', 'sections', 'rows'], keys)),\n cells => (R.isNil(cells) ? [cell] : R.append(cell, cells)),\n acc,\n );\n }, {}),\n )(cells);\n};\n","import * as R from 'ramda';\n\nexport const getObservations = sdmxJson =>\n R.pipe(\n R.pathOr({}, ['data', 'dataSets', 0, 'observations']),\n R.mapObjIndexed((observation, observationKey) => {\n const value = R.head(observation);\n const attrValuesIndexes = R.tail(observation);\n const dimValuesIndexes = R.split(':', observationKey);\n\n return {\n key: observationKey,\n value,\n attrValuesIndexes,\n dimValuesIndexes,\n };\n }),\n )(sdmxJson);\n","import * as R from 'ramda';\n\nconst addParentId = (id, ids) => {\n const last = R.last(ids);\n return R.append(R.isNil(last) ? id : `${last}.${id}`, ids);\n};\n\nconst _refineUnconfirmedPaths = paths => R.map(p => [R.head(p)], paths);\n\nconst getHierId = v => (R.isNil(v.parent) || R.isEmpty(v.parent) ? v.id : `${v.parent}.${v.id}`);\n\nexport const applyHierarchicalCodesToDim = (hCodes, dim) => {\n const confirmedHierarchisedChilds = new Set([]);\n let unconfirmedPaths = {};\n\n const indexedValues = R.reduce(\n (acc, val) => {\n if (!val.isSelected) {\n return acc;\n }\n return R.assoc(val.id, val, acc);\n },\n {},\n dim.values || [],\n );\n\n const parseHCodes = (parentsDef, parentsInDim) =>\n R.reduce((acc, hC) => {\n const { codeID, hierarchicalCodes = [] } = hC;\n const hasInDim = R.has(codeID, indexedValues);\n const isUnconfirmed = R.length(parentsInDim) !== R.length(parentsDef);\n const children = parseHCodes(\n R.append(codeID, parentsDef),\n hasInDim ? addParentId(codeID, parentsInDim) : parentsInDim,\n )(hierarchicalCodes);\n if (!hasInDim) {\n return R.concat(acc, children);\n }\n const path = R.join('.', parentsDef);\n let val = {\n ...R.prop(codeID, indexedValues),\n path,\n parents: parentsInDim,\n parent: R.last(parentsInDim),\n children,\n };\n\n if (isUnconfirmed) {\n unconfirmedPaths = R.over(\n R.lensProp(val.id),\n paths => R.append(path, paths || []),\n unconfirmedPaths,\n );\n val = R.assoc('unconfirmed', true, val);\n return R.append(val, acc);\n }\n confirmedHierarchisedChilds.add(codeID);\n return R.append(val, acc);\n }, []);\n\n const parsed = parseHCodes([], [])(hCodes);\n\n const _unconfirmedPaths = R.pipe(\n R.reject(id => confirmedHierarchisedChilds.has(id)),\n ids => R.pick(ids, unconfirmedPaths),\n )(R.keys(unconfirmedPaths));\n\n const refinedUnconfirmedPaths = _refineUnconfirmedPaths(_unconfirmedPaths);\n\n const flattenDescendants = R.reduce((acc, val) => {\n const children = flattenDescendants(val.children || []);\n return R.concat(acc, R.prepend(val, children));\n }, []);\n\n const isValid = val =>\n !val.unconfirmed || val.path === R.head(refinedUnconfirmedPaths[val.id] || []);\n\n const refineCodes = R.reduce((acc, hC) => {\n const _flatDescendants = flattenDescendants(hC.children);\n const flatDescendants = R.prepend(hC, _flatDescendants);\n\n const valids = R.filter(isValid, flatDescendants);\n\n if (R.isEmpty(valids)) {\n return acc;\n }\n const refined = R.pipe(\n R.reduce((_acc, v) => {\n confirmedHierarchisedChilds.add(v.id);\n const prev = R.last(_acc);\n const parents = R.pipe(\n p => (R.isNil(p) ? [] : R.append(getHierId(p), prev.parents || [])),\n R.filter(id => R.includes(id, v.parents)),\n )(prev);\n const rV = {\n ...R.omit(['unconfirmed', 'children', 'path'], v),\n parents,\n parent: R.isEmpty(parents) ? undefined : R.last(parents),\n };\n return R.append(rV, _acc);\n }, []),\n )(valids);\n return R.concat(acc, refined);\n }, []);\n\n const refined = refineCodes(parsed);\n\n const missingValues = R.pipe(\n R.keys,\n R.filter(id => !confirmedHierarchisedChilds.has(id)),\n ids => R.props(ids, indexedValues),\n R.map(v => ({ ...v, parents: [], parent: undefined })),\n R.sortBy(R.propOr(-1, '__indexPosition')),\n )(indexedValues);\n\n let hierarchicalIndexes = {};\n return R.pipe(\n R.concat,\n R.addIndex(R.map)((v, ind) => {\n const parents = R.props(v.parents, hierarchicalIndexes);\n const hierId = getHierId(v);\n hierarchicalIndexes[hierId] = ind;\n return {\n ...R.dissoc('path', v),\n parents,\n __indexPosition: ind,\n };\n }),\n values => ({ ...dim, values }),\n )(missingValues, refined);\n};\n","import * as R from 'ramda';\nimport { REPORTING_YEAR_START_DAY, REPYEARSTART } from '../constants';\n\nexport const getReportingYearStart = sdmxJson => {\n const attributes = R.pipe(\n R.pathOr({}, ['data', 'structure', 'attributes']),\n ({ dataSet = [], observation = [], series = [] }) => [...dataSet, ...observation, ...series],\n )(sdmxJson);\n\n const reportYearStartAttr =\n R.find(({ id }) => {\n return id === REPORTING_YEAR_START_DAY || id === REPYEARSTART;\n }, attributes) || {};\n const reportYearStart = R.pathOr('--01-01', ['values', 0, 'value'], reportYearStartAttr);\n const [month = '01', day = '01'] = R.match(/[\\d]{2}/g, reportYearStart);\n return { month, day };\n};\n","import * as R from 'ramda';\n\nexport const declineObservationsOverAttributes = (attrsIds, observations) => {\n const obsKeys = R.keys(observations);\n return R.reduce(\n (acc, obsKey) => {\n const obs = R.prop(obsKey, observations);\n const enhancedObs = R.pipe(\n R.over(R.lensProp('orderedDimIndexes'), R.append(0)),\n R.over(R.lensProp('attributes'), R.omit(attrsIds)),\n R.assocPath(['indexedDimValIds', 'OBS_ATTRIBUTES'], 'OBS_VALUE'),\n )(obs);\n return R.addIndex(R.reduce)(\n (_acc, attrId, attrIndex) => {\n const attr = R.pathOr({}, ['attributes', attrId], obs);\n if (\n R.isEmpty(attr) ||\n R.isNil(R.prop('value', attr)) ||\n !R.pathOr(true, ['value', 'display'], attr)\n ) {\n return _acc;\n }\n const declinedKey = `${obsKey}:${attrIndex + 1}`;\n const declined = {\n ...obs,\n attributes: {},\n value: R.prop('value', attr),\n formattedValue: R.prop('value', attr),\n orderedDimIndexes: R.append(attrIndex + 1, obs.orderedDimIndexes),\n indexedDimValIds: {\n ...obs.indexedDimValIds,\n OBS_ATTRIBUTES: attr.id,\n },\n };\n return R.assoc(declinedKey, declined, _acc);\n },\n R.assoc(`${obsKey}:0`, enhancedObs, acc),\n attrsIds,\n );\n },\n {},\n obsKeys,\n );\n};\n","import * as R from 'ramda';\n\nconst registerParsedIndexes = ({ isSameSerie, ...parsed }, register) => {\n const merged = R.mergeWith((a, b) => R.append(a || [], b), parsed, register);\n return { ...merged, isSameSerie };\n};\n\nconst parseParentsIndexesWithPrevious = (parentsIndexes, previousParentsIndexes) => {\n const previousParentsSet = new Set(previousParentsIndexes);\n const lastParentIndexInPrevious = R.findLastIndex(i => previousParentsSet.has(i), parentsIndexes);\n const [rawPresentParentsIndexes, missingParentsIndexes] =\n lastParentIndexInPrevious !== -1\n ? R.splitAt(lastParentIndexInPrevious + 1, parentsIndexes)\n : [[], parentsIndexes];\n const presentParentsIndexes = R.filter(i => previousParentsSet.has(i), rawPresentParentsIndexes);\n return { presentParentsIndexes, missingParentsIndexes };\n};\n\nconst parseSerieIndexesHierarchies = (\n serieIndexes,\n previousSerie,\n dimensions,\n isSameSerie,\n replicate,\n) => {\n return R.addIndex(R.reduce)(\n (acc, _valueIndex, dimensionIndex) => {\n if (R.is(Array, _valueIndex)) {\n const previous = R.isEmpty(previousSerie)\n ? {}\n : R.map(R.nth(dimensionIndex), previousSerie);\n const parsed = parseSerieIndexesHierarchies(\n _valueIndex,\n previous,\n R.pathOr([], [dimensionIndex, 'dimensions'], dimensions),\n acc.isSameSerie,\n replicate,\n );\n return registerParsedIndexes(parsed, acc);\n }\n const valueIndex = Math.abs(_valueIndex);\n const parents = R.pathOr([], [dimensionIndex, 'values', valueIndex, 'parents'], dimensions);\n const previousIndex = R.pipe(R.path(['indexes', dimensionIndex]), i =>\n R.isNil(i) ? -1 : Math.abs(i),\n )(previousSerie);\n const previousParentsIndexes = acc.isSameSerie\n ? R.pipe(\n R.pathOr([], ['parentsIndexes', dimensionIndex]),\n R.append(previousIndex),\n )(previousSerie)\n : [];\n const previousMissingIndexes = acc.isSameSerie\n ? R.pathOr([], ['missingIndexes', dimensionIndex], previousSerie)\n : [];\n /*\n if replicate = true (sections), missing parents insdexes are replicated on each brother nodes not just the first (as empty lines)\n thats why passing previous missing as previous parents in case replicate = false\n */\n const { presentParentsIndexes, missingParentsIndexes } = parseParentsIndexesWithPrevious(\n parents,\n replicate\n ? previousParentsIndexes\n : R.concat(previousParentsIndexes, previousMissingIndexes),\n );\n return registerParsedIndexes(\n {\n parentsIndexes: presentParentsIndexes,\n missingIndexes: missingParentsIndexes,\n isSameSerie: acc.isSameSerie && valueIndex === previousIndex,\n },\n acc,\n );\n },\n { parentsIndexes: [], missingIndexes: [], isSameSerie },\n serieIndexes,\n );\n};\n\nexport const parseSeriesIndexesHierarchies = (\n seriesIndexes,\n dimensions,\n replicateMissing = false,\n) => {\n return R.reduce(\n (acc, { indexes, ...rest }) => {\n const previousSerie = R.last(acc) || {};\n const { isSameSerie, ...parsed } = parseSerieIndexesHierarchies(\n indexes,\n previousSerie,\n dimensions,\n true,\n replicateMissing,\n );\n return R.append({ indexes, ...parsed, ...rest }, acc);\n },\n [],\n seriesIndexes,\n );\n};\n\nexport const parseLayoutIndexesHierarchies = (layoutIndexes, layout) => {\n const header = parseSeriesIndexesHierarchies(layoutIndexes.header, layout.header);\n const sections = R.pipe(R.transpose, ([_sections, _sectionsRows]) => {\n if (R.isNil(_sections)) {\n return [];\n }\n // replicate = true on sections\n const sections = parseSeriesIndexesHierarchies(_sections, layout.sections, true);\n const sectionsRows = R.map(\n rows => parseSeriesIndexesHierarchies(rows, layout.rows),\n _sectionsRows,\n );\n return R.transpose([sections, sectionsRows]);\n })(layoutIndexes.sections);\n\n return { header, sections };\n};\n","import * as R from 'ramda';\nimport { isTimePeriodDimension, isRefAreaDimension } from '@sis-cc/dotstatsuite-sdmxjs';\n\nconst getCombinationsNotInLayout = (combinations, layoutIds) => {\n const { header = [], sections = [], rows = [] } = layoutIds;\n const idsInLayout = new Set([...header, ...sections, ...rows]);\n return R.reject(comb => idsInLayout.has(comb.id), combinations);\n};\n\nconst indexCombsRelationships = combinations =>\n R.reduce(\n (acc, comb) => {\n const { id, relationship = [] } = comb;\n return R.assoc(id, relationship, acc);\n },\n {},\n combinations,\n );\n\nconst getLayoutLevelRelationship = indexedRelationships => ids =>\n R.reduce(\n (acc, id) => {\n if (R.has(id, indexedRelationships)) {\n return R.concat(acc, R.prop(id, indexedRelationships));\n }\n return R.append(id, acc);\n },\n [],\n ids,\n );\n\nconst getLayoutRelationships = (indexedRelationships, layoutIds) =>\n R.map(getLayoutLevelRelationship(indexedRelationships), layoutIds);\n\nconst injectCombination = combination => ids => {\n const { id, concepts = [] } = combination;\n const conceptsSet = new Set(concepts);\n let inject = true;\n const refined = R.reduce(\n (acc, i) => {\n if (!conceptsSet.has(i)) {\n return R.append(i, acc);\n }\n if (inject) {\n inject = false;\n return R.append(id, acc);\n }\n return acc;\n },\n [],\n ids,\n );\n return inject ? R.append(id, refined) : refined;\n};\n\nconst getCombinationLevelCompatibility = (layoutRelationships, combination) => {\n const { relationship = [] } = combination;\n const idsInHeaderSet = new Set(layoutRelationships.header);\n const idsInSectionsSet = new Set(layoutRelationships.sections);\n const idsInRowsSet = new Set(layoutRelationships.rows);\n const [idsInHeader, rest] = R.partition(i => idsInHeaderSet.has(i), relationship);\n const [idsInSections, idsInRows] = R.reduce(\n (_acc, id) => {\n if (idsInSectionsSet.has(id)) return R.over(R.lensIndex(0), R.append(id), _acc);\n if (idsInRowsSet.has(id)) return R.over(R.lensIndex(1), R.append(id), _acc);\n return R.over(R.lensIndex(2), R.append(id), _acc);\n },\n [[], [], []],\n rest,\n );\n if (!R.isEmpty(idsInHeader) && R.isEmpty(idsInSections) && R.isEmpty(idsInRows)) {\n return 'header';\n }\n if (!R.isEmpty(idsInHeader)) {\n return null;\n }\n if (!R.isEmpty(idsInSections) && R.isEmpty(idsInRows)) {\n return 'sections';\n }\n if (!R.isEmpty(idsInRows)) {\n return 'rows';\n }\n return 'blank';\n};\n\nconst filterLayoutIds = (indexedCombinations, layoutDimsIds, obsAttributes) => layoutIds => {\n const layoutConcepts = R.map(\n R.reduce((acc, id) => {\n if (R.has(id, indexedCombinations)) {\n return R.concat(acc, R.path([id, 'concepts'], indexedCombinations));\n }\n return R.append(id, acc);\n }, []),\n layoutIds,\n );\n\n return R.mapObjIndexed(\n (ids, level) =>\n R.filter(id => {\n if (id === 'OBS_ATTRIBUTES') {\n return !R.isEmpty(obsAttributes);\n }\n if (R.has(id, indexedCombinations)) {\n const comb = R.prop(id, indexedCombinations);\n const dims = R.filter(i => layoutDimsIds.has(i), comb.concepts);\n if (!R.isEmpty(dims)) {\n return true;\n }\n const oppositeIds =\n level === 'header'\n ? R.concat(R.prop('sections', layoutConcepts), R.prop('rows', layoutConcepts))\n : R.prop('header', layoutConcepts);\n return R.isEmpty(R.intersection(comb.relationship, oppositeIds));\n }\n return layoutDimsIds.has(id);\n }, ids),\n layoutIds,\n );\n};\n\nexport const injectCombinationsInLayout = (combinations, layoutIds, defaultLayoutIds = {}) => {\n const notInLayoutCombs = getCombinationsNotInLayout(combinations, layoutIds);\n if (R.isEmpty(notInLayoutCombs)) {\n return layoutIds;\n }\n const indexedCombsRelationships = indexCombsRelationships(combinations);\n let layoutRelationships = getLayoutRelationships(indexedCombsRelationships, layoutIds);\n const defaultLayoutRelationships = getLayoutRelationships(\n indexedCombsRelationships,\n defaultLayoutIds,\n );\n return R.reduce(\n (acc, comb) => {\n let levelCompatibility = getCombinationLevelCompatibility(layoutRelationships, comb);\n if (R.isNil(levelCompatibility)) {\n return acc;\n }\n if (R.equals('blank', levelCompatibility)) {\n levelCompatibility = getCombinationLevelCompatibility(defaultLayoutRelationships, comb);\n if (R.isNil(levelCompatibility)) {\n return acc;\n }\n levelCompatibility = R.equals('blank', levelCompatibility) ? 'rows' : levelCompatibility;\n }\n\n layoutRelationships[levelCompatibility] = R.concat(\n layoutRelationships[levelCompatibility],\n comb.relationship,\n );\n const ids = injectCombination(comb)(acc[levelCompatibility]);\n return R.assoc(levelCompatibility, ids)(acc);\n },\n layoutIds,\n notInLayoutCombs,\n );\n};\n\nconst getLayoutDimsIds = dimensions =>\n R.reduce((acc, d) => (d.header ? acc : acc.add(d.id)), new Set([]), dimensions);\n\nconst getLayoutCombinations = (combinations, layoutDimsIds, attributes) => {\n const indexedAttributes = R.indexBy(R.prop('id'), attributes);\n return R.reduce(\n (acc, comb) => {\n const { layoutConcepts, relationship } = R.reduce(\n (_acc, concept) => {\n if (layoutDimsIds.has(concept)) {\n return R.map(R.append(concept), _acc);\n }\n if (R.has(concept, indexedAttributes)) {\n const attr = R.prop(concept, indexedAttributes);\n return attr.series\n ? {\n ..._acc,\n relationship: R.concat(_acc.relationship, attr.relationship),\n }\n : _acc;\n }\n return _acc;\n },\n { layoutConcepts: [], relationship: [] },\n comb.concepts || [],\n );\n if (R.isEmpty(relationship)) {\n return acc;\n }\n return R.append({ ...comb, relationship, concepts: layoutConcepts }, acc);\n },\n [],\n combinations,\n );\n};\n\nconst extractConcepts = (ids, indexedCombinations, layoutDimsIds) => {\n const entry = R.find(id => {\n if (R.has(id, indexedCombinations)) {\n const dimId = R.find(\n i => layoutDimsIds.has(i),\n R.pathOr([], [id, 'concepts'], indexedCombinations),\n );\n return !R.isNil(dimId);\n }\n return true;\n }, ids);\n\n const getRelationship = id => {\n if (R.has(id, indexedCombinations)) {\n return R.append(id, R.path([id, 'relationship'], indexedCombinations));\n }\n return [id];\n };\n let indexedRels = R.reduce((acc, id) => R.assoc(id, getRelationship(id), acc), {}, ids);\n\n let relationship = [entry];\n while (!R.isEmpty(indexedRels)) {\n const related = R.pickBy(rels => !R.isEmpty(R.intersection(relationship, rels)), indexedRels);\n if (R.isEmpty(related)) {\n break;\n }\n indexedRels = R.omit(R.keys(related), indexedRels);\n relationship = R.concat(relationship, R.unnest(R.values(related)));\n }\n const set = new Set(relationship);\n return R.partition(id => set.has(id), ids);\n};\n\nconst injectRemainingDimensionsInLayout = (\n layoutIds,\n remainingDims,\n indexedCombinations,\n layoutDimsIds,\n) => {\n let _layout = layoutIds;\n let _remaining = remainingDims;\n\n const dimInRows = R.find(id => {\n if (layoutDimsIds.has(id)) {\n return true;\n }\n const dimId = R.find(\n i => layoutDimsIds.has(i),\n R.pathOr([], [id, 'concepts'], indexedCombinations),\n );\n return !R.isNil(dimId);\n }, _layout.rows);\n\n if (R.isNil(dimInRows)) {\n if (R.isEmpty(_remaining)) {\n const toTakeIn = R.isEmpty(_layout.sections) ? 'header' : 'sections';\n const [extracted, remains] = extractConcepts(\n R.prop(toTakeIn, _layout),\n indexedCombinations,\n layoutDimsIds,\n );\n _layout = { ..._layout, rows: R.concat(_layout.rows, extracted), [toTakeIn]: remains };\n } else {\n _layout = R.over(R.lensProp('rows'), R.append(R.head(_remaining)))(_layout);\n _remaining = R.tail(_remaining);\n }\n }\n if (!R.isEmpty(_remaining)) {\n const hasNoHeader = R.isEmpty(_layout.header);\n const firstRemaining = R.head(_remaining);\n _remaining = hasNoHeader ? R.tail(_remaining) : _remaining;\n _layout = {\n ..._layout,\n sections: R.concat(_layout.sections, _remaining),\n header: hasNoHeader ? [firstRemaining] : _layout.header,\n };\n }\n return _layout;\n};\n\nexport const getTableLayoutIds = (\n defaultLayoutIds,\n currentLayoutIds,\n dimensions,\n attributes,\n combinations,\n) => {\n const layoutDimsIds = getLayoutDimsIds(dimensions);\n const layoutCombinations = getLayoutCombinations(combinations, layoutDimsIds, attributes);\n const isBlank = R.pipe(R.values, R.all(R.isEmpty))(currentLayoutIds);\n\n const combinationsConcepts = R.pipe(\n R.pluck('_concepts'),\n R.unnest,\n ids => new Set(ids),\n )(combinations);\n const obsAttributes = R.filter(\n a => a.series && R.isEmpty(a.relationship || []) && a.display && !combinationsConcepts.has(a),\n attributes,\n );\n const indexedCombinations = R.indexBy(R.prop('id'), layoutCombinations);\n const filteredLayoutIds = filterLayoutIds(\n indexedCombinations,\n layoutDimsIds,\n obsAttributes,\n )(isBlank ? defaultLayoutIds : currentLayoutIds);\n\n const layoutWithCombs = injectCombinationsInLayout(\n layoutCombinations,\n filteredLayoutIds,\n defaultLayoutIds,\n );\n const layoutRelationshipsSets = R.map(\n R.pipe(\n ids => R.pick(ids, indexedCombinations),\n R.values,\n R.pluck('relationship'),\n R.unnest,\n i => new Set(i),\n ),\n layoutWithCombs,\n );\n const layoutConceptsSets = R.pipe(\n R.map(\n R.reduce((acc, id) => {\n if (R.has(id, indexedCombinations)) {\n return R.concat(acc, R.path([id, 'concepts'], indexedCombinations));\n }\n return R.append(id, acc);\n }, []),\n ),\n R.values,\n R.unnest,\n ids => new Set(ids),\n )(layoutWithCombs);\n const defaultLayoutConceptsSets = R.map(ids => new Set(ids), defaultLayoutIds);\n\n const { nextLayout, remaining } = R.reduce(\n (acc, dim) => {\n if (layoutConceptsSets.has(dim.id) || dim.header) {\n return acc;\n }\n if (\n layoutRelationshipsSets.header.has(dim.id) ||\n defaultLayoutConceptsSets.header.has(dim.id)\n ) {\n return R.over(R.lensPath(['nextLayout', 'header']), R.append(dim.id))(acc);\n }\n if (\n layoutRelationshipsSets.sections.has(dim.id) ||\n defaultLayoutConceptsSets.sections.has(dim.id)\n ) {\n return R.over(R.lensPath(['nextLayout', 'sections']), R.append(dim.id))(acc);\n }\n if (layoutRelationshipsSets.rows.has(dim.id) || defaultLayoutConceptsSets.rows.has(dim.id)) {\n return R.over(R.lensPath(['nextLayout', 'rows']), R.append(dim.id))(acc);\n }\n if (isTimePeriodDimension(dim)) {\n return R.over(R.lensPath(['nextLayout', 'header']), R.append(dim.id))(acc);\n }\n if (isRefAreaDimension(dim)) {\n return R.over(R.lensPath(['nextLayout', 'rows']), R.append(dim.id))(acc);\n }\n return R.over(R.lensProp('remaining'), R.append(dim.id))(acc);\n },\n { nextLayout: layoutWithCombs, remaining: [] },\n dimensions,\n );\n\n return injectRemainingDimensionsInLayout(\n nextLayout,\n remaining,\n indexedCombinations,\n layoutDimsIds,\n );\n};\n","import * as R from 'ramda';\n\nexport const getDataflowTooltipAttributesIds = (sdmxJson, defaults = {}) => {\n const dataflowAnnotationsIndexes = R.pathOr([], ['data', 'dataSets', 0, 'annotations'], sdmxJson);\n const dataflowAnnotations = R.props(\n dataflowAnnotationsIndexes,\n R.pathOr([], ['data', 'structure', 'annotations'], sdmxJson),\n );\n\n const flagsAttrAnnotation = R.find(R.propEq('LAYOUT_FLAG', 'type'), dataflowAnnotations);\n const footnotesAttrAnnotation = R.find(R.propEq('LAYOUT_NOTE', 'type'), dataflowAnnotations);\n\n const customFlags = R.pipe(R.propOr('', 'title'), title =>\n R.isNil(title) || R.isEmpty(title) ? [] : R.split(',', title),\n )(flagsAttrAnnotation || {});\n\n const customNotes = R.pipe(\n R.propOr('', 'title'),\n title => (R.isNil(title) || R.isEmpty(title) ? [] : R.split(',', title)),\n notes => R.difference(notes, customFlags),\n )(footnotesAttrAnnotation || {});\n\n const flags = R.isNil(flagsAttrAnnotation)\n ? R.difference(defaults.flags || [], customNotes)\n : customFlags;\n\n const notes = R.isNil(footnotesAttrAnnotation)\n ? R.difference(defaults.notes || [], flags)\n : customNotes;\n\n return { flags, notes };\n};\n","import * as R from 'ramda';\n\nexport const getDimensionValuesIndexes = values =>\n R.addIndex(R.reduce)(\n (acc, value, position) => {\n const sdmxIndex = value.__index;\n return R.over(\n R.lensProp(String(sdmxIndex)),\n R.ifElse(R.isNil, R.always([position]), R.append(position)),\n )(acc);\n },\n {},\n values,\n );\n","import * as R from 'ramda';\n\nexport const getMSDInformations = msdJson => {\n const attributesDefinitions = R.pathOr(\n [],\n [\n 'data',\n 'metadataStructures',\n 0,\n 'metadataStructureComponents',\n 'reportStructures',\n 0,\n 'metadataAttributes',\n ],\n msdJson,\n );\n const indexedConcepts = R.pipe(\n R.pathOr([], ['data', 'conceptSchemes', 0, 'concepts']),\n R.indexBy(R.prop('id')),\n )(msdJson);\n\n const parseAttributes = parent =>\n R.reduce((acc, attribute) => {\n const id = attribute.id;\n const name = R.path([id, 'name'], indexedConcepts);\n const hierarchicalId = parent === '#ROOT' ? id : `${parent}.${id}`;\n const format = R.path(['localRepresentation', 'textFormat', 'textType'], attribute);\n if (R.has('metadataAttributes', attribute)) {\n const collection = parseAttributes(hierarchicalId)(attribute.metadataAttributes);\n return { ...acc, ...collection, [hierarchicalId]: { format, parent, id, name } };\n }\n return R.assoc(hierarchicalId, { format, parent, id, name }, acc);\n }, {});\n\n return { attributes: parseAttributes('#ROOT')(attributesDefinitions) };\n};\n","import * as R from 'ramda';\nimport { combinedValuesDisplay, singleValueDisplay } from '../combinedValuesDisplay';\n\nexport const getTableLabelAccessor = display => content => {\n return R.is(Array, content)\n ? combinedValuesDisplay(display, content)\n : singleValueDisplay(display, content);\n};\n","import * as R from 'ramda';\nimport { declineObservationsOverAttributes } from './declineObservationsOverAttributes';\nimport { getLayout } from './getLayout';\nimport { getSortedLayoutIndexes } from './getSortedLayoutIndexes';\nimport { parseLayoutIndexesHierarchies } from './parseSeriesIndexesHierarchies';\nimport { refineLayoutSize } from './refineLayoutSize2';\nimport { getLayoutData } from './getLayoutData2';\nimport { getCellsAttributesIds } from './getCellsAttributesIds';\nimport { getIndexedCombinationsByDisplay } from './getIndexedCombinationsByDisplay';\nimport { getCells } from './getCells';\nimport { getCuratedCells } from './getCuratedCells';\nimport { getSeriesCombinations } from '../getSeriesCombinations';\nimport { getCellsMetadataCoordinates } from './getCellsMetadataCoordinates';\n\nexport const getTableProps = ({ data, layoutIds, customAttributes, limit, isTimeInverted }) => {\n const {\n observations,\n dimensions,\n combinations,\n oneValueDimensions,\n attributesSeries,\n metadataCoordinates,\n attributes,\n header,\n rejectedDimensions = [],\n } = data;\n\n const obsAttributes = R.filter(\n a => a.series && R.isEmpty(a.relationship) && a.display && !a.combined,\n attributes,\n );\n let dupObs = observations;\n const hasDuplicatedCells = R.pipe(\n R.values,\n R.unnest,\n R.find(R.equals('OBS_ATTRIBUTES')),\n )(layoutIds);\n if (hasDuplicatedCells) {\n const attrsIds = R.pluck('id', obsAttributes);\n dupObs = declineObservationsOverAttributes(attrsIds, observations);\n }\n const seriesCombinations = getSeriesCombinations(combinations, oneValueDimensions);\n const _dims = R.append(\n {\n id: 'OBS_ATTRIBUTES',\n values: R.prepend({ id: 'OBS_VALUE' }, obsAttributes),\n },\n dimensions,\n );\n const layout = getLayout(layoutIds, _dims, seriesCombinations, isTimeInverted);\n const layoutDimsIds = R.map(\n R.reduce((acc, entry) => {\n if (R.has('dimensions', entry)) {\n return R.concat(acc, R.pluck('id', entry.dimensions));\n }\n return R.append(entry.id, acc);\n }, []),\n layout,\n );\n const layoutIndexes = getSortedLayoutIndexes(layout, dupObs, rejectedDimensions);\n const enhancedLayoutIndexes = parseLayoutIndexesHierarchies(layoutIndexes, layout);\n const refinedLayoutIndexes = refineLayoutSize({ layout, observations: dupObs, limit })(\n enhancedLayoutIndexes,\n );\n const layoutData = getLayoutData(refinedLayoutIndexes, layout, {\n metadataCoordinates,\n attributesSeries,\n customAttributes,\n topCoordinates: header.coordinates,\n rejectedDimensions,\n });\n\n const cellsAttributesIds = getCellsAttributesIds(layoutDimsIds, attributes);\n const indexedCombinations = getIndexedCombinationsByDisplay(layout, seriesCombinations);\n const cellsMetadataCoordinates = getCellsMetadataCoordinates(\n metadataCoordinates,\n oneValueDimensions,\n layoutDimsIds,\n );\n const cells = getCells(\n customAttributes,\n cellsAttributesIds,\n indexedCombinations,\n attributesSeries,\n cellsMetadataCoordinates,\n )(dupObs);\n\n return {\n ...layoutData,\n cells: getCuratedCells(cells, layout),\n layout,\n combinations: seriesCombinations,\n };\n};\n","import * as R from 'ramda';\n\nexport const parseHierarchicalCodelist = (sdmxJson, hierarchyId) => {\n const hCodelist = R.pathOr({}, ['data', 'hierarchicalCodelists', 0], sdmxJson);\n const hierarchy = R.find(R.propEq(hierarchyId, 'id'), hCodelist.hierarchies || []);\n\n const getParentedCodes = (codes, parent) => {\n const ids = R.pluck('codeID', codes);\n\n const siblings = R.reduce(\n (acc, code) => {\n if (R.isEmpty(code.hierarchicalCodes || [])) {\n return acc;\n }\n return R.mergeRight(acc, getParentedCodes(code.hierarchicalCodes, code.id));\n },\n {},\n codes,\n );\n\n return { ...siblings, [parent]: ids };\n };\n\n const getChildren = (codes, parents) => {\n const ids = R.pluck('codeID', codes);\n\n const children = R.reduce(\n (acc, code) => {\n if (R.isEmpty(code.hierarchicalCodes || [])) {\n return acc;\n }\n return {\n ...acc,\n ...getChildren(code.hierarchicalCodes, R.append(code.codeID, parents)),\n };\n },\n {},\n codes,\n );\n const key = R.isEmpty(parents) ? '#ROOT' : R.join('.', parents);\n return { ...children, [key]: ids };\n };\n\n return R.pipe(R.propOr([], 'hierarchicalCodes'), codes => getChildren(codes, []))(hierarchy);\n};\n","import * as R from 'ramda';\n\nexport const parseValueHierarchy = (value, previousValue, indexedValues) => {\n const parentsIds = R.propOr([], 'parents', value);\n if (R.isEmpty(parentsIds)) {\n return value;\n }\n const _previousParentsIds = R.propOr([], 'parentsIds', previousValue);\n const previousParentsIds = R.isNil(previousValue)\n ? []\n : R.append(R.prop('id', previousValue), _previousParentsIds);\n const [presentIds, _missingIds] = R.addIndex(R.splitWhen)(\n (val, ind) => R.nth(ind, previousParentsIds) !== val,\n parentsIds,\n );\n const __previousParentsIds = R.pipe(R.propOr([], 'parents'), R.pluck('id'))(previousValue);\n const missingIds = R.pipe(\n R.takeLastWhile(\n id => !R.includes(id, __previousParentsIds) && id !== R.prop('id', previousValue),\n ),\n ids => R.concat(ids, _missingIds),\n )(presentIds);\n const _previousParents = R.propOr([], 'parents', previousValue);\n const previousParents = R.isNil(previousValue)\n ? []\n : R.append(R.pick(['id', 'name'], previousValue), _previousParents);\n const parents = R.takeWhile(p => R.includes(p.id, presentIds), previousParents);\n const missingParents = R.props(missingIds, indexedValues);\n return {\n ...value,\n parents,\n parentsIds,\n missingParents,\n };\n};\n","import * as R from 'ramda';\nimport { getObservations } from '../../rules/src/preparators/getObservations';\nimport { refineDimensions } from './refineDimensions';\nimport { enhanceObservations } from './enhanceObservations';\nimport { parseAttributes } from './parseAttributes';\nimport { getCombinationDefinitions, parseCombinationDefinition } from './getCombinationDefinitions';\nimport { parseCombinations } from './parseCombinations';\nimport { refineAttributes } from './refineAttributes';\nimport { duplicateObs } from './duplicateObservations';\nimport { getMetadataCoordinates } from './getMetadataCoordinates';\nimport { getAttributesSeries } from './getAttributesSeries';\nimport { getManyValuesDimensions } from './getManyValuesDimensions';\nimport { getOneValueDimensions } from './getOneValueDimensions';\nimport { hierarchiseDimensionWithNativeHierarchy } from './hierarchiseDimensionWithNativeHierarchy2';\nimport { getDataflowAttributes } from './getDataflowAttributes';\nimport { getHeaderTitle } from './getHeaderTitle';\nimport { getHeaderSubtitle } from './getHeaderSubtitle';\nimport { getHeaderCombinations } from './getHeaderCombinations';\nimport { getHeaderCoordinates } from './getHeaderCoordinates';\nimport { applyHierarchicalCodesToDim } from './applyHierarchicalCodesToDim';\nimport { getReportingYearStart } from '../../rules/src/preparators/getReportingYearStart';\nimport { getNotDisplayedIds } from './getNotDisplayedIds';\nimport { getAttributes } from './getAttributes';\n\nexport const prepareData = (\n sdmxJson,\n { customAttributes, locale, hierarchies, dataflow, display, defaultCombinations, dataquery },\n) => {\n const dimensions = R.pathOr([], ['data', 'structure', 'dimensions', 'observation'], sdmxJson);\n const annotations = R.pathOr([], ['data', 'structure', 'annotations'], sdmxJson);\n const reportYearStart = getReportingYearStart(sdmxJson);\n const { hiddenValues, hiddenCombinations } = getNotDisplayedIds(annotations);\n const options = { dataquery, hiddenCombinations, hiddenValues, locale, reportYearStart };\n const refinedDimensions = refineDimensions({ annotations, dimensions, options });\n const _attributes = R.pathOr([], ['data', 'structure', 'attributes'], sdmxJson);\n const attributes = getAttributes({ attributes: _attributes, annotations, options });\n const observations = getObservations(sdmxJson);\n let combinations = getCombinationDefinitions(annotations, locale);\n if (R.isEmpty(combinations) && !R.isEmpty(defaultCombinations)) {\n const { concepts, names } = defaultCombinations;\n combinations = parseCombinationDefinition(locale)(concepts, names);\n }\n const metadataCoordinates = getMetadataCoordinates(sdmxJson);\n\n const parsedAttributes = parseAttributes(attributes, refinedDimensions, customAttributes);\n const parsedCombinations = parseCombinations(combinations, parsedAttributes, refinedDimensions);\n const seriesCombinations = R.filter(R.prop('series'), parsedCombinations);\n const refinedAttributes = refineAttributes(parsedAttributes, seriesCombinations);\n\n const enhancedObservations = enhanceObservations(\n refinedDimensions,\n observations,\n refinedAttributes,\n { customAttributes },\n );\n const attributesSeries = getAttributesSeries(enhancedObservations);\n const manyValuesDimensions = getManyValuesDimensions(\n refinedDimensions,\n attributesSeries,\n customAttributes,\n seriesCombinations,\n );\n const oneValueDimensions = getOneValueDimensions(refinedDimensions, parsedAttributes);\n const rejectedDimensions = R.filter(R.prop('rejected'), dimensions);\n const headerCoordinates = getHeaderCoordinates(oneValueDimensions);\n const hierarchisedDimensions = R.map(dim => {\n if (R.isEmpty(R.propOr({}, dim.id, hierarchies))) {\n return hierarchiseDimensionWithNativeHierarchy(dim);\n }\n return applyHierarchicalCodesToDim(R.prop(dim.id, hierarchies), dim);\n }, manyValuesDimensions);\n const duplicatedObservations = duplicateObs(\n R.values(hierarchisedDimensions),\n enhancedObservations,\n );\n\n const dataflowAttributes = getDataflowAttributes(parsedAttributes, parsedCombinations);\n const headerTitle = getHeaderTitle(dataflow, dataflowAttributes, display, customAttributes);\n const headerSubtitle = getHeaderSubtitle(\n oneValueDimensions,\n parsedCombinations,\n customAttributes,\n display,\n );\n const headerCombinations = getHeaderCombinations(\n parsedCombinations,\n oneValueDimensions,\n refinedAttributes,\n display,\n );\n\n return {\n observations: duplicatedObservations,\n dimensions: hierarchisedDimensions,\n combinations: parsedCombinations,\n oneValueDimensions,\n attributesSeries,\n metadataCoordinates,\n attributes: refinedAttributes,\n rejectedDimensions,\n header: {\n title: headerTitle,\n subtitle: headerSubtitle,\n combinations: headerCombinations,\n coordinates: headerCoordinates,\n },\n };\n};\n","import * as R from 'ramda';\n\nexport const sdmx_3_0_DataFormatPatch = sdmxJson => {\n const dataSet = R.pipe(R.pathOr({}, ['data', 'dataSets']), R.head)(sdmxJson);\n const structureIndex = R.prop('structure', dataSet);\n const structure = R.pipe(R.pathOr([], ['data', 'structures']), R.nth(structureIndex))(sdmxJson);\n\n return R.set(R.lensPath(['data', 'structure']), structure)(sdmxJson);\n};\n","import * as R from 'ramda';\nimport { H_SYMBOL, SCATTER, STACKED_BAR, STACKED_ROW, V_SYMBOL } from './constants';\nimport {\n getCombinationDefinitions,\n refineDimensions,\n parseCombinationDefinition,\n} from '../../rules2/src';\nimport { getReportingYearStart } from './/preparators/getReportingYearStart';\n\nconst isTableLayoutCompatible = (data, layout, combinationsDefinitions = [], dataquery = '') => {\n const indexedCombinations = R.indexBy(R.prop('id'), combinationsDefinitions);\n const reportYearStart = getReportingYearStart(data);\n const indexedManyValuesDimensions = R.pipe(\n R.pathOr([], ['structure', 'dimensions', 'observation']),\n dimensions => refineDimensions({ dimensions, options: { dataquery, reportYearStart } }),\n R.reject(d => R.prop('header', d) || !R.length(d.values || [])),\n R.indexBy(R.prop('id')),\n )(data);\n let remainings = indexedManyValuesDimensions;\n const layoutIds = R.pipe(R.values, R.unnest)(layout);\n let hasFoundIrrelevant = false;\n R.forEach(id => {\n if (R.has(id, indexedManyValuesDimensions)) {\n remainings = R.dissoc(id, remainings);\n } else if (R.has(id, indexedCombinations)) {\n remainings = R.omit(R.pathOr([], [id, 'concepts'], indexedCombinations), remainings);\n } else if (id !== 'OBS_ATTRIBUTES') {\n hasFoundIrrelevant = true;\n }\n }, layoutIds);\n return R.isEmpty(remainings) && !hasFoundIrrelevant;\n};\n\nconst isScatterLayoutCompatible = (data, chartDimension) => {\n const { id, xId, yId } = chartDimension;\n\n const dimensions = R.pathOr([], ['structure', 'dimensions', 'observation'], data);\n\n const dimension = R.find(R.propEq(id, 'id'), dimensions);\n if (R.isNil(dimension)) {\n return false;\n }\n return R.pipe(\n R.propOr([], 'values'),\n R.indexBy(R.prop('id')),\n R.pick([xId, yId]),\n R.values,\n R.length,\n R.equals(2),\n )(dimension);\n};\n\nconst isSymbolLayoutCompatible = (data, chartDimension) => {\n const { id, serie } = chartDimension;\n const serieIds = R.pluck('id', serie);\n\n return R.pipe(\n R.pathOr([], ['structure', 'dimensions', 'observation']),\n R.indexBy(R.prop('id')),\n R.pathOr([], [id, 'values']),\n R.indexBy(R.prop('id')),\n R.pick(serieIds),\n R.values,\n R.length,\n R.equals(R.length(serieIds)),\n )(data);\n};\n\nconst isStackedLayoutCompatible = (data, chartDimension) => {\n const { id } = chartDimension;\n\n return R.pipe(\n R.pathOr([], ['structure', 'dimensions', 'observation']),\n R.filter(R.pipe(R.propOr([], 'values'), R.length, R.lt(1))),\n R.indexBy(R.prop('id')),\n R.has(id),\n )(data);\n};\n\nconst isChartLayoutCompatible = (data, type, chartDimension) => {\n return R.cond([\n [R.always(R.equals(SCATTER, type)), isScatterLayoutCompatible],\n [R.always(R.equals(H_SYMBOL, type) || R.equals(V_SYMBOL, type)), isSymbolLayoutCompatible],\n [\n R.always(R.anyPass([R.equals(STACKED_BAR), R.equals(STACKED_ROW)])(type)),\n isStackedLayoutCompatible,\n ],\n [R.T, R.T],\n ])(data, chartDimension);\n};\n\nexport const isSharedLayoutCompatible = (sdmxData, sharedData) => {\n const type = R.prop('type', sharedData);\n if (type === 'table') {\n const layoutIds = R.pathOr({}, ['config', 'table', 'layoutIds'], sharedData);\n const dataquery = R.path(['config', 'sdmxSource', 'dataquery'], sharedData);\n const annotations = R.pathOr({}, ['structure', 'annotations'], sdmxData);\n const locale = R.pathOr({}, ['config', 'table', 'locale'], sharedData);\n const rawDefaultCombinationsDefinition = R.pathOr(\n {},\n ['config', 'defaultCombinations'],\n sharedData,\n );\n const { concepts = '', names = '' } = rawDefaultCombinationsDefinition;\n const defaultCombinationsDefinition = parseCombinationDefinition(locale)(concepts, names);\n const customCombinationsDefinitions = getCombinationDefinitions(annotations, locale);\n const combinationsDefinitions =\n R.isNil(customCombinationsDefinitions) || R.isEmpty(customCombinationsDefinitions)\n ? defaultCombinationsDefinition\n : customCombinationsDefinitions;\n return isTableLayoutCompatible(sdmxData, layoutIds, combinationsDefinitions, dataquery);\n }\n const chartDimension = R.pathOr({}, ['config', 'chart', 'chartDimension'], sharedData);\n return isChartLayoutCompatible(sdmxData, type, chartDimension);\n};\n","import * as R from 'ramda';\nimport numeral from 'numeral';\n\nconst isValidNumber = R.both(R.is(Number), R.complement(R.equals(NaN)));\n\nexport const getCellValue = observation => {\n const value = R.prop('value', observation);\n if (R.is(Boolean, value)) {\n return value;\n }\n if (R.is(String, value)) {\n const monthMatch = value.match(/^--([\\d]{2})$/);\n if (R.is(Array, monthMatch)) {\n return R.nth(1, monthMatch);\n }\n const monthDayMatch = value.match(/^--([\\d]{2}-[\\d]{2})$/);\n if (R.is(Array, monthDayMatch)) {\n return R.nth(1, monthDayMatch);\n }\n const dayMatch = value.match(/^---([\\d]{2})$/);\n if (R.is(Array, dayMatch)) {\n return R.nth(1, dayMatch);\n }\n return value;\n }\n const scale = Number(observation.prefscale);\n const formatScale = R.ifElse(\n R.always(isValidNumber(scale)),\n value =>\n numeral(value)\n .multiply(Math.pow(10, -1 * Number(scale)))\n .value(),\n R.identity,\n );\n const formatSeparator = value => numeral(value).format(`0,0.[0000000]`);\n const decimals = Number(observation.decimals);\n const formatDecimals = R.ifElse(\n R.always(isValidNumber(decimals)),\n value =>\n numeral(value).format(\n R.ifElse(\n R.equals(0),\n R.always('0,0'),\n d => `0,0.${R.join('', R.times(R.always('0'), d))}`,\n )(decimals),\n ),\n formatSeparator,\n );\n const res = R.ifElse(\n isValidNumber,\n R.pipe(formatScale, formatDecimals),\n R.always('..'),\n )(observation.value);\n return res;\n};\n","import * as R from 'ramda';\nimport numeral from 'numeral';\nimport * as dateFns from 'date-fns';\nimport isMonday from 'date-fns/isMonday';\nimport isTuesday from 'date-fns/isTuesday';\nimport isWednesday from 'date-fns/isWednesday';\nimport isThursday from 'date-fns/isThursday';\nimport isFriday from 'date-fns/isFriday';\nimport isSaturday from 'date-fns/isSaturday';\nimport isSunday from 'date-fns/isSunday';\nimport getISOWeek from 'date-fns/getISOWeek';\nimport { getLocale, dateWithoutTZ } from '../date';\nimport {\n BAR,\n CHORO,\n H_SYMBOL,\n ROW,\n SCATTER,\n STACKED_BAR,\n STACKED_ROW,\n TIMELINE,\n V_SYMBOL,\n} from '../constants';\n\nconst defaultTimeFormats = {\n A: 'yyyy',\n S: 'yyyy-',\n Q: \"yyyy-'Q'Q\",\n M: 'yyyy-MMM',\n W: \"yyyy-'W'II\",\n B: \"yyyy-'W'II\",\n D: 'yyyy-MM-dd',\n H: 'yyyy-MM-dd[T]HH:mm:ss',\n N: 'yyyy-MM-dd[T]HH:mm:ss',\n};\n\nexport const getTimeProc = (frequency, timeFormats = {}, locale) => {\n if (frequency === 'W' || frequency === 'B') {\n return datum => {\n const isoWeek = getISOWeek(datum);\n if (isoWeek !== 1) {\n return dateFns.format(datum, \"yyyy-'W'II\", { locale: getLocale(locale) });\n }\n const seventhDay = dateFns.endOfWeek(datum, { weekStartsOn: 1 });\n return dateFns.format(seventhDay, \"yyyy-'W'II\", { locale: getLocale(locale) });\n };\n }\n const format = R.pipe(\n R.mergeRight(defaultTimeFormats),\n R.ifElse(R.has(frequency), R.prop(frequency), R.prop('A')),\n )(timeFormats);\n return datum =>\n dateFns.format(dateWithoutTZ(new Date(datum)), format, { locale: getLocale(locale) });\n};\n\nconst getTimeFrequency = data => {\n const frequency = R.prop('frequency', data);\n if (frequency === 'W' || frequency === 'B') {\n const date = R.pathOr(['series', 0, 'datapoints', 'x']);\n return R.cond([\n [isMonday, R.always('monday')],\n [isTuesday, R.always('tueday')],\n [isWednesday, R.always('wednesday')],\n [isThursday, R.always('thursday')],\n [isFriday, R.always('friday')],\n [isSaturday, R.always('saturday')],\n [isSunday, R.always('sunday')],\n [R.T, R.always('monday')],\n ])(date);\n }\n return R.cond([\n [R.equals('A'), R.always('year')],\n [R.equals('S'), R.always('month')],\n [R.equals('Q'), R.always('month')],\n [R.equals('M'), R.always('month')],\n [R.equals('D'), R.always('day')],\n [R.equals('H'), R.always('hour')],\n [R.equals('N'), R.always('minute')],\n [R.T, R.always('year')],\n ])(frequency);\n};\n\nconst getTimeStep = R.cond([\n [R.equals('A'), R.always(1)],\n [R.equals('S'), R.always(6)],\n [R.equals('Q'), R.always(3)],\n [R.equals('M'), R.always(1)],\n [R.equals('W'), R.always(1)],\n [R.equals('B'), R.always(1)],\n [R.equals('D'), R.always(1)],\n [R.equals('H'), R.always(1)],\n [R.equals('N'), R.always(1)],\n [R.T, R.always(1)],\n]);\n\nexport const getAxisOptions = (data, type, options, timeFormats, locale) => {\n const axis = {\n linear: { pivot: { color: 'white' } },\n ordinal: { gap: 0.3, padding: 0.3 },\n thickness: 0,\n };\n\n const linearProc = d => {\n if (Math.abs(d) < 0.01 && d) {\n return numeral(d).format('0.[00]e+0');\n }\n return numeral(d).format('0,0.[00]');\n };\n\n return R.pipe(\n R.propOr({}, 'axis'),\n R.mergeDeepRight({ x: axis, y: axis }),\n R.cond([\n [\n R.always(R.equals(BAR, type)),\n R.pipe(\n R.mergeDeepRight({\n x: { format: { proc: R.identity }, tick: { thickness: 0, size: 0 } },\n y: {\n font: { baseline: 'ideographic' },\n format: { proc: linearProc },\n padding: 10,\n tick: { thickness: 0 },\n },\n }),\n R.over(R.lensPath(['y', 'linear', 'pivot', 'value']), R.when(R.isNil, R.always(0))),\n ),\n ],\n [\n R.always(R.equals(ROW, type)),\n R.pipe(\n R.mergeDeepRight({\n x: {\n format: { proc: linearProc },\n orient: 'top',\n padding: 10,\n tick: { thickness: 0 },\n },\n y: {\n format: { proc: R.identity },\n ordinal: { minDisplaySize: 300 },\n tick: { thickness: 0, size: 0 },\n },\n }),\n R.over(R.lensPath(['x', 'linear', 'pivot', 'value']), R.when(R.isNil, R.always(0))),\n ),\n ],\n [\n R.always(R.equals(SCATTER, type)),\n R.mergeDeepRight({\n x: {\n format: { proc: linearProc },\n tick: { thickness: 0, size: 0 },\n },\n y: {\n font: { baseline: 'ideographic' },\n format: { proc: linearProc },\n padding: 10,\n tick: { thickness: 0 },\n },\n }),\n ],\n [\n R.always(R.equals(TIMELINE, type)),\n R.pipe(\n R.mergeDeepRight({\n x: {\n format: {\n isTime: true,\n pattern: null,\n proc: getTimeProc(R.prop('frequency', data), timeFormats, locale),\n },\n tick: { size: -6, minorSize: -3, thickness: 2, minorThickness: 2, color: 'white' },\n },\n y: {\n font: { baseline: 'ideographic' },\n format: { proc: d => numeral(d).format('0,0.[00]') },\n padding: 10,\n tick: { thickness: 0 },\n },\n }),\n R.evolve({\n x: R.pipe(\n R.set(R.lensPath(['linear', 'frequency']), getTimeFrequency(data)),\n R.set(R.lensPath(['linear', 'step']), getTimeStep(R.prop('frequency', data))),\n R.over(\n R.lensPath(['tick', 'step']),\n R.pipe(\n R.when(R.isNil, R.always(1)),\n R.multiply(getTimeStep(R.prop('frequency', data))),\n ),\n ),\n ),\n }),\n ),\n ],\n [\n R.always(R.equals(H_SYMBOL, type)),\n R.mergeDeepRight({\n x: {\n format: { proc: linearProc },\n orient: 'top',\n padding: 10,\n tick: { thickness: 0 },\n },\n y: {\n format: { proc: R.identity },\n ordinal: { minDisplaySize: 300 },\n tick: { thickness: 0, size: 5 },\n },\n }),\n ],\n [\n R.always(R.equals(V_SYMBOL, type)),\n R.mergeDeepRight({\n x: { format: { proc: R.identity }, tick: { thickness: 0, size: 0 } },\n y: {\n font: { baseline: 'ideographic' },\n format: { proc: linearProc },\n padding: 10,\n tick: { thickness: 0 },\n },\n }),\n ],\n [\n R.always(R.equals(STACKED_BAR, type)),\n R.pipe(\n R.mergeDeepRight({\n x: { format: { proc: R.identity }, tick: { thickness: 0, size: 0 } },\n y: {\n font: { baseline: 'ideographic' },\n format: { proc: linearProc },\n padding: 10,\n tick: { thickness: 0 },\n },\n }),\n R.over(R.lensPath(['y', 'linear', 'pivot', 'value']), R.when(R.isNil, R.always(0))),\n ),\n ],\n [\n R.always(R.equals(STACKED_ROW, type)),\n R.pipe(\n R.mergeDeepRight({\n x: {\n format: { proc: linearProc },\n orient: 'top',\n padding: 10,\n tick: { thickness: 0 },\n },\n y: {\n format: { proc: R.identity },\n ordinal: { minDisplaySize: 300 },\n tick: { thickness: 0, size: 0 },\n },\n }),\n R.over(R.lensPath(['x', 'linear', 'pivot', 'value']), R.when(R.isNil, R.always(0))),\n ),\n ],\n [R.T, R.identity],\n ]),\n )(options);\n};\n","import * as R from 'ramda';\nimport {\n BAR,\n CHORO,\n H_SYMBOL,\n ROW,\n SCATTER,\n STACKED_BAR,\n STACKED_ROW,\n TIMELINE,\n V_SYMBOL,\n} from '../constants';\n\nexport const getBaseOptions = (type, options) =>\n R.pipe(\n R.propOr({}, 'base'),\n R.cond([\n [\n R.always(R.equals(BAR, type)),\n R.mergeDeepRight({\n minDisplayHeight: 100,\n minDisplayWidth: 300,\n padding: { top: 20 },\n innerPadding: { left: 20, right: 20, bottom: 10 },\n }),\n ],\n [\n R.always(R.equals(ROW, type)),\n R.mergeDeepRight({\n minDisplayHeight: 300,\n minDisplayWidth: 100,\n padding: { top: 10, left: 10, right: 20 },\n }),\n ],\n [\n R.always(R.equals(SCATTER, type)),\n R.mergeDeepRight({\n minDisplayHeight: 100,\n minDisplayWidth: 100,\n padding: { top: 40, right: 10 },\n }),\n ],\n [\n R.always(R.equals(TIMELINE, type)),\n R.mergeDeepRight({\n minDisplayHeight: 300,\n minDisplayWidth: 100,\n isAnnotated: false,\n padding: { top: 20 },\n innerPadding: { left: 40, right: 40 },\n }),\n ],\n [\n R.always(R.equals(H_SYMBOL, type)),\n R.mergeDeepRight({\n minDisplayHeight: 300,\n minDisplayWidth: 100,\n padding: { top: 10, left: 10, right: 20 },\n }),\n ],\n [\n R.always(R.equals(V_SYMBOL, type)),\n R.mergeDeepRight({\n minDisplayHeight: 100,\n minDisplayWidth: 300,\n padding: { top: 20 },\n innerPadding: { left: 20, right: 20, bottom: 10 },\n }),\n ],\n [\n R.always(R.equals(STACKED_BAR, type)),\n R.mergeDeepRight({\n minDisplayHeight: 100,\n minDisplayWidth: 300,\n padding: { top: 20 },\n innerPadding: { left: 20, right: 20, bottom: 10 },\n }),\n ],\n [\n R.always(R.equals(STACKED_ROW, type)),\n R.mergeDeepRight({ padding: { top: 10, left: 10, right: 20 } }),\n ],\n [R.T, R.identity],\n ]),\n )(options);\n","import * as R from 'ramda';\nimport {\n BAR,\n CHORO,\n H_SYMBOL,\n ROW,\n STACKED_BAR,\n STACKED_ROW,\n TIMELINE,\n V_SYMBOL,\n} from '../constants';\n\nexport const getGridOptions = (type, options) => {\n const grid = { baselines: [0], color: 'white' };\n const hideGrid = R.assoc('thickness', 0);\n\n return R.pipe(\n R.propOr({}, 'grid'),\n R.mergeDeepRight({ x: grid, y: grid }),\n R.cond([\n [R.always(R.equals(BAR, type)), R.mergeDeepRight({ x: { thickness: 0 } })],\n [R.always(R.equals(ROW, type)), R.mergeDeepRight({ y: { thickness: 0 } })],\n [R.always(R.equals(TIMELINE, type)), R.mergeDeepRight({ x: { thickness: 0 } })],\n [R.always(R.equals(H_SYMBOL, type)), R.mergeDeepRight({ y: { thickness: 0 } })],\n [R.always(R.equals(V_SYMBOL, type)), R.mergeDeepRight({ x: { thickness: 0 } })],\n [R.always(R.equals(STACKED_BAR, type)), R.mergeDeepRight({ x: { thickness: 0 } })],\n [R.always(R.equals(STACKED_ROW, type)), R.mergeDeepRight({ y: { thickness: 0 } })],\n [R.T, R.identity],\n ]),\n )(options);\n};\n","import * as R from 'ramda';\nimport numeral from 'numeral';\nimport { format } from 'date-fns';\nimport {\n BAR,\n CHORO,\n H_SYMBOL,\n ROW,\n SCATTER,\n STACKED_BAR,\n STACKED_ROW,\n TIMELINE,\n V_SYMBOL,\n} from '../constants';\nimport { getTimeProc } from './getAxisOptions';\n\nexport const getTooltipOptions = (data, type, options, fonts = {}, timeFormats = {}, locale) => {\n const primaryFonts = color => `\n font-size: ${R.pathOr(12, ['primary', 'fontSize'], fonts)}px;\n font-family: ${R.pathOr('inherit', ['primary', 'fontFamily'], fonts)};\n font-weight: ${R.pathOr('normal', ['primary', 'fontWeight'], fonts)};\n color: ${color};\n padding: 5px;\n border: 1px solid ${color};\n background: white;\n opacity: .8;\n `;\n\n const secondaryFonts = `\n font-family: ${R.pathOr('inherit', ['secondary', 'fontFamily'], fonts)};\n font-size: ${R.pathOr(12, ['secondary', 'fontSize'], fonts)}px;\n font-weight: ${R.pathOr('normal', ['secondary', 'fontWeight'], fonts)};\n `;\n\n const valueFormatter = d => numeral(d).format('0,0.[00]');\n\n const timeFormatter = R.pipe(\n R.prop('frequency'),\n freq => getTimeProc(freq, timeFormats, locale),\n R.when(\n R.anyPass([R.isNil, R.complement(R.is)(Function)]),\n R.always(date => format(date, 'MMM YY')),\n ),\n )(data);\n\n return R.pipe(\n R.pathOr({}, ['serie', 'tooltip']),\n R.cond([\n [\n R.always(R.equals(BAR, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.x}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${datum.formatedValue || valueFormatter(datum.y)}\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(ROW, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.y}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${datum.formatedValue || valueFormatter(datum.x)}\n </div>\n <div>\n `,\n }),\n ],\n [\n R.always(R.equals(SCATTER, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${R.pipe(R.propOr({}, 'dimensionValues'), R.values, R.pluck('name'), R.join(' '))(datum)}\n </div>\n <div style=\"text-align: right;\">\n ${R.path(['dimensionValues', 'x', 'name'], serie)}\n <span style=\"${secondaryFonts}\">\n ${datum.xFormat || valueFormatter(datum.x)}\n </span>\n </div>\n <div style=\"text-align: right;\">\n ${R.path(['dimensionValues', 'y', 'name'], serie)}\n <span style=\"${secondaryFonts}\">\n ${datum.yFormat || valueFormatter(datum.y)}\n </span>\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(TIMELINE, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${R.pipe(R.propOr({}, 'dimensionValues'), R.values, R.pluck('name'), R.join('<br />'))(datum)}\n </div>\n <div style=\"text-align: right;\">\n ${datum.timeLabel}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${datum.formatedValue || valueFormatter(datum.y)}\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(H_SYMBOL, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.y}\n <br />\n ${datum.symbolValue}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${datum.formatedValue || valueFormatter(datum.x)}\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(V_SYMBOL, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.x}\n <br />\n ${datum.symbolValue}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${datum.formatedValue || valueFormatter(datum.y)}\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(STACKED_BAR, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.x}\n </div>\n <div style=\"text-align: right;\">\n ${datum.layerLabel}\n </div>\n <div style=\"text-align: right; font-size: ${R.pathOr(12, ['secondary', 'fontSize'], fonts)}px;\">\n Value:\n <span style=\"${secondaryFonts}\">\n ${R.is(Function, datum.formater) ? datum.formater(datum.height) : valueFormatter(datum.height)}\n </span>\n </div>\n <div style=\"text-align: right; font-size: ${R.pathOr(12, ['secondary', 'fontSize'], fonts)}px;\">\n Cumulated:\n <span style=\"${secondaryFonts}\">\n ${R.is(Function, datum.formater) ? datum.formater(datum.y) : valueFormatter(datum.y)}\n </span>\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(STACKED_ROW, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.y}\n </div>\n <div style=\"text-align: right;\">\n ${datum.layerLabel}\n </div>\n <div style=\"text-align: right; font-size: ${R.pathOr(12, ['secondary', 'fontSize'], fonts)}px;\">\n Value:\n <span style=\"${secondaryFonts}\">\n ${R.is(Function, datum.formater) ? datum.formater(datum.width) : valueFormatter(datum.width)}\n </span>\n </div>\n <div style=\"text-align: right; font-size: ${R.pathOr(12, ['secondary', 'fontSize'], fonts)}px;\">\n Cumulated:\n <span style=\"${secondaryFonts}\">\n ${R.is(Function, datum.formater) ? datum.formater(datum.x) : valueFormatter(datum.x)}\n </span>\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(CHORO, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${R.pathOr('', ['properties', 'label'], datum)}\n </div>\n <div style=\"text-align: right;\">\n ${R.pathOr('', ['properties', 'category'], datum)}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${R.pipe(R.pathOr(null, ['properties', 'value']), valueFormatter)(datum)}\n </div>\n </div>\n `,\n }),\n ],\n [R.T, R.identity],\n ]),\n )(options);\n};\n","import * as R from 'ramda';\nimport numeral from 'numeral';\nimport { getAxisOptions } from './getAxisOptions';\nimport { getBaseOptions } from './getBaseOptions';\nimport { getGridOptions } from './getGridOptions';\nimport { getTooltipOptions } from './getTooltipOptions';\nimport { SCATTER, STACKED_BAR, STACKED_ROW, TIMELINE } from '../constants';\n\nconst FOCUS_COLORS = {\n highlightColors: [\n '#E73741',\n '#0F8FD9',\n '#993484',\n '#DF521E',\n '#719E24',\n '#E1B400',\n '#32A674',\n '#0B68AF',\n ],\n baselineColors: ['#0B1E2D'],\n};\n\nconst symbolMarkers = () => {\n const paths = {\n circle: size => {\n const r = Math.sqrt(size) / 2;\n return `M0,${r} A${r},${r} 0 1,1 0,${-r} A${r},${r} 0 1,1 0,${r} Z`;\n },\n square: size => {\n const r = Math.sqrt(size) / 2;\n return `M${-r},${-r} L${r},${-r} ${r},${r} ${-r},${r} Z`;\n },\n cross: size => {\n const r = Math.sqrt(size) / 2;\n return `M${-r},${r} L${r},${-r} M${r},${r} L${-r},${-r}`;\n },\n triangle: size => {\n const rx = Math.sqrt(size) / Math.sqrt(3);\n const ry = Math.sqrt(size) / 2;\n return `M0,${-ry} L${rx},${ry} ${-rx},${ry} Z`;\n },\n };\n return [\n { style: { stroke: '#39617D', fill: '#39617D' }, path: paths.circle },\n { style: { stroke: '#39617D', fill: '#DBEBF2' }, rotate: 45, path: paths.square },\n { style: { stroke: '#39617D', fill: '#39617D', strokeWidth: 2 }, path: paths.cross },\n { style: { stroke: '#39617D', fill: '#DBEBF2' }, path: paths.square },\n { style: { stroke: '#39617D', fill: '#39617D' }, path: paths.triangle },\n ];\n};\n\nconst getAnnotationOptions = (type, options) =>\n R.pipe(\n R.pathOr({}, ['serie', 'annotation']),\n R.mergeRight({\n format: {\n datapoint: { proc: d => numeral(d).format('0,0.[00]') },\n },\n }),\n R.cond([\n [R.always(R.equals(SCATTER, type)), R.mergeRight({ display: 'never' })],\n [\n R.always(R.equals(TIMELINE, type)),\n R.mergeDeepRight({ format: { datapoint: { pattern: '.2f' } } }),\n ],\n [R.T, R.identity],\n ]),\n )(options);\n\nexport const getChartOptions = (data, type, options, tooltipFonts, timeFormats, locale) => {\n const defaultSerieColors = R.ifElse(\n R.anyPass([R.equals(STACKED_BAR), R.equals(STACKED_ROW)]),\n R.always(['#607D8B']),\n R.always(['#8EA4B1']),\n )(type);\n\n return {\n axis: getAxisOptions(data, type, options, timeFormats, locale),\n background: R.pipe(R.propOr({}, 'background'), R.mergeRight({ color: '#DBEBF2' }))(options),\n base: getBaseOptions(type, options),\n grid: getGridOptions(type, options),\n map: R.pipe(R.propOr({}, 'map'), R.mergeRight({ intBoundariesColor: '#8EA4B1' }))(options),\n serie: {\n ...R.propOr({}, 'serie', options),\n annotation: getAnnotationOptions(type, options),\n choropleth: R.pipe(\n R.pathOr({}, ['serie', 'choropleth']),\n R.mergeRight({\n divisions: 4,\n domain: 'YlorRd',\n invert: false,\n labelDisplay: 'none',\n }),\n )(options),\n stacked: R.pipe(\n R.pathOr({}, ['serie', 'stacked']),\n R.mergeRight({ strokeThickness: 1, strokeColor: '#F8FAFC' }),\n )(options),\n symbol: R.pipe(\n R.pathOr({}, ['serie', 'symbol']),\n R.mergeRight({\n markers: symbolMarkers(),\n markerDefaultSize: 60,\n markerDefaultStrokeWidth: 1,\n gapMinMaxColor: '#607D8B',\n gapMinMaxThickness: 1,\n gapAxisMinColor: 'white',\n gapAxisMinThickness: 1,\n }),\n )(options),\n colors: R.pathOr(defaultSerieColors, ['serie', 'colors'], options),\n overColors: R.pathOr(['#39617D'], ['serie', 'overColors'], options),\n highlightColors: R.pathOr(\n FOCUS_COLORS.highlightColors,\n ['serie', 'highlightColors'],\n options,\n ),\n baselineColors: R.pathOr(FOCUS_COLORS.baselineColors, ['serie', 'baselineColors'], options),\n tooltip: getTooltipOptions(data, type, options, tooltipFonts, timeFormats, locale),\n },\n };\n};\n","import sampleFocus from './sample-focus';\nimport scatterFocus from './scatter-focus';\nimport timelineFocus from './timeline-focus';\n\nexport default ({ type, series, focusOptions }) => {\n switch (type) {\n case 'ScatterChart':\n return scatterFocus(series, focusOptions);\n case 'TimelineChart':\n return timelineFocus(series, focusOptions);\n case 'BarChart':\n case 'RowChart':\n case 'StackedBarChart':\n case 'StackedRowChart':\n case 'HorizontalSymbolChart':\n case 'VerticalSymbolChart':\n return sampleFocus(series, focusOptions);\n default:\n return series;\n }\n};\n","import * as R from 'ramda';\n\nexport default function focus(series, focusSelections) {\n const { highlight = [], baseline = [] } = focusSelections || {};\n if (R.isEmpty(highlight) && R.isEmpty(baseline)) {\n return series;\n }\n\n return R.over(\n R.lensPath([0, 'datapoints']),\n R.map(dp => {\n const isFocusMatch = f => {\n const focusedDim = R.path(['options', 'dimensionId'], f);\n const dpValId = R.path(['dimensionValues', focusedDim, 'id'], dp);\n return dpValId === R.path(['options', 'dimensionValueId'], f);\n };\n return {\n ...dp,\n highlightIndex: R.findIndex(isFocusMatch, highlight),\n baselineIndex: R.head(baseline) && isFocusMatch(R.head(baseline)) ? 0 : -1,\n };\n }),\n series,\n );\n}\n","import * as R from 'ramda';\n\nexport default function focus(series, focusSelections) {\n const { highlight = [], baseline = [] } = focusSelections || {};\n\n return R.map(\n serie => ({\n ...serie,\n highlightIndex: R.findIndex(R.propEq(serie.key, 'value'), highlight),\n baselineIndex: R.path([0, 'value'], baseline) === serie.key ? 0 : -1,\n }),\n series,\n );\n}\n","import * as R from 'ramda';\n\nexport default function focus(series, focusSelections) {\n const { highlight = [], baseline = [] } = focusSelections || {};\n if (R.isEmpty(highlight) && R.isEmpty(baseline)) {\n return series;\n }\n\n return R.over(\n R.lensPath([0, 'datapoints']),\n R.map(dp => ({\n ...dp,\n highlightIndex: R.findIndex(R.propEq(dp.key, 'value'), highlight),\n baselineIndex: R.path([0, 'value'], baseline) === dp.key ? 0 : -1,\n })),\n series || [],\n );\n}\n","import * as R from 'ramda';\nimport { CHORO, OBS_TYPE_NUMBER, OBS_TYPE_NUMERICAL_STRING, TIMELINE, TYPES } from '../constants';\nimport { getRefAreaDimension, getTimePeriodDimension } from '@sis-cc/dotstatsuite-sdmxjs';\nimport { getObservationsType } from './getObservationsType';\n\nexport const getAvailableChartTypes = data => {\n const observationsType = getObservationsType(data);\n if (!R.includes(observationsType, [OBS_TYPE_NUMBER, OBS_TYPE_NUMERICAL_STRING])) {\n return {};\n }\n const dimensions = R.pathOr([], ['structure', 'dimensions', 'observation'], data);\n const timeDimension = getTimePeriodDimension({ dimensions });\n const refAreaDimension = getRefAreaDimension({ dimensions });\n const hasNoTime = R.anyPass([R.isNil, R.pipe(R.propOr([], 'values'), R.length, R.gte(1))])(\n timeDimension,\n );\n return R.pipe(\n R.when(R.always(hasNoTime), R.omit([TIMELINE])),\n R.when(R.always(R.isNil(refAreaDimension)), R.omit([CHORO])),\n )(TYPES);\n};\n","import * as R from 'ramda';\nimport { OBS_TYPE_NUMBER, OBS_TYPE_NUMERICAL_STRING, OBS_TYPE_STRING } from '../constants';\n\nexport const getObservationsType = data => {\n if (R.isNil(data)) {\n return undefined;\n }\n const firstObs = R.pipe(\n R.pathOr({}, ['dataSets', 0, 'observations']),\n R.values,\n R.find(obs => R.not(R.either(R.isNil, R.isEmpty)(R.head(obs)))),\n )(data);\n if (R.isNil(firstObs)) {\n return undefined;\n }\n const firstObsValue = R.head(firstObs);\n if (R.is(Number, firstObsValue)) {\n return OBS_TYPE_NUMBER;\n }\n return R.ifElse(\n R.equals(NaN),\n R.always(OBS_TYPE_STRING),\n R.always(OBS_TYPE_NUMERICAL_STRING),\n )(Number(firstObsValue));\n};\n","import getFocusedSeries from './focus';\nimport getSeries from './series';\n\nexport const getChartSeries = ({ type, data, options, singularity, focusOptions }) => {\n const chartSeries = getSeries({ type, data, options, singularity });\n const focusedSeries = getFocusedSeries({ type, series: chartSeries, focusOptions });\n return focusedSeries;\n};\n"],"names":["parseDisplay","display","R","isNil","includes","dimensionValueDisplay","accessors","dimensionValue","id","propOr","name","isEmpty","dimensionValueDisplayAt","dimension","index","pathOr","Number","categoryDisplay","splitObservationKey","dimensions","dimensionsWithValuesIndexedById","rejectedId","pipe","addIndex","reduce","acc","dimensionValueIndex","dimensionIndex","nth","has","append","join","BAR","ROW","SCATTER","TIMELINE","H_SYMBOL","V_SYMBOL","STACKED_BAR","STACKED_ROW","CHORO","PERCENT","VALUES","TYPES","OBS_TYPE_NUMBER","OBS_TYPE_NUMERICAL_STRING","DEFAULT_PREFSCALE_ATTR_IDS","DEFAULT_DECIMALS_ATTR_IDS","getFormaterAttribute","ids","attributes","find","attr","getObservationsFormaterAttributes","decimals","prefscale","prop","is","Array","parseAttributeFormaterIds","getObservationFormaterValue","observation","attribute","attributeIndex","attributeValueIndex","makeObservationFormater","formaterValues","_decimals","isNaN","format","concat","repeat","value","numeral","multiply","Math","pow","negate","getObservationFormater","formaterAttributes","tail","getObservationFormaterValues","getFormatedObservation","formater","head","getDatapoints","keys","observations","sortDirection","formaterAttrs","categoryKey","valueKey","map","observationKey","observationValue","splitKey","split","category","categoryIds","formatedValue","key","sortBy","dp","series","datapoints","chartDimension","chartDimensionId","chartDimensionIndex","findIndex","propEq","k","o","oDimensionValuesIndexes","oDimensionValueIndex","_chartDimension","oDimensionValue","dimensionValueIsValid","oPartialKey","reject","_","i","dimensionValues","dimensionValuesIndexes","dimensionsWithValuesIds","dvi","dimensionId","assoc","getDimensionValues","dimensionValueKey","getDimensionValueKey","filter","x","y","values","scatterSeries","xValue","yValue","set","lensPath","timelineSeries","timePeriodDimension","getTimePeriodDimension","timePeriodDimensionIndex","__index","timePeriodDimensionHasManyPeriods","rawSeries","timePeriodDimensionValueIndex","timePeriod","path","datapoint","start","timeLabel","serieIndex","serie","over","symbolDimension","symbolDimensionId","symbolDimIndex","d","obsKey","obs","obsDimsValsIndexes","symbolValIndex","symbolValId","dpIndex","formatedValues","length","lensIndex","symbolValues","singularity","stackKey","serieDimensionId","serieDimension","layerSeries","_flatDatapoints","mapObjIndexed","splittedKey","layerKey","layerDimensions","memo","_dimensionValue","label","push","flatDatapoints","layeredDatapoints","groupBy","layerFullSeries","layerLimit","Infinity","take","layeredDatapointsKeyedByCategory","indexBy","serieValue","serieValueId","formaters","when","equals","layer","pluck","serieSortedByDataOrder","lensProp","res","of","stackedSeries","mode","_serie","total","v","abs","sum","percentSerie","isTimePeriodDimension","serieSortedByTotal","choroSeries","topoMap","refAreaDimension","getRefAreaDimension","observationsByAreas","splitedKey","areaValueIndex","areaValue","areaId","vals","parseByAreas","topology","areaSelection","topoAreas","topoAreasWithData","areaGeometry","areaObservation","properties","geometries","objects","areas","type","arcs","bbox","transform","getSeries","data","options","formatterIds","indexedDimensions","dim","header","chartType","sampleSeries","symbolSeries","isNumber","input","not","isPositiveNumber","isNaturalInt","test","String","isChart","hasFocus","omit","getDimensionsWithValues","toState","artefact","getPropertyDimension","property","state","getGroupedDimensions","isRefAreaDimension","optionParser","option","Object","undefined","artefactToOption","chartDimensionToOption","chartDimensionOptions","typeValidator","sampleFocusTypes","focusComparator","op1","op2","focus","_display","dimOptions","val","dimensionValueId","focusOptions","props","otherFocus","differenceWith","onChangeFocusSelection","_value","toKey","filterFocus","keyedOptions","entry","entryKey","focusStateFromNewProps","highlightState","baselineState","baseline","highlight","getScatterDimension","toScatterState","xVal","yVal","scatterDimension","scatterX","scatterY","toScatterSingularity","xId","yId","isScatter","scatterValueOptions","onChangeScatterDim","newScatterState","scatterStateValueToOption","onChangeScatterVal","valKey","otherValKey","matching","otherOptions","partition","stateOtherValue","getSymbolDimension","isSymbol","toSymbolState","toSymbolSingularity","onChangeSymbolDim","getStackedDimension","stackedModes","isStacked","toStackedState","stackedDimension","stackedMode","toStackedSingularity","limit","onChangeStackedDimension","stackedModeOptions","isStackedDimActive","onChangeStackedMode","hasXLinear","hasYLinear","hasYPivot","xInitialState","computedMaxX","computedMinX","computedStepX","computedPivotX","maxX","minX","pivotX","stepX","yInitialState","computedMaxY","computedMinY","computedStepY","computedPivotY","maxY","minY","pivotY","stepY","toProperties","onChange","isActive","always","getSourceLabel","isCustomInvalid","dataflow","getDataflowName","sourceLabel","stringifySubtitle","toSingularity","toFloat","float","parseFloat","toOption","stateValue","optionValue","getFreqStepOption","inputState","freqStep","getIsHidden","annotations","complement","getFullName","identity","isValidDate","period","and","dateFns","isDate","date","getTime","NaN","Date","dateWithoutTZ","addMinutes","getTimezoneOffset","getLocale","cond","fr","de","es","ar","it","nl","th","T","en","REJECTED_VALUE_IDS","getNotDisplayedValues","annot","title","parsed","_acc","_val","replace","getNotDisplayedIds","converge","hiddenValues","hiddenCombinations","getNotDisplayedCombinations","getHCodelistsRefs","annotation","references","text","refs","acc2","ref","match","codelistId","agencyId","code","version","hierarchy","mergeRight","getMetadataCoordinates","sdmxJson","metadataAvailKeys","indexes","a","vIndex","dimIndex","duplicateObs","dims","obsValues","duplicated","groupedObs","indexedDimValIds","enhancedObs","matchingObs","_indexes","dimValuesIndexes","unnest","uniq","list","hierarchiseDimensionWithNativeHierarchy","indexed","grouped","parent","getChildren","parentsIndexes","parentId","childs","child","refined","children","prepend","parseTexts","texts","splitted","parseCombinationDefinition","locale","useWith","titles","codes","concepts","hasPath","getCombinationDefinitions","getFormat","freqDisplay","getEndDate","mult","duration","adder","addSeconds","addHours","addDays","addMonths","addYears","getAdder","endDate","subSeconds","getStartDate","parseISO","dateWithTZ","refineTimePeriod","monthlyFormat","end","toISOString","range","startDate","isValid","timeIndicator","_duration","startMinute","startOfMinute","startHour","startOfHour","startDay","startOfDay","isEqual","getDate","getMonth","computeDisplayFreq","opts","isSameDay","isSameYear","dayFormat","yearFormatMatch","monthFormatMatch","yearFormat","monthFormat","formattedYear","formattedMonths","computeName","isNonCoded","both","getName","isTimeDimension","reportYearStart","freq","_format","reportedStart","year","getYear","reportStartDate","month","day","nextYear","semester","quarter","isFirstDayOfMonth","week","getReportedTimePeriodLabel","frequency","timeFormat","getValuesEnhanced","hiddenIds","selection","selectionSet","Set","fallbackId","valueId","getId","valueAnnotations","flip","isHidden","notes","getTimePeriodAttributes","__indexPosition","getCodeOrder","isSelected","empty","flags","sortWith","timeDimensionSorts","defaultSorts","getDateForSort","ascend","descend","reported","getReportedTimePeriod","reportTimeNote","getReportedTimePeriodNote","isRtl","getAttributes","restOptions","datasetAttributes","obsAttributes","attrAnnotations","refineDimensions","dataquery","selectionIds","isEmptySelection","dimAnnotations","size","isAllDimHidden","valuesIds","difference","getIsAllDimHidden","rejected","role","roles","parseAttributes","customAttributes","displayableValuesCount","relationship","seriesDimensions","hasInvalidValues","anyPass","isConceptInvalid","filterValidConcepts","parseCombinations","combinations","parsedAttributes","indexedAttributes","validConceptIds","comb","refinedConcepts","intersection","rejectInvalidConceptIds","displayable_values_count","seriesConcepts","concept","displayableValues","isDisplayable","refineAttributes","seriesCombinations","indexedRelationships","combined","isValidNumber","parseValidNumber","formatValue","formatAttributesIndexes","Boolean","monthMatch","monthDayMatch","dayMatch","valueIndex","getFormatAttributesValues","formatScale","formatDecimals","ifElse","num","displayNum","decimalFormat","times","parseAttributesValues","attrValuesIndexes","attrIndex","coordinates","serieKey","pick","isObs","enhanceObservations","getFormatAttributesIndexes","formattedValue","getAttributesSeries","forEachObjIndexed","dissocPath","assocPath","valueInRes","getFlagsAndNotes","attributesValues","flagsIds","notesIds","getManyValuesDimensions","attributesSeries","combConceptsIds","enhancedValues","attrSeries","hasAdvancedAttributes","getOneValueDimensions","indexedRelevantAttributes","attrValues","getDataflowAttributes","combinationsConceptsIds","getHeaderTitle","getHeaderSubtitle","microdataDimension","combinationsConepts","DEFAULT_REJECTED_SUBTITLE_IDS","getSeriesCombinations","oneValuesDimensions","indexedValues","fixedDimValues","getRefinedMissinParentsLabels","par","singleValueDisplay","missingParents","_combinedValuesDisplay","isDisplayed","isRejected","labels","totalValue","firstValue","combinedValuesDisplay","_ids","getHeaderCombinations","getHeaderCoordinates","oneValueDimensions","getConceptsSet","indexedCombinations","_upper","upper","forEach","c","add","getLayout","_layoutIds","isTimeInverted","layoutIds","sections","rows","applyInversionOnTimeDim","headerConceptsSet","sectionsConceptsSet","getLayoutLevel","_upperIds","_excludedIds","parsedCombination","upperIds","excludedIds","parseCombination","getLayoutPivots","layoutEntry","valIndexGetter","ind","isInverted","last","comparator","firstSerie","secondSerie","firstIndexes","secondIndexes","firstSubIndexes","secondSubIndexes","_size","j","uniqIndexes","getSortedLayoutIndexes","layout","rejectedDims","dimIndexes","headerPivots","sectionsPivots","rejectedPivots","sectionLength","headerIndexes","sectionsIndexes","rejectedIndexes","evolve","sort","sectionIndexes","rowIndexes","splitAt","sectionKey","previousSecKey","_ind","getPivotKey","getCuratedCells","shape","pivots","getPivots","pivot","orderedDimIndexes","indexWithPivots","filterSeries","getHasStillData","removedMissingIndexes","hasStillData","serieParentsSets","p","mIs","filtered","missingIndexes","removed","filteredRemoved","refineSections","extractedKeys","curatedObs","section","getHasRowStillData","row","rowKey","refineHeader","headers","headerKey","pickBy","getSerieLinesCount","flatten","truncateSectionRows","n","sectionsData","truncated","_n","lastSection","rowsLength","truncatedRowsCount","takeLast","r","dropLast","truncateHeader","headerData","lastHeader","columnsCount","extractedKey","getShape","isVertical","refineLayoutSize","layoutIndexes","all","headerDimCount","headerValuesCount","headerCellsCount","rowCellsCount","rowsCount","excess","columnCellsCount","toTruncate","toRefine","segregateLayout","cutLength","divide","ceil","maxCutLength","truncateLayout","dimsLength","_layout","refineLayout","result","getRefinedLayout","getLayoutCoordinatesValidator","layoutCoordinates","topCoordinates","notInTop","getValueData","parents","addCoordinatesToKey","simpleValueDataSetter","valueData","datas","combinedValueDataSetter","addValueToSerieData","dataSetter","serieData","addSimpleValueToSerieData","addCombinedValueToSerieData","getCoordinates","definition","_index","valInd","validator","attrs","getSerieFlagsAndSideProps","metadataCoordinates","layoutAttrValues","hasMetadata","any","getHasAdvancedAttributes","sideProps","getSerieDimensionsData","missingParentsGetter","onGoingSerie","combValuesIndexes","combParentsIndexes","combMissingParentsIndexes","combDimValues","combSerie","_parentsIndexes","missingParentsIndexes","next","conceptId","combineConcepts","getSerieDataWithMissingLines","lines","serieCoordinates","coordinatesValidator","missingParentData","dissoc","topCoordinatesValidator","getLayoutData","rejectedDimensions","rest","sectionSerie","rowsSeries","sectionData","getSerieDataWithoutMissingLines","getCellsAttributesIds","indexedHeaderIds","indexedSectionsIds","indexedRowsIds","idsInHeader","idsNotInSections","idsNotInRows","getCellsMetadataCoordinates","oneValueDimsIds","columnIds","rowsIds","getIndexedCombinationsByDisplay","combsInLayout","combsInCells","cells","getCells","cellsAttributesId","attributesInLayoutCombination","attributesInCellsCombination","_customAttributes","isAttrCell","relevantAttributes","cellAttributeIds","attrInSerie","getCellRelevantAttributes","flagsAndNotes","combinedSeries","getCellCombinedSeries","advancedAttributes","cellCoordinates","mergedCoord","mergeLeft","hasCellMetadata","intValue","cell","getObservations","getHierId","applyHierarchicalCodesToDim","hCodes","confirmedHierarchisedChilds","unconfirmedPaths","parseHCodes","parentsDef","parentsInDim","hC","codeID","hierarchicalCodes","hasInDim","isUnconfirmed","addParentId","paths","_unconfirmedPaths","refinedUnconfirmedPaths","flattenDescendants","unconfirmed","refineCodes","_flatDescendants","flatDescendants","valids","prev","rV","missingValues","hierarchicalIndexes","hierId","getReportingYearStart","dataSet","reportYearStartAttr","declineObservationsOverAttributes","attrsIds","obsKeys","attrId","declinedKey","declined","OBS_ATTRIBUTES","registerParsedIndexes","isSameSerie","register","mergeWith","b","parseSerieIndexesHierarchies","serieIndexes","previousSerie","replicate","_valueIndex","previous","previousIndex","previousParentsIndexes","previousMissingIndexes","presentParentsIndexes","previousParentsSet","lastParentIndexInPrevious","findLastIndex","rawPresentParentsIndexes","parseParentsIndexesWithPrevious","parseSeriesIndexesHierarchies","seriesIndexes","replicateMissing","parseLayoutIndexesHierarchies","transpose","_sections","_sectionsRows","sectionsRows","getLayoutRelationships","getLayoutLevelRelationship","getCombinationLevelCompatibility","layoutRelationships","combination","idsInHeaderSet","idsInSectionsSet","idsInRowsSet","idsInSections","idsInRows","injectCombinationsInLayout","defaultLayoutIds","notInLayoutCombs","idsInLayout","getCombinationsNotInLayout","indexedCombsRelationships","indexCombsRelationships","defaultLayoutRelationships","levelCompatibility","conceptsSet","inject","extractConcepts","layoutDimsIds","dimId","indexedRels","getRelationship","related","rels","defaults","dataflowAnnotationsIndexes","dataflowAnnotations","flagsAttrAnnotation","footnotesAttrAnnotation","customFlags","customNotes","position","sdmxIndex","msdJson","attributesDefinitions","indexedConcepts","hierarchicalId","collection","metadataAttributes","content","currentLayoutIds","getLayoutDimsIds","layoutCombinations","layoutConcepts","getLayoutCombinations","isBlank","combinationsConcepts","filteredLayoutIds","level","oppositeIds","filterLayoutIds","layoutWithCombs","layoutRelationshipsSets","layoutConceptsSets","defaultLayoutConceptsSets","nextLayout","remaining","remainingDims","_remaining","dimInRows","toTakeIn","extracted","remains","hasNoHeader","firstRemaining","injectRemainingDimensionsInLayout","dupObs","_dims","enhancedLayoutIndexes","refinedLayoutIndexes","layoutData","cellsAttributesIds","cellsMetadataCoordinates","hierarchyId","hCodelist","hierarchies","metadataJson","metaAttrLength","notDisplayedIds","metadataSeries","metaIndexes","evolvedKey","vInd","dInd","originalVal","isPresentational","handlerProps","groupedAttrs","indexedAttrs","makeTree","previousValue","parentsIds","_previousParentsIds","previousParentsIds","presentIds","_missingIds","splitWhen","__previousParentsIds","missingIds","takeLastWhile","_previousParents","previousParents","takeWhile","defaultCombinations","refinedDimensions","_attributes","names","parsedCombinations","refinedAttributes","enhancedObservations","manyValuesDimensions","headerCoordinates","hierarchisedDimensions","duplicatedObservations","dataflowAttributes","subtitle","hier","intact","broken","refinedKey","intactIds","refinedBroken","structureIndex","structure","isScatterLayoutCompatible","isSymbolLayoutCompatible","serieIds","isStackedLayoutCompatible","lt","defaultTimeFormats","A","S","Q","M","W","B","D","H","N","getTimeProc","timeFormats","datum","getISOWeek","seventhDay","endOfWeek","weekStartsOn","getTimeFrequency","isMonday","isTuesday","isWednesday","isThursday","isFriday","isSaturday","isSunday","getTimeStep","getAxisOptions","axis","linear","color","ordinal","gap","padding","thickness","linearProc","mergeDeepRight","proc","tick","font","orient","minDisplaySize","isTime","pattern","minorSize","minorThickness","getBaseOptions","minDisplayHeight","minDisplayWidth","top","innerPadding","left","right","bottom","isAnnotated","getGridOptions","grid","baselines","getTooltipOptions","fonts","primaryFonts","secondaryFonts","valueFormatter","Function","xFormat","yFormat","symbolValue","layerLabel","height","width","FOCUS_COLORS","symbolMarkers","circle","sqrt","square","cross","triangle","rx","ry","style","stroke","fill","rotate","strokeWidth","getAnnotationOptions","getFocusedSeries","focusSelections","isFocusMatch","f","focusedDim","highlightIndex","baselineIndex","scatterFocus","timelineFocus","sampleFocus","observationsType","firstObs","either","firstObsValue","getObservationsType","timeDimension","hasNoTime","gte","scale","tooltipFonts","defaultSerieColors","background","base","intBoundariesColor","choropleth","divisions","domain","invert","labelDisplay","stacked","strokeThickness","strokeColor","symbol","markers","markerDefaultSize","markerDefaultStrokeWidth","gapMinMaxColor","gapMinMaxThickness","gapAxisMinColor","gapAxisMinThickness","colors","overColors","highlightColors","baselineColors","tooltip","chartSeries","withCopyright","withLogo","formaterPeriod","sdmxData","sharedData","rawDefaultCombinationsDefinition","defaultCombinationsDefinition","customCombinationsDefinitions","combinationsDefinitions","indexedManyValuesDimensions","remainings","hasFoundIrrelevant","isTableLayoutCompatible","isChartLayoutCompatible","optionsSet","parseSelection","focusState","sampleFocusStateFromNewProps","scatterState","undefinedState","stateScatterX","_scatterX","_scatterY","stateScatterY","scatterStateFromNewProps","symbolState","area","other","time","symbolStateFromNewProps","stackedState","_mode","stackedStateFromNewProps","xLinearState","YLinearState","linearStateFromNewProps","fixedWidth","fixedHeight","responsiveWidth","responsiveHeight","axeX","axeY","linearX","linearY","tickX","step","max","min","toLinearProperties","placeholder","floor","isDefault","onReset","source","logo","checked","copyright"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/rules/src/dimension-utils.js","../src/rules/src/constants.js","../src/rules/src/observation-formater.js","../src/rules/src/factories/sample-series.js","../src/rules/src/factories/scatter-series.js","../src/rules/src/factories/timeline-series.js","../src/rules/src/factories/symbol-series.js","../src/rules/src/factories/stacked-series.js","../src/rules/src/factories/choro-series.js","../src/rules/src/factories/series.js","../src/rules/src/properties/utils.js","../src/rules/src/properties/focus.js","../src/rules/src/properties/scatter.js","../src/rules/src/properties/symbol.js","../src/rules/src/properties/stacked.js","../src/rules/src/properties/linear.js","../src/rules/src/properties/getHeaderProps.js","../src/rules/src/properties/getStringifiedSubtitle.js","../src/rules/src/properties/index.js","../src/rules/src/sdmx-data/index.js","../src/rules/src/date.js","../src/rules2/src/constants.js","../src/rules2/src/parseMetadataSeries.js","../src/rules2/src/getNotDisplayedIds.js","../src/rules2/src/getHCodelistsRefsInData.js","../src/rules2/src/getMetadataCoordinates.js","../src/rules2/src/duplicateObservations.js","../src/rules2/src/hierarchiseDimensionWithAdvancedHierarchy2.js","../src/rules2/src/hierarchiseDimensionWithNativeHierarchy2.js","../src/rules2/src/getCombinationDefinitions.js","../src/rules2/src/refineTimePeriod.js","../src/rules/src/get-values-enhanced.js","../src/rules2/src/getAttributes.js","../src/rules2/src/refineDimensions.js","../src/rules2/src/parseAttributes.js","../src/rules2/src/parseCombinations.js","../src/rules2/src/refineAttributes.js","../src/rules/src/preparators/formatValue.js","../src/rules2/src/enhanceObservations.js","../src/rules2/src/getAttributesSeries.js","../src/rules2/src/table/getFlagsAndNotes.js","../src/rules2/src/getManyValuesDimensions.js","../src/rules2/src/getOneValueDimensions.js","../src/rules2/src/getDataflowAttributes.js","../src/rules2/src/getHeaderTitle.js","../src/rules2/src/getHeaderSubtitle.js","../src/rules2/src/getSeriesCombinations.js","../src/rules2/src/combinedValuesDisplay.js","../src/rules2/src/getHeaderCombinations.js","../src/rules2/src/getHeaderCoordinates.js","../src/rules2/src/table/getLayout.js","../src/rules2/src/table/getSortedLayoutIndexes.js","../src/rules2/src/table/refineLayoutSize2.js","../src/rules2/src/utils.js","../src/rules2/src/table/getLayoutData2.js","../src/rules2/src/table/getCellsAttributesIds.js","../src/rules2/src/table/getCellsMetadataCoordinates.js","../src/rules2/src/table/getIndexedCombinationsByDisplay.js","../src/rules2/src/table/getCells.js","../src/rules2/src/hasCellMetadata.js","../src/rules2/src/table/getCuratedCells.js","../src/rules/src/preparators/getObservations.js","../src/rules2/src/applyHierarchicalCodesToDim.js","../src/rules/src/preparators/getReportingYearStart.js","../src/rules2/src/table/declineObservationsOverAttributes.js","../src/rules2/src/table/parseSeriesIndexesHierarchies.js","../src/rules2/src/table/getTableLayoutIds.js","../src/rules2/src/getDataflowTooltipAttributesIds.js","../src/rules2/src/getDimensionValuesIndexes.js","../src/rules2/src/getMSDInformations.js","../src/rules2/src/table/getTableLabelAccessor.js","../src/rules2/src/table/getTableProps.js","../src/rules2/src/parseHierarchicalCodelist.js","../src/rules2/src/table/parseValueHierarchy.js","../src/rules2/src/prepareData.js","../src/rules2/src/sdmx3.0DataFormatPatch.js","../src/rules/src/layout.js","../src/rules/src/table/factories/getCellValue.js","../src/rules/src/chart/getAxisOptions.js","../src/rules/src/chart/getBaseOptions.js","../src/rules/src/chart/getGridOptions.js","../src/rules/src/chart/getTooltipOptions.js","../src/rules/src/chart/getChartOptions.js","../src/rules/src/factories/focus.js","../src/rules/src/factories/scatter-focus.js","../src/rules/src/factories/timeline-focus.js","../src/rules/src/factories/sample-focus.js","../src/rules/src/properties/getAvailableChartTypes.js","../src/rules/src/properties/getObservationsType.js","../src/rules/src/factories/getChartSeries.js"],"sourcesContent":["import * as R from 'ramda';\n\nconst REF_AREA_ROLES = new Set(['GEO', 'REF_AREA']);\nconst REF_AREA_IDS = new Set(['REF_AREA', 'COUNTRY', 'LOCATION', 'REGION', 'REFERENCE_AREA']);\nexport const isRefAreaDimension = (dimension = {}) =>\n REF_AREA_ROLES.has(dimension.role) || REF_AREA_IDS.has(dimension.id);\nexport const getRefAreaDimension = dimensions => R.find(isRefAreaDimension, dimensions);\n\nconst FREQ_DIM_IDS = new Set(['FREQ', 'FREQUENCY']);\nexport const isFrequencyDimension = (dimension = {}) =>\n dimension.role === 'FREQ' || FREQ_DIM_IDS.has(dimension.id);\nexport const isFrequencyAttribute = attr => R.prop('id', attr) === 'TIME_FORMAT';\n\nexport const isTimePeriodDimension = (dimension = {}) =>\n dimension.role === 'TIME_PERIOD' || dimension.id === 'TIME_PERIOD';\nexport const getTimePeriodDimension = dimensions => R.find(isTimePeriodDimension, dimensions);\n\nexport const parseDisplay = display =>\n R.isNil(display) || !R.includes(display, ['both', 'code']) ? 'label' : display;\n\nexport const dimensionValueDisplay =\n (display, accessors = {}) =>\n dimensionValue => {\n const id = R.propOr('', accessors.id || 'id', dimensionValue);\n const name = R.propOr('', accessors.name || 'name', dimensionValue);\n // a non-coded component (dim | attr) has no name, names nor label\n // the only valid thing to display is the id\n if (R.propOr(false, 'isNonCoded', dimensionValue)) return id;\n //auto-generated flags have no id nor name\n if (R.isEmpty(id) && R.isEmpty(name)) return '';\n switch (display) {\n case 'label':\n return R.isEmpty(name) ? `[${id}]` : name;\n case 'code':\n return id;\n case 'both':\n if (R.isNil(id) || R.isEmpty(id)) return name;\n return `(${id}) ${name}`;\n default:\n return null;\n }\n };\n\nexport const dimensionValueDisplayAt = (dimension, index, display) => {\n const dimensionValue = R.pathOr({}, ['values', Number(index)], dimension);\n return dimensionValueDisplay(display)(dimensionValue);\n};\n\nexport const categoryDisplay = (\n splitObservationKey,\n dimensions,\n dimensionsWithValuesIndexedById,\n rejectedId,\n display,\n) => {\n return R.pipe(\n R.addIndex(R.reduce)((acc, dimensionValueIndex, dimensionIndex) => {\n const dimension = R.nth(dimensionIndex, dimensions) || {};\n if (R.has(dimension.id, dimensionsWithValuesIndexedById) && dimension.id !== rejectedId) {\n return R.append(dimensionValueDisplayAt(dimension, dimensionValueIndex, display), acc);\n }\n return acc;\n }, []),\n R.join(' - '),\n )(splitObservationKey);\n};\n","export const BAR = 'BarChart';\nexport const ROW = 'RowChart';\nexport const SCATTER = 'ScatterChart';\nexport const TIMELINE = 'TimelineChart';\nexport const H_SYMBOL = 'HorizontalSymbolChart';\nexport const V_SYMBOL = 'VerticalSymbolChart';\nexport const STACKED_BAR = 'StackedBarChart';\nexport const STACKED_ROW = 'StackedRowChart';\nexport const CHORO = 'ChoroplethChart';\nexport const PERCENT = 'percent';\nexport const VALUES = 'values';\nexport const TYPES = {\n [BAR]: BAR,\n [ROW]: ROW,\n [SCATTER]: SCATTER,\n [TIMELINE]: TIMELINE,\n [H_SYMBOL]: H_SYMBOL,\n [V_SYMBOL]: V_SYMBOL,\n [STACKED_BAR]: STACKED_BAR,\n [STACKED_ROW]: STACKED_ROW,\n [CHORO]: CHORO,\n};\n\nexport const OBS_TYPE_NUMBER = 'OBS_TYPE_NUMBER';\nexport const OBS_TYPE_NUMERICAL_STRING = 'OBS_TYPE_NUMERICAL_STRING';\nexport const OBS_TYPE_STRING = 'OBS_TYPE_STRING';\nexport const REPORTING_YEAR_START_DAY = 'REPORTING_YEAR_START_DAY';\nexport const REPYEARSTART = 'REPYEARSTART';\n","import numeral from 'numeral';\nimport * as R from 'ramda';\n\nconst DEFAULT_PREFSCALE_ATTR_IDS = ['PREF_SCALE'];\n\nconst DEFAULT_DECIMALS_ATTR_IDS = ['DECIMALS'];\n\nconst getFormaterAttribute = (ids, attributes) =>\n R.find(attr => R.includes(attr.id, ids), attributes);\n\nconst parseAttributeFormaterIds = (ids = {}) => {\n let prefscale = R.prop('prefscale', ids);\n let decimals = R.prop('decimals', ids);\n decimals = R.isNil(decimals) ? DEFAULT_DECIMALS_ATTR_IDS : decimals;\n prefscale = R.isNil(prefscale) ? DEFAULT_PREFSCALE_ATTR_IDS : prefscale;\n return {\n decimals: R.is(Array, decimals) ? decimals : [decimals],\n prefscale: R.is(Array, prefscale) ? prefscale : [prefscale],\n };\n};\n\nexport const getObservationsFormaterAttributes = (attributes = [], ids = {}) => {\n const { decimals, prefscale } = parseAttributeFormaterIds(ids);\n return {\n decimals: getFormaterAttribute(decimals, attributes),\n prefscale: getFormaterAttribute(prefscale, attributes),\n };\n};\n\nconst getObservationFormaterValue = (observation, attribute) => {\n const attributeIndex = R.prop('index', attribute);\n const attributeValueIndex = R.nth(attributeIndex, observation);\n return R.nth(attributeValueIndex, R.propOr([], 'values', attribute));\n};\n\nconst getObservationFormaterValues = formaterAttributes => observation => ({\n decimals: getObservationFormaterValue(observation, R.prop('decimals', formaterAttributes)),\n prefscale: getObservationFormaterValue(observation, R.prop('prefscale', formaterAttributes)),\n});\n\nconst makeObservationFormater = formaterValues => {\n let prefscale = 0;\n if (!R.isNil(R.prop('prefscale', formaterValues))) {\n prefscale = Number(R.propOr('0', 'id', formaterValues.prefscale));\n }\n let decimals = null;\n if (!R.isNil(R.prop('decimals', formaterValues))) {\n let _decimals = Number(R.prop('id', formaterValues.decimals));\n decimals = R.is(Number, _decimals) && !Number.isNaN(_decimals) ? _decimals : null;\n }\n let format = '0,0';\n if (R.isNil(decimals)) {\n format = R.concat(format, '.[0000000]');\n } else if (decimals > 0) {\n format = R.concat(format, `.[${'0'.repeat(decimals)}]`);\n }\n return value =>\n numeral(Number(value))\n .multiply(Math.pow(10, R.negate(prefscale)))\n .format(format);\n};\n\nexport const getObservationFormater = (observation, formaterAttributes) => {\n return R.pipe(\n R.tail,\n getObservationFormaterValues(formaterAttributes),\n makeObservationFormater,\n )(observation);\n};\n\nexport const getFormatedObservation = (observation, formaterAttributes) => {\n const formater = getObservationFormater(observation, formaterAttributes);\n return formater(R.head(observation));\n};\n","import * as R from 'ramda';\nimport { categoryDisplay } from '../dimension-utils';\nimport { getFormatedObservation } from '../observation-formater';\n\nconst getDatapoints = (\n keys,\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n sortDirection,\n display,\n formaterAttrs,\n) => {\n const [categoryKey, valueKey] = keys;\n const sortFunc = dp => dp[valueKey] * sortDirection;\n\n return R.pipe(\n R.keys,\n R.map(observationKey => {\n const observationValue = R.prop(observationKey, observations);\n const value = R.head(observationValue);\n const splitKey = R.split(':', observationKey);\n const category = categoryDisplay(\n splitKey,\n dimensions,\n dimensionsWithValuesIndexedById,\n null,\n display,\n );\n const categoryIds = categoryDisplay(\n splitKey,\n dimensions,\n dimensionsWithValuesIndexedById,\n null,\n 'code',\n );\n const formatedValue = getFormatedObservation(observationValue, formaterAttrs);\n\n let key = categoryIds;\n if (R.isNil(key) || R.isEmpty(key)) {\n key = 'uniq-dp';\n }\n\n return { value, category, [valueKey]: value, [categoryKey]: category, key, formatedValue };\n }),\n R.sortBy(sortFunc),\n )(observations);\n};\n\nconst series = (\n keys,\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n sortDirection,\n display,\n formaterAttrs,\n) => {\n return [\n {\n datapoints: getDatapoints(\n keys,\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n sortDirection,\n display,\n formaterAttrs,\n ),\n },\n ];\n};\n\nexport default (\n chartType,\n { observations, dimensions },\n dimensionsWithValuesIndexedById,\n display,\n formaterAttrs,\n) => {\n switch (chartType) {\n case 'BarChart':\n return series(\n ['x', 'y'],\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n 1,\n display,\n formaterAttrs,\n );\n case 'RowChart':\n return series(\n ['y', 'x'],\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n -1,\n display,\n formaterAttrs,\n );\n default:\n return [];\n }\n};\n","import * as R from 'ramda';\nimport { dimensionValueDisplay } from '../dimension-utils';\nimport { getFormatedObservation } from '../observation-formater';\n\nfunction dimensionValueIsValid(dimensionValue, chartDimension) {\n return R.includes(\n R.prop('id', dimensionValue),\n R.map(k => R.prop(`${k}Id`, chartDimension), ['x', 'y']),\n );\n}\n\nfunction getDimensionValues(\n dimensionValuesIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimensionId,\n display,\n) {\n const dimensionsWithValuesIds = R.keys(dimensionsWithValuesIndexedById);\n return R.addIndex(R.reduce)(\n (acc, dvi, i) => {\n const dimension = R.nth(i, dimensions);\n const dimensionId = R.prop('id', dimension);\n const dimensionValue = R.nth(dvi, R.propOr([], 'values', dimension || {}));\n if (dimensionId !== chartDimensionId && R.includes(dimensionId, dimensionsWithValuesIds)) {\n return R.assoc(\n dimensionId,\n { ...dimensionValue, name: dimensionValueDisplay(display)(dimensionValue) },\n acc,\n );\n }\n return acc;\n },\n {},\n dimensionValuesIndexes,\n );\n}\n\nfunction getDimensionValueKey(chartDimension, dimensionValue) {\n return R.prop('xId', chartDimension) === R.prop('id', dimensionValue) ? 'x' : 'y';\n}\n\nfunction datapoints(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimension,\n display,\n formaterAttrs,\n) {\n const chartDimensionId = R.prop('id', chartDimension);\n const chartDimensionIndex = R.findIndex(R.propEq(chartDimensionId, 'id'), dimensions);\n const datapoints = R.reduce(\n (acc, k) => {\n const o = R.prop(k, observations);\n const oDimensionValuesIndexes = R.split(':', k);\n const oDimensionValueIndex = oDimensionValuesIndexes[chartDimensionIndex];\n const _chartDimension = R.nth(chartDimensionIndex, dimensions);\n const oDimensionValue = R.nth(\n oDimensionValueIndex,\n R.propOr([], 'values', _chartDimension || {}),\n );\n if (dimensionValueIsValid(oDimensionValue, chartDimension)) {\n const oPartialKey = R.pipe(\n R.addIndex(R.reject)((_, i) => i === chartDimensionIndex),\n R.join(':'),\n )(oDimensionValuesIndexes);\n\n if (!R.has(oPartialKey, acc)) {\n const dimensionValues = getDimensionValues(\n oDimensionValuesIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimensionId,\n display,\n );\n acc[oPartialKey] = { dimensionValues };\n }\n const dimensionValueKey = getDimensionValueKey(chartDimension, oDimensionValue);\n acc[oPartialKey][dimensionValueKey] = R.head(o);\n acc[oPartialKey][`${dimensionValueKey}Format`] = getFormatedObservation(o, formaterAttrs);\n }\n return acc;\n },\n {},\n R.keys(observations),\n );\n // it is possible to have null observations or incomplete datapoints (just an x or y)\n return R.pipe(\n R.filter(dp => !R.isNil(dp.x) && !R.isNil(dp.y)),\n R.values,\n )(datapoints);\n}\n\nconst series = (\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimension,\n display,\n formaterAttrs,\n) => {\n const values = R.pipe(\n R.prop(R.prop('id', chartDimension || {})),\n R.propOr([], 'values'),\n )(dimensionsWithValuesIndexedById);\n const xValue = R.find(R.propEq(R.prop('xId', chartDimension), 'id'), values);\n const yValue = R.find(R.propEq(R.prop('yId', chartDimension), 'id'), values);\n return [\n {\n dimensionValues: {\n x: { ...xValue, name: dimensionValueDisplay(display)(xValue) },\n y: { ...yValue, name: dimensionValueDisplay(display)(yValue) },\n },\n datapoints: datapoints(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimension,\n display,\n formaterAttrs,\n ),\n },\n ];\n};\n\nexport default (\n { observations, dimensions },\n dimensionsWithValuesIndexedById,\n chartDimension,\n display,\n formaterAttrs,\n) =>\n series(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n chartDimension,\n display,\n formaterAttrs,\n );\n","import * as R from 'ramda';\nimport {\n categoryDisplay,\n dimensionValueDisplayAt,\n getTimePeriodDimension,\n} from '../dimension-utils';\nimport { getFormatedObservation } from '../observation-formater';\n\nconst getDimensionValues = (\n splitObservationKey,\n dimensions,\n dimensionsWithValuesIndexedById,\n rejectedId,\n display,\n) =>\n R.addIndex(R.reduce)(\n (acc, dimensionValueIndex, dimensionIndex) => {\n const dimension = R.nth(dimensionIndex, dimensions) || {};\n if (R.has(dimension.id, dimensionsWithValuesIndexedById) && dimension.id !== rejectedId) {\n const dimensionValue = R.pathOr({}, ['values', dimensionValueIndex], dimension);\n return R.set(\n R.lensPath([dimensionValue.id, 'name']),\n dimensionValueDisplayAt(dimension, dimensionValueIndex, display),\n acc,\n );\n }\n return acc;\n },\n {},\n splitObservationKey,\n );\n\nconst series = (\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n timePeriodDimensionIndex,\n display,\n formaterAttrs,\n) => {\n const rawSeries = R.reduce(\n (acc, k) => {\n const o = observations[k];\n const oDimensionValuesIndexes = R.split(':', k);\n\n const timePeriodDimension = R.nth(timePeriodDimensionIndex, dimensions);\n const timePeriodDimensionValueIndex = R.nth(\n timePeriodDimensionIndex,\n oDimensionValuesIndexes,\n );\n const timePeriod = R.path(['values', timePeriodDimensionValueIndex], timePeriodDimension);\n\n const datapoint = {\n x: timePeriod.start,\n y: R.head(o),\n timeLabel: timePeriod.name,\n formatedValue: getFormatedObservation(o, formaterAttrs),\n dimensionValues: getDimensionValues(\n oDimensionValuesIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n timePeriodDimension.id,\n display,\n ),\n };\n\n const category = categoryDisplay(\n oDimensionValuesIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n timePeriodDimension.id,\n display,\n );\n let key = categoryDisplay(\n oDimensionValuesIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n timePeriodDimension.id,\n 'code',\n );\n if (R.isNil(key) || R.isEmpty(key)) {\n key = 'uniq-dp';\n }\n const serieIndex = R.findIndex(serie => serie.key === key, acc);\n\n if (serieIndex !== -1)\n return R.over(R.lensPath([serieIndex, 'datapoints']), R.append(datapoint), acc);\n\n return R.append({ datapoints: [datapoint], category, key }, acc);\n },\n [],\n R.keys(observations),\n );\n return R.map(\n serie => ({ ...serie, datapoints: R.sortBy(R.prop('x'), serie.datapoints) }),\n rawSeries,\n );\n};\n\nexport default (\n { observations, dimensions },\n dimensionsWithValuesIndexedById,\n display,\n formaterAttrs,\n) => {\n const timePeriodDimension = getTimePeriodDimension(dimensions);\n const timePeriodDimensionIndex = timePeriodDimension ? timePeriodDimension.__index : -1;\n const timePeriodDimensionHasManyPeriods = !R.has(\n R.prop('id', timePeriodDimension),\n dimensionsWithValuesIndexedById,\n );\n if (\n !timePeriodDimensionIndex ||\n timePeriodDimensionIndex === -1 ||\n timePeriodDimensionHasManyPeriods\n )\n return [];\n\n return series(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n timePeriodDimensionIndex,\n display,\n formaterAttrs,\n );\n};\n","import * as R from 'ramda';\nimport { categoryDisplay, dimensionValueDisplay } from '../dimension-utils';\nimport { getFormatedObservation } from '../observation-formater';\n\nconst series = (\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n symbolDimension,\n sortDirection,\n display,\n formaterAttrs,\n) => {\n const symbolDimensionId = R.propOr(null, 'id', symbolDimension);\n if (symbolDimensionId === null) return [];\n const symbolDimIndex = R.findIndex(d => d.id === symbolDimensionId, dimensions);\n const datapoints = R.pipe(\n R.keys,\n R.reduce((acc, obsKey) => {\n const obs = observations[obsKey];\n if (R.isNil(R.head(obs)) || R.isEmpty(R.head(obs))) {\n return acc;\n }\n const obsDimsValsIndexes = R.split(':', obsKey);\n const symbolValIndex = Number(R.nth(symbolDimIndex, obsDimsValsIndexes));\n const symbolValId = R.path([symbolDimIndex, 'values', symbolValIndex, 'id'], dimensions);\n const symbolIndex = R.findIndex(R.propEq(symbolValId, 'id'), symbolDimension.serie);\n if (symbolIndex === -1) {\n return acc;\n }\n const category = categoryDisplay(\n obsDimsValsIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n symbolDimensionId,\n display,\n );\n const ids = categoryDisplay(\n obsDimsValsIndexes,\n dimensions,\n dimensionsWithValuesIndexedById,\n symbolDimensionId,\n 'code',\n );\n const key = R.isNil(ids) || R.isEmpty(ids) ? 'uniq-dp' : ids;\n const dpIndex = R.findIndex(R.propEq(key, 'key'), acc);\n const dp = R.pipe(\n dpIndex =>\n dpIndex === -1\n ? {\n category,\n formatedValues: new Array(R.length(symbolDimension.serie)),\n values: new Array(R.length(symbolDimension.serie)),\n key,\n }\n : R.nth(dpIndex, acc),\n R.set(R.lensPath(['values', symbolValIndex]), R.head(obs)),\n R.set(\n R.lensPath(['formatedValues', symbolValIndex]),\n getFormatedObservation(obs, formaterAttrs),\n ),\n )(dpIndex);\n return dpIndex === -1 ? R.append(dp, acc) : R.set(R.lensIndex(dpIndex), dp, acc);\n }, []),\n R.sortBy(d => R.head(d.values) * sortDirection),\n )(observations);\n\n const symbolValues = R.map(dimensionValueDisplay(display), symbolDimension.serie);\n return [{ datapoints, symbolValues }];\n};\n\nexport default (\n { observations, dimensions },\n chartType,\n dimensionsWithValuesIndexedById,\n symbolDimension,\n display,\n formaterAttrs,\n) => {\n switch (chartType) {\n case 'HorizontalSymbolChart':\n return series(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n symbolDimension,\n -1,\n display,\n formaterAttrs,\n );\n case 'VerticalSymbolChart':\n return series(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n symbolDimension,\n 1,\n display,\n formaterAttrs,\n );\n default:\n return [];\n }\n};\n","import { dimensionValueDisplay, isTimePeriodDimension } from '../dimension-utils';\nimport { getObservationFormater } from '../observation-formater';\nimport * as R from 'ramda';\n\nconst flatDatapoints = (\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n serieDimensionId,\n display,\n formaterAttrs,\n [stackKey, categoryKey],\n) => {\n const datapoints = R.mapObjIndexed((observationValue, observationKey) => {\n let category = null;\n const value = Number(R.head(observationValue));\n const formater = getObservationFormater(observationValue, formaterAttrs);\n const splittedKey = R.split(':', observationKey);\n let layerKey = [];\n const layerDimensions = R.addIndex(R.reduce)(\n (memo, dimensionValueIndex, dimensionIndex) => {\n const dimension = R.nth(dimensionIndex, dimensions);\n const _dimensionValue = R.pathOr({}, ['values', Number(dimensionValueIndex)], dimension);\n const label = dimensionValueDisplay(display)(_dimensionValue);\n const dimensionValue = {\n ..._dimensionValue,\n index: Number(dimensionValueIndex),\n label,\n };\n if (dimension.id === serieDimensionId) {\n category = dimensionValue;\n } else if (R.has(dimension.id, dimensionsWithValuesIndexedById)) {\n memo.push(dimensionValue);\n layerKey.push(dimensionValueIndex);\n }\n return memo;\n },\n [],\n splittedKey,\n );\n return {\n formater,\n [categoryKey]: category,\n [stackKey]: value,\n layerDimensions,\n layerKey: R.join(':', layerKey),\n };\n }, observations);\n\n return R.values(datapoints);\n};\n\nconst serie = (\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n singularity,\n display,\n formaterAttrs,\n [stackKey, categoryKey],\n) => {\n const serieDimensionId = R.propOr(null, 'id', singularity);\n const serieDimension = R.find(R.propEq(serieDimensionId, 'id'), dimensions);\n if (R.isNil(serieDimension)) {\n return { datapoints: [], layerSeries: [] };\n }\n const _flatDatapoints = flatDatapoints(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n serieDimensionId,\n display,\n formaterAttrs,\n [stackKey, categoryKey],\n );\n const layeredDatapoints = R.groupBy(R.prop('layerKey'), _flatDatapoints); // { [layeredKey]: [dps] }\n\n const layerFullSeries = R.map(\n datapoints => ({\n layerDimensions: R.prop('layerDimensions', R.head(datapoints)),\n layerKey: R.prop('layerKey', R.head(datapoints)),\n }),\n R.values(layeredDatapoints),\n ); // [{ layerDimensions, layerKey }]\n\n const layerLimit = R.propOr(Infinity, 'limit', singularity);\n const layerSeries = R.take(layerLimit, R.sortBy(R.prop('layerKey'), layerFullSeries));\n\n const layeredDatapointsKeyedByCategory = R.mapObjIndexed(\n R.indexBy(R.path([categoryKey, 'id'])),\n layeredDatapoints,\n ); // { [layeredKey]: { [x.id]: dp } }\n\n const datapoints = R.addIndex(R.map)((serieValue, index) => {\n const serieValueId = serieValue.id;\n const category = dimensionValueDisplay(display)(serieValue);\n const values = R.map(\n ({ layerKey }) =>\n R.pathOr(null, [layerKey, serieValueId, stackKey], layeredDatapointsKeyedByCategory),\n layerSeries,\n );\n const formaters = R.map(\n ({ layerKey }) =>\n R.pathOr(null, [layerKey, serieValueId, 'formater'], layeredDatapointsKeyedByCategory),\n layerSeries,\n );\n return {\n category,\n formaters,\n index,\n [categoryKey]: category,\n [stackKey]: values,\n key: serieValueId,\n };\n }, serieDimension.values);\n\n const _datapoints = R.when(\n R.pipe(R.length, R.equals(1)),\n R.pipe(R.set(R.lensPath([0, 'category']), ''), R.set(R.lensPath([0, categoryKey]), '')),\n datapoints,\n );\n\n return {\n datapoints: _datapoints,\n layerSeries: R.map(\n layer => ({\n id: R.pipe(R.prop('layerDimensions'), R.pluck('id'), R.join(' - '))(layer),\n label: R.pipe(R.prop('layerDimensions'), R.pluck('label'), R.join(' - '))(layer),\n }),\n layerSeries,\n ),\n };\n};\n\nconst percentSerie = stackKey =>\n R.pipe(\n R.over(\n R.lensProp('datapoints'),\n R.map(dp => {\n const total = R.pipe(\n R.map(v => Math.abs(v)),\n R.sum,\n )(dp[stackKey]);\n if (!total) {\n return dp;\n }\n return {\n ...dp,\n [stackKey]: R.map(v => (Math.abs(v) / total) * 100, dp[stackKey]),\n formaters: null,\n };\n }),\n ),\n res => R.of(Array, res),\n );\n\nconst serieSortedByTotal = stackKey =>\n R.pipe(\n R.over(\n R.lensProp('datapoints'),\n R.sortBy(\n R.pipe(\n R.prop(stackKey),\n R.map(v => (v > 0 ? R.negate(v) : 0)),\n R.sum,\n ),\n ),\n ),\n res => R.of(Array, res),\n );\n\nconst serieSortedByDataOrder = R.pipe(\n R.over(R.lensProp('datapoints'), R.sortBy(R.prop('index'))),\n res => R.of(Array, res),\n);\n\nexport default (\n { observations, dimensions },\n dimensionsWithValuesIndexedById,\n singularity,\n display,\n formaterAttrs,\n [stackKey, categoryKey],\n) => {\n const mode = R.propOr('values', 'mode', singularity);\n const serieDimensionId = R.propOr(null, 'id', singularity);\n const _serie = serie(\n observations,\n dimensions,\n dimensionsWithValuesIndexedById,\n singularity,\n display,\n formaterAttrs,\n [stackKey, categoryKey],\n );\n if (mode === 'percent') {\n return percentSerie(stackKey)(_serie);\n } else if (isTimePeriodDimension({ id: serieDimensionId })) {\n return serieSortedByDataOrder(_serie);\n }\n return serieSortedByTotal(stackKey)(_serie);\n};\n","import * as R from 'ramda';\nimport { categoryDisplay, dimensionValueDisplay, getRefAreaDimension } from '../dimension-utils';\n\nconst parseByAreas = (observations, refAreaDimension) => {\n if (R.isNil(refAreaDimension)) {\n return null;\n }\n const { __index, values = [] } = refAreaDimension;\n\n return R.pipe(\n R.keys,\n R.reduce((acc, key) => {\n const value = observations[key];\n const splitedKey = R.split(':', key);\n const areaValueIndex = Number(R.nth(__index, splitedKey));\n const areaValue = isNaN(areaValueIndex) ? null : R.nth(areaValueIndex, values);\n const areaId = R.prop('id', areaValue || {});\n return R.over(\n R.lensProp(areaId),\n vals => R.append({ splitedKey, value, areaValueIndex }, vals || []),\n acc,\n );\n }, {}),\n )(observations);\n};\n\nexport default (\n { observations, dimensions },\n dimensionsWithValuesIndexedById,\n topoMap,\n display,\n) => {\n const refAreaDimension = getRefAreaDimension(dimensions);\n const observationsByAreas = parseByAreas(observations, refAreaDimension);\n const topology = R.propOr({}, 'topology', topoMap);\n const areaSelection = R.propOr(null, 'areaSelection', topoMap);\n const topoAreas = R.pathOr(null, ['objects', areaSelection], topology);\n if (!observationsByAreas || !topoAreas) {\n return null;\n }\n const topoAreasWithData = R.map(areaGeometry => {\n const areaObservation = R.pipe(\n R.pathOr(null, ['properties', 'id']),\n id => R.propOr([], id, observationsByAreas),\n R.head,\n )(areaGeometry);\n const areaValueIndex = R.propOr(null, 'areaValueIndex', areaObservation);\n const areaValue = R.pathOr(null, ['values', areaValueIndex], refAreaDimension);\n return {\n ...areaGeometry,\n properties: {\n ...R.propOr({}, 'properties', areaGeometry),\n label: dimensionValueDisplay(display)(areaValue),\n value: R.head(R.propOr([], 'value', areaObservation)),\n category: categoryDisplay(\n R.propOr([], 'splitedKey', areaObservation),\n dimensions,\n dimensionsWithValuesIndexedById,\n refAreaDimension.id,\n display,\n ),\n },\n };\n }, topoAreas.geometries);\n return {\n objects: {\n areas: {\n type: topoAreas.type,\n geometries: topoAreasWithData,\n },\n },\n arcs: topology.arcs,\n bbox: topology.bbox,\n transform: topology.transform,\n };\n};\n","import * as R from 'ramda';\nimport sampleSeries from './sample-series';\nimport scatterSeries from './scatter-series';\nimport timelineSeries from './timeline-series';\nimport symbolSeries from './symbol-series';\nimport stackedSeries from './stacked-series';\nimport choroSeries from './choro-series';\nimport { getObservationsFormaterAttributes } from '../observation-formater';\n\nexport default ({ type, data, options, singularity }) => {\n const { display, formatterIds, map } = options;\n\n const { attributes = [] } = data;\n const formaterAttributes = getObservationsFormaterAttributes(attributes, formatterIds);\n\n const indexedDimensions = R.reduce(\n (acc, dim) => {\n if (dim.header) {\n return acc;\n }\n return R.assoc(dim.id, dim, acc);\n },\n {},\n data.dimensions || [],\n );\n\n switch (type) {\n case 'BarChart':\n case 'RowChart':\n return sampleSeries(type, data, indexedDimensions, display, formaterAttributes);\n case 'ScatterChart':\n return scatterSeries(data, indexedDimensions, singularity, display, formaterAttributes);\n case 'TimelineChart':\n return timelineSeries(data, indexedDimensions, display, formaterAttributes);\n case 'HorizontalSymbolChart':\n case 'VerticalSymbolChart':\n return symbolSeries(data, type, indexedDimensions, singularity, display, formaterAttributes);\n case 'StackedBarChart':\n return stackedSeries(data, indexedDimensions, singularity, display, formaterAttributes, [\n 'y',\n 'x',\n ]);\n case 'StackedRowChart':\n return stackedSeries(data, indexedDimensions, singularity, display, formaterAttributes, [\n 'x',\n 'y',\n ]);\n case 'ChoroplethChart':\n return choroSeries(data, indexedDimensions, map, display);\n default:\n return [];\n }\n};\n","import {\n equals,\n find,\n groupBy,\n has,\n is,\n isEmpty,\n isNil,\n length,\n map,\n not,\n omit,\n pipe,\n prop,\n propEq,\n propOr,\n reject,\n head,\n} from 'ramda';\nimport {\n dimensionValueDisplay,\n isRefAreaDimension,\n isTimePeriodDimension,\n parseDisplay,\n} from '../dimension-utils';\nimport { CHORO, STACKED_BAR, STACKED_ROW, TYPES } from '../constants';\n\nexport const isNumber = input => {\n const value = Number(input);\n return not(isNil(value) || isNaN(value));\n};\n\nexport const isPositiveNumber = input => {\n return isNumber(input) && Number(input) >= 0;\n};\n\nexport const isNaturalInt = value => isNil(value) || /^\\d+$/.test(String(value));\n\nexport const isChart = type => has(type, TYPES);\n\nexport const hasFocus = type => has(type, omit([CHORO], TYPES));\n\nexport const getDimensionsWithValues = data =>\n pipe(\n propOr([], 'dimensions'),\n reject(d => d.header || isEmpty(d.values || [])),\n )(data);\n\nexport const toState = artefact => prop('id', artefact);\n\nexport const getPropertyDimension = property => (data, state) => {\n const dimensionId = prop(property, state);\n const { dimensions = [] } = data || {};\n\n return find(propEq(dimensionId, 'id'), dimensions);\n};\n\nexport const getGroupedDimensions = pipe(\n getDimensionsWithValues,\n groupBy(dimension => {\n if (isRefAreaDimension(dimension)) {\n return 'area';\n }\n if (isTimePeriodDimension(dimension)) {\n return 'time';\n }\n return 'other';\n }),\n);\n\nexport const optionParser = option =>\n pipe(\n option => (is(Array, option) ? head(option) : option),\n option => (is(Object, option) ? prop('value', option) : option),\n option => (is(String, option) ? option : undefined),\n )(option);\n\nexport const artefactToOption = display => artefact =>\n isNil(artefact)\n ? undefined\n : {\n label: dimensionValueDisplay(parseDisplay(display))(artefact),\n value: prop('id', artefact),\n };\n\nexport const chartDimensionToOption =\n property =>\n ({ data, display }, state) =>\n pipe(getPropertyDimension(property), artefactToOption(display))(data, state);\n\nexport const chartDimensionOptions = ({ data, type, display }, typeValidator) => {\n if (!typeValidator(type)) {\n return [];\n }\n const dimensions = getDimensionsWithValues(data);\n if ((equals(type, STACKED_BAR) || equals(type, STACKED_ROW)) && length(dimensions) === 1) {\n return [];\n }\n return map(artefactToOption(display), dimensions);\n};\n","import * as R from 'ramda';\nimport getSeries from '../factories/series';\nimport { BAR, ROW, TIMELINE } from '../constants';\nimport { hasFocus } from './utils';\nimport { dimensionValueDisplay, parseDisplay } from '../dimension-utils';\n\nconst sampleFocusTypes = { [BAR]: BAR, [ROW]: ROW, [TIMELINE]: TIMELINE };\n\nconst focusComparator = (op1, op2) => op1.value === op2.value;\n\nconst focus = (data, type, dimension, _display) => {\n const display = parseDisplay(_display);\n const id = R.prop('id', dimension);\n switch (type) {\n case 'RowChart':\n case 'BarChart':\n case 'HorizontalSymbolChart':\n case 'VerticalSymbolChart':\n case 'StackedBarChart':\n case 'StackedRowChart':\n return R.pipe(\n getSeries,\n R.pathOr([], [0, 'datapoints']),\n R.map(dp => ({ label: dp.category, value: dp.key })),\n )({ data, type, options: { display }, singularity: dimension });\n case 'TimelineChart':\n return R.pipe(\n getSeries,\n R.map(serie => ({ label: serie.category, value: serie.key })),\n )({ data, type, options: { display }, singularity: dimension });\n case 'ScatterChart':\n if (R.isNil(id)) return [];\n return R.pipe(\n R.propOr([], 'dimensions'),\n R.reduce((acc, dim) => {\n if (dim.header || dim.id === id) {\n return acc;\n }\n const dimOptions = R.map(\n val => ({\n label: `${dimensionValueDisplay(display)(dim)} - ${dimensionValueDisplay(display)(val)}`,\n options: { dimensionId: dim.id, dimensionValueId: val.id },\n value: `${dim.id}-${val.id}`,\n }),\n R.propOr([], 'values', dim),\n );\n return R.concat(acc, dimOptions);\n }, []),\n )(data);\n default:\n return [];\n }\n};\n\nexport const parseFocus = (data, type, dimension, display, { baseline, highlight }) => {\n const options = focus(data, type, dimension, display);\n const optionsSet = new Set(R.pluck('value', options));\n\n const parseSelection = R.reject(({ value }) => !optionsSet.has(value));\n\n return { baseline: parseSelection(baseline), highlight: parseSelection(highlight) };\n};\n\nexport const focusOptions = (props, state, otherFocus, singularity) => {\n if (!hasFocus(props.type)) {\n return [];\n }\n const options = focus(props.data, props.type, singularity, props.display);\n return R.differenceWith(focusComparator, options, R.prop(otherFocus, state));\n};\n\nexport const onChangeFocusSelection = _value => {\n const value = R.isNil(_value) ? [] : _value;\n return R.is(Array, value) ? value : [value];\n};\n\nconst toKey = () => R.prop('value');\n\nconst filterFocus = (focus, keyedOptions, type) =>\n R.reduce(\n (acc, entry) => {\n const entryKey = toKey(type)(entry);\n if (R.has(entryKey, keyedOptions)) {\n return R.append(R.prop(entryKey, keyedOptions), acc);\n }\n return acc;\n },\n [],\n focus,\n );\n\nexport const focusStateFromNewProps = ({ data, display, type }, singularity, state) => {\n const highlightState = R.propOr([], 'highlight', state);\n const baselineState = R.propOr([], 'baseline', state);\n const options = focus(data, type, singularity, display);\n const keyedOptions = R.indexBy(toKey(type), options);\n return {\n baseline: filterFocus(baselineState, keyedOptions, R.prop('type', state)),\n highlight: filterFocus(highlightState, keyedOptions, R.prop('type', state)),\n };\n};\n\n/*\n This props/state parser which will be exposed in highlight/baseline properties,\n only deals for Bar and Row Chart (no chart dimension singularity involved).\n For other chart types, their own chart dimension singularity parser will handle focus management.\n*/\n\nexport const sampleFocusStateFromNewProps = (props, state) => {\n if (!R.has(props.type, sampleFocusTypes) || R.isNil(props.data)) {\n return {}; //no changes\n }\n return focusStateFromNewProps(props, null, state);\n};\n","import * as R from 'ramda';\nimport { isRefAreaDimension } from '../dimension-utils';\nimport { SCATTER } from '../constants';\nimport { artefactToOption, getDimensionsWithValues, getPropertyDimension, toState } from './utils';\nimport { focusStateFromNewProps } from './focus';\n\nconst getScatterDimension = getPropertyDimension('scatterDimension');\n\nconst toScatterState = (dim, xVal, yVal) => ({\n scatterDimension: toState(dim),\n scatterX: toState(xVal),\n scatterY: toState(yVal),\n});\n\nexport const toScatterSingularity = state => ({\n id: R.prop('scatterDimension', state),\n xId: R.prop('scatterX', state),\n yId: R.prop('scatterY', state),\n});\n\nexport const isScatter = type => type === SCATTER;\n\nexport const scatterValueOptions = ({ data, type, display }, state) => {\n if (!isScatter(type)) {\n return [];\n }\n const scatterDimension = getScatterDimension(data, state);\n if (R.isNil(scatterDimension)) {\n return [];\n }\n return R.map(artefactToOption(display), R.prop('values', scatterDimension));\n};\n\nexport const onChangeScatterDim = (props, state) => value => {\n const { data } = props;\n const dimension = getScatterDimension(data, { scatterDimension: value });\n if (R.isNil(dimension)) {\n return {};\n }\n\n const [xVal, yVal] = R.take(2, R.prop('values', dimension));\n\n const newScatterState = toScatterState(dimension, xVal, yVal);\n\n return {\n ...newScatterState,\n ...focusStateFromNewProps(props, toScatterSingularity(newScatterState), state),\n };\n};\n\nexport const scatterStateValueToOption = (property, props, state) => {\n const dimension = getScatterDimension(props.data, state);\n if (R.isNil(dimension) || !isScatter(props.type)) {\n return undefined;\n }\n const value = R.find(R.propEq(R.prop(property, state), 'id'), R.prop('values', dimension));\n return artefactToOption(props.display)(value);\n};\n\nexport const onChangeScatterVal =\n ({ data, type }, state, valKey, otherValKey) =>\n value => {\n const options = scatterValueOptions({ data, type }, state);\n const [matching, otherOptions] = R.partition(R.propEq(value, 'value'), options);\n if (R.isEmpty(matching)) {\n return {};\n }\n const stateOtherValue = R.prop(otherValKey, state);\n return {\n [valKey]: value,\n [otherValKey]:\n stateOtherValue === value ? R.prop('value', R.head(otherOptions)) : stateOtherValue,\n };\n };\n\n//----------------------------------------------------------------------------------------------------\n\nexport const scatterStateFromNewProps = (props, state) => {\n const { data, type } = props;\n const undefinedState = toScatterState(undefined, undefined, undefined);\n if (!isScatter(type)) {\n return undefinedState;\n }\n if (R.isNil(data)) {\n return {};\n }\n const dimensions = getDimensionsWithValues(data);\n if (R.isEmpty(dimensions)) {\n return { ...undefinedState, highlight: [], baseline: [] };\n }\n\n let scatterDimension = getScatterDimension(props.data, state);\n if (R.isNil(scatterDimension)) {\n const refinedDimensions = R.reject(isRefAreaDimension, dimensions);\n scatterDimension = R.head(R.isEmpty(refinedDimensions) ? dimensions : refinedDimensions);\n }\n\n const values = R.prop('values', scatterDimension);\n\n const stateScatterX = R.prop('scatterX', state);\n let stateScatterY = R.prop('scatterY', state);\n\n if (stateScatterX === stateScatterY) {\n stateScatterY = undefined;\n }\n\n let _scatterX = undefined;\n let _scatterY = undefined;\n\n R.forEach(value => {\n if (R.prop('id', value) === stateScatterX) {\n _scatterX = value;\n } else if (R.prop('id', value) === stateScatterY) {\n _scatterY = value;\n }\n }, values);\n\n //dirty as f\n const scatterX = R.isNil(_scatterX)\n ? R.head(R.reject(R.propEq(R.prop('id', _scatterY), 'id'), values))\n : _scatterX;\n const scatterY = R.isNil(_scatterY)\n ? R.head(R.reject(R.propEq(R.prop('id', scatterX), 'id'), values))\n : _scatterY;\n\n const scatterState = toScatterState(scatterDimension, scatterX, scatterY);\n\n return {\n ...scatterState,\n ...focusStateFromNewProps(props, toScatterSingularity(scatterState), state),\n };\n};\n","import * as R from 'ramda';\nimport { H_SYMBOL, V_SYMBOL } from '../constants';\nimport {\n getDimensionsWithValues,\n getGroupedDimensions,\n getPropertyDimension,\n toState,\n} from './utils';\nimport { focusStateFromNewProps } from './focus';\n\nconst getSymbolDimension = getPropertyDimension('symbolDimension');\n\nexport const isSymbol = type => type === H_SYMBOL || type === V_SYMBOL;\n\nconst toSymbolState = dimension => ({\n symbolDimension: toState(dimension),\n});\n\nexport const toSymbolSingularity = (data, state) => {\n const symbolDimension = getSymbolDimension(data, state);\n const res = {\n id: R.isNil(symbolDimension) ? undefined : R.prop('id', symbolDimension),\n serie: R.pipe(\n R.prop('values'),\n values => (R.isNil(values) ? [] : values),\n R.take(5),\n )(symbolDimension),\n };\n return res;\n};\n\nexport const symbolStateFromNewProps = (props, state) => {\n const { data, type } = props;\n if (!isSymbol(type)) {\n return toSymbolState(undefined);\n }\n if (R.isNil(data)) {\n return {};\n }\n const dimensions = getDimensionsWithValues(data);\n if (R.isEmpty(dimensions)) {\n return { ...toSymbolState(undefined), baseline: [], highlight: [] };\n }\n let symbolDimension = getSymbolDimension(data, state);\n if (R.isNil(symbolDimension)) {\n const { area, other, time } = getGroupedDimensions(data);\n if (!R.isNil(other) && !R.isEmpty(other)) {\n symbolDimension = R.head(other);\n } else if (!R.isNil(time) && !R.isEmpty(time)) {\n symbolDimension = R.head(time);\n } else {\n symbolDimension = R.head(area);\n }\n }\n const symbolState = toSymbolState(symbolDimension);\n return {\n ...symbolState,\n ...focusStateFromNewProps(props, toSymbolSingularity(data, symbolState), state),\n };\n};\n\nexport const onChangeSymbolDim =\n ({ data }) =>\n option => {\n const dimension = getSymbolDimension(data, { symbolDimension: option });\n if (R.isNil(dimension)) {\n return {};\n }\n return {\n ...toSymbolState(dimension),\n highlight: [],\n baseline: [],\n };\n };\n","import * as R from 'ramda';\nimport { PERCENT, STACKED_BAR, STACKED_ROW, VALUES } from '../constants';\nimport {\n getDimensionsWithValues,\n getGroupedDimensions,\n getPropertyDimension,\n toState,\n} from './utils';\nimport { focusStateFromNewProps } from './focus';\n\nconst getStackedDimension = getPropertyDimension('stackedDimension');\n\nconst stackedModes = { [PERCENT]: PERCENT, [VALUES]: VALUES };\n\nexport const isStacked = type => type === STACKED_BAR || type === STACKED_ROW;\n\nconst toStackedState = (dimension, mode) => ({\n stackedDimension: toState(dimension),\n stackedMode: mode,\n});\n\nexport const toStackedSingularity = state => ({\n id: R.prop('stackedDimension', state),\n mode: R.prop('stackedMode', state),\n limit: 5,\n});\n\nexport const onChangeStackedDimension =\n ({ data }, state) =>\n value => {\n const dimension = getStackedDimension(data, { stackedDimension: value });\n if (R.isNil(dimension)) {\n return {};\n }\n return {\n stackedDimension: toState(dimension),\n highlight: [],\n baseline: [],\n };\n };\n\nexport const stackedModeOptions = [{ value: VALUES }, { value: PERCENT }];\n\nexport const isStackedDimActive = ({ data, type }) => {\n const dimensions = getDimensionsWithValues(data);\n if (R.length(dimensions) < 2) {\n return false;\n }\n return isStacked(type);\n};\n\nexport const onChangeStackedMode = value =>\n R.has(value, stackedModes) ? { stackedMode: value } : {};\n\nexport const stackedStateFromNewProps = (props, state) => {\n const { data, type } = props;\n if (!isStacked(type)) {\n return toStackedState(undefined, undefined);\n }\n if (R.isNil(data)) {\n return {};\n }\n const dimensions = getDimensionsWithValues(data);\n if (R.isEmpty(dimensions)) {\n return { ...toStackedState(undefined, undefined), baseline: [], highlight: [] };\n }\n\n let dimension = getStackedDimension(data, state);\n if (R.isNil(dimension)) {\n if (R.length(dimensions) === 1) {\n dimension = R.find(R.prop('header'), data.dimensions);\n } else {\n const { area, time, other } = getGroupedDimensions(data);\n if (!R.isNil(area) && !R.isEmpty(area)) {\n dimension = R.head(area);\n } else if (!R.isNil(time) && !R.isEmpty(time)) {\n dimension = R.head(time);\n } else {\n dimension = R.head(other);\n }\n }\n }\n const _mode = R.prop('stackedMode', state);\n const mode = R.has(_mode, stackedModes) ? _mode : VALUES;\n const stackedState = toStackedState(dimension, mode);\n return {\n ...stackedState,\n ...focusStateFromNewProps(props, toStackedSingularity(stackedState), state),\n };\n};\n","import * as R from 'ramda';\nimport {\n BAR,\n H_SYMBOL,\n ROW,\n SCATTER,\n STACKED_BAR,\n STACKED_ROW,\n TIMELINE,\n V_SYMBOL,\n} from '../constants';\nimport { isNumber, isPositiveNumber } from './utils';\nimport { isStacked } from './stacked';\n\nconst hasXLinear = type => R.includes(type, [H_SYMBOL, ROW, SCATTER, STACKED_ROW]);\n\nconst hasYLinear = type => R.includes(type, [BAR, SCATTER, STACKED_BAR, TIMELINE, V_SYMBOL]);\n\nconst hasXPivot = type => R.equals(ROW, type);\nconst hasYPivot = type => R.equals(BAR, type);\n\nconst xInitialState = {\n computedMaxX: undefined,\n computedMinX: undefined,\n computedStepX: undefined,\n computedPivotX: undefined,\n maxX: undefined,\n minX: undefined,\n pivotX: undefined,\n stepX: undefined,\n};\n\nconst yInitialState = {\n computedMaxY: undefined,\n computedMinY: undefined,\n computedStepY: undefined,\n computedPivotY: undefined,\n maxY: undefined,\n minY: undefined,\n pivotY: undefined,\n stepY: undefined,\n};\n\nexport const initialState = { ...xInitialState, ...yInitialState };\n\nexport const linearStateFromNewProps = type => {\n const xLinearState = hasXLinear(type) ? {} : xInitialState;\n const YLinearState = hasYLinear(type) ? {} : yInitialState;\n return {\n ...xLinearState,\n ...R.when(R.always(isStacked(type)), R.assoc('pivotY', 0))(YLinearState),\n };\n};\n\nexport const toProperties = (props, state, onChange) => ({\n maxX: {\n id: 'maxX',\n isActive: hasXLinear(props.type),\n onChange: value =>\n onChange({\n maxX: isNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.maxX) ? String(state.computedMaxX) : state.maxX,\n },\n maxY: {\n id: 'maxY',\n isActive: hasYLinear(props.type),\n onChange: value =>\n onChange({\n maxY: isNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.maxY) ? String(state.computedMaxY) : state.maxY,\n },\n minX: {\n id: 'minX',\n isActive: hasXLinear(props.type),\n onChange: value =>\n onChange({\n minX: isNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.minX) ? String(state.computedMinX) : state.minX,\n },\n minY: {\n id: 'minY',\n isActive: hasYLinear(props.type),\n onChange: value =>\n onChange({\n minY: isNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.minY) ? String(state.computedMinY) : state.minY,\n },\n pivotX: {\n id: 'pivotX',\n isActive: hasXPivot(props.type),\n onChange: value =>\n onChange({\n pivotX: isNumber(value) ? value : undefined,\n }),\n value: R.when(\n v => R.isNil(v) && (R.propEq(ROW, 'type')(props) || R.propEq(STACKED_ROW, 'type')(props)),\n R.always(0),\n )(R.isNil(state.pivotX) ? String(state.computedPivotX) : state.pivotX),\n },\n pivotY: {\n id: 'pivotY',\n isActive: hasYPivot(props.type),\n onChange: value =>\n onChange({\n pivotY: isNumber(value) ? value : undefined,\n }),\n value: R.when(\n v => R.isNil(v) && (R.propEq(BAR, 'type')(props) || R.propEq(STACKED_BAR, 'type')(props)),\n R.always(0),\n )(R.isNil(state.pivotY) ? String(state.computedPivotY) : state.pivotY),\n },\n stepX: {\n id: 'stepX',\n isActive: hasXLinear(props.type),\n onChange: value =>\n onChange({\n stepX: isPositiveNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.stepX) ? String(state.computedStepX) : state.stepX,\n },\n stepY: {\n id: 'stepY',\n isActive: hasYLinear(props.type),\n onChange: value =>\n onChange({\n stepY: isPositiveNumber(value) ? value : undefined,\n }),\n value: R.isNil(state.stepY) ? String(state.computedStepY) : state.stepY,\n },\n});\n","import * as R from 'ramda';\nimport { dimensionValueDisplay, parseDisplay } from '../dimension-utils';\nimport { isChart } from './utils';\n\nconst isCustomInvalid =\n ({ type }) =>\n value =>\n R.isNil(value) || !isChart(type);\n\nconst getDataflowName = props => {\n const dataflow = R.propOr({}, 'dataflow', props);\n const display = parseDisplay(props.display);\n return dimensionValueDisplay(display)(dataflow);\n};\n\nexport const getSourceLabel = (props, state) =>\n R.when(\n isCustomInvalid({ type: props.type }),\n R.always(getDataflowName(props)),\n )(state.sourceLabel);\n\nexport const getFooterProps = (props, state) => ({\n withCopyright: isChart(props.type) ? state.withCopyright : true,\n withLogo: isChart(props.type) ? state.withLogo : true,\n sourceLabel: getSourceLabel(props, state),\n});\n","import * as R from 'ramda';\n\nexport const stringifySubtitle = R.pipe(\n R.map(({ header, label }) => (R.isNil(header) ? label : `${header} ${label}`)),\n R.join(' · '),\n);\n","import * as R from 'ramda';\nimport { H_SYMBOL, SCATTER, STACKED_BAR, STACKED_ROW, TIMELINE, V_SYMBOL } from '../constants';\nimport { onChangeFocusSelection, focusOptions, sampleFocusStateFromNewProps } from './focus';\nimport {\n isScatter,\n onChangeScatterDim,\n onChangeScatterVal,\n scatterStateFromNewProps,\n scatterStateValueToOption,\n scatterValueOptions,\n toScatterSingularity,\n} from './scatter';\nimport {\n isSymbol,\n onChangeSymbolDim,\n symbolStateFromNewProps,\n toSymbolSingularity,\n} from './symbol';\nimport {\n isStacked,\n isStackedDimActive,\n onChangeStackedDimension,\n onChangeStackedMode,\n stackedModeOptions,\n stackedStateFromNewProps,\n toStackedSingularity,\n} from './stacked';\nimport {\n linearStateFromNewProps,\n initialState as linearInitialState,\n toProperties as toLinearProperties,\n} from './linear';\nimport {\n chartDimensionOptions,\n chartDimensionToOption,\n hasFocus,\n isChart,\n isNaturalInt,\n optionParser,\n} from './utils';\nimport { getSourceLabel } from './getHeaderProps';\nimport { stringifySubtitle } from './getStringifiedSubtitle';\n\n/*\n - width/height -> initial undefined, if undefined or blank, replaced by options.base\n*/\n\nexport const toSingularity = ({ data, type }, state) => {\n switch (type) {\n case SCATTER:\n return toScatterSingularity(state);\n case H_SYMBOL:\n case V_SYMBOL:\n return toSymbolSingularity(data, state);\n case STACKED_BAR:\n case STACKED_ROW:\n return toStackedSingularity(state);\n default:\n return null;\n }\n};\n\nconst toFloat = value => {\n const float = parseFloat(value);\n return isNaN(float) ? undefined : float;\n};\n\nconst toOption = (stateValue, optionValue) =>\n R.isNil(stateValue) ? optionValue : toFloat(stateValue);\n\nconst getFreqStepOption = (props, state) => {\n if (props.type !== TIMELINE) {\n return null;\n }\n const inputState = toFloat(state.freqStep);\n return R.isNil(inputState) ? 1 : inputState;\n};\n\nexport const toChartOptions = (props, state) => {\n const options = R.propOr({}, 'options', props);\n const base = R.propOr({}, 'base', options);\n const axis = R.propOr({}, 'axis', options);\n const axeX = R.propOr({}, 'x', axis);\n const axeY = R.propOr({}, 'y', axis);\n const linearX = R.propOr({}, 'linear', axeX);\n const linearY = R.propOr({}, 'linear', axeY);\n const tickX = R.propOr({}, 'tick', axeX);\n const pivotX = R.propOr({}, 'pivot', linearX);\n const pivotY = R.propOr({}, 'pivot', linearY);\n const map = R.propOr({}, 'map', props);\n return {\n ...options,\n axis: {\n ...axis,\n x: {\n ...axeX,\n tick: {\n ...tickX,\n step: getFreqStepOption(props, state),\n },\n linear: {\n ...linearX,\n max: toOption(state.maxX, linearX.max),\n min: toOption(state.minX, linearX.min),\n pivot: {\n value: toOption(state.pivotX, pivotX.value),\n },\n step: toOption(props.type === TIMELINE ? 1 : state.stepX, linearX.step),\n },\n },\n y: {\n ...axeY,\n linear: {\n ...linearY,\n max: toOption(state.maxY, linearY.max),\n min: toOption(state.minY, linearY.min),\n pivot: {\n value: toOption(state.pivotY, pivotY.value),\n },\n step: toOption(state.stepY, linearY.step),\n },\n },\n },\n map: R.pick(['projection', 'scale'], map),\n base: {\n ...base,\n height: toOption(state.fixedHeight, base.height),\n width: toOption(state.fixedWidth, base.width),\n },\n };\n};\n\nexport const stateFromNewProps = (props, state) => {\n const focusState = sampleFocusStateFromNewProps(props, state);\n const scatterState = scatterStateFromNewProps(props, state);\n const symbolState = symbolStateFromNewProps(props, state);\n const stackedState = stackedStateFromNewProps(props, state);\n const linearState = linearStateFromNewProps(props.type);\n return {\n ...focusState,\n ...scatterState,\n ...symbolState,\n ...stackedState,\n ...linearState,\n fixedWidth: R.prop('fixedWidth', state),\n fixedHeight: R.prop('fixedHeight', state),\n responsiveWidth: R.prop('responsiveWidth', state),\n responsiveHeight: R.prop('responsiveHeight', state),\n freqStep: props.type === TIMELINE ? R.prop('freqStep', state) || '1' : undefined,\n type: R.prop('type', props),\n };\n};\n\nexport const toProperties = (props, state, onChange) => ({\n ...toLinearProperties(props, state, onChange),\n highlight: {\n id: 'highlight',\n isActive: hasFocus(props.type),\n onChange: R.pipe(onChangeFocusSelection, selection => {\n onChange({ highlight: selection });\n }),\n options: focusOptions(props, state, 'baseline', toSingularity(props, state)),\n value: R.prop('highlight', state),\n },\n baseline: {\n id: 'baseline',\n isActive: hasFocus(props.type),\n onChange: R.pipe(onChangeFocusSelection, selection => onChange({ baseline: selection })),\n options: focusOptions(props, state, 'highlight', toSingularity(props, state)),\n value: R.prop('baseline', state),\n },\n width: {\n id: 'width',\n isActive: isChart(props.type),\n onChange: value =>\n onChange({\n fixedWidth: isNaturalInt(value) ? value : undefined,\n }),\n placeholder: R.when(R.complement(R.isNil), value => String(Math.floor(Number(value))))(\n state.responsiveWidth,\n ),\n value: R.prop('fixedWidth', state),\n },\n height: {\n id: 'height',\n isActive: isChart(props.type),\n onChange: value =>\n onChange({\n fixedHeight: isNaturalInt(value) ? value : undefined,\n }),\n placeholder: R.when(R.complement(R.isNil), value => String(Math.floor(Number(value))))(\n state.responsiveHeight,\n ),\n },\n freqStep: {\n id: 'freqStep',\n isActive: props.type === TIMELINE,\n onChange: value =>\n onChange({\n freqStep: isNaturalInt(value) ? String(value) : undefined,\n }),\n value: R.prop('freqStep', state),\n },\n title: {\n id: 'title',\n isActive: isChart(props.type),\n isDefault: R.isNil(state.title),\n onChange: value => onChange({ title: value }),\n value:\n R.isNil(state.title) || R.isEmpty(state.title)\n ? R.pathOr('', ['title', 'label'], props)\n : state.title,\n onReset: R.isNil(state.title) ? null : () => onChange({ title: null }),\n },\n subtitle: {\n id: 'subtitle',\n isActive: isChart(props.type),\n isDefault: R.isNil(state.subtitle),\n onChange: value => onChange({ subtitle: value }),\n value:\n R.isNil(state.subtitle) || R.isEmpty(state.subtitle)\n ? stringifySubtitle(props.subtitle || [])\n : state.subtitle,\n onReset: R.isNil(state.subtitle) ? null : () => onChange({ subtitle: null }),\n },\n source: {\n id: 'source',\n isActive: isChart(props.type),\n isDefault: R.isNil(state.sourceLabel),\n onChange: value => onChange({ sourceLabel: value }),\n value: getSourceLabel(props, state),\n onReset: R.isNil(state.sourceLabel) ? null : () => onChange({ sourceLabel: null }),\n },\n scatterDimension: {\n id: 'scatterDimension',\n isActive: isScatter(props.type),\n onChange: R.pipe(optionParser, onChangeScatterDim(props, state), onChange),\n options: chartDimensionOptions(props, isScatter),\n value: chartDimensionToOption('scatterDimension')(props, state),\n },\n scatterX: {\n id: 'scatterX',\n isActive: isScatter(props.type),\n onChange: R.pipe(\n optionParser,\n onChangeScatterVal(props, state, 'scatterX', 'scatterY'),\n onChange,\n ),\n options: scatterValueOptions(props, state),\n value: scatterStateValueToOption('scatterX', props, state),\n },\n scatterY: {\n id: 'scatterY',\n isActive: isScatter(props.type),\n onChange: R.pipe(\n optionParser,\n onChangeScatterVal(props, state, 'scatterY', 'scatterX'),\n onChange,\n ),\n options: scatterValueOptions(props, state),\n value: scatterStateValueToOption('scatterY', props, state),\n },\n symbolDimension: {\n id: 'symbolDimension',\n isActive: isSymbol(props.type),\n options: chartDimensionOptions(props, isSymbol),\n onChange: R.pipe(optionParser, onChangeSymbolDim(props), onChange),\n value: chartDimensionToOption('symbolDimension')(props, state),\n },\n stackedDimension: {\n id: 'stackedDimension',\n isActive: isStackedDimActive(props),\n options: chartDimensionOptions(props, isStacked),\n onChange: R.pipe(optionParser, onChangeStackedDimension(props, state), onChange),\n value: chartDimensionToOption('stackedDimension')(props, state),\n },\n stackedMode: {\n id: 'stackedMode',\n isActive: isStacked(props.type),\n options: stackedModeOptions,\n onChange: R.pipe(optionParser, onChangeStackedMode, onChange),\n value: R.prop('stackedMode', state),\n },\n logo: {\n id: 'logo',\n isActive: isChart(props.type),\n checked: !state.withLogo,\n onChange: () => onChange({ withLogo: !state.withLogo }),\n },\n copyright: {\n id: 'copyright',\n isActive: isChart(props.type),\n checked: !state.withCopyright,\n onChange: () => onChange({ withCopyright: !state.withCopyright }),\n },\n});\n","import * as R from 'ramda';\n\nconst NOT_DISPLAYED = 'NOT_DISPLAYED';\n\nexport const getIsHidden = annotations =>\n R.pipe(R.find(R.propEq(NOT_DISPLAYED, 'type')), R.complement(R.isNil))(annotations);\n\nexport const getFullName = R.identity;\n","import * as R from 'ramda';\nimport * as dateFns from 'date-fns';\nimport { fr, de, enUS as en, es, ar, it, nl, th } from 'date-fns/locale';\n\nconst isValidDate = period =>\n R.and(dateFns.isDate, date => R.not(R.equals(date.getTime(date), NaN)))(new Date(period));\n\nexport const dateWithoutTZ = date => dateFns.addMinutes(date, date.getTimezoneOffset());\n\nexport const getLocale = R.cond([\n [R.equals('fr'), R.always(fr)],\n [R.equals('de'), R.always(de)],\n [R.equals('es'), R.always(es)],\n [R.equals('ar'), R.always(ar)],\n [R.equals('it'), R.always(it)],\n [R.equals('nl'), R.always(nl)],\n [R.equals('th'), R.always(th)],\n [R.T, R.always(en)],\n]);\n\nconst formaterPeriod = (locale, format) => date =>\n dateFns.format(date, format, { locale: getLocale(locale) });\n\nexport const getReportedTimePeriodLabel =\n (freq, _format, locale) =>\n (reportYearStart, { id, start, reportedStart }) => {\n const year = dateFns.getYear(start);\n const reportStartDate = new Date(year, reportYearStart.month, reportYearStart.day);\n const isReportFirstDate = dateFns.isEqual(reportStartDate, new Date(year, 1, 1));\n if (isReportFirstDate || freq === 'D') {\n return R.isNil(_format) || freq !== 'M'\n ? id\n : dateFns.format(start, _format, { locale: getLocale(locale) });\n }\n const nextYear = year + 1;\n if (freq === 'A') {\n return `${year}/${nextYear}`;\n }\n if (freq === 'S') {\n const [semester] = R.match(/S\\d/, id);\n return `${year}/${nextYear}-${semester}`;\n }\n if (freq === 'Q') {\n const [quarter] = R.match(/Q\\d/, id);\n return `${year}/${nextYear}-${quarter}`;\n }\n if (freq === 'M') {\n const isFirstDayOfMonth = dateFns.isFirstDayOfMonth(reportedStart);\n if (isFirstDayOfMonth) {\n return R.isNil(_format)\n ? id\n : dateFns.format(reportedStart, _format, { locale: getLocale(locale) });\n }\n const [month] = R.match(/M[\\d]{2}/, id);\n return `${year}/${nextYear}-${month}`;\n }\n const [week] = R.match(/W[\\d]{2}/, id);\n return `${year}/${nextYear}-${week}`;\n };\n\nexport const getReportedTimePeriod = (reportYearStart, value, freq) => {\n let start = new Date(R.prop('start', value));\n let end = dateWithoutTZ(new Date(R.prop('end', value)));\n if (reportYearStart.month === '01' && reportYearStart.day === '01') {\n return { start, end };\n }\n start = dateFns.addMonths(start, reportYearStart.month - 1);\n start = dateFns.addDays(start, reportYearStart.day - 1);\n if (freq === 'A') {\n end = dateFns.addYears(start, 1);\n }\n if (freq === 'S') {\n end = dateFns.addMonths(start, 6);\n }\n if (freq === 'Q') {\n end = dateFns.addMonths(start, 3);\n }\n if (freq === 'M') {\n end = dateFns.addMonths(start, 6);\n }\n if (freq === 'W' || freq === 'B') {\n end = dateFns.addDays(start, 7);\n }\n if (freq === 'D') {\n end = dateFns.addDays(start, 1);\n }\n if (freq === 'H') {\n end = dateFns.addHours(start, 1);\n }\n if (freq === 'N') {\n end = dateFns.addMinutes(start, 1);\n }\n end = dateFns.subSeconds(end, 1);\n return { start, end };\n};\n\nexport const getReportedTimePeriodNote = (reportYearStart, start, end, freq) => {\n if (reportYearStart.month === '01' && reportYearStart.day === '01') {\n return null;\n }\n if (R.includes(freq, ['D', 'H', 'N'])) {\n return null;\n }\n const isFirstDayOfMonth = dateFns.isFirstDayOfMonth(start);\n if (freq === 'M' && isFirstDayOfMonth) {\n return null;\n }\n const formatedStart = dateFns.format(start, 'yyyy-MM-dd');\n const formatedEnd = dateFns.format(end, 'yyyy-MM-dd');\n return { value: { name: `${formatedStart} - ${formatedEnd}` } };\n};\n\nexport const getTimePeriodLabel = (locale, format = 'yyyy MMM') =>\n R.pipe(R.when(R.isNil, R.always('')), R.when(isValidDate, formaterPeriod(locale, format)));\n","export const SDMX_3_0_JSON_DATA_FORMAT = 'application/vnd.sdmx.data+json;version=2.0';\nexport const SDMX_3_0_CSV_DATA_FORMAT = 'application/vnd.sdmx.data+csv;version=2.0';\nexport const EMPTY_ATTACHMENT_LEVEL_CHAR = '~';\nexport const REPORTING_YEAR_START_DAY = 'REPORTING_YEAR_START_DAY';\nexport const REPYEARSTART = 'REPYEARSTART';\nexport const REJECTED_VALUE_IDS = ['_L', '_T', '_Z'];\n","import * as R from 'ramda';\nimport { getDimensionGroupAttributes } from '@dbmx/sdmx/data';\nimport { EMPTY_ATTACHMENT_LEVEL_CHAR } from './constants';\n\nconst dimensionValueDisplay = display => data => {\n if (display === 'code') {\n return R.prop('id', data);\n }\n const name = R.prop('name')(data);\n if (display === 'both') {\n return `${R.prop('id', data)}: ${name}`;\n }\n return name;\n};\n// options = { locale, display, dimensions = [], attributes = { [id]: { format, parent } } };\nexport const parseMetadataSeries = (metadataJson, options) => {\n const dimensionGroupAttributes = [...getDimensionGroupAttributes(metadataJson)];\n const metadataAttributes = R.pathOr(\n [],\n ['data', 'structures', 0, 'attributes', 'dimensionGroup'],\n metadataJson,\n );\n const metaAttrLength = R.length(metadataAttributes);\n\n if (!metaAttrLength) {\n return {};\n }\n\n const dimensions = R.pipe(\n R.pathOr([], ['data', 'structures', 0, 'dimensions']),\n ({ series = [], observation = [] }) => R.concat(series, observation),\n dims =>\n R.isEmpty(options.dimensions || [])\n ? dims\n : R.props(R.pluck('id', options.dimensions), R.indexBy(R.prop('id'), dims)),\n )(metadataJson);\n\n const { notDisplayedIds = {} } = options;\n\n const metadataSeries = R.reduce(\n (acc, entry) => {\n const { key, components } = entry;\n const evolvedKey = R.pipe(\n R.split(':'),\n R.addIndex(R.map)((vInd, dInd) => {\n if (R.isEmpty(vInd) || R.equals(EMPTY_ATTACHMENT_LEVEL_CHAR, vInd)) {\n return '';\n }\n const dim = R.nth(dInd, dimensions);\n const val = R.nth(Number(vInd), dim.values || []);\n const originalVal = R.find(R.propEq(val.id, 'id'))(\n R.propOr([], 'values', R.nth(dInd, options.dimensions)),\n );\n return R.propOr('', '__index', originalVal);\n }),\n R.join(':'),\n )(key);\n\n const attributes = R.pipe(\n R.reduce((_acc, attr) => {\n const isHidden = R.has(attr.id, notDisplayedIds);\n if ((!R.has(attr.id, components) && !attr.isPresentational) || isHidden) {\n return _acc;\n }\n const attrOptions = R.pathOr({}, ['attributes', attr.id], options);\n const id = attrOptions.id;\n const label = dimensionValueDisplay(options.display)({ ...attr, id });\n const _value = R.path([attr.id, 'value'], components);\n const value = R.is(Object, _value) ? R.prop(options.locale, _value) : _value;\n return R.append(\n {\n ...(R.isNil(value) ? {} : { value }),\n id: attr.id,\n label,\n handlerProps: R.omit(['id'], R.pathOr({}, ['attributes', attr.id], options)),\n },\n _acc,\n );\n }, []),\n attributes => {\n // missing parents in metadata response\n const groupedAttrs = R.groupBy(R.pathOr('#ROOT', ['handlerProps', 'parent']), attributes);\n const indexedAttrs = R.indexBy(R.prop('id'), attributes);\n return R.reduce(\n (acc, id) => {\n if (R.has(id, indexedAttrs) || id === '#ROOT') {\n return acc;\n }\n return R.append(\n {\n id,\n label: dimensionValueDisplay(options.display)({\n id,\n name: R.path(['attributes', id, 'name'], options),\n }),\n handlerProps: R.omit(['id'], R.pathOr({}, ['attributes', id], options)),\n },\n acc,\n );\n },\n attributes,\n R.keys(groupedAttrs),\n );\n },\n attributes => {\n const groupedAttrs = R.groupBy(R.pathOr('#ROOT', ['handlerProps', 'parent']), attributes);\n const makeTree = R.map(attr => {\n if (R.has(attr.id, groupedAttrs)) {\n const children = makeTree(R.prop(attr.id, groupedAttrs));\n return R.assoc('children', children, attr);\n }\n return attr;\n });\n\n return makeTree(R.propOr([], '#ROOT', groupedAttrs));\n },\n )(metadataAttributes);\n\n return R.assoc(evolvedKey, attributes, acc);\n },\n {},\n dimensionGroupAttributes,\n );\n\n return metadataSeries;\n};\n","import * as R from 'ramda';\n\nexport const getNotDisplayedCombinations = (annotation = {}) => {\n const splitTitle = R.split(',', annotation.title || '');\n return R.reduce(\n (acc, entry) => {\n const [dId, values = ''] = R.split('=', entry);\n const match = values.match(/\\((.*?)\\)/);\n if (!match) {\n return acc;\n }\n const content = R.nth(1, match);\n return R.isEmpty(content)\n ? acc\n : { ...acc, [dId]: R.reject(R.isEmpty, R.split('+', content)) };\n },\n {},\n splitTitle,\n );\n};\n\nconst getNotDisplayedValues = annot => {\n if (R.isNil(annot)) {\n return {};\n }\n const ids = R.split(',', annot.title || '');\n return R.reduce(\n (acc, entry) => {\n if (R.isEmpty(entry)) {\n return acc;\n }\n const parsed = R.split('=', entry);\n const dimensionId = parsed[0];\n if (R.length(parsed) === 1) {\n return R.assoc(dimensionId, dimensionId, acc);\n }\n const values = R.split('+', parsed[1]);\n if (R.length(values) === 1 && R.isEmpty(values[0])) {\n return R.assoc(dimensionId, dimensionId, acc);\n }\n return R.reduce(\n (_acc, val) => {\n let _val = val;\n if (R.isEmpty(val)) {\n return _acc;\n }\n if (R.test('/[()]/')) {\n _val = R.replace(/[()]/g, '')(val);\n }\n const key = R.isEmpty(_val) ? dimensionId : `${dimensionId}.${_val}`;\n return R.assoc(key, key, _acc);\n },\n acc,\n values,\n );\n },\n {},\n ids,\n );\n};\n\nexport const getNotDisplayedIds = annotations =>\n R.pipe(\n R.find(R.propEq('NOT_DISPLAYED', 'type')),\n R.converge(\n (hiddenValues, hiddenCombinations) => ({\n hiddenValues,\n hiddenCombinations,\n }),\n [getNotDisplayedValues, getNotDisplayedCombinations],\n ),\n )(annotations);\n","import * as R from 'ramda';\n\nexport const getHCodelistsRefs = annotations =>\n R.reduce(\n (acc, annotation) => {\n if (annotation.type !== 'HIER_CONTEXT') {\n return acc;\n }\n const references = annotation.text || annotation.title || '';\n const refs = R.pipe(\n R.split(','),\n R.reduce((acc2, ref) => {\n const match = ref.match(/([\\w@_.]+):([\\w@_.]+):([\\w@_.]+)\\(([\\d.]+)\\).([\\w@_.]+)$/);\n if (R.isNil(match)) {\n return acc2;\n }\n const [codelistId, agencyId, code, version, hierarchy] = R.tail(match);\n return R.assoc(codelistId, { agencyId, code, version, hierarchy, codelistId }, acc2);\n }, {}),\n )(references);\n return R.mergeRight(acc, refs);\n },\n {},\n annotations,\n );\n\nexport const getHCodelistsRefsInData = sdmxJson => {\n const annotations = R.pathOr([], ['data', 'structure', 'annotations'], sdmxJson);\n return getHCodelistsRefs(annotations);\n};\n","import * as R from 'ramda';\n\nexport const getMetadataCoordinates = sdmxJson => {\n const dimensions = R.pathOr([], ['data', 'structure', 'dimensions', 'observation'], sdmxJson);\n const annotations = R.pathOr([], ['data', 'structure', 'annotations'], sdmxJson);\n const metadataAvailKeys = R.pipe(\n R.pathOr([], ['data', 'dataSets', 0, 'dimensionGroupAttributes']),\n R.map(indexes => R.props(indexes, annotations)),\n R.filter(R.find(a => a && R.propEq('HAS_METADATA', 'type', a))),\n R.keys,\n )(sdmxJson);\n\n return R.map(key => {\n const indexes = R.split(':', key);\n return R.addIndex(R.reduce)(\n (acc, vIndex, dimIndex) => {\n if (R.isNil(vIndex) || R.isEmpty(vIndex)) {\n return acc;\n }\n const dim = R.nth(dimIndex, dimensions);\n if (R.isNil(dim) || R.prop('rejected', dim)) {\n return acc;\n }\n const val = R.path(['values', Number(vIndex)], dim);\n if (R.isNil(val)) {\n return acc;\n }\n return R.assoc(dim.id, val.id, acc);\n },\n {},\n indexes,\n );\n }, metadataAvailKeys);\n};\n","import * as R from 'ramda';\n\nexport const duplicateObs = (dims, observations) => {\n const obsValues = R.values(observations);\n if (R.length(dims) === 0) {\n return observations;\n }\n const duplicated = R.reduce(\n (obs, dim) => {\n const groupedObs = R.groupBy(o => R.prop(dim.id, o.indexedDimValIds), obs);\n const enhancedObs = R.addIndex(R.map)((value, index) => {\n const matchingObs = R.propOr([], value.id, groupedObs);\n\n return R.map(\n obs =>\n R.over(R.lensProp('orderedDimIndexes'), _indexes => {\n const indexes = R.isNil(_indexes)\n ? R.map(i => Number(i), obs.dimValuesIndexes)\n : _indexes;\n return R.set(R.lensIndex(dim.__index), index)(indexes);\n })(obs),\n matchingObs,\n );\n }, dim.values);\n return R.unnest(enhancedObs);\n },\n obsValues,\n dims,\n );\n const res = R.indexBy(R.pipe(R.prop('orderedDimIndexes'), R.join(':')), duplicated);\n return res;\n};\n","import * as R from 'ramda';\n\nconst uniq = R.pipe(\n R.reduce(\n ({ ids, list }, id) => {\n if (R.has(id, list)) {\n return { ids, list };\n }\n return { ids: R.append(id, ids), list: R.assoc(id, id, list) };\n },\n { ids: [], list: {} },\n ),\n R.prop('ids'),\n);\n\nexport const refinePartialHierarchy = (hier, indexed) => {\n const { intact, broken } = R.pipe(\n R.keys,\n R.reduce(\n ({ intact, broken }, key) => {\n const ids = R.filter(id => R.has(id, indexed), hier[key]);\n if (key === '#ROOT') {\n return { broken, intact: R.assoc(key, ids, intact) };\n }\n const splitKey = R.split('.', key);\n const filtered = R.takeLastWhile(id => R.has(id, indexed), splitKey);\n if (R.length(filtered) === R.length(splitKey)) {\n return { broken, intact: R.assoc(key, ids, intact) };\n }\n const refinedKey = R.isEmpty(filtered) ? '#ROOT' : R.join('.', filtered);\n return {\n intact,\n broken: R.over(\n R.lensProp(refinedKey),\n R.ifElse(R.isNil, R.always([ids]), R.append(ids)),\n )(broken),\n };\n },\n { intact: {}, broken: {} },\n ),\n )(hier);\n const intactIds = R.pipe(R.values, R.unnest)(intact);\n const refinedBroken = R.pipe(\n R.omit(intactIds),\n R.over(\n R.lensProp('#ROOT'),\n R.pipe(i => (R.isNil(i) ? [] : i), R.unnest, R.reject(R.flip(R.includes)(intactIds))),\n ),\n R.map(R.pipe(R.unnest, uniq)),\n )(broken);\n\n return {\n ...refinedBroken,\n ...intact,\n '#ROOT': R.concat(refinedBroken['#ROOT'], intact['#ROOT']),\n };\n};\n","import * as R from 'ramda';\n\nexport const hierarchiseDimensionWithNativeHierarchy = dimension => {\n const values = R.sortBy(R.prop('__indexPosition'), dimension.values || []);\n const indexed = R.indexBy(R.prop('id'), values);\n const grouped = R.groupBy(\n val => (val.parent && R.has(val.parent, indexed) ? val.parent : '#ROOT'),\n values,\n );\n\n let index = -1;\n const getChildren = ({ parentsIndexes, parentId }) => {\n const childs = R.propOr([], parentId, grouped);\n return R.reduce(\n (acc, child) => {\n index = index + 1;\n const refined = R.pipe(\n R.assoc('__indexPosition', index),\n R.assoc('parents', parentsIndexes),\n R.assoc('parent', R.isEmpty(parentsIndexes) ? undefined : parentId),\n )(child);\n const children = getChildren({\n parentsIndexes: R.propOr(false, 'isSelected', child)\n ? R.append(index, parentsIndexes)\n : parentsIndexes,\n parentId: child.id,\n });\n return R.concat(acc, R.prepend(refined, children));\n },\n [],\n childs,\n );\n };\n\n return R.set(\n R.lensProp('values'),\n getChildren({ parentsIndexes: [], parentId: '#ROOT' }),\n )(dimension);\n};\n","import * as R from 'ramda';\n\nconst parseTexts = texts =>\n R.reduce(\n (acc, text) => {\n const splitted = R.split(':', text);\n if (R.length(splitted) !== 2) {\n return acc;\n }\n const [id, name] = splitted;\n return R.assoc(id, name, acc);\n },\n {},\n texts,\n );\n\nexport const parseCombinationDefinition = locale => (title, texts) =>\n R.useWith(\n (titles, texts) =>\n R.reduce(\n (acc, title) => {\n const split = R.split(':', title);\n if (R.length(split) !== 2) {\n return acc;\n }\n const [id, codes] = split;\n if (R.isEmpty(codes)) {\n return acc;\n }\n return R.append(\n {\n id,\n concepts: R.split(',', codes),\n name: R.hasPath([locale, id], texts) ? R.path([locale, id], texts) : `[${id}]`,\n },\n acc,\n );\n },\n [],\n titles,\n ),\n [R.split(';'), R.map(R.pipe(R.split(';'), parseTexts))],\n )(title, texts);\n\nexport const getCombinationDefinitions = (annotations, locale) => {\n const annotation = R.find(annot => annot.type === 'COMBINED_CONCEPTS', annotations);\n if (R.isNil(annotation)) {\n return [];\n }\n const title = R.propOr('', 'title', annotation);\n const texts = R.propOr({}, 'texts', annotation);\n\n return parseCombinationDefinition(locale)(title, texts);\n};\n","import * as R from 'ramda';\nimport * as dateFns from 'date-fns';\nimport { getLocale } from '../../rules/src/date';\n\nconst computeDisplayFreq = (start, duration) => {\n const startMinute = dateFns.startOfMinute(start);\n const startHour = dateFns.startOfHour(start);\n const startDay = dateFns.startOfDay(start);\n if (!dateFns.isEqual(start, startMinute) || duration === 'S') {\n return 'S';\n } else if (\n !dateFns.isEqual(start, startHour) ||\n !dateFns.isEqual(start, startDay) ||\n duration === 'H' ||\n duration === 'm'\n ) {\n return 'm';\n } else if (dateFns.getDate(start) !== 1 || duration === 'D') {\n return 'D';\n } else if (dateFns.getMonth(start) !== 0 || duration === 'M') {\n return 'M';\n }\n return 'Y';\n};\n\nconst getAdder = duration => {\n if (duration === 'S') return dateFns.addSeconds;\n if (duration === 'm') return dateFns.addMinutes;\n if (duration === 'H') return dateFns.addHours;\n if (duration === 'D') return dateFns.addDays;\n if (duration === 'M') return dateFns.addMonths;\n return dateFns.addYears;\n};\n\nconst getFormat = freqDisplay => {\n if (freqDisplay === 'Y') return 'yyyy';\n if (freqDisplay === 'D') return 'yyyy-MM-dd';\n if (freqDisplay === 'H' || freqDisplay === 'm') {\n return 'HH:mm';\n }\n if (freqDisplay === 'S') {\n return 'HH:mm:ss';\n }\n return 'yyyy-MMM';\n};\n\nconst getEndDate = (start, mult, duration) => {\n const adder = getAdder(duration);\n const endDate = adder(start, Number(mult));\n return dateFns.subSeconds(endDate, 1);\n};\n\nconst computeName = (start, end, freqDisplay, locale, format) => {\n const opts = { locale: getLocale(locale) };\n const isSameDay = dateFns.isSameDay(start, end);\n const isSameYear = dateFns.isSameYear(start, end);\n if (freqDisplay === 'H' || freqDisplay === 'm' || freqDisplay === 'S') {\n const dayFormat = getFormat('D');\n if (isSameDay)\n return `${dateFns.format(start, dayFormat, opts)} ${dateFns.format(start, format, opts)} - ${dateFns.format(end, format, opts)}`;\n return (\n `${dateFns.format(start, dayFormat, opts)} ${dateFns.format(start, format, opts)} - ` +\n `${dateFns.format(end, dayFormat, opts)} ${dateFns.format(end, format, opts)}`\n );\n }\n if (freqDisplay !== 'M') {\n return `${dateFns.format(start, format, opts)} - ${dateFns.format(end, format, opts)}`;\n }\n\n if (isSameYear && !R.includes('-', format)) {\n const yearFormatMatch = R.match(/([y]+)/, format);\n const monthFormatMatch = R.match(/([M]+|Mo)/, format);\n const yearFormat = R.length(yearFormatMatch) >= 2 ? R.nth(1, yearFormatMatch) : null;\n const monthFormat = R.length(monthFormatMatch) >= 2 ? R.nth(1, monthFormatMatch) : null;\n const formattedYear = yearFormat ? dateFns.format(start, yearFormat, opts) : null;\n const formattedMonths = monthFormat\n ? `${dateFns.format(start, monthFormat, opts)} - ${dateFns.format(end, monthFormat, opts)}`\n : null;\n if (monthFormat) {\n return R.pipe(\n format => (yearFormat ? R.replace(yearFormat, formattedYear, format) : format),\n R.replace(monthFormat, formattedMonths),\n )(format);\n }\n }\n return `${dateFns.format(start, format, opts)} - ${dateFns.format(end, format, opts)}`;\n};\n\nconst getStartDate = value =>\n typeof value === 'string' ? dateFns.parseISO(value) : new Date(value);\nconst dateWithTZ = date => dateFns.addMinutes(date, -date.getTimezoneOffset());\n\nexport const refineTimePeriod = (timePeriod, { locale, monthlyFormat = 'yyyy-MMM' }) => {\n const { id } = timePeriod;\n const split = R.split('/', id);\n if (R.length(split) !== 2) {\n const start = getStartDate(R.prop('start', timePeriod));\n const end = getStartDate(R.prop('end', timePeriod));\n return {\n ...timePeriod,\n start: dateWithTZ(start).toISOString(),\n end: dateWithTZ(end).toISOString(),\n };\n }\n const [start, range] = split;\n const startDate = getStartDate(start);\n const match = R.match(/^P(T?)(\\d+)([YMDHS])$/, range);\n if (R.isEmpty(match) || !dateFns.isValid(startDate)) {\n return timePeriod;\n }\n const [timeIndicator, mult, _duration] = R.tail(match);\n const duration = !R.isEmpty(timeIndicator) && _duration === 'M' ? 'm' : _duration;\n const endDate = getEndDate(startDate, mult, duration);\n const freqDisplay = computeDisplayFreq(startDate, duration);\n const format = freqDisplay === 'M' ? monthlyFormat : getFormat(freqDisplay);\n const name = computeName(startDate, endDate, freqDisplay, locale, format);\n\n return {\n ...timePeriod,\n id,\n name,\n start: dateWithTZ(startDate).toISOString(),\n end: dateWithTZ(endDate).toISOString(),\n };\n};\n","import * as R from 'ramda';\nimport getTime from 'date-fns/getTime';\nimport { getIsHidden } from './sdmx-data';\nimport {\n getReportedTimePeriodLabel,\n getReportedTimePeriodNote,\n getReportedTimePeriod,\n} from './date';\nimport { refineTimePeriod } from '../../rules2/src/refineTimePeriod';\n\nexport const getOrder = (annotations = []) => {\n const orderAnnotation = R.find(R.propEq('ORDER', 'type'), annotations) || {};\n const order = orderAnnotation.text || '-1';\n return Number(order);\n};\n\nconst isNonCoded = R.both(R.has('value'), R.pipe(R.has('id'), R.not));\n\nconst getId = (value, fallbackId) => {\n const valueId = R.prop('id', value);\n if (valueId) return valueId;\n if (isNonCoded(value)) return R.prop('value', value);\n // Fallback (value has no id but is not a non-coded)\n return fallbackId;\n};\n\nconst getName =\n ({ isTimeDimension, options, locale, start, reportYearStart }) =>\n value => {\n if (!isTimeDimension) return R.prop('name')(value);\n return getReportedTimePeriodLabel(\n options.frequency,\n options.timeFormat,\n locale,\n )(reportYearStart, {\n id: value.id,\n reportedStart: start,\n start: new Date(value.start),\n });\n };\n\nexport const getValuesEnhanced = ({\n locale = '',\n annotations = [],\n isTimeDimension = false,\n parent = '',\n reportYearStart,\n hiddenIds = {},\n options = {},\n selection = [],\n constraints,\n}) => {\n const selectionSet = new Set(selection);\n const isConstrained = id => R.isNil(constraints) || isTimeDimension || constraints.has(id);\n return R.pipe(\n R.addIndex(R.map)((value, __index) => {\n const id = getId(value, `${parent}-${__index}`);\n\n const valueAnnotations = R.pipe(\n R.propOr([], 'annotations'),\n R.flip(R.props)(annotations),\n )(value);\n\n const isHidden = R.has(`${parent}.${id}`, hiddenIds) || getIsHidden(valueAnnotations);\n\n const { start, notes } = isTimeDimension\n ? getTimePeriodAttributes({ reportYearStart, options })(value)\n : { notes: [] };\n\n const __indexPosition = getOrder(valueAnnotations);\n const isSelected =\n selectionSet.has(value.id) ||\n R.isNil(selection) ||\n R.isEmpty(selection) ||\n R.isEmpty(R.head(selection));\n let res = {\n // names is explicitely skipped because of metadata \"standard\"\n // not completely aligned with NSI \"standard\"\n // value is explicitely skipped (non-coded) into id\n ...R.omit(['names', 'value'], value),\n id,\n isSelected,\n empty: !isSelected,\n display: !isHidden,\n start: start ? start.toISOString() : null,\n flags: notes,\n __indexPosition,\n __index,\n isNonCoded: isNonCoded(value),\n parent: isConstrained(value.parent) ? value.parent : undefined,\n parents: R.filter(isConstrained, value.parents || []),\n };\n if (!isNonCoded(value)) {\n res = R.assoc(\n 'name',\n getName({ isTimeDimension, options, locale, start, reportYearStart })(value),\n res,\n );\n }\n if (isTimeDimension) {\n res = refineTimePeriod(res, {\n locale,\n monthlyFormat: options.timeFormat,\n });\n }\n return res;\n }),\n // __indexPosition is used for pre-sorting\n R.sortWith(isTimeDimension ? timeDimensionSorts : defaultSorts),\n // __indexPosition is reset after pre-sorting\n R.addIndex(R.map)((val, index) => R.assoc('__indexPosition', index, val)),\n // values are re-sorted by __index after __indexPosition settlement\n R.sortBy(R.prop('__index')),\n );\n};\n\nconst getDateForSort = key => val => getTime(new Date(R.prop(key, val)));\nconst byStartDate = R.ascend(getDateForSort('start'));\nconst byEndDate = R.descend(getDateForSort('end'));\nconst timeDimensionSorts = [byStartDate, byEndDate];\nconst byIndexPosition = R.ascend(R.prop('__indexPosition'));\nconst byOrder = R.ascend(R.propOr(-1, 'order'));\nconst defaultSorts = [byIndexPosition, byOrder];\n\nconst getTimePeriodAttributes =\n ({ reportYearStart, options }) =>\n value => {\n const reported = getReportedTimePeriod(reportYearStart, value, options.frequency);\n const start = reported.start;\n const end = reported.end;\n const reportTimeNote = getReportedTimePeriodNote(\n reportYearStart,\n start,\n end,\n options.frequency,\n options.isRtl,\n );\n const notes = R.isNil(reportTimeNote) ? [] : R.append(reportTimeNote, []);\n return { start, notes };\n };\n","import * as R from 'ramda';\nimport { getIsHidden } from '../../rules/src/sdmx-data';\nimport { getValuesEnhanced } from '../../rules/src/get-values-enhanced';\n\nexport const getAttributes = ({ attributes, annotations, options }) => {\n const { hiddenCombinations = {}, hiddenValues = {}, locale = '', ...restOptions } = options;\n\n const datasetAttributes = R.propOr([], 'dataSet', attributes);\n const obsAttributes = R.propOr([], 'observation', attributes);\n\n return R.pipe(\n R.concat,\n R.addIndex(R.map)((attr, index) => {\n const attrAnnotations = R.props(attr.annotations || [], annotations);\n return {\n ...attr,\n __index: index,\n display: !R.has(attr.id, hiddenValues) && !getIsHidden(attrAnnotations),\n values: getValuesEnhanced({\n locale,\n annotations,\n parent: attr.id,\n hiddenIds: hiddenValues,\n options: restOptions,\n })(attr.values || []),\n };\n }),\n )(obsAttributes, datasetAttributes);\n};\n","import * as R from 'ramda';\nimport { isTimePeriodDimension } from '../../rules/src/dimension-utils';\nimport { getValuesEnhanced } from '../../rules/src/get-values-enhanced';\nimport { getIsHidden } from '../../rules/src/sdmx-data';\n\nconst TIME_PERIOD_ID = 'TIME_PERIOD';\n\nexport const refineDimensions = ({ annotations = [], dimensions = [], options = {} }) => {\n const {\n dataquery = '',\n hiddenCombinations = {},\n hiddenValues = {},\n locale = '',\n reportYearStart,\n constraints = {},\n ...restOptions\n } = options;\n const selectionIds = R.pipe(R.split('.'), R.map(R.split('+')))(dataquery);\n\n const getIsAllDimHidden = ({ id, values }) => {\n if (!R.has(id, hiddenCombinations)) {\n return false;\n }\n const valuesIds = R.pluck('id', values);\n return R.isEmpty(R.difference(valuesIds, hiddenCombinations[id]));\n };\n\n return R.addIndex(R.map)((dim, index) => {\n const selection = R.nth(index, selectionIds);\n const isEmptySelection =\n R.isNil(selection) || R.isEmpty(selection) || R.isEmpty(R.head(selection));\n const isTimeDimension = isTimePeriodDimension(dim);\n const dimAnnotations = R.props(dim.annotations || [], annotations);\n const dimConstraints = R.prop(dim.id, constraints);\n const values = getValuesEnhanced({\n annotations,\n hiddenIds: hiddenValues,\n isTimeDimension,\n locale,\n options: restOptions,\n parent: dim.id,\n reportYearStart,\n selection,\n constraints: dimConstraints,\n })(dim.values || []);\n\n const size = R.length(values);\n const isAllDimHidden = getIsAllDimHidden({ id: dim.id, values });\n const isHidden = isAllDimHidden || R.has(dim.id, hiddenValues) || getIsHidden(dimAnnotations);\n return {\n ...dim,\n display: !isHidden,\n header: size === 1 || (size > 1 && R.length(selection) === 1 && !isEmptySelection),\n __index: index,\n rejected: isAllDimHidden || !size,\n role: isTimeDimension ? TIME_PERIOD_ID : R.head(dim.roles || []),\n values,\n };\n }, dimensions);\n};\n","import * as R from 'ramda';\nimport { REPORTING_YEAR_START_DAY, REPYEARSTART } from './constants';\n\nexport const parseAttributes = (attributes, dimensions, customAttributes) => {\n const indexedDimensions = R.indexBy(R.prop('id'), dimensions);\n return R.addIndex(R.map)((attr, index) => {\n let res = R.assoc('index', index, attr);\n const displayableValuesCount = R.pipe(R.filter(R.propOr(true, 'display')), R.length)(attr);\n if (\n R.isEmpty(attr.values || []) ||\n !R.propOr(true, 'display', attr) ||\n displayableValuesCount < 1 ||\n attr.id === REPORTING_YEAR_START_DAY ||\n attr.id === REPYEARSTART\n ) {\n return R.assoc('display', false, res);\n }\n if (R.propEq(customAttributes.prefscale, 'id', attr)) {\n return R.assoc('prefscale', true, res);\n }\n if (R.propEq(customAttributes.decimals, 'id', attr)) {\n return R.assoc('decimals', true, res);\n }\n if (\n R.hasPath(['relationship', 'none'], attr) ||\n R.hasPath(['relationship', 'dataflow'], attr)\n ) {\n return { ...res, header: true, relationship: [] };\n }\n if (\n R.hasPath(['relationship', 'primaryMeasure'], attr) ||\n R.hasPath(['relationship', 'observation'], attr)\n ) {\n return { ...res, series: true, relationship: [] };\n }\n const seriesDimensions = R.pipe(\n R.pathOr([], ['relationship', 'dimensions']),\n R.filter(id => {\n const dimension = R.prop(id, indexedDimensions);\n return !dimension.header && R.length(dimension.values || []) > 1 && !dimension.rejected;\n }),\n )(attr);\n if (R.length(seriesDimensions) > 0) {\n return { ...res, series: true, relationship: seriesDimensions };\n }\n return { ...res, header: true, relationship: R.prop('dimensions', attr.relationship || []) };\n }, attributes);\n};\n","import * as R from 'ramda';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nconst getDisplayableValues = values =>\n R.filter(\n val => !R.includes(R.prop('id', val), REJECTED_VALUE_IDS) && R.propOr(true, 'display', val),\n values,\n );\n\n// invalid concepts:\n// - empty/null/undefined/!array values (so far)\nconst hasInvalidValues = R.pipe(\n R.prop('values'),\n R.anyPass([R.isNil, R.complement(R.is(Array)), R.isEmpty]),\n);\nconst isConceptInvalid = R.anyPass([hasInvalidValues /* add more... */]);\nconst filterValidConcepts = R.reject(isConceptInvalid);\n// concepts is an array of ids... (misnamed!)\nconst rejectInvalidConceptIds =\n (concepts = []) =>\n (combinations = []) => {\n const validConceptIds = R.pluck('id', filterValidConcepts(concepts));\n return R.reduce(\n (acc, comb) => {\n const refinedConcepts = R.intersection(validConceptIds, comb.concepts);\n if (R.length(refinedConcepts) < 1) {\n return acc;\n }\n return R.append({ ...comb, concepts: refinedConcepts }, acc);\n },\n [],\n combinations,\n );\n };\n\nexport const parseCombinations = (combinations, parsedAttributes, dimensions) => {\n const concepts = R.concat(dimensions, parsedAttributes);\n\n const indexedDimensions = R.indexBy(R.prop('id'), dimensions);\n const indexedAttributes = R.indexBy(R.prop('id'), parsedAttributes);\n\n return R.pipe(\n rejectInvalidConceptIds(concepts),\n R.reduce((acc, comb) => {\n let relationship = [];\n let ids = {};\n let displayable_values_count = 0;\n const seriesConcepts = R.filter(concept => {\n if (R.has(concept, ids)) {\n return false;\n }\n if (R.has(concept, indexedDimensions)) {\n const dimension = R.prop(concept, indexedDimensions);\n relationship = !dimension.header ? R.append(concept, relationship) : relationship;\n ids = { ...ids, [concept]: concept };\n displayable_values_count += R.length(dimension.values || []);\n return !dimension.header;\n } else if (!R.has(concept, indexedAttributes)) {\n return false;\n }\n const attribute = R.prop(concept, indexedAttributes);\n const displayableValues = getDisplayableValues(attribute.values || []);\n const isDisplayable =\n R.length(displayableValues) !== 0 && R.propOr(true, 'display', attribute);\n relationship =\n attribute.series && isDisplayable\n ? R.pipe(\n R.reject(id => R.has(id, ids)),\n R.concat(relationship),\n )(attribute.relationship)\n : relationship;\n ids =\n attribute.series && isDisplayable\n ? { ...ids, ...R.indexBy(R.identity, attribute.relationship) }\n : ids;\n displayable_values_count = isDisplayable\n ? displayable_values_count + R.length(displayableValues)\n : displayable_values_count;\n return attribute.series && isDisplayable;\n }, comb.concepts);\n if (R.isEmpty(seriesConcepts)) {\n return R.append({ ...comb, header: true, display: displayable_values_count > 0 }, acc);\n }\n return R.append(\n {\n ...comb,\n series: true,\n relationship,\n display: displayable_values_count > 0,\n },\n acc,\n );\n }, []),\n )(combinations);\n};\n","import * as R from 'ramda';\n\nexport const refineAttributes = (parsedAttributes, seriesCombinations) => {\n const indexedRelationships = R.reduce(\n (acc, comb) =>\n R.reduce((_acc, concept) => R.assoc(concept, comb.relationship, _acc), acc, comb.concepts),\n {},\n seriesCombinations,\n );\n return R.map(attr => {\n if (R.has(attr.id, indexedRelationships)) {\n return {\n ...attr,\n series: true,\n relationship: R.prop(attr.id, indexedRelationships),\n combined: true,\n };\n }\n return attr;\n }, parsedAttributes);\n};\n","import * as R from 'ramda';\nimport numeral from 'numeral';\n\nconst isValidNumber = R.both(R.is(Number), R.complement(R.equals(NaN)));\nconst parseValidNumber = R.pipe(\n v => (R.isNil(v) ? null : Number(v)),\n v => (isNaN(v) ? null : v),\n);\n\nconst getFormatAttributesValues = (observation, formatAttributesIndexes, attributes) =>\n R.mapObjIndexed(attributeIndex => {\n let valueIndex;\n const relationship = R.pipe(R.nth(attributeIndex), R.propOr({}, 'relationship'))(attributes);\n //if (!R.isNil(attributeIndex) && attributeIndex >= R.length(R.propOr([], 'attrValuesIndexes', observation))) {\n if (R.has('none', relationship) || R.has('dataflow', relationship)) {\n valueIndex = 0;\n } else {\n valueIndex = R.pipe(\n R.propOr([], 'attrValuesIndexes'),\n R.nth(attributeIndex),\n parseValidNumber,\n )(observation);\n }\n\n return R.pipe(\n R.path([attributeIndex, 'values', valueIndex, 'id']),\n parseValidNumber,\n )(attributes);\n }, formatAttributesIndexes);\n\nexport const formatValue = (observation, formatAttributesIndexes, attributes) => {\n const value = R.prop('value', observation);\n if (R.is(Boolean, value)) {\n return value;\n }\n if (R.is(String, value)) {\n const monthMatch = value.match(/^--([\\d]{2})$/);\n if (R.is(Array, monthMatch)) {\n return R.nth(1, monthMatch);\n }\n const monthDayMatch = value.match(/^--([\\d]{2}-[\\d]{2})$/);\n if (R.is(Array, monthDayMatch)) {\n return R.nth(1, monthDayMatch);\n }\n const dayMatch = value.match(/^---([\\d]{2})$/);\n if (R.is(Array, dayMatch)) {\n return R.nth(1, dayMatch);\n }\n return value;\n }\n\n const { prefscale, decimals } = getFormatAttributesValues(\n observation,\n formatAttributesIndexes,\n attributes,\n );\n\n const formatScale = R.when(R.always(isValidNumber(prefscale)), value =>\n numeral(value)\n .multiply(Math.pow(10, -1 * Number(prefscale)))\n .value(),\n );\n const _decimals = !decimals ? 2 : decimals;\n\n const formatSeparator = value => numeral(value).format(`0,0.[0000000]`);\n const formatDecimals = R.ifElse(\n R.always(isValidNumber(decimals)),\n v => {\n const num = Number(v);\n const isTiny = Math.abs(num) < Math.pow(10, -_decimals);\n const displayNum = isTiny ? 0 : num;\n const decimalFormat = R.ifElse(\n R.equals(0),\n R.always('0,0'),\n d => `0,0.${R.join('', R.times(R.always('0'), d))}`,\n )(decimals);\n\n const res = numeral(displayNum).format(decimalFormat);\n return res;\n },\n formatSeparator,\n );\n return R.ifElse(\n isValidNumber,\n R.pipe(formatScale, formatDecimals, res => (res === 'NaN' ? String(value) : res)),\n R.always('..'),\n )(observation.value);\n};\n","import * as R from 'ramda';\nimport { formatValue } from '../../rules/src/preparators/formatValue';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nconst parseAttributesValues = (obs, attributes, indexedDimensions) => {\n const { attrValuesIndexes, dimValuesIndexes } = obs;\n return R.addIndex(R.reduce)(\n (acc, valueIndex, attrIndex) => {\n const attribute = R.nth(attrIndex, attributes);\n if (R.isNil(attribute) || !R.prop('series', attribute)) {\n return acc;\n }\n const _value = R.nth(valueIndex, attribute.values || []);\n let value = R.isNil(_value)\n ? _value\n : R.over(\n R.lensProp('display'),\n (display = true) => display && !R.includes(_value.id, REJECTED_VALUE_IDS),\n )(_value);\n\n const isAttrNotDisplayed = !(attribute?.display ?? true);\n const isValueNotDisplayed = !(value?.display ?? true);\n const isValueNull = value?.id == null; // 0 is not null\n if (isAttrNotDisplayed || isValueNotDisplayed || isValueNull) value = null;\n\n const relationship = R.propOr([], 'relationship', attribute);\n let coordinates = {};\n const serieKey = R.pipe(\n dims => (R.isEmpty(relationship) ? R.values(dims) : R.props(relationship, dims)),\n R.map(dim => {\n const valueIndex = R.nth(dim.__index, dimValuesIndexes);\n const valueId = R.path(['values', valueIndex, 'id'], dim);\n coordinates = R.assoc(dim.id, valueId, coordinates);\n return `${dim.id}=${valueId}`;\n }),\n R.ifElse(R.isEmpty, R.always(null), R.join(':')),\n )(indexedDimensions);\n\n return R.assoc(\n attribute.id,\n {\n ...R.pick(['id', 'name', 'relationship', 'display', 'combined'], attribute),\n value,\n serieKey,\n coordinates,\n isObs: R.isEmpty(relationship),\n },\n acc,\n );\n },\n {},\n attrValuesIndexes,\n );\n};\n\nconst getFormatAttributesIndexes = (attributes, customAttributes) =>\n R.addIndex(R.reduce)(\n (acc, attribute, index) => {\n if (R.equals(attribute.id, customAttributes.decimals)) {\n return { ...acc, decimals: index };\n }\n if (R.equals(attribute.id, customAttributes.prefscale)) {\n return { ...acc, prefscale: index };\n }\n return acc;\n },\n { prefscale: null, decimals: null },\n attributes,\n );\n\nexport const enhanceObservations = (\n dimensions = [],\n observations = {},\n attributes = [],\n options = {},\n) => {\n const formatAttributesIndexes = getFormatAttributesIndexes(\n attributes,\n R.propOr({}, 'customAttributes', options),\n );\n const indexedDimensions = R.indexBy(R.prop('id'), dimensions);\n\n return R.map(observation => {\n const { dimValuesIndexes } = observation;\n\n const indexedDimValIds = R.addIndex(R.reduce)(\n (acc, dimension, dimensionIndex) => {\n const id = dimension.id;\n const valueIndex = R.nth(dimensionIndex, dimValuesIndexes);\n const valueId = R.path(['values', Number(valueIndex), 'id'], dimension);\n return R.assoc(id, valueId, acc);\n },\n {},\n dimensions,\n );\n\n return {\n ...observation,\n attributes: parseAttributesValues(observation, attributes, indexedDimensions),\n formattedValue: formatValue(observation, formatAttributesIndexes, attributes),\n indexedDimValIds,\n };\n }, observations);\n};\n","import * as R from 'ramda';\n\nexport const getAttributesSeries = observations =>\n R.pipe(\n R.values,\n R.reduce(\n (acc, { attributes }) => {\n let res = acc.res;\n let rejected = acc.rejected;\n R.forEachObjIndexed(attribute => {\n if (!R.isNil(attribute.serieKey) && !attribute.isObs) {\n if (R.isNil(attribute.value)) {\n res = R.dissocPath([attribute.serieKey, attribute.id], res);\n rejected = R.assocPath([attribute.serieKey, attribute.id], true, rejected);\n }\n if (R.path([attribute.serieKey, attribute.id], rejected)) {\n return;\n }\n const valueInRes = R.path([attribute.serieKey, attribute.id, 'value', 'id'], res);\n if (!R.isNil(valueInRes) && valueInRes !== R.path(['value', 'id'], attribute)) {\n res = R.dissocPath([attribute.serieKey, attribute.id], res);\n rejected = R.assocPath([attribute.serieKey, attribute.id], true, rejected);\n } else {\n res = R.assocPath([attribute.serieKey, attribute.id], attribute, res);\n }\n }\n }, attributes);\n return { res, rejected };\n },\n { res: {}, rejected: {} },\n ),\n R.prop('res'),\n )(observations);\n","import * as R from 'ramda';\nimport { REJECTED_VALUE_IDS } from '../constants';\n\nexport const getFlagsAndNotes = (attributesValues, customAttributes) => {\n const flagsIds = R.propOr([], 'flags', customAttributes);\n const notesIds = R.propOr([], 'notes', customAttributes);\n\n return R.addIndex(R.reduce)(\n (acc, id, index) => {\n if (!R.has(id, attributesValues)) {\n return acc;\n }\n const attr = R.pick(['id', 'name', 'value', 'display'], R.prop(id, attributesValues));\n if (\n R.isNil(attr.value) ||\n !R.pathOr(true, ['value', 'display'], attr) ||\n !R.propOr(true, 'display', attr) ||\n R.includes(R.path(['value', 'id'], attr), REJECTED_VALUE_IDS)\n ) {\n return acc;\n }\n return R.append(\n index < flagsIds.length ? R.assoc('code', R.path(['value', 'id'], attr), attr) : attr,\n acc,\n );\n },\n [],\n R.concat(flagsIds, notesIds),\n );\n};\n","import * as R from 'ramda';\nimport { getFlagsAndNotes } from './table/getFlagsAndNotes';\n\nexport const getManyValuesDimensions = (\n dimensions,\n attributesSeries,\n customAttributes,\n combinations,\n) => {\n const combConceptsIds = R.pipe(R.pluck('concepts'), R.unnest)(combinations);\n return R.reduce(\n (acc, dim) => {\n if (dim.header || dim.rejected) {\n return acc;\n }\n const enhancedValues = R.map(val => {\n const attrSeries = R.propOr({}, `${dim.id}=${val.id}`, attributesSeries);\n if (R.isEmpty(attrSeries)) {\n return val;\n }\n const flags = getFlagsAndNotes(attrSeries, customAttributes);\n const hasAdvancedAttributes = R.pipe(\n R.omit(\n R.unnest([customAttributes.flags || [], customAttributes.notes || [], combConceptsIds]),\n ),\n R.complement(R.isEmpty),\n )(attrSeries);\n return { ...val, flags, hasAdvancedAttributes };\n }, dim.values);\n return R.append(R.assoc('values', enhancedValues, dim), acc);\n },\n [],\n dimensions,\n );\n};\n","import * as R from 'ramda';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nexport const getOneValueDimensions = (dimensions, attributes) => {\n const indexedRelevantAttributes = R.reduce(\n (acc, attr) => {\n if (\n !attr.header ||\n !R.propOr(true, 'display', attr) ||\n R.length(attr.relationship || []) !== 1\n ) {\n return acc;\n }\n const value = R.path(['values', 0], attr);\n if (\n R.isNil(value) ||\n !R.propOr(true, 'display', value) ||\n R.includes(R.prop('id', value), REJECTED_VALUE_IDS)\n ) {\n return acc;\n }\n const dim = R.head(attr.relationship);\n return R.over(R.lensProp(dim), (values = {}) => ({\n ...values,\n [attr.id]: { ...attr, value },\n }))(acc);\n },\n {},\n attributes,\n );\n return R.reduce(\n (acc, dim) => {\n if (!dim.header) {\n return acc;\n }\n const attrValues = R.propOr({}, dim.id, indexedRelevantAttributes);\n return R.append({ ...dim, attrValues }, acc);\n },\n [],\n dimensions,\n );\n};\n","import * as R from 'ramda';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nexport const getDataflowAttributes = (attributes, combinations) => {\n const combinationsConceptsIds = R.pipe(R.pluck('concepts'), R.unnest)(combinations);\n return R.reduce(\n (acc, attribute) => {\n if (\n !R.prop('header', attribute) ||\n !R.isEmpty(attribute.relationship) ||\n R.includes(attribute.id, combinationsConceptsIds)\n ) {\n return acc;\n }\n const value = R.head(attribute.values);\n if (\n !R.propOr(true, 'display', attribute) ||\n R.isNil(value) ||\n !R.propOr(true, 'display', value) ||\n R.includes(R.prop('id', value), REJECTED_VALUE_IDS)\n ) {\n return acc;\n }\n return R.assoc(attribute.id, { ...R.pick(['id', 'name'], attribute), value }, acc);\n },\n {},\n attributes,\n );\n};\n","import * as R from 'ramda';\nimport { dimensionValueDisplay } from '../../rules/src/dimension-utils';\nimport { getFlagsAndNotes } from './table/getFlagsAndNotes';\n\nexport const getHeaderTitle = (dataflow, attributes, display, customAttributes) => ({\n label: dimensionValueDisplay(display)(dataflow),\n flags: R.pipe(\n getFlagsAndNotes,\n R.map(entry => ({\n code: entry.code,\n header: `${dimensionValueDisplay(display)(entry)}:`,\n label: dimensionValueDisplay(display)(entry.value),\n })),\n )(attributes, customAttributes),\n});\n","import * as R from 'ramda';\nimport { getFlagsAndNotes } from './table/getFlagsAndNotes';\nimport { dimensionValueDisplay } from '../../rules/src/dimension-utils';\n\nexport const getHeaderSubtitle = (\n dimensions,\n combinations,\n customAttributes,\n display,\n microdataDimension,\n) => {\n const combinationsConepts = R.pipe(R.pluck('concepts'), R.unnest)(combinations);\n const DEFAULT_REJECTED_SUBTITLE_IDS = ['_L', '_T', '_Z'];\n\n return R.reduce(\n (acc, dim) => {\n if (\n !R.propOr(true, 'display', dim) ||\n R.propEq(microdataDimension, 'id', dim) ||\n R.includes(dim.id, combinationsConepts)\n ) {\n return acc;\n }\n const value = R.path(['values', 0], dim);\n if (\n !R.propOr(true, 'display', value) ||\n R.includes(value.id, DEFAULT_REJECTED_SUBTITLE_IDS)\n ) {\n return acc;\n }\n const header = `${dimensionValueDisplay(display)(dim)}:`;\n const label = dimensionValueDisplay(display)(value);\n const flags = R.pipe(\n getFlagsAndNotes,\n R.map(entry => ({\n code: entry.code,\n header: `${dimensionValueDisplay(display)(entry)}:`,\n label: dimensionValueDisplay(display)(entry.value),\n })),\n )(dim.attrValues, customAttributes);\n return R.append({ header, label, flags }, acc);\n },\n [],\n dimensions,\n );\n};\n","import * as R from 'ramda';\n\nexport const getSeriesCombinations = (combinations, oneValuesDimensions) => {\n const indexedValues = R.reduce(\n (acc, dim) => {\n const value = R.head(dim.values);\n return R.assoc(dim.id, value, acc);\n },\n {},\n oneValuesDimensions,\n );\n\n return R.reduce(\n (acc, comb) => {\n if (!R.prop('series', comb)) {\n return acc;\n }\n const fixedDimValues = R.pick(comb.concepts, indexedValues);\n return R.append({ ...comb, fixedDimValues }, acc);\n },\n [],\n combinations,\n );\n};\n","import * as R from 'ramda';\nimport { dimensionValueDisplay } from '../../rules/src/dimension-utils';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nconst getRefinedMissinParentsLabels = R.pipe(\n R.propOr([], 'missingParents'),\n R.reduce((acc, par) => {\n if (!R.propOr(true, 'display', par) || R.includes(par.id, REJECTED_VALUE_IDS)) {\n return acc;\n }\n return R.append(dimensionValueDisplay('label')(par), acc);\n }, []),\n);\n\nexport const singleValueDisplay = (display, value) => {\n if (display === 'label') {\n return R.converge(\n (missingParents, label) =>\n R.isEmpty(missingParents) ? label : R.join(' > ', R.append(label, missingParents)),\n [getRefinedMissinParentsLabels, dimensionValueDisplay(display)],\n )(value);\n } else if (display === 'both') {\n return `(${singleValueDisplay('code', value)}) ${singleValueDisplay('label', value)}`;\n }\n return dimensionValueDisplay(display)(value);\n};\n\nconst _combinedValuesDisplay = _display => values =>\n R.pipe(\n R.reduce((acc, val) => {\n if (R.isNil(val)) return acc;\n const isDisplayed = R.propOr(true, 'display', val);\n const isRejected = R.includes(val.id, REJECTED_VALUE_IDS);\n if ((!isDisplayed || isRejected) && _display === 'label') return acc;\n return R.append(singleValueDisplay(_display, val), acc);\n }, []),\n labels => {\n if (!R.isEmpty(labels) || _display !== 'label') {\n return R.join(', ', labels);\n }\n const totalValue = R.find(R.propEq('_T', 'id'), values);\n if (!R.isNil(totalValue)) {\n return dimensionValueDisplay('label')(totalValue);\n }\n if (R.isEmpty(values)) {\n return '';\n }\n const firstValue = R.head(values);\n return dimensionValueDisplay('label')(firstValue);\n },\n )(values);\n\nexport const combinedValuesDisplay = (display, values) => {\n if (display === 'both') {\n return R.converge(\n (_ids, labels) => {\n return dimensionValueDisplay('both')({\n id: _ids,\n name: labels,\n });\n },\n [_combinedValuesDisplay('code'), _combinedValuesDisplay('label')],\n )(values);\n }\n return _combinedValuesDisplay(display)(values);\n};\n","import * as R from 'ramda';\nimport { dimensionValueDisplay } from '../../rules/src/dimension-utils';\nimport { combinedValuesDisplay } from './combinedValuesDisplay';\nimport { REJECTED_VALUE_IDS } from './constants';\n\nexport const getHeaderCombinations = (combinations, dimensions, attributes, display) => {\n const indexedDimensions = R.indexBy(R.prop('id'), dimensions);\n const indexedAttributes = R.indexBy(R.prop('id'), attributes);\n return R.reduce(\n (acc, comb) => {\n if (!R.prop('header', comb) || !R.propOr(true, 'display', comb)) {\n return acc;\n }\n\n const header = `${dimensionValueDisplay(display)(comb)}:`;\n\n const label = R.pipe(\n R.reduce((_acc, concept) => {\n const artefact = R.has(concept, indexedDimensions)\n ? R.prop(concept, indexedDimensions)\n : R.prop(concept, indexedAttributes);\n if (R.isNil(artefact)) {\n return _acc;\n }\n const value = R.path(['values', 0], artefact);\n if (R.isNil(value)) {\n return _acc;\n }\n if (\n R.has(concept, indexedAttributes) &&\n (!R.propOr(true, 'display', value) ||\n !R.propOr(true, 'artefact', value) ||\n R.includes(value.id, REJECTED_VALUE_IDS))\n ) {\n return _acc;\n }\n return R.append(value, _acc);\n }, []),\n values => combinedValuesDisplay(display, values),\n )(comb.concepts || []);\n if (R.isEmpty(label)) {\n return acc;\n }\n return R.append({ header, label }, acc);\n },\n [],\n combinations,\n );\n};\n","import * as R from 'ramda';\n\nexport const getHeaderCoordinates = oneValueDimensions =>\n R.reduce(\n (acc, dim) => R.assoc(dim.id, R.path(['values', 0, 'id'], dim), acc),\n {},\n oneValueDimensions,\n );\n","import * as R from 'ramda';\nimport { isTimePeriodDimension } from '../../../rules/src/dimension-utils';\n\nconst getConceptsSet = (ids, indexedCombinations, _upper) => {\n const upper = R.isNil(_upper) ? new Set([]) : _upper;\n const res = new Set([]);\n R.forEach(id => {\n if (!R.has(id, indexedCombinations)) {\n res.add(id);\n } else {\n const comb = R.prop(id, indexedCombinations);\n R.forEach(c => {\n if (!upper.has(c)) {\n res.add(c);\n }\n }, comb.concepts);\n }\n }, ids);\n return res;\n};\n\nconst parseCombination = (_upperIds, _excludedIds) => (comb, indexedDimensions) => {\n const upperIds = R.isNil(_upperIds) ? new Set([]) : _upperIds;\n const excludedIds = R.isNil(_excludedIds) ? new Set([]) : _excludedIds;\n\n const { concepts, relationship } = comb;\n const dimensions = R.reduce(\n (acc, id) => {\n if (upperIds.has(id) || !R.has(id, indexedDimensions)) {\n return acc;\n }\n const dim = R.prop(id, indexedDimensions);\n return R.append(dim, acc);\n },\n [],\n concepts,\n );\n const excludedDep = R.find(i => excludedIds.has(i), relationship);\n if (excludedDep) {\n return dimensions;\n }\n return R.assoc('dimensions', dimensions, comb);\n};\n\nexport const getLayout = (_layoutIds, dimensions, combinations, isTimeInverted) => {\n const layoutIds = R.mergeRight({ header: [], sections: [], rows: [] }, _layoutIds);\n const applyInversionOnTimeDim = dim =>\n isTimePeriodDimension(dim) && isTimeInverted ? R.assoc('isInverted', true, dim) : dim;\n\n const indexedDimensions = R.reduce(\n (acc, dim) => R.assoc(dim.id, applyInversionOnTimeDim(dim), acc),\n {},\n dimensions,\n );\n\n const indexedCombinations = R.indexBy(R.prop('id'), combinations);\n const headerConceptsSet = getConceptsSet(layoutIds.header, indexedCombinations);\n const sectionsConceptsSet = getConceptsSet(layoutIds.sections, indexedCombinations);\n const rowsConceptsSet = getConceptsSet(\n R.concat(layoutIds.sections, layoutIds.rows),\n indexedCombinations,\n );\n\n const getLayoutLevel = (_upperIds, _excludedIds) => ids =>\n R.reduce(\n (acc, id) => {\n if (R.has(id, indexedDimensions)) {\n const dim = R.prop(id, indexedDimensions);\n return R.append(dim, acc);\n }\n if (!R.has(id, indexedCombinations)) {\n return acc;\n }\n const comb = R.prop(id, indexedCombinations);\n const parsedCombination = parseCombination(_upperIds, _excludedIds)(\n comb,\n indexedDimensions,\n );\n if (R.is(Array, parsedCombination)) {\n return R.concat(acc, parsedCombination);\n }\n return R.append(parsedCombination, acc);\n },\n [],\n ids,\n );\n\n const header = getLayoutLevel(null, rowsConceptsSet)(layoutIds.header);\n const sections = getLayoutLevel(null, headerConceptsSet)(layoutIds.sections);\n const rows = getLayoutLevel(sectionsConceptsSet, headerConceptsSet)(layoutIds.rows);\n\n return { header, sections, rows };\n};\n","import * as R from 'ramda';\n\n/*\n const layout = {\n header: [\n { id, __index },\n { id: COMB, dimensions: [{ id, __index }] }\n ],\n sections: [],\n rows: []\n }\n\n*/\n\nconst getLayoutPivots = layoutEntry => {\n const valIndexGetter = d =>\n R.pipe(R.nth(R.prop('__index', d)), ind => (d.isInverted ? R.negate(ind) : ind));\n return indexes =>\n R.map(\n R.ifElse(\n R.has('dimensions'),\n c => R.map(d => valIndexGetter(d)(indexes), R.prop('dimensions', c)),\n d => {\n if (d.id === 'OBS_ATTRIBUTES') {\n return R.last(indexes);\n }\n return valIndexGetter(d)(indexes);\n },\n ),\n layoutEntry,\n );\n};\n\nconst comparator = (firstSerie, secondSerie) => {\n const firstIndexes = firstSerie.indexes;\n const secondIndexes = secondSerie.indexes;\n const size = R.length(firstIndexes);\n let i = 0;\n while (i < size) {\n if (R.is(Array, firstIndexes[i])) {\n const firstSubIndexes = firstIndexes[i];\n const secondSubIndexes = secondIndexes[i];\n const _size = R.length(firstSubIndexes);\n let j = 0;\n while (firstSubIndexes[j] === secondSubIndexes[j] && j < _size) {\n j++;\n }\n if (firstSubIndexes[j] !== secondSubIndexes[j]) {\n return firstSubIndexes[j] - secondSubIndexes[j];\n }\n } else if (firstIndexes[i] !== secondIndexes[i]) {\n return firstIndexes[i] - secondIndexes[i];\n }\n i++;\n }\n return firstIndexes[i] - secondIndexes[i];\n};\n\nconst uniqIndexes = R.pipe(\n R.reduce((acc, { indexes, rejected }) => {\n const key = R.join(':', R.unnest(indexes));\n if (R.has(key, acc)) {\n return R.over(\n R.lensPath([key, 'rejected']),\n R.addIndex(R.map)((v, i) => (v === R.nth(i, rejected) ? v : null)),\n )(acc);\n }\n return R.assoc(key, { indexes, rejected, key }, acc);\n }, {}),\n R.values,\n);\n\nexport const getSortedLayoutIndexes = (layout, observations, rejectedDims = []) => {\n const dimIndexes = R.pipe(R.values, R.map(R.propOr([], 'orderedDimIndexes')))(observations);\n\n const headerPivots = getLayoutPivots(layout.header);\n const sectionsPivots = getLayoutPivots(R.concat(layout.sections, layout.rows));\n const rejectedPivots = getLayoutPivots(rejectedDims);\n\n const sectionLength = R.length(layout.sections);\n const { header, sections } = R.pipe(\n R.reduce(\n (acc, indexes) => {\n const headerIndexes = headerPivots(indexes);\n const sectionsIndexes = sectionsPivots(indexes);\n const rejectedIndexes = rejectedPivots(indexes);\n\n return {\n header: R.append({ indexes: headerIndexes, rejected: rejectedIndexes }, acc.header),\n sections: R.append({ indexes: sectionsIndexes, rejected: rejectedIndexes }, acc.sections),\n };\n },\n { header: [], sections: [] },\n ),\n R.mapObjIndexed(uniqIndexes),\n R.evolve({\n header: R.sort(comparator),\n sections: R.sort(comparator),\n }),\n indexes => ({\n ...indexes,\n sections: R.reduce(\n (acc, { indexes, rejected, key }) => {\n const [sectionIndexes, rowIndexes] = R.splitAt(sectionLength, indexes);\n const sectionKey = R.join(':', sectionIndexes);\n const previousSecKey = R.pipe(R.nth(-1), v => (R.isNil(v) ? null : R.head(v).key))(acc);\n if (R.equals(sectionKey, previousSecKey)) {\n return R.over(\n R.lensIndex(-1),\n R.pipe(\n R.over(R.lensIndex(1), R.append({ indexes: rowIndexes, rejected, key })),\n R.over(R.lensIndex(0), v => ({\n ...v,\n rejected: R.addIndex(R.map)(\n (val, i) => (val === R.nth(i, rejected) ? val : null),\n v.rejected,\n ),\n })),\n ),\n )(acc);\n }\n\n return R.append(\n [\n { indexes: sectionIndexes, rejected, key: sectionKey },\n [{ indexes: rowIndexes, rejected, key }],\n ],\n acc,\n );\n },\n [],\n indexes.sections,\n ),\n }),\n )(dimIndexes);\n\n return { header, sections };\n};\n","import * as R from 'ramda';\n\nconst toKey = indexes =>\n R.reduce(\n (acc, _ind) => {\n const ind = R.is(Array, _ind) ? toKey(_ind) : String(Math.abs(_ind));\n if (R.isEmpty(ind)) {\n return acc;\n }\n return R.isEmpty(acc) ? ind : `${acc}:${ind}`;\n },\n '',\n indexes,\n );\n\nconst getPivotKey = indexes => R.pipe(R.props(indexes), R.join(':'));\n\nconst getPivots = (layout, shape) =>\n R.pipe(\n R.props(shape),\n R.map(\n R.pipe(\n R.map(entry =>\n R.has('dimensions', entry) ? R.pluck('__index', entry.dimensions || []) : entry.__index,\n ),\n R.unnest,\n getPivotKey,\n ),\n ),\n )(layout);\n\nconst indexWithPivots = (pivots, observations) =>\n R.pipe(\n R.values,\n R.reduce((acc, obs) => {\n const path = R.map(pivot => pivot(obs.orderedDimIndexes), pivots);\n return R.over(R.lensPath(path), R.ifElse(R.isNil, R.always([obs]), R.append(obs)))(acc);\n }, {}),\n )(observations);\n\nconst getCuratedCells = ({ layout, observations, shape }) => {\n const pivots = getPivots(layout, shape);\n return indexWithPivots(pivots, observations);\n};\n\nconst filterSeries = (series, getHasStillData) => {\n let removedMissingIndexes = [];\n return R.reduce(\n (acc, serie) => {\n const hasStillData = getHasStillData(serie);\n const serieParentsSets = R.map(p => new Set(p), R.propOr([], 'parentsIndexes', serie));\n if (!hasStillData) {\n removedMissingIndexes = R.addIndex(R.map)((mIs, ind) => {\n const filtered = R.filter(\n i => serieParentsSets[ind].has(i),\n R.nth(ind, removedMissingIndexes) || [],\n );\n return R.concat(filtered, mIs);\n }, serie.missingIndexes || []);\n return acc;\n }\n const _serie = R.pipe(\n R.over(R.lensProp('missingIndexes'), (missingIndexes = []) =>\n R.addIndex(R.map)((mIs, ind) => {\n const removed = R.nth(ind, removedMissingIndexes) || [];\n if (R.isEmpty(removed)) {\n return mIs;\n }\n const filteredRemoved = R.filter(i => serieParentsSets[ind].has(i), removed);\n return R.concat(filteredRemoved, mIs || []);\n }, missingIndexes),\n ),\n R.over(R.lensProp('parentsIndexes'), (parentsIndexes = []) =>\n R.addIndex(R.map)((p, ind) => {\n return R.reject(i => R.includes(i, R.nth(ind, removedMissingIndexes) || []), p || []);\n }, parentsIndexes),\n ),\n )(serie);\n removedMissingIndexes = [];\n return R.append(_serie, acc);\n },\n [],\n series,\n );\n};\n\nconst refineSections = (sections, extractedKeys, curatedObs) =>\n R.pipe(\n R.map(section => {\n const sectionKey = toKey(R.propOr([], 'indexes', R.head(section)));\n const getHasRowStillData = row => {\n const rowKey = toKey(R.prop('indexes', row));\n return R.pipe(\n R.path([sectionKey, rowKey]),\n R.omit(extractedKeys),\n R.isEmpty,\n R.not,\n )(curatedObs);\n };\n return R.over(R.lensIndex(1), rows => filterSeries(rows, getHasRowStillData))(section);\n }),\n R.filter(R.pipe(R.nth(1), R.isEmpty, R.not)),\n )(sections);\n\nconst refineHeader = (headers, extractedKeys, curatedObs) => {\n const getHasHeaderStillData = header => {\n const headerKey = toKey(R.prop('indexes', header));\n return R.pipe(\n R.prop(headerKey),\n sections => {\n return R.pickBy(\n (rows, section) =>\n R.pipe(R.omit(R.propOr([], section, extractedKeys)), R.isEmpty, R.not)(rows),\n sections,\n );\n },\n R.isEmpty,\n R.not,\n )(curatedObs);\n };\n return filterSeries(headers, getHasHeaderStillData);\n};\n\nconst getSerieLinesCount = serie => {\n const missingParents = R.propOr([], 'missingParents', serie);\n const missingParentsRowsCount = R.pipe(R.flatten, R.length)(missingParents);\n return missingParentsRowsCount + 1;\n};\n\nconst truncateSectionRows = (n, sectionsData) => {\n let truncated = sectionsData;\n let extractedKeys = {};\n let _n = n;\n while (_n > 0) {\n const lastSection = R.last(truncated);\n const rows = lastSection[1];\n const rowsLength = R.length(rows);\n let truncatedRowsCount = 0;\n while (_n > 0 && truncatedRowsCount !== rowsLength) {\n const rowsCount = getSerieLinesCount(R.nth(-1 * truncatedRowsCount, rows));\n _n = _n - rowsCount;\n truncatedRowsCount++;\n }\n const sectionKey = R.pipe(R.head, R.prop('indexes'), toKey)(lastSection);\n extractedKeys = {\n ...extractedKeys,\n [sectionKey]: R.pipe(\n R.takeLast(truncatedRowsCount),\n R.map(r => toKey(R.prop('indexes', r))),\n )(rows),\n };\n if (_n > 0) {\n truncated = R.dropLast(1, truncated);\n } else {\n truncated = R.over(\n R.lensIndex(-1),\n R.over(R.lensIndex(1), R.dropLast(truncatedRowsCount)),\n )(truncated);\n }\n }\n return { truncated, extractedKeys };\n};\n\nconst truncateHeader = (n, headerData) => {\n let { truncated, extractedKeys } = { truncated: headerData, extractedKeys: [] };\n let _n = n;\n while (_n > 0) {\n const lastHeader = R.last(truncated);\n const columnsCount = getSerieLinesCount(lastHeader);\n const extractedKey = toKey(R.prop('indexes', lastHeader));\n extractedKeys = R.append(extractedKey, extractedKeys);\n truncated = R.dropLast(1, truncated);\n _n = _n - columnsCount;\n }\n return { truncated, extractedKeys };\n};\n\nconst truncateLayout = isVertical =>\n R.ifElse(R.always(isVertical), truncateSectionRows, truncateHeader);\n\nconst refineLayout = isVertical => R.ifElse(R.always(isVertical), refineHeader, refineSections);\n\nconst getShape = isVertical =>\n isVertical ? ['header', 'sections', 'rows'] : ['sections', 'rows', 'header'];\n\nconst getRefinedLayout = (isVertical, truncated, refined) =>\n R.ifElse(\n R.always(isVertical),\n R.pipe(R.assoc('sections', truncated), R.assoc('header', refined)),\n R.pipe(R.assoc('header', truncated), R.assoc('sections', refined)),\n )({});\n\nconst segregateLayout = isVertical =>\n R.ifElse(R.always(isVertical), R.props(['sections', 'header']), R.props(['header', 'sections']));\n\nexport const refineLayoutSize =\n ({ layout, observations, limit }) =>\n layoutIndexes => {\n const { header, sections } = layoutIndexes;\n if (R.isNil(limit) || limit === 0 || R.all(R.isEmpty, [header, sections])) {\n return R.pipe(\n R.set(R.lensProp('truncated'), false),\n R.set(R.lensProp('totalCells'), null),\n )(layoutIndexes);\n }\n\n //number of dimensions in header\n const headerDimCount = R.pipe(\n R.head, // first column\n R.when(R.isNil, R.always({})),\n R.propOr([], 'indexes'),\n R.length, // number of dims\n )(header);\n\n //number of columns for values\n const headerValuesCount = R.pipe(\n R.reduce((acc, header) => {\n const columnsCount = getSerieLinesCount(header);\n return acc + columnsCount;\n }, 0),\n R.when(R.equals(0), R.always(1)),\n )(header);\n\n //total of cells in header\n const headerCellsCount = headerDimCount * (headerValuesCount + 1);\n\n // number of dimensions in a row\n const rowDimCount = R.pipe(\n R.head, // firstSection\n R.last, // rows,\n R.head, // first row\n R.propOr([], 'indexes'),\n R.length,\n )(sections);\n\n // number of cells in a row\n const rowCellsCount = rowDimCount + headerValuesCount + 1;\n\n // number of rows\n const rowsCount = R.pipe(\n R.map(R.last),\n R.unnest,\n R.reduce((acc, row) => {\n const rowsCount = getSerieLinesCount(row);\n return acc + rowsCount;\n }, 1),\n )(sections);\n\n // total of cells in all rows\n const rowsCellsCount = rowCellsCount * rowsCount;\n\n // number of sections cells\n const sectionsCellsCount = R.ifElse(\n R.pipe(R.head, R.head, R.propOr([], 'indexes'), R.length, R.equals(0)),\n R.always(0),\n R.length,\n )(sections);\n\n const total = rowsCellsCount + sectionsCellsCount + headerCellsCount;\n\n const excess = total - limit;\n if (excess <= 0) {\n return R.pipe(\n R.set(R.lensProp('truncated'), false),\n R.set(R.lensProp('totalCells'), total),\n )(layoutIndexes);\n }\n\n // total of cells in one column\n const columnCellsCount = headerDimCount + rowsCount;\n\n const isVertical = columnCellsCount > rowCellsCount;\n\n const [toTruncate, toRefine] = segregateLayout(isVertical)(layoutIndexes);\n\n let cutLength = R.pipe(\n R.ifElse(R.identity, R.always(rowCellsCount), R.always(columnCellsCount)),\n R.divide(excess),\n Math.ceil,\n )(isVertical);\n\n const maxCutLength = isVertical ? rowsCount - 2 : headerValuesCount - 1;\n cutLength = cutLength > maxCutLength ? maxCutLength : cutLength;\n\n const { truncated, extractedKeys } = truncateLayout(isVertical)(cutLength, toTruncate);\n\n const dimsLength = R.pipe(\n R.values,\n R.head,\n R.propOr([], 'orderedDimIndexes'),\n R.length,\n )(observations);\n const _layout = R.map(\n R.map(entry =>\n entry.id === 'OBS_ATTRIBUTES' ? R.assoc('__index', dimsLength - 1, entry) : entry,\n ),\n layout,\n );\n const curatedObs = R.pipe(getShape, shape =>\n getCuratedCells({ layout: _layout, observations, shape }),\n )(isVertical);\n\n const refined = refineLayout(isVertical)(toRefine, extractedKeys, curatedObs);\n\n const result = getRefinedLayout(isVertical, truncated, refined);\n\n return R.pipe(\n R.set(R.lensProp('truncated'), true),\n R.set(R.lensProp('totalCells'), total),\n )(result);\n };\n","import * as R from 'ramda';\n\nexport const getLayoutCoordinatesValidator =\n (layoutCoordinates, topCoordinates = {}) =>\n coordinates => {\n if (R.isEmpty(coordinates)) {\n return false;\n }\n if (R.has('OBS_ATTRIBUTES', layoutCoordinates) || R.has('OBS_ATTRIBUTES', topCoordinates)) {\n const obsAttrCoord =\n R.prop('OBS_ATTRIBUTES', layoutCoordinates) || R.prop('OBS_ATTRIBUTES', topCoordinates);\n if (obsAttrCoord !== 'OBS_VALUE') {\n return false;\n }\n }\n const keys = R.keys(coordinates);\n let res = true;\n let notInTop = {};\n R.forEach(key => {\n if (R.prop(key, layoutCoordinates) !== R.prop(key, coordinates)) {\n res = false;\n }\n if (!R.has(key, topCoordinates)) {\n notInTop[key] = key;\n }\n }, keys);\n return res && !R.isEmpty(notInTop);\n };\n","import * as R from 'ramda';\nimport { getFlagsAndNotes } from './getFlagsAndNotes';\nimport { getLayoutCoordinatesValidator } from '../utils';\n\nconst getValueData = (index, dimension, parentsIndexes, missingParents = []) => ({\n dimension: R.pick(['id', 'name', '__index'], dimension),\n value: {\n ...R.pipe(\n R.pathOr({}, ['values', index]),\n R.pick(['id', 'name', 'isNonCoded', 'flags', 'hasAdvancedAttributes', 'display']),\n )(dimension),\n parents: parentsIndexes,\n missingParents,\n },\n});\n\nconst addCoordinatesToKey = (key, dimensionId, valueId) =>\n `${key}${R.isEmpty(key) ? '' : ':'}${dimensionId}=${valueId}`;\n\nconst simpleValueDataSetter = (valueData, datas = []) => R.append(valueData, datas);\n\nconst combinedValueDataSetter = (valueData, datas = []) =>\n R.over(\n R.lensIndex(-1),\n d => ({ ...d, values: R.append(R.prop('value', valueData), d.values) }),\n datas,\n );\n\nconst addValueToSerieData =\n dataSetter => (index, parentsIndexes, dimension, serieData, missingParents) => {\n const valueData = getValueData(index, dimension, parentsIndexes, missingParents);\n const valueId = R.path(['value', 'id'], valueData);\n return {\n ...serieData,\n data: dataSetter(valueData, R.prop('data', serieData)),\n key: addCoordinatesToKey(R.prop('key', serieData), R.prop('id', dimension), valueId),\n };\n };\n\nconst addSimpleValueToSerieData = addValueToSerieData(simpleValueDataSetter);\n\nconst addCombinedValueToSerieData = addValueToSerieData(combinedValueDataSetter);\n\nconst getHasAdvancedAttributes = (attrValues, customAttributes) =>\n R.pipe(\n R.omit(R.concat(customAttributes.flags || [], customAttributes.notes || [])),\n R.isEmpty,\n R.not,\n )(attrValues);\n\nconst getCoordinates = (indexes, topCoordinates, definition) =>\n R.addIndex(R.reduce)(\n (acc, entry, index) => {\n if (R.has('dimensions', entry)) {\n return R.addIndex(R.reduce)(\n (_acc, dim, _index) => {\n const valInd = R.path([index, _index], indexes);\n return R.assoc(dim.id, R.path(['values', Math.abs(valInd), 'id'], dim), _acc);\n },\n acc,\n entry.dimensions,\n );\n }\n const valInd = R.nth(index, indexes);\n if (R.isNil(valInd)) {\n return acc;\n }\n return R.assoc(entry.id, R.path(['values', Math.abs(valInd), 'id'], entry), acc);\n },\n topCoordinates,\n definition,\n );\n\nconst getAttributesSeries = (validator, attributesSeries) =>\n R.reduce(\n (acc, attrs) => {\n const attr = R.head(R.values(attrs)) || {};\n const coordinates = R.propOr({}, 'coordinates', attr);\n const isValid = validator(coordinates);\n if (!isValid && !R.prop('isObs', attr)) {\n return acc;\n }\n const filtered = R.reject(\n a => !R.propOr(false, 'combined', a) && R.length(a.relationship || []) === 1,\n attrs,\n );\n return { ...acc, ...filtered };\n },\n {},\n R.values(attributesSeries),\n );\n\nconst combineConcepts = (combDimValues, definition, attrValues) =>\n R.over(\n R.lensProp('data'),\n R.over(R.lensIndex(-1), data => ({\n ...data,\n values: R.reduce(\n (acc, conceptId) => {\n if (R.has(conceptId, combDimValues)) {\n return R.append(R.prop(conceptId, combDimValues), acc);\n }\n if (R.has(conceptId, definition.fixedDimValues || {})) {\n return R.append(R.prop(conceptId, definition.fixedDimValues), acc);\n }\n if (R.has(conceptId, attrValues)) {\n const value = R.path([conceptId, 'value'], attrValues);\n return R.append(value, acc);\n }\n return acc;\n },\n [],\n definition.concepts,\n ),\n })),\n );\n\nconst getSerieFlagsAndSideProps = (\n coordinates,\n validator,\n attributesValues,\n customAttributes,\n metadataCoordinates,\n data,\n) => {\n const layoutAttrValues = R.reject(\n attr => R.prop('isObs', attr) && !validator(attr.coordinates),\n attributesValues,\n );\n const flags = getFlagsAndNotes(layoutAttrValues, customAttributes);\n const hasMetadata = !R.isNil(R.find(validator, metadataCoordinates));\n const hasDataAdvancedAttributes = R.any(\n d =>\n R.has('value', d)\n ? R.prop('hasAdvancedAttributes', d.value)\n : R.any(R.prop('hasAdvancedAttributes'), d.values),\n data,\n );\n const hasAdvancedAttributes =\n hasDataAdvancedAttributes || getHasAdvancedAttributes(layoutAttrValues, customAttributes);\n const sideProps =\n hasMetadata || hasAdvancedAttributes\n ? { hasMetadata, hasAdvancedAttributes, coordinates }\n : null;\n return { flags, sideProps };\n};\n\nconst getSerieDimensionsData = (serie, definition, attributesValues, missingParentsGetter) =>\n R.addIndex(R.reduce)(\n (onGoingSerie, entry, index) => {\n if (R.has('dimensions', entry)) {\n const combValuesIndexes = R.pathOr([], ['indexes', index], serie);\n const combParentsIndexes = R.pathOr([], ['parentsIndexes', index], serie);\n const combMissingParentsIndexes = R.pathOr([], ['missingIndexes', index], serie);\n let combDimValues = {};\n const res = R.addIndex(R.reduce)(\n (combSerie, dimension, dimIndex) => {\n const valueIndex = Math.abs(R.nth(dimIndex, combValuesIndexes));\n const _parentsIndexes = R.nth(dimIndex, combParentsIndexes) || [];\n const missingParentsIndexes = R.nth(dimIndex, combMissingParentsIndexes) || [];\n const { parentsIndexes, missingParents } = missingParentsGetter(\n combinedValueDataSetter,\n )(missingParentsIndexes, _parentsIndexes, dimension, combSerie);\n const next = addCombinedValueToSerieData(\n valueIndex,\n parentsIndexes,\n dimension,\n combSerie,\n missingParents,\n );\n const value = R.pipe(R.prop('data'), R.last, R.prop('values'), R.last)(next);\n combDimValues = R.assoc(dimension.id, value, combDimValues);\n return next;\n },\n R.over(\n R.lensProp('data'),\n R.append({ dimension: R.pick(['id', 'name'], entry), values: [] }),\n )(onGoingSerie),\n R.propOr([], 'dimensions', entry),\n );\n\n const combined = combineConcepts(combDimValues, entry, onGoingSerie.attributes)(res);\n return R.over(R.lensProp('attributes'), R.omit(entry.concepts), combined);\n }\n\n const valueIndex = Math.abs(R.path(['indexes', index], serie));\n const _parentsIndexes = R.pathOr([], ['parentsIndexes', index], serie);\n const missingParentsIndexes = R.pathOr([], ['missingIndexes', index], serie);\n const { parentsIndexes, missingParents } = missingParentsGetter(simpleValueDataSetter)(\n missingParentsIndexes,\n _parentsIndexes,\n entry,\n onGoingSerie,\n );\n return addSimpleValueToSerieData(\n valueIndex,\n parentsIndexes,\n entry,\n onGoingSerie,\n missingParents,\n );\n },\n { data: [], key: '', attributes: attributesValues },\n definition,\n );\n\nexport const getSerieDataWithMissingLines = (\n serie,\n definition,\n topCoordinates,\n attributesSeries,\n customAttributes,\n metadataCoordinates,\n rejectedDims = [],\n) => {\n const lines = [];\n const coordinates = getCoordinates(serie.indexes, topCoordinates, definition);\n const serieCoordinates = getCoordinates(serie.rejected || [], coordinates, rejectedDims);\n const coordinatesValidator = getLayoutCoordinatesValidator(serieCoordinates, topCoordinates);\n const attributesValues = getAttributesSeries(coordinatesValidator, attributesSeries);\n\n const getMissingParents =\n dataSetter => (missingParentsIndexes, _parentsIndexes, dim, serieData) =>\n R.reduce(\n (acc, index) => {\n const missingParentData = addValueToSerieData(dataSetter)(\n index,\n acc.parentsIndexes,\n dim,\n serieData,\n );\n lines.push({\n ...R.dissoc('attributes', missingParentData),\n sideProps: null,\n flags: [],\n isEmpty: true,\n });\n return R.over(R.lensProp('parentsIndexes'), R.append(index), acc);\n },\n { parentsIndexes: _parentsIndexes, missingParents: [] },\n missingParentsIndexes,\n );\n const { attributes, ...serieData } = getSerieDimensionsData(\n serie,\n definition,\n attributesValues,\n getMissingParents,\n );\n const topCoordinatesValidator = getLayoutCoordinatesValidator(topCoordinates);\n const flagsValidator = coordinates =>\n coordinatesValidator(coordinates) && !topCoordinatesValidator(coordinates);\n const { flags, sideProps } = getSerieFlagsAndSideProps(\n serieCoordinates,\n flagsValidator,\n attributes,\n customAttributes,\n metadataCoordinates,\n serieData.data,\n );\n return R.append({ ...serieData, flags, sideProps, coordinates: serieCoordinates }, lines);\n};\n\nexport const getSerieDataWithoutMissingLines = (\n serie,\n definition,\n topCoordinates,\n attributesSeries,\n customAttributes,\n metadataCoordinates,\n rejectedDims = [],\n) => {\n const coordinates = getCoordinates(serie.indexes, topCoordinates, definition);\n const serieCoordinates = getCoordinates(serie.rejected || [], coordinates, rejectedDims);\n const coordinatesValidator = getLayoutCoordinatesValidator(serieCoordinates, topCoordinates);\n const attributesValues = getAttributesSeries(coordinatesValidator, attributesSeries);\n\n const getMissingParents = () => (missingParentsIndexes, _parentsIndexes, dim) =>\n R.reduce(\n (acc, index) => ({\n parentsIndexes: R.append(index, acc.parentsIndexes),\n missingParents: R.append(\n R.prop('value', getValueData(index, dim, acc.parentsIndexes)),\n acc.missingParents,\n ),\n }),\n { parentsIndexes: _parentsIndexes, missingParents: [] },\n missingParentsIndexes,\n );\n\n const { attributes, ...serieData } = getSerieDimensionsData(\n serie,\n definition,\n attributesValues,\n getMissingParents,\n );\n const { flags, sideProps } = getSerieFlagsAndSideProps(\n serieCoordinates,\n coordinatesValidator,\n attributes,\n customAttributes,\n metadataCoordinates,\n serieData.data,\n );\n return { ...serieData, flags, sideProps, coordinates: serieCoordinates };\n};\n\nexport const getLayoutData = (\n layoutIndexes,\n layout,\n {\n metadataCoordinates,\n attributesSeries,\n customAttributes,\n topCoordinates = {},\n rejectedDimensions = [],\n },\n) => {\n const { header, sections, ...rest } = layoutIndexes;\n const headerData = R.reduce(\n (acc, serie) => {\n const datas = getSerieDataWithMissingLines(\n serie,\n layout.header,\n topCoordinates,\n attributesSeries,\n customAttributes,\n metadataCoordinates,\n rejectedDimensions,\n );\n return R.concat(acc, datas);\n },\n [],\n header,\n );\n\n const sectionsData = R.map(([sectionSerie, rowsSeries]) => {\n const sectionData = getSerieDataWithoutMissingLines(\n sectionSerie,\n layout.sections,\n topCoordinates,\n attributesSeries,\n customAttributes,\n metadataCoordinates,\n rejectedDimensions,\n );\n return [\n sectionData,\n R.reduce(\n (acc, serie) => {\n const datas = getSerieDataWithMissingLines(\n serie,\n layout.rows,\n R.propOr(topCoordinates, 'coordinates', sectionData),\n attributesSeries,\n customAttributes,\n metadataCoordinates,\n rejectedDimensions,\n );\n return R.concat(acc, datas);\n },\n [],\n rowsSeries,\n ),\n ];\n }, sections);\n\n return { headerData, sectionsData, ...rest };\n};\n","import * as R from 'ramda';\n\nexport const getCellsAttributesIds = (layoutIds, attributes) => {\n return R.reduce(\n (acc, attr) => {\n if (!attr.series) {\n return acc;\n }\n if (R.isEmpty(attr.relationship || [])) {\n return R.assoc(attr.id, attr.id, acc);\n }\n const indexedHeaderIds = R.indexBy(R.identity, layoutIds.header);\n const indexedSectionsIds = R.indexBy(R.identity, layoutIds.sections);\n const indexedRowsIds = { ...indexedSectionsIds, ...R.indexBy(R.identity, layoutIds.rows) };\n const [idsInHeader, rest] = R.partition(id => R.has(id, indexedHeaderIds), attr.relationship);\n if (R.isEmpty(rest)) {\n return acc;\n } else if (!R.isEmpty(idsInHeader)) {\n return R.assoc(attr.id, attr.id, acc);\n } else {\n const idsNotInSections = R.reject(id => R.has(id, indexedSectionsIds), attr.relationship);\n if (R.isEmpty(idsNotInSections)) {\n return acc;\n }\n const idsNotInRows = R.reject(id => R.has(id, indexedRowsIds), idsNotInSections);\n if (R.isEmpty(idsNotInRows)) {\n return acc;\n }\n }\n return R.assoc(attr.id, attr.id, acc);\n },\n {},\n attributes,\n );\n};\n","import * as R from 'ramda';\n\nexport const getCellsMetadataCoordinates = (metadataCoordinates, oneValueDimensions, layoutIds) => {\n const oneValueDimsIds = R.pluck('id', oneValueDimensions);\n return R.reject(coordinates => {\n const columnIds = R.concat(layoutIds.header, oneValueDimsIds);\n if (R.isEmpty(R.omit(columnIds, coordinates))) {\n return true;\n }\n const rowsIds = [...layoutIds.sections, ...layoutIds.rows, ...oneValueDimsIds];\n return R.isEmpty(R.omit(rowsIds, coordinates));\n }, metadataCoordinates);\n};\n","import * as R from 'ramda';\n\nexport const getIndexedCombinationsByDisplay = (layout, combinations) => {\n const layoutIds = R.pipe(R.map(R.pluck('id')), R.values, R.unnest, R.indexBy(R.identity))(layout);\n\n const [combsInLayout, combsInCells] = R.partition(\n comb => R.has(comb.id, layoutIds),\n combinations,\n );\n return { cells: combsInCells, layout: combsInLayout };\n};\n","import * as R from 'ramda';\nimport { getFlagsAndNotes } from './getFlagsAndNotes';\nimport { hasCellMetadata } from '../hasCellMetadata';\n\nconst getCellRelevantAttributes = (attributes, attributesSeries, cellAttributeIds) =>\n R.filter(attr => {\n if (R.isNil(attr.value)) {\n return false;\n }\n if (R.has(attr.id, cellAttributeIds)) {\n return true;\n }\n const attrInSerie = R.path([attr.serieKey, attr.id], attributesSeries);\n return R.isNil(attrInSerie);\n }, attributes);\n\nconst getCellCombinedSeries = (attributes, combinations) =>\n R.reduce(\n (acc, comb) => {\n const values = R.reduce(\n (acc, concept) => {\n if (R.has(concept, comb.fixedDimValues || {})) {\n return R.append(R.prop(concept, comb.fixedDimValues), acc);\n }\n if (R.has(concept, attributes || {})) {\n return R.append(R.path([concept, 'value'], attributes), acc);\n }\n return acc;\n },\n [],\n comb.concepts,\n );\n\n if (R.isEmpty(values)) {\n return acc;\n }\n return R.append({ ...R.pick(['id', 'name'], comb), values }, acc);\n },\n [],\n combinations,\n );\n\n// combinations = { cells, layout };\nexport const getCells =\n (customAttributes, cellsAttributesId, combinations, attributesSeries, metadataCoordinates) =>\n observations => {\n const attributesInLayoutCombination = R.pipe(\n R.propOr([], 'layout'),\n R.pluck('concepts'),\n R.unnest,\n )(combinations);\n\n const attributesInCellsCombination = R.pipe(\n R.propOr([], 'cells'),\n R.pluck('concepts'),\n R.unnest,\n )(combinations);\n\n const _customAttributes = R.over(R.lensProp('notes'), notes =>\n R.pipe(R.concat, R.uniq)(notes || [], attributesInLayoutCombination),\n )(customAttributes);\n\n return R.mapObjIndexed(obs => {\n const isAttrCell = R.pathOr('OBS_VAL', ['indexedDimValIds', 'OBS_ATTR'], obs) !== 'OBS_VAL';\n const relevantAttributes = isAttrCell\n ? []\n : getCellRelevantAttributes(obs.attributes, attributesSeries, cellsAttributesId);\n const flagsAndNotes = isAttrCell\n ? []\n : getFlagsAndNotes(\n R.omit(attributesInCellsCombination, relevantAttributes),\n _customAttributes,\n );\n const combinedSeries = isAttrCell\n ? []\n : getCellCombinedSeries(relevantAttributes, combinations.cells || []);\n const hasAdvancedAttributes = isAttrCell\n ? false\n : R.pipe(\n R.omit(\n R.unnest([\n _customAttributes.flags || [],\n _customAttributes.notes || [],\n attributesInCellsCombination,\n ]),\n ),\n res => !R.isEmpty(res),\n )(relevantAttributes);\n\n const advancedAttributes = R.omit(\n R.unnest([\n _customAttributes.flags || [],\n _customAttributes.notes || [],\n attributesInCellsCombination,\n ]),\n R.filter(attr => !R.isNil(attr.value), obs.attributes),\n );\n\n const hasMetadata = isAttrCell\n ? false\n : hasCellMetadata(metadataCoordinates, obs.indexedDimValIds);\n\n return {\n ...R.pick(['indexedDimValIds', 'key'], obs),\n flags: R.concat(flagsAndNotes, combinedSeries),\n sideProps:\n hasAdvancedAttributes || hasMetadata\n ? { hasMetadata, coordinates: obs.indexedDimValIds, advancedAttributes }\n : null,\n intValue: R.is(Number, obs.value) ? obs.value : null,\n value: obs.formattedValue,\n };\n }, observations);\n };\n","import * as R from 'ramda';\n\nexport const hasCellMetadata = (metadataCoordinates, cellCoordinates) => {\n if (R.propOr('OBS_VALUE', 'OBS_ATTRIBUTES', cellCoordinates) !== 'OBS_VALUE') {\n return false;\n }\n return R.pipe(\n R.find(coordinates => {\n const mergedCoord = R.mergeLeft(coordinates, cellCoordinates);\n return !R.isEmpty(coordinates) && R.equals(mergedCoord, cellCoordinates);\n }),\n R.complement(R.isNil),\n )(metadataCoordinates);\n};\n","import * as R from 'ramda';\n\nexport const getCuratedCells = (cells, layout) => {\n const layoutIds = R.map(\n R.pipe(\n R.map(entry =>\n R.has('dimensions', entry) ? R.pluck('id', entry.dimensions || []) : entry.id,\n ),\n R.unnest,\n ),\n )(layout);\n return R.pipe(\n R.values,\n R.reduce((acc, cell) => {\n const keys = R.map(\n R.pipe(\n R.map(dim => {\n const val = R.prop(dim, cell.indexedDimValIds);\n return `${dim}=${val}`;\n }),\n R.join(':'),\n ),\n layoutIds,\n );\n\n return R.over(\n R.lensPath(R.props(['header', 'sections', 'rows'], keys)),\n cells => (R.isNil(cells) ? [cell] : R.append(cell, cells)),\n acc,\n );\n }, {}),\n )(cells);\n};\n","import * as R from 'ramda';\n\nexport const getObservations = sdmxJson =>\n R.pipe(\n R.pathOr({}, ['data', 'dataSets', 0, 'observations']),\n R.mapObjIndexed((observation, observationKey) => {\n const value = R.head(observation);\n const attrValuesIndexes = R.tail(observation);\n const dimValuesIndexes = R.split(':', observationKey);\n\n return {\n key: observationKey,\n value,\n attrValuesIndexes,\n dimValuesIndexes,\n };\n }),\n )(sdmxJson);\n","import * as R from 'ramda';\n\nconst addParentId = (id, ids) => {\n const last = R.last(ids);\n return R.append(R.isNil(last) ? id : `${last}.${id}`, ids);\n};\n\nconst _refineUnconfirmedPaths = paths => R.map(p => [R.head(p)], paths);\n\nconst getHierId = v => (R.isNil(v.parent) || R.isEmpty(v.parent) ? v.id : `${v.parent}.${v.id}`);\n\nexport const applyHierarchicalCodesToDim = (hCodes, dim) => {\n const confirmedHierarchisedChilds = new Set([]);\n let unconfirmedPaths = {};\n\n const indexedValues = R.reduce(\n (acc, val) => {\n if (!val.isSelected) {\n return acc;\n }\n return R.assoc(val.id, val, acc);\n },\n {},\n dim.values || [],\n );\n\n const parseHCodes = (parentsDef, parentsInDim) =>\n R.reduce((acc, hC) => {\n const { codeID, hierarchicalCodes = [] } = hC;\n const hasInDim = R.has(codeID, indexedValues);\n const isUnconfirmed = R.length(parentsInDim) !== R.length(parentsDef);\n const children = parseHCodes(\n R.append(codeID, parentsDef),\n hasInDim ? addParentId(codeID, parentsInDim) : parentsInDim,\n )(hierarchicalCodes);\n if (!hasInDim) {\n return R.concat(acc, children);\n }\n const path = R.join('.', parentsDef);\n let val = {\n ...R.prop(codeID, indexedValues),\n path,\n parents: parentsInDim,\n parent: R.last(parentsInDim),\n children,\n };\n\n if (isUnconfirmed) {\n unconfirmedPaths = R.over(\n R.lensProp(val.id),\n paths => R.append(path, paths || []),\n unconfirmedPaths,\n );\n val = R.assoc('unconfirmed', true, val);\n return R.append(val, acc);\n }\n confirmedHierarchisedChilds.add(codeID);\n return R.append(val, acc);\n }, []);\n\n const parsed = parseHCodes([], [])(hCodes);\n\n const _unconfirmedPaths = R.pipe(\n R.reject(id => confirmedHierarchisedChilds.has(id)),\n ids => R.pick(ids, unconfirmedPaths),\n )(R.keys(unconfirmedPaths));\n\n const refinedUnconfirmedPaths = _refineUnconfirmedPaths(_unconfirmedPaths);\n\n const flattenDescendants = R.reduce((acc, val) => {\n const children = flattenDescendants(val.children || []);\n return R.concat(acc, R.prepend(val, children));\n }, []);\n\n const isValid = val =>\n !val.unconfirmed || val.path === R.head(refinedUnconfirmedPaths[val.id] || []);\n\n const refineCodes = R.reduce((acc, hC) => {\n const _flatDescendants = flattenDescendants(hC.children);\n const flatDescendants = R.prepend(hC, _flatDescendants);\n\n const valids = R.filter(isValid, flatDescendants);\n\n if (R.isEmpty(valids)) {\n return acc;\n }\n const refined = R.pipe(\n R.reduce((_acc, v) => {\n confirmedHierarchisedChilds.add(v.id);\n const prev = R.last(_acc);\n const parents = R.pipe(\n p => (R.isNil(p) ? [] : R.append(getHierId(p), prev.parents || [])),\n R.filter(id => R.includes(id, v.parents)),\n )(prev);\n const rV = {\n ...R.omit(['unconfirmed', 'children', 'path'], v),\n parents,\n parent: R.isEmpty(parents) ? undefined : R.last(parents),\n };\n return R.append(rV, _acc);\n }, []),\n )(valids);\n return R.concat(acc, refined);\n }, []);\n\n const refined = refineCodes(parsed);\n\n const missingValues = R.pipe(\n R.keys,\n R.filter(id => !confirmedHierarchisedChilds.has(id)),\n ids => R.props(ids, indexedValues),\n R.map(v => ({ ...v, parents: [], parent: undefined })),\n R.sortBy(R.propOr(-1, '__indexPosition')),\n )(indexedValues);\n\n let hierarchicalIndexes = {};\n return R.pipe(\n R.concat,\n R.addIndex(R.map)((v, ind) => {\n const parents = R.props(v.parents, hierarchicalIndexes);\n const hierId = getHierId(v);\n hierarchicalIndexes[hierId] = ind;\n return {\n ...R.dissoc('path', v),\n parents,\n __indexPosition: ind,\n };\n }),\n values => ({ ...dim, values }),\n )(missingValues, refined);\n};\n","import * as R from 'ramda';\nimport { REPORTING_YEAR_START_DAY, REPYEARSTART } from '../constants';\n\nexport const getReportingYearStart = sdmxJson => {\n const attributes = R.pipe(\n R.pathOr({}, ['data', 'structure', 'attributes']),\n ({ dataSet = [], observation = [], series = [] }) => [...dataSet, ...observation, ...series],\n )(sdmxJson);\n\n const reportYearStartAttr =\n R.find(({ id }) => {\n return id === REPORTING_YEAR_START_DAY || id === REPYEARSTART;\n }, attributes) || {};\n const reportYearStart = R.pathOr('--01-01', ['values', 0, 'value'], reportYearStartAttr);\n const [month = '01', day = '01'] = R.match(/[\\d]{2}/g, reportYearStart);\n return { month, day };\n};\n","import * as R from 'ramda';\n\nexport const declineObservationsOverAttributes = (attrsIds, observations) => {\n const obsKeys = R.keys(observations);\n return R.reduce(\n (acc, obsKey) => {\n const obs = R.prop(obsKey, observations);\n const enhancedObs = R.pipe(\n R.over(R.lensProp('orderedDimIndexes'), R.append(0)),\n R.over(R.lensProp('attributes'), R.omit(attrsIds)),\n R.assocPath(['indexedDimValIds', 'OBS_ATTRIBUTES'], 'OBS_VALUE'),\n )(obs);\n return R.addIndex(R.reduce)(\n (_acc, attrId, attrIndex) => {\n const attr = R.pathOr({}, ['attributes', attrId], obs);\n if (\n R.isEmpty(attr) ||\n R.isNil(R.prop('value', attr)) ||\n !R.pathOr(true, ['value', 'display'], attr)\n ) {\n return _acc;\n }\n const declinedKey = `${obsKey}:${attrIndex + 1}`;\n const declined = {\n ...obs,\n attributes: {},\n value: R.prop('value', attr),\n formattedValue: R.prop('value', attr),\n orderedDimIndexes: R.append(attrIndex + 1, obs.orderedDimIndexes),\n indexedDimValIds: {\n ...obs.indexedDimValIds,\n OBS_ATTRIBUTES: attr.id,\n },\n };\n return R.assoc(declinedKey, declined, _acc);\n },\n R.assoc(`${obsKey}:0`, enhancedObs, acc),\n attrsIds,\n );\n },\n {},\n obsKeys,\n );\n};\n","import * as R from 'ramda';\n\nconst registerParsedIndexes = ({ isSameSerie, ...parsed }, register) => {\n const merged = R.mergeWith((a, b) => R.append(a || [], b), parsed, register);\n return { ...merged, isSameSerie };\n};\n\nconst parseParentsIndexesWithPrevious = (parentsIndexes, previousParentsIndexes) => {\n const previousParentsSet = new Set(previousParentsIndexes);\n const lastParentIndexInPrevious = R.findLastIndex(i => previousParentsSet.has(i), parentsIndexes);\n const [rawPresentParentsIndexes, missingParentsIndexes] =\n lastParentIndexInPrevious !== -1\n ? R.splitAt(lastParentIndexInPrevious + 1, parentsIndexes)\n : [[], parentsIndexes];\n const presentParentsIndexes = R.filter(i => previousParentsSet.has(i), rawPresentParentsIndexes);\n return { presentParentsIndexes, missingParentsIndexes };\n};\n\nconst parseSerieIndexesHierarchies = (\n serieIndexes,\n previousSerie,\n dimensions,\n isSameSerie,\n replicate,\n) => {\n return R.addIndex(R.reduce)(\n (acc, _valueIndex, dimensionIndex) => {\n if (R.is(Array, _valueIndex)) {\n const previous = R.isEmpty(previousSerie)\n ? {}\n : R.map(R.nth(dimensionIndex), previousSerie);\n const parsed = parseSerieIndexesHierarchies(\n _valueIndex,\n previous,\n R.pathOr([], [dimensionIndex, 'dimensions'], dimensions),\n acc.isSameSerie,\n replicate,\n );\n return registerParsedIndexes(parsed, acc);\n }\n const valueIndex = Math.abs(_valueIndex);\n const parents = R.pathOr([], [dimensionIndex, 'values', valueIndex, 'parents'], dimensions);\n const previousIndex = R.pipe(R.path(['indexes', dimensionIndex]), i =>\n R.isNil(i) ? -1 : Math.abs(i),\n )(previousSerie);\n const previousParentsIndexes = acc.isSameSerie\n ? R.pipe(\n R.pathOr([], ['parentsIndexes', dimensionIndex]),\n R.append(previousIndex),\n )(previousSerie)\n : [];\n const previousMissingIndexes = acc.isSameSerie\n ? R.pathOr([], ['missingIndexes', dimensionIndex], previousSerie)\n : [];\n /*\n if replicate = true (sections), missing parents insdexes are replicated on each brother nodes not just the first (as empty lines)\n thats why passing previous missing as previous parents in case replicate = false\n */\n const { presentParentsIndexes, missingParentsIndexes } = parseParentsIndexesWithPrevious(\n parents,\n replicate\n ? previousParentsIndexes\n : R.concat(previousParentsIndexes, previousMissingIndexes),\n );\n return registerParsedIndexes(\n {\n parentsIndexes: presentParentsIndexes,\n missingIndexes: missingParentsIndexes,\n isSameSerie: acc.isSameSerie && valueIndex === previousIndex,\n },\n acc,\n );\n },\n { parentsIndexes: [], missingIndexes: [], isSameSerie },\n serieIndexes,\n );\n};\n\nexport const parseSeriesIndexesHierarchies = (\n seriesIndexes,\n dimensions,\n replicateMissing = false,\n) => {\n return R.reduce(\n (acc, { indexes, ...rest }) => {\n const previousSerie = R.last(acc) || {};\n const { isSameSerie, ...parsed } = parseSerieIndexesHierarchies(\n indexes,\n previousSerie,\n dimensions,\n true,\n replicateMissing,\n );\n return R.append({ indexes, ...parsed, ...rest }, acc);\n },\n [],\n seriesIndexes,\n );\n};\n\nexport const parseLayoutIndexesHierarchies = (layoutIndexes, layout) => {\n const header = parseSeriesIndexesHierarchies(layoutIndexes.header, layout.header);\n const sections = R.pipe(R.transpose, ([_sections, _sectionsRows]) => {\n if (R.isNil(_sections)) {\n return [];\n }\n // replicate = true on sections\n const sections = parseSeriesIndexesHierarchies(_sections, layout.sections, true);\n const sectionsRows = R.map(\n rows => parseSeriesIndexesHierarchies(rows, layout.rows),\n _sectionsRows,\n );\n return R.transpose([sections, sectionsRows]);\n })(layoutIndexes.sections);\n\n return { header, sections };\n};\n","import * as R from 'ramda';\nimport { isRefAreaDimension, isTimePeriodDimension } from '../../../rules/src/dimension-utils';\n\nconst getCombinationsNotInLayout = (combinations, layoutIds) => {\n const { header = [], sections = [], rows = [] } = layoutIds;\n const idsInLayout = new Set([...header, ...sections, ...rows]);\n return R.reject(comb => idsInLayout.has(comb.id), combinations);\n};\n\nconst indexCombsRelationships = combinations =>\n R.reduce(\n (acc, comb) => {\n const { id, relationship = [] } = comb;\n return R.assoc(id, relationship, acc);\n },\n {},\n combinations,\n );\n\nconst getLayoutLevelRelationship = indexedRelationships => ids =>\n R.reduce(\n (acc, id) => {\n if (R.has(id, indexedRelationships)) {\n return R.concat(acc, R.prop(id, indexedRelationships));\n }\n return R.append(id, acc);\n },\n [],\n ids,\n );\n\nconst getLayoutRelationships = (indexedRelationships, layoutIds) =>\n R.map(getLayoutLevelRelationship(indexedRelationships), layoutIds);\n\nconst injectCombination = combination => ids => {\n const { id, concepts = [] } = combination;\n const conceptsSet = new Set(concepts);\n let inject = true;\n const refined = R.reduce(\n (acc, i) => {\n if (!conceptsSet.has(i)) {\n return R.append(i, acc);\n }\n if (inject) {\n inject = false;\n return R.append(id, acc);\n }\n return acc;\n },\n [],\n ids,\n );\n return inject ? R.append(id, refined) : refined;\n};\n\nconst getCombinationLevelCompatibility = (layoutRelationships, combination) => {\n const { relationship = [] } = combination;\n const idsInHeaderSet = new Set(layoutRelationships.header);\n const idsInSectionsSet = new Set(layoutRelationships.sections);\n const idsInRowsSet = new Set(layoutRelationships.rows);\n const [idsInHeader, rest] = R.partition(i => idsInHeaderSet.has(i), relationship);\n const [idsInSections, idsInRows] = R.reduce(\n (_acc, id) => {\n if (idsInSectionsSet.has(id)) return R.over(R.lensIndex(0), R.append(id), _acc);\n if (idsInRowsSet.has(id)) return R.over(R.lensIndex(1), R.append(id), _acc);\n return R.over(R.lensIndex(2), R.append(id), _acc);\n },\n [[], [], []],\n rest,\n );\n if (!R.isEmpty(idsInHeader) && R.isEmpty(idsInSections) && R.isEmpty(idsInRows)) {\n return 'header';\n }\n if (!R.isEmpty(idsInHeader)) {\n return null;\n }\n if (!R.isEmpty(idsInSections) && R.isEmpty(idsInRows)) {\n return 'sections';\n }\n if (!R.isEmpty(idsInRows)) {\n return 'rows';\n }\n return 'blank';\n};\n\nconst filterLayoutIds = (indexedCombinations, layoutDimsIds, obsAttributes) => layoutIds => {\n const layoutConcepts = R.map(\n R.reduce((acc, id) => {\n if (R.has(id, indexedCombinations)) {\n return R.concat(acc, R.path([id, 'concepts'], indexedCombinations));\n }\n return R.append(id, acc);\n }, []),\n layoutIds,\n );\n\n return R.mapObjIndexed(\n (ids, level) =>\n R.filter(id => {\n if (id === 'OBS_ATTRIBUTES') {\n return !R.isEmpty(obsAttributes);\n }\n if (R.has(id, indexedCombinations)) {\n const comb = R.prop(id, indexedCombinations);\n const dims = R.filter(i => layoutDimsIds.has(i), comb.concepts);\n if (!R.isEmpty(dims)) {\n return true;\n }\n const oppositeIds =\n level === 'header'\n ? R.concat(R.prop('sections', layoutConcepts), R.prop('rows', layoutConcepts))\n : R.prop('header', layoutConcepts);\n return R.isEmpty(R.intersection(comb.relationship, oppositeIds));\n }\n return layoutDimsIds.has(id);\n }, ids),\n layoutIds,\n );\n};\n\nexport const injectCombinationsInLayout = (combinations, layoutIds, defaultLayoutIds = {}) => {\n const notInLayoutCombs = getCombinationsNotInLayout(combinations, layoutIds);\n if (R.isEmpty(notInLayoutCombs)) {\n return layoutIds;\n }\n const indexedCombsRelationships = indexCombsRelationships(combinations);\n let layoutRelationships = getLayoutRelationships(indexedCombsRelationships, layoutIds);\n const defaultLayoutRelationships = getLayoutRelationships(\n indexedCombsRelationships,\n defaultLayoutIds,\n );\n return R.reduce(\n (acc, comb) => {\n let levelCompatibility = getCombinationLevelCompatibility(layoutRelationships, comb);\n if (R.isNil(levelCompatibility)) {\n return acc;\n }\n if (R.equals('blank', levelCompatibility)) {\n levelCompatibility = getCombinationLevelCompatibility(defaultLayoutRelationships, comb);\n if (R.isNil(levelCompatibility)) {\n return acc;\n }\n levelCompatibility = R.equals('blank', levelCompatibility) ? 'rows' : levelCompatibility;\n }\n\n layoutRelationships[levelCompatibility] = R.concat(\n layoutRelationships[levelCompatibility],\n comb.relationship,\n );\n const ids = injectCombination(comb)(acc[levelCompatibility]);\n return R.assoc(levelCompatibility, ids)(acc);\n },\n layoutIds,\n notInLayoutCombs,\n );\n};\n\nconst getLayoutDimsIds = dimensions =>\n R.reduce((acc, d) => (d.header ? acc : acc.add(d.id)), new Set([]), dimensions);\n\nconst getLayoutCombinations = (combinations, layoutDimsIds, attributes) => {\n const indexedAttributes = R.indexBy(R.prop('id'), attributes);\n return R.reduce(\n (acc, comb) => {\n const { layoutConcepts, relationship } = R.reduce(\n (_acc, concept) => {\n if (layoutDimsIds.has(concept)) {\n return R.map(R.append(concept), _acc);\n }\n if (R.has(concept, indexedAttributes)) {\n const attr = R.prop(concept, indexedAttributes);\n return attr.series\n ? {\n ..._acc,\n relationship: R.concat(_acc.relationship, attr.relationship),\n }\n : _acc;\n }\n return _acc;\n },\n { layoutConcepts: [], relationship: [] },\n comb.concepts || [],\n );\n if (R.isEmpty(relationship)) {\n return acc;\n }\n return R.append({ ...comb, relationship, concepts: layoutConcepts }, acc);\n },\n [],\n combinations,\n );\n};\n\nconst extractConcepts = (ids, indexedCombinations, layoutDimsIds) => {\n const entry = R.find(id => {\n if (R.has(id, indexedCombinations)) {\n const dimId = R.find(\n i => layoutDimsIds.has(i),\n R.pathOr([], [id, 'concepts'], indexedCombinations),\n );\n return !R.isNil(dimId);\n }\n return true;\n }, ids);\n\n const getRelationship = id => {\n if (R.has(id, indexedCombinations)) {\n return R.append(id, R.path([id, 'relationship'], indexedCombinations));\n }\n return [id];\n };\n let indexedRels = R.reduce((acc, id) => R.assoc(id, getRelationship(id), acc), {}, ids);\n\n let relationship = [entry];\n while (!R.isEmpty(indexedRels)) {\n const related = R.pickBy(rels => !R.isEmpty(R.intersection(relationship, rels)), indexedRels);\n if (R.isEmpty(related)) {\n break;\n }\n indexedRels = R.omit(R.keys(related), indexedRels);\n relationship = R.concat(relationship, R.unnest(R.values(related)));\n }\n const set = new Set(relationship);\n return R.partition(id => set.has(id), ids);\n};\n\nconst injectRemainingDimensionsInLayout = (\n layoutIds,\n remainingDims,\n indexedCombinations,\n layoutDimsIds,\n) => {\n let _layout = layoutIds;\n let _remaining = remainingDims;\n\n const dimInRows = R.find(id => {\n if (layoutDimsIds.has(id)) {\n return true;\n }\n const dimId = R.find(\n i => layoutDimsIds.has(i),\n R.pathOr([], [id, 'concepts'], indexedCombinations),\n );\n return !R.isNil(dimId);\n }, _layout.rows);\n\n if (R.isNil(dimInRows)) {\n if (R.isEmpty(_remaining)) {\n const toTakeIn = R.isEmpty(_layout.sections) ? 'header' : 'sections';\n const [extracted, remains] = extractConcepts(\n R.prop(toTakeIn, _layout),\n indexedCombinations,\n layoutDimsIds,\n );\n _layout = { ..._layout, rows: R.concat(_layout.rows, extracted), [toTakeIn]: remains };\n } else {\n _layout = R.over(R.lensProp('rows'), R.append(R.head(_remaining)))(_layout);\n _remaining = R.tail(_remaining);\n }\n }\n if (!R.isEmpty(_remaining)) {\n const hasNoHeader = R.isEmpty(_layout.header);\n const firstRemaining = R.head(_remaining);\n _remaining = hasNoHeader ? R.tail(_remaining) : _remaining;\n _layout = {\n ..._layout,\n sections: R.concat(_layout.sections, _remaining),\n header: hasNoHeader ? [firstRemaining] : _layout.header,\n };\n }\n return _layout;\n};\n\nexport const getTableLayoutIds = (\n defaultLayoutIds,\n currentLayoutIds,\n dimensions,\n attributes,\n combinations,\n) => {\n const layoutDimsIds = getLayoutDimsIds(dimensions);\n const layoutCombinations = getLayoutCombinations(combinations, layoutDimsIds, attributes);\n const isBlank = R.pipe(R.values, R.all(R.isEmpty))(currentLayoutIds);\n\n const combinationsConcepts = R.pipe(\n R.pluck('_concepts'),\n R.unnest,\n ids => new Set(ids),\n )(combinations);\n const obsAttributes = R.filter(\n a => a.series && R.isEmpty(a.relationship || []) && a.display && !combinationsConcepts.has(a),\n attributes,\n );\n const indexedCombinations = R.indexBy(R.prop('id'), layoutCombinations);\n const filteredLayoutIds = filterLayoutIds(\n indexedCombinations,\n layoutDimsIds,\n obsAttributes,\n )(isBlank ? defaultLayoutIds : currentLayoutIds);\n\n const layoutWithCombs = injectCombinationsInLayout(\n layoutCombinations,\n filteredLayoutIds,\n defaultLayoutIds,\n );\n const layoutRelationshipsSets = R.map(\n R.pipe(\n ids => R.pick(ids, indexedCombinations),\n R.values,\n R.pluck('relationship'),\n R.unnest,\n i => new Set(i),\n ),\n layoutWithCombs,\n );\n const layoutConceptsSets = R.pipe(\n R.map(\n R.reduce((acc, id) => {\n if (R.has(id, indexedCombinations)) {\n return R.concat(acc, R.path([id, 'concepts'], indexedCombinations));\n }\n return R.append(id, acc);\n }, []),\n ),\n R.values,\n R.unnest,\n ids => new Set(ids),\n )(layoutWithCombs);\n const defaultLayoutConceptsSets = R.map(ids => new Set(ids), defaultLayoutIds);\n\n const { nextLayout, remaining } = R.reduce(\n (acc, dim) => {\n if (layoutConceptsSets.has(dim.id) || dim.header) {\n return acc;\n }\n if (\n layoutRelationshipsSets.header.has(dim.id) ||\n defaultLayoutConceptsSets.header.has(dim.id)\n ) {\n return R.over(R.lensPath(['nextLayout', 'header']), R.append(dim.id))(acc);\n }\n if (\n layoutRelationshipsSets.sections.has(dim.id) ||\n defaultLayoutConceptsSets.sections.has(dim.id)\n ) {\n return R.over(R.lensPath(['nextLayout', 'sections']), R.append(dim.id))(acc);\n }\n if (layoutRelationshipsSets.rows.has(dim.id) || defaultLayoutConceptsSets.rows.has(dim.id)) {\n return R.over(R.lensPath(['nextLayout', 'rows']), R.append(dim.id))(acc);\n }\n if (isTimePeriodDimension(dim)) {\n return R.over(R.lensPath(['nextLayout', 'header']), R.append(dim.id))(acc);\n }\n if (isRefAreaDimension(dim)) {\n return R.over(R.lensPath(['nextLayout', 'rows']), R.append(dim.id))(acc);\n }\n return R.over(R.lensProp('remaining'), R.append(dim.id))(acc);\n },\n { nextLayout: layoutWithCombs, remaining: [] },\n dimensions,\n );\n\n return injectRemainingDimensionsInLayout(\n nextLayout,\n remaining,\n indexedCombinations,\n layoutDimsIds,\n );\n};\n","import * as R from 'ramda';\n\nexport const getDataflowTooltipAttributesIds = (sdmxJson, defaults = {}) => {\n const dataflowAnnotationsIndexes = R.pathOr([], ['data', 'dataSets', 0, 'annotations'], sdmxJson);\n const dataflowAnnotations = R.props(\n dataflowAnnotationsIndexes,\n R.pathOr([], ['data', 'structure', 'annotations'], sdmxJson),\n );\n\n const flagsAttrAnnotation = R.find(R.propEq('LAYOUT_FLAG', 'type'), dataflowAnnotations);\n const footnotesAttrAnnotation = R.find(R.propEq('LAYOUT_NOTE', 'type'), dataflowAnnotations);\n\n const customFlags = R.pipe(R.propOr('', 'title'), title =>\n R.isNil(title) || R.isEmpty(title) ? [] : R.split(',', title),\n )(flagsAttrAnnotation || {});\n\n const customNotes = R.pipe(\n R.propOr('', 'title'),\n title => (R.isNil(title) || R.isEmpty(title) ? [] : R.split(',', title)),\n notes => R.difference(notes, customFlags),\n )(footnotesAttrAnnotation || {});\n\n const flags = R.isNil(flagsAttrAnnotation)\n ? R.difference(defaults.flags || [], customNotes)\n : customFlags;\n\n const notes = R.isNil(footnotesAttrAnnotation)\n ? R.difference(defaults.notes || [], flags)\n : customNotes;\n\n return { flags, notes };\n};\n","import * as R from 'ramda';\n\nexport const getDimensionValuesIndexes = values =>\n R.addIndex(R.reduce)(\n (acc, value, position) => {\n const sdmxIndex = value.__index;\n return R.over(\n R.lensProp(String(sdmxIndex)),\n R.ifElse(R.isNil, R.always([position]), R.append(position)),\n )(acc);\n },\n {},\n values,\n );\n","import * as R from 'ramda';\n\nexport const getMSDInformations = msdJson => {\n const attributesDefinitions = R.pathOr(\n [],\n [\n 'data',\n 'metadataStructures',\n 0,\n 'metadataStructureComponents',\n 'reportStructures',\n 0,\n 'metadataAttributes',\n ],\n msdJson,\n );\n const indexedConcepts = R.pipe(\n R.pathOr([], ['data', 'conceptSchemes', 0, 'concepts']),\n R.indexBy(R.prop('id')),\n )(msdJson);\n\n const parseAttributes = parent =>\n R.reduce((acc, attribute) => {\n const id = attribute.id;\n const name = R.path([id, 'name'], indexedConcepts);\n const hierarchicalId = parent === '#ROOT' ? id : `${parent}.${id}`;\n const format = R.path(['localRepresentation', 'textFormat', 'textType'], attribute);\n if (R.has('metadataAttributes', attribute)) {\n const collection = parseAttributes(hierarchicalId)(attribute.metadataAttributes);\n return { ...acc, ...collection, [hierarchicalId]: { format, parent, id, name } };\n }\n return R.assoc(hierarchicalId, { format, parent, id, name }, acc);\n }, {});\n\n return { attributes: parseAttributes('#ROOT')(attributesDefinitions) };\n};\n","import * as R from 'ramda';\nimport { combinedValuesDisplay, singleValueDisplay } from '../combinedValuesDisplay';\n\nexport const getTableLabelAccessor = display => content => {\n return R.is(Array, content)\n ? combinedValuesDisplay(display, content)\n : singleValueDisplay(display, content);\n};\n","import * as R from 'ramda';\nimport { declineObservationsOverAttributes } from './declineObservationsOverAttributes';\nimport { getLayout } from './getLayout';\nimport { getSortedLayoutIndexes } from './getSortedLayoutIndexes';\nimport { parseLayoutIndexesHierarchies } from './parseSeriesIndexesHierarchies';\nimport { refineLayoutSize } from './refineLayoutSize2';\nimport { getLayoutData } from './getLayoutData2';\nimport { getCellsAttributesIds } from './getCellsAttributesIds';\nimport { getIndexedCombinationsByDisplay } from './getIndexedCombinationsByDisplay';\nimport { getCells } from './getCells';\nimport { getCuratedCells } from './getCuratedCells';\nimport { getSeriesCombinations } from '../getSeriesCombinations';\nimport { getCellsMetadataCoordinates } from './getCellsMetadataCoordinates';\n\nexport const getTableProps = ({ data, layoutIds, customAttributes, limit, isTimeInverted }) => {\n const {\n observations,\n dimensions,\n combinations,\n oneValueDimensions,\n attributesSeries,\n metadataCoordinates,\n attributes,\n header,\n rejectedDimensions = [],\n } = data;\n\n const obsAttributes = R.filter(\n a => a.series && R.isEmpty(a.relationship) && a.display && !a.combined,\n attributes,\n );\n let dupObs = observations;\n const hasDuplicatedCells = R.pipe(\n R.values,\n R.unnest,\n R.find(R.equals('OBS_ATTRIBUTES')),\n )(layoutIds);\n if (hasDuplicatedCells) {\n const attrsIds = R.pluck('id', obsAttributes);\n dupObs = declineObservationsOverAttributes(attrsIds, observations);\n }\n const seriesCombinations = getSeriesCombinations(combinations, oneValueDimensions);\n const _dims = R.append(\n {\n id: 'OBS_ATTRIBUTES',\n values: R.prepend({ id: 'OBS_VALUE' }, obsAttributes),\n },\n dimensions,\n );\n const layout = getLayout(layoutIds, _dims, seriesCombinations, isTimeInverted);\n const layoutDimsIds = R.map(\n R.reduce((acc, entry) => {\n if (R.has('dimensions', entry)) {\n return R.concat(acc, R.pluck('id', entry.dimensions));\n }\n return R.append(entry.id, acc);\n }, []),\n layout,\n );\n const layoutIndexes = getSortedLayoutIndexes(layout, dupObs, rejectedDimensions);\n const enhancedLayoutIndexes = parseLayoutIndexesHierarchies(layoutIndexes, layout);\n const refinedLayoutIndexes = refineLayoutSize({ layout, observations: dupObs, limit })(\n enhancedLayoutIndexes,\n );\n const layoutData = getLayoutData(refinedLayoutIndexes, layout, {\n metadataCoordinates,\n attributesSeries,\n customAttributes,\n topCoordinates: header.coordinates,\n rejectedDimensions,\n });\n\n const cellsAttributesIds = getCellsAttributesIds(layoutDimsIds, attributes);\n const indexedCombinations = getIndexedCombinationsByDisplay(layout, seriesCombinations);\n const cellsMetadataCoordinates = getCellsMetadataCoordinates(\n metadataCoordinates,\n oneValueDimensions,\n layoutDimsIds,\n );\n const cells = getCells(\n customAttributes,\n cellsAttributesIds,\n indexedCombinations,\n attributesSeries,\n cellsMetadataCoordinates,\n )(dupObs);\n\n return {\n ...layoutData,\n cells: getCuratedCells(cells, layout),\n layout,\n combinations: seriesCombinations,\n };\n};\n","import * as R from 'ramda';\n\nexport const parseHierarchicalCodelist = (sdmxJson, hierarchyId) => {\n const hCodelist = R.pathOr({}, ['data', 'hierarchicalCodelists', 0], sdmxJson);\n const hierarchy = R.find(R.propEq(hierarchyId, 'id'), hCodelist.hierarchies || []);\n\n const getParentedCodes = (codes, parent) => {\n const ids = R.pluck('codeID', codes);\n\n const siblings = R.reduce(\n (acc, code) => {\n if (R.isEmpty(code.hierarchicalCodes || [])) {\n return acc;\n }\n return R.mergeRight(acc, getParentedCodes(code.hierarchicalCodes, code.id));\n },\n {},\n codes,\n );\n\n return { ...siblings, [parent]: ids };\n };\n\n const getChildren = (codes, parents) => {\n const ids = R.pluck('codeID', codes);\n\n const children = R.reduce(\n (acc, code) => {\n if (R.isEmpty(code.hierarchicalCodes || [])) {\n return acc;\n }\n return {\n ...acc,\n ...getChildren(code.hierarchicalCodes, R.append(code.codeID, parents)),\n };\n },\n {},\n codes,\n );\n const key = R.isEmpty(parents) ? '#ROOT' : R.join('.', parents);\n return { ...children, [key]: ids };\n };\n\n return R.pipe(R.propOr([], 'hierarchicalCodes'), codes => getChildren(codes, []))(hierarchy);\n};\n","import * as R from 'ramda';\n\nexport const parseValueHierarchy = (value, previousValue, indexedValues) => {\n const parentsIds = R.propOr([], 'parents', value);\n if (R.isEmpty(parentsIds)) {\n return value;\n }\n const _previousParentsIds = R.propOr([], 'parentsIds', previousValue);\n const previousParentsIds = R.isNil(previousValue)\n ? []\n : R.append(R.prop('id', previousValue), _previousParentsIds);\n const [presentIds, _missingIds] = R.addIndex(R.splitWhen)(\n (val, ind) => R.nth(ind, previousParentsIds) !== val,\n parentsIds,\n );\n const __previousParentsIds = R.pipe(R.propOr([], 'parents'), R.pluck('id'))(previousValue);\n const missingIds = R.pipe(\n R.takeLastWhile(\n id => !R.includes(id, __previousParentsIds) && id !== R.prop('id', previousValue),\n ),\n ids => R.concat(ids, _missingIds),\n )(presentIds);\n const _previousParents = R.propOr([], 'parents', previousValue);\n const previousParents = R.isNil(previousValue)\n ? []\n : R.append(R.pick(['id', 'name'], previousValue), _previousParents);\n const parents = R.takeWhile(p => R.includes(p.id, presentIds), previousParents);\n const missingParents = R.props(missingIds, indexedValues);\n return {\n ...value,\n parents,\n parentsIds,\n missingParents,\n };\n};\n","import * as R from 'ramda';\nimport { getObservations } from '../../rules/src/preparators/getObservations';\nimport { refineDimensions } from './refineDimensions';\nimport { enhanceObservations } from './enhanceObservations';\nimport { parseAttributes } from './parseAttributes';\nimport { getCombinationDefinitions, parseCombinationDefinition } from './getCombinationDefinitions';\nimport { parseCombinations } from './parseCombinations';\nimport { refineAttributes } from './refineAttributes';\nimport { duplicateObs } from './duplicateObservations';\nimport { getMetadataCoordinates } from './getMetadataCoordinates';\nimport { getAttributesSeries } from './getAttributesSeries';\nimport { getManyValuesDimensions } from './getManyValuesDimensions';\nimport { getOneValueDimensions } from './getOneValueDimensions';\nimport { hierarchiseDimensionWithNativeHierarchy } from './hierarchiseDimensionWithNativeHierarchy2';\nimport { getDataflowAttributes } from './getDataflowAttributes';\nimport { getHeaderTitle } from './getHeaderTitle';\nimport { getHeaderSubtitle } from './getHeaderSubtitle';\nimport { getHeaderCombinations } from './getHeaderCombinations';\nimport { getHeaderCoordinates } from './getHeaderCoordinates';\nimport { applyHierarchicalCodesToDim } from './applyHierarchicalCodesToDim';\nimport { getReportingYearStart } from '../../rules/src/preparators/getReportingYearStart';\nimport { getNotDisplayedIds } from './getNotDisplayedIds';\nimport { getAttributes } from './getAttributes';\n\nexport const prepareData = (\n sdmxJson,\n { customAttributes, locale, hierarchies, dataflow, display, defaultCombinations, dataquery },\n) => {\n const dimensions = R.pathOr([], ['data', 'structure', 'dimensions', 'observation'], sdmxJson);\n const annotations = R.pathOr([], ['data', 'structure', 'annotations'], sdmxJson);\n const reportYearStart = getReportingYearStart(sdmxJson);\n const { hiddenValues, hiddenCombinations } = getNotDisplayedIds(annotations);\n const options = { dataquery, hiddenCombinations, hiddenValues, locale, reportYearStart };\n const refinedDimensions = refineDimensions({ annotations, dimensions, options });\n const _attributes = R.pathOr([], ['data', 'structure', 'attributes'], sdmxJson);\n const attributes = getAttributes({ attributes: _attributes, annotations, options });\n const observations = getObservations(sdmxJson);\n let combinations = getCombinationDefinitions(annotations, locale);\n if (R.isEmpty(combinations) && !R.isEmpty(defaultCombinations)) {\n const { concepts, names } = defaultCombinations;\n combinations = parseCombinationDefinition(locale)(concepts, names);\n }\n const metadataCoordinates = getMetadataCoordinates(sdmxJson);\n\n const parsedAttributes = parseAttributes(attributes, refinedDimensions, customAttributes);\n const parsedCombinations = parseCombinations(combinations, parsedAttributes, refinedDimensions);\n const seriesCombinations = R.filter(R.prop('series'), parsedCombinations);\n const refinedAttributes = refineAttributes(parsedAttributes, seriesCombinations);\n\n const enhancedObservations = enhanceObservations(\n refinedDimensions,\n observations,\n refinedAttributes,\n { customAttributes },\n );\n const attributesSeries = getAttributesSeries(enhancedObservations);\n const manyValuesDimensions = getManyValuesDimensions(\n refinedDimensions,\n attributesSeries,\n customAttributes,\n seriesCombinations,\n );\n const oneValueDimensions = getOneValueDimensions(refinedDimensions, parsedAttributes);\n const rejectedDimensions = R.filter(R.prop('rejected'), dimensions);\n const headerCoordinates = getHeaderCoordinates(oneValueDimensions);\n const hierarchisedDimensions = R.map(dim => {\n if (R.isEmpty(R.propOr({}, dim.id, hierarchies))) {\n return hierarchiseDimensionWithNativeHierarchy(dim);\n }\n return applyHierarchicalCodesToDim(R.prop(dim.id, hierarchies), dim);\n }, manyValuesDimensions);\n const duplicatedObservations = duplicateObs(\n R.values(hierarchisedDimensions),\n enhancedObservations,\n );\n\n const dataflowAttributes = getDataflowAttributes(parsedAttributes, parsedCombinations);\n const headerTitle = getHeaderTitle(dataflow, dataflowAttributes, display, customAttributes);\n const headerSubtitle = getHeaderSubtitle(\n oneValueDimensions,\n parsedCombinations,\n customAttributes,\n display,\n );\n const headerCombinations = getHeaderCombinations(\n parsedCombinations,\n oneValueDimensions,\n refinedAttributes,\n display,\n );\n\n return {\n observations: duplicatedObservations,\n dimensions: hierarchisedDimensions,\n combinations: parsedCombinations,\n oneValueDimensions,\n attributesSeries,\n metadataCoordinates,\n attributes: refinedAttributes,\n rejectedDimensions,\n header: {\n title: headerTitle,\n subtitle: headerSubtitle,\n combinations: headerCombinations,\n coordinates: headerCoordinates,\n },\n };\n};\n","import * as R from 'ramda';\n\nexport const sdmx_3_0_DataFormatPatch = sdmxJson => {\n const dataSet = R.pipe(R.pathOr({}, ['data', 'dataSets']), R.head)(sdmxJson);\n const structureIndex = R.prop('structure', dataSet);\n const structure = R.pipe(R.pathOr([], ['data', 'structures']), R.nth(structureIndex))(sdmxJson);\n\n return R.set(R.lensPath(['data', 'structure']), structure)(sdmxJson);\n};\n","import * as R from 'ramda';\nimport { H_SYMBOL, SCATTER, STACKED_BAR, STACKED_ROW, V_SYMBOL } from './constants';\nimport {\n getCombinationDefinitions,\n refineDimensions,\n parseCombinationDefinition,\n} from '../../rules2/src';\nimport { getReportingYearStart } from './/preparators/getReportingYearStart';\n\nconst isTableLayoutCompatible = (data, layout, combinationsDefinitions = [], dataquery = '') => {\n const indexedCombinations = R.indexBy(R.prop('id'), combinationsDefinitions);\n const reportYearStart = getReportingYearStart(data);\n const indexedManyValuesDimensions = R.pipe(\n R.pathOr([], ['structure', 'dimensions', 'observation']),\n dimensions => refineDimensions({ dimensions, options: { dataquery, reportYearStart } }),\n R.reject(d => R.prop('header', d) || !R.length(d.values || [])),\n R.indexBy(R.prop('id')),\n )(data);\n let remainings = indexedManyValuesDimensions;\n const layoutIds = R.pipe(R.values, R.unnest)(layout);\n let hasFoundIrrelevant = false;\n R.forEach(id => {\n if (R.has(id, indexedManyValuesDimensions)) {\n remainings = R.dissoc(id, remainings);\n } else if (R.has(id, indexedCombinations)) {\n remainings = R.omit(R.pathOr([], [id, 'concepts'], indexedCombinations), remainings);\n } else if (id !== 'OBS_ATTRIBUTES') {\n hasFoundIrrelevant = true;\n }\n }, layoutIds);\n return R.isEmpty(remainings) && !hasFoundIrrelevant;\n};\n\nconst isScatterLayoutCompatible = (data, chartDimension) => {\n const { id, xId, yId } = chartDimension;\n\n const dimensions = R.pathOr([], ['structure', 'dimensions', 'observation'], data);\n\n const dimension = R.find(R.propEq(id, 'id'), dimensions);\n if (R.isNil(dimension)) {\n return false;\n }\n return R.pipe(\n R.propOr([], 'values'),\n R.indexBy(R.prop('id')),\n R.pick([xId, yId]),\n R.values,\n R.length,\n R.equals(2),\n )(dimension);\n};\n\nconst isSymbolLayoutCompatible = (data, chartDimension) => {\n const { id, serie } = chartDimension;\n const serieIds = R.pluck('id', serie);\n\n return R.pipe(\n R.pathOr([], ['structure', 'dimensions', 'observation']),\n R.indexBy(R.prop('id')),\n R.pathOr([], [id, 'values']),\n R.indexBy(R.prop('id')),\n R.pick(serieIds),\n R.values,\n R.length,\n R.equals(R.length(serieIds)),\n )(data);\n};\n\nconst isStackedLayoutCompatible = (data, chartDimension) => {\n const { id } = chartDimension;\n\n return R.pipe(\n R.pathOr([], ['structure', 'dimensions', 'observation']),\n R.filter(R.pipe(R.propOr([], 'values'), R.length, R.lt(1))),\n R.indexBy(R.prop('id')),\n R.has(id),\n )(data);\n};\n\nconst isChartLayoutCompatible = (data, type, chartDimension) => {\n return R.cond([\n [R.always(R.equals(SCATTER, type)), isScatterLayoutCompatible],\n [R.always(R.equals(H_SYMBOL, type) || R.equals(V_SYMBOL, type)), isSymbolLayoutCompatible],\n [\n R.always(R.anyPass([R.equals(STACKED_BAR), R.equals(STACKED_ROW)])(type)),\n isStackedLayoutCompatible,\n ],\n [R.T, R.T],\n ])(data, chartDimension);\n};\n\nexport const isSharedLayoutCompatible = (sdmxData, sharedData) => {\n const type = R.prop('type', sharedData);\n if (type === 'table') {\n const layoutIds = R.pathOr({}, ['config', 'table', 'layoutIds'], sharedData);\n const dataquery = R.path(['config', 'sdmxSource', 'dataquery'], sharedData);\n const annotations = R.pathOr({}, ['structure', 'annotations'], sdmxData);\n const locale = R.pathOr({}, ['config', 'table', 'locale'], sharedData);\n const rawDefaultCombinationsDefinition = R.pathOr(\n {},\n ['config', 'defaultCombinations'],\n sharedData,\n );\n const { concepts = '', names = '' } = rawDefaultCombinationsDefinition;\n const defaultCombinationsDefinition = parseCombinationDefinition(locale)(concepts, names);\n const customCombinationsDefinitions = getCombinationDefinitions(annotations, locale);\n const combinationsDefinitions =\n R.isNil(customCombinationsDefinitions) || R.isEmpty(customCombinationsDefinitions)\n ? defaultCombinationsDefinition\n : customCombinationsDefinitions;\n return isTableLayoutCompatible(sdmxData, layoutIds, combinationsDefinitions, dataquery);\n }\n const chartDimension = R.pathOr({}, ['config', 'chart', 'chartDimension'], sharedData);\n return isChartLayoutCompatible(sdmxData, type, chartDimension);\n};\n","import * as R from 'ramda';\nimport numeral from 'numeral';\n\nconst isValidNumber = R.both(R.is(Number), R.complement(R.equals(NaN)));\n\nexport const getCellValue = observation => {\n const value = R.prop('value', observation);\n if (R.is(Boolean, value)) {\n return value;\n }\n if (R.is(String, value)) {\n const monthMatch = value.match(/^--([\\d]{2})$/);\n if (R.is(Array, monthMatch)) {\n return R.nth(1, monthMatch);\n }\n const monthDayMatch = value.match(/^--([\\d]{2}-[\\d]{2})$/);\n if (R.is(Array, monthDayMatch)) {\n return R.nth(1, monthDayMatch);\n }\n const dayMatch = value.match(/^---([\\d]{2})$/);\n if (R.is(Array, dayMatch)) {\n return R.nth(1, dayMatch);\n }\n return value;\n }\n const scale = Number(observation.prefscale);\n const formatScale = R.ifElse(\n R.always(isValidNumber(scale)),\n value =>\n numeral(value)\n .multiply(Math.pow(10, -1 * Number(scale)))\n .value(),\n R.identity,\n );\n const formatSeparator = value => numeral(value).format(`0,0.[0000000]`);\n const decimals = Number(observation.decimals);\n const formatDecimals = R.ifElse(\n R.always(isValidNumber(decimals)),\n value =>\n numeral(value).format(\n R.ifElse(\n R.equals(0),\n R.always('0,0'),\n d => `0,0.${R.join('', R.times(R.always('0'), d))}`,\n )(decimals),\n ),\n formatSeparator,\n );\n const res = R.ifElse(\n isValidNumber,\n R.pipe(formatScale, formatDecimals),\n R.always('..'),\n )(observation.value);\n return res;\n};\n","import * as R from 'ramda';\nimport numeral from 'numeral';\nimport * as dateFns from 'date-fns';\nimport isMonday from 'date-fns/isMonday';\nimport isTuesday from 'date-fns/isTuesday';\nimport isWednesday from 'date-fns/isWednesday';\nimport isThursday from 'date-fns/isThursday';\nimport isFriday from 'date-fns/isFriday';\nimport isSaturday from 'date-fns/isSaturday';\nimport isSunday from 'date-fns/isSunday';\nimport getISOWeek from 'date-fns/getISOWeek';\nimport { getLocale, dateWithoutTZ } from '../date';\nimport {\n BAR,\n CHORO,\n H_SYMBOL,\n ROW,\n SCATTER,\n STACKED_BAR,\n STACKED_ROW,\n TIMELINE,\n V_SYMBOL,\n} from '../constants';\n\nconst defaultTimeFormats = {\n A: 'yyyy',\n S: 'yyyy-',\n Q: \"yyyy-'Q'Q\",\n M: 'yyyy-MMM',\n W: \"yyyy-'W'II\",\n B: \"yyyy-'W'II\",\n D: 'yyyy-MM-dd',\n H: 'yyyy-MM-dd[T]HH:mm:ss',\n N: 'yyyy-MM-dd[T]HH:mm:ss',\n};\n\nexport const getTimeProc = (frequency, timeFormats = {}, locale) => {\n if (frequency === 'W' || frequency === 'B') {\n return datum => {\n const isoWeek = getISOWeek(datum);\n if (isoWeek !== 1) {\n return dateFns.format(datum, \"yyyy-'W'II\", { locale: getLocale(locale) });\n }\n const seventhDay = dateFns.endOfWeek(datum, { weekStartsOn: 1 });\n return dateFns.format(seventhDay, \"yyyy-'W'II\", { locale: getLocale(locale) });\n };\n }\n const format = R.pipe(\n R.mergeRight(defaultTimeFormats),\n R.ifElse(R.has(frequency), R.prop(frequency), R.prop('A')),\n )(timeFormats);\n return datum =>\n dateFns.format(dateWithoutTZ(new Date(datum)), format, { locale: getLocale(locale) });\n};\n\nconst getTimeFrequency = data => {\n const frequency = R.prop('frequency', data);\n if (frequency === 'W' || frequency === 'B') {\n const date = R.pathOr(['series', 0, 'datapoints', 'x']);\n return R.cond([\n [isMonday, R.always('monday')],\n [isTuesday, R.always('tueday')],\n [isWednesday, R.always('wednesday')],\n [isThursday, R.always('thursday')],\n [isFriday, R.always('friday')],\n [isSaturday, R.always('saturday')],\n [isSunday, R.always('sunday')],\n [R.T, R.always('monday')],\n ])(date);\n }\n return R.cond([\n [R.equals('A'), R.always('year')],\n [R.equals('S'), R.always('month')],\n [R.equals('Q'), R.always('month')],\n [R.equals('M'), R.always('month')],\n [R.equals('D'), R.always('day')],\n [R.equals('H'), R.always('hour')],\n [R.equals('N'), R.always('minute')],\n [R.T, R.always('year')],\n ])(frequency);\n};\n\nconst getTimeStep = R.cond([\n [R.equals('A'), R.always(1)],\n [R.equals('S'), R.always(6)],\n [R.equals('Q'), R.always(3)],\n [R.equals('M'), R.always(1)],\n [R.equals('W'), R.always(1)],\n [R.equals('B'), R.always(1)],\n [R.equals('D'), R.always(1)],\n [R.equals('H'), R.always(1)],\n [R.equals('N'), R.always(1)],\n [R.T, R.always(1)],\n]);\n\nexport const getAxisOptions = (data, type, options, timeFormats, locale) => {\n const axis = {\n linear: { pivot: { color: 'white' } },\n ordinal: { gap: 0.3, padding: 0.3 },\n thickness: 0,\n };\n\n const linearProc = d => {\n if (Math.abs(d) < 0.01 && d) {\n return numeral(d).format('0.[00]e+0');\n }\n return numeral(d).format('0,0.[00]');\n };\n\n return R.pipe(\n R.propOr({}, 'axis'),\n R.mergeDeepRight({ x: axis, y: axis }),\n R.cond([\n [\n R.always(R.equals(BAR, type)),\n R.pipe(\n R.mergeDeepRight({\n x: { format: { proc: R.identity }, tick: { thickness: 0, size: 0 } },\n y: {\n font: { baseline: 'ideographic' },\n format: { proc: linearProc },\n padding: 10,\n tick: { thickness: 0 },\n },\n }),\n R.over(R.lensPath(['y', 'linear', 'pivot', 'value']), R.when(R.isNil, R.always(0))),\n ),\n ],\n [\n R.always(R.equals(ROW, type)),\n R.pipe(\n R.mergeDeepRight({\n x: {\n format: { proc: linearProc },\n orient: 'top',\n padding: 10,\n tick: { thickness: 0 },\n },\n y: {\n format: { proc: R.identity },\n ordinal: { minDisplaySize: 300 },\n tick: { thickness: 0, size: 0 },\n },\n }),\n R.over(R.lensPath(['x', 'linear', 'pivot', 'value']), R.when(R.isNil, R.always(0))),\n ),\n ],\n [\n R.always(R.equals(SCATTER, type)),\n R.mergeDeepRight({\n x: {\n format: { proc: linearProc },\n tick: { thickness: 0, size: 0 },\n },\n y: {\n font: { baseline: 'ideographic' },\n format: { proc: linearProc },\n padding: 10,\n tick: { thickness: 0 },\n },\n }),\n ],\n [\n R.always(R.equals(TIMELINE, type)),\n R.pipe(\n R.mergeDeepRight({\n x: {\n format: {\n isTime: true,\n pattern: null,\n proc: getTimeProc(R.prop('frequency', data), timeFormats, locale),\n },\n tick: { size: -6, minorSize: -3, thickness: 2, minorThickness: 2, color: 'white' },\n },\n y: {\n font: { baseline: 'ideographic' },\n format: { proc: d => numeral(d).format('0,0.[00]') },\n padding: 10,\n tick: { thickness: 0 },\n },\n }),\n R.evolve({\n x: R.pipe(\n R.set(R.lensPath(['linear', 'frequency']), getTimeFrequency(data)),\n R.set(R.lensPath(['linear', 'step']), getTimeStep(R.prop('frequency', data))),\n R.over(\n R.lensPath(['tick', 'step']),\n R.pipe(\n R.when(R.isNil, R.always(1)),\n R.multiply(getTimeStep(R.prop('frequency', data))),\n ),\n ),\n ),\n }),\n ),\n ],\n [\n R.always(R.equals(H_SYMBOL, type)),\n R.mergeDeepRight({\n x: {\n format: { proc: linearProc },\n orient: 'top',\n padding: 10,\n tick: { thickness: 0 },\n },\n y: {\n format: { proc: R.identity },\n ordinal: { minDisplaySize: 300 },\n tick: { thickness: 0, size: 5 },\n },\n }),\n ],\n [\n R.always(R.equals(V_SYMBOL, type)),\n R.mergeDeepRight({\n x: { format: { proc: R.identity }, tick: { thickness: 0, size: 0 } },\n y: {\n font: { baseline: 'ideographic' },\n format: { proc: linearProc },\n padding: 10,\n tick: { thickness: 0 },\n },\n }),\n ],\n [\n R.always(R.equals(STACKED_BAR, type)),\n R.pipe(\n R.mergeDeepRight({\n x: { format: { proc: R.identity }, tick: { thickness: 0, size: 0 } },\n y: {\n font: { baseline: 'ideographic' },\n format: { proc: linearProc },\n padding: 10,\n tick: { thickness: 0 },\n },\n }),\n R.over(R.lensPath(['y', 'linear', 'pivot', 'value']), R.when(R.isNil, R.always(0))),\n ),\n ],\n [\n R.always(R.equals(STACKED_ROW, type)),\n R.pipe(\n R.mergeDeepRight({\n x: {\n format: { proc: linearProc },\n orient: 'top',\n padding: 10,\n tick: { thickness: 0 },\n },\n y: {\n format: { proc: R.identity },\n ordinal: { minDisplaySize: 300 },\n tick: { thickness: 0, size: 0 },\n },\n }),\n R.over(R.lensPath(['x', 'linear', 'pivot', 'value']), R.when(R.isNil, R.always(0))),\n ),\n ],\n [R.T, R.identity],\n ]),\n )(options);\n};\n","import * as R from 'ramda';\nimport {\n BAR,\n CHORO,\n H_SYMBOL,\n ROW,\n SCATTER,\n STACKED_BAR,\n STACKED_ROW,\n TIMELINE,\n V_SYMBOL,\n} from '../constants';\n\nexport const getBaseOptions = (type, options) =>\n R.pipe(\n R.propOr({}, 'base'),\n R.cond([\n [\n R.always(R.equals(BAR, type)),\n R.mergeDeepRight({\n minDisplayHeight: 100,\n minDisplayWidth: 300,\n padding: { top: 20 },\n innerPadding: { left: 20, right: 20, bottom: 10 },\n }),\n ],\n [\n R.always(R.equals(ROW, type)),\n R.mergeDeepRight({\n minDisplayHeight: 300,\n minDisplayWidth: 100,\n padding: { top: 10, left: 10, right: 20 },\n }),\n ],\n [\n R.always(R.equals(SCATTER, type)),\n R.mergeDeepRight({\n minDisplayHeight: 100,\n minDisplayWidth: 100,\n padding: { top: 40, right: 10 },\n }),\n ],\n [\n R.always(R.equals(TIMELINE, type)),\n R.mergeDeepRight({\n minDisplayHeight: 300,\n minDisplayWidth: 100,\n isAnnotated: false,\n padding: { top: 20 },\n innerPadding: { left: 40, right: 40 },\n }),\n ],\n [\n R.always(R.equals(H_SYMBOL, type)),\n R.mergeDeepRight({\n minDisplayHeight: 300,\n minDisplayWidth: 100,\n padding: { top: 10, left: 10, right: 20 },\n }),\n ],\n [\n R.always(R.equals(V_SYMBOL, type)),\n R.mergeDeepRight({\n minDisplayHeight: 100,\n minDisplayWidth: 300,\n padding: { top: 20 },\n innerPadding: { left: 20, right: 20, bottom: 10 },\n }),\n ],\n [\n R.always(R.equals(STACKED_BAR, type)),\n R.mergeDeepRight({\n minDisplayHeight: 100,\n minDisplayWidth: 300,\n padding: { top: 20 },\n innerPadding: { left: 20, right: 20, bottom: 10 },\n }),\n ],\n [\n R.always(R.equals(STACKED_ROW, type)),\n R.mergeDeepRight({ padding: { top: 10, left: 10, right: 20 } }),\n ],\n [R.T, R.identity],\n ]),\n )(options);\n","import * as R from 'ramda';\nimport {\n BAR,\n CHORO,\n H_SYMBOL,\n ROW,\n STACKED_BAR,\n STACKED_ROW,\n TIMELINE,\n V_SYMBOL,\n} from '../constants';\n\nexport const getGridOptions = (type, options) => {\n const grid = { baselines: [0], color: 'white' };\n const hideGrid = R.assoc('thickness', 0);\n\n return R.pipe(\n R.propOr({}, 'grid'),\n R.mergeDeepRight({ x: grid, y: grid }),\n R.cond([\n [R.always(R.equals(BAR, type)), R.mergeDeepRight({ x: { thickness: 0 } })],\n [R.always(R.equals(ROW, type)), R.mergeDeepRight({ y: { thickness: 0 } })],\n [R.always(R.equals(TIMELINE, type)), R.mergeDeepRight({ x: { thickness: 0 } })],\n [R.always(R.equals(H_SYMBOL, type)), R.mergeDeepRight({ y: { thickness: 0 } })],\n [R.always(R.equals(V_SYMBOL, type)), R.mergeDeepRight({ x: { thickness: 0 } })],\n [R.always(R.equals(STACKED_BAR, type)), R.mergeDeepRight({ x: { thickness: 0 } })],\n [R.always(R.equals(STACKED_ROW, type)), R.mergeDeepRight({ y: { thickness: 0 } })],\n [R.T, R.identity],\n ]),\n )(options);\n};\n","import * as R from 'ramda';\nimport numeral from 'numeral';\nimport { format } from 'date-fns';\nimport {\n BAR,\n CHORO,\n H_SYMBOL,\n ROW,\n SCATTER,\n STACKED_BAR,\n STACKED_ROW,\n TIMELINE,\n V_SYMBOL,\n} from '../constants';\nimport { getTimeProc } from './getAxisOptions';\n\nexport const getTooltipOptions = (data, type, options, fonts = {}, timeFormats = {}, locale) => {\n const primaryFonts = color => `\n font-size: ${R.pathOr(12, ['primary', 'fontSize'], fonts)}px;\n font-family: ${R.pathOr('inherit', ['primary', 'fontFamily'], fonts)};\n font-weight: ${R.pathOr('normal', ['primary', 'fontWeight'], fonts)};\n color: ${color};\n padding: 5px;\n border: 1px solid ${color};\n background: white;\n opacity: .8;\n `;\n\n const secondaryFonts = `\n font-family: ${R.pathOr('inherit', ['secondary', 'fontFamily'], fonts)};\n font-size: ${R.pathOr(12, ['secondary', 'fontSize'], fonts)}px;\n font-weight: ${R.pathOr('normal', ['secondary', 'fontWeight'], fonts)};\n `;\n\n const valueFormatter = d => numeral(d).format('0,0.[00]');\n\n const timeFormatter = R.pipe(\n R.prop('frequency'),\n freq => getTimeProc(freq, timeFormats, locale),\n R.when(\n R.anyPass([R.isNil, R.complement(R.is)(Function)]),\n R.always(date => format(date, 'MMM YY')),\n ),\n )(data);\n\n return R.pipe(\n R.pathOr({}, ['serie', 'tooltip']),\n R.cond([\n [\n R.always(R.equals(BAR, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.x}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${datum.formatedValue || valueFormatter(datum.y)}\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(ROW, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.y}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${datum.formatedValue || valueFormatter(datum.x)}\n </div>\n <div>\n `,\n }),\n ],\n [\n R.always(R.equals(SCATTER, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${R.pipe(R.propOr({}, 'dimensionValues'), R.values, R.pluck('name'), R.join(' '))(datum)}\n </div>\n <div style=\"text-align: right;\">\n ${R.path(['dimensionValues', 'x', 'name'], serie)}\n <span style=\"${secondaryFonts}\">\n ${datum.xFormat || valueFormatter(datum.x)}\n </span>\n </div>\n <div style=\"text-align: right;\">\n ${R.path(['dimensionValues', 'y', 'name'], serie)}\n <span style=\"${secondaryFonts}\">\n ${datum.yFormat || valueFormatter(datum.y)}\n </span>\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(TIMELINE, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${R.pipe(R.propOr({}, 'dimensionValues'), R.values, R.pluck('name'), R.join('<br />'))(datum)}\n </div>\n <div style=\"text-align: right;\">\n ${datum.timeLabel}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${datum.formatedValue || valueFormatter(datum.y)}\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(H_SYMBOL, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.y}\n <br />\n ${datum.symbolValue}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${datum.formatedValue || valueFormatter(datum.x)}\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(V_SYMBOL, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.x}\n <br />\n ${datum.symbolValue}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${datum.formatedValue || valueFormatter(datum.y)}\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(STACKED_BAR, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.x}\n </div>\n <div style=\"text-align: right;\">\n ${datum.layerLabel}\n </div>\n <div style=\"text-align: right; font-size: ${R.pathOr(12, ['secondary', 'fontSize'], fonts)}px;\">\n Value:\n <span style=\"${secondaryFonts}\">\n ${R.is(Function, datum.formater) ? datum.formater(datum.height) : valueFormatter(datum.height)}\n </span>\n </div>\n <div style=\"text-align: right; font-size: ${R.pathOr(12, ['secondary', 'fontSize'], fonts)}px;\">\n Cumulated:\n <span style=\"${secondaryFonts}\">\n ${R.is(Function, datum.formater) ? datum.formater(datum.y) : valueFormatter(datum.y)}\n </span>\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(STACKED_ROW, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${datum.y}\n </div>\n <div style=\"text-align: right;\">\n ${datum.layerLabel}\n </div>\n <div style=\"text-align: right; font-size: ${R.pathOr(12, ['secondary', 'fontSize'], fonts)}px;\">\n Value:\n <span style=\"${secondaryFonts}\">\n ${R.is(Function, datum.formater) ? datum.formater(datum.width) : valueFormatter(datum.width)}\n </span>\n </div>\n <div style=\"text-align: right; font-size: ${R.pathOr(12, ['secondary', 'fontSize'], fonts)}px;\">\n Cumulated:\n <span style=\"${secondaryFonts}\">\n ${R.is(Function, datum.formater) ? datum.formater(datum.x) : valueFormatter(datum.x)}\n </span>\n </div>\n </div>\n `,\n }),\n ],\n [\n R.always(R.equals(CHORO, type)),\n R.mergeRight({\n layout: (serie, datum, color) => `\n <div style=\"${primaryFonts(color)}\">\n <div style=\"text-align: right;\">\n ${R.pathOr('', ['properties', 'label'], datum)}\n </div>\n <div style=\"text-align: right;\">\n ${R.pathOr('', ['properties', 'category'], datum)}\n </div>\n <div style=\"text-align: right; ${secondaryFonts}\">\n ${R.pipe(R.pathOr(null, ['properties', 'value']), valueFormatter)(datum)}\n </div>\n </div>\n `,\n }),\n ],\n [R.T, R.identity],\n ]),\n )(options);\n};\n","import * as R from 'ramda';\nimport numeral from 'numeral';\nimport { getAxisOptions } from './getAxisOptions';\nimport { getBaseOptions } from './getBaseOptions';\nimport { getGridOptions } from './getGridOptions';\nimport { getTooltipOptions } from './getTooltipOptions';\nimport { SCATTER, STACKED_BAR, STACKED_ROW, TIMELINE } from '../constants';\n\nconst FOCUS_COLORS = {\n highlightColors: [\n '#E73741',\n '#0F8FD9',\n '#993484',\n '#DF521E',\n '#719E24',\n '#E1B400',\n '#32A674',\n '#0B68AF',\n ],\n baselineColors: ['#0B1E2D'],\n};\n\nconst symbolMarkers = () => {\n const paths = {\n circle: size => {\n const r = Math.sqrt(size) / 2;\n return `M0,${r} A${r},${r} 0 1,1 0,${-r} A${r},${r} 0 1,1 0,${r} Z`;\n },\n square: size => {\n const r = Math.sqrt(size) / 2;\n return `M${-r},${-r} L${r},${-r} ${r},${r} ${-r},${r} Z`;\n },\n cross: size => {\n const r = Math.sqrt(size) / 2;\n return `M${-r},${r} L${r},${-r} M${r},${r} L${-r},${-r}`;\n },\n triangle: size => {\n const rx = Math.sqrt(size) / Math.sqrt(3);\n const ry = Math.sqrt(size) / 2;\n return `M0,${-ry} L${rx},${ry} ${-rx},${ry} Z`;\n },\n };\n return [\n { style: { stroke: '#39617D', fill: '#39617D' }, path: paths.circle },\n { style: { stroke: '#39617D', fill: '#DBEBF2' }, rotate: 45, path: paths.square },\n { style: { stroke: '#39617D', fill: '#39617D', strokeWidth: 2 }, path: paths.cross },\n { style: { stroke: '#39617D', fill: '#DBEBF2' }, path: paths.square },\n { style: { stroke: '#39617D', fill: '#39617D' }, path: paths.triangle },\n ];\n};\n\nconst getAnnotationOptions = (type, options) =>\n R.pipe(\n R.pathOr({}, ['serie', 'annotation']),\n R.mergeRight({\n format: {\n datapoint: { proc: d => numeral(d).format('0,0.[00]') },\n },\n }),\n R.cond([\n [R.always(R.equals(SCATTER, type)), R.mergeRight({ display: 'never' })],\n [\n R.always(R.equals(TIMELINE, type)),\n R.mergeDeepRight({ format: { datapoint: { pattern: '.2f' } } }),\n ],\n [R.T, R.identity],\n ]),\n )(options);\n\nexport const getChartOptions = (data, type, options, tooltipFonts, timeFormats, locale) => {\n const defaultSerieColors = R.ifElse(\n R.anyPass([R.equals(STACKED_BAR), R.equals(STACKED_ROW)]),\n R.always(['#607D8B']),\n R.always(['#8EA4B1']),\n )(type);\n\n return {\n axis: getAxisOptions(data, type, options, timeFormats, locale),\n background: R.pipe(R.propOr({}, 'background'), R.mergeRight({ color: '#DBEBF2' }))(options),\n base: getBaseOptions(type, options),\n grid: getGridOptions(type, options),\n map: R.pipe(R.propOr({}, 'map'), R.mergeRight({ intBoundariesColor: '#8EA4B1' }))(options),\n serie: {\n ...R.propOr({}, 'serie', options),\n annotation: getAnnotationOptions(type, options),\n choropleth: R.pipe(\n R.pathOr({}, ['serie', 'choropleth']),\n R.mergeRight({\n divisions: 4,\n domain: 'YlorRd',\n invert: false,\n labelDisplay: 'none',\n }),\n )(options),\n stacked: R.pipe(\n R.pathOr({}, ['serie', 'stacked']),\n R.mergeRight({ strokeThickness: 1, strokeColor: '#F8FAFC' }),\n )(options),\n symbol: R.pipe(\n R.pathOr({}, ['serie', 'symbol']),\n R.mergeRight({\n markers: symbolMarkers(),\n markerDefaultSize: 60,\n markerDefaultStrokeWidth: 1,\n gapMinMaxColor: '#607D8B',\n gapMinMaxThickness: 1,\n gapAxisMinColor: 'white',\n gapAxisMinThickness: 1,\n }),\n )(options),\n colors: R.pathOr(defaultSerieColors, ['serie', 'colors'], options),\n overColors: R.pathOr(['#39617D'], ['serie', 'overColors'], options),\n highlightColors: R.pathOr(\n FOCUS_COLORS.highlightColors,\n ['serie', 'highlightColors'],\n options,\n ),\n baselineColors: R.pathOr(FOCUS_COLORS.baselineColors, ['serie', 'baselineColors'], options),\n tooltip: getTooltipOptions(data, type, options, tooltipFonts, timeFormats, locale),\n },\n };\n};\n","import sampleFocus from './sample-focus';\nimport scatterFocus from './scatter-focus';\nimport timelineFocus from './timeline-focus';\n\nexport default ({ type, series, focusOptions }) => {\n switch (type) {\n case 'ScatterChart':\n return scatterFocus(series, focusOptions);\n case 'TimelineChart':\n return timelineFocus(series, focusOptions);\n case 'BarChart':\n case 'RowChart':\n case 'StackedBarChart':\n case 'StackedRowChart':\n case 'HorizontalSymbolChart':\n case 'VerticalSymbolChart':\n return sampleFocus(series, focusOptions);\n default:\n return series;\n }\n};\n","import * as R from 'ramda';\n\nexport default function focus(series, focusSelections) {\n const { highlight = [], baseline = [] } = focusSelections || {};\n if (R.isEmpty(highlight) && R.isEmpty(baseline)) {\n return series;\n }\n\n return R.over(\n R.lensPath([0, 'datapoints']),\n R.map(dp => {\n const isFocusMatch = f => {\n const focusedDim = R.path(['options', 'dimensionId'], f);\n const dpValId = R.path(['dimensionValues', focusedDim, 'id'], dp);\n return dpValId === R.path(['options', 'dimensionValueId'], f);\n };\n return {\n ...dp,\n highlightIndex: R.findIndex(isFocusMatch, highlight),\n baselineIndex: R.head(baseline) && isFocusMatch(R.head(baseline)) ? 0 : -1,\n };\n }),\n series,\n );\n}\n","import * as R from 'ramda';\n\nexport default function focus(series, focusSelections) {\n const { highlight = [], baseline = [] } = focusSelections || {};\n\n return R.map(\n serie => ({\n ...serie,\n highlightIndex: R.findIndex(R.propEq(serie.key, 'value'), highlight),\n baselineIndex: R.path([0, 'value'], baseline) === serie.key ? 0 : -1,\n }),\n series,\n );\n}\n","import * as R from 'ramda';\n\nexport default function focus(series, focusSelections) {\n const { highlight = [], baseline = [] } = focusSelections || {};\n if (R.isEmpty(highlight) && R.isEmpty(baseline)) {\n return series;\n }\n\n return R.over(\n R.lensPath([0, 'datapoints']),\n R.map(dp => ({\n ...dp,\n highlightIndex: R.findIndex(R.propEq(dp.key, 'value'), highlight),\n baselineIndex: R.path([0, 'value'], baseline) === dp.key ? 0 : -1,\n })),\n series || [],\n );\n}\n","import * as R from 'ramda';\nimport { CHORO, OBS_TYPE_NUMBER, OBS_TYPE_NUMERICAL_STRING, TIMELINE, TYPES } from '../constants';\nimport { getRefAreaDimension, getTimePeriodDimension } from '../dimension-utils';\nimport { getObservationsType } from './getObservationsType';\n\nexport const getAvailableChartTypes = data => {\n const observationsType = getObservationsType(data);\n if (!R.includes(observationsType, [OBS_TYPE_NUMBER, OBS_TYPE_NUMERICAL_STRING])) {\n return {};\n }\n const dimensions = R.pathOr([], ['structure', 'dimensions', 'observation'], data);\n const timeDimension = getTimePeriodDimension(dimensions);\n const refAreaDimension = getRefAreaDimension(dimensions);\n const hasNoTime = R.anyPass([R.isNil, R.pipe(R.propOr([], 'values'), R.length, R.gte(1))])(\n timeDimension,\n );\n return R.pipe(\n R.when(R.always(hasNoTime), R.omit([TIMELINE])),\n R.when(R.always(R.isNil(refAreaDimension)), R.omit([CHORO])),\n )(TYPES);\n};\n","import * as R from 'ramda';\nimport { OBS_TYPE_NUMBER, OBS_TYPE_NUMERICAL_STRING, OBS_TYPE_STRING } from '../constants';\n\nexport const getObservationsType = data => {\n if (R.isNil(data)) {\n return undefined;\n }\n const firstObs = R.pipe(\n R.pathOr({}, ['dataSets', 0, 'observations']),\n R.values,\n R.find(obs => R.not(R.either(R.isNil, R.isEmpty)(R.head(obs)))),\n )(data);\n if (R.isNil(firstObs)) {\n return undefined;\n }\n const firstObsValue = R.head(firstObs);\n if (R.is(Number, firstObsValue)) {\n return OBS_TYPE_NUMBER;\n }\n return R.ifElse(\n R.equals(NaN),\n R.always(OBS_TYPE_STRING),\n R.always(OBS_TYPE_NUMERICAL_STRING),\n )(Number(firstObsValue));\n};\n","import getFocusedSeries from './focus';\nimport getSeries from './series';\n\nexport const getChartSeries = ({ type, data, options, singularity, focusOptions }) => {\n const chartSeries = getSeries({ type, data, options, singularity });\n const focusedSeries = getFocusedSeries({ type, series: chartSeries, focusOptions });\n return focusedSeries;\n};\n"],"names":["REF_AREA_ROLES","Set","REF_AREA_IDS","isRefAreaDimension","dimension","has","role","id","getRefAreaDimension","dimensions","R","find","FREQ_DIM_IDS","isTimePeriodDimension","getTimePeriodDimension","parseDisplay","display","isNil","includes","dimensionValueDisplay","accessors","dimensionValue","propOr","name","isEmpty","dimensionValueDisplayAt","index","pathOr","Number","categoryDisplay","splitObservationKey","dimensionsWithValuesIndexedById","rejectedId","pipe","addIndex","reduce","acc","dimensionValueIndex","dimensionIndex","nth","append","join","BAR","ROW","SCATTER","TIMELINE","H_SYMBOL","V_SYMBOL","STACKED_BAR","STACKED_ROW","CHORO","PERCENT","VALUES","TYPES","OBS_TYPE_NUMBER","OBS_TYPE_NUMERICAL_STRING","DEFAULT_PREFSCALE_ATTR_IDS","DEFAULT_DECIMALS_ATTR_IDS","getFormaterAttribute","ids","attributes","attr","getObservationsFormaterAttributes","decimals","prefscale","prop","is","Array","parseAttributeFormaterIds","getObservationFormaterValue","observation","attribute","attributeIndex","attributeValueIndex","makeObservationFormater","formaterValues","_decimals","isNaN","format","concat","repeat","value","numeral","multiply","Math","pow","negate","getObservationFormater","formaterAttributes","tail","getObservationFormaterValues","getFormatedObservation","formater","head","getDatapoints","keys","observations","sortDirection","formaterAttrs","categoryKey","valueKey","map","observationKey","observationValue","splitKey","split","category","categoryIds","formatedValue","key","sortBy","dp","series","datapoints","chartDimension","chartDimensionId","chartDimensionIndex","findIndex","propEq","k","o","oDimensionValuesIndexes","oDimensionValueIndex","_chartDimension","oDimensionValue","dimensionValueIsValid","oPartialKey","reject","_","i","dimensionValues","dimensionValuesIndexes","dimensionsWithValuesIds","dvi","dimensionId","assoc","getDimensionValues","dimensionValueKey","getDimensionValueKey","filter","x","y","values","scatterSeries","xValue","yValue","set","lensPath","timelineSeries","timePeriodDimension","timePeriodDimensionIndex","__index","timePeriodDimensionHasManyPeriods","rawSeries","timePeriodDimensionValueIndex","timePeriod","path","datapoint","start","timeLabel","serieIndex","serie","over","symbolDimension","symbolDimensionId","symbolDimIndex","d","obsKey","obs","obsDimsValsIndexes","symbolValIndex","symbolValId","dpIndex","formatedValues","length","lensIndex","symbolValues","singularity","stackKey","serieDimensionId","serieDimension","layerSeries","_flatDatapoints","mapObjIndexed","splittedKey","layerKey","layerDimensions","memo","_dimensionValue","label","push","flatDatapoints","layeredDatapoints","groupBy","layerFullSeries","layerLimit","Infinity","take","layeredDatapointsKeyedByCategory","indexBy","serieValue","serieValueId","formaters","when","equals","layer","pluck","serieSortedByDataOrder","lensProp","res","of","stackedSeries","mode","_serie","total","v","abs","sum","percentSerie","serieSortedByTotal","choroSeries","topoMap","refAreaDimension","observationsByAreas","splitedKey","areaValueIndex","areaValue","areaId","vals","parseByAreas","topology","areaSelection","topoAreas","topoAreasWithData","areaGeometry","areaObservation","properties","geometries","objects","areas","type","arcs","bbox","transform","getSeries","data","options","formatterIds","indexedDimensions","dim","header","chartType","sampleSeries","symbolSeries","isNumber","input","not","isPositiveNumber","isNaturalInt","test","String","isChart","hasFocus","omit","getDimensionsWithValues","toState","artefact","getPropertyDimension","property","state","getGroupedDimensions","optionParser","option","Object","undefined","artefactToOption","chartDimensionToOption","chartDimensionOptions","typeValidator","sampleFocusTypes","focusComparator","op1","op2","focus","_display","dimOptions","val","dimensionValueId","focusOptions","props","otherFocus","differenceWith","onChangeFocusSelection","_value","toKey","filterFocus","keyedOptions","entry","entryKey","focusStateFromNewProps","highlightState","baselineState","baseline","highlight","getScatterDimension","toScatterState","xVal","yVal","scatterDimension","scatterX","scatterY","toScatterSingularity","xId","yId","isScatter","scatterValueOptions","onChangeScatterDim","newScatterState","scatterStateValueToOption","onChangeScatterVal","valKey","otherValKey","matching","otherOptions","partition","stateOtherValue","getSymbolDimension","isSymbol","toSymbolState","toSymbolSingularity","onChangeSymbolDim","getStackedDimension","stackedModes","isStacked","toStackedState","stackedDimension","stackedMode","toStackedSingularity","limit","onChangeStackedDimension","stackedModeOptions","isStackedDimActive","onChangeStackedMode","hasXLinear","hasYLinear","hasYPivot","xInitialState","computedMaxX","computedMinX","computedStepX","computedPivotX","maxX","minX","pivotX","stepX","yInitialState","computedMaxY","computedMinY","computedStepY","computedPivotY","maxY","minY","pivotY","stepY","toProperties","onChange","isActive","always","getSourceLabel","isCustomInvalid","dataflow","getDataflowName","sourceLabel","stringifySubtitle","toSingularity","toFloat","float","parseFloat","toOption","stateValue","optionValue","getFreqStepOption","inputState","freqStep","getIsHidden","annotations","complement","getFullName","identity","isValidDate","period","and","dateFns","isDate","date","getTime","NaN","Date","dateWithoutTZ","addMinutes","getTimezoneOffset","getLocale","cond","fr","de","es","ar","it","nl","th","T","en","REJECTED_VALUE_IDS","getNotDisplayedCombinations","annotation","splitTitle","title","dId","match","content","getNotDisplayedValues","annot","parsed","_acc","_val","replace","getNotDisplayedIds","converge","hiddenValues","hiddenCombinations","getHCodelistsRefs","references","text","refs","acc2","ref","codelistId","agencyId","code","version","hierarchy","mergeRight","getMetadataCoordinates","sdmxJson","metadataAvailKeys","indexes","a","vIndex","dimIndex","duplicateObs","dims","obsValues","duplicated","groupedObs","indexedDimValIds","enhancedObs","matchingObs","_indexes","dimValuesIndexes","unnest","uniq","list","hierarchiseDimensionWithNativeHierarchy","indexed","grouped","parent","getChildren","parentsIndexes","parentId","childs","child","refined","children","prepend","parseTexts","texts","splitted","parseCombinationDefinition","locale","useWith","titles","codes","concepts","hasPath","getCombinationDefinitions","getFormat","freqDisplay","getEndDate","mult","duration","adder","addSeconds","addHours","addDays","addMonths","addYears","getAdder","endDate","subSeconds","getStartDate","parseISO","dateWithTZ","refineTimePeriod","monthlyFormat","end","toISOString","range","startDate","isValid","timeIndicator","_duration","startMinute","startOfMinute","startHour","startOfHour","startDay","startOfDay","isEqual","getDate","getMonth","computeDisplayFreq","opts","isSameDay","isSameYear","dayFormat","yearFormatMatch","monthFormatMatch","yearFormat","monthFormat","formattedYear","formattedMonths","computeName","getOrder","order","isNonCoded","both","getName","isTimeDimension","reportYearStart","freq","_format","reportedStart","year","getYear","reportStartDate","month","day","nextYear","semester","quarter","isFirstDayOfMonth","week","getReportedTimePeriodLabel","frequency","timeFormat","getValuesEnhanced","hiddenIds","selection","constraints","selectionSet","isConstrained","fallbackId","valueId","getId","valueAnnotations","flip","isHidden","notes","getTimePeriodAttributes","__indexPosition","isSelected","empty","flags","parents","sortWith","timeDimensionSorts","defaultSorts","getDateForSort","ascend","descend","reported","getReportedTimePeriod","reportTimeNote","getReportedTimePeriodNote","isRtl","getAttributes","restOptions","datasetAttributes","obsAttributes","attrAnnotations","refineDimensions","dataquery","selectionIds","isEmptySelection","dimAnnotations","dimConstraints","size","isAllDimHidden","valuesIds","difference","getIsAllDimHidden","rejected","roles","parseAttributes","customAttributes","displayableValuesCount","relationship","seriesDimensions","hasInvalidValues","anyPass","isConceptInvalid","filterValidConcepts","parseCombinations","combinations","parsedAttributes","indexedAttributes","validConceptIds","comb","refinedConcepts","intersection","rejectInvalidConceptIds","displayable_values_count","seriesConcepts","concept","displayableValues","isDisplayable","refineAttributes","seriesCombinations","indexedRelationships","combined","isValidNumber","parseValidNumber","formatValue","formatAttributesIndexes","Boolean","monthMatch","monthDayMatch","dayMatch","valueIndex","getFormatAttributesValues","formatScale","formatDecimals","ifElse","num","displayNum","decimalFormat","times","parseAttributesValues","attrValuesIndexes","attrIndex","coordinates","serieKey","pick","isObs","enhanceObservations","getFormatAttributesIndexes","formattedValue","getAttributesSeries","forEachObjIndexed","dissocPath","assocPath","valueInRes","getFlagsAndNotes","attributesValues","flagsIds","notesIds","getManyValuesDimensions","attributesSeries","combConceptsIds","enhancedValues","attrSeries","hasAdvancedAttributes","getOneValueDimensions","indexedRelevantAttributes","attrValues","getDataflowAttributes","combinationsConceptsIds","getHeaderTitle","getHeaderSubtitle","microdataDimension","combinationsConepts","DEFAULT_REJECTED_SUBTITLE_IDS","getSeriesCombinations","oneValuesDimensions","indexedValues","fixedDimValues","getRefinedMissinParentsLabels","par","singleValueDisplay","missingParents","_combinedValuesDisplay","isDisplayed","isRejected","labels","totalValue","firstValue","combinedValuesDisplay","_ids","getHeaderCombinations","getHeaderCoordinates","oneValueDimensions","getConceptsSet","indexedCombinations","_upper","upper","forEach","c","add","getLayout","_layoutIds","isTimeInverted","layoutIds","sections","rows","applyInversionOnTimeDim","headerConceptsSet","sectionsConceptsSet","getLayoutLevel","_upperIds","_excludedIds","parsedCombination","upperIds","excludedIds","parseCombination","getLayoutPivots","layoutEntry","valIndexGetter","ind","isInverted","last","comparator","firstSerie","secondSerie","firstIndexes","secondIndexes","firstSubIndexes","secondSubIndexes","_size","j","uniqIndexes","getSortedLayoutIndexes","layout","rejectedDims","dimIndexes","headerPivots","sectionsPivots","rejectedPivots","sectionLength","headerIndexes","sectionsIndexes","rejectedIndexes","evolve","sort","sectionIndexes","rowIndexes","splitAt","sectionKey","previousSecKey","_ind","getPivotKey","getCuratedCells","shape","pivots","getPivots","pivot","orderedDimIndexes","indexWithPivots","filterSeries","getHasStillData","removedMissingIndexes","hasStillData","serieParentsSets","p","mIs","filtered","missingIndexes","removed","filteredRemoved","refineSections","extractedKeys","curatedObs","section","getHasRowStillData","row","rowKey","refineHeader","headers","headerKey","pickBy","getSerieLinesCount","flatten","truncateSectionRows","n","sectionsData","truncated","_n","lastSection","rowsLength","truncatedRowsCount","takeLast","r","dropLast","truncateHeader","headerData","lastHeader","columnsCount","extractedKey","getShape","isVertical","refineLayoutSize","layoutIndexes","all","headerDimCount","headerValuesCount","headerCellsCount","rowCellsCount","rowsCount","excess","columnCellsCount","toTruncate","toRefine","segregateLayout","cutLength","divide","ceil","maxCutLength","truncateLayout","dimsLength","_layout","refineLayout","result","getRefinedLayout","getLayoutCoordinatesValidator","layoutCoordinates","topCoordinates","notInTop","getValueData","addCoordinatesToKey","simpleValueDataSetter","valueData","datas","combinedValueDataSetter","addValueToSerieData","dataSetter","serieData","addSimpleValueToSerieData","addCombinedValueToSerieData","getCoordinates","definition","_index","valInd","validator","attrs","getSerieFlagsAndSideProps","metadataCoordinates","layoutAttrValues","hasMetadata","any","getHasAdvancedAttributes","sideProps","getSerieDimensionsData","missingParentsGetter","onGoingSerie","combValuesIndexes","combParentsIndexes","combMissingParentsIndexes","combDimValues","combSerie","_parentsIndexes","missingParentsIndexes","next","conceptId","combineConcepts","getSerieDataWithMissingLines","lines","serieCoordinates","coordinatesValidator","missingParentData","dissoc","topCoordinatesValidator","getLayoutData","rejectedDimensions","rest","sectionSerie","rowsSeries","sectionData","getSerieDataWithoutMissingLines","getCellsAttributesIds","indexedHeaderIds","indexedSectionsIds","indexedRowsIds","idsInHeader","idsNotInSections","idsNotInRows","getCellsMetadataCoordinates","oneValueDimsIds","columnIds","rowsIds","getIndexedCombinationsByDisplay","combsInLayout","combsInCells","cells","getCells","cellsAttributesId","attributesInLayoutCombination","attributesInCellsCombination","_customAttributes","isAttrCell","relevantAttributes","cellAttributeIds","attrInSerie","getCellRelevantAttributes","flagsAndNotes","combinedSeries","getCellCombinedSeries","advancedAttributes","cellCoordinates","mergedCoord","mergeLeft","hasCellMetadata","intValue","cell","getObservations","getHierId","applyHierarchicalCodesToDim","hCodes","confirmedHierarchisedChilds","unconfirmedPaths","parseHCodes","parentsDef","parentsInDim","hC","codeID","hierarchicalCodes","hasInDim","isUnconfirmed","addParentId","paths","_unconfirmedPaths","refinedUnconfirmedPaths","flattenDescendants","unconfirmed","refineCodes","_flatDescendants","flatDescendants","valids","prev","rV","missingValues","hierarchicalIndexes","hierId","getReportingYearStart","dataSet","reportYearStartAttr","declineObservationsOverAttributes","attrsIds","obsKeys","attrId","declinedKey","declined","OBS_ATTRIBUTES","registerParsedIndexes","isSameSerie","register","mergeWith","b","parseSerieIndexesHierarchies","serieIndexes","previousSerie","replicate","_valueIndex","previous","previousIndex","previousParentsIndexes","previousMissingIndexes","presentParentsIndexes","previousParentsSet","lastParentIndexInPrevious","findLastIndex","rawPresentParentsIndexes","parseParentsIndexesWithPrevious","parseSeriesIndexesHierarchies","seriesIndexes","replicateMissing","parseLayoutIndexesHierarchies","transpose","_sections","_sectionsRows","sectionsRows","getLayoutRelationships","getLayoutLevelRelationship","getCombinationLevelCompatibility","layoutRelationships","combination","idsInHeaderSet","idsInSectionsSet","idsInRowsSet","idsInSections","idsInRows","injectCombinationsInLayout","defaultLayoutIds","notInLayoutCombs","idsInLayout","getCombinationsNotInLayout","indexedCombsRelationships","indexCombsRelationships","defaultLayoutRelationships","levelCompatibility","conceptsSet","inject","extractConcepts","layoutDimsIds","dimId","indexedRels","getRelationship","related","rels","defaults","dataflowAnnotationsIndexes","dataflowAnnotations","flagsAttrAnnotation","footnotesAttrAnnotation","customFlags","customNotes","position","sdmxIndex","msdJson","attributesDefinitions","indexedConcepts","hierarchicalId","collection","metadataAttributes","currentLayoutIds","getLayoutDimsIds","layoutCombinations","layoutConcepts","getLayoutCombinations","isBlank","combinationsConcepts","filteredLayoutIds","level","oppositeIds","filterLayoutIds","layoutWithCombs","layoutRelationshipsSets","layoutConceptsSets","defaultLayoutConceptsSets","nextLayout","remaining","remainingDims","_remaining","dimInRows","toTakeIn","extracted","remains","hasNoHeader","firstRemaining","injectRemainingDimensionsInLayout","dupObs","_dims","enhancedLayoutIndexes","refinedLayoutIndexes","layoutData","cellsAttributesIds","cellsMetadataCoordinates","hierarchyId","hCodelist","hierarchies","metadataJson","dimensionGroupAttributes","getDimensionGroupAttributes","notDisplayedIds","components","evolvedKey","vInd","dInd","originalVal","isPresentational","handlerProps","groupedAttrs","indexedAttrs","makeTree","previousValue","parentsIds","_previousParentsIds","previousParentsIds","presentIds","_missingIds","splitWhen","__previousParentsIds","missingIds","takeLastWhile","_previousParents","previousParents","takeWhile","defaultCombinations","refinedDimensions","_attributes","names","parsedCombinations","refinedAttributes","enhancedObservations","manyValuesDimensions","headerCoordinates","hierarchisedDimensions","duplicatedObservations","dataflowAttributes","subtitle","hier","intact","broken","refinedKey","intactIds","refinedBroken","structureIndex","structure","isScatterLayoutCompatible","isSymbolLayoutCompatible","serieIds","isStackedLayoutCompatible","lt","defaultTimeFormats","A","S","Q","M","W","B","D","H","N","getTimeProc","timeFormats","datum","getISOWeek","seventhDay","endOfWeek","weekStartsOn","getTimeFrequency","isMonday","isTuesday","isWednesday","isThursday","isFriday","isSaturday","isSunday","getTimeStep","getAxisOptions","axis","linear","color","ordinal","gap","padding","thickness","linearProc","mergeDeepRight","proc","tick","font","orient","minDisplaySize","isTime","pattern","minorSize","minorThickness","getBaseOptions","minDisplayHeight","minDisplayWidth","top","innerPadding","left","right","bottom","isAnnotated","getGridOptions","grid","baselines","getTooltipOptions","fonts","primaryFonts","secondaryFonts","valueFormatter","Function","xFormat","yFormat","symbolValue","layerLabel","height","width","FOCUS_COLORS","symbolMarkers","circle","sqrt","square","cross","triangle","rx","ry","style","stroke","fill","rotate","strokeWidth","getAnnotationOptions","getFocusedSeries","focusSelections","isFocusMatch","f","focusedDim","highlightIndex","baselineIndex","scatterFocus","timelineFocus","sampleFocus","observationsType","firstObs","either","firstObsValue","getObservationsType","timeDimension","hasNoTime","gte","scale","tooltipFonts","defaultSerieColors","background","base","intBoundariesColor","choropleth","divisions","domain","invert","labelDisplay","stacked","strokeThickness","strokeColor","symbol","markers","markerDefaultSize","markerDefaultStrokeWidth","gapMinMaxColor","gapMinMaxThickness","gapAxisMinColor","gapAxisMinThickness","colors","overColors","highlightColors","baselineColors","tooltip","chartSeries","withCopyright","withLogo","formaterPeriod","sdmxData","sharedData","rawDefaultCombinationsDefinition","defaultCombinationsDefinition","customCombinationsDefinitions","combinationsDefinitions","indexedManyValuesDimensions","remainings","hasFoundIrrelevant","isTableLayoutCompatible","isChartLayoutCompatible","optionsSet","parseSelection","focusState","sampleFocusStateFromNewProps","scatterState","undefinedState","stateScatterX","_scatterX","_scatterY","stateScatterY","scatterStateFromNewProps","symbolState","area","other","time","symbolStateFromNewProps","stackedState","_mode","stackedStateFromNewProps","xLinearState","YLinearState","linearStateFromNewProps","fixedWidth","fixedHeight","responsiveWidth","responsiveHeight","axeX","axeY","linearX","linearY","tickX","step","max","min","toLinearProperties","placeholder","floor","isDefault","onReset","source","logo","checked","copyright"],"mappings":"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"}