@dhis2/analytics 23.8.0 → 23.8.3

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 (30) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/build/cjs/api/dimensions.js +19 -19
  3. package/build/cjs/components/DataDimension/{DataTypesSelector.js → DataTypeSelector.js} +11 -11
  4. package/build/cjs/components/DataDimension/GroupSelector.js +10 -10
  5. package/build/cjs/components/DataDimension/ItemSelector.js +31 -31
  6. package/build/cjs/components/DataDimension/MetricSelector.js +4 -4
  7. package/build/cjs/components/DataDimension/styles/{DataTypesSelector.style.js → DataTypeSelector.style.js} +0 -0
  8. package/build/cjs/components/FileMenu/FileMenu.styles.js +2 -2
  9. package/build/cjs/index.js +98 -0
  10. package/build/cjs/modules/__tests__/renderValue.spec.js +289 -0
  11. package/build/cjs/modules/dataTypes.js +53 -39
  12. package/build/cjs/modules/pivotTable/PivotTableEngine.js +5 -3
  13. package/build/cjs/modules/pivotTable/pivotTableConstants.js +2 -10
  14. package/build/cjs/modules/renderValue.js +7 -7
  15. package/build/cjs/modules/valueTypes.js +7 -2
  16. package/build/es/api/dimensions.js +20 -20
  17. package/build/es/components/DataDimension/{DataTypesSelector.js → DataTypeSelector.js} +8 -8
  18. package/build/es/components/DataDimension/GroupSelector.js +4 -4
  19. package/build/es/components/DataDimension/ItemSelector.js +29 -29
  20. package/build/es/components/DataDimension/MetricSelector.js +5 -5
  21. package/build/es/components/DataDimension/styles/{DataTypesSelector.style.js → DataTypeSelector.style.js} +0 -0
  22. package/build/es/components/FileMenu/FileMenu.styles.js +2 -2
  23. package/build/es/index.js +2 -1
  24. package/build/es/modules/__tests__/renderValue.spec.js +284 -0
  25. package/build/es/modules/dataTypes.js +35 -28
  26. package/build/es/modules/pivotTable/PivotTableEngine.js +3 -2
  27. package/build/es/modules/pivotTable/pivotTableConstants.js +1 -5
  28. package/build/es/modules/renderValue.js +8 -8
  29. package/build/es/modules/valueTypes.js +3 -1
  30. package/package.json +1 -1
