@sis-cc/dotstatsuite-components 21.0.1 → 21.1.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 (234) hide show
  1. package/dist/dotstatsuite-components.js +38112 -0
  2. package/package.json +4 -1
  3. package/.editorconfig +0 -19
  4. package/.gitlab-ci.yml +0 -48
  5. package/prettier.config.js +0 -13
  6. package/src/app.js +0 -13
  7. package/src/bridge-d3-react/README.md +0 -42
  8. package/src/bridge-d3-react/src/app.js +0 -64
  9. package/src/bridge-d3-react/src/index.js +0 -17
  10. package/src/bridge-d3-react/src/mock-choro.js +0 -394
  11. package/src/bridge-d3-react/src/react-chart-factory.js +0 -65
  12. package/src/index.js +0 -12
  13. package/src/rules/README.md +0 -23
  14. package/src/rules/src/chart/getAxisOptions.js +0 -258
  15. package/src/rules/src/chart/getBaseOptions.js +0 -84
  16. package/src/rules/src/chart/getChartOptions.js +0 -118
  17. package/src/rules/src/chart/getGridOptions.js +0 -52
  18. package/src/rules/src/chart/getTooltipOptions.js +0 -230
  19. package/src/rules/src/constants.js +0 -64
  20. package/src/rules/src/date.js +0 -118
  21. package/src/rules/src/dimension-utils.js +0 -54
  22. package/src/rules/src/factories/choro-series.js +0 -65
  23. package/src/rules/src/factories/sample-focus.js +0 -22
  24. package/src/rules/src/factories/sample-series.js +0 -51
  25. package/src/rules/src/factories/scatter-dimension.js +0 -31
  26. package/src/rules/src/factories/scatter-focus.js +0 -39
  27. package/src/rules/src/factories/scatter-series.js +0 -94
  28. package/src/rules/src/factories/stacked-dimension.js +0 -29
  29. package/src/rules/src/factories/stacked-series.js +0 -185
  30. package/src/rules/src/factories/symbol-dimension.js +0 -29
  31. package/src/rules/src/factories/symbol-series.js +0 -62
  32. package/src/rules/src/factories/timeline-focus.js +0 -18
  33. package/src/rules/src/factories/timeline-series.js +0 -91
  34. package/src/rules/src/get-values-enhanced.js +0 -134
  35. package/src/rules/src/header/getDefaultSubtitle.js +0 -40
  36. package/src/rules/src/header/getHeaderUnits.js +0 -17
  37. package/src/rules/src/header/getSubtitleFlags.js +0 -43
  38. package/src/rules/src/header/getTitleFlags.js +0 -8
  39. package/src/rules/src/header/index.js +0 -4
  40. package/src/rules/src/index.js +0 -398
  41. package/src/rules/src/layout.js +0 -113
  42. package/src/rules/src/observation-formater.js +0 -83
  43. package/src/rules/src/preparators/enhanceObservations.js +0 -152
  44. package/src/rules/src/preparators/formatValue.js +0 -84
  45. package/src/rules/src/preparators/getObservations.js +0 -19
  46. package/src/rules/src/preparators/getReportingYearStart.js +0 -16
  47. package/src/rules/src/properties/errors.js +0 -19
  48. package/src/rules/src/properties/focus.js +0 -69
  49. package/src/rules/src/properties/getAvailableChartTypes.js +0 -34
  50. package/src/rules/src/properties/getHeaderProps.js +0 -74
  51. package/src/rules/src/properties/getInformationsStateFromNewProps.js +0 -47
  52. package/src/rules/src/properties/getObservationsType.js +0 -29
  53. package/src/rules/src/properties/getStringifiedSubtitle.js +0 -6
  54. package/src/rules/src/properties/index.js +0 -424
  55. package/src/rules/src/properties/information.js +0 -84
  56. package/src/rules/src/properties/linear.js +0 -129
  57. package/src/rules/src/properties/scatter.js +0 -158
  58. package/src/rules/src/properties/stacked.js +0 -98
  59. package/src/rules/src/properties/symbol.js +0 -79
  60. package/src/rules/src/properties/utils.js +0 -110
  61. package/src/rules/src/sdmx-data/index.js +0 -39
  62. package/src/rules/src/table/factories/getCellValue.js +0 -50
  63. package/src/rules/src/table/index.js +0 -1
  64. package/src/rules/src/v8-transformer.js +0 -176
  65. package/src/rules/test/extractSdmxArtefacts.js +0 -26
  66. package/src/rules/test/get-values-enhanced.test.js +0 -127
  67. package/src/rules/test/oecd-HEALTH_PROT-no-freq.json +0 -2903
  68. package/src/rules/test/oecd-HEALTH_PROT-parsed.js +0 -398
  69. package/src/rules/test/oecd-HEALTH_PROT-wrong-freq.json +0 -2913
  70. package/src/rules/test/oecd-HEALTH_PROT.json +0 -2913
  71. package/src/rules/test/oecd-KEI.json +0 -372
  72. package/src/rules/test/scatter-property.js +0 -455
  73. package/src/rules/test/stacked-property.js +0 -273
  74. package/src/rules/test/symbol-property.js +0 -262
  75. package/src/rules/test/v8-transformer.test.js +0 -90
  76. package/src/rules2/src/applyHierarchicalCodesToDim.js +0 -149
  77. package/src/rules2/src/combinedValuesDisplay.js +0 -74
  78. package/src/rules2/src/constants.js +0 -6
  79. package/src/rules2/src/duplicateObservations.js +0 -35
  80. package/src/rules2/src/enhanceObservations.js +0 -95
  81. package/src/rules2/src/getAdvAttrSeriesAtCoordinates.js +0 -29
  82. package/src/rules2/src/getAttributesSeries.js +0 -36
  83. package/src/rules2/src/getCombinationDefinitions.js +0 -47
  84. package/src/rules2/src/getDataflowAttributes.js +0 -23
  85. package/src/rules2/src/getDataflowTooltipAttributesIds.js +0 -31
  86. package/src/rules2/src/getDimensionValuesIndexes.js +0 -13
  87. package/src/rules2/src/getHCodelistsRefsInData.js +0 -32
  88. package/src/rules2/src/getHeaderCombinations.js +0 -48
  89. package/src/rules2/src/getHeaderCoordinates.js +0 -7
  90. package/src/rules2/src/getHeaderSubtitle.js +0 -34
  91. package/src/rules2/src/getHeaderTitle.js +0 -15
  92. package/src/rules2/src/getMSDInformations.js +0 -23
  93. package/src/rules2/src/getManyValuesDimensions.js +0 -34
  94. package/src/rules2/src/getMetadataCoordinates.js +0 -37
  95. package/src/rules2/src/getMetadataStructureFromData.js +0 -17
  96. package/src/rules2/src/getNotDisplayedIds.js +0 -53
  97. package/src/rules2/src/getOneValueDimensions.js +0 -34
  98. package/src/rules2/src/getSeriesCombinations.js +0 -24
  99. package/src/rules2/src/hasCellMetadata.js +0 -14
  100. package/src/rules2/src/hierarchiseDimensionWithAdvancedHierarchy2.js +0 -57
  101. package/src/rules2/src/hierarchiseDimensionWithNativeHierarchy2.js +0 -35
  102. package/src/rules2/src/index.js +0 -50
  103. package/src/rules2/src/parseAttributes.js +0 -41
  104. package/src/rules2/src/parseCombinations.js +0 -102
  105. package/src/rules2/src/parseHierarchicalCodelist.js +0 -48
  106. package/src/rules2/src/parseMetadataSeries.js +0 -117
  107. package/src/rules2/src/prepareData.js +0 -73
  108. package/src/rules2/src/refineAttributes.js +0 -16
  109. package/src/rules2/src/refineDimensions.js +0 -18
  110. package/src/rules2/src/refineMetadataCoordinates.js +0 -28
  111. package/src/rules2/src/refineTimePeriod.js +0 -127
  112. package/src/rules2/src/sdmx3.0DataFormatPatch.js +0 -9
  113. package/src/rules2/src/table/declineObservationsOverAttributes.js +0 -32
  114. package/src/rules2/src/table/getCells.js +0 -93
  115. package/src/rules2/src/table/getCellsAttributesIds.js +0 -38
  116. package/src/rules2/src/table/getCellsMetadataCoordinates.js +0 -13
  117. package/src/rules2/src/table/getCombinationDimensionsData.js +0 -39
  118. package/src/rules2/src/table/getCuratedCells.js +0 -33
  119. package/src/rules2/src/table/getFlagsAndNotes.js +0 -23
  120. package/src/rules2/src/table/getIndexedCombinationsByDisplay.js +0 -16
  121. package/src/rules2/src/table/getLayout.js +0 -84
  122. package/src/rules2/src/table/getLayoutData2.js +0 -198
  123. package/src/rules2/src/table/getSortedLayoutIndexes.js +0 -124
  124. package/src/rules2/src/table/getTableLabelAccessor.js +0 -9
  125. package/src/rules2/src/table/getTableLayoutIds.js +0 -314
  126. package/src/rules2/src/table/getTableProps.js +0 -75
  127. package/src/rules2/src/table/parseSeriesIndexesHierarchies.js +0 -79
  128. package/src/rules2/src/table/parseValueHierarchy.js +0 -33
  129. package/src/rules2/src/table/refineLayoutSize2.js +0 -321
  130. package/src/rules2/src/utils.js +0 -37
  131. package/src/viewer/mocks/bar.js +0 -33
  132. package/src/viewer/mocks/gpp-symbol.js +0 -93
  133. package/src/viewer/mocks/gpp-time.js +0 -1103
  134. package/src/viewer/mocks/row.js +0 -39
  135. package/src/viewer/mocks/scatter.js +0 -93
  136. package/src/viewer/mocks/stack.js +0 -161
  137. package/src/viewer/src/app/leg.js +0 -36
  138. package/src/viewer/src/app/nodata-res.js +0 -22
  139. package/src/viewer/src/app/nodata-sized.js +0 -23
  140. package/src/viewer/src/app/one-table-cell.js +0 -70
  141. package/src/viewer/src/app/table.js +0 -423
  142. package/src/viewer/src/app/use-case-1.js +0 -33
  143. package/src/viewer/src/app/use-case-2.js +0 -38
  144. package/src/viewer/src/app/use-case-3.js +0 -18
  145. package/src/viewer/src/app.js +0 -116
  146. package/src/viewer/src/chart.js +0 -52
  147. package/src/viewer/src/chartUtils/options.js +0 -30
  148. package/src/viewer/src/chartUtils/series.js +0 -51
  149. package/src/viewer/src/footer.js +0 -24
  150. package/src/viewer/src/header.js +0 -10
  151. package/src/viewer/src/index.js +0 -158
  152. package/src/viewer/src/legends/AxisLegend.js +0 -41
  153. package/src/viewer/src/legends/ChartLegends.js +0 -66
  154. package/src/viewer/src/legends/FocusLegend.js +0 -63
  155. package/src/viewer/src/legends/Legend.js +0 -46
  156. package/src/viewer/src/legends/SeriesLegend.js +0 -78
  157. package/src/viewer/src/utils.js +0 -21
  158. package/test/applyHierarchicalCodesToDim.test.js +0 -160
  159. package/test/combinedValuesDisplay.test.js +0 -66
  160. package/test/duplicateObs.test.js +0 -118
  161. package/test/enhanceObservations2.test.js +0 -257
  162. package/test/getAttributesSeries.test.js +0 -66
  163. package/test/getAxisOptions.test.js +0 -309
  164. package/test/getBaseOptions.test.js +0 -77
  165. package/test/getCellValue.test.js +0 -32
  166. package/test/getCells.test.js +0 -178
  167. package/test/getCellsMetadataCoordinates.test.js +0 -40
  168. package/test/getCombinationDefinitions.test.js +0 -104
  169. package/test/getCombinationDimensionsData.test.js +0 -99
  170. package/test/getDataflowAttributes.test.js +0 -23
  171. package/test/getDataflowTooltipAttributesIds.test.js +0 -146
  172. package/test/getDimensionValuesIndexes.test.js +0 -33
  173. package/test/getGridOptions.test.js +0 -65
  174. package/test/getHCodelistsRefs.test.js +0 -23
  175. package/test/getHeaderCombinations.test.js +0 -62
  176. package/test/getHeaderTitle.test.js +0 -25
  177. package/test/getLayout.test.js +0 -54
  178. package/test/getLayoutData2.test.js +0 -535
  179. package/test/getMSDInformations.test.js +0 -35
  180. package/test/getMetadataCoordinates.test.js +0 -0
  181. package/test/getNotDisplayedIds.test.js +0 -47
  182. package/test/getObservationsType.test.js +0 -55
  183. package/test/getOneValueDimensions.test.js +0 -35
  184. package/test/getReportingYearStart.test.js +0 -59
  185. package/test/getSeriesCombinations.test.js +0 -29
  186. package/test/getSortedLayoutIndexes.test.js +0 -1138
  187. package/test/getTableLabelAccessor.test.js +0 -50
  188. package/test/getTableLayoutIds.test.js +0 -356
  189. package/test/hierarchiseDimensionWithNativeHierarchy2.test.js +0 -109
  190. package/test/isTableLayoutCompatible.test.js +0 -102
  191. package/test/metadata-parsing-perf.test.js +0 -509
  192. package/test/mocks/MSD_TEST.json +0 -490
  193. package/test/mocks/OECD_SNA_TABLE1_1.0_-_AUS_V_metadata.json +0 -152
  194. package/test/mocks/h-codelist.json +0 -2095
  195. package/test/mocks/large_metadata_series.json +0 -701
  196. package/test/mocks/observations-advanced-attributes.json +0 -55382
  197. package/test/mocks/table-invert-time--data.json +0 -80211
  198. package/test/mocks/table-invert-time--inverted.json +0 -80076
  199. package/test/mocks/table-layout-multi-hierarchies--layout.json +0 -621
  200. package/test/mocks/table-layout-multi-hierarchies--layoutData.json +0 -32411
  201. package/test/mocks/table-layout-multi-hierarchies--layoutIndexes.json +0 -2760
  202. package/test/mocks/table-layout-multi-hierarchies--observations.json +0 -30688
  203. package/test/mocks/table-layout-multi-hierarchies--sizedIndexes.json +0 -2762
  204. package/test/mocks/table-layout-truncation1--layout.json +0 -27469
  205. package/test/mocks/table-layout-truncation1--layoutData.json +0 -20358
  206. package/test/mocks/table-layout-truncation1--layoutIndexes.json +0 -7512
  207. package/test/mocks/table-layout-truncation1--observations.json +0 -70002
  208. package/test/mocks/table-layout-truncation1--sizedIndexes.json +0 -3011
  209. package/test/mocks/table-prep-multi-hierarchies--attributes.json +0 -46
  210. package/test/mocks/table-prep-multi-hierarchies--dimensions.json +0 -688
  211. package/test/mocks/table-prep-multi-hierarchies--enhancedObservations.json +0 -19696
  212. package/test/mocks/table-prep-multi-hierarchies--observations.json +0 -8246
  213. package/test/mocks/table-prep-multi-hierarchies--sdmxJson.json +0 -2985
  214. package/test/mocks/table-prep-simple-duplicate--dimensions2.json +0 -858
  215. package/test/mocks/table-prep-simple-duplicate--duplicated2.json +0 -77502
  216. package/test/mocks/table-prep-simple-duplicate--observations2.json +0 -60002
  217. package/test/mocks/table-prep-truncation1--dimensions.json +0 -35057
  218. package/test/mocks/table-prep-truncation1--enhancedObservations.json +0 -70002
  219. package/test/mocks/table-prep-truncation1--observations.json +0 -27502
  220. package/test/mocks/table-prep-truncation1--sdmxJson.json +0 -55103
  221. package/test/mocks/table-prep-units--observations.json +0 -284286
  222. package/test/mocks/table-prep-units--unitsSeries.json +0 -41042
  223. package/test/parseAttributes.test.js +0 -36
  224. package/test/parseCombinations.test.js +0 -172
  225. package/test/parseHierarchicalCodelist.test.js +0 -140
  226. package/test/parseMetadataSeries.test.js +0 -128
  227. package/test/parseSeriesIndexesHierarchies.test.js +0 -345
  228. package/test/parseValueHierarchy.test.js +0 -138
  229. package/test/refineAttributes.test.js +0 -29
  230. package/test/refineLayoutSize2.test.js +0 -3410
  231. package/test/refineMetadataCoordinates.test.js +0 -86
  232. package/test/refineTimePeriod.test.js +0 -580
  233. package/test/refinedDimensions.test.js +0 -35
  234. package/vite.config.mjs +0 -51
@@ -1,17 +0,0 @@
1
- import * as R from 'ramda';
2
- import { dimensionValueDisplay, parseDisplay } from '../';
3
-
4
- export const getHeaderUnits = ({ units, display }) => {
5
- const _display = parseDisplay(display);
6
- return R.converge(
7
- (header, label) => R.isEmpty(label) ? null : { header, label },
8
- [
9
- (units) => `${dimensionValueDisplay(_display)(units)}:`,
10
- R.pipe(
11
- R.propOr([], 'values'),
12
- R.map(R.pipe(R.propOr({}, 'value'), dimensionValueDisplay(_display))),
13
- R.join(', ')
14
- )
15
- ]
16
- )(units);
17
- };
@@ -1,43 +0,0 @@
1
- import * as R from 'ramda';
2
- import { dimensionValueDisplay, getFlags, parseDisplay } from '../';
3
- import { DEFAULT_REJECTED_SUBTITLE_IDS } from '../constants';
4
-
5
- export const getSubtitleFlags = ({ customAttributes, dimensions, display, units }) => {
6
- const _display = parseDisplay(display);
7
- const formatter = dimensionValueDisplay(_display);
8
- const _getFlags = getFlags(customAttributes, formatter, {});
9
- const unitsValuesIds = R.pipe(R.propOr([], 'values'), R.pluck('id'))(units);
10
-
11
- return R.pipe(
12
- R.propOr([], 'one'),
13
- R.values,
14
- R.sortBy(R.prop('__index')),
15
- R.reduce(
16
- (acc, dim) => {
17
- if (!R.propOr(true, 'display', dim)) {
18
- return acc;
19
- }
20
- if (R.includes(dim.id, unitsValuesIds)) {
21
- return acc;
22
- }
23
- const value = R.path(['values', 0], dim);
24
-
25
- if (R.includes(value.id, DEFAULT_REJECTED_SUBTITLE_IDS) || !R.propOr(true, 'display', value)) {
26
- return acc;
27
- }
28
-
29
- const flags = _getFlags({ attributes: R.propOr({}, 'attributes', value), notes: R.propOr([], 'notes', value) });
30
- if (R.isEmpty(flags)) {
31
- return acc;
32
- }
33
-
34
- return R.append({
35
- header: `${formatter(dim)}:`,
36
- label: formatter(value),
37
- sub: flags
38
- }, acc);
39
- },
40
- []
41
- )
42
- )(dimensions);
43
- };
@@ -1,8 +0,0 @@
1
- import * as R from 'ramda';
2
- import { parseDisplay, dimensionValueDisplay, getFlags } from '../';
3
-
4
- export const getTitleFlags = ({ customAttributes, dataflowAttributes, display }) => {
5
- const _display = parseDisplay(display);
6
- const formatter = dimensionValueDisplay(_display);
7
- return getFlags(customAttributes, formatter, {})({ attributes: dataflowAttributes });
8
- };
@@ -1,4 +0,0 @@
1
- export { getDefaultSubtitle } from './getDefaultSubtitle';
2
- export { getSubtitleFlags } from './getSubtitleFlags';
3
- export { getHeaderUnits } from './getHeaderUnits';
4
- export { getTitleFlags } from './getTitleFlags';
@@ -1,398 +0,0 @@
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';
371
- export {
372
- initialState,
373
- stateFromNewProps,
374
- onChangeProperties,
375
- toChartData,
376
- toChartOptions,
377
- toProperties,
378
- getErrors,
379
- toSingularity
380
- } from './properties';
381
- export { dataTransformer as v8Transformer } from './v8-transformer';
382
- export {
383
- getCellValue,
384
- } from './table';
385
- export {
386
- getFullName,
387
- } from './sdmx-data';
388
- export { getTimePeriodLabel } from './date';
389
- export { getHeaderProps, getFooterProps, } from './properties/getHeaderProps';
390
- export { getInformationsStateFromNewProps } from './properties/getInformationsStateFromNewProps';
391
- export { getObservationsType } from './properties/getObservationsType';
392
- export { getAvailableChartTypes } from './properties/getAvailableChartTypes';
393
- export { isSharedLayoutCompatible } from './layout';
394
-
395
- export { getObservations } from './preparators/getObservations';
396
-
397
- export const getFlags = R.identity;
398
- export const prepareData = R.identity;
@@ -1,113 +0,0 @@
1
- import * as R from 'ramda';
2
- import {
3
- H_SYMBOL,
4
- SCATTER,
5
- STACKED_BAR,
6
- STACKED_ROW,
7
- V_SYMBOL
8
- } from './constants';
9
- import {
10
- getCombinationDefinitions,
11
- refineDimensions,
12
- parseCombinationDefinition
13
- } from '../../rules2/src';
14
-
15
- const isTableLayoutCompatible = (data, layout, combinationsDefinitions = [], dataquery = '') => {
16
- const indexedCombinations = R.indexBy(R.prop('id'), combinationsDefinitions);
17
- const indexedManyValuesDimensions = R.pipe(
18
- R.pathOr([], ['structure', 'dimensions', 'observation']),
19
- dimensions => refineDimensions(dimensions, dataquery),
20
- R.reject(d => R.prop('header', d) || !R.length(d.values || [])),
21
- R.indexBy(R.prop('id'))
22
- )(data);
23
- let remainings = indexedManyValuesDimensions;
24
- const layoutIds = R.pipe(R.values, R.unnest)(layout);
25
- let hasFoundIrrelevant = false;
26
- R.forEach(id => {
27
- if (R.has(id, indexedManyValuesDimensions)) {
28
- remainings = R.dissoc(id, remainings);
29
- }
30
- else if (R.has(id, indexedCombinations)) {
31
- remainings = R.omit(R.pathOr([], [id, 'concepts'], indexedCombinations), remainings);
32
- }
33
- else if (id !== 'OBS_ATTRIBUTES') {
34
- hasFoundIrrelevant = true;
35
- }
36
- }, layoutIds);
37
- return R.isEmpty(remainings) && !hasFoundIrrelevant;
38
- };
39
-
40
-
41
- const isScatterLayoutCompatible = (data, chartDimension) => {
42
- const { id, xId, yId } = chartDimension;
43
-
44
- const dimensions = R.pathOr([], ['structure', 'dimensions', 'observation'], data);
45
-
46
- const dimension = R.find(R.propEq('id', id), dimensions);
47
- if (R.isNil(dimension)) {
48
- return false;
49
- }
50
- return R.pipe(
51
- R.propOr([], 'values'),
52
- R.indexBy(R.prop('id')),
53
- R.pick([xId, yId]),
54
- R.values,
55
- R.length,
56
- R.equals(2)
57
- )(dimension);
58
- };
59
-
60
- const isSymbolLayoutCompatible = (data, chartDimension) => {
61
- const { id, serie } = chartDimension;
62
- const serieIds = R.pluck('id',serie);
63
-
64
- return R.pipe(
65
- R.pathOr([], ['structure', 'dimensions', 'observation']),
66
- R.indexBy(R.prop('id')),
67
- R.pathOr([], [id, 'values']),
68
- R.indexBy(R.prop('id')),
69
- R.pick(serieIds),
70
- R.values,
71
- R.length,
72
- R.equals(R.length(serieIds))
73
- )(data);
74
- };
75
-
76
- const isStackedLayoutCompatible = (data, chartDimension) => {
77
- const { id } = chartDimension;
78
-
79
- return R.pipe(
80
- R.pathOr([], ['structure', 'dimensions', 'observation']),
81
- R.filter(R.pipe(R.propOr([], 'values'), R.length, R.lt(1))),
82
- R.indexBy(R.prop('id')),
83
- R.has(id)
84
- )(data);
85
- };
86
-
87
- const isChartLayoutCompatible = (data, type, chartDimension) => {
88
- return R.cond([
89
- [R.always(R.equals(SCATTER, type)), isScatterLayoutCompatible],
90
- [R.always(R.equals(H_SYMBOL, type) || R.equals(V_SYMBOL, type)), isSymbolLayoutCompatible],
91
- [R.always(R.anyPass([R.equals(STACKED_BAR), R.equals(STACKED_ROW)])(type)), isStackedLayoutCompatible],
92
- [R.T, R.T]
93
- ])(data, chartDimension);
94
- };
95
-
96
- export const isSharedLayoutCompatible = (sdmxData, sharedData) => {
97
- const type = R.prop('type', sharedData);
98
- if (type === 'table') {
99
- const layoutIds = R.pathOr({}, ['config', 'table', 'layoutIds'], sharedData);
100
- const dataquery = R.path(['config', 'sdmxSource', 'dataquery'], sharedData);
101
- const annotations = R.pathOr({}, ['structure', 'annotations'], sdmxData)
102
- const locale = R.pathOr({}, ['config', 'table', 'locale'], sharedData);
103
- const rawDefaultCombinationsDefinition = R.pathOr({}, ['config', 'defaultCombinations'], sharedData);
104
- const { concepts='', names='' } = rawDefaultCombinationsDefinition;
105
- const defaultCombinationsDefinition = parseCombinationDefinition(locale)(concepts, names);
106
- const customCombinationsDefinitions = getCombinationDefinitions(annotations, locale);
107
- const combinationsDefinitions = R.isNil(customCombinationsDefinitions) || R.isEmpty(customCombinationsDefinitions)
108
- ? defaultCombinationsDefinition : customCombinationsDefinitions;
109
- return isTableLayoutCompatible(sdmxData, layoutIds, combinationsDefinitions, dataquery);
110
- }
111
- const chartDimension = R.pathOr({}, ['config', 'chart', 'chartDimension'], sharedData);
112
- return isChartLayoutCompatible(sdmxData, type, chartDimension);
113
- };
@@ -1,83 +0,0 @@
1
- import memoizee from 'memoizee';
2
- import numeral from 'numeral';
3
- import * as R from 'ramda';
4
- import { extractSdmxArtefacts } from './';
5
-
6
- export const DEFAULT_PREFSCALE_ATTR_IDS = ["PREF_SCALE"];
7
-
8
- export const DEFAULT_DECIMALS_ATTR_IDS = ["DECIMALS"];
9
-
10
- export const getFormaterAttribute = (ids, attributes) => R.find(
11
- (attr) => R.includes(attr.id, ids),
12
- attributes
13
- );
14
-
15
- export const parseAttributeFormaterIds = (ids = {}) => {
16
- let prefscale = R.prop('prefscale', ids);
17
- let decimals = R.prop('decimals', ids);
18
- decimals = R.isNil(decimals) ? DEFAULT_DECIMALS_ATTR_IDS : decimals;
19
- prefscale = R.isNil(prefscale) ? DEFAULT_PREFSCALE_ATTR_IDS : prefscale;
20
- return ({
21
- decimals: R.is(Array, decimals) ? decimals : [decimals],
22
- prefscale: R.is(Array, prefscale) ? prefscale : [prefscale],
23
- });
24
- }
25
-
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);
37
-
38
- export const getObservationFormaterValue = (observation, attribute) => {
39
- const attributeIndex = R.prop('index', attribute);
40
- const attributeValueIndex = R.nth(attributeIndex, observation);
41
- return R.nth(attributeValueIndex, R.propOr([], 'values', attribute));
42
- }
43
-
44
- export const getObservationFormaterValues = (formaterAttributes) => (observation) => ({
45
- decimals: getObservationFormaterValue(observation, R.prop('decimals', formaterAttributes)),
46
- prefscale: getObservationFormaterValue(observation, R.prop('prefscale', formaterAttributes)),
47
- });
48
-
49
- export const makeObservationFormater = (formaterValues) => {
50
- let prefscale = 0;
51
- if (!R.isNil(R.prop('prefscale', formaterValues))) {
52
- prefscale = Number(R.propOr('0', 'id', formaterValues.prefscale));
53
- }
54
- let decimals = null;
55
- if (!R.isNil(R.prop('decimals', formaterValues))) {
56
- let _decimals = Number(R.prop('id', formaterValues.decimals));
57
- decimals = R.is(Number, _decimals) && !Number.isNaN(_decimals)
58
- ? _decimals : null;
59
- }
60
- let format = '0,0';
61
- if (R.isNil(decimals)) {
62
- format = R.concat(format, '.[0000000]');
63
- }
64
- else if (decimals > 0) {
65
- format = R.concat(format, `.[${'0'.repeat(decimals)}]`);
66
- }
67
- return value => numeral(Number(value))
68
- .multiply(Math.pow(10, R.negate(prefscale)))
69
- .format(format);
70
- };
71
-
72
- export const getObservationFormater = (observation, formaterAttributes) => {
73
- return R.pipe(
74
- R.tail,
75
- getObservationFormaterValues(formaterAttributes),
76
- makeObservationFormater
77
- )(observation);
78
- }
79
-
80
- export const getFormatedObservation = (observation, formaterAttributes) => {
81
- const formater = getObservationFormater(observation, formaterAttributes);
82
- return formater(R.head(observation));
83
- };