@dhis2/analytics 28.0.5 → 28.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 (177) hide show
  1. package/build/cjs/__demo__/{PivotTable.stories.js → PivotTable.aggregate.stories.js} +38 -38
  2. package/build/cjs/__demo__/PivotTable.event.stories.js +440 -0
  3. package/build/cjs/__demo__/data/event/boolean.data.hidena.json +115 -0
  4. package/build/cjs/__demo__/data/event/boolean.data.json +125 -0
  5. package/build/cjs/__demo__/data/event/boolean.data.org.json +106 -0
  6. package/build/cjs/__demo__/data/event/boolean.visualization.json +160 -0
  7. package/build/cjs/__demo__/data/event/date.data.hidena.json +205 -0
  8. package/build/cjs/__demo__/data/event/date.data.json +215 -0
  9. package/build/cjs/__demo__/data/event/date.data.org.json +123 -0
  10. package/build/cjs/__demo__/data/event/date.visualization.json +160 -0
  11. package/build/cjs/__demo__/data/event/datetime.data.hidena.json +215 -0
  12. package/build/cjs/__demo__/data/event/datetime.data.json +225 -0
  13. package/build/cjs/__demo__/data/event/datetime.data.org.json +124 -0
  14. package/build/cjs/__demo__/data/event/datetime.visualization.json +148 -0
  15. package/build/cjs/__demo__/data/event/email.data.hidena.json +192 -0
  16. package/build/cjs/__demo__/data/event/email.data.json +202 -0
  17. package/build/cjs/__demo__/data/event/email.data.org.json +123 -0
  18. package/build/cjs/__demo__/data/event/email.visualization.json +148 -0
  19. package/build/cjs/__demo__/data/event/integer.data.hidena.json +165 -0
  20. package/build/cjs/__demo__/data/event/integer.data.json +175 -0
  21. package/build/cjs/__demo__/data/event/integer.data.org.json +120 -0
  22. package/build/cjs/__demo__/data/event/integer.visualization.json +163 -0
  23. package/build/cjs/__demo__/data/event/legendset.data.hidena.json +154 -0
  24. package/build/cjs/__demo__/data/event/legendset.data.json +164 -0
  25. package/build/cjs/__demo__/data/event/legendset.visualization.json +166 -0
  26. package/build/cjs/__demo__/data/event/optionset.data.hidena.json +125 -0
  27. package/build/cjs/__demo__/data/event/optionset.data.json +134 -0
  28. package/build/cjs/__demo__/data/event/optionset.data.org.json +125 -0
  29. package/build/cjs/__demo__/data/event/optionset.visualization.json +158 -0
  30. package/build/cjs/__demo__/data/event/time.data.hidena.json +165 -0
  31. package/build/cjs/__demo__/data/event/time.data.json +175 -0
  32. package/build/cjs/__demo__/data/event/time.data.org.json +128 -0
  33. package/build/cjs/__demo__/data/event/time.visualization.json +148 -0
  34. package/build/cjs/__demo__/data/event/yesonly.data.hidena.json +127 -0
  35. package/build/cjs/__demo__/data/event/yesonly.data.json +136 -0
  36. package/build/cjs/__demo__/data/event/yesonly.data.org.json +124 -0
  37. package/build/cjs/__demo__/data/event/yesonly.visualization.json +161 -0
  38. package/build/cjs/components/DataDimension/ItemSelector/ItemSelector.js +19 -22
  39. package/build/cjs/components/PivotTable/PivotTableColumnHeaderCell.js +3 -0
  40. package/build/cjs/components/PivotTable/PivotTableRowHeaderCell.js +2 -1
  41. package/build/cjs/index.js +8 -0
  42. package/build/cjs/locales/en/translations.json +1 -0
  43. package/build/cjs/modules/pivotTable/AdaptiveClippingController.js +2 -1
  44. package/build/cjs/modules/pivotTable/getHeaderForDisplay.js +4 -1
  45. package/build/cjs/modules/pivotTable/measureText.js +7 -6
  46. package/build/cjs/modules/response/event/__tests__/default.spec.js +77 -0
  47. package/build/cjs/modules/response/event/__tests__/optionSet.spec.js +35 -0
  48. package/build/cjs/modules/response/event/__tests__/response.spec.js +125 -0
  49. package/build/cjs/modules/response/event/default.js +65 -0
  50. package/build/cjs/modules/response/event/optionSet.js +36 -0
  51. package/build/cjs/modules/response/event/response.js +95 -0
  52. package/build/es/__demo__/{PivotTable.stories.js → PivotTable.aggregate.stories.js} +38 -38
  53. package/build/es/__demo__/PivotTable.event.stories.js +414 -0
  54. package/build/es/__demo__/data/event/boolean.data.hidena.json +115 -0
  55. package/build/es/__demo__/data/event/boolean.data.json +125 -0
  56. package/build/es/__demo__/data/event/boolean.data.org.json +106 -0
  57. package/build/es/__demo__/data/event/boolean.visualization.json +160 -0
  58. package/build/es/__demo__/data/event/date.data.hidena.json +205 -0
  59. package/build/es/__demo__/data/event/date.data.json +215 -0
  60. package/build/es/__demo__/data/event/date.data.org.json +123 -0
  61. package/build/es/__demo__/data/event/date.visualization.json +160 -0
  62. package/build/es/__demo__/data/event/datetime.data.hidena.json +215 -0
  63. package/build/es/__demo__/data/event/datetime.data.json +225 -0
  64. package/build/es/__demo__/data/event/datetime.data.org.json +124 -0
  65. package/build/es/__demo__/data/event/datetime.visualization.json +148 -0
  66. package/build/es/__demo__/data/event/email.data.hidena.json +192 -0
  67. package/build/es/__demo__/data/event/email.data.json +202 -0
  68. package/build/es/__demo__/data/event/email.data.org.json +123 -0
  69. package/build/es/__demo__/data/event/email.visualization.json +148 -0
  70. package/build/es/__demo__/data/event/integer.data.hidena.json +165 -0
  71. package/build/es/__demo__/data/event/integer.data.json +175 -0
  72. package/build/es/__demo__/data/event/integer.data.org.json +120 -0
  73. package/build/es/__demo__/data/event/integer.visualization.json +163 -0
  74. package/build/es/__demo__/data/event/legendset.data.hidena.json +154 -0
  75. package/build/es/__demo__/data/event/legendset.data.json +164 -0
  76. package/build/es/__demo__/data/event/legendset.visualization.json +166 -0
  77. package/build/es/__demo__/data/event/optionset.data.hidena.json +125 -0
  78. package/build/es/__demo__/data/event/optionset.data.json +134 -0
  79. package/build/es/__demo__/data/event/optionset.data.org.json +125 -0
  80. package/build/es/__demo__/data/event/optionset.visualization.json +158 -0
  81. package/build/es/__demo__/data/event/time.data.hidena.json +165 -0
  82. package/build/es/__demo__/data/event/time.data.json +175 -0
  83. package/build/es/__demo__/data/event/time.data.org.json +128 -0
  84. package/build/es/__demo__/data/event/time.visualization.json +148 -0
  85. package/build/es/__demo__/data/event/yesonly.data.hidena.json +127 -0
  86. package/build/es/__demo__/data/event/yesonly.data.json +136 -0
  87. package/build/es/__demo__/data/event/yesonly.data.org.json +124 -0
  88. package/build/es/__demo__/data/event/yesonly.visualization.json +161 -0
  89. package/build/es/components/DataDimension/ItemSelector/ItemSelector.js +19 -22
  90. package/build/es/components/PivotTable/PivotTableColumnHeaderCell.js +3 -0
  91. package/build/es/components/PivotTable/PivotTableRowHeaderCell.js +2 -1
  92. package/build/es/index.js +4 -0
  93. package/build/es/locales/en/translations.json +1 -0
  94. package/build/es/modules/pivotTable/AdaptiveClippingController.js +2 -1
  95. package/build/es/modules/pivotTable/getHeaderForDisplay.js +4 -1
  96. package/build/es/modules/pivotTable/measureText.js +7 -6
  97. package/build/es/modules/response/event/__tests__/default.spec.js +75 -0
  98. package/build/es/modules/response/event/__tests__/optionSet.spec.js +32 -0
  99. package/build/es/modules/response/event/__tests__/response.spec.js +122 -0
  100. package/build/es/modules/response/event/default.js +52 -0
  101. package/build/es/modules/response/event/optionSet.js +27 -0
  102. package/build/es/modules/response/event/response.js +86 -0
  103. package/package.json +1 -1
  104. /package/build/cjs/__demo__/data/{avgTotalAggregationType.data.json → aggregate/avgTotalAggregationType.data.json} +0 -0
  105. /package/build/cjs/__demo__/data/{avgTotalAggregationType.metadata.json → aggregate/avgTotalAggregationType.metadata.json} +0 -0
  106. /package/build/cjs/__demo__/data/{avgTotalAggregationType.visualization.json → aggregate/avgTotalAggregationType.visualization.json} +0 -0
  107. /package/build/cjs/__demo__/data/{deep.data.json → aggregate/deep.data.json} +0 -0
  108. /package/build/cjs/__demo__/data/{deep.visualization.json → aggregate/deep.visualization.json} +0 -0
  109. /package/build/cjs/__demo__/data/{deepWithFilters.data.json → aggregate/deepWithFilters.data.json} +0 -0
  110. /package/build/cjs/__demo__/data/{deepWithFilters.visualization.json → aggregate/deepWithFilters.visualization.json} +0 -0
  111. /package/build/cjs/__demo__/data/{degs.data.json → aggregate/degs.data.json} +0 -0
  112. /package/build/cjs/__demo__/data/{degs.metadata.json → aggregate/degs.metadata.json} +0 -0
  113. /package/build/cjs/__demo__/data/{degs.visualization.json → aggregate/degs.visualization.json} +0 -0
  114. /package/build/cjs/__demo__/data/{diseaseWeeks.data.json → aggregate/diseaseWeeks.data.json} +0 -0
  115. /package/build/cjs/__demo__/data/{diseaseWeeks.metadata.json → aggregate/diseaseWeeks.metadata.json} +0 -0
  116. /package/build/cjs/__demo__/data/{diseaseWeeks.visualization.json → aggregate/diseaseWeeks.visualization.json} +0 -0
  117. /package/build/cjs/__demo__/data/{emptyColumns.data.json → aggregate/emptyColumns.data.json} +0 -0
  118. /package/build/cjs/__demo__/data/{emptyColumns.metadata.json → aggregate/emptyColumns.metadata.json} +0 -0
  119. /package/build/cjs/__demo__/data/{emptyColumns.visualization.json → aggregate/emptyColumns.visualization.json} +0 -0
  120. /package/build/cjs/__demo__/data/{emptyRows.data.json → aggregate/emptyRows.data.json} +0 -0
  121. /package/build/cjs/__demo__/data/{emptyRows.visualization.json → aggregate/emptyRows.visualization.json} +0 -0
  122. /package/build/cjs/__demo__/data/{hierarchy.data.json → aggregate/hierarchy.data.json} +0 -0
  123. /package/build/cjs/__demo__/data/{hierarchy.metadata.json → aggregate/hierarchy.metadata.json} +0 -0
  124. /package/build/cjs/__demo__/data/{hierarchy.visualization.json → aggregate/hierarchy.visualization.json} +0 -0
  125. /package/build/cjs/__demo__/data/{lastFiveYears.data.json → aggregate/lastFiveYears.data.json} +0 -0
  126. /package/build/cjs/__demo__/data/{lastFiveYears.metadata.json → aggregate/lastFiveYears.metadata.json} +0 -0
  127. /package/build/cjs/__demo__/data/{lastFiveYears.visualization.json → aggregate/lastFiveYears.visualization.json} +0 -0
  128. /package/build/cjs/__demo__/data/{narrative.data.json → aggregate/narrative.data.json} +0 -0
  129. /package/build/cjs/__demo__/data/{narrative.metadata.json → aggregate/narrative.metadata.json} +0 -0
  130. /package/build/cjs/__demo__/data/{narrative.visualization.json → aggregate/narrative.visualization.json} +0 -0
  131. /package/build/cjs/__demo__/data/{simple.data.json → aggregate/simple.data.json} +0 -0
  132. /package/build/cjs/__demo__/data/{simple.metadata.json → aggregate/simple.metadata.json} +0 -0
  133. /package/build/cjs/__demo__/data/{simple.visualization.json → aggregate/simple.visualization.json} +0 -0
  134. /package/build/cjs/__demo__/data/{target-with-legend.data.json → aggregate/target-with-legend.data.json} +0 -0
  135. /package/build/cjs/__demo__/data/{target-with-legend.metadata.json → aggregate/target-with-legend.metadata.json} +0 -0
  136. /package/build/cjs/__demo__/data/{target-with-legend.visualization.json → aggregate/target-with-legend.visualization.json} +0 -0
  137. /package/build/cjs/__demo__/data/{under-above-100.legendSet.json → aggregate/under-above-100.legendSet.json} +0 -0
  138. /package/build/cjs/__demo__/data/{weeklyColumns.data.json → aggregate/weeklyColumns.data.json} +0 -0
  139. /package/build/cjs/__demo__/data/{weeklyColumns.metadata.json → aggregate/weeklyColumns.metadata.json} +0 -0
  140. /package/build/cjs/__demo__/data/{weeklyColumns.visualization.json → aggregate/weeklyColumns.visualization.json} +0 -0
  141. /package/build/es/__demo__/data/{avgTotalAggregationType.data.json → aggregate/avgTotalAggregationType.data.json} +0 -0
  142. /package/build/es/__demo__/data/{avgTotalAggregationType.metadata.json → aggregate/avgTotalAggregationType.metadata.json} +0 -0
  143. /package/build/es/__demo__/data/{avgTotalAggregationType.visualization.json → aggregate/avgTotalAggregationType.visualization.json} +0 -0
  144. /package/build/es/__demo__/data/{deep.data.json → aggregate/deep.data.json} +0 -0
  145. /package/build/es/__demo__/data/{deep.visualization.json → aggregate/deep.visualization.json} +0 -0
  146. /package/build/es/__demo__/data/{deepWithFilters.data.json → aggregate/deepWithFilters.data.json} +0 -0
  147. /package/build/es/__demo__/data/{deepWithFilters.visualization.json → aggregate/deepWithFilters.visualization.json} +0 -0
  148. /package/build/es/__demo__/data/{degs.data.json → aggregate/degs.data.json} +0 -0
  149. /package/build/es/__demo__/data/{degs.metadata.json → aggregate/degs.metadata.json} +0 -0
  150. /package/build/es/__demo__/data/{degs.visualization.json → aggregate/degs.visualization.json} +0 -0
  151. /package/build/es/__demo__/data/{diseaseWeeks.data.json → aggregate/diseaseWeeks.data.json} +0 -0
  152. /package/build/es/__demo__/data/{diseaseWeeks.metadata.json → aggregate/diseaseWeeks.metadata.json} +0 -0
  153. /package/build/es/__demo__/data/{diseaseWeeks.visualization.json → aggregate/diseaseWeeks.visualization.json} +0 -0
  154. /package/build/es/__demo__/data/{emptyColumns.data.json → aggregate/emptyColumns.data.json} +0 -0
  155. /package/build/es/__demo__/data/{emptyColumns.metadata.json → aggregate/emptyColumns.metadata.json} +0 -0
  156. /package/build/es/__demo__/data/{emptyColumns.visualization.json → aggregate/emptyColumns.visualization.json} +0 -0
  157. /package/build/es/__demo__/data/{emptyRows.data.json → aggregate/emptyRows.data.json} +0 -0
  158. /package/build/es/__demo__/data/{emptyRows.visualization.json → aggregate/emptyRows.visualization.json} +0 -0
  159. /package/build/es/__demo__/data/{hierarchy.data.json → aggregate/hierarchy.data.json} +0 -0
  160. /package/build/es/__demo__/data/{hierarchy.metadata.json → aggregate/hierarchy.metadata.json} +0 -0
  161. /package/build/es/__demo__/data/{hierarchy.visualization.json → aggregate/hierarchy.visualization.json} +0 -0
  162. /package/build/es/__demo__/data/{lastFiveYears.data.json → aggregate/lastFiveYears.data.json} +0 -0
  163. /package/build/es/__demo__/data/{lastFiveYears.metadata.json → aggregate/lastFiveYears.metadata.json} +0 -0
  164. /package/build/es/__demo__/data/{lastFiveYears.visualization.json → aggregate/lastFiveYears.visualization.json} +0 -0
  165. /package/build/es/__demo__/data/{narrative.data.json → aggregate/narrative.data.json} +0 -0
  166. /package/build/es/__demo__/data/{narrative.metadata.json → aggregate/narrative.metadata.json} +0 -0
  167. /package/build/es/__demo__/data/{narrative.visualization.json → aggregate/narrative.visualization.json} +0 -0
  168. /package/build/es/__demo__/data/{simple.data.json → aggregate/simple.data.json} +0 -0
  169. /package/build/es/__demo__/data/{simple.metadata.json → aggregate/simple.metadata.json} +0 -0
  170. /package/build/es/__demo__/data/{simple.visualization.json → aggregate/simple.visualization.json} +0 -0
  171. /package/build/es/__demo__/data/{target-with-legend.data.json → aggregate/target-with-legend.data.json} +0 -0
  172. /package/build/es/__demo__/data/{target-with-legend.metadata.json → aggregate/target-with-legend.metadata.json} +0 -0
  173. /package/build/es/__demo__/data/{target-with-legend.visualization.json → aggregate/target-with-legend.visualization.json} +0 -0
  174. /package/build/es/__demo__/data/{under-above-100.legendSet.json → aggregate/under-above-100.legendSet.json} +0 -0
  175. /package/build/es/__demo__/data/{weeklyColumns.data.json → aggregate/weeklyColumns.data.json} +0 -0
  176. /package/build/es/__demo__/data/{weeklyColumns.metadata.json → aggregate/weeklyColumns.metadata.json} +0 -0
  177. /package/build/es/__demo__/data/{weeklyColumns.visualization.json → aggregate/weeklyColumns.visualization.json} +0 -0