@@ -0,0 +1,284 @@
1
+ import { NUMBER_TYPE_ROW_PERCENTAGE, NUMBER_TYPE_COLUMN_PERCENTAGE } from '../pivotTable/pivotTableConstants.js';
2
+ import { renderValue } from '../renderValue.js';
3
+ import { VALUE_TYPE_NUMBER, VALUE_TYPE_INTEGER, VALUE_TYPE_INTEGER_POSITIVE, VALUE_TYPE_INTEGER_NEGATIVE, VALUE_TYPE_INTEGER_ZERO_OR_POSITIVE, VALUE_TYPE_PERCENTAGE, VALUE_TYPE_UNIT_INTERVAL, VALUE_TYPE_TEXT } from '../valueTypes.js';
4
+ const DGS_COMMA = 'COMMA';
5
+ const DGS_SPACE = 'SPACE';
6
+ const DGS_NONE = 'NONE';
7
+ const tests = [// Numbers
8
+ {
9
+ value: 1000.5,
10
+ expected: '1 000.5',
11
+ valueType: VALUE_TYPE_NUMBER,
12
+ round: true,
13
+ dgs: DGS_SPACE
14
+ }, {
15
+ value: 33777889.55,
16
+ expected: '33,777,889.5',
17
+ valueType: VALUE_TYPE_NUMBER,
18
+ round: true,
19
+ dgs: DGS_COMMA
20
+ }, {
21
+ value: 33777889.556,
22
+ expected: '33 777 889.6',
23
+ valueType: VALUE_TYPE_NUMBER,
24
+ round: true,
25
+ dgs: DGS_SPACE
26
+ }, {
27
+ value: 33777889.556,
28
+ expected: '33 777 889.5560000017',
29
+ // float issue?
30
+ valueType: VALUE_TYPE_NUMBER,
31
+ round: false,
32
+ dgs: DGS_SPACE
33
+ }, {
34
+ value: 33777889.56,
35
+ expected: '33777889.6',
36
+ valueType: VALUE_TYPE_NUMBER,
37
+ round: true,
38
+ dgs: DGS_NONE
39
+ }, {
40
+ value: 0.0005,
41
+ expected: '0',
42
+ valueType: VALUE_TYPE_NUMBER,
43
+ round: true,
44
+ dgs: DGS_SPACE
45
+ }, {
46
+ value: 0.109,
47
+ expected: '0.11',
48
+ valueType: VALUE_TYPE_NUMBER,
49
+ round: true,
50
+ dgs: DGS_SPACE
51
+ }, {
52
+ value: 1.101,
53
+ expected: '1.1',
54
+ valueType: VALUE_TYPE_NUMBER,
55
+ round: true,
56
+ dgs: DGS_SPACE
57
+ }, {
58
+ value: 1.101,
59
+ expected: '1.1010000000',
60
+ valueType: VALUE_TYPE_NUMBER,
61
+ round: false,
62
+ dgs: DGS_SPACE
63
+ }, {
64
+ value: 0.0005,
65
+ expected: '0.0005000000',
66
+ valueType: VALUE_TYPE_NUMBER,
67
+ round: false,
68
+ dgs: DGS_SPACE
69
+ }, // Numbers showing as column/row percentage
70
+ {
71
+ value: 0.234,
72
+ expected: '23.4%',
73
+ valueType: VALUE_TYPE_NUMBER,
74
+ numberType: NUMBER_TYPE_ROW_PERCENTAGE,
75
+ round: true,
76
+ dgs: DGS_SPACE
77
+ }, {
78
+ value: 0.234,
79
+ expected: '23.4%',
80
+ valueType: VALUE_TYPE_NUMBER,
81
+ numberType: NUMBER_TYPE_ROW_PERCENTAGE,
82
+ round: false,
83
+ dgs: DGS_SPACE
84
+ }, {
85
+ value: 0.000234,
86
+ expected: '0.02%',
87
+ valueType: VALUE_TYPE_NUMBER,
88
+ numberType: NUMBER_TYPE_ROW_PERCENTAGE,
89
+ round: true,
90
+ dgs: DGS_SPACE
91
+ }, {
92
+ value: 0.0000432,
93
+ expected: '0%',
94
+ valueType: VALUE_TYPE_NUMBER,
95
+ numberType: NUMBER_TYPE_ROW_PERCENTAGE,
96
+ round: true,
97
+ dgs: DGS_SPACE
98
+ }, {
99
+ value: 0.000234,
100
+ expected: '0.0234%',
101
+ valueType: VALUE_TYPE_NUMBER,
102
+ numberType: NUMBER_TYPE_ROW_PERCENTAGE,
103
+ round: false,
104
+ dgs: DGS_SPACE
105
+ }, {
106
+ value: -0.0234,
107
+ expected: '-2.3%',
108
+ valueType: VALUE_TYPE_NUMBER,
109
+ numberType: NUMBER_TYPE_ROW_PERCENTAGE,
110
+ round: true,
111
+ dgs: DGS_SPACE
112
+ }, {
113
+ value: -0.0234,
114
+ expected: '-2.34%',
115
+ valueType: VALUE_TYPE_NUMBER,
116
+ numberType: NUMBER_TYPE_ROW_PERCENTAGE,
117
+ round: false,
118
+ dgs: DGS_SPACE
119
+ }, {
120
+ value: 0.450048675309,
121
+ expected: '45.0048675309%',
122
+ valueType: VALUE_TYPE_NUMBER,
123
+ numberType: NUMBER_TYPE_ROW_PERCENTAGE,
124
+ round: false,
125
+ dgs: DGS_SPACE
126
+ }, {
127
+ value: 77.893,
128
+ expected: '7 789.3%',
129
+ valueType: VALUE_TYPE_NUMBER,
130
+ numberType: NUMBER_TYPE_COLUMN_PERCENTAGE,
131
+ round: true,
132
+ dgs: DGS_SPACE
133
+ }, {
134
+ value: 77.893,
135
+ expected: '7,789.3%',
136
+ valueType: VALUE_TYPE_NUMBER,
137
+ numberType: NUMBER_TYPE_COLUMN_PERCENTAGE,
138
+ round: true,
139
+ dgs: DGS_COMMA
140
+ }, // Integers
141
+ {
142
+ value: 99777888,
143
+ expected: '99 777 888',
144
+ valueType: VALUE_TYPE_INTEGER,
145
+ round: true,
146
+ dgs: DGS_SPACE
147
+ }, {
148
+ value: -99777888,
149
+ expected: '-99 777 888',
150
+ valueType: VALUE_TYPE_INTEGER,
151
+ round: true,
152
+ dgs: DGS_SPACE
153
+ }, {
154
+ value: -9977888,
155
+ expected: '-9977888',
156
+ valueType: VALUE_TYPE_INTEGER,
157
+ round: true,
158
+ dgs: DGS_NONE
159
+ }, {
160
+ value: 345,
161
+ expected: '345',
162
+ valueType: VALUE_TYPE_INTEGER_POSITIVE,
163
+ round: true,
164
+ dgs: DGS_COMMA
165
+ }, {
166
+ value: 334445577,
167
+ expected: '334,445,577',
168
+ valueType: VALUE_TYPE_INTEGER_POSITIVE,
169
+ round: false,
170
+ dgs: DGS_COMMA
171
+ }, {
172
+ value: -44555777,
173
+ expected: '-44 555 777',
174
+ valueType: VALUE_TYPE_INTEGER_NEGATIVE,
175
+ round: true,
176
+ dgs: DGS_SPACE
177
+ }, {
178
+ value: -4445577,
179
+ expected: '-4,445,577',
180
+ valueType: VALUE_TYPE_INTEGER_NEGATIVE,
181
+ round: false,
182
+ dgs: DGS_COMMA
183
+ }, {
184
+ value: -445577,
185
+ expected: '-445577',
186
+ valueType: VALUE_TYPE_INTEGER_NEGATIVE,
187
+ round: true,
188
+ dgs: DGS_NONE
189
+ }, {
190
+ value: -4445577,
191
+ expected: '-4,445,577',
192
+ valueType: VALUE_TYPE_INTEGER_ZERO_OR_POSITIVE,
193
+ round: false,
194
+ dgs: DGS_COMMA
195
+ }, {
196
+ value: 57,
197
+ expected: '5 700%',
198
+ valueType: VALUE_TYPE_INTEGER_ZERO_OR_POSITIVE,
199
+ numberType: NUMBER_TYPE_COLUMN_PERCENTAGE,
200
+ round: true,
201
+ dgs: DGS_SPACE
202
+ }, {
203
+ value: 557,
204
+ expected: '55700%',
205
+ valueType: VALUE_TYPE_INTEGER_ZERO_OR_POSITIVE,
206
+ numberType: NUMBER_TYPE_COLUMN_PERCENTAGE,
207
+ round: true,
208
+ dgs: DGS_NONE
209
+ }, // Percentage
210
+ {
211
+ value: 5,
212
+ expected: '5',
213
+ valueType: VALUE_TYPE_PERCENTAGE,
214
+ round: true,
215
+ dgs: DGS_SPACE
216
+ }, {
217
+ value: 53,
218
+ expected: '53',
219
+ valueType: VALUE_TYPE_PERCENTAGE,
220
+ round: false,
221
+ dgs: DGS_SPACE
222
+ }, {
223
+ value: 53,
224
+ expected: '5 300%',
225
+ valueType: VALUE_TYPE_PERCENTAGE,
226
+ numberType: NUMBER_TYPE_COLUMN_PERCENTAGE,
227
+ round: true,
228
+ dgs: DGS_SPACE
229
+ }, // Unit interval
230
+ {
231
+ value: 4,
232
+ expected: '4',
233
+ valueType: VALUE_TYPE_UNIT_INTERVAL,
234
+ round: true,
235
+ dgs: DGS_COMMA
236
+ }, {
237
+ value: 4600,
238
+ expected: '4 600',
239
+ valueType: VALUE_TYPE_UNIT_INTERVAL,
240
+ round: false,
241
+ dgs: DGS_SPACE
242
+ }, {
243
+ value: 46,
244
+ expected: '4,600%',
245
+ valueType: VALUE_TYPE_UNIT_INTERVAL,
246
+ numberType: NUMBER_TYPE_COLUMN_PERCENTAGE,
247
+ round: true,
248
+ dgs: DGS_COMMA
249
+ }, // Texts
250
+ {
251
+ value: 'This string has multiple whitespace characters',
252
+ expected: 'This string has multiple whitespace characters',
253
+ valueType: VALUE_TYPE_TEXT
254
+ }, {
255
+ value: 'Characters \n',
256
+ expected: 'Characters \n',
257
+ valueType: VALUE_TYPE_TEXT
258
+ }, {
259
+ value: 'Characters \nmorecharacters here',
260
+ expected: 'Characters \nmorecharacters here',
261
+ valueType: VALUE_TYPE_TEXT
262
+ }, // Undefined values
263
+ {
264
+ value: undefined,
265
+ expected: 'undefined',
266
+ valueType: VALUE_TYPE_NUMBER
267
+ }, {
268
+ value: undefined,
269
+ expected: 'undefined',
270
+ valueType: VALUE_TYPE_TEXT
271
+ }];
272
+ describe('renderValue', () => {
273
+ tests.forEach(t => {
274
+ const testname = "valueType: ".concat(t.valueType, ", value: ").concat(t.value, ", dgs: ").concat(t.dgs, ", round: ").concat(t.round, ", isPercent: ").concat([NUMBER_TYPE_ROW_PERCENTAGE, NUMBER_TYPE_COLUMN_PERCENTAGE].includes(t.numberType));
275
+ it(testname, () => {
276
+ const actual = renderValue(t.value, t.valueType, {
277
+ skipRounding: !t.round,
278
+ digitGroupSeparator: t.dgs,
279
+ numberType: t.numberType
280
+ });
281
+ expect(actual).toEqual(t.expected);
282
+ });
283
+ });
284
+ });
@@ -1,13 +1,20 @@
1
1
  import i18n from '../locales/index.js';
