@sis-cc/dotstatsuite-components 17.1.0 → 17.3.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.
@@ -11,10 +11,16 @@ var R = _interopRequireWildcard(_ramda);
11
11
 
12
12
  var _constants = require('./constants');
13
13
 
14
+ var _src = require('../../rules2/src');
15
+
14
16
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
15
17
 
16
18
  var isTableLayoutCompatible = function isTableLayoutCompatible(data, layout) {
17
- var multiValuesDimensions = R.pipe(R.pathOr([], ['structure', 'dimensions', 'observation']), R.reject(R.pipe(R.propOr([], 'values'), R.length, R.gte(1))), R.pluck('id'))(data);
19
+ var dataquery = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
20
+
21
+ var multiValuesDimensions = R.pipe(R.pathOr([], ['structure', 'dimensions', 'observation']), function (dimensions) {
22
+ return (0, _src.refineDimensions)(dimensions, dataquery);
23
+ }, R.reject(R.prop('header')), R.pluck('id'))(data);
18
24
  var dimensionsInLayout = R.pipe(R.values, R.unnest)(layout);
19
25
 
20
26
  var dimensionsLength = R.length(multiValuesDimensions);
@@ -63,7 +69,8 @@ var isSharedLayoutCompatible = exports.isSharedLayoutCompatible = function isSha
63
69
  var type = R.prop('type', sharedData);
64
70
  if (type === 'table') {
65
71
  var layoutIds = R.pathOr({}, ['config', 'table', 'layoutIds'], sharedData);
66
- return isTableLayoutCompatible(sdmxData, layoutIds);
72
+ var dataquery = R.path(['config', 'sdmxSource', 'dataquery'], sharedData);
73
+ return isTableLayoutCompatible(sdmxData, layoutIds, dataquery);
67
74
  }
68
75
  var chartDimension = R.pathOr({}, ['config', 'chart', 'chartDimension'], sharedData);
69
76
  return isChartLayoutCompatible(sdmxData, type, chartDimension);
@@ -27,6 +27,8 @@ var _getReportingYearStart = require('./preparators/getReportingYearStart');
27
27
 
28
28
  var _src = require('../../rules2/src');
29
29
 
30
+ var _refineTimePeriod = require('../../rules2/src/refineTimePeriod');
31
+
30
32
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
31
33
 
32
34
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -78,14 +80,14 @@ var dataTransformer = exports.dataTransformer = function dataTransformer(dataNew
78
80
  end = reported.end;
79
81
  var reportTimeNote = (0, _date.getReportedTimePeriodNote)(reportYearStart, start, end, options.frequency, options.isRtl);
80
82
  notes = R.isNil(reportTimeNote) ? notes : R.append(reportTimeNote, notes);
81
- __indexPosition = _dateFns2.default.getTime(new Date(R.prop('start', value)));
83
+ //__indexPosition = dateFns.getTime(new Date(R.prop('start', value)));
82
84
  }
83
85
  if (isNaN(__indexPosition)) {
84
86
  __indexPosition = (0, _dotstatsuiteSdmxjs.getCodeOrder)({ annotations: valueAnnotations });
85
87
  }
86
88
  var timeFormat = R.prop('timeFormat', options);
87
- return (0, _extends3.default)({}, value, {
88
- id: R.pipe(R.when(R.isNil, R.always(parent + '-' + __index)), R.when(R.always(isTimeDimension), R.replace(/M/g, '')))(value.id),
89
+ var res = (0, _extends3.default)({}, value, {
90
+ id: R.when(R.isNil, R.always(parent + '-' + __index))(value.id),
89
91
  display: !isHidden,
90
92
  name: R.when(R.always(isTimeDimension), R.always((0, _date.getReportedTimePeriodLabel)(options.frequency, timeFormat, locale)(reportYearStart, { id: value.id, reportedStart: start, start: new Date(value.start) })))(name),
91
93
  start: start ? start.toISOString() : null,
@@ -93,7 +95,14 @@ var dataTransformer = exports.dataTransformer = function dataTransformer(dataNew
93
95
  __indexPosition: __indexPosition,
94
96
  __index: __index
95
97
  });
96
- }), R.sortWith([R.ascend(R.prop('__indexPosition')), R.ascend(R.propOr(-1, 'order'))]), R.addIndex(R.map)(function (val, index) {
98
+ return isTimeDimension ? (0, _refineTimePeriod.refineTimePeriod)(res, { locale: locale }) : res;
99
+ }), R.ifElse(R.always(isTimeDimension), R.pipe(R.sortWith([R.ascend(function (val) {
100
+ return _dateFns2.default.getTime(new Date(R.prop('start', val)));
101
+ }), R.descend(function (val) {
102
+ return _dateFns2.default.getTime(new Date(R.prop('end', val)));
103
+ })]), R.addIndex(R.map)(function (val, ind) {
104
+ return R.assoc('__indexcPosition', ind, val);
105
+ })), R.sortWith([R.ascend(R.prop('__indexPosition')), R.ascend(R.propOr(-1, 'order'))])), R.addIndex(R.map)(function (val, index) {
97
106
  return R.assoc('__indexPosition', index, val);
98
107
  }),
99
108
  /* NEW */
@@ -22,7 +22,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
22
22
  var getManyValuesDimensions = exports.getManyValuesDimensions = function getManyValuesDimensions(dimensions, attributesSeries, customAttributes, combinations) {
23
23
  var combConceptsIds = R.pipe(R.pluck('concepts'), R.unnest)(combinations);
24
24
  return R.reduce(function (acc, dim) {
25
- if (R.length(dim.values || []) < 2) {
25
+ if (dim.header) {
26
26
  return acc;
27
27
  }
28
28
  var enhancedValues = R.map(function (val) {
@@ -39,7 +39,7 @@ var getOneValueDimensions = exports.getOneValueDimensions = function getOneValue
39
39
  })(acc);
40
40
  }, {}, attributes);
41
41
  return R.reduce(function (acc, dim) {
42
- if (R.length(dim.values || []) !== 1) {
42
+ if (!dim.header) {
43
43
  return acc;
44
44
  }
45
45
  var attrValues = R.propOr({}, dim.id, indexedRelevantAttributes);
@@ -157,6 +157,15 @@ Object.defineProperty(exports, 'getCombinationDefinitions', {
157
157
  }
158
158
  });
159
159
 
160
+ var _refineDimensions = require('./refineDimensions');
161
+
162
+ Object.defineProperty(exports, 'refineDimensions', {
163
+ enumerable: true,
164
+ get: function get() {
165
+ return _refineDimensions.refineDimensions;
166
+ }
167
+ });
168
+
160
169
  var _parseAttributes = require('./parseAttributes');
161
170
 
162
171
  Object.defineProperty(exports, 'parseAttributes', {
@@ -39,8 +39,8 @@ var parseAttributes = exports.parseAttributes = function parseAttributes(attribu
39
39
  return (0, _extends3.default)({}, res, { series: true, relationship: [] });
40
40
  }
41
41
  var seriesDimensions = R.pipe(R.pathOr([], ['relationship', 'dimensions']), R.filter(function (id) {
42
- var values = R.path([id, 'values'], indexedDimensions);
43
- return R.length(values) > 1;
42
+ var dimension = R.prop(id, indexedDimensions);
43
+ return !dimension.header;
44
44
  }))(attr);
45
45
  if (R.length(seriesDimensions) > 0) {
46
46
  return (0, _extends3.default)({}, res, { series: true, relationship: seriesDimensions });
@@ -42,11 +42,11 @@ var parseCombinations = exports.parseCombinations = function parseCombinations(c
42
42
  return false;
43
43
  }
44
44
  if (R.has(concept, indexedDimensions)) {
45
- var values = R.path([concept, 'values'], indexedDimensions);
46
- relationship = R.length(values) > 1 ? R.append(concept, relationship) : relationship;
45
+ var dimension = R.prop(concept, indexedDimensions);
46
+ relationship = !dimension.header ? R.append(concept, relationship) : relationship;
47
47
  ids = (0, _extends4.default)({}, ids, (0, _defineProperty3.default)({}, concept, concept));
48
- displayable_values_count += R.length(values);
49
- return R.length(values) > 1;
48
+ displayable_values_count += R.length(dimension.values || []);
49
+ return !dimension.header;
50
50
  } else if (!R.has(concept, indexedAttributes)) {
51
51
  return false;
52
52
  }
@@ -11,6 +11,8 @@ var R = _interopRequireWildcard(_ramda);
11
11
 
12
12
  var _src = require('../../rules/src');
13
13
 
14
+ var _refineDimensions = require('./refineDimensions');
15
+
14
16
  var _enhanceObservations = require('./enhanceObservations');
15
17
 
16
18
  var _parseAttributes = require('./parseAttributes');
@@ -53,9 +55,11 @@ var prepareData = exports.prepareData = function prepareData(sdmxJson, _ref) {
53
55
  hierarchies = _ref.hierarchies,
54
56
  dataflow = _ref.dataflow,
55
57
  display = _ref.display,
56
- defaultCombinations = _ref.defaultCombinations;
58
+ defaultCombinations = _ref.defaultCombinations,
59
+ dataquery = _ref.dataquery;
57
60
 
58
61
  var dimensions = R.pathOr([], ['data', 'structure', 'dimensions', 'observation'], sdmxJson);
62
+ var refinedDimensions = (0, _refineDimensions.refineDimensions)(dimensions, dataquery);
59
63
  var attributes = R.pathOr([], ['data', 'structure', 'attributes', 'observation'], sdmxJson);
60
64
  var annotations = R.pathOr([], ['data', 'structure', 'annotations'], sdmxJson);
61
65
  var observations = (0, _src.getObservations)(sdmxJson);
@@ -68,15 +72,15 @@ var prepareData = exports.prepareData = function prepareData(sdmxJson, _ref) {
68
72
  }
69
73
  var metadataCoordinates = (0, _getMetadataCoordinates.getMetadataCoordinates)(sdmxJson);
70
74
 
71
- var parsedAttributes = (0, _parseAttributes.parseAttributes)(attributes, dimensions, customAttributes);
72
- var parsedCombinations = (0, _parseCombinations.parseCombinations)(combinations, parsedAttributes, dimensions);
75
+ var parsedAttributes = (0, _parseAttributes.parseAttributes)(attributes, refinedDimensions, customAttributes);
76
+ var parsedCombinations = (0, _parseCombinations.parseCombinations)(combinations, parsedAttributes, refinedDimensions);
73
77
  var seriesCombinations = R.filter(R.prop('series'), parsedCombinations);
74
78
  var refinedAttributes = (0, _refineAttributes.refineAttributes)(parsedAttributes, seriesCombinations);
75
79
 
76
- var enhancedObservations = (0, _enhanceObservations.enhanceObservations)(dimensions, observations, refinedAttributes, { customAttributes: customAttributes });
80
+ var enhancedObservations = (0, _enhanceObservations.enhanceObservations)(refinedDimensions, observations, refinedAttributes, { customAttributes: customAttributes });
77
81
  var attributesSeries = (0, _getAttributesSeries.getAttributesSeries)(enhancedObservations);
78
- var manyValuesDimensions = (0, _getManyValuesDimensions.getManyValuesDimensions)(dimensions, attributesSeries, customAttributes, seriesCombinations);
79
- var oneValueDimensions = (0, _getOneValueDimensions.getOneValueDimensions)(dimensions, parsedAttributes);
82
+ var manyValuesDimensions = (0, _getManyValuesDimensions.getManyValuesDimensions)(refinedDimensions, attributesSeries, customAttributes, seriesCombinations);
83
+ var oneValueDimensions = (0, _getOneValueDimensions.getOneValueDimensions)(refinedDimensions, parsedAttributes);
80
84
  var headerCoordinates = (0, _getHeaderCoordinates.getHeaderCoordinates)(oneValueDimensions);
81
85
  var hierarchisedDimensions = R.map(function (dim) {
82
86
  if (R.isEmpty(R.propOr({}, dim.id, hierarchies))) {
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.refineDimensions = undefined;
7
+
8
+ var _extends2 = require('babel-runtime/helpers/extends');
9
+
10
+ var _extends3 = _interopRequireDefault(_extends2);
11
+
12
+ var _ramda = require('ramda');
13
+
14
+ var R = _interopRequireWildcard(_ramda);
15
+
16
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ var refineDimensions = exports.refineDimensions = function refineDimensions() {
21
+ var dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
22
+ var dataquery = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
23
+
24
+ var selectionIds = R.pipe(R.split('.'), R.map(R.split('+')))(dataquery);
25
+
26
+ return R.addIndex(R.map)(function (dim, index) {
27
+ var selection = R.nth(index, selectionIds);
28
+ if (R.isNil(selection) || R.length(selection) === 0 || R.isEmpty(R.head(selection))) {
29
+ return (0, _extends3.default)({}, dim, { header: R.length(dim.values || []) <= 1 });
30
+ }
31
+ var values = R.map(function (val) {
32
+ if (R.includes(val.id, selection)) {
33
+ return val;
34
+ }
35
+ return R.assoc('empty', true, val);
36
+ }, dim.values || []);
37
+ return (0, _extends3.default)({}, dim, { values: values, header: R.length(values) <= 1 || R.length(selection) === 1 });
38
+ }, dimensions);
39
+ };
@@ -0,0 +1,146 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.refineTimePeriod = exports.getStartDate = undefined;
7
+
8
+ var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
9
+
10
+ var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
11
+
12
+ var _extends2 = require('babel-runtime/helpers/extends');
13
+
14
+ var _extends3 = _interopRequireDefault(_extends2);
15
+
16
+ var _ramda = require('ramda');
17
+
18
+ var R = _interopRequireWildcard(_ramda);
19
+
20
+ var _dateFns = require('date-fns');
21
+
22
+ var dateFns = _interopRequireWildcard(_dateFns);
23
+
24
+ var _date = require('../../rules/src/date');
25
+
26
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
27
+
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+
30
+ var computeDisplayFreq = function computeDisplayFreq(start, duration) {
31
+ var startMinute = dateFns.startOfMinute(start);
32
+ var startHour = dateFns.startOfHour(start);
33
+ var startDay = dateFns.startOfDay(start);
34
+ if (!dateFns.isEqual(start, startMinute) || duration === 'S') {
35
+ return 'S';
36
+ } else if (!dateFns.isEqual(start, startHour) || !dateFns.isEqual(start, startDay) || duration === 'H' || duration === 'm') {
37
+ return 'm';
38
+ } else if (!dateFns.isFirstDayOfMonth(start) || duration === 'D') {
39
+ return 'D';
40
+ } else if (dateFns.getMonth(start) !== 0 || duration === 'M') {
41
+ return 'M';
42
+ }
43
+ return 'Y';
44
+ };
45
+
46
+ var getAdder = function getAdder(duration) {
47
+ if (duration === 'S') return dateFns.addSeconds;
48
+ if (duration === 'm') return dateFns.addMinutes;
49
+ if (duration === 'H') return dateFns.addHours;
50
+ if (duration === 'D') return dateFns.addDays;
51
+ if (duration === 'M') return dateFns.addMonths;
52
+ return dateFns.addYears;
53
+ };
54
+
55
+ var getFormat = function getFormat(freqDisplay) {
56
+ if (freqDisplay === 'Y') return 'YYYY';
57
+ if (freqDisplay === 'D') return 'YYYY-MM-DD';
58
+ if (freqDisplay === 'H' || freqDisplay === 'm') {
59
+ return 'HH:mm';
60
+ }
61
+ if (freqDisplay === 'S') {
62
+ return 'HH:mm:ss';
63
+ }
64
+ return 'MMM';
65
+ };
66
+
67
+ var getEndDate = function getEndDate(start, mult, duration) {
68
+ var adder = getAdder(duration);
69
+ var endDate = adder(start, Number(mult));
70
+ var startTZ = start.getTimezoneOffset();
71
+ var endTZ = endDate.getTimezoneOffset();
72
+ if (startTZ !== endTZ) {
73
+ endDate = dateFns.addMinutes(endDate, Math.abs(endTZ) - Math.abs(startTZ));
74
+ }
75
+ return dateFns.subSeconds(endDate, 1);
76
+ };
77
+
78
+ var computeName = function computeName(start, end, freqDisplay, locale) {
79
+ var opts = { locale: (0, _date.getLocale)(locale) };
80
+ var isSameDay = dateFns.isSameDay(start, end);
81
+ var isSameYear = dateFns.isSameYear(start, end);
82
+ if (freqDisplay === 'H' || freqDisplay === 'm' || freqDisplay === 'S') {
83
+ var dayFormat = getFormat('D');
84
+ var timeFormat = getFormat(freqDisplay);
85
+ if (isSameDay) return dateFns.format(start, dayFormat, opts) + ' ' + dateFns.format(start, timeFormat, opts) + ' - ' + dateFns.format(end, timeFormat, opts);
86
+ return dateFns.format(start, dayFormat + ' ' + timeFormat, opts) + ' - ' + dateFns.format(end, dayFormat + ' ' + timeFormat, opts);
87
+ }
88
+ if (freqDisplay === 'D' || freqDisplay === 'Y') {
89
+ var _format = getFormat(freqDisplay);
90
+ return dateFns.format(start, _format, opts) + ' - ' + dateFns.format(end, _format, opts);
91
+ }
92
+ var yearFormat = getFormat('Y');
93
+ var monthFormat = getFormat('M');
94
+ if (isSameYear && locale === 'fr') {
95
+ return dateFns.format(start, monthFormat, opts) + ' - ' + dateFns.format(end, monthFormat, opts) + ' ' + dateFns.format(start, yearFormat, opts);
96
+ }
97
+ var format = locale === 'fr' ? monthFormat + ' ' + yearFormat : yearFormat + '-' + monthFormat;
98
+ return dateFns.format(start, format, opts) + ' - ' + dateFns.format(end, format, opts);
99
+ };
100
+
101
+ var getStartDate = exports.getStartDate = function getStartDate(start) {
102
+ if (!R.includes('T', start) && !R.endsWith('Z', start)) {
103
+ return new Date(start);
104
+ }
105
+ var date = new Date(start);
106
+ return dateFns.addMinutes(date, -date.getTimezoneOffset());
107
+ };
108
+
109
+ var refineTimePeriod = exports.refineTimePeriod = function refineTimePeriod(timePeriod, _ref) {
110
+ var locale = _ref.locale;
111
+ var id = timePeriod.id;
112
+
113
+ var split = R.split('/', id);
114
+ if (R.length(split) !== 2) {
115
+ var _start = getStartDate(R.prop('start', timePeriod));
116
+ var end = getStartDate(R.prop('end', timePeriod));
117
+ return (0, _extends3.default)({}, timePeriod, { start: _start.toISOString(), end: end.toISOString() });
118
+ }
119
+
120
+ var _split = (0, _slicedToArray3.default)(split, 2),
121
+ start = _split[0],
122
+ range = _split[1];
123
+
124
+ var startDate = getStartDate(start);
125
+ var match = R.match(/^P(T?)(\d+)([YMDHS])$/, range);
126
+ if (R.isEmpty(match) || !dateFns.isValid(startDate)) {
127
+ return timePeriod;
128
+ }
129
+
130
+ var _R$tail = R.tail(match),
131
+ _R$tail2 = (0, _slicedToArray3.default)(_R$tail, 3),
132
+ timeIndicator = _R$tail2[0],
133
+ mult = _R$tail2[1],
134
+ _duration = _R$tail2[2];
135
+
136
+ var duration = !R.isEmpty(timeIndicator) && _duration === 'M' ? 'm' : _duration;
137
+ var endDate = getEndDate(startDate, mult, duration);
138
+ var freqDisplay = computeDisplayFreq(start, duration);
139
+ var name = computeName((0, _date.dateWithoutTZ)(startDate), (0, _date.dateWithoutTZ)(endDate), freqDisplay, locale);
140
+ return (0, _extends3.default)({}, timePeriod, {
141
+ id: id,
142
+ name: name,
143
+ start: startDate.toISOString(),
144
+ end: endDate.toISOString()
145
+ });
146
+ };
@@ -79,6 +79,9 @@ var getLayout = exports.getLayout = function getLayout(layoutIds, dimensions, co
79
79
  if (R.has(id, conceptIds)) {
80
80
  return acc;
81
81
  }
82
+ if (!R.has(id, indexedDimensions)) {
83
+ return acc;
84
+ }
82
85
  return R.append(R.prop(id, indexedDimensions), acc);
83
86
  }, [], layoutIds[key]);
84
87
  return R.concat(rest, combs);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sis-cc/dotstatsuite-components",
3
3
  "description": "Set components based on React.",
4
- "version": "17.1.0",
4
+ "version": "17.3.0",
5
5
  "main": "lib/index.js",
6
6
  "author": "OECD",
7
7
  "license": "MIT",
@@ -6,11 +6,13 @@ import {
6
6
  STACKED_ROW,
7
7
  V_SYMBOL
8
8
  } from './constants';
9
+ import { refineDimensions } from '../../rules2/src';
9
10
 
10
- const isTableLayoutCompatible = (data, layout) => {
11
+ const isTableLayoutCompatible = (data, layout, dataquery='') => {
11
12
  const multiValuesDimensions = R.pipe(
12
13
  R.pathOr([], ['structure', 'dimensions', 'observation']),
13
- R.reject(R.pipe(R.propOr([], 'values'), R.length, R.gte(1))),
14
+ dimensions => refineDimensions(dimensions, dataquery),
15
+ R.reject(R.prop('header')),
14
16
  R.pluck('id')
15
17
  )(data);
16
18
  const dimensionsInLayout = R.pipe(R.values, R.unnest)(layout);
@@ -82,7 +84,8 @@ export const isSharedLayoutCompatible = (sdmxData, sharedData) => {
82
84
  const type = R.prop('type', sharedData);
83
85
  if (type === 'table') {
84
86
  const layoutIds = R.pathOr({}, ['config', 'table', 'layoutIds'], sharedData);
85
- return isTableLayoutCompatible(sdmxData, layoutIds);
87
+ const dataquery = R.path(['config', 'sdmxSource', 'dataquery'], sharedData);
88
+ return isTableLayoutCompatible(sdmxData, layoutIds, dataquery);
86
89
  }
87
90
  const chartDimension = R.pathOr({}, ['config', 'chart', 'chartDimension'], sharedData);
88
91
  return isChartLayoutCompatible(sdmxData, type, chartDimension);
@@ -7,6 +7,7 @@ import {
7
7
  import { getReportedTimePeriodLabel, getReportedTimePeriodNote, getReportedTimePeriod } from './date';
8
8
  import { getReportingYearStart } from './preparators/getReportingYearStart';
9
9
  import { getNotDisplayedIds } from '../../rules2/src';
10
+ import { refineTimePeriod } from '../../rules2/src/refineTimePeriod';
10
11
 
11
12
  const TIME_PERIOD_ID = 'TIME_PERIOD';
12
13
 
@@ -55,23 +56,17 @@ export const dataTransformer = (dataNew, options = {}) => {
55
56
  end = reported.end;
56
57
  const reportTimeNote = getReportedTimePeriodNote(reportYearStart, start, end, options.frequency, options.isRtl);
57
58
  notes = R.isNil(reportTimeNote) ? notes : R.append(reportTimeNote, notes);
58
- __indexPosition = dateFns.getTime(new Date(R.prop('start', value)));
59
+ //__indexPosition = dateFns.getTime(new Date(R.prop('start', value)));
59
60
  }
60
61
  if (isNaN(__indexPosition)) {
61
62
  __indexPosition = getCodeOrder({ annotations: valueAnnotations });
62
63
  }
63
64
  const timeFormat = R.prop('timeFormat', options);
64
- return ({
65
+ const res = ({
65
66
  ...value,
66
- id: R.pipe(
67
- R.when(
68
- R.isNil,
69
- R.always(`${parent}-${__index}`)
70
- ),
71
- R.when(
72
- R.always(isTimeDimension),
73
- R.replace(/M/g, '')
74
- )
67
+ id: R.when(
68
+ R.isNil,
69
+ R.always(`${parent}-${__index}`)
75
70
  )(value.id),
76
71
  display: !isHidden,
77
72
  name: R.when(
@@ -83,11 +78,22 @@ export const dataTransformer = (dataNew, options = {}) => {
83
78
  __indexPosition,
84
79
  __index,
85
80
  });
81
+ return isTimeDimension ? refineTimePeriod(res, { locale }) : res;
86
82
  }),
87
- R.sortWith([
88
- R.ascend(R.prop('__indexPosition')),
89
- R.ascend(R.propOr(-1, 'order'))
90
- ]),
83
+ R.ifElse(
84
+ R.always(isTimeDimension),
85
+ R.pipe(
86
+ R.sortWith([
87
+ R.ascend(val => dateFns.getTime(new Date(R.prop('start', val)))),
88
+ R.descend(val => dateFns.getTime(new Date(R.prop('end', val)))),
89
+ ]),
90
+ R.addIndex(R.map)((val, ind) => R.assoc('__indexcPosition', ind, val))
91
+ ),
92
+ R.sortWith([
93
+ R.ascend(R.prop('__indexPosition')),
94
+ R.ascend(R.propOr(-1, 'order'))
95
+ ])
96
+ ),
91
97
  R.addIndex(R.map)((val, index) => R.assoc('__indexPosition', index, val)),
92
98
  /* NEW */
93
99
  R.sortBy(R.prop('__index'))
@@ -5,7 +5,7 @@ export const getManyValuesDimensions = (dimensions, attributesSeries, customAttr
5
5
  const combConceptsIds = R.pipe(R.pluck('concepts'), R.unnest)(combinations);
6
6
  return R.reduce(
7
7
  (acc, dim) => {
8
- if (R.length(dim.values || []) < 2) {
8
+ if (dim.header) {
9
9
  return acc;
10
10
  }
11
11
  const enhancedValues = R.map(val => {
@@ -22,7 +22,7 @@ export const getOneValueDimensions = (dimensions, attributes) => {
22
22
  );
23
23
  return R.reduce(
24
24
  (acc, dim) => {
25
- if (R.length(dim.values || []) !== 1) {
25
+ if (!dim.header) {
26
26
  return acc;
27
27
  }
28
28
  const attrValues = R.propOr({}, dim.id, indexedRelevantAttributes);
@@ -18,6 +18,7 @@ export { hierarchiseDimensionWithAdvancedHierarchy } from './hierarchiseDimensio
18
18
  export { hierarchiseDimensionWithNativeHierarchy } from './hierarchiseDimensionWithNativeHierarchy';
19
19
  export { getDimensionValuesIndexes } from './getDimensionValuesIndexes';
20
20
  export { getCombinationDefinitions } from './getCombinationDefinitions';
21
+ export { refineDimensions } from './refineDimensions';
21
22
  export { parseAttributes } from './parseAttributes';
22
23
  export { parseCombinations } from './parseCombinations';
23
24
  export { refineAttributes } from './refineAttributes';
@@ -24,8 +24,8 @@ export const parseAttributes = (attributes, dimensions, customAttributes) => {
24
24
  const seriesDimensions = R.pipe(
25
25
  R.pathOr([], ['relationship', 'dimensions']),
26
26
  R.filter(id => {
27
- const values = R.path([id, 'values'], indexedDimensions);
28
- return R.length(values) > 1;
27
+ const dimension = R.prop(id, indexedDimensions);
28
+ return !dimension.header;
29
29
  }),
30
30
  )(attr);
31
31
  if (R.length(seriesDimensions) > 0) {
@@ -21,11 +21,11 @@ export const parseCombinations = (combinations, parsedAttributes, dimensions) =>
21
21
  return false;
22
22
  }
23
23
  if (R.has(concept, indexedDimensions)) {
24
- const values = R.path([concept, 'values'], indexedDimensions);
25
- relationship = R.length(values) > 1 ? R.append(concept, relationship) : relationship;
24
+ const dimension = R.prop(concept, indexedDimensions);
25
+ relationship = !dimension.header ? R.append(concept, relationship) : relationship;
26
26
  ids = { ...ids, [concept]: concept };
27
- displayable_values_count += R.length(values);
28
- return R.length(values) > 1;
27
+ displayable_values_count += R.length(dimension.values || []);
28
+ return !dimension.header;
29
29
  }
30
30
  else if (!R.has(concept, indexedAttributes)) {
31
31
  return false;
@@ -1,5 +1,6 @@
1
1
  import * as R from 'ramda';
2
2
  import { getObservations } from '../../rules/src';
3
+ import { refineDimensions } from './refineDimensions';
3
4
  import { enhanceObservations } from './enhanceObservations';
4
5
  import { parseAttributes } from './parseAttributes';
5
6
  import { getCombinationDefinitions, parseCombinationDefinition } from './getCombinationDefinitions';
@@ -18,8 +19,9 @@ import { getHeaderSubtitle } from './getHeaderSubtitle';
18
19
  import { getHeaderCombinations } from './getHeaderCombinations';
19
20
  import { getHeaderCoordinates } from './getHeaderCoordinates';
20
21
 
21
- export const prepareData = (sdmxJson, { customAttributes, locale, hierarchies, dataflow, display, defaultCombinations }) => {
22
+ export const prepareData = (sdmxJson, { customAttributes, locale, hierarchies, dataflow, display, defaultCombinations, dataquery }) => {
22
23
  const dimensions = R.pathOr([], ['data', 'structure', 'dimensions', 'observation'], sdmxJson);
24
+ const refinedDimensions = refineDimensions(dimensions, dataquery);
23
25
  const attributes = R.pathOr([], ['data', 'structure', 'attributes', 'observation'], sdmxJson);
24
26
  const annotations = R.pathOr([], ['data', 'structure', 'annotations'], sdmxJson);
25
27
  const observations = getObservations(sdmxJson);
@@ -30,15 +32,15 @@ export const prepareData = (sdmxJson, { customAttributes, locale, hierarchies, d
30
32
  }
31
33
  const metadataCoordinates = getMetadataCoordinates(sdmxJson);
32
34
 
33
- const parsedAttributes = parseAttributes(attributes, dimensions, customAttributes);
34
- const parsedCombinations = parseCombinations(combinations, parsedAttributes, dimensions);
35
+ const parsedAttributes = parseAttributes(attributes, refinedDimensions, customAttributes);
36
+ const parsedCombinations = parseCombinations(combinations, parsedAttributes, refinedDimensions);
35
37
  const seriesCombinations = R.filter(R.prop('series'), parsedCombinations);
36
38
  const refinedAttributes = refineAttributes(parsedAttributes, seriesCombinations);
37
39
 
38
- const enhancedObservations = enhanceObservations(dimensions, observations, refinedAttributes, { customAttributes });
40
+ const enhancedObservations = enhanceObservations(refinedDimensions, observations, refinedAttributes, { customAttributes });
39
41
  const attributesSeries = getAttributesSeries(enhancedObservations);
40
- const manyValuesDimensions = getManyValuesDimensions(dimensions, attributesSeries, customAttributes, seriesCombinations);
41
- const oneValueDimensions = getOneValueDimensions(dimensions, parsedAttributes);
42
+ const manyValuesDimensions = getManyValuesDimensions(refinedDimensions, attributesSeries, customAttributes, seriesCombinations);
43
+ const oneValueDimensions = getOneValueDimensions(refinedDimensions, parsedAttributes);
42
44
  const headerCoordinates = getHeaderCoordinates(oneValueDimensions);
43
45
  const hierarchisedDimensions = R.map(dim => {
44
46
  if (R.isEmpty(R.propOr({}, dim.id, hierarchies))) {
@@ -0,0 +1,19 @@
1
+ import * as R from 'ramda';
2
+
3
+ export const refineDimensions = (dimensions=[], dataquery='') => {
4
+ const selectionIds = R.pipe(R.split('.'), R.map(R.split('+')))(dataquery);
5
+
6
+ return R.addIndex(R.map)((dim, index) => {
7
+ const selection = R.nth(index, selectionIds);
8
+ if (R.isNil(selection) || R.length(selection) === 0 || R.isEmpty(R.head(selection))) {
9
+ return { ...dim, header: R.length(dim.values || []) <= 1 };
10
+ }
11
+ const values = R.map(val => {
12
+ if (R.includes(val.id, selection)) {
13
+ return val;
14
+ }
15
+ return R.assoc('empty', true, val);
16
+ }, dim.values || []);
17
+ return { ...dim, values, header: R.length(values) <= 1 || R.length(selection) === 1 };
18
+ }, dimensions);
19
+ };