@@ -0,0 +1,161 @@
1
+ {
2
+ "name": "Yesonly",
3
+ "created": "2025-07-02T10:36:16.893",
4
+ "lastUpdated": "2025-07-02T10:36:16.893",
5
+ "translations": [],
6
+ "createdBy": {
7
+ "id": "xE7jOejl9FI",
8
+ "code": null,
9
+ "name": "John Traore",
10
+ "displayName": "John Traore",
11
+ "username": "admin"
12
+ },
13
+ "favorites": [],
14
+ "lastUpdatedBy": {
15
+ "id": "xE7jOejl9FI",
16
+ "code": null,
17
+ "name": "John Traore",
18
+ "displayName": "John Traore",
19
+ "username": "admin"
20
+ },
21
+ "sharing": {
22
+ "owner": "xE7jOejl9FI",
23
+ "external": false,
24
+ "users": {},
25
+ "userGroups": {},
26
+ "public": "rw------"
27
+ },
28
+ "regressionType": "NONE",
29
+ "displayDensity": "NORMAL",
30
+ "fontSize": "NORMAL",
31
+ "sortOrder": 0,
32
+ "topLimit": 0,
33
+ "hideEmptyRows": false,
34
+ "showHierarchy": false,
35
+ "completedOnly": false,
36
+ "skipRounding": false,
37
+ "dataDimensionItems": [],
38
+ "dataElementGroupSetDimensions": [],
39
+ "organisationUnitGroupSetDimensions": [],
40
+ "categoryDimensions": [],
41
+ "categoryOptionGroupSetDimensions": [],
42
+ "attributeDimensions": [],
43
+ "dataElementDimensions": [
44
+ {
45
+ "dataElement": {
46
+ "name": "E2E - Yes only",
47
+ "id": "hwG20Dyj6RK"
48
+ }
49
+ }
50
+ ],
51
+ "programIndicatorDimensions": [],
52
+ "subscribers": [],
53
+ "digitGroupSeparator": "SPACE",
54
+ "hideEmptyRowItems": "NONE",
55
+ "hideLegend": false,
56
+ "noSpaceBetweenColumns": false,
57
+ "cumulativeValues": false,
58
+ "percentStackedValues": false,
59
+ "showData": false,
60
+ "colTotals": true,
61
+ "rowTotals": true,
62
+ "rowSubTotals": true,
63
+ "colSubTotals": true,
64
+ "hideTitle": false,
65
+ "hideSubtitle": false,
66
+ "showDimensionLabels": true,
67
+ "interpretations": [],
68
+ "program": {
69
+ "enrollmentDateLabel": "Enrollment date (e2e)",
70
+ "incidentDateLabel": "Incident date (e2e)",
71
+ "id": "J1QQtmzqhJz",
72
+ "name": "E2E program"
73
+ },
74
+ "programStage": {
75
+ "executionDateLabel": "Event date (e2e)",
76
+ "id": "jfuXZB3A1ko",
77
+ "name": "Stage 1 - Repeatable"
78
+ },
79
+ "dataType": "AGGREGATED_VALUES",
80
+ "outputType": "EVENT",
81
+ "collapseDataDimensions": false,
82
+ "hideNaData": false,
83
+ "simpleDimensions": [
84
+ {
85
+ "parent": "COLUMN",
86
+ "dimension": "ou",
87
+ "values": [
88
+ "ImspTQPwCqd"
89
+ ]
90
+ }
91
+ ],
92
+ "legacy": true,
93
+ "type": "PIVOT_TABLE",
94
+ "filters": [],
95
+ "parentGraphMap": {
96
+ "ImspTQPwCqd": ""
97
+ },
98
+ "columns": [
99
+ {
100
+ "items": [
101
+ {
102
+ "dimensionItemType": "ORGANISATION_UNIT",
103
+ "name": "Sierra Leone",
104
+ "id": "ImspTQPwCqd"
105
+ }
106
+ ],
107
+ "dimension": "ou"
108
+ },
109
+ {
110
+ "items": [
111
+ {
112
+ "dimensionItemType": "PERIOD",
113
+ "id": "LAST_12_MONTHS",
114
+ "name": "LAST_12_MONTHS"
115
+ }
116
+ ],
117
+ "dimension": "pe"
118
+ }
119
+ ],
120
+ "rows": [
121
+ {
122
+ "items": [],
123
+ "programStage": {
124
+ "id": "jfuXZB3A1ko"
125
+ },
126
+ "dimension": "jfuXZB3A1ko.hwG20Dyj6RK"
127
+ }
128
+ ],
129
+ "displayName": "Yesonly",
130
+ "access": {
131
+ "manage": true,
132
+ "externalize": true,
133
+ "write": true,
134
+ "read": true,
135
+ "update": true,
136
+ "delete": true
137
+ },
138
+ "user": {
139
+ "id": "xE7jOejl9FI",
140
+ "code": null,
141
+ "name": "John Traore",
142
+ "displayName": "John Traore",
143
+ "username": "admin"
144
+ },
145
+ "favorite": false,
146
+ "subscribed": false,
147
+ "metaData": {
148
+ "hwG20Dyj6RK": {
149
+ "uid": "hwG20Dyj6RK",
150
+ "name": "E2E - Yes only"
151
+ },
152
+ "ImspTQPwCqd": {
153
+ "uid": "ImspTQPwCqd",
154
+ "code": "OU_525",
155
+ "name": "Sierra Leone"
156
+ }
157
+ },
158
+ "displayFormName": "Yesonly",
159
+ "id": "qySyY2zmjrO",
160
+ "attributeValues": []
161
+ }
@@ -343,28 +343,25 @@ const ItemSelector = ({
343
343
  infoBoxMessage: infoBoxMessage
344
344
  }),
345
345
  rightFooter: rightFooter,
346
- renderOption: props => {
347
- // console.log('renderOption', props)
348
- return /*#__PURE__*/React.createElement(TransferOption
349
- /* eslint-disable react/prop-types */, _extends({}, props, {
350
- active: isActive(props.value),
351
- showingInfo: (infoDataItem === null || infoDataItem === void 0 ? void 0 : infoDataItem.id) === props.value,
352
- icon: getIcon(props.type),
353
- dataItemType: props.type,
354
- dimensionType: getDimensionType({
355
- type: props.type,
356
- expression: props.expression
357
- }),
358
- dataTest: `${dataTest}-transfer-option`,
359
- itemsRef: itemsRef,
360
- onEditClick: () => onEditClick(props),
361
- onInfoClick: () => setInfoDataItem({
362
- id: props.value,
363
- type: props.type
364
- })
365
- /* eslint-enable react/prop-types */
366
- }));
367
- },
346
+ renderOption: props => /*#__PURE__*/React.createElement(TransferOption
347
+ /* eslint-disable react/prop-types */, _extends({}, props, {
348
+ active: isActive(props.value),
349
+ showingInfo: (infoDataItem === null || infoDataItem === void 0 ? void 0 : infoDataItem.id) === props.value,
350
+ icon: getIcon(props.type),
351
+ dataItemType: props.type,
352
+ dimensionType: getDimensionType({
353
+ type: props.type,
354
+ expression: props.expression
355
+ }),
356
+ dataTest: `${dataTest}-transfer-option`,
357
+ itemsRef: itemsRef,
358
+ onEditClick: () => onEditClick(props),
359
+ onInfoClick: () => setInfoDataItem({
360
+ id: props.value,
361
+ type: props.type
362
+ })
363
+ /* eslint-enable react/prop-types */
364
+ })),
368
365
  dataTest: `${dataTest}-transfer`
369
366
  }), currentCalculation && supportsEDI && /*#__PURE__*/React.createElement(CalculationModal, {
370
367
  calculation: currentCalculation,
@@ -52,6 +52,9 @@ export const PivotTableColumnHeaderCell = ({
52
52
  className: `jsx-${cellStyle.__hash}` + " " + "column-header-inner"
53
53
  }, /*#__PURE__*/React.createElement("span", {
54
54
  "data-test": "visualization-column-header",
55
+ style: {
56
+ ...header.style
57
+ },
55
58
  className: `jsx-${cellStyle.__hash}` + " " + "column-header-label"
56
59
  }, header.label), isSortable ? /*#__PURE__*/React.createElement(PivotTableSortIcon, {
57
60
  index: index,
@@ -30,7 +30,8 @@ export const PivotTableRowHeaderCell = ({
30
30
  height,
31
31
  left: rowLevel > 0 ?
32
32
  // calculate the width of all row header cells on the left of current cell
33
- engine.adaptiveClippingController.columns.headerSizes.slice(0, rowLevel).reduce((width, acc) => acc += width, 0) : 0
33
+ engine.adaptiveClippingController.columns.headerSizes.slice(0, rowLevel).reduce((width, acc) => acc += width, 0) : 0,
34
+ ...header.style
34
35
  },
35
36
  dataTest: "visualization-row-header"
36
37
  }, header.label)
package/build/es/index.js CHANGED
@@ -129,6 +129,10 @@ export { HIDE_EMPTY_ROW_ITEMS_BEFORE_FIRST, HIDE_EMPTY_ROW_ITEMS_AFTER_LAST, HID
129
129
 
130
130
  export { renderValue as formatValue } from './modules/renderValue.js';
131
131
 
132
+ // Modules: response
133
+
134
+ export { transformResponse as transformEventAggregateResponse } from './modules/response/event/response.js';
135
+
132
136
  // Utils: colorSets
133
137
  export { COLOR_SET_DEFAULT, COLOR_SET_BASIC, COLOR_SET_EXTENDED, COLOR_SET_BRIGHT, COLOR_SET_DARK, COLOR_SET_GRAY, COLOR_SET_COLOR_BLIND, COLOR_SET_PATTERNS, colorSets } from './visualizations/util/colors/colorSets.js';
134
138
 
@@ -410,6 +410,7 @@
410
410
  "Data": "Data",
411
411
  "Organisation unit": "Organisation unit",
412
412
  "Assigned Categories": "Assigned Categories",
413
+ "No value": "No value",
413
414
  "Text": "Text",
414
415
  "Long text": "Long text",
415
416
  "Multi text": "Multi text",
@@ -74,7 +74,8 @@ export class AdaptiveClippingController {
74
74
  if (isColumn) {
75
75
  var _axis$sizes$index;
76
76
  const headerSize = this.measureText(label, {
77
- maxWidth: isLeafHeader ? Math.max(CLIPPED_CELL_MIN_SIZE, ((_axis$sizes$index = axis.sizes[index]) === null || _axis$sizes$index === void 0 ? void 0 : _axis$sizes$index.size) || 0) : 0
77
+ maxWidth: isLeafHeader ? Math.max(CLIPPED_CELL_MIN_SIZE, ((_axis$sizes$index = axis.sizes[index]) === null || _axis$sizes$index === void 0 ? void 0 : _axis$sizes$index.size) || 0) : 0,
78
+ ...header.style
78
79
  });
79
80
  this.addSize({
80
81
  row: -headerStack.length + level,
@@ -32,6 +32,9 @@ export const getHeaderForDisplay = ({
32
32
  return {
33
33
  span,
34
34
  label,
35
- includesHierarchy
35
+ includesHierarchy,
36
+ ...(currentHeader.style ? {
37
+ style: currentHeader.style
38
+ } : {})
36
39
  };
37
40
  };
@@ -1,15 +1,15 @@
1
1
  import { CLIPPED_CELL_MAX_SIZE, WRAPPED_TEXT_JUSTIFY_BUFFER, WRAPPED_TEXT_LINE_HEIGHT } from './pivotTableConstants.js';
2
2
  let canvas;
3
- const getContext = fontSize => {
3
+ const getContext = (fontSize = 11, fontFamily = 'Roboto, Arial, sans-serif') => {
4
4
  if (!canvas) {
5
5
  canvas = document.createElement('canvas');
6
6
  }
7
7
  const ctx = canvas.getContext('2d');
8
- ctx.font = `${fontSize}px Roboto, Arial, sans-serif`;
8
+ ctx.font = `${fontSize}px ${fontFamily}`;
9
9
  return ctx;
10
10
  };
11
- const measureText = (text, fontSize = 11) => {
12
- const ctx = getContext(fontSize);
11
+ const measureText = (text, fontSize, fontFamily) => {
12
+ const ctx = getContext(fontSize, fontFamily);
13
13
  const textMetrics = ctx.measureText(text);
14
14
  return textMetrics.width;
15
15
  };
@@ -17,7 +17,8 @@ export const measureTextWithWrapping = (text, {
17
17
  fontSize = 11,
18
18
  maxWidth = CLIPPED_CELL_MAX_SIZE,
19
19
  justifyBuffer = WRAPPED_TEXT_JUSTIFY_BUFFER,
20
- lineHeight = WRAPPED_TEXT_LINE_HEIGHT
20
+ lineHeight = WRAPPED_TEXT_LINE_HEIGHT,
21
+ fontFamily
21
22
  }) => {
22
23
  if (!text) {
23
24
  return {
@@ -36,7 +37,7 @@ export const measureTextWithWrapping = (text, {
36
37
  const words = paragraphs.shift().split(/\s+/);
37
38
  while (words.length) {
38
39
  const nextWord = (currentLineWidth === 0 ? '' : ' ') + words.shift();
39
- const nextWordWidth = measureText(nextWord, fontSize);
40
+ const nextWordWidth = measureText(nextWord, fontSize, fontFamily);
40
41
  if (maxWidth && currentLineWidth + nextWordWidth > maxWidth) {
41
42
  if (currentLineWidth <= maxWidth - justifyBuffer) {
42
43
  // Wrapping this word would cause an unnaturally short line
@@ -0,0 +1,75 @@
1
+ import { VALUE_TYPE_NUMBER } from '../../../valueTypes.js';
2
+ import { getDimensions, getItems, getRows, getPrefixedValue, getUnique, getValuesUniqueSortedAsc } from '../default.js';
3
+ import { PREFIX_SEPARATOR } from '../response.js';
4
+ const testId = 'Zj7UnCAulEk.qrur9Dvnyt5';
5
+ describe('default', () => {
6
+ // applyDefaultHandler is tested by response.spec.js
7
+
8
+ describe('getUnique', () => {
9
+ it('removes duplicate string numbers', () => {
10
+ const arr = ['2', '10', '2', '01', '1', '-1', '-1', '1', '10'];
11
+ expect(getUnique(arr)).toEqual(['2', '10', '01', '1', '-1']);
12
+ });
13
+ it('treats "01" and "1" as different strings', () => {
14
+ const arr = ['01', '1', '01'];
15
+ expect(getUnique(arr)).toEqual(['01', '1']);
16
+ });
17
+ it('handles empty array', () => {
18
+ expect(getUnique([])).toEqual([]);
19
+ });
20
+ it('preserves order of first occurrence', () => {
21
+ const arr = ['2', '1', '2', '1'];
22
+ expect(getUnique(arr)).toEqual(['2', '1']);
23
+ });
24
+ });
25
+ describe('getValuesUniqueSortedAsc', () => {
26
+ it('sorts string numbers numerically', () => {
27
+ expect(getValuesUniqueSortedAsc(['1', '10', '-1', '5', '5', '3'], VALUE_TYPE_NUMBER)).toEqual(['-1', '1', '3', '5', '10']);
28
+ });
29
+ it('sorts non-numeric strings as strings', () => {
30
+ expect(getValuesUniqueSortedAsc(['1995-04-18 13:54:00.0', '1991-12-03 12:02:00.0', '1992-01-05 12:51:00.0', '1991-05-21 14:46:00.0', '1998-03-01 11:21:00.0', '1991-09-02 10:21:00.0', '1992-01-04 12:02:00.0', '1991-12-02 12:01:00.0', '1990-01-25 14:51:00.0', '1991-05-22 14:47:00.0'])).toEqual(['1990-01-25 14:51:00.0', '1991-05-21 14:46:00.0', '1991-05-22 14:47:00.0', '1991-09-02 10:21:00.0', '1991-12-02 12:01:00.0', '1991-12-03 12:02:00.0', '1992-01-04 12:02:00.0', '1992-01-05 12:51:00.0', '1995-04-18 13:54:00.0', '1998-03-01 11:21:00.0']);
31
+ });
32
+ });
33
+ describe('getPrefixedValue', () => {
34
+ it('returns prefix and value separated by a colon', () => {
35
+ expect(getPrefixedValue('123', 'id')).toBe(`id${PREFIX_SEPARATOR}123`);
36
+ });
37
+ });
38
+ describe('getItems', () => {
39
+ it('returns an object with prefixed keys and correct names', () => {
40
+ expect(getItems(['1', '2'], testId)).toEqual({
41
+ [testId + `${PREFIX_SEPARATOR}1`]: {
42
+ name: '1'
43
+ },
44
+ [testId + `${PREFIX_SEPARATOR}2`]: {
45
+ name: '2'
46
+ }
47
+ });
48
+ });
49
+ it('uses the formatter if one is provided', () => {
50
+ expect(getItems(['world'], 'hello', {
51
+ itemFormatter: str => str.toUpperCase()
52
+ })).toEqual({
53
+ [`hello${PREFIX_SEPARATOR}world`]: {
54
+ name: 'WORLD'
55
+ }
56
+ });
57
+ });
58
+ });
59
+ describe('getDimensions', () => {
60
+ it('returns an object with dimensionId as key and correctly prefixed values', () => {
61
+ expect(getDimensions(['1', '2'], testId)).toEqual({
62
+ [testId]: [testId + `${PREFIX_SEPARATOR}1`, testId + `${PREFIX_SEPARATOR}2`]
63
+ });
64
+ });
65
+ });
66
+ describe('getRows', () => {
67
+ it('prefixes value at headerIndex for each row', () => {
68
+ const rows = [['a', '1', 'x'], ['b', '2', 'y']];
69
+ expect(getRows(rows, 1, testId)).toEqual([['a', `${testId}${PREFIX_SEPARATOR}1`, 'x'], ['b', `${testId}${PREFIX_SEPARATOR}2`, 'y']]);
70
+ });
71
+ it('handles empty rows array', () => {
72
+ expect(getRows([], 1, 'a')).toEqual([]);
73
+ });
74
+ });
75
+ });
@@ -0,0 +1,32 @@
1
+ import responseHideNa from '../../../../__demo__/data/event/optionset.data.hidena.json';
2
+ import responseOrg from '../../../../__demo__/data/event/optionset.data.org.json';
3
+ import { getOptionCodeIdMap, getOptionIdRows } from '../optionSet.js';
4
+ const testOptionCodeIdMap1 = {
5
+ ONE: 'optionId1',
6
+ TWO: 'optionId2'
7
+ };
8
+ const testOptionCodeIdMap2 = {
9
+ ONE: 'optionId3',
10
+ TWO: 'optionId4'
11
+ };
12
+ describe('optionSet', () => {
13
+ // applyOptionSetHandler is tested by response.spec.js
14
+
15
+ describe('getOptionCodeIdMap', () => {
16
+ it('should create an option code:id object', () => {
17
+ const testId = responseHideNa.headers[0].name;
18
+ const testOptionIds = responseHideNa.metaData.dimensions[testId];
19
+ const testOptionItems = responseHideNa.metaData.items;
20
+ expect(getOptionCodeIdMap(testOptionIds, testOptionItems)).toEqual(testOptionCodeIdMap1);
21
+ });
22
+ });
23
+
24
+ // Test the solution for two option sets with shared option codes
25
+ describe('getOptionIdRows', () => {
26
+ it('should replace option codes with ids in the right index', () => {
27
+ const optionSet1Rows = getOptionIdRows(responseOrg.rows, testOptionCodeIdMap1, 0);
28
+ const optionSet1And2Rows = getOptionIdRows(optionSet1Rows, testOptionCodeIdMap2, 1);
29
+ expect(optionSet1And2Rows).toEqual(responseHideNa.rows);
30
+ });
31
+ });
32
+ });
@@ -0,0 +1,122 @@
1
+ import responseBooleanHideNa from '../../../../__demo__/data/event/boolean.data.hidena.json';
2
+ import responseBoolean from '../../../../__demo__/data/event/boolean.data.json';
3
+ import responseBooleanOrg from '../../../../__demo__/data/event/boolean.data.org.json';
4
+ import responseDateHideNa from '../../../../__demo__/data/event/date.data.hidena.json';
5
+ import responseDate from '../../../../__demo__/data/event/date.data.json';
6
+ import responseDateOrg from '../../../../__demo__/data/event/date.data.org.json';
7
+ import responseDatetimeHideNa from '../../../../__demo__/data/event/datetime.data.hidena.json';
8
+ import responseDatetime from '../../../../__demo__/data/event/datetime.data.json';
9
+ import responseDatetimeOrg from '../../../../__demo__/data/event/datetime.data.org.json';
10
+ import responseTextHideNa from '../../../../__demo__/data/event/email.data.hidena.json';
11
+ import responseText from '../../../../__demo__/data/event/email.data.json';
12
+ import responseTextOrg from '../../../../__demo__/data/event/email.data.org.json';
13
+ import responseNumericHideNa from '../../../../__demo__/data/event/integer.data.hidena.json';
14
+ import responseNumeric from '../../../../__demo__/data/event/integer.data.json';
15
+ import responseNumericOrg from '../../../../__demo__/data/event/integer.data.org.json';
16
+ import responseOptionSetHideNa from '../../../../__demo__/data/event/optionset.data.hidena.json';
17
+ import responseOptionSet from '../../../../__demo__/data/event/optionset.data.json';
18
+ import responseOptionSetOrg from '../../../../__demo__/data/event/optionset.data.org.json';
19
+ import responseTimeHideNa from '../../../../__demo__/data/event/time.data.hidena.json';
20
+ import responseTime from '../../../../__demo__/data/event/time.data.json';
21
+ import responseTimeOrg from '../../../../__demo__/data/event/time.data.org.json';
22
+ import responseYesOnlyHideNa from '../../../../__demo__/data/event/yesonly.data.hidena.json';
23
+ import responseYesOnly from '../../../../__demo__/data/event/yesonly.data.json';
24
+ import responseYesOnlyOrg from '../../../../__demo__/data/event/yesonly.data.org.json';
25
+ import { VALUE_TYPE_AGE, VALUE_TYPE_BOOLEAN, VALUE_TYPE_DATE, VALUE_TYPE_DATETIME, VALUE_TYPE_PERCENTAGE, VALUE_TYPE_TRUE_ONLY } from '../../../valueTypes.js';
26
+ import { getItemFormatterByValueType, transformResponse } from '../response.js';
27
+ describe('response', () => {
28
+ describe('getItemFormatterByValueType', () => {
29
+ it('should return the correct formatter and format correctly', () => {
30
+ expect(getItemFormatterByValueType(VALUE_TYPE_BOOLEAN)('1')).toBe('Yes');
31
+ expect(getItemFormatterByValueType(VALUE_TYPE_BOOLEAN)('0')).toBe('No');
32
+ expect(getItemFormatterByValueType(VALUE_TYPE_TRUE_ONLY)('1')).toBe('Yes');
33
+ expect(getItemFormatterByValueType(VALUE_TYPE_AGE)('1985-01-01 00:00:00.0')).toBe('1985-01-01');
34
+ expect(getItemFormatterByValueType(VALUE_TYPE_DATE)('2023-01-01 00:00:00.0')).toBe('2023-01-01');
35
+ expect(getItemFormatterByValueType(VALUE_TYPE_DATETIME)('2023-01-01 12:00:00.0')).toBe('2023-01-01 12:00');
36
+ expect(getItemFormatterByValueType(VALUE_TYPE_PERCENTAGE)('50.0')).toBe('50');
37
+ expect(getItemFormatterByValueType('NOT_A_TYPE')).toBe(undefined);
38
+ });
39
+ });
40
+ describe('transformResponse', () => {
41
+ describe('boolean', () => {
42
+ it('transforms response', () => {
43
+ expect(transformResponse(responseBooleanOrg)).toEqual(responseBoolean);
44
+ });
45
+ it('transforms response and hides N/A data', () => {
46
+ expect(transformResponse(responseBooleanOrg, {
47
+ hideNaData: true
48
+ })).toEqual(responseBooleanHideNa);
49
+ });
50
+ });
51
+ describe('date', () => {
52
+ it('transforms response', () => {
53
+ expect(transformResponse(responseDateOrg)).toEqual(responseDate);
54
+ });
55
+ it('transforms response and hides N/A data', () => {
56
+ expect(transformResponse(responseDateOrg, {
57
+ hideNaData: true
58
+ })).toEqual(responseDateHideNa);
59
+ });
60
+ });
61
+ describe('datetime', () => {
62
+ it('transforms response', () => {
63
+ expect(transformResponse(responseDatetimeOrg)).toEqual(responseDatetime);
64
+ });
65
+ it('transforms response and hides N/A data', () => {
66
+ expect(transformResponse(responseDatetimeOrg, {
67
+ hideNaData: true
68
+ })).toEqual(responseDatetimeHideNa);
69
+ });
70
+ });
71
+ describe('numeric', () => {
72
+ it('transforms response', () => {
73
+ expect(transformResponse(responseNumericOrg)).toEqual(responseNumeric);
74
+ });
75
+ it('transforms response and hides N/A data', () => {
76
+ expect(transformResponse(responseNumericOrg, {
77
+ hideNaData: true
78
+ })).toEqual(responseNumericHideNa);
79
+ });
80
+ });
81
+ describe('option set', () => {
82
+ it('transforms response with non-unique codes across two option sets', () => {
83
+ expect(transformResponse(responseOptionSetOrg)).toEqual(responseOptionSet);
84
+ });
85
+ it('transforms response with non-unique codes across two option sets and hides N/A data', () => {
86
+ expect(transformResponse(responseOptionSetOrg, {
87
+ hideNaData: true
88
+ })).toEqual(responseOptionSetHideNa);
89
+ });
90
+ });
91
+ describe('text', () => {
92
+ it('transforms response', () => {
93
+ expect(transformResponse(responseTextOrg)).toEqual(responseText);
94
+ });
95
+ it('transforms response and hides N/A data', () => {
96
+ expect(transformResponse(responseTextOrg, {
97
+ hideNaData: true
98
+ })).toEqual(responseTextHideNa);
99
+ });
100
+ });
101
+ describe('time', () => {
102
+ it('transforms response', () => {
103
+ expect(transformResponse(responseTimeOrg)).toEqual(responseTime);
104
+ });
105
+ it('transforms response and hides N/A data', () => {
106
+ expect(transformResponse(responseTimeOrg, {
107
+ hideNaData: true
108
+ })).toEqual(responseTimeHideNa);
109
+ });
110
+ });
111
+ describe('yes only', () => {
112
+ it('transforms response', () => {
113
+ expect(transformResponse(responseYesOnlyOrg)).toEqual(responseYesOnly);
114
+ });
115
+ it('transforms response and hides N/A data', () => {
116
+ expect(transformResponse(responseYesOnlyOrg, {
117
+ hideNaData: true
118
+ })).toEqual(responseYesOnlyHideNa);
119
+ });
120
+ });
121
+ });
122
+ });
@@ -0,0 +1,52 @@
1
+ import { isBooleanValueType, isNumericValueType, VALUE_TYPE_TEXT } from '../../valueTypes.js';
2
+ import { NA_VALUE, PREFIX_SEPARATOR } from './response.js';
3
+ export const getUnique = array => [...new Set(array)];
4
+ export const getValuesUniqueSortedAsc = (values, valueType = VALUE_TYPE_TEXT) => isNumericValueType(valueType) || isBooleanValueType(valueType) ? getUnique(values).map(x => [Number(x), x]).sort((a, b) => a[0] - b[0]).map(arr => arr[1]) : getUnique(values).slice().sort((a, b) => a.localeCompare(b));
5
+ export const getPrefixedValue = (value, prefix) => `${prefix}${PREFIX_SEPARATOR}${value}`;
6
+ export const getItems = (values, dimensionId, {
7
+ itemFormatter
8
+ } = {}) => values.reduce((items, value) => {
9
+ items[getPrefixedValue(value, dimensionId)] = {
10
+ name: itemFormatter ? itemFormatter(value) : value
11
+ };
12
+ return items;
13
+ }, {});
14
+ export const getDimensions = (values, dimensionId) => ({
15
+ [dimensionId]: values.map(value => getPrefixedValue(value, dimensionId))
16
+ });
17
+ export const getRows = (rows, headerIndex, dimensionId) => {
18
+ let row;
19
+ let value;
20
+ return rows.map(r => {
21
+ value = r[headerIndex];
22
+ if (value !== NA_VALUE) {
23
+ row = [...r];
24
+ row[headerIndex] = getPrefixedValue(row[headerIndex], dimensionId);
25
+ return row;
26
+ }
27
+ return r;
28
+ });
29
+ };
30
+ export const applyDefaultHandler = (response, headerIndex, {
31
+ itemFormatter
32
+ } = {}) => {
33
+ const header = response.headers[headerIndex];
34
+ const uniqueSortedValuesAsc = getValuesUniqueSortedAsc(response.rows.map(row => row[headerIndex]).filter(value => value !== NA_VALUE), header.valueType);
35
+ return {
36
+ ...response,
37
+ metaData: {
38
+ ...response.metaData,
39
+ items: {
40
+ ...response.metaData.items,
41
+ ...getItems(uniqueSortedValuesAsc, header.name, {
42
+ itemFormatter
43
+ })
44
+ },
45
+ dimensions: {
46
+ ...response.metaData.dimensions,
47
+ ...getDimensions(uniqueSortedValuesAsc, header.name)
48
+ }
49
+ },
50
+ rows: [...getRows(response.rows, headerIndex, header.name)]
51
+ };
52
+ };
@@ -0,0 +1,27 @@
1
+ import { NA_VALUE } from './response.js';
2
+ export const getOptionCodeIdMap = (optionIds, items) => optionIds.reduce((map, optionId) => {
3
+ map[items[optionId].code] = optionId;
4
+ return map;
5
+ }, {});
6
+ export const getOptionIdRows = (rows, optionCodeIdMap, headerIndex) => {
7
+ let value;
8
+ let row;
9
+ return rows.map(r => {
10
+ value = r[headerIndex];
11
+ if (value !== NA_VALUE) {
12
+ row = [...r];
13
+ row[headerIndex] = optionCodeIdMap[value];
14
+ return row;
15
+ }
16
+ return r;
17
+ });
18
+ };
19
+ export const applyOptionSetHandler = (response, headerIndex) => {
20
+ const header = response.headers[headerIndex];
21
+ const optionIds = response.metaData.dimensions[header.name];
22
+ const optionCodeIdMap = getOptionCodeIdMap(optionIds, response.metaData.items);
23
+ return {
24
+ ...response,
25
+ rows: getOptionIdRows(response.rows, optionCodeIdMap, headerIndex)
26
+ };
27
+ };