2
- export const ALL_ID = 'ALL';
3
- export const INDICATORS = 'INDICATOR';
4
- export const DATA_ELEMENTS = 'DATA_ELEMENT';
5
- export const DATA_SETS = 'DATA_SET';
6
- export const EVENT_DATA_ITEMS = 'EVENT_DATA_ITEM';
7
- export const PROGRAM_INDICATORS = 'PROGRAM_INDICATOR';
8
- export const PROGRAM_DATA_ELEMENT = 'PROGRAM_DATA_ELEMENT';
9
- export const PROGRAM_ATTRIBUTE = 'PROGRAM_ATTRIBUTE';
10
- export const DATA_ELEMENT_OPERAND = 'DATA_ELEMENT_OPERAND';
2
+ export const DIMENSION_TYPE_ALL = 'ALL';
3
+ export const DIMENSION_TYPE_INDICATOR = 'INDICATOR';
4
+ export const DIMENSION_TYPE_DATA_ELEMENT = 'DATA_ELEMENT';
5
+ export const DIMENSION_TYPE_DATA_SET = 'DATA_SET';
6
+ export const DIMENSION_TYPE_EVENT_DATA_ITEM = 'EVENT_DATA_ITEM';
7
+ export const DIMENSION_TYPE_PROGRAM_INDICATOR = 'PROGRAM_INDICATOR';
8
+ export const DIMENSION_TYPE_PROGRAM_DATA_ELEMENT = 'PROGRAM_DATA_ELEMENT';
9
+ export const DIMENSION_TYPE_PROGRAM_ATTRIBUTE = 'PROGRAM_ATTRIBUTE';
10
+ export const DIMENSION_TYPE_DATA_ELEMENT_OPERAND = 'DATA_ELEMENT_OPERAND';
11
+ export const DIMENSION_TYPE_CATEGORY = 'CATEGORY';
12
+ export const DIMENSION_TYPE_CATEGORY_OPTION_GROUP_SET = 'CATEGORY_OPTION_GROUP_SET';
13
+ export const DIMENSION_TYPE_DATA_ELEMENT_GROUP_SET = 'DATA_ELEMENT_GROUP_SET';
14
+ export const DIMENSION_TYPE_DATA = 'DATA_X';
15
+ export const DIMENSION_TYPE_PERIOD = 'PERIOD';
16
+ export const DIMENSION_TYPE_ORGANISATION_UNIT = 'ORGANISATION_UNIT';
17
+ export const DIMENSION_TYPE_ORGANISATION_UNIT_GROUP_SET = 'ORGANISATION_UNIT_GROUP_SET';
11
18
  export const TOTALS = 'totals';
12
19
  export const DETAIL = 'detail';
13
20
  export const SUB_GROUP_DETAIL = 'DETAIL';
@@ -17,25 +24,25 @@ const getProgramText = () => i18n.t('Program');
17
24
 
18
25
  const getSelectProgramText = () => i18n.t('Select a program');
19
26
 
20
- export const dataTypes = {
21
- [INDICATORS]: {
22
- id: INDICATORS,
27
+ export const dataTypeMap = {
28
+ [DIMENSION_TYPE_INDICATOR]: {
29
+ id: DIMENSION_TYPE_INDICATOR,
23
30
  getName: () => i18n.t('Indicators'),
24
31
  getGroupLabel: () => i18n.t('Indicator group'),
25
32
  defaultGroup: {
26
- id: ALL_ID,
33
+ id: DIMENSION_TYPE_ALL,
27
34
  getName: () => i18n.t('All groups')
28
35
  },
29
36
  getItemName: () => i18n.t('Indicator'),
30
37
  getGroupEmptyLabel: () => i18n.t('No indicator groups found'),
31
38
  getGroupLoadingLabel: () => i18n.t('Loading indicator groups')
32
39
  },
33
- [DATA_ELEMENTS]: {
34
- id: DATA_ELEMENTS,
40
+ [DIMENSION_TYPE_DATA_ELEMENT]: {
41
+ id: DIMENSION_TYPE_DATA_ELEMENT,
35
42
  getName: () => i18n.t('Data elements'),
36
43
  getGroupLabel: () => i18n.t('Data element group'),
37
44
  defaultGroup: {
38
- id: ALL_ID,
45
+ id: DIMENSION_TYPE_ALL,
39
46
  getName: () => i18n.t('All groups')
40
47
  },
41
48
  subGroup: SUB_GROUP_DETAIL,
@@ -43,12 +50,12 @@ export const dataTypes = {
43
50
  getGroupEmptyLabel: () => i18n.t('No data element groups found'),
44
51
  getGroupLoadingLabel: () => i18n.t('Loading data element groups')
45
52
  },
46
- [DATA_SETS]: {
47
- id: DATA_SETS,
53
+ [DIMENSION_TYPE_DATA_SET]: {
54
+ id: DIMENSION_TYPE_DATA_SET,
48
55
  getName: () => i18n.t('Data sets'),
49
56
  getGroupLabel: () => i18n.t('Data set'),
50
57
  defaultGroup: {
51
- id: ALL_ID,
58
+ id: DIMENSION_TYPE_ALL,
52
59
  getName: () => i18n.t('All data sets')
53
60
  },
54
61
  subGroup: SUB_GROUP_METRIC,
@@ -56,26 +63,26 @@ export const dataTypes = {
56
63
  getGroupEmptyLabel: () => i18n.t('No data sets found'),
57
64
  getGroupLoadingLabel: () => i18n.t('Loading data sets')
58
65
  },
59
- [EVENT_DATA_ITEMS]: {
60
- id: EVENT_DATA_ITEMS,
66
+ [DIMENSION_TYPE_EVENT_DATA_ITEM]: {
67
+ id: DIMENSION_TYPE_EVENT_DATA_ITEM,
61
68
  getName: () => i18n.t('Event data items'),
62
69
  getGroupLabel: getProgramText,
63
70
  getPlaceholder: getSelectProgramText,
64
71
  defaultGroup: {
65
- id: ALL_ID,
72
+ id: DIMENSION_TYPE_ALL,
66
73
  getName: () => i18n.t('All programs')
67
74
  },
68
75
  getItemName: () => i18n.t('Event data item'),
69
76
  getGroupEmptyLabel: () => i18n.t('No programs found'),
70
77
  getGroupLoadingLabel: () => i18n.t('Loading programs')
71
78
  },
72
- [PROGRAM_INDICATORS]: {
73
- id: PROGRAM_INDICATORS,
79
+ [DIMENSION_TYPE_PROGRAM_INDICATOR]: {
80
+ id: DIMENSION_TYPE_PROGRAM_INDICATOR,
74
81
  getName: () => i18n.t('Program indicators'),
75
82
  getGroupLabel: getProgramText,
76
83
  getPlaceholder: getSelectProgramText,
77
84
  defaultGroup: {
78
- id: ALL_ID,
85
+ id: DIMENSION_TYPE_ALL,
79
86
  getName: () => i18n.t('All programs')
80
87
  },
81
88
  getItemName: () => i18n.t('Program indicator'),
@@ -84,9 +91,9 @@ export const dataTypes = {
84
91
  }
85
92
  };
86
93
  export function defaultGroupId(dataType) {
87
- return dataTypes[dataType].defaultGroup ? dataTypes[dataType].defaultGroup.id : '';
94
+ return dataTypeMap[dataType].defaultGroup ? dataTypeMap[dataType].defaultGroup.id : '';
88
95
  }
89
96
  export function defaultGroupDetail(dataType) {
90
- return dataTypes[dataType].groupDetail ? dataTypes[dataType].groupDetail.default : '';
97
+ return dataTypeMap[dataType].groupDetail ? dataTypeMap[dataType].groupDetail.default : '';
91
98
  }
92
- export const DEFAULT_DATATYPE_ID = INDICATORS;
99
+ export const DEFAULT_DATATYPE_ID = DIMENSION_TYPE_INDICATOR;
@@ -1,12 +1,13 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
2
 
3
3
  import times from 'lodash/times';
4
+ import { DIMENSION_TYPE_DATA, DIMENSION_TYPE_DATA_ELEMENT_GROUP_SET, DIMENSION_TYPE_ORGANISATION_UNIT, DIMENSION_TYPE_PERIOD } from '../dataTypes.js';
4
5
  import { DIMENSION_ID_ORGUNIT } from '../predefinedDimensions.js';
5
6
  import { renderValue } from '../renderValue.js';
6
7
  import { VALUE_TYPE_NUMBER, VALUE_TYPE_TEXT } from '../valueTypes.js';
7
8
  import { AdaptiveClippingController } from './AdaptiveClippingController.js';
8
9
  import { parseValue } from './parseValue.js';
9
- import { AGGREGATE_TYPE_NA, AGGREGATE_TYPE_AVERAGE, AGGREGATE_TYPE_SUM, CELL_TYPE_VALUE, CELL_TYPE_TOTAL, CELL_TYPE_SUBTOTAL, SORT_ORDER_ASCENDING, SORT_ORDER_DESCENDING, DISPLAY_DENSITY_PADDING_COMPACT, DISPLAY_DENSITY_PADDING_COMFORTABLE, DISPLAY_DENSITY_OPTION_COMFORTABLE, DISPLAY_DENSITY_OPTION_COMPACT, DISPLAY_DENSITY_OPTION_NORMAL, DISPLAY_DENSITY_PADDING_NORMAL, FONT_SIZE_OPTION_SMALL, FONT_SIZE_SMALL, FONT_SIZE_OPTION_LARGE, FONT_SIZE_LARGE, FONT_SIZE_OPTION_NORMAL, FONT_SIZE_NORMAL, NUMBER_TYPE_COLUMN_PERCENTAGE, NUMBER_TYPE_ROW_PERCENTAGE, DIMENSION_TYPE_DATA, DIMENSION_TYPE_DATA_ELEMENT_GROUP_SET, DIMENSION_TYPE_ORGUNIT, DIMENSION_TYPE_PERIOD, NUMBER_TYPE_VALUE } from './pivotTableConstants.js';
10
+ import { AGGREGATE_TYPE_NA, AGGREGATE_TYPE_AVERAGE, AGGREGATE_TYPE_SUM, CELL_TYPE_VALUE, CELL_TYPE_TOTAL, CELL_TYPE_SUBTOTAL, SORT_ORDER_ASCENDING, SORT_ORDER_DESCENDING, DISPLAY_DENSITY_PADDING_COMPACT, DISPLAY_DENSITY_PADDING_COMFORTABLE, DISPLAY_DENSITY_OPTION_COMFORTABLE, DISPLAY_DENSITY_OPTION_COMPACT, DISPLAY_DENSITY_OPTION_NORMAL, DISPLAY_DENSITY_PADDING_NORMAL, FONT_SIZE_OPTION_SMALL, FONT_SIZE_SMALL, FONT_SIZE_OPTION_LARGE, FONT_SIZE_LARGE, FONT_SIZE_OPTION_NORMAL, FONT_SIZE_NORMAL, NUMBER_TYPE_COLUMN_PERCENTAGE, NUMBER_TYPE_ROW_PERCENTAGE, NUMBER_TYPE_VALUE } from './pivotTableConstants.js';
10
11
  const dataFields = ['value', 'numerator', 'denominator', 'factor', 'multiplier', 'divisor'];
11
12
  const defaultOptions = {
12
13
  hideEmptyColumns: false,
@@ -251,7 +252,7 @@ export class PivotTableEngine {
251
252
  });
252
253
  const headers = [...this.getRawRowHeader(row), ...this.getRawColumnHeader(column)];
253
254
  const peId = (_headers$find = headers.find(header => (header === null || header === void 0 ? void 0 : header.dimensionItemType) === DIMENSION_TYPE_PERIOD)) === null || _headers$find === void 0 ? void 0 : _headers$find.uid;
254
- const ouId = (_headers$find2 = headers.find(header => (header === null || header === void 0 ? void 0 : header.dimensionItemType) === DIMENSION_TYPE_ORGUNIT)) === null || _headers$find2 === void 0 ? void 0 : _headers$find2.uid;
255
+ const ouId = (_headers$find2 = headers.find(header => (header === null || header === void 0 ? void 0 : header.dimensionItemType) === DIMENSION_TYPE_ORGANISATION_UNIT)) === null || _headers$find2 === void 0 ? void 0 : _headers$find2.uid;
255
256
 
256
257
  if (!this.data[row] || !this.data[row][column]) {
257
258
  return {
@@ -26,8 +26,4 @@ export const CLIPPED_CELL_MAX_SIZE = 360;
26
26
  export const CLIPPED_CELL_MIN_SIZE = 36;
27
27
  export const WRAPPED_TEXT_JUSTIFY_BUFFER = 25;
28
28
  export const WRAPPED_TEXT_LINE_HEIGHT = 1.0;
29
- export const CLIPPED_AXIS_PARTITION_SIZE_PX = 1000;
30
- export const DIMENSION_TYPE_DATA_ELEMENT_GROUP_SET = 'DATA_ELEMENT_GROUP_SET';
31
- export const DIMENSION_TYPE_DATA = 'DATA_X';
32
- export const DIMENSION_TYPE_PERIOD = 'PERIOD';
33
- export const DIMENSION_TYPE_ORGUNIT = 'ORGANISATION_UNIT';
29
+ export const CLIPPED_AXIS_PARTITION_SIZE_PX = 1000;
@@ -1,9 +1,9 @@
1
1
  import { NUMBER_TYPE_ROW_PERCENTAGE, NUMBER_TYPE_COLUMN_PERCENTAGE } from './pivotTable/pivotTableConstants.js';
2
- import { VALUE_TYPE_NUMBER } from './valueTypes.js';
2
+ import { isNumericValueType } from './valueTypes.js';
3
3
 
4
4
  const trimTrailingZeros = stringValue => stringValue.replace(/\.?0+$/, '');
5
5
 
6
- const defaultDecimalSeparator = '.';
6
+ const decimalSeparator = '.';
7
7
 
8
8
  const separateDigitGroups = (stringValue, decimalSeparator) => {
9
9
  const isNegative = stringValue[0] === '-';
@@ -57,15 +57,15 @@ const toFixedPrecisionString = (value, skipRounding) => {
57
57
  };
58
58
 
59
59
  export const renderValue = (value, valueType, visualization) => {
60
- if (valueType !== VALUE_TYPE_NUMBER || value === undefined) {
60
+ if (!isNumericValueType(valueType) || value === undefined) {
61
61
  return String(value).replace(/[^\S\n]+/, ' ');
62
62
  }
63
63
 
64
64
  if (visualization.numberType === NUMBER_TYPE_ROW_PERCENTAGE || visualization.numberType === NUMBER_TYPE_COLUMN_PERCENTAGE) {
65
- return trimTrailingZeros(toFixedPrecisionString(value * 100, visualization.skipRounding)) + '%';
65
+ const stringValue = trimTrailingZeros(toFixedPrecisionString(value * 100, visualization.skipRounding));
66
+ return separateDigitGroups(stringValue, decimalSeparator).join(getSeparator(visualization)) + '%';
67
+ } else {
68
+ const stringValue = toFixedPrecisionString(value, visualization.skipRounding);
69
+ return separateDigitGroups(stringValue, decimalSeparator).join(getSeparator(visualization));
66
70
  }
67
-
68
- const stringValue = toFixedPrecisionString(value, visualization.skipRounding);
69
- const digitGroups = separateDigitGroups(stringValue, defaultDecimalSeparator);
70
- return digitGroups.join(getSeparator(visualization));
71
71
  };
@@ -20,4 +20,6 @@ export const VALUE_TYPE_TRUE_ONLY = 'TRUE_ONLY';
20
20
  export const VALUE_TYPE_DATE = 'DATE';
21
21
  export const VALUE_TYPE_TIME = 'TIME';
22
22
  export const VALUE_TYPE_DATETIME = 'DATETIME';
23
- export const VALUE_TYPE_ORGANISATION_UNIT = 'ORGANISATION_UNIT';
23
+ export const VALUE_TYPE_ORGANISATION_UNIT = 'ORGANISATION_UNIT';
24
+ const NUMERIC_VALUE_TYPES = [VALUE_TYPE_NUMBER, VALUE_TYPE_UNIT_INTERVAL, VALUE_TYPE_PERCENTAGE, VALUE_TYPE_INTEGER, VALUE_TYPE_INTEGER_POSITIVE, VALUE_TYPE_INTEGER_NEGATIVE, VALUE_TYPE_INTEGER_ZERO_OR_POSITIVE];
25
+ export const isNumericValueType = type => NUMERIC_VALUE_TYPES.includes(type);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dhis2/analytics",
3
- "version": "23.8.0",
3
+ "version": "23.8.3",
4
4
  "main": "./build/cjs/index.js",
5
5
  "module": "./build/es/index.js",
6
6
  "exports": {