@sis-cc/dotstatsuite-components 22.6.0 → 23.0.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.
Files changed (194) hide show
  1. package/dist/bridge-d3-react/src/index.js +1 -2
  2. package/dist/bridge-d3-react/src/index.js.map +1 -1
  3. package/dist/rules/src/chart/getChartOptions.js +1 -1
  4. package/dist/rules/src/chart/getChartOptions.js.map +1 -1
  5. package/dist/rules/src/constants.js +1 -35
  6. package/dist/rules/src/constants.js.map +1 -1
  7. package/dist/rules/src/dimension-utils.js +26 -24
  8. package/dist/rules/src/dimension-utils.js.map +1 -1
  9. package/dist/rules/src/factories/choro-series.js +43 -32
  10. package/dist/rules/src/factories/choro-series.js.map +1 -1
  11. package/dist/rules/src/factories/focus.js +20 -0
  12. package/dist/rules/src/factories/focus.js.map +1 -0
  13. package/dist/rules/src/factories/getChartSeries.js +11 -0
  14. package/dist/rules/src/factories/getChartSeries.js.map +1 -0
  15. package/dist/rules/src/factories/sample-focus.js +14 -18
  16. package/dist/rules/src/factories/sample-focus.js.map +1 -1
  17. package/dist/rules/src/factories/sample-series.js +20 -20
  18. package/dist/rules/src/factories/sample-series.js.map +1 -1
  19. package/dist/rules/src/factories/scatter-focus.js +21 -35
  20. package/dist/rules/src/factories/scatter-focus.js.map +1 -1
  21. package/dist/rules/src/factories/scatter-series.js +5 -5
  22. package/dist/rules/src/factories/scatter-series.js.map +1 -1
  23. package/dist/rules/src/factories/series.js +48 -0
  24. package/dist/rules/src/factories/series.js.map +1 -0
  25. package/dist/rules/src/factories/stacked-series.js +6 -7
  26. package/dist/rules/src/factories/stacked-series.js.map +1 -1
  27. package/dist/rules/src/factories/symbol-series.js +39 -46
  28. package/dist/rules/src/factories/symbol-series.js.map +1 -1
  29. package/dist/rules/src/factories/timeline-focus.js +10 -14
  30. package/dist/rules/src/factories/timeline-focus.js.map +1 -1
  31. package/dist/rules/src/factories/timeline-series.js +37 -41
  32. package/dist/rules/src/factories/timeline-series.js.map +1 -1
  33. package/dist/rules/src/get-values-enhanced.js +6 -0
  34. package/dist/rules/src/get-values-enhanced.js.map +1 -1
  35. package/dist/rules/src/index.js +6 -371
  36. package/dist/rules/src/index.js.map +1 -1
  37. package/dist/rules/src/layout.js +4 -2
  38. package/dist/rules/src/layout.js.map +1 -1
  39. package/dist/rules/src/observation-formater.js +8 -14
  40. package/dist/rules/src/observation-formater.js.map +1 -1
  41. package/dist/rules/src/properties/focus.js +51 -3
  42. package/dist/rules/src/properties/focus.js.map +1 -1
  43. package/dist/rules/src/properties/getHeaderProps.js +2 -53
  44. package/dist/rules/src/properties/getHeaderProps.js.map +1 -1
  45. package/dist/rules/src/properties/index.js +3 -94
  46. package/dist/rules/src/properties/index.js.map +1 -1
  47. package/dist/rules/src/properties/linear.js +4 -4
  48. package/dist/rules/src/properties/linear.js.map +1 -1
  49. package/dist/rules/src/properties/scatter.js +4 -4
  50. package/dist/rules/src/properties/scatter.js.map +1 -1
  51. package/dist/rules/src/properties/stacked.js +5 -7
  52. package/dist/rules/src/properties/stacked.js.map +1 -1
  53. package/dist/rules/src/properties/symbol.js.map +1 -1
  54. package/dist/rules/src/properties/utils.js +11 -12
  55. package/dist/rules/src/properties/utils.js.map +1 -1
  56. package/dist/rules/src/sdmx-data/index.js +2 -27
  57. package/dist/rules/src/sdmx-data/index.js.map +1 -1
  58. package/dist/rules2/src/combinedValuesDisplay.js +2 -2
  59. package/dist/rules2/src/combinedValuesDisplay.js.map +1 -1
  60. package/dist/rules2/src/getAttributes.js +37 -0
  61. package/dist/rules2/src/getAttributes.js.map +1 -0
  62. package/dist/rules2/src/getDataflowTooltipAttributesIds.js +2 -2
  63. package/dist/rules2/src/getDataflowTooltipAttributesIds.js.map +1 -1
  64. package/dist/rules2/src/getHeaderCombinations.js +1 -1
  65. package/dist/rules2/src/getHeaderCombinations.js.map +1 -1
  66. package/dist/rules2/src/getHeaderSubtitle.js +1 -1
  67. package/dist/rules2/src/getHeaderSubtitle.js.map +1 -1
  68. package/dist/rules2/src/getHeaderTitle.js +1 -1
  69. package/dist/rules2/src/getHeaderTitle.js.map +1 -1
  70. package/dist/rules2/src/getMetadataCoordinates.js +1 -1
  71. package/dist/rules2/src/getMetadataCoordinates.js.map +1 -1
  72. package/dist/rules2/src/getNotDisplayedIds.js +1 -1
  73. package/dist/rules2/src/getNotDisplayedIds.js.map +1 -1
  74. package/dist/rules2/src/index.js +1 -0
  75. package/dist/rules2/src/index.js.map +1 -1
  76. package/dist/rules2/src/parseAttributes.js +2 -2
  77. package/dist/rules2/src/parseAttributes.js.map +1 -1
  78. package/dist/rules2/src/parseHierarchicalCodelist.js +1 -1
  79. package/dist/rules2/src/parseHierarchicalCodelist.js.map +1 -1
  80. package/dist/rules2/src/parseMetadataSeries.js +1 -1
  81. package/dist/rules2/src/parseMetadataSeries.js.map +1 -1
  82. package/dist/rules2/src/prepareData.js +10 -3
  83. package/dist/rules2/src/prepareData.js.map +1 -1
  84. package/dist/rules2/src/refineDimensions.js +53 -8
  85. package/dist/rules2/src/refineDimensions.js.map +1 -1
  86. package/dist/rules2/src/table/getCells.js +1 -1
  87. package/dist/rules2/src/table/getCells.js.map +1 -1
  88. package/dist/rules2/src/table/getLayout.js +1 -1
  89. package/dist/rules2/src/table/getLayout.js.map +1 -1
  90. package/dist/rules2/src/table/getTableLayoutIds.js +1 -1
  91. package/dist/rules2/src/table/getTableLayoutIds.js.map +1 -1
  92. package/dist/rules2/src/table/getTableProps.js +0 -1
  93. package/dist/rules2/src/table/getTableProps.js.map +1 -1
  94. package/dist/rules2/src/table/parseValueHierarchy.js.map +1 -1
  95. package/dist/rules2/src/table/refineLayoutSize2.js +1 -1
  96. package/dist/rules2/src/table/refineLayoutSize2.js.map +1 -1
  97. package/dist/rules2/src/utils.js.map +1 -1
  98. package/dist/viewer/src/chart.js +13 -2
  99. package/dist/viewer/src/chart.js.map +1 -1
  100. package/dist/viewer/src/legends/FocusLegend.js +1 -1
  101. package/dist/viewer/src/legends/FocusLegend.js.map +1 -1
  102. package/package.json +6 -5
  103. package/src/bridge-d3-react/src/index.js +0 -1
  104. package/src/rules/src/chart/getChartOptions.js +2 -2
  105. package/src/rules/src/constants.js +0 -35
  106. package/src/rules/src/dimension-utils.js +25 -23
  107. package/src/rules/src/factories/choro-series.js +41 -30
  108. package/src/rules/src/factories/focus.js +17 -0
  109. package/src/rules/src/factories/getChartSeries.js +8 -0
  110. package/src/rules/src/factories/sample-focus.js +14 -18
  111. package/src/rules/src/factories/sample-series.js +20 -20
  112. package/src/rules/src/factories/scatter-focus.js +22 -36
  113. package/src/rules/src/factories/scatter-series.js +8 -8
  114. package/src/rules/src/factories/series.js +45 -0
  115. package/src/rules/src/factories/stacked-series.js +4 -5
  116. package/src/rules/src/factories/symbol-series.js +37 -44
  117. package/src/rules/src/factories/timeline-focus.js +10 -14
  118. package/src/rules/src/factories/timeline-series.js +35 -39
  119. package/src/rules/src/get-values-enhanced.js +6 -0
  120. package/src/rules/src/index.js +7 -384
  121. package/src/rules/src/layout.js +4 -2
  122. package/src/rules/src/observation-formater.js +14 -20
  123. package/src/rules/src/properties/focus.js +50 -2
  124. package/src/rules/src/properties/getHeaderProps.js +1 -53
  125. package/src/rules/src/properties/index.js +2 -93
  126. package/src/rules/src/properties/linear.js +2 -2
  127. package/src/rules/src/properties/scatter.js +4 -4
  128. package/src/rules/src/properties/stacked.js +4 -6
  129. package/src/rules/src/properties/symbol.js +0 -1
  130. package/src/rules/src/properties/utils.js +11 -22
  131. package/src/rules/src/sdmx-data/index.js +2 -31
  132. package/src/rules2/src/combinedValuesDisplay.js +2 -2
  133. package/src/rules2/src/getAttributes.js +34 -0
  134. package/src/rules2/src/getDataflowTooltipAttributesIds.js +2 -2
  135. package/src/rules2/src/getHeaderCombinations.js +1 -1
  136. package/src/rules2/src/getHeaderSubtitle.js +2 -2
  137. package/src/rules2/src/getHeaderTitle.js +1 -1
  138. package/src/rules2/src/getMetadataCoordinates.js +1 -1
  139. package/src/rules2/src/getNotDisplayedIds.js +1 -1
  140. package/src/rules2/src/index.js +1 -0
  141. package/src/rules2/src/parseAttributes.js +2 -2
  142. package/src/rules2/src/parseHierarchicalCodelist.js +1 -1
  143. package/src/rules2/src/parseMetadataSeries.js +1 -1
  144. package/src/rules2/src/prepareData.js +10 -3
  145. package/src/rules2/src/refineDimensions.js +53 -8
  146. package/src/rules2/src/table/getCells.js +2 -2
  147. package/src/rules2/src/table/getLayout.js +2 -2
  148. package/src/rules2/src/table/getTableLayoutIds.js +9 -9
  149. package/src/rules2/src/table/getTableProps.js +0 -1
  150. package/src/rules2/src/table/parseValueHierarchy.js +0 -7
  151. package/src/rules2/src/table/refineLayoutSize2.js +5 -5
  152. package/src/rules2/src/utils.js +0 -11
  153. package/src/viewer/src/app/leg.js +0 -1
  154. package/src/viewer/src/chart.jsx +23 -1
  155. package/src/viewer/src/legends/FocusLegend.jsx +1 -1
  156. package/dist/rules/src/factories/scatter-dimension.js +0 -35
  157. package/dist/rules/src/factories/scatter-dimension.js.map +0 -1
  158. package/dist/rules/src/factories/stacked-dimension.js +0 -32
  159. package/dist/rules/src/factories/stacked-dimension.js.map +0 -1
  160. package/dist/rules/src/factories/symbol-dimension.js +0 -32
  161. package/dist/rules/src/factories/symbol-dimension.js.map +0 -1
  162. package/dist/rules/src/header/getDefaultSubtitle.js +0 -44
  163. package/dist/rules/src/header/getDefaultSubtitle.js.map +0 -1
  164. package/dist/rules/src/header/getHeaderUnits.js +0 -21
  165. package/dist/rules/src/header/getHeaderUnits.js.map +0 -1
  166. package/dist/rules/src/header/getSubtitleFlags.js +0 -47
  167. package/dist/rules/src/header/getSubtitleFlags.js.map +0 -1
  168. package/dist/rules/src/header/getTitleFlags.js +0 -12
  169. package/dist/rules/src/header/getTitleFlags.js.map +0 -1
  170. package/dist/rules/src/properties/errors.js +0 -22
  171. package/dist/rules/src/properties/errors.js.map +0 -1
  172. package/dist/rules/src/properties/getInformationsStateFromNewProps.js +0 -50
  173. package/dist/rules/src/properties/getInformationsStateFromNewProps.js.map +0 -1
  174. package/dist/rules/src/v8-transformer.js +0 -174
  175. package/dist/rules/src/v8-transformer.js.map +0 -1
  176. package/src/bridge-d3-react/src/app.js +0 -64
  177. package/src/bridge-d3-react/src/mock-choro.js +0 -394
  178. package/src/rules/src/factories/scatter-dimension.js +0 -32
  179. package/src/rules/src/factories/stacked-dimension.js +0 -29
  180. package/src/rules/src/factories/symbol-dimension.js +0 -29
  181. package/src/rules/src/header/getDefaultSubtitle.js +0 -40
  182. package/src/rules/src/header/getHeaderUnits.js +0 -17
  183. package/src/rules/src/header/getSubtitleFlags.js +0 -43
  184. package/src/rules/src/header/getTitleFlags.js +0 -8
  185. package/src/rules/src/header/index.js +0 -4
  186. package/src/rules/src/preparators/enhanceObservations.js +0 -152
  187. package/src/rules/src/properties/errors.js +0 -19
  188. package/src/rules/src/properties/getInformationsStateFromNewProps.js +0 -47
  189. package/src/rules/src/properties/information.js +0 -84
  190. package/src/rules/src/v8-transformer.js +0 -177
  191. package/src/rules2/src/getAdvAttrSeriesAtCoordinates.js +0 -29
  192. package/src/rules2/src/getMetadataStructureFromData.js +0 -17
  193. package/src/rules2/src/refineMetadataCoordinates.js +0 -28
  194. package/src/rules2/src/table/getCombinationDimensionsData.js +0 -39
@@ -1,23 +1,24 @@
1
- import { findIndex, get, has, head, isEmpty, isNil, map, reduce, sortBy, split } from 'lodash';
1
+ import * as R from 'ramda';
2
2
  import { getTimePeriodDimension } from '@sis-cc/dotstatsuite-sdmxjs';
3
3
  import { categoryDisplay, dimensionValueDisplayAt } from '../dimension-utils';
4
4
  import { getFormatedObservation } from '../observation-formater';
5
5
 
6
6
  const getDimensionValues = (splitObservationKey, dimensions, dimensionsWithValuesIndexedById, rejectedId, display) => (
7
- reduce(
8
- splitObservationKey,
9
- (memo, dimensionValueIndex, dimensionIndex) => {
10
- const dimension = get(dimensions, `[${dimensionIndex}]`, {});
11
- if (has(dimensionsWithValuesIndexedById, dimension.id) && dimension.id !== rejectedId) {
12
- const dimensionValue = get(dimension, `values[${dimensionValueIndex}]`, {});
13
- memo[dimensionValue.id] = {
14
- ...dimensionValue,
15
- name: dimensionValueDisplayAt(dimension, dimensionValueIndex, display)
16
- }
7
+ R.addIndex(R.reduce)(
8
+ (acc, dimensionValueIndex, dimensionIndex) => {
9
+ const dimension = R.nth(dimensionIndex, dimensions) || {};
10
+ if (R.has(dimension.id, dimensionsWithValuesIndexedById) && dimension.id !== rejectedId) {
11
+ const dimensionValue = R.pathOr({}, ['values', dimensionValueIndex], dimension);
12
+ return R.set(
13
+ R.lensPath([dimensionValue.id, 'name']),
14
+ dimensionValueDisplayAt(dimension, dimensionValueIndex, display),
15
+ acc
16
+ );
17
17
  }
18
- return memo;
18
+ return acc;
19
19
  },
20
- {}
20
+ {},
21
+ splitObservationKey,
21
22
  )
22
23
  );
23
24
 
@@ -27,24 +28,23 @@ const series = (
27
28
  timePeriodDimensionIndex,
28
29
  display, formaterAttrs
29
30
  ) => {
30
- const rawSeries = reduce(
31
- observations,
32
- (memo, o, k) => {
33
- const oDimensionValuesIndexes = split(k, ':');
31
+ const rawSeries = R.reduce(
32
+ (acc, k) => {
33
+ const o = observations[k];
34
+ const oDimensionValuesIndexes = R.split(':', k);
34
35
 
35
- const timePeriodDimension = get(dimensions, `[${timePeriodDimensionIndex}]`);
36
- const timePeriodDimensionValueIndex = oDimensionValuesIndexes[timePeriodDimensionIndex];
37
- const timePeriod = get(timePeriodDimension, `values[${timePeriodDimensionValueIndex}]`);
36
+ const timePeriodDimension = R.nth(timePeriodDimensionIndex, dimensions);
37
+ const timePeriodDimensionValueIndex = R.nth(timePeriodDimensionIndex, oDimensionValuesIndexes);
38
+ const timePeriod = R.path(['values', timePeriodDimensionValueIndex], timePeriodDimension);
38
39
 
39
40
  const datapoint = {
40
41
  x: timePeriod.start,
41
- y: head(o),
42
+ y: R.head(o),
42
43
  timeLabel: timePeriod.name,
43
44
  formatedValue: getFormatedObservation(o, formaterAttrs),
44
45
  dimensionValues: getDimensionValues(
45
46
  oDimensionValuesIndexes, dimensions, dimensionsWithValuesIndexedById, timePeriodDimension.id, display
46
47
  ),
47
- //index: Number(timePeriodDimensionValueIndex)
48
48
  };
49
49
 
50
50
  const category = categoryDisplay(
@@ -53,35 +53,31 @@ const series = (
53
53
  let key = categoryDisplay(
54
54
  oDimensionValuesIndexes, dimensions, dimensionsWithValuesIndexedById, timePeriodDimension.id, 'code'
55
55
  );
56
- if (isNil(key) || isEmpty(key)) {
56
+ if (R.isNil(key) || R.isEmpty(key)) {
57
57
  key = 'uniq-dp';
58
58
  }
59
- const serieIndex = findIndex(memo, serie => serie.key === key);
59
+ const serieIndex = R.findIndex(serie => serie.key === key, acc);
60
60
 
61
- if (serieIndex !== -1) memo[serieIndex].datapoints.push(datapoint);
62
- else memo.push({ datapoints: [datapoint], category, key });
61
+ if (serieIndex !== -1)
62
+ return R.over(R.lensPath([serieIndex, 'datapoints']), R.append(datapoint), acc);
63
63
 
64
- return memo;
64
+ return R.append({ datapoints: [datapoint], category, key }, acc);
65
65
  },
66
- []
66
+ [],
67
+ R.keys(observations),
67
68
  );
68
- return map(
69
+ return R.map(
70
+ serie => ({ ...serie, datapoints: R.sortBy(R.prop('x'), serie.datapoints) }),
69
71
  rawSeries,
70
- serie => ({
71
- ...serie,
72
- datapoints: sortBy(
73
- serie.datapoints,
74
- datapoint => datapoint.x
75
- )
76
- })
77
72
  );
78
73
  };
79
74
 
80
75
  export default ({ observations, dimensions }, dimensionsWithValuesIndexedById, display, formaterAttrs) => {
81
76
  const timePeriodDimension = getTimePeriodDimension({ dimensions });
82
- const timePeriodDimensionIndex = timePeriodDimension ? timePeriodDimension.index : -1;
83
- const timePeriodDimensionHasManyPeriods = !has(dimensionsWithValuesIndexedById, get(timePeriodDimension, 'id'));
84
- if ((timePeriodDimensionIndex === -1) || timePeriodDimensionHasManyPeriods) return [];
77
+ const timePeriodDimensionIndex = timePeriodDimension ? timePeriodDimension.__index : -1;
78
+ const timePeriodDimensionHasManyPeriods = !R.has(R.prop('id', timePeriodDimension), dimensionsWithValuesIndexedById);
79
+ if (!timePeriodDimensionIndex || (timePeriodDimensionIndex === -1) || timePeriodDimensionHasManyPeriods)
80
+ return [];
85
81
 
86
82
  return series(
87
83
  observations, dimensions,
@@ -42,7 +42,9 @@ export const getValuesEnhanced = ({
42
42
  reportYearStart,
43
43
  hiddenIds = {},
44
44
  options = {},
45
+ selection = []
45
46
  }) => {
47
+ const selectionSet = new Set(selection);
46
48
  return R.pipe(
47
49
  R.addIndex(R.map)((value, __index) => {
48
50
  const id = getId(value, `${parent}-${__index}`);
@@ -63,12 +65,16 @@ export const getValuesEnhanced = ({
63
65
  if (isNaN(__indexPosition)) {
64
66
  __indexPosition = getCodeOrder({ annotations: valueAnnotations });
65
67
  }
68
+ const isSelected = selectionSet.has(value.id) || R.isNil(selection)
69
+ || R.isEmpty(selection) || R.isEmpty(R.head(selection));
66
70
  let res = {
67
71
  // names is explicitely skipped because of metadata "standard"
68
72
  // not completely aligned with NSI "standard"
69
73
  // value is explicitely skipped (non-coded) into id
70
74
  ...R.omit(['names', 'value'], value),
71
75
  id,
76
+ isSelected,
77
+ empty: !isSelected,
72
78
  display: !isHidden,
73
79
  start: start ? start.toISOString() : null,
74
80
  flags: notes,
@@ -1,400 +1,23 @@
1
- import {
2
- get, partition, reject, isEmpty, map, compact, size, keyBy, pick, omit, isNil, flatten, reduce,
3
- filter, find, includes, isArray, findIndex, isEqual
4
- } from 'lodash';
5
- import * as R from 'ramda';
6
- import memoizee from 'memoizee';
7
- import __sampleSeries from './factories/sample-series';
8
- import __sampleFocus from './factories/sample-focus';
9
- import __scatterSeries from './factories/scatter-series';
10
- import __scatterFocus from './factories/scatter-focus';
11
- import __scatterDimension from './factories/scatter-dimension';
12
- import __symbolSeries from './factories/symbol-series';
13
- import __symbolDimension from './factories/symbol-dimension';
14
- import __timelineSeries from './factories/timeline-series';
15
- import __timelineFocus from './factories/timeline-focus';
16
- import __stackedSeries from './factories/stacked-series';
17
- import __stackedDimension from './factories/stacked-dimension';
18
- import __choroSeries from './factories/choro-series';
19
- import {
20
- DEFAULT_UPR_IDS, DEFAULT_REJECTED_UPR_VALUES_IDS, DEFAULT_REJECTED_SUBTITLE_IDS,
21
- FREQ_A, FREQ_Q, FREQ_M
22
- } from './constants';
23
- import { dimensionValueDisplay } from './dimension-utils';
24
- import { getObservationsFormaterAttributes } from './observation-formater';
25
-
26
- export const freqA = FREQ_A;
27
- export const freqQ = FREQ_Q;
28
- export const freqM = FREQ_M;
29
-
30
- // --------------------------------------------------------------------------------extractSdmxErrors
31
- const _extractSdmxErrors = (data) => R.compose(
32
- (errors) => map(errors, (error) => ({ label: error.code, description: error.message })),
33
- (data) => get(data, 'errors', [])
34
- );
35
- export const extractSdmxErrors = memoizee(_extractSdmxErrors);
36
-
37
- export const extractDataName = (data) => R.pathOr(null, ['structure', 'name'], data);
38
-
39
- // -----------------------------------------------------------------------------extractSdmxArtefacts
40
- const _extractSdmxArtefacts = (data) => {
41
- const parseStructure = (data) => get(data, 'structure', {});
42
- const parseItem = (item) => parseComponents(get(item, 'observation', []));
43
- const parseDimensions = (structure) => parseItem(get(structure, 'dimensions', {}));
44
- const parseAttributes = (structure) => parseItem(get(structure, 'attributes', {}));
45
- const parseComponents = (components) => map(components, parseComponent);
46
- const parseComponent = (component, index) => {
47
- let parsed = { ...pick(component, 'id', 'name', 'values', 'role', 'isHidden'), index };
48
- if (isEmpty(parsed))
49
- return parsed;
50
- if (isNil(parsed.role))
51
- parsed.role = parsed.id;
52
- parsed.values = R.sortBy(R.prop('__index'))(parsed.values);
53
- return parsed;
54
- };
55
- const parseDatasetItem = (item) => parseComponents(get(item, 'dataSet', []));
56
- const parseDatasetAttributes = (structure) => parseDatasetItem(get(structure, 'attributes', {}));
57
-
58
- return {
59
- attributes: parseAttributes(parseStructure(data)),
60
- datasetAttributes: parseDatasetAttributes(parseStructure(data)),
61
- dimensions: parseDimensions(parseStructure(data)),
62
- id: get(data, 'header.id', null),
63
- name: extractDataName(data),
64
- observations: R.pipe(
65
- R.pathOr({}, ['dataSets', 0, 'observations']),
66
- R.mapObjIndexed(obs => R.over(R.lensIndex(0), val => R.isNil(val) ? null : Number(val))(obs)),
67
- R.reject(R.pipe(R.head, R.anyPass([R.isNil, isNaN]))),
68
- )(data),
69
- source: get(data, 'header.links[0].href', null),
70
- };
71
- };
72
- export const extractSdmxArtefacts = memoizee(_extractSdmxArtefacts);
73
-
74
- const _getRelevantsDatasetAttributes = (data) => {
75
- const { datasetAttributes } = extractSdmxArtefacts(data);
76
- return filter(datasetAttributes, attr => size(attr.values) === 1);
77
- };
78
- export const getRelevantsDatasetAttributes = memoizee(_getRelevantsDatasetAttributes);
79
-
80
- // -------------------------------------------------------------------------------getDimensionValues
81
- export const getDimensionValues = (dimension) => get(dimension, 'values', []);
82
-
83
- // ----------------------------------------------------------------------------------splitDimensions
84
- const _splitDimensions = (data) => {
85
- const { dimensions } = extractSdmxArtefacts(data);
86
- const [value, values] = partition(
87
- reject(dimensions, R.compose(isEmpty, getDimensionValues)),
88
- R.compose((values) => size(values) === 1, getDimensionValues)
89
- );
90
- return { value, values };
91
- }
92
- export const splitDimensions = memoizee(_splitDimensions);
93
-
94
- // ------------------------------------------------------------------dimensionsWithValuesIndexedById
95
- const _dimensionsWithValuesIndexedById = (data) => R.compose(
96
- (dimensionsWithValues) => keyBy(dimensionsWithValues, 'id'),
97
- (split) => split.values,
98
- splitDimensions
99
- )(data);
100
- export const dimensionsWithValuesIndexedById = memoizee(_dimensionsWithValuesIndexedById);
101
-
102
- // -------------------------------------------------------------------------------------parseDisplay
103
- const _parseDisplay = (display) =>
104
- (isNil(display) || !(includes(['both', 'code'], display)))
105
- ? 'label' : display;
106
- export const parseDisplay = memoizee(_parseDisplay);
107
-
108
- // -------------------------------------------------------------------------------------sampleSeries
109
- const _sampleSeries = (data, type, display, formaterIds) => __sampleSeries(
110
- type,
111
- extractSdmxArtefacts(data),
112
- dimensionsWithValuesIndexedById(data),
113
- parseDisplay(display),
114
- getObservationsFormaterAttributes(data, formaterIds)
115
- );
116
- export const sampleSeries = memoizee(_sampleSeries);
117
-
118
- // ---------------------------------------------------------------------------------scatterDimension
119
- const _scatterDimension = (data, ids) => {
120
- const { values } = splitDimensions(data);
121
- return __scatterDimension(values, ids);
122
- };
123
- export const scatterDimension = memoizee(_scatterDimension);
124
-
125
- // ----------------------------------------------------------------------------------symbolDimension
126
- const _symbolDimension = (data, ids) => {
127
- const { values } = splitDimensions(data);
128
- return __symbolDimension(values, ids);
129
- };
130
- export const symbolDimension = memoizee(_symbolDimension);
131
-
132
- const _stackedDimension = (data, singularity) => {
133
- return __stackedDimension(splitDimensions(data), singularity);
134
- }
135
- export const stackedDimension = memoizee(_stackedDimension);
136
-
137
- // ------------------------------------------------------------------------------------scatterSeries
138
- const _scatterSeries = (data, ids, display, formaterIds) => __scatterSeries(
139
- extractSdmxArtefacts(data),
140
- dimensionsWithValuesIndexedById(data),
141
- scatterDimension(data, ids),
142
- parseDisplay(display),
143
- getObservationsFormaterAttributes(data, formaterIds)
144
- );
145
- export const scatterSeries = memoizee(_scatterSeries);
146
-
147
- // -------------------------------------------------------------------------------------symbolSeries
148
- const _symbolSeries = (data, type, ids, display, formaterIds) => __symbolSeries(
149
- extractSdmxArtefacts(data),
150
- type,
151
- dimensionsWithValuesIndexedById(data),
152
- symbolDimension(data, ids),
153
- parseDisplay(display),
154
- getObservationsFormaterAttributes(data, formaterIds)
155
- );
156
- export const symbolSeries = memoizee(_symbolSeries);
157
-
158
- // -----------------------------------------------------------------------------------timelineSeries
159
- const _timelineSeries = (data, display, formaterIds) => __timelineSeries(
160
- extractSdmxArtefacts(data),
161
- dimensionsWithValuesIndexedById(data),
162
- parseDisplay(display),
163
- getObservationsFormaterAttributes(data, formaterIds)
164
- );
165
- export const timelineSeries = memoizee(_timelineSeries);
166
-
167
- const _stackedSeries = (data, singularity, display, formaterIds, [stackKey, categoryKey]) => __stackedSeries(
168
- extractSdmxArtefacts(data),
169
- dimensionsWithValuesIndexedById(data),
170
- stackedDimension(data, singularity),
171
- parseDisplay(display),
172
- getObservationsFormaterAttributes(data, formaterIds),
173
- [stackKey, categoryKey]
174
- );
175
- export const stackedSeries = memoizee(_stackedSeries);
176
-
177
- // --------------------------------------------------------------------------------------choroSeries
178
- const _choroSeries = (data, map, display) => __choroSeries(
179
- extractSdmxArtefacts(data),
180
- dimensionsWithValuesIndexedById(data),
181
- map,
182
- parseDisplay(display)
183
- );
184
- export const choroSeries = memoizee(_choroSeries);
185
-
186
- // -------------------------------------------------------------------------------------------series
187
- const _series = (data, type, focus, singularity, map, display, formaterIds) => {
188
- switch(type) {
189
- case 'RowChart': case 'BarChart':
190
- return __sampleFocus(sampleSeries(data, type, display, formaterIds), focus);
191
- case 'ScatterChart':
192
- return __scatterFocus(scatterSeries(data, singularity, display, formaterIds), focus);
193
- case 'HorizontalSymbolChart': case 'VerticalSymbolChart':
194
- return __sampleFocus(symbolSeries(data, type, singularity, display, formaterIds), focus);
195
- case 'TimelineChart':
196
- return __timelineFocus(timelineSeries(data, display, formaterIds), focus);
197
- case 'StackedBarChart':
198
- return __sampleFocus(stackedSeries(data, singularity, display, formaterIds, ['y', 'x']), focus);
199
- case 'StackedRowChart':
200
- return __sampleFocus(stackedSeries(data, singularity, display, formaterIds, ['x', 'y']), focus);
201
- case 'ChoroplethChart':
202
- return choroSeries(data, map, display);
203
- }
204
- };
205
- export const series = memoizee(_series);
206
-
207
- // -------------------------------------------------------------------------------------------source
208
- const _source = (data, config, meta) => {
209
- const hasSource = get(meta, 'hasSource', true);
210
- if (!hasSource)
211
- return null;
212
- const source = get(config, 'source', null);
213
- if (source && !(isEmpty(source)))
214
- return source;
215
- const artefacts = extractSdmxArtefacts(data);
216
- const uri = get(artefacts, 'source');
217
- if (!uri)
218
- return get(config, 'defaultSource', null);
219
- const match = uri.match(/(^http.*)\/SDMX-JSON\/data\/([^\/]+)\//);
220
- if (size(match) !== 3)
221
- return null;
222
- const [m, domain, dataset] = match;
223
- return `${domain}/Index.aspx?DataSetCode=${dataset}`; //tmp
224
- };
225
- export const source = memoizee(_source);
226
-
227
- // --------------------------------------------------------------------------------------------focus
228
- const _focus = (data, type, dimension, _display) => {
229
- const display = parseDisplay(_display);
230
- switch(type) {
231
- case 'RowChart': case 'BarChart':
232
- case 'HorizontalSymbolChart': case 'VerticalSymbolChart':
233
- case 'StackedBarChart': case 'StackedRowChart':
234
- return R.compose(
235
- (datapoints) => map(datapoints, (dp) => ({ label: dp.category, value: dp.key })),
236
- (series) => series[0].datapoints,
237
- series
238
- )(data, type, null, dimension, null, display);
239
- case 'TimelineChart':
240
- return R.compose(
241
- (series) => map(series, (serie) => ({ label: serie.category, value: serie.key })),
242
- series
243
- )(data, type, null, dimension, null, display)
244
- case 'ScatterChart':
245
- const id = get(dimension, 'id');
246
- if (isNil(id)) return [];
247
- const dimensions = R.compose(
248
- (dimensions) => omit(dimensions, id),
249
- dimensionsWithValuesIndexedById
250
- )(data);
251
- return flatten(map(
252
- dimensions,
253
- (dimension) => {
254
- return map(
255
- get(dimension, 'values'),
256
- (value) => ({
257
- label: `${dimensionValueDisplay(display)(dimension)} - ${dimensionValueDisplay(display)(value)}`,
258
- options: { dimensionId: dimension.id, dimensionValueId: value.id },
259
- value: `${dimension.id}-${value.id}`
260
- })
261
- )
262
- }
263
- ));
264
- }
265
- };
266
- export const focus = memoizee(_focus);
267
-
268
- const _parseFocus = (data, type, dimension, display, { baseline, highlight }) => {
269
- const options = focus(data, type, dimension, display);
270
-
271
- const parseSelection = selection => compact(map(selection, ({ value }) => find(options, option => isEqual(option.value, value))));
272
- return ({ baseline: parseSelection(baseline), highlight: parseSelection(highlight) });
273
- };
274
- export const parseFocus = memoizee(_parseFocus);
275
-
276
- const _defaultSubtitle = (data, display, REJECTED_SUBTITLE_IDS = DEFAULT_REJECTED_SUBTITLE_IDS) => {
277
- const { value } = splitDimensions(data);
278
- const values = reduce(
279
- R.reject(R.prop('isHidden'))(value),
280
- (memo, d) => {
281
- const dvId = get(d, 'values[0].id');
282
- if (!includes(REJECTED_SUBTITLE_IDS, dvId)) {
283
- memo.push(`${dimensionValueDisplay(display)(d)}: ${dimensionValueDisplay(display)(get(d, 'values[0]'))}`);
284
- }
285
- return memo;
286
- },
287
- []
288
- );
289
- return values;
290
- }
291
- export const defaultSubtitle = memoizee(_defaultSubtitle);
292
-
293
- const _uprAttributes = (attributes, UPR_IDS = DEFAULT_UPR_IDS) => (
294
- reduce(
295
- UPR_IDS,
296
- (memo, ids, uprKey) => {
297
- const attr = find(attributes, attribute => includes(ids, get(attribute, 'id')));
298
- if (attr) {
299
- memo[uprKey] = attr;
300
- }
301
- return memo;
302
- },
303
- {}
304
- )
305
- );
306
- export const uprAttributes = memoizee(_uprAttributes);
307
-
308
- const _uprAttributesWithOneRelevantValue = (uprAttributes, UPR_IDS = DEFAULT_UPR_IDS, REJECTED_UPR_VALUES_IDS = DEFAULT_REJECTED_UPR_VALUES_IDS) => reduce(
309
- uprAttributes,
310
- (memo, attr, key) => {
311
- if (size(get(attr, 'values', [])) === 1 && !(includes(REJECTED_UPR_VALUES_IDS[key], get(attr, 'values[0].id', ''))))
312
- memo[key] = attr;
313
- return memo;
314
- },
315
- {}
316
- );
317
- export const uprAttributesWithOneRelevantValue = memoizee(_uprAttributesWithOneRelevantValue);
318
-
319
- export const headerUprsLabel = display => uprAttributes => {
320
- return map(
321
- uprAttributes,
322
- attr => dimensionValueDisplay(display)(get(attr, 'values[0]'))
323
- ).join(', ');
324
- }
325
-
326
- export const getUprs = (data, display) => R.compose(
327
- headerUprsLabel(parseDisplay(display)),
328
- uprAttributesWithOneRelevantValue,
329
- ({ attributes }) => uprAttributes(attributes),
330
- extractSdmxArtefacts
331
- )(data);
332
-
333
- const _header = (data, _title, _subtitle, _display) => {
334
- const display = parseDisplay(_display);
335
- const title = (isNil(_title) || isEmpty(_title)) ? get(data, 'structure.name') : _title;
336
- const subtitle = (isNil(_subtitle) || isEmpty(_subtitle)) ? defaultSubtitle(data, display) : _subtitle;
337
- return ({
338
- title,
339
- subtitle: isArray(subtitle) ? subtitle : [subtitle],
340
- uprs: R.compose(
341
- headerUprsLabel(display),
342
- uprAttributesWithOneRelevantValue,
343
- ({ attributes }) => uprAttributes(attributes),
344
- extractSdmxArtefacts
345
- )(data)
346
- });
347
- };
348
- export const header = memoizee(_header);
349
-
350
- const _sourceLabel = (data, label) => (
351
- (isNil(label) || isEmpty(label)) ? extractSdmxArtefacts(data).name : label
352
- );
353
- export const sourceLabel = memoizee(_sourceLabel);
354
-
355
- const _getTopologyAreasCollections = (topology) => map(topology.objects, (entry, key) => key);
356
- export const getTopologyAreasCollections = memoizee(_getTopologyAreasCollections);
357
-
358
- const _isNonIdealState = (data, type, map) => {
359
- const defaultSeries = series(data, type, null, null, map);
360
- if (type === 'ChoroplethChart')
361
- {
362
- return findIndex(get(defaultSeries, 'objects.areas.geometries', []), geometry => get(geometry, 'properties.value', null)) === -1;
363
- }
364
- return isEmpty(get(defaultSeries, '[0].datapoints', []));
365
- }
366
- export const isNonIdealState = memoizee(_isNonIdealState);
367
-
368
- export { dimensionValueDisplay } from './dimension-utils';
369
- export { DEFAULT_UPR_IDS, DIMENSION_DISPLAY_PARTS, DEFAULT_MAJOR_ATTRIBUTES, V8_SDMX_JSON,
370
- TYPES as chartTypes } from './constants';
1
+ export { dimensionValueDisplay, parseDisplay } from './dimension-utils';
371
2
  export {
372
- initialState,
373
3
  stateFromNewProps,
374
- onChangeProperties,
375
- toChartData,
376
4
  toChartOptions,
377
5
  toProperties,
378
- getErrors,
379
6
  toSingularity
380
7
  } from './properties';
381
- export { dataTransformer as v8Transformer } from './v8-transformer';
382
- export {
383
- getCellValue,
384
- } from './table';
8
+ export { parseFocus } from './properties/focus';
385
9
  export {
386
10
  getFullName,
387
11
  } from './sdmx-data';
388
12
  export { getTimePeriodLabel } from './date';
389
- export { getHeaderProps, getFooterProps, } from './properties/getHeaderProps';
390
- export { getInformationsStateFromNewProps } from './properties/getInformationsStateFromNewProps';
391
- export { getObservationsType } from './properties/getObservationsType';
13
+ export { getFooterProps } from './properties/getHeaderProps';
392
14
  export { getAvailableChartTypes } from './properties/getAvailableChartTypes';
393
15
  export { isSharedLayoutCompatible } from './layout';
394
16
 
395
17
  export { getObservations } from './preparators/getObservations';
396
18
 
397
- export const getFlags = R.identity;
398
- export const prepareData = R.identity;
399
19
 
400
- export { getChartOptions } from './chart/getChartOptions';
20
+ export { getCellValue } from './table';
21
+ export { getChartOptions } from './chart/getChartOptions';
22
+ export { getReportingYearStart } from './preparators/getReportingYearStart';
23
+ export { getChartSeries } from './factories/getChartSeries';
@@ -11,12 +11,14 @@ import {
11
11
  refineDimensions,
12
12
  parseCombinationDefinition
13
13
  } from '../../rules2/src';
14
+ import { getReportingYearStart } from './/preparators/getReportingYearStart';
14
15
 
15
16
  const isTableLayoutCompatible = (data, layout, combinationsDefinitions = [], dataquery = '') => {
16
17
  const indexedCombinations = R.indexBy(R.prop('id'), combinationsDefinitions);
18
+ const reportYearStart = getReportingYearStart(data);
17
19
  const indexedManyValuesDimensions = R.pipe(
18
20
  R.pathOr([], ['structure', 'dimensions', 'observation']),
19
- dimensions => refineDimensions(dimensions, dataquery),
21
+ dimensions => refineDimensions({ dimensions, options: { dataquery, reportYearStart } }),
20
22
  R.reject(d => R.prop('header', d) || !R.length(d.values || [])),
21
23
  R.indexBy(R.prop('id'))
22
24
  )(data);
@@ -43,7 +45,7 @@ const isScatterLayoutCompatible = (data, chartDimension) => {
43
45
 
44
46
  const dimensions = R.pathOr([], ['structure', 'dimensions', 'observation'], data);
45
47
 
46
- const dimension = R.find(R.propEq('id', id), dimensions);
48
+ const dimension = R.find(R.propEq(id, 'id'), dimensions);
47
49
  if (R.isNil(dimension)) {
48
50
  return false;
49
51
  }
@@ -1,18 +1,16 @@
1
- import memoizee from 'memoizee';
2
1
  import numeral from 'numeral';
3
2
  import * as R from 'ramda';
4
- import { extractSdmxArtefacts } from './';
5
3
 
6
- export const DEFAULT_PREFSCALE_ATTR_IDS = ["PREF_SCALE"];
4
+ const DEFAULT_PREFSCALE_ATTR_IDS = ["PREF_SCALE"];
7
5
 
8
- export const DEFAULT_DECIMALS_ATTR_IDS = ["DECIMALS"];
6
+ const DEFAULT_DECIMALS_ATTR_IDS = ["DECIMALS"];
9
7
 
10
- export const getFormaterAttribute = (ids, attributes) => R.find(
8
+ const getFormaterAttribute = (ids, attributes) => R.find(
11
9
  (attr) => R.includes(attr.id, ids),
12
10
  attributes
13
11
  );
14
12
 
15
- export const parseAttributeFormaterIds = (ids = {}) => {
13
+ const parseAttributeFormaterIds = (ids = {}) => {
16
14
  let prefscale = R.prop('prefscale', ids);
17
15
  let decimals = R.prop('decimals', ids);
18
16
  decimals = R.isNil(decimals) ? DEFAULT_DECIMALS_ATTR_IDS : decimals;
@@ -23,30 +21,26 @@ export const parseAttributeFormaterIds = (ids = {}) => {
23
21
  });
24
22
  }
25
23
 
26
- export const _getObservationsFormaterAttributes = (data, ids) => R.pipe(
27
- extractSdmxArtefacts,
28
- ({ attributes }) => {
29
- const { decimals, prefscale } = parseAttributeFormaterIds(ids);
30
- return ({
31
- decimals: getFormaterAttribute(decimals, attributes),
32
- prefscale: getFormaterAttribute(prefscale, attributes)
33
- });
34
- }
35
- )(data);
36
- export const getObservationsFormaterAttributes = memoizee(_getObservationsFormaterAttributes);
24
+ export const getObservationsFormaterAttributes = (attributes = [], ids = {}) => {
25
+ const { decimals, prefscale } = parseAttributeFormaterIds(ids);
26
+ return ({
27
+ decimals: getFormaterAttribute(decimals, attributes),
28
+ prefscale: getFormaterAttribute(prefscale, attributes)
29
+ });
30
+ };
37
31
 
38
- export const getObservationFormaterValue = (observation, attribute) => {
32
+ const getObservationFormaterValue = (observation, attribute) => {
39
33
  const attributeIndex = R.prop('index', attribute);
40
34
  const attributeValueIndex = R.nth(attributeIndex, observation);
41
35
  return R.nth(attributeValueIndex, R.propOr([], 'values', attribute));
42
36
  }
43
37
 
44
- export const getObservationFormaterValues = (formaterAttributes) => (observation) => ({
38
+ const getObservationFormaterValues = (formaterAttributes) => (observation) => ({
45
39
  decimals: getObservationFormaterValue(observation, R.prop('decimals', formaterAttributes)),
46
40
  prefscale: getObservationFormaterValue(observation, R.prop('prefscale', formaterAttributes)),
47
41
  });
48
42
 
49
- export const makeObservationFormater = (formaterValues) => {
43
+ const makeObservationFormater = (formaterValues) => {
50
44
  let prefscale = 0;
51
45
  if (!R.isNil(R.prop('prefscale', formaterValues))) {
52
46
  prefscale = Number(R.propOr('0', 'id', formaterValues.prefscale));