@sis-cc/dotstatsuite-components 17.10.0 → 17.12.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/lib/rules/src/chart/getAxisOptions.js +1 -1
- package/lib/rules/src/chart/getTooltipOptions.js +1 -1
- package/lib/rules/src/factories/timeline-series.js +1 -0
- package/lib/rules/src/get-values-enhanced.js +142 -0
- package/lib/rules/src/v8-transformer.js +32 -66
- package/lib/rules/test/get-values-enhanced.test.js +126 -0
- package/lib/rules2/src/enhanceObservations.js +1 -1
- package/lib/rules2/src/refineTimePeriod.js +10 -11
- package/package.json +1 -1
- package/prettier.config.js +13 -0
- package/src/rules/src/chart/getAxisOptions.js +2 -2
- package/src/rules/src/chart/getTooltipOptions.js +1 -1
- package/src/rules/src/factories/timeline-series.js +1 -0
- package/src/rules/src/get-values-enhanced.js +138 -0
- package/src/rules/src/v8-transformer.js +90 -116
- package/src/rules/test/get-values-enhanced.test.js +126 -0
- package/src/rules2/src/enhanceObservations.js +1 -1
- package/src/rules2/src/refineTimePeriod.js +10 -13
|
@@ -85,7 +85,7 @@ var getTimeProc = exports.getTimeProc = function getTimeProc(frequency) {
|
|
|
85
85
|
}
|
|
86
86
|
var format = R.pipe(R.mergeRight(defaultTimeFormats), R.ifElse(R.has(frequency), R.prop(frequency), R.prop('A')))(timeFormats);
|
|
87
87
|
return function (datum) {
|
|
88
|
-
return _dateFns2.default.format(datum, format, { locale: (0, _date.getLocale)(locale) });
|
|
88
|
+
return _dateFns2.default.format((0, _date.dateWithoutTZ)(new Date(datum)), format, { locale: (0, _date.getLocale)(locale) });
|
|
89
89
|
};
|
|
90
90
|
};
|
|
91
91
|
|
|
@@ -58,7 +58,7 @@ var getTooltipOptions = exports.getTooltipOptions = function getTooltipOptions(d
|
|
|
58
58
|
}
|
|
59
59
|
})], [R.always(R.equals(_constants.TIMELINE, type)), R.mergeRight({
|
|
60
60
|
layout: function layout(serie, datum, color) {
|
|
61
|
-
return '\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 ' +
|
|
61
|
+
return '\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 ';
|
|
62
62
|
}
|
|
63
63
|
})], [R.always(R.equals(_constants.H_SYMBOL, type)), R.mergeRight({
|
|
64
64
|
layout: function layout(serie, datum, color) {
|
|
@@ -80,6 +80,7 @@ var series = function series(observations, dimensions, dimensionsWithValuesIndex
|
|
|
80
80
|
var datapoint = {
|
|
81
81
|
x: timePeriod.start,
|
|
82
82
|
y: (0, _head3.default)(o),
|
|
83
|
+
timeLabel: timePeriod.name,
|
|
83
84
|
formatedValue: (0, _observationFormater.getFormatedObservation)(o, formaterAttrs),
|
|
84
85
|
dimensionValues: getDimensionValues(oDimensionValuesIndexes, dimensions, dimensionsWithValuesIndexedById, timePeriodDimension.id, display)
|
|
85
86
|
//index: Number(timePeriodDimensionValueIndex)
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getValuesEnhanced = 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
|
+
var _dateFns = require('date-fns');
|
|
17
|
+
|
|
18
|
+
var _dateFns2 = _interopRequireDefault(_dateFns);
|
|
19
|
+
|
|
20
|
+
var _dotstatsuiteSdmxjs = require('@sis-cc/dotstatsuite-sdmxjs');
|
|
21
|
+
|
|
22
|
+
var _sdmxData = require('./sdmx-data');
|
|
23
|
+
|
|
24
|
+
var _date = require('./date');
|
|
25
|
+
|
|
26
|
+
var _refineTimePeriod = require('../../rules2/src/refineTimePeriod');
|
|
27
|
+
|
|
28
|
+
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; } }
|
|
29
|
+
|
|
30
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
|
+
|
|
32
|
+
var isNonCoded = R.both(R.has('value'), R.pipe(R.has('id'), R.not));
|
|
33
|
+
|
|
34
|
+
var getId = function getId(value, fallbackId) {
|
|
35
|
+
var valueId = R.prop('id', value);
|
|
36
|
+
if (valueId) return valueId;
|
|
37
|
+
if (isNonCoded(value)) return R.prop('value', value);
|
|
38
|
+
// Fallback (value has no id but is not a non-coded)
|
|
39
|
+
return fallbackId;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
var getName = function getName(_ref) {
|
|
43
|
+
var isTimeDimension = _ref.isTimeDimension,
|
|
44
|
+
options = _ref.options,
|
|
45
|
+
locale = _ref.locale,
|
|
46
|
+
start = _ref.start,
|
|
47
|
+
reportYearStart = _ref.reportYearStart;
|
|
48
|
+
return function (value) {
|
|
49
|
+
if (!isTimeDimension) return (0, _dotstatsuiteSdmxjs.getRefinedName)(value);
|
|
50
|
+
return (0, _date.getReportedTimePeriodLabel)(options.frequency, options.timeFormat, locale)(reportYearStart, {
|
|
51
|
+
id: value.id,
|
|
52
|
+
reportedStart: start,
|
|
53
|
+
start: new Date(value.start)
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
var getValuesEnhanced = exports.getValuesEnhanced = function getValuesEnhanced(_ref2) {
|
|
59
|
+
var _ref2$locale = _ref2.locale,
|
|
60
|
+
locale = _ref2$locale === undefined ? '' : _ref2$locale,
|
|
61
|
+
_ref2$annotations = _ref2.annotations,
|
|
62
|
+
annotations = _ref2$annotations === undefined ? [] : _ref2$annotations,
|
|
63
|
+
_ref2$isTimeDimension = _ref2.isTimeDimension,
|
|
64
|
+
isTimeDimension = _ref2$isTimeDimension === undefined ? false : _ref2$isTimeDimension,
|
|
65
|
+
_ref2$parent = _ref2.parent,
|
|
66
|
+
parent = _ref2$parent === undefined ? '' : _ref2$parent,
|
|
67
|
+
reportYearStart = _ref2.reportYearStart,
|
|
68
|
+
_ref2$_hiddenIds = _ref2._hiddenIds,
|
|
69
|
+
_hiddenIds = _ref2$_hiddenIds === undefined ? {} : _ref2$_hiddenIds,
|
|
70
|
+
_ref2$hiddenIds = _ref2.hiddenIds,
|
|
71
|
+
hiddenIds = _ref2$hiddenIds === undefined ? {} : _ref2$hiddenIds,
|
|
72
|
+
_ref2$options = _ref2.options,
|
|
73
|
+
options = _ref2$options === undefined ? {} : _ref2$options;
|
|
74
|
+
|
|
75
|
+
return R.pipe(R.addIndex(R.map)(function (value, __index) {
|
|
76
|
+
var id = getId(value, parent + '-' + __index);
|
|
77
|
+
|
|
78
|
+
var valueAnnotations = R.pipe(R.propOr([], 'annotations'), R.flip(R.props)(annotations))(value);
|
|
79
|
+
|
|
80
|
+
var isHidden = _hiddenIds[parent] && R.includes(value.id, _hiddenIds[parent]) || R.has(parent + '.' + value.id, hiddenIds) || (0, _sdmxData.getIsHidden)(valueAnnotations);
|
|
81
|
+
|
|
82
|
+
var _ref3 = isTimeDimension ? getTimePeriodAttributes({ reportYearStart: reportYearStart, options: options })(value) : { notes: [] },
|
|
83
|
+
start = _ref3.start,
|
|
84
|
+
notes = _ref3.notes;
|
|
85
|
+
|
|
86
|
+
var __indexPosition = NaN;
|
|
87
|
+
if (isNaN(__indexPosition)) {
|
|
88
|
+
__indexPosition = (0, _dotstatsuiteSdmxjs.getCodeOrder)({ annotations: valueAnnotations });
|
|
89
|
+
}
|
|
90
|
+
var res = (0, _extends3.default)({}, R.omit(['names', 'value'], value), {
|
|
91
|
+
id: id,
|
|
92
|
+
display: !isHidden,
|
|
93
|
+
start: start ? start.toISOString() : null,
|
|
94
|
+
notes: notes,
|
|
95
|
+
__indexPosition: __indexPosition,
|
|
96
|
+
__index: __index
|
|
97
|
+
});
|
|
98
|
+
if (!isNonCoded(value)) {
|
|
99
|
+
res = R.assoc('name', getName({ isTimeDimension: isTimeDimension, options: options, locale: locale, start: start, reportYearStart: reportYearStart })(value), res);
|
|
100
|
+
}
|
|
101
|
+
if (isTimeDimension) {
|
|
102
|
+
res = (0, _refineTimePeriod.refineTimePeriod)(res, {
|
|
103
|
+
locale: locale,
|
|
104
|
+
monthlyFormat: options.timeFormat
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return res;
|
|
108
|
+
}),
|
|
109
|
+
// __indexPosition is used for pre-sorting
|
|
110
|
+
R.sortWith(isTimeDimension ? timeDimensionSorts : defaultSorts),
|
|
111
|
+
// __indexPosition is reset after pre-sorting
|
|
112
|
+
R.addIndex(R.map)(function (val, index) {
|
|
113
|
+
return R.assoc('__indexPosition', index, val);
|
|
114
|
+
}),
|
|
115
|
+
// values are re-sorted by __index after __indexPosition settlement
|
|
116
|
+
R.sortBy(R.prop('__index')));
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
var getDateForSort = function getDateForSort(key) {
|
|
120
|
+
return function (val) {
|
|
121
|
+
return _dateFns2.default.getTime(new Date(R.prop(key, val)));
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
var byStartDate = R.ascend(getDateForSort('start'));
|
|
125
|
+
var byEndDate = R.descend(getDateForSort('end'));
|
|
126
|
+
var timeDimensionSorts = [byStartDate, byEndDate];
|
|
127
|
+
var byIndexPosition = R.ascend(R.prop('__indexPosition'));
|
|
128
|
+
var byOrder = R.ascend(R.propOr(-1, 'order'));
|
|
129
|
+
var defaultSorts = [byIndexPosition, byOrder];
|
|
130
|
+
|
|
131
|
+
var getTimePeriodAttributes = function getTimePeriodAttributes(_ref4) {
|
|
132
|
+
var reportYearStart = _ref4.reportYearStart,
|
|
133
|
+
options = _ref4.options;
|
|
134
|
+
return function (value) {
|
|
135
|
+
var reported = (0, _date.getReportedTimePeriod)(reportYearStart, value, options.frequency);
|
|
136
|
+
var start = reported.start;
|
|
137
|
+
var end = reported.end;
|
|
138
|
+
var reportTimeNote = (0, _date.getReportedTimePeriodNote)(reportYearStart, start, end, options.frequency, options.isRtl);
|
|
139
|
+
var notes = R.isNil(reportTimeNote) ? [] : R.append(reportTimeNote, []);
|
|
140
|
+
return { start: start, notes: notes };
|
|
141
|
+
};
|
|
142
|
+
};
|
|
@@ -13,21 +13,15 @@ var _ramda = require('ramda');
|
|
|
13
13
|
|
|
14
14
|
var R = _interopRequireWildcard(_ramda);
|
|
15
15
|
|
|
16
|
-
var _dateFns = require('date-fns');
|
|
17
|
-
|
|
18
|
-
var _dateFns2 = _interopRequireDefault(_dateFns);
|
|
19
|
-
|
|
20
16
|
var _dotstatsuiteSdmxjs = require('@sis-cc/dotstatsuite-sdmxjs');
|
|
21
17
|
|
|
22
18
|
var _sdmxData = require('./sdmx-data');
|
|
23
19
|
|
|
24
|
-
var _date = require('./date');
|
|
25
|
-
|
|
26
20
|
var _getReportingYearStart = require('./preparators/getReportingYearStart');
|
|
27
21
|
|
|
28
22
|
var _src = require('../../rules2/src');
|
|
29
23
|
|
|
30
|
-
var
|
|
24
|
+
var _getValuesEnhanced = require('./get-values-enhanced');
|
|
31
25
|
|
|
32
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; } }
|
|
33
27
|
|
|
@@ -54,60 +48,6 @@ var dataTransformer = exports.dataTransformer = function dataTransformer(dataNew
|
|
|
54
48
|
|
|
55
49
|
var hiddenIds = (0, _src.getNotDisplayedIds)(dataSetsAnnotations);
|
|
56
50
|
|
|
57
|
-
//--------------------------------------------------------------------------------------------------
|
|
58
|
-
var getValues = function getValues(values, parent) {
|
|
59
|
-
return R.map(function (value) {
|
|
60
|
-
var valAnnotations = R.props(value.annotations || [], annotations);
|
|
61
|
-
return (0, _extends3.default)({}, value, {
|
|
62
|
-
display: !R.has(parent + '.' + value.id, hiddenIds) && !(0, _sdmxData.getIsHidden)(valAnnotations),
|
|
63
|
-
name: (0, _dotstatsuiteSdmxjs.getRefinedName)(value)
|
|
64
|
-
});
|
|
65
|
-
}, values);
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
var getValuesEnhanced = function getValuesEnhanced(locale, annotations, isTimeDimension, parent) {
|
|
69
|
-
return R.pipe(R.addIndex(R.map)(function (value, __index) {
|
|
70
|
-
var valueAnnotations = R.pipe(R.propOr([], 'annotations'), R.flip(R.props)(annotations))(value);
|
|
71
|
-
var isHidden = _hiddenIds[parent] && R.includes(value.id, _hiddenIds[parent]) || R.has(parent + '.' + value.id, hiddenIds) || (0, _sdmxData.getIsHidden)(valueAnnotations);
|
|
72
|
-
var name = (0, _dotstatsuiteSdmxjs.getRefinedName)(value);
|
|
73
|
-
var __indexPosition = NaN;
|
|
74
|
-
var notes = [];
|
|
75
|
-
var start = null;
|
|
76
|
-
var end = null;
|
|
77
|
-
if (isTimeDimension) {
|
|
78
|
-
var reported = (0, _date.getReportedTimePeriod)(reportYearStart, value, options.frequency);
|
|
79
|
-
start = reported.start;
|
|
80
|
-
end = reported.end;
|
|
81
|
-
var reportTimeNote = (0, _date.getReportedTimePeriodNote)(reportYearStart, start, end, options.frequency, options.isRtl);
|
|
82
|
-
notes = R.isNil(reportTimeNote) ? notes : R.append(reportTimeNote, notes);
|
|
83
|
-
}
|
|
84
|
-
if (isNaN(__indexPosition)) {
|
|
85
|
-
__indexPosition = (0, _dotstatsuiteSdmxjs.getCodeOrder)({ annotations: valueAnnotations });
|
|
86
|
-
}
|
|
87
|
-
var timeFormat = R.prop('timeFormat', options);
|
|
88
|
-
var res = (0, _extends3.default)({}, value, {
|
|
89
|
-
id: R.when(R.isNil, R.always(parent + '-' + __index))(value.id),
|
|
90
|
-
display: !isHidden,
|
|
91
|
-
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),
|
|
92
|
-
start: start ? start.toISOString() : null,
|
|
93
|
-
notes: notes,
|
|
94
|
-
__indexPosition: __indexPosition,
|
|
95
|
-
__index: __index
|
|
96
|
-
});
|
|
97
|
-
return isTimeDimension ? (0, _refineTimePeriod.refineTimePeriod)(res, { locale: locale, monthlyFormat: timeFormat }) : res;
|
|
98
|
-
}), R.ifElse(R.always(isTimeDimension), R.pipe(R.sortWith([R.ascend(function (val) {
|
|
99
|
-
return _dateFns2.default.getTime(new Date(R.prop('start', val)));
|
|
100
|
-
}), R.descend(function (val) {
|
|
101
|
-
return _dateFns2.default.getTime(new Date(R.prop('end', val)));
|
|
102
|
-
})]), R.addIndex(R.map)(function (val, ind) {
|
|
103
|
-
return R.assoc('__indexcPosition', ind, val);
|
|
104
|
-
})), R.sortWith([R.ascend(R.prop('__indexPosition')), R.ascend(R.propOr(-1, 'order'))])), R.addIndex(R.map)(function (val, index) {
|
|
105
|
-
return R.assoc('__indexPosition', index, val);
|
|
106
|
-
}),
|
|
107
|
-
/* NEW */
|
|
108
|
-
R.sortBy(R.prop('__index')));
|
|
109
|
-
};
|
|
110
|
-
|
|
111
51
|
//--------------------------------------------------------------------------------------------Header
|
|
112
52
|
var getMeta = R.propOr({}, 'meta');
|
|
113
53
|
var meta = getMeta(dataNew);
|
|
@@ -132,7 +72,15 @@ var dataTransformer = exports.dataTransformer = function dataTransformer(dataNew
|
|
|
132
72
|
__index: index,
|
|
133
73
|
display: !R.has(observation.id, hiddenIds) && !(0, _sdmxData.getIsHidden)(obsAnnotations),
|
|
134
74
|
name: (0, _dotstatsuiteSdmxjs.getRefinedName)(observation),
|
|
135
|
-
values:
|
|
75
|
+
values: (0, _getValuesEnhanced.getValuesEnhanced)({
|
|
76
|
+
locale: locale,
|
|
77
|
+
annotations: annotations,
|
|
78
|
+
parent: observation.id,
|
|
79
|
+
reportYearStart: reportYearStart,
|
|
80
|
+
_hiddenIds: _hiddenIds,
|
|
81
|
+
hiddenIds: hiddenIds,
|
|
82
|
+
options: options
|
|
83
|
+
})(R.propOr([], 'values', observation)),
|
|
136
84
|
roles: !R.isNil(observation.role) ? R.head(observation.role) : null
|
|
137
85
|
});
|
|
138
86
|
}, attrObservations);
|
|
@@ -142,7 +90,14 @@ var dataTransformer = exports.dataTransformer = function dataTransformer(dataNew
|
|
|
142
90
|
return (0, _extends3.default)({}, attr, {
|
|
143
91
|
display: !R.has(attr.id, hiddenIds) && !(0, _sdmxData.getIsHidden)(attrAnnotations),
|
|
144
92
|
name: (0, _dotstatsuiteSdmxjs.getRefinedName)(attr),
|
|
145
|
-
values:
|
|
93
|
+
values: (0, _getValuesEnhanced.getValuesEnhanced)({
|
|
94
|
+
locale: locale,
|
|
95
|
+
annotations: annotations,
|
|
96
|
+
parent: attr.id,
|
|
97
|
+
_hiddenIds: _hiddenIds,
|
|
98
|
+
hiddenIds: hiddenIds,
|
|
99
|
+
options: options
|
|
100
|
+
})(R.propOr([], 'values', attr))
|
|
146
101
|
});
|
|
147
102
|
}, R.propOr([], 'dataSet', attributes));
|
|
148
103
|
|
|
@@ -161,8 +116,16 @@ var dataTransformer = exports.dataTransformer = function dataTransformer(dataNew
|
|
|
161
116
|
return R.addIndex(R.reduce)(function (acc, observation, obsIndex) {
|
|
162
117
|
var id = R.prop('id')(observation);
|
|
163
118
|
var dimAnnotations = (0, _sdmxData.getRelationnalAnnotations)(R.propOr([], 'annotations')(observation))(annotations);
|
|
164
|
-
var
|
|
165
|
-
var values =
|
|
119
|
+
var isTimeDimension = (0, _dotstatsuiteSdmxjs.isTimePeriodDimension)(observation);
|
|
120
|
+
var values = (0, _getValuesEnhanced.getValuesEnhanced)({
|
|
121
|
+
locale: locale,
|
|
122
|
+
annotations: annotations,
|
|
123
|
+
isTimeDimension: isTimeDimension,
|
|
124
|
+
parent: id,
|
|
125
|
+
_hiddenIds: _hiddenIds,
|
|
126
|
+
hiddenIds: hiddenIds,
|
|
127
|
+
options: options
|
|
128
|
+
})(R.propOr([], 'values', observation));
|
|
166
129
|
var _idHidden = _hiddenIds[id] && R.isEmpty(R.difference(R.pluck('id')(values), _hiddenIds[id]));
|
|
167
130
|
var isHidden = _idHidden || R.has(id, hiddenIds) || (0, _sdmxData.getIsHidden)(dimAnnotations);
|
|
168
131
|
return {
|
|
@@ -198,5 +161,8 @@ var dataTransformer = exports.dataTransformer = function dataTransformer(dataNew
|
|
|
198
161
|
return (0, _sdmxData.setAnnotationsLayout)(title, acc)([dataSetsAnnotation]);
|
|
199
162
|
}, {})(dataSetsAnnotations);
|
|
200
163
|
|
|
201
|
-
return {
|
|
164
|
+
return {
|
|
165
|
+
data: { header: resHeader, dataSets: dataSets, structure: resStructure },
|
|
166
|
+
layout: R.mergeRight(dimensionsLayout, dataSetsLayout)
|
|
167
|
+
};
|
|
202
168
|
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _extends2 = require('babel-runtime/helpers/extends');
|
|
4
|
+
|
|
5
|
+
var _extends3 = _interopRequireDefault(_extends2);
|
|
6
|
+
|
|
7
|
+
var _ramda = require('ramda');
|
|
8
|
+
|
|
9
|
+
var R = _interopRequireWildcard(_ramda);
|
|
10
|
+
|
|
11
|
+
var _chai = require('chai');
|
|
12
|
+
|
|
13
|
+
var _getValuesEnhanced = require('../src/get-values-enhanced');
|
|
14
|
+
|
|
15
|
+
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; } }
|
|
16
|
+
|
|
17
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
+
|
|
19
|
+
var values = [{
|
|
20
|
+
id: 'A',
|
|
21
|
+
order: 0,
|
|
22
|
+
name: 'Code A',
|
|
23
|
+
names: {
|
|
24
|
+
en: 'Code A'
|
|
25
|
+
}
|
|
26
|
+
}, {
|
|
27
|
+
id: 'B',
|
|
28
|
+
order: 1,
|
|
29
|
+
name: 'Code B',
|
|
30
|
+
names: {
|
|
31
|
+
en: 'Code B'
|
|
32
|
+
}
|
|
33
|
+
}, {
|
|
34
|
+
id: 'C',
|
|
35
|
+
order: 2,
|
|
36
|
+
name: 'Code C',
|
|
37
|
+
names: {
|
|
38
|
+
en: 'Code C'
|
|
39
|
+
}
|
|
40
|
+
}];
|
|
41
|
+
|
|
42
|
+
var timeValues = [{
|
|
43
|
+
start: '2020-01-01T00:00:00',
|
|
44
|
+
end: '2020-12-31T23:59:59',
|
|
45
|
+
id: '2020',
|
|
46
|
+
name: '2020',
|
|
47
|
+
names: {
|
|
48
|
+
en: '2020'
|
|
49
|
+
}
|
|
50
|
+
}, {
|
|
51
|
+
start: '2021-01-01T00:00:00',
|
|
52
|
+
end: '2021-12-31T23:59:59',
|
|
53
|
+
id: '2021',
|
|
54
|
+
name: '2021',
|
|
55
|
+
names: {
|
|
56
|
+
en: '2021'
|
|
57
|
+
}
|
|
58
|
+
}, {
|
|
59
|
+
start: '2022-01-01T00:00:00',
|
|
60
|
+
end: '2022-12-31T23:59:59',
|
|
61
|
+
id: '2022',
|
|
62
|
+
name: '2022',
|
|
63
|
+
names: {
|
|
64
|
+
en: '2022'
|
|
65
|
+
}
|
|
66
|
+
}];
|
|
67
|
+
|
|
68
|
+
var expectedTimeValues = [{
|
|
69
|
+
start: '2020-01-01T00:00:00.000Z',
|
|
70
|
+
end: '2020-12-31T23:59:59.000Z',
|
|
71
|
+
id: '2020',
|
|
72
|
+
name: '2020'
|
|
73
|
+
}, {
|
|
74
|
+
start: '2021-01-01T00:00:00.000Z',
|
|
75
|
+
end: '2021-12-31T23:59:59.000Z',
|
|
76
|
+
id: '2021',
|
|
77
|
+
name: '2021'
|
|
78
|
+
}, {
|
|
79
|
+
start: '2022-01-01T00:00:00.000Z',
|
|
80
|
+
end: '2022-12-31T23:59:59.000Z',
|
|
81
|
+
id: '2022',
|
|
82
|
+
name: '2022'
|
|
83
|
+
}];
|
|
84
|
+
|
|
85
|
+
var nonCodedValues = [{ value: 'A' }, { value: 'B' }, { value: 'C' }];
|
|
86
|
+
|
|
87
|
+
var expectedValues = function expectedValues() {
|
|
88
|
+
var skippedValueEntries = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
89
|
+
return R.addIndex(R.map)(function (value, index) {
|
|
90
|
+
return (0, _extends3.default)({}, R.omit(R.prepend('names', skippedValueEntries), value), {
|
|
91
|
+
__index: index,
|
|
92
|
+
__indexPosition: index,
|
|
93
|
+
display: true,
|
|
94
|
+
notes: [],
|
|
95
|
+
start: R.propOr(null, 'start', value)
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
describe('get values enhanced method', function () {
|
|
101
|
+
it('should pass with coded values', function () {
|
|
102
|
+
var enhancedValues = (0, _getValuesEnhanced.getValuesEnhanced)({
|
|
103
|
+
locale: 'en',
|
|
104
|
+
parent: 'ID'
|
|
105
|
+
})(values);
|
|
106
|
+
(0, _chai.expect)(enhancedValues).to.deep.equal(expectedValues()(values));
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should pass with non-coded values', function () {
|
|
110
|
+
var enhancedValues = (0, _getValuesEnhanced.getValuesEnhanced)({
|
|
111
|
+
locale: 'en',
|
|
112
|
+
parent: 'ID'
|
|
113
|
+
})(nonCodedValues);
|
|
114
|
+
(0, _chai.expect)(enhancedValues).to.deep.equal(expectedValues(['name', 'order', 'value'])(values));
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('should pass with time values', function () {
|
|
118
|
+
var enhancedValues = (0, _getValuesEnhanced.getValuesEnhanced)({
|
|
119
|
+
locale: 'en',
|
|
120
|
+
parent: 'ID',
|
|
121
|
+
isTimeDimension: true,
|
|
122
|
+
reportYearStart: { month: '01', day: '01' }
|
|
123
|
+
})(timeValues);
|
|
124
|
+
(0, _chai.expect)(enhancedValues).to.deep.equal(expectedValues()(expectedTimeValues));
|
|
125
|
+
});
|
|
126
|
+
});
|
|
@@ -83,7 +83,7 @@ var enhanceObservations = exports.enhanceObservations = function enhanceObservat
|
|
|
83
83
|
var formatAttributesIndexes = getFormatAttributesIndexes(attributes, R.propOr({}, 'customAttributes', options));
|
|
84
84
|
var indexedDimensions = R.indexBy(R.prop('id'), dimensions);
|
|
85
85
|
|
|
86
|
-
return R.
|
|
86
|
+
return R.map(function (observation) {
|
|
87
87
|
var dimValuesIndexes = observation.dimValuesIndexes;
|
|
88
88
|
|
|
89
89
|
|
|
@@ -67,11 +67,6 @@ var getFormat = function getFormat(freqDisplay) {
|
|
|
67
67
|
var getEndDate = function getEndDate(start, mult, duration) {
|
|
68
68
|
var adder = getAdder(duration);
|
|
69
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
70
|
return dateFns.subSeconds(endDate, 1);
|
|
76
71
|
};
|
|
77
72
|
|
|
@@ -106,9 +101,12 @@ var computeName = function computeName(start, end, freqDisplay, locale, format)
|
|
|
106
101
|
|
|
107
102
|
var getStartDate = exports.getStartDate = function getStartDate(start) {
|
|
108
103
|
if (!R.includes('T', start) && !R.endsWith('Z', start)) {
|
|
109
|
-
return new Date(start);
|
|
104
|
+
return (0, _date.dateWithoutTZ)(new Date(start));
|
|
110
105
|
}
|
|
111
|
-
|
|
106
|
+
return new Date(start);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
var dateWithTZ = function dateWithTZ(date) {
|
|
112
110
|
return dateFns.addMinutes(date, -date.getTimezoneOffset());
|
|
113
111
|
};
|
|
114
112
|
|
|
@@ -122,7 +120,7 @@ var refineTimePeriod = exports.refineTimePeriod = function refineTimePeriod(time
|
|
|
122
120
|
if (R.length(split) !== 2) {
|
|
123
121
|
var _start = getStartDate(R.prop('start', timePeriod));
|
|
124
122
|
var end = getStartDate(R.prop('end', timePeriod));
|
|
125
|
-
return (0, _extends3.default)({}, timePeriod, { start: _start.toISOString(), end: end.toISOString() });
|
|
123
|
+
return (0, _extends3.default)({}, timePeriod, { start: dateWithTZ(_start).toISOString(), end: dateWithTZ(end).toISOString() });
|
|
126
124
|
}
|
|
127
125
|
|
|
128
126
|
var _split = (0, _slicedToArray3.default)(split, 2),
|
|
@@ -145,11 +143,12 @@ var refineTimePeriod = exports.refineTimePeriod = function refineTimePeriod(time
|
|
|
145
143
|
var endDate = getEndDate(startDate, mult, duration);
|
|
146
144
|
var freqDisplay = computeDisplayFreq(start, duration);
|
|
147
145
|
var format = freqDisplay === 'M' ? monthlyFormat : getFormat(freqDisplay);
|
|
148
|
-
var name = computeName(
|
|
146
|
+
var name = computeName(startDate, endDate, freqDisplay, locale, format);
|
|
147
|
+
|
|
149
148
|
return (0, _extends3.default)({}, timePeriod, {
|
|
150
149
|
id: id,
|
|
151
150
|
name: name,
|
|
152
|
-
start: startDate.toISOString(),
|
|
153
|
-
end: endDate.toISOString()
|
|
151
|
+
start: dateWithTZ(startDate).toISOString(),
|
|
152
|
+
end: dateWithTZ(endDate).toISOString()
|
|
154
153
|
});
|
|
155
154
|
};
|
package/package.json
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
printWidth: 80,
|
|
3
|
+
tabWidth: 2,
|
|
4
|
+
useTabs: false,
|
|
5
|
+
singleQuote: true,
|
|
6
|
+
trailingComma: 'all',
|
|
7
|
+
bracketSameLine: false,
|
|
8
|
+
bracketSpacing: true,
|
|
9
|
+
semi: true,
|
|
10
|
+
arrowParens: 'always',
|
|
11
|
+
endOfLine: 'lf',
|
|
12
|
+
jsxSingleQuote: false,
|
|
13
|
+
};
|
|
@@ -9,7 +9,7 @@ import isFriday from 'date-fns/is_friday';
|
|
|
9
9
|
import isSaturday from 'date-fns/is_saturday';
|
|
10
10
|
import isSunday from 'date-fns/is_sunday';
|
|
11
11
|
import getISOWeek from 'date-fns/get_iso_week';
|
|
12
|
-
import { getLocale } from '../date';
|
|
12
|
+
import { getLocale, dateWithoutTZ } from '../date';
|
|
13
13
|
import {
|
|
14
14
|
BAR,
|
|
15
15
|
CHORO,
|
|
@@ -53,7 +53,7 @@ export const getTimeProc = (frequency, timeFormats = {}, locale) => {
|
|
|
53
53
|
R.prop('A')
|
|
54
54
|
)
|
|
55
55
|
)(timeFormats);
|
|
56
|
-
return datum => dateFns.format(datum, format, { locale: getLocale(locale) });
|
|
56
|
+
return datum => dateFns.format(dateWithoutTZ(new Date(datum)), format, { locale: getLocale(locale) });
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
const getTimeFrequency = (data) => {
|
|
@@ -109,7 +109,7 @@ export const getTooltipOptions = (data, type, options, fonts={}, timeFormats={}
|
|
|
109
109
|
${R.pipe(R.propOr({}, 'dimensionValues'), R.values, R.pluck('name'), R.join('<br />'))(datum)}
|
|
110
110
|
</div>
|
|
111
111
|
<div style="text-align: right;">
|
|
112
|
-
${
|
|
112
|
+
${datum.timeLabel}
|
|
113
113
|
</div>
|
|
114
114
|
<div style="text-align: right; ${secondaryFonts}">
|
|
115
115
|
${datum.formatedValue || valueFormatter(datum.y)}
|
|
@@ -39,6 +39,7 @@ const series = (
|
|
|
39
39
|
const datapoint = {
|
|
40
40
|
x: timePeriod.start,
|
|
41
41
|
y: head(o),
|
|
42
|
+
timeLabel: timePeriod.name,
|
|
42
43
|
formatedValue: getFormatedObservation(o, formaterAttrs),
|
|
43
44
|
dimensionValues: getDimensionValues(
|
|
44
45
|
oDimensionValuesIndexes, dimensions, dimensionsWithValuesIndexedById, timePeriodDimension.id, display
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import * as R from 'ramda';
|
|
2
|
+
import dateFns from 'date-fns';
|
|
3
|
+
import { getCodeOrder, getRefinedName } from '@sis-cc/dotstatsuite-sdmxjs';
|
|
4
|
+
import { getIsHidden } from './sdmx-data';
|
|
5
|
+
import {
|
|
6
|
+
getReportedTimePeriodLabel,
|
|
7
|
+
getReportedTimePeriodNote,
|
|
8
|
+
getReportedTimePeriod,
|
|
9
|
+
} from './date';
|
|
10
|
+
import { refineTimePeriod } from '../../rules2/src/refineTimePeriod';
|
|
11
|
+
|
|
12
|
+
const isNonCoded = R.both(R.has('value'), R.pipe(R.has('id'), R.not));
|
|
13
|
+
|
|
14
|
+
const getId = (value, fallbackId) => {
|
|
15
|
+
const valueId = R.prop('id', value);
|
|
16
|
+
if (valueId) return valueId;
|
|
17
|
+
if (isNonCoded(value)) return R.prop('value', value);
|
|
18
|
+
// Fallback (value has no id but is not a non-coded)
|
|
19
|
+
return fallbackId;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const getName =
|
|
23
|
+
({ isTimeDimension, options, locale, start, reportYearStart }) =>
|
|
24
|
+
(value) => {
|
|
25
|
+
if (!isTimeDimension) return getRefinedName(value);
|
|
26
|
+
return getReportedTimePeriodLabel(
|
|
27
|
+
options.frequency,
|
|
28
|
+
options.timeFormat,
|
|
29
|
+
locale,
|
|
30
|
+
)(reportYearStart, {
|
|
31
|
+
id: value.id,
|
|
32
|
+
reportedStart: start,
|
|
33
|
+
start: new Date(value.start),
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const getValuesEnhanced = ({
|
|
38
|
+
locale = '',
|
|
39
|
+
annotations = [],
|
|
40
|
+
isTimeDimension = false,
|
|
41
|
+
parent = '',
|
|
42
|
+
reportYearStart,
|
|
43
|
+
_hiddenIds = {},
|
|
44
|
+
hiddenIds = {},
|
|
45
|
+
options = {},
|
|
46
|
+
}) => {
|
|
47
|
+
return R.pipe(
|
|
48
|
+
R.addIndex(R.map)((value, __index) => {
|
|
49
|
+
const id = getId(value, `${parent}-${__index}`);
|
|
50
|
+
|
|
51
|
+
const valueAnnotations = R.pipe(
|
|
52
|
+
R.propOr([], 'annotations'),
|
|
53
|
+
R.flip(R.props)(annotations),
|
|
54
|
+
)(value);
|
|
55
|
+
|
|
56
|
+
const isHidden =
|
|
57
|
+
(_hiddenIds[parent] && R.includes(value.id, _hiddenIds[parent])) ||
|
|
58
|
+
R.has(`${parent}.${value.id}`, hiddenIds) ||
|
|
59
|
+
getIsHidden(valueAnnotations);
|
|
60
|
+
|
|
61
|
+
const { start, notes } = isTimeDimension
|
|
62
|
+
? getTimePeriodAttributes({ reportYearStart, options })(value)
|
|
63
|
+
: { notes: [] };
|
|
64
|
+
|
|
65
|
+
let __indexPosition = NaN;
|
|
66
|
+
if (isNaN(__indexPosition)) {
|
|
67
|
+
__indexPosition = getCodeOrder({ annotations: valueAnnotations });
|
|
68
|
+
}
|
|
69
|
+
let res = {
|
|
70
|
+
// names is explicitely skipped because of metadata "standard"
|
|
71
|
+
// not completely aligned with NSI "standard"
|
|
72
|
+
// value is explicitely skipped (non-coded) into id
|
|
73
|
+
...R.omit(['names', 'value'], value),
|
|
74
|
+
id,
|
|
75
|
+
display: !isHidden,
|
|
76
|
+
start: start ? start.toISOString() : null,
|
|
77
|
+
notes,
|
|
78
|
+
__indexPosition,
|
|
79
|
+
__index,
|
|
80
|
+
};
|
|
81
|
+
if (!isNonCoded(value)) {
|
|
82
|
+
res = R.assoc(
|
|
83
|
+
'name',
|
|
84
|
+
getName({ isTimeDimension, options, locale, start, reportYearStart })(
|
|
85
|
+
value,
|
|
86
|
+
),
|
|
87
|
+
res,
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
if (isTimeDimension) {
|
|
91
|
+
res = refineTimePeriod(res, {
|
|
92
|
+
locale,
|
|
93
|
+
monthlyFormat: options.timeFormat,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return res;
|
|
97
|
+
}),
|
|
98
|
+
// __indexPosition is used for pre-sorting
|
|
99
|
+
R.sortWith(isTimeDimension ? timeDimensionSorts : defaultSorts),
|
|
100
|
+
// __indexPosition is reset after pre-sorting
|
|
101
|
+
R.addIndex(R.map)((val, index) => R.assoc('__indexPosition', index, val)),
|
|
102
|
+
// values are re-sorted by __index after __indexPosition settlement
|
|
103
|
+
R.sortBy(R.prop('__index')),
|
|
104
|
+
);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const getDateForSort = (key) => (val) => {
|
|
108
|
+
return dateFns.getTime(new Date(R.prop(key, val)));
|
|
109
|
+
};
|
|
110
|
+
const byStartDate = R.ascend(getDateForSort('start'));
|
|
111
|
+
const byEndDate = R.descend(getDateForSort('end'));
|
|
112
|
+
const timeDimensionSorts = [byStartDate, byEndDate];
|
|
113
|
+
const byIndexPosition = R.ascend(R.prop('__indexPosition'));
|
|
114
|
+
const byOrder = R.ascend(R.propOr(-1, 'order'));
|
|
115
|
+
const defaultSorts = [byIndexPosition, byOrder];
|
|
116
|
+
|
|
117
|
+
const getTimePeriodAttributes =
|
|
118
|
+
({ reportYearStart, options }) =>
|
|
119
|
+
(value) => {
|
|
120
|
+
const reported = getReportedTimePeriod(
|
|
121
|
+
reportYearStart,
|
|
122
|
+
value,
|
|
123
|
+
options.frequency,
|
|
124
|
+
);
|
|
125
|
+
const start = reported.start;
|
|
126
|
+
const end = reported.end;
|
|
127
|
+
const reportTimeNote = getReportedTimePeriodNote(
|
|
128
|
+
reportYearStart,
|
|
129
|
+
start,
|
|
130
|
+
end,
|
|
131
|
+
options.frequency,
|
|
132
|
+
options.isRtl,
|
|
133
|
+
);
|
|
134
|
+
const notes = R.isNil(reportTimeNote)
|
|
135
|
+
? []
|
|
136
|
+
: R.append(reportTimeNote, []);
|
|
137
|
+
return { start, notes };
|
|
138
|
+
};
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import * as R from 'ramda';
|
|
2
|
-
import dateFns from 'date-fns';
|
|
3
|
-
import { getCodeOrder, getRefinedName, isTimePeriodDimension } from '@sis-cc/dotstatsuite-sdmxjs';
|
|
4
2
|
import {
|
|
5
|
-
|
|
3
|
+
getRefinedName,
|
|
4
|
+
isTimePeriodDimension,
|
|
5
|
+
} from '@sis-cc/dotstatsuite-sdmxjs';
|
|
6
|
+
import {
|
|
7
|
+
getRelationnalAnnotations,
|
|
8
|
+
setAnnotationsLayout,
|
|
9
|
+
getIsHidden,
|
|
6
10
|
} from './sdmx-data';
|
|
7
|
-
import { getReportedTimePeriodLabel, getReportedTimePeriodNote, getReportedTimePeriod } from './date';
|
|
8
11
|
import { getReportingYearStart } from './preparators/getReportingYearStart';
|
|
9
12
|
import { getNotDisplayedIds } from '../../rules2/src';
|
|
10
|
-
import {
|
|
13
|
+
import { getValuesEnhanced } from './get-values-enhanced';
|
|
11
14
|
|
|
12
15
|
const TIME_PERIOD_ID = 'TIME_PERIOD';
|
|
13
16
|
|
|
@@ -23,81 +26,13 @@ export const dataTransformer = (dataNew, options = {}) => {
|
|
|
23
26
|
const getDataSets = R.pathOr({}, ['data', 'dataSets']);
|
|
24
27
|
const dataSets = getDataSets(dataNew);
|
|
25
28
|
|
|
26
|
-
const dataSetsAnnotations = R.props(
|
|
29
|
+
const dataSetsAnnotations = R.props(
|
|
30
|
+
R.pathOr([], [0, 'annotations'], dataSets),
|
|
31
|
+
annotations,
|
|
32
|
+
);
|
|
27
33
|
|
|
28
34
|
const hiddenIds = getNotDisplayedIds(dataSetsAnnotations);
|
|
29
35
|
|
|
30
|
-
//--------------------------------------------------------------------------------------------------
|
|
31
|
-
const getValues = (values, parent) => R.map((value) => {
|
|
32
|
-
const valAnnotations = R.props(value.annotations || [], annotations);
|
|
33
|
-
return ({
|
|
34
|
-
...value,
|
|
35
|
-
display: !R.has(`${parent}.${value.id}`, hiddenIds) && !getIsHidden(valAnnotations),
|
|
36
|
-
name: getRefinedName(value)
|
|
37
|
-
});
|
|
38
|
-
}, values);
|
|
39
|
-
|
|
40
|
-
const getValuesEnhanced = (locale, annotations, isTimeDimension, parent) =>
|
|
41
|
-
R.pipe(
|
|
42
|
-
R.addIndex(R.map)((value, __index) => {
|
|
43
|
-
const valueAnnotations = R.pipe(
|
|
44
|
-
R.propOr([], 'annotations'),
|
|
45
|
-
R.flip(R.props)(annotations)
|
|
46
|
-
)(value);
|
|
47
|
-
const isHidden = (_hiddenIds[parent] && R.includes(value.id, _hiddenIds[parent])) || R.has(`${parent}.${value.id}`, hiddenIds) || getIsHidden(valueAnnotations);
|
|
48
|
-
const name = getRefinedName(value);
|
|
49
|
-
let __indexPosition = NaN;
|
|
50
|
-
let notes = [];
|
|
51
|
-
let start = null;
|
|
52
|
-
let end = null;
|
|
53
|
-
if (isTimeDimension) {
|
|
54
|
-
const reported = getReportedTimePeriod(reportYearStart, value, options.frequency);
|
|
55
|
-
start = reported.start;
|
|
56
|
-
end = reported.end;
|
|
57
|
-
const reportTimeNote = getReportedTimePeriodNote(reportYearStart, start, end, options.frequency, options.isRtl);
|
|
58
|
-
notes = R.isNil(reportTimeNote) ? notes : R.append(reportTimeNote, notes);
|
|
59
|
-
}
|
|
60
|
-
if (isNaN(__indexPosition)) {
|
|
61
|
-
__indexPosition = getCodeOrder({ annotations: valueAnnotations });
|
|
62
|
-
}
|
|
63
|
-
const timeFormat = R.prop('timeFormat', options);
|
|
64
|
-
const res = ({
|
|
65
|
-
...value,
|
|
66
|
-
id: R.when(
|
|
67
|
-
R.isNil,
|
|
68
|
-
R.always(`${parent}-${__index}`)
|
|
69
|
-
)(value.id),
|
|
70
|
-
display: !isHidden,
|
|
71
|
-
name: R.when(
|
|
72
|
-
R.always(isTimeDimension),
|
|
73
|
-
R.always(getReportedTimePeriodLabel(options.frequency, timeFormat, locale)(reportYearStart, { id: value.id, reportedStart: start, start: new Date(value.start) }))
|
|
74
|
-
)(name),
|
|
75
|
-
start: start ? start.toISOString() : null,
|
|
76
|
-
notes,
|
|
77
|
-
__indexPosition,
|
|
78
|
-
__index,
|
|
79
|
-
});
|
|
80
|
-
return isTimeDimension ? refineTimePeriod(res, { locale, monthlyFormat: timeFormat }) : res;
|
|
81
|
-
}),
|
|
82
|
-
R.ifElse(
|
|
83
|
-
R.always(isTimeDimension),
|
|
84
|
-
R.pipe(
|
|
85
|
-
R.sortWith([
|
|
86
|
-
R.ascend(val => dateFns.getTime(new Date(R.prop('start', val)))),
|
|
87
|
-
R.descend(val => dateFns.getTime(new Date(R.prop('end', val)))),
|
|
88
|
-
]),
|
|
89
|
-
R.addIndex(R.map)((val, ind) => R.assoc('__indexcPosition', ind, val))
|
|
90
|
-
),
|
|
91
|
-
R.sortWith([
|
|
92
|
-
R.ascend(R.prop('__indexPosition')),
|
|
93
|
-
R.ascend(R.propOr(-1, 'order'))
|
|
94
|
-
])
|
|
95
|
-
),
|
|
96
|
-
R.addIndex(R.map)((val, index) => R.assoc('__indexPosition', index, val)),
|
|
97
|
-
/* NEW */
|
|
98
|
-
R.sortBy(R.prop('__index'))
|
|
99
|
-
);
|
|
100
|
-
|
|
101
36
|
//--------------------------------------------------------------------------------------------Header
|
|
102
37
|
const getMeta = R.propOr({}, 'meta');
|
|
103
38
|
const meta = getMeta(dataNew);
|
|
@@ -119,32 +54,45 @@ export const dataTransformer = (dataNew, options = {}) => {
|
|
|
119
54
|
|
|
120
55
|
const resAttrObservations = R.addIndex(R.map)((observation, index) => {
|
|
121
56
|
const obsAnnotations = R.props(observation.annotations || [], annotations);
|
|
122
|
-
return
|
|
57
|
+
return {
|
|
123
58
|
...observation,
|
|
124
59
|
__index: index,
|
|
125
|
-
display:
|
|
60
|
+
display:
|
|
61
|
+
!R.has(observation.id, hiddenIds) && !getIsHidden(obsAnnotations),
|
|
126
62
|
name: getRefinedName(observation),
|
|
127
|
-
values: getValuesEnhanced(
|
|
63
|
+
values: getValuesEnhanced({
|
|
64
|
+
locale,
|
|
65
|
+
annotations,
|
|
66
|
+
parent: observation.id,
|
|
67
|
+
reportYearStart,
|
|
68
|
+
_hiddenIds,
|
|
69
|
+
hiddenIds,
|
|
70
|
+
options,
|
|
71
|
+
})(R.propOr([], 'values', observation)),
|
|
128
72
|
roles: !R.isNil(observation.role) ? R.head(observation.role) : null,
|
|
129
|
-
}
|
|
73
|
+
};
|
|
130
74
|
}, attrObservations);
|
|
131
75
|
|
|
132
|
-
const datasetAttributes = R.map(
|
|
133
|
-
(attr
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
76
|
+
const datasetAttributes = R.map((attr) => {
|
|
77
|
+
const attrAnnotations = R.props(attr.annotations || [], annotations);
|
|
78
|
+
return {
|
|
79
|
+
...attr,
|
|
80
|
+
display: !R.has(attr.id, hiddenIds) && !getIsHidden(attrAnnotations),
|
|
81
|
+
name: getRefinedName(attr),
|
|
82
|
+
values: getValuesEnhanced({
|
|
83
|
+
locale,
|
|
84
|
+
annotations,
|
|
85
|
+
parent: attr.id,
|
|
86
|
+
_hiddenIds,
|
|
87
|
+
hiddenIds,
|
|
88
|
+
options,
|
|
89
|
+
})(R.propOr([], 'values', attr)),
|
|
90
|
+
};
|
|
91
|
+
}, R.propOr([], 'dataSet', attributes));
|
|
144
92
|
|
|
145
93
|
const resAttributes = {
|
|
146
94
|
...attributes,
|
|
147
|
-
observation: R.concat(resAttrObservations, datasetAttributes)
|
|
95
|
+
observation: R.concat(resAttrObservations, datasetAttributes),
|
|
148
96
|
};
|
|
149
97
|
|
|
150
98
|
//----------------------------------------------------------------------------------------Dimensions
|
|
@@ -154,28 +102,51 @@ export const dataTransformer = (dataNew, options = {}) => {
|
|
|
154
102
|
const getDimObservations = R.propOr([], 'observation');
|
|
155
103
|
const dimObservations = getDimObservations(dimensions);
|
|
156
104
|
|
|
157
|
-
const getObservations = locale
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
105
|
+
const getObservations = (locale) =>
|
|
106
|
+
R.addIndex(R.reduce)(
|
|
107
|
+
(acc, observation, obsIndex) => {
|
|
108
|
+
const id = R.prop('id')(observation);
|
|
109
|
+
const dimAnnotations = getRelationnalAnnotations(
|
|
110
|
+
R.propOr([], 'annotations')(observation),
|
|
111
|
+
)(annotations);
|
|
112
|
+
const isTimeDimension = isTimePeriodDimension(observation);
|
|
113
|
+
const values = getValuesEnhanced({
|
|
114
|
+
locale,
|
|
115
|
+
annotations,
|
|
116
|
+
isTimeDimension,
|
|
117
|
+
parent: id,
|
|
118
|
+
_hiddenIds,
|
|
119
|
+
hiddenIds,
|
|
120
|
+
options,
|
|
121
|
+
})(R.propOr([], 'values', observation));
|
|
122
|
+
const _idHidden =
|
|
123
|
+
_hiddenIds[id] &&
|
|
124
|
+
R.isEmpty(R.difference(R.pluck('id')(values), _hiddenIds[id]));
|
|
125
|
+
const isHidden =
|
|
126
|
+
_idHidden || R.has(id, hiddenIds) || getIsHidden(dimAnnotations);
|
|
127
|
+
return {
|
|
128
|
+
observation: R.append({
|
|
129
|
+
...observation,
|
|
130
|
+
display: !isHidden,
|
|
131
|
+
__index: obsIndex,
|
|
132
|
+
name: getRefinedName(observation),
|
|
133
|
+
values: _idHidden ? [] : values,
|
|
134
|
+
role: isTime
|
|
135
|
+
? TIME_PERIOD_ID
|
|
136
|
+
: R.head(R.propOr([], 'roles', observation)),
|
|
137
|
+
})(acc.observation),
|
|
138
|
+
dimensionsLayout: setAnnotationsLayout(
|
|
139
|
+
id,
|
|
140
|
+
acc.dimensionsLayout,
|
|
141
|
+
)(dimAnnotations),
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
{ observation: [], dimensionsLayout: {} },
|
|
145
|
+
);
|
|
176
146
|
|
|
177
147
|
//-----------------------------------------------------------------------------------------Structure
|
|
178
|
-
const { dimensionsLayout, observation } =
|
|
148
|
+
const { dimensionsLayout, observation } =
|
|
149
|
+
getObservations(locale)(dimObservations);
|
|
179
150
|
const resStructure = {
|
|
180
151
|
...structure,
|
|
181
152
|
name: getRefinedName({ ...structure, id: options.dataflowId }),
|
|
@@ -188,8 +159,11 @@ export const dataTransformer = (dataNew, options = {}) => {
|
|
|
188
159
|
const dataSetsLayout = R.reduce((acc, dataSetsAnnotation) => {
|
|
189
160
|
const title = R.propOr('', 'title')(dataSetsAnnotation);
|
|
190
161
|
if (R.isEmpty(title)) return acc;
|
|
191
|
-
return setAnnotationsLayout(title, acc)([dataSetsAnnotation])
|
|
162
|
+
return setAnnotationsLayout(title, acc)([dataSetsAnnotation]);
|
|
192
163
|
}, {})(dataSetsAnnotations);
|
|
193
164
|
|
|
194
|
-
return
|
|
165
|
+
return {
|
|
166
|
+
data: { header: resHeader, dataSets, structure: resStructure },
|
|
167
|
+
layout: R.mergeRight(dimensionsLayout, dataSetsLayout),
|
|
168
|
+
};
|
|
195
169
|
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import * as R from 'ramda';
|
|
2
|
+
import { expect } from 'chai';
|
|
3
|
+
import { getValuesEnhanced } from '../src/get-values-enhanced';
|
|
4
|
+
|
|
5
|
+
const values = [
|
|
6
|
+
{
|
|
7
|
+
id: 'A',
|
|
8
|
+
order: 0,
|
|
9
|
+
name: 'Code A',
|
|
10
|
+
names: {
|
|
11
|
+
en: 'Code A',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
id: 'B',
|
|
16
|
+
order: 1,
|
|
17
|
+
name: 'Code B',
|
|
18
|
+
names: {
|
|
19
|
+
en: 'Code B',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: 'C',
|
|
24
|
+
order: 2,
|
|
25
|
+
name: 'Code C',
|
|
26
|
+
names: {
|
|
27
|
+
en: 'Code C',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
const timeValues = [
|
|
33
|
+
{
|
|
34
|
+
start: '2020-01-01T00:00:00',
|
|
35
|
+
end: '2020-12-31T23:59:59',
|
|
36
|
+
id: '2020',
|
|
37
|
+
name: '2020',
|
|
38
|
+
names: {
|
|
39
|
+
en: '2020',
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
start: '2021-01-01T00:00:00',
|
|
44
|
+
end: '2021-12-31T23:59:59',
|
|
45
|
+
id: '2021',
|
|
46
|
+
name: '2021',
|
|
47
|
+
names: {
|
|
48
|
+
en: '2021',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
start: '2022-01-01T00:00:00',
|
|
53
|
+
end: '2022-12-31T23:59:59',
|
|
54
|
+
id: '2022',
|
|
55
|
+
name: '2022',
|
|
56
|
+
names: {
|
|
57
|
+
en: '2022',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
const expectedTimeValues = [
|
|
63
|
+
{
|
|
64
|
+
start: '2020-01-01T00:00:00.000Z',
|
|
65
|
+
end: '2020-12-31T23:59:59.000Z',
|
|
66
|
+
id: '2020',
|
|
67
|
+
name: '2020',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
start: '2021-01-01T00:00:00.000Z',
|
|
71
|
+
end: '2021-12-31T23:59:59.000Z',
|
|
72
|
+
id: '2021',
|
|
73
|
+
name: '2021',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
start: '2022-01-01T00:00:00.000Z',
|
|
77
|
+
end: '2022-12-31T23:59:59.000Z',
|
|
78
|
+
id: '2022',
|
|
79
|
+
name: '2022',
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
const nonCodedValues = [{ value: 'A' }, { value: 'B' }, { value: 'C' }];
|
|
84
|
+
|
|
85
|
+
const expectedValues = (skippedValueEntries = []) => R.addIndex(R.map)((value, index) => {
|
|
86
|
+
return {
|
|
87
|
+
...R.omit(R.prepend('names', skippedValueEntries), value),
|
|
88
|
+
__index: index,
|
|
89
|
+
__indexPosition: index,
|
|
90
|
+
display: true,
|
|
91
|
+
notes: [],
|
|
92
|
+
start: R.propOr(null, 'start', value),
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe('get values enhanced method', () => {
|
|
97
|
+
it('should pass with coded values', () => {
|
|
98
|
+
const enhancedValues = getValuesEnhanced({
|
|
99
|
+
locale: 'en',
|
|
100
|
+
parent: 'ID',
|
|
101
|
+
})(values);
|
|
102
|
+
expect(enhancedValues).to.deep.equal(expectedValues()(values));
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('should pass with non-coded values', () => {
|
|
106
|
+
const enhancedValues = getValuesEnhanced({
|
|
107
|
+
locale: 'en',
|
|
108
|
+
parent: 'ID',
|
|
109
|
+
})(nonCodedValues);
|
|
110
|
+
expect(enhancedValues).to.deep.equal(
|
|
111
|
+
expectedValues(['name', 'order', 'value'])(values),
|
|
112
|
+
);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should pass with time values', () => {
|
|
116
|
+
const enhancedValues = getValuesEnhanced({
|
|
117
|
+
locale: 'en',
|
|
118
|
+
parent: 'ID',
|
|
119
|
+
isTimeDimension: true,
|
|
120
|
+
reportYearStart: { month: '01', day: '01' },
|
|
121
|
+
})(timeValues);
|
|
122
|
+
expect(enhancedValues).to.deep.equal(
|
|
123
|
+
expectedValues()(expectedTimeValues),
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
@@ -64,7 +64,7 @@ export const enhanceObservations = (dimensions = [], observations = {}, attribut
|
|
|
64
64
|
const formatAttributesIndexes = getFormatAttributesIndexes(attributes, R.propOr({}, 'customAttributes', options));
|
|
65
65
|
const indexedDimensions = R.indexBy(R.prop('id'), dimensions);
|
|
66
66
|
|
|
67
|
-
return R.
|
|
67
|
+
return R.map(
|
|
68
68
|
(observation) => {
|
|
69
69
|
const { dimValuesIndexes } = observation;
|
|
70
70
|
|
|
@@ -52,12 +52,7 @@ const getFormat = (freqDisplay) => {
|
|
|
52
52
|
|
|
53
53
|
const getEndDate = (start, mult, duration) => {
|
|
54
54
|
const adder = getAdder(duration);
|
|
55
|
-
|
|
56
|
-
const startTZ = start.getTimezoneOffset();
|
|
57
|
-
const endTZ = endDate.getTimezoneOffset();
|
|
58
|
-
if (startTZ !== endTZ) {
|
|
59
|
-
endDate = dateFns.addMinutes(endDate, (Math.abs(endTZ) - Math.abs(startTZ)));
|
|
60
|
-
}
|
|
55
|
+
const endDate = adder(start, Number(mult));
|
|
61
56
|
return dateFns.subSeconds(endDate, 1);
|
|
62
57
|
};
|
|
63
58
|
|
|
@@ -94,19 +89,20 @@ const computeName = (start, end, freqDisplay, locale, format) => {
|
|
|
94
89
|
|
|
95
90
|
export const getStartDate = (start) => {
|
|
96
91
|
if (!R.includes('T', start) && !R.endsWith('Z', start)) {
|
|
97
|
-
return new Date(start);
|
|
92
|
+
return dateWithoutTZ(new Date(start));
|
|
98
93
|
}
|
|
99
|
-
|
|
100
|
-
return dateFns.addMinutes(date, -date.getTimezoneOffset());
|
|
94
|
+
return new Date(start);
|
|
101
95
|
};
|
|
102
96
|
|
|
97
|
+
const dateWithTZ = date => dateFns.addMinutes(date, -date.getTimezoneOffset());
|
|
98
|
+
|
|
103
99
|
export const refineTimePeriod = (timePeriod, { locale, monthlyFormat='YYYY-MMM' }) => {
|
|
104
100
|
const { id } = timePeriod;
|
|
105
101
|
const split = R.split('/', id);
|
|
106
102
|
if (R.length(split) !== 2) {
|
|
107
103
|
const start = getStartDate(R.prop('start', timePeriod));
|
|
108
104
|
const end = getStartDate(R.prop('end', timePeriod))
|
|
109
|
-
return ({ ...timePeriod, start: start.toISOString(), end: end.toISOString() });
|
|
105
|
+
return ({ ...timePeriod, start: dateWithTZ(start).toISOString(), end: dateWithTZ(end).toISOString() });
|
|
110
106
|
}
|
|
111
107
|
const [start, range] = split;
|
|
112
108
|
const startDate = getStartDate(start);
|
|
@@ -119,12 +115,13 @@ export const refineTimePeriod = (timePeriod, { locale, monthlyFormat='YYYY-MMM'
|
|
|
119
115
|
const endDate = getEndDate(startDate, mult, duration);
|
|
120
116
|
const freqDisplay = computeDisplayFreq(start, duration);
|
|
121
117
|
const format = freqDisplay === 'M' ? monthlyFormat : getFormat(freqDisplay);
|
|
122
|
-
const name = computeName(
|
|
118
|
+
const name = computeName(startDate, endDate, freqDisplay, locale, format);
|
|
119
|
+
|
|
123
120
|
return ({
|
|
124
121
|
...timePeriod,
|
|
125
122
|
id,
|
|
126
123
|
name,
|
|
127
|
-
start: startDate.toISOString(),
|
|
128
|
-
end: endDate.toISOString()
|
|
124
|
+
start: dateWithTZ(startDate).toISOString(),
|
|
125
|
+
end: dateWithTZ(endDate).toISOString()
|
|
129
126
|
})
|
|
130
127
|
};
|