@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.
- package/dist/dotstatsuite-components.js +38112 -0
- package/package.json +4 -1
- package/.editorconfig +0 -19
- package/.gitlab-ci.yml +0 -48
- package/prettier.config.js +0 -13
- package/src/app.js +0 -13
- package/src/bridge-d3-react/README.md +0 -42
- package/src/bridge-d3-react/src/app.js +0 -64
- package/src/bridge-d3-react/src/index.js +0 -17
- package/src/bridge-d3-react/src/mock-choro.js +0 -394
- package/src/bridge-d3-react/src/react-chart-factory.js +0 -65
- package/src/index.js +0 -12
- package/src/rules/README.md +0 -23
- package/src/rules/src/chart/getAxisOptions.js +0 -258
- package/src/rules/src/chart/getBaseOptions.js +0 -84
- package/src/rules/src/chart/getChartOptions.js +0 -118
- package/src/rules/src/chart/getGridOptions.js +0 -52
- package/src/rules/src/chart/getTooltipOptions.js +0 -230
- package/src/rules/src/constants.js +0 -64
- package/src/rules/src/date.js +0 -118
- package/src/rules/src/dimension-utils.js +0 -54
- package/src/rules/src/factories/choro-series.js +0 -65
- package/src/rules/src/factories/sample-focus.js +0 -22
- package/src/rules/src/factories/sample-series.js +0 -51
- package/src/rules/src/factories/scatter-dimension.js +0 -31
- package/src/rules/src/factories/scatter-focus.js +0 -39
- package/src/rules/src/factories/scatter-series.js +0 -94
- package/src/rules/src/factories/stacked-dimension.js +0 -29
- package/src/rules/src/factories/stacked-series.js +0 -185
- package/src/rules/src/factories/symbol-dimension.js +0 -29
- package/src/rules/src/factories/symbol-series.js +0 -62
- package/src/rules/src/factories/timeline-focus.js +0 -18
- package/src/rules/src/factories/timeline-series.js +0 -91
- package/src/rules/src/get-values-enhanced.js +0 -134
- package/src/rules/src/header/getDefaultSubtitle.js +0 -40
- package/src/rules/src/header/getHeaderUnits.js +0 -17
- package/src/rules/src/header/getSubtitleFlags.js +0 -43
- package/src/rules/src/header/getTitleFlags.js +0 -8
- package/src/rules/src/header/index.js +0 -4
- package/src/rules/src/index.js +0 -398
- package/src/rules/src/layout.js +0 -113
- package/src/rules/src/observation-formater.js +0 -83
- package/src/rules/src/preparators/enhanceObservations.js +0 -152
- package/src/rules/src/preparators/formatValue.js +0 -84
- package/src/rules/src/preparators/getObservations.js +0 -19
- package/src/rules/src/preparators/getReportingYearStart.js +0 -16
- package/src/rules/src/properties/errors.js +0 -19
- package/src/rules/src/properties/focus.js +0 -69
- package/src/rules/src/properties/getAvailableChartTypes.js +0 -34
- package/src/rules/src/properties/getHeaderProps.js +0 -74
- package/src/rules/src/properties/getInformationsStateFromNewProps.js +0 -47
- package/src/rules/src/properties/getObservationsType.js +0 -29
- package/src/rules/src/properties/getStringifiedSubtitle.js +0 -6
- package/src/rules/src/properties/index.js +0 -424
- package/src/rules/src/properties/information.js +0 -84
- package/src/rules/src/properties/linear.js +0 -129
- package/src/rules/src/properties/scatter.js +0 -158
- package/src/rules/src/properties/stacked.js +0 -98
- package/src/rules/src/properties/symbol.js +0 -79
- package/src/rules/src/properties/utils.js +0 -110
- package/src/rules/src/sdmx-data/index.js +0 -39
- package/src/rules/src/table/factories/getCellValue.js +0 -50
- package/src/rules/src/table/index.js +0 -1
- package/src/rules/src/v8-transformer.js +0 -176
- package/src/rules/test/extractSdmxArtefacts.js +0 -26
- package/src/rules/test/get-values-enhanced.test.js +0 -127
- package/src/rules/test/oecd-HEALTH_PROT-no-freq.json +0 -2903
- package/src/rules/test/oecd-HEALTH_PROT-parsed.js +0 -398
- package/src/rules/test/oecd-HEALTH_PROT-wrong-freq.json +0 -2913
- package/src/rules/test/oecd-HEALTH_PROT.json +0 -2913
- package/src/rules/test/oecd-KEI.json +0 -372
- package/src/rules/test/scatter-property.js +0 -455
- package/src/rules/test/stacked-property.js +0 -273
- package/src/rules/test/symbol-property.js +0 -262
- package/src/rules/test/v8-transformer.test.js +0 -90
- package/src/rules2/src/applyHierarchicalCodesToDim.js +0 -149
- package/src/rules2/src/combinedValuesDisplay.js +0 -74
- package/src/rules2/src/constants.js +0 -6
- package/src/rules2/src/duplicateObservations.js +0 -35
- package/src/rules2/src/enhanceObservations.js +0 -95
- package/src/rules2/src/getAdvAttrSeriesAtCoordinates.js +0 -29
- package/src/rules2/src/getAttributesSeries.js +0 -36
- package/src/rules2/src/getCombinationDefinitions.js +0 -47
- package/src/rules2/src/getDataflowAttributes.js +0 -23
- package/src/rules2/src/getDataflowTooltipAttributesIds.js +0 -31
- package/src/rules2/src/getDimensionValuesIndexes.js +0 -13
- package/src/rules2/src/getHCodelistsRefsInData.js +0 -32
- package/src/rules2/src/getHeaderCombinations.js +0 -48
- package/src/rules2/src/getHeaderCoordinates.js +0 -7
- package/src/rules2/src/getHeaderSubtitle.js +0 -34
- package/src/rules2/src/getHeaderTitle.js +0 -15
- package/src/rules2/src/getMSDInformations.js +0 -23
- package/src/rules2/src/getManyValuesDimensions.js +0 -34
- package/src/rules2/src/getMetadataCoordinates.js +0 -37
- package/src/rules2/src/getMetadataStructureFromData.js +0 -17
- package/src/rules2/src/getNotDisplayedIds.js +0 -53
- package/src/rules2/src/getOneValueDimensions.js +0 -34
- package/src/rules2/src/getSeriesCombinations.js +0 -24
- package/src/rules2/src/hasCellMetadata.js +0 -14
- package/src/rules2/src/hierarchiseDimensionWithAdvancedHierarchy2.js +0 -57
- package/src/rules2/src/hierarchiseDimensionWithNativeHierarchy2.js +0 -35
- package/src/rules2/src/index.js +0 -50
- package/src/rules2/src/parseAttributes.js +0 -41
- package/src/rules2/src/parseCombinations.js +0 -102
- package/src/rules2/src/parseHierarchicalCodelist.js +0 -48
- package/src/rules2/src/parseMetadataSeries.js +0 -117
- package/src/rules2/src/prepareData.js +0 -73
- package/src/rules2/src/refineAttributes.js +0 -16
- package/src/rules2/src/refineDimensions.js +0 -18
- package/src/rules2/src/refineMetadataCoordinates.js +0 -28
- package/src/rules2/src/refineTimePeriod.js +0 -127
- package/src/rules2/src/sdmx3.0DataFormatPatch.js +0 -9
- package/src/rules2/src/table/declineObservationsOverAttributes.js +0 -32
- package/src/rules2/src/table/getCells.js +0 -93
- package/src/rules2/src/table/getCellsAttributesIds.js +0 -38
- package/src/rules2/src/table/getCellsMetadataCoordinates.js +0 -13
- package/src/rules2/src/table/getCombinationDimensionsData.js +0 -39
- package/src/rules2/src/table/getCuratedCells.js +0 -33
- package/src/rules2/src/table/getFlagsAndNotes.js +0 -23
- package/src/rules2/src/table/getIndexedCombinationsByDisplay.js +0 -16
- package/src/rules2/src/table/getLayout.js +0 -84
- package/src/rules2/src/table/getLayoutData2.js +0 -198
- package/src/rules2/src/table/getSortedLayoutIndexes.js +0 -124
- package/src/rules2/src/table/getTableLabelAccessor.js +0 -9
- package/src/rules2/src/table/getTableLayoutIds.js +0 -314
- package/src/rules2/src/table/getTableProps.js +0 -75
- package/src/rules2/src/table/parseSeriesIndexesHierarchies.js +0 -79
- package/src/rules2/src/table/parseValueHierarchy.js +0 -33
- package/src/rules2/src/table/refineLayoutSize2.js +0 -321
- package/src/rules2/src/utils.js +0 -37
- package/src/viewer/mocks/bar.js +0 -33
- package/src/viewer/mocks/gpp-symbol.js +0 -93
- package/src/viewer/mocks/gpp-time.js +0 -1103
- package/src/viewer/mocks/row.js +0 -39
- package/src/viewer/mocks/scatter.js +0 -93
- package/src/viewer/mocks/stack.js +0 -161
- package/src/viewer/src/app/leg.js +0 -36
- package/src/viewer/src/app/nodata-res.js +0 -22
- package/src/viewer/src/app/nodata-sized.js +0 -23
- package/src/viewer/src/app/one-table-cell.js +0 -70
- package/src/viewer/src/app/table.js +0 -423
- package/src/viewer/src/app/use-case-1.js +0 -33
- package/src/viewer/src/app/use-case-2.js +0 -38
- package/src/viewer/src/app/use-case-3.js +0 -18
- package/src/viewer/src/app.js +0 -116
- package/src/viewer/src/chart.js +0 -52
- package/src/viewer/src/chartUtils/options.js +0 -30
- package/src/viewer/src/chartUtils/series.js +0 -51
- package/src/viewer/src/footer.js +0 -24
- package/src/viewer/src/header.js +0 -10
- package/src/viewer/src/index.js +0 -158
- package/src/viewer/src/legends/AxisLegend.js +0 -41
- package/src/viewer/src/legends/ChartLegends.js +0 -66
- package/src/viewer/src/legends/FocusLegend.js +0 -63
- package/src/viewer/src/legends/Legend.js +0 -46
- package/src/viewer/src/legends/SeriesLegend.js +0 -78
- package/src/viewer/src/utils.js +0 -21
- package/test/applyHierarchicalCodesToDim.test.js +0 -160
- package/test/combinedValuesDisplay.test.js +0 -66
- package/test/duplicateObs.test.js +0 -118
- package/test/enhanceObservations2.test.js +0 -257
- package/test/getAttributesSeries.test.js +0 -66
- package/test/getAxisOptions.test.js +0 -309
- package/test/getBaseOptions.test.js +0 -77
- package/test/getCellValue.test.js +0 -32
- package/test/getCells.test.js +0 -178
- package/test/getCellsMetadataCoordinates.test.js +0 -40
- package/test/getCombinationDefinitions.test.js +0 -104
- package/test/getCombinationDimensionsData.test.js +0 -99
- package/test/getDataflowAttributes.test.js +0 -23
- package/test/getDataflowTooltipAttributesIds.test.js +0 -146
- package/test/getDimensionValuesIndexes.test.js +0 -33
- package/test/getGridOptions.test.js +0 -65
- package/test/getHCodelistsRefs.test.js +0 -23
- package/test/getHeaderCombinations.test.js +0 -62
- package/test/getHeaderTitle.test.js +0 -25
- package/test/getLayout.test.js +0 -54
- package/test/getLayoutData2.test.js +0 -535
- package/test/getMSDInformations.test.js +0 -35
- package/test/getMetadataCoordinates.test.js +0 -0
- package/test/getNotDisplayedIds.test.js +0 -47
- package/test/getObservationsType.test.js +0 -55
- package/test/getOneValueDimensions.test.js +0 -35
- package/test/getReportingYearStart.test.js +0 -59
- package/test/getSeriesCombinations.test.js +0 -29
- package/test/getSortedLayoutIndexes.test.js +0 -1138
- package/test/getTableLabelAccessor.test.js +0 -50
- package/test/getTableLayoutIds.test.js +0 -356
- package/test/hierarchiseDimensionWithNativeHierarchy2.test.js +0 -109
- package/test/isTableLayoutCompatible.test.js +0 -102
- package/test/metadata-parsing-perf.test.js +0 -509
- package/test/mocks/MSD_TEST.json +0 -490
- package/test/mocks/OECD_SNA_TABLE1_1.0_-_AUS_V_metadata.json +0 -152
- package/test/mocks/h-codelist.json +0 -2095
- package/test/mocks/large_metadata_series.json +0 -701
- package/test/mocks/observations-advanced-attributes.json +0 -55382
- package/test/mocks/table-invert-time--data.json +0 -80211
- package/test/mocks/table-invert-time--inverted.json +0 -80076
- package/test/mocks/table-layout-multi-hierarchies--layout.json +0 -621
- package/test/mocks/table-layout-multi-hierarchies--layoutData.json +0 -32411
- package/test/mocks/table-layout-multi-hierarchies--layoutIndexes.json +0 -2760
- package/test/mocks/table-layout-multi-hierarchies--observations.json +0 -30688
- package/test/mocks/table-layout-multi-hierarchies--sizedIndexes.json +0 -2762
- package/test/mocks/table-layout-truncation1--layout.json +0 -27469
- package/test/mocks/table-layout-truncation1--layoutData.json +0 -20358
- package/test/mocks/table-layout-truncation1--layoutIndexes.json +0 -7512
- package/test/mocks/table-layout-truncation1--observations.json +0 -70002
- package/test/mocks/table-layout-truncation1--sizedIndexes.json +0 -3011
- package/test/mocks/table-prep-multi-hierarchies--attributes.json +0 -46
- package/test/mocks/table-prep-multi-hierarchies--dimensions.json +0 -688
- package/test/mocks/table-prep-multi-hierarchies--enhancedObservations.json +0 -19696
- package/test/mocks/table-prep-multi-hierarchies--observations.json +0 -8246
- package/test/mocks/table-prep-multi-hierarchies--sdmxJson.json +0 -2985
- package/test/mocks/table-prep-simple-duplicate--dimensions2.json +0 -858
- package/test/mocks/table-prep-simple-duplicate--duplicated2.json +0 -77502
- package/test/mocks/table-prep-simple-duplicate--observations2.json +0 -60002
- package/test/mocks/table-prep-truncation1--dimensions.json +0 -35057
- package/test/mocks/table-prep-truncation1--enhancedObservations.json +0 -70002
- package/test/mocks/table-prep-truncation1--observations.json +0 -27502
- package/test/mocks/table-prep-truncation1--sdmxJson.json +0 -55103
- package/test/mocks/table-prep-units--observations.json +0 -284286
- package/test/mocks/table-prep-units--unitsSeries.json +0 -41042
- package/test/parseAttributes.test.js +0 -36
- package/test/parseCombinations.test.js +0 -172
- package/test/parseHierarchicalCodelist.test.js +0 -140
- package/test/parseMetadataSeries.test.js +0 -128
- package/test/parseSeriesIndexesHierarchies.test.js +0 -345
- package/test/parseValueHierarchy.test.js +0 -138
- package/test/refineAttributes.test.js +0 -29
- package/test/refineLayoutSize2.test.js +0 -3410
- package/test/refineMetadataCoordinates.test.js +0 -86
- package/test/refineTimePeriod.test.js +0 -580
- package/test/refinedDimensions.test.js +0 -35
- 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
|
-
};
|
package/src/rules/src/index.js
DELETED
|
@@ -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;
|
package/src/rules/src/layout.js
DELETED
|
@@ -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
|
-
};
|