@dhis2/analytics 26.8.7 → 26.9.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 (127) hide show
  1. package/build/cjs/__demo__/SingleValue.stories.js +706 -0
  2. package/build/cjs/locales/lo/translations.json +16 -12
  3. package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart/default.js +26 -0
  4. package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart/index.js +18 -0
  5. package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart/singleValue.js +19 -0
  6. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/index.js +36 -0
  7. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueBackgroundColor.js +12 -0
  8. package/build/cjs/visualizations/config/adapters/{dhis_dhis/value/index.js → dhis_highcharts/customSVGOptions/singleValue/getSingleValueFormattedValue.js} +8 -6
  9. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueLegendColor.js +11 -0
  10. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueSubtext.js +11 -0
  11. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTextColor.js +20 -0
  12. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTitleColor.js +26 -0
  13. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/index.js +31 -0
  14. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/index.js +24 -0
  15. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/index.js +18 -0
  16. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/addIconElement.js +34 -0
  17. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/checkIfFitsWithinContainer.js +19 -0
  18. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeLayoutRect.js +39 -0
  19. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeSpacingTop.js +21 -0
  20. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/constants.js +11 -0
  21. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/getAvailableSpace.js +14 -0
  22. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/index.js +48 -0
  23. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/positionElements.js +46 -0
  24. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/styles.js +109 -0
  25. package/build/cjs/visualizations/config/adapters/dhis_highcharts/exporting.js +30 -0
  26. package/build/cjs/visualizations/config/adapters/dhis_highcharts/index.js +33 -23
  27. package/build/cjs/visualizations/config/adapters/dhis_highcharts/lang.js +17 -0
  28. package/build/cjs/visualizations/config/adapters/dhis_highcharts/plotOptions.js +1 -1
  29. package/build/cjs/visualizations/config/adapters/dhis_highcharts/series/index.js +5 -1
  30. package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/__tests__/singleValue.spec.js +62 -0
  31. package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +56 -22
  32. package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/singleValue.js +27 -0
  33. package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/__tests__/singleValue.spec.js +44 -0
  34. package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/index.js +50 -22
  35. package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/singleValue.js +31 -0
  36. package/build/cjs/visualizations/config/adapters/dhis_highcharts/type.js +2 -0
  37. package/build/cjs/visualizations/config/adapters/dhis_highcharts/xAxis/index.js +1 -0
  38. package/build/cjs/visualizations/config/adapters/dhis_highcharts/yAxis/index.js +4 -5
  39. package/build/cjs/visualizations/config/adapters/index.js +2 -4
  40. package/build/cjs/visualizations/config/generators/highcharts/index.js +8 -0
  41. package/build/cjs/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/index.js +13 -0
  42. package/build/cjs/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/nonASCIIFont.js +17 -0
  43. package/build/cjs/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/textShadow.js +289 -0
  44. package/build/cjs/visualizations/config/generators/index.js +2 -4
  45. package/build/cjs/visualizations/store/adapters/dhis_highcharts/index.js +3 -0
  46. package/build/cjs/visualizations/store/adapters/dhis_highcharts/singleValue.js +10 -0
  47. package/build/cjs/visualizations/store/adapters/index.js +2 -4
  48. package/build/cjs/visualizations/util/shouldUseContrastColor.js +24 -0
  49. package/build/es/__demo__/SingleValue.stories.js +702 -0
  50. package/build/es/locales/lo/translations.json +16 -12
  51. package/build/es/visualizations/config/adapters/dhis_highcharts/chart/default.js +19 -0
  52. package/build/es/visualizations/config/adapters/dhis_highcharts/chart/index.js +11 -0
  53. package/build/es/visualizations/config/adapters/dhis_highcharts/chart/singleValue.js +12 -0
  54. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/index.js +29 -0
  55. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueBackgroundColor.js +6 -0
  56. package/build/es/visualizations/config/adapters/{dhis_dhis/value/index.js → dhis_highcharts/customSVGOptions/singleValue/getSingleValueFormattedValue.js} +4 -4
  57. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueLegendColor.js +5 -0
  58. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueSubtext.js +5 -0
  59. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTextColor.js +14 -0
  60. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTitleColor.js +20 -0
  61. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/index.js +25 -0
  62. package/build/es/visualizations/config/adapters/dhis_highcharts/events/index.js +16 -0
  63. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/index.js +11 -0
  64. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/addIconElement.js +28 -0
  65. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/checkIfFitsWithinContainer.js +13 -0
  66. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeLayoutRect.js +33 -0
  67. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeSpacingTop.js +15 -0
  68. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/constants.js +4 -0
  69. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/getAvailableSpace.js +8 -0
  70. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/index.js +42 -0
  71. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/positionElements.js +40 -0
  72. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/styles.js +101 -0
  73. package/build/es/visualizations/config/adapters/dhis_highcharts/exporting.js +23 -0
  74. package/build/es/visualizations/config/adapters/dhis_highcharts/index.js +23 -13
  75. package/build/es/visualizations/config/adapters/dhis_highcharts/lang.js +11 -0
  76. package/build/es/visualizations/config/adapters/dhis_highcharts/plotOptions.js +1 -1
  77. package/build/es/visualizations/config/adapters/dhis_highcharts/series/index.js +6 -2
  78. package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/__tests__/singleValue.spec.js +59 -0
  79. package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +56 -24
  80. package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/singleValue.js +14 -0
  81. package/build/es/visualizations/config/adapters/dhis_highcharts/title/__tests__/singleValue.spec.js +42 -0
  82. package/build/es/visualizations/config/adapters/dhis_highcharts/title/index.js +52 -24
  83. package/build/es/visualizations/config/adapters/dhis_highcharts/title/singleValue.js +18 -0
  84. package/build/es/visualizations/config/adapters/dhis_highcharts/type.js +3 -1
  85. package/build/es/visualizations/config/adapters/dhis_highcharts/xAxis/index.js +2 -1
  86. package/build/es/visualizations/config/adapters/dhis_highcharts/yAxis/index.js +5 -6
  87. package/build/es/visualizations/config/adapters/index.js +1 -3
  88. package/build/es/visualizations/config/generators/highcharts/index.js +8 -0
  89. package/build/es/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/index.js +6 -0
  90. package/build/es/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/nonASCIIFont.js +11 -0
  91. package/build/es/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/textShadow.js +283 -0
  92. package/build/es/visualizations/config/generators/index.js +1 -3
  93. package/build/es/visualizations/store/adapters/dhis_highcharts/index.js +4 -1
  94. package/build/es/visualizations/store/adapters/dhis_highcharts/singleValue.js +4 -0
  95. package/build/es/visualizations/store/adapters/index.js +1 -3
  96. package/build/es/visualizations/util/shouldUseContrastColor.js +17 -0
  97. package/package.json +1 -1
  98. package/build/cjs/visualizations/config/adapters/dhis_dhis/index.js +0 -39
  99. package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/index.spec.js +0 -49
  100. package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/singleValue.spec.js +0 -15
  101. package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/index.js +0 -34
  102. package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/singleValue.js +0 -11
  103. package/build/cjs/visualizations/config/adapters/dhis_dhis/title/__tests__/index.spec.js +0 -39
  104. package/build/cjs/visualizations/config/adapters/dhis_dhis/title/__tests__/singleValue.spec.js +0 -17
  105. package/build/cjs/visualizations/config/adapters/dhis_dhis/title/index.js +0 -31
  106. package/build/cjs/visualizations/config/adapters/dhis_dhis/title/singleValue.js +0 -18
  107. package/build/cjs/visualizations/config/adapters/dhis_dhis/type.js +0 -19
  108. package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart.js +0 -39
  109. package/build/cjs/visualizations/config/generators/dhis/index.js +0 -28
  110. package/build/cjs/visualizations/config/generators/dhis/singleValue.js +0 -359
  111. package/build/cjs/visualizations/store/adapters/dhis_dhis/index.js +0 -83
  112. package/build/cjs/visualizations/store/adapters/dhis_dhis/singleValue.js +0 -10
  113. package/build/es/visualizations/config/adapters/dhis_dhis/index.js +0 -30
  114. package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/index.spec.js +0 -46
  115. package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/singleValue.spec.js +0 -12
  116. package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/index.js +0 -27
  117. package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/singleValue.js +0 -4
  118. package/build/es/visualizations/config/adapters/dhis_dhis/title/__tests__/index.spec.js +0 -36
  119. package/build/es/visualizations/config/adapters/dhis_dhis/title/__tests__/singleValue.spec.js +0 -14
  120. package/build/es/visualizations/config/adapters/dhis_dhis/title/index.js +0 -24
  121. package/build/es/visualizations/config/adapters/dhis_dhis/title/singleValue.js +0 -11
  122. package/build/es/visualizations/config/adapters/dhis_dhis/type.js +0 -13
  123. package/build/es/visualizations/config/adapters/dhis_highcharts/chart.js +0 -32
  124. package/build/es/visualizations/config/generators/dhis/index.js +0 -21
  125. package/build/es/visualizations/config/generators/dhis/singleValue.js +0 -353
  126. package/build/es/visualizations/store/adapters/dhis_dhis/index.js +0 -76
  127. package/build/es/visualizations/store/adapters/dhis_dhis/singleValue.js +0 -4
@@ -0,0 +1,283 @@
1
+ /* This plugin was provided by HighCharts support and resolves an issue with label
2
+ * text that has a white outline, such as the one we use for stacked bar charts.
3
+ * For example: "ANC: 1-4 visits by districts this year (stacked)"
4
+ * This issue has actually been resolved in HighCharts v11, so once we have upgraded
5
+ * to that version, this plugin can be removed. */
6
+
7
+ export default function (H) {
8
+ const {
9
+ AST,
10
+ defaultOptions,
11
+ downloadURL
12
+ } = H,
13
+ {
14
+ ajax
15
+ } = H.HttpUtilities,
16
+ doc = document,
17
+ win = window,
18
+ OfflineExporting = H._modules['Extensions/OfflineExporting/OfflineExporting.js'],
19
+ {
20
+ getScript,
21
+ svgToPdf,
22
+ imageToDataUrl,
23
+ svgToDataUrl
24
+ } = OfflineExporting;
25
+ H.wrap(OfflineExporting, 'downloadSVGLocal', function (proceed, svg, options, failCallback, successCallback) {
26
+ var dummySVGContainer = doc.createElement('div'),
27
+ imageType = options.type || 'image/png',
28
+ filename = (options.filename || 'chart') + '.' + (imageType === 'image/svg+xml' ? 'svg' : imageType.split('/')[1]),
29
+ scale = options.scale || 1;
30
+ var svgurl,
31
+ blob,
32
+ finallyHandler,
33
+ libURL = options.libURL || defaultOptions.exporting.libURL,
34
+ objectURLRevoke = true,
35
+ pdfFont = options.pdfFont;
36
+ // Allow libURL to end with or without fordward slash
37
+ libURL = libURL.slice(-1) !== '/' ? libURL + '/' : libURL;
38
+ /*
39
+ * Detect if we need to load TTF fonts for the PDF, then load them and
40
+ * proceed.
41
+ *
42
+ * @private
43
+ */
44
+ var loadPdfFonts = function (svgElement, callback) {
45
+ var hasNonASCII = function (s) {
46
+ return (
47
+ // eslint-disable-next-line no-control-regex
48
+ /[^\u0000-\u007F\u200B]+/.test(s)
49
+ );
50
+ };
51
+ // Register an event in order to add the font once jsPDF is
52
+ // initialized
53
+ var addFont = function (variant, base64) {
54
+ win.jspdf.jsPDF.API.events.push(['initialized', function () {
55
+ this.addFileToVFS(variant, base64);
56
+ this.addFont(variant, 'HighchartsFont', variant);
57
+ if (!this.getFontList().HighchartsFont) {
58
+ this.setFont('HighchartsFont');
59
+ }
60
+ }]);
61
+ };
62
+ // If there are no non-ASCII characters in the SVG, do not use
63
+ // bother downloading the font files
64
+ if (pdfFont && !hasNonASCII(svgElement.textContent || '')) {
65
+ pdfFont = void 0;
66
+ }
67
+ // Add new font if the URL is declared, #6417.
68
+ var variants = ['normal', 'italic', 'bold', 'bolditalic'];
69
+ // Shift the first element off the variants and add as a font.
70
+ // Then asynchronously trigger the next variant until calling the
71
+ // callback when the variants are empty.
72
+ var normalBase64;
73
+ var shiftAndLoadVariant = function () {
74
+ var variant = variants.shift();
75
+ // All variants shifted and possibly loaded, proceed
76
+ if (!variant) {
77
+ return callback();
78
+ }
79
+ var url = pdfFont && pdfFont[variant];
80
+ if (url) {
81
+ ajax({
82
+ url: url,
83
+ responseType: 'blob',
84
+ success: function (data, xhr) {
85
+ var reader = new FileReader();
86
+ reader.onloadend = function () {
87
+ if (typeof this.result === 'string') {
88
+ var base64 = this.result.split(',')[1];
89
+ addFont(variant, base64);
90
+ if (variant === 'normal') {
91
+ normalBase64 = base64;
92
+ }
93
+ }
94
+ shiftAndLoadVariant();
95
+ };
96
+ reader.readAsDataURL(xhr.response);
97
+ },
98
+ error: shiftAndLoadVariant
99
+ });
100
+ } else {
101
+ // For other variants, fall back to normal text weight/style
102
+ if (normalBase64) {
103
+ addFont(variant, normalBase64);
104
+ }
105
+ shiftAndLoadVariant();
106
+ }
107
+ };
108
+ shiftAndLoadVariant();
109
+ };
110
+ /*
111
+ * @private
112
+ */
113
+ var downloadPDF = function () {
114
+ AST.setElementHTML(dummySVGContainer, svg);
115
+ var textElements = dummySVGContainer.getElementsByTagName('text'),
116
+ // Copy style property to element from parents if it's not
117
+ // there. Searches up hierarchy until it finds prop, or hits the
118
+ // chart container.
119
+ setStylePropertyFromParents = function (el, propName) {
120
+ var curParent = el;
121
+ while (curParent && curParent !== dummySVGContainer) {
122
+ if (curParent.style[propName]) {
123
+ el.style[propName] = curParent.style[propName];
124
+ break;
125
+ }
126
+ curParent = curParent.parentNode;
127
+ }
128
+ };
129
+ var titleElements, outlineElements
130
+ // Workaround for the text styling. Making sure it does pick up
131
+ // settings for parent elements.
132
+ ;
133
+ [].forEach.call(textElements, function (el) {
134
+ // Workaround for the text styling. making sure it does pick up
135
+ // the root element
136
+ ;
137
+ ['font-family', 'font-size'].forEach(function (property) {
138
+ setStylePropertyFromParents(el, property);
139
+ });
140
+ el.style.fontFamily = pdfFont && pdfFont.normal ?
141
+ // Custom PDF font
142
+ 'HighchartsFont' :
143
+ // Generic font (serif, sans-serif etc)
144
+ String(el.style.fontFamily && el.style.fontFamily.split(' ').splice(-1));
145
+ // Workaround for plotband with width, removing title from text
146
+ // nodes
147
+ titleElements = el.getElementsByTagName('title');
148
+ [].forEach.call(titleElements, function (titleElement) {
149
+ el.removeChild(titleElement);
150
+ });
151
+
152
+ // Remove all .highcharts-text-outline elements, #17170
153
+ outlineElements = el.getElementsByClassName('highcharts-text-outline');
154
+ while (outlineElements.length > 0) {
155
+ const outline = outlineElements[0];
156
+ if (outline.parentNode) {
157
+ outline.parentNode.removeChild(outline);
158
+ }
159
+ }
160
+ });
161
+ var svgNode = dummySVGContainer.querySelector('svg');
162
+ if (svgNode) {
163
+ loadPdfFonts(svgNode, function () {
164
+ svgToPdf(svgNode, 0, function (pdfData) {
165
+ try {
166
+ downloadURL(pdfData, filename);
167
+ if (successCallback) {
168
+ successCallback();
169
+ }
170
+ } catch (e) {
171
+ failCallback(e);
172
+ }
173
+ });
174
+ });
175
+ }
176
+ };
177
+ // Initiate download depending on file type
178
+ if (imageType === 'image/svg+xml') {
179
+ // SVG download. In this case, we want to use Microsoft specific
180
+ // Blob if available
181
+ try {
182
+ if (typeof win.navigator.msSaveOrOpenBlob !== 'undefined') {
183
+ // eslint-disable-next-line no-undef
184
+ blob = new MSBlobBuilder();
185
+ blob.append(svg);
186
+ svgurl = blob.getBlob('image/svg+xml');
187
+ } else {
188
+ svgurl = svgToDataUrl(svg);
189
+ }
190
+ downloadURL(svgurl, filename);
191
+ if (successCallback) {
192
+ successCallback();
193
+ }
194
+ } catch (e) {
195
+ failCallback(e);
196
+ }
197
+ } else if (imageType === 'application/pdf') {
198
+ if (win.jspdf && win.jspdf.jsPDF) {
199
+ downloadPDF();
200
+ } else {
201
+ // Must load pdf libraries first. // Don't destroy the object
202
+ // URL yet since we are doing things asynchronously. A cleaner
203
+ // solution would be nice, but this will do for now.
204
+ objectURLRevoke = true;
205
+ getScript(libURL + 'jspdf.js', function () {
206
+ getScript(libURL + 'svg2pdf.js', downloadPDF);
207
+ });
208
+ }
209
+ } else {
210
+ // PNG/JPEG download - create bitmap from SVG
211
+ svgurl = svgToDataUrl(svg);
212
+ finallyHandler = function () {
213
+ try {
214
+ OfflineExporting.domurl.revokeObjectURL(svgurl);
215
+ } catch (e) {
216
+ // Ignore
217
+ }
218
+ };
219
+ // First, try to get PNG by rendering on canvas
220
+ imageToDataUrl(svgurl, imageType, {}, scale, function (imageURL) {
221
+ // Success
222
+ try {
223
+ downloadURL(imageURL, filename);
224
+ if (successCallback) {
225
+ successCallback();
226
+ }
227
+ } catch (e) {
228
+ failCallback(e);
229
+ }
230
+ }, function () {
231
+ // Failed due to tainted canvas
232
+ // Create new and untainted canvas
233
+ var canvas = doc.createElement('canvas'),
234
+ ctx = canvas.getContext('2d'),
235
+ imageWidth = svg.match(
236
+ // eslint-disable-next-line no-useless-escape
237
+ /^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale,
238
+ imageHeight = svg.match(
239
+ // eslint-disable-next-line no-useless-escape
240
+ /^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale,
241
+ downloadWithCanVG = function () {
242
+ var v = win.canvg.Canvg.fromString(ctx, svg);
243
+ v.start();
244
+ try {
245
+ downloadURL(win.navigator.msSaveOrOpenBlob ? canvas.msToBlob() : canvas.toDataURL(imageType), filename);
246
+ if (successCallback) {
247
+ successCallback();
248
+ }
249
+ } catch (e) {
250
+ failCallback(e);
251
+ } finally {
252
+ finallyHandler();
253
+ }
254
+ };
255
+ canvas.width = imageWidth;
256
+ canvas.height = imageHeight;
257
+ if (win.canvg) {
258
+ // Use preloaded canvg
259
+ downloadWithCanVG();
260
+ } else {
261
+ // Must load canVG first. // Don't destroy the object
262
+ // URL yet since we are doing things asynchronously. A
263
+ // cleaner solution would be nice, but this will do for
264
+ // now.
265
+ objectURLRevoke = true;
266
+ getScript(libURL + 'canvg.js', function () {
267
+ downloadWithCanVG();
268
+ });
269
+ }
270
+ },
271
+ // No canvas support
272
+ failCallback,
273
+ // Failed to load image
274
+ failCallback,
275
+ // Finally
276
+ function () {
277
+ if (objectURLRevoke) {
278
+ finallyHandler();
279
+ }
280
+ });
281
+ }
282
+ });
283
+ }
@@ -1,6 +1,4 @@
1
- import dhis from './dhis/index.js';
2
1
  import highcharts from './highcharts/index.js';
3
2
  export default {
4
- highcharts,
5
- dhis
3
+ highcharts
6
4
  };
@@ -1,8 +1,9 @@
1
1
  import arrayContains from 'd2-utilizr/lib/arrayContains';
2
2
  import arrayUnique from 'd2-utilizr/lib/arrayUnique';
3
- import { VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_PIE, VIS_TYPE_GAUGE, isTwoCategoryChartType } from '../../../../modules/visTypes.js';
3
+ import { VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_PIE, VIS_TYPE_GAUGE, isTwoCategoryChartType, VIS_TYPE_SINGLE_VALUE } from '../../../../modules/visTypes.js';
4
4
  import getGauge from './gauge.js';
5
5
  import getPie from './pie.js';
6
+ import getSingleValue from './singleValue.js';
6
7
  import getTwoCategory from './twoCategory.js';
7
8
  import getYearOnYear from './yearOnYear.js';
8
9
  const VALUE_ID = 'value';
@@ -63,6 +64,8 @@ function getSeriesFunction(type, categoryIds) {
63
64
  return getTwoCategory;
64
65
  }
65
66
  switch (type) {
67
+ case VIS_TYPE_SINGLE_VALUE:
68
+ return getSingleValue;
66
69
  case VIS_TYPE_PIE:
67
70
  return getPie;
68
71
  case VIS_TYPE_GAUGE:
@@ -0,0 +1,4 @@
1
+ export default function getSingleValue(acc, seriesIds, categoryIds, idValueMap) {
2
+ const seriesId = seriesIds[0][0];
3
+ acc.push(idValueMap.get(seriesId));
4
+ }
@@ -1,6 +1,4 @@
1
- import dhis_dhis from './dhis_dhis/index.js';
2
1
  import dhis_highcharts from './dhis_highcharts/index.js';
3
2
  export default {
4
- dhis_highcharts,
5
- dhis_dhis
3
+ dhis_highcharts
6
4
  };
@@ -0,0 +1,17 @@
1
+ export const shouldUseContrastColor = function () {
2
+ let inputColor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
3
+ // based on https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color
4
+ var color = inputColor.charAt(0) === '#' ? inputColor.substring(1, 7) : inputColor;
5
+ var r = parseInt(color.substring(0, 2), 16); // hexToR
6
+ var g = parseInt(color.substring(2, 4), 16); // hexToG
7
+ var b = parseInt(color.substring(4, 6), 16); // hexToB
8
+ var uicolors = [r / 255, g / 255, b / 255];
9
+ var c = uicolors.map(col => {
10
+ if (col <= 0.03928) {
11
+ return col / 12.92;
12
+ }
13
+ return Math.pow((col + 0.055) / 1.055, 2.4);
14
+ });
15
+ var L = 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];
16
+ return L <= 0.179;
17
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dhis2/analytics",
3
- "version": "26.8.7",
3
+ "version": "26.9.0",
4
4
  "main": "./build/cjs/index.js",
5
5
  "module": "./build/es/index.js",
6
6
  "exports": {
@@ -1,39 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.INDICATOR_FACTOR_100 = void 0;
7
- exports.default = _default;
8
- var _index = _interopRequireDefault(require("./subtitle/index.js"));
9
- var _index2 = _interopRequireDefault(require("./title/index.js"));
10
- var _index3 = _interopRequireDefault(require("./value/index.js"));
11
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
- const INDICATOR_FACTOR_100 = 100;
13
- exports.INDICATOR_FACTOR_100 = INDICATOR_FACTOR_100;
14
- function _default(_ref) {
15
- let {
16
- store,
17
- layout,
18
- extraOptions
19
- } = _ref;
20
- const data = store.generateData({
21
- type: layout.type,
22
- seriesId: layout.columns && layout.columns.length ? layout.columns[0].dimension : null,
23
- categoryId: layout.rows && layout.rows.length ? layout.rows[0].dimension : null
24
- });
25
- const metaData = store.data[0].metaData;
26
- const config = {
27
- value: data[0],
28
- formattedValue: data[0] === undefined ? extraOptions.noData.text : (0, _index3.default)(data[0], layout, metaData),
29
- title: (0, _index2.default)(layout, metaData, extraOptions.dashboard),
30
- subtitle: (0, _index.default)(layout, metaData, extraOptions.dashboard)
31
- };
32
- const indicatorType = metaData.items[metaData.dimensions.dx[0]].indicatorType;
33
-
34
- // Use % symbol for factor 100 and the full string for others
35
- if ((indicatorType === null || indicatorType === void 0 ? void 0 : indicatorType.factor) !== INDICATOR_FACTOR_100) {
36
- config.subText = indicatorType === null || indicatorType === void 0 ? void 0 : indicatorType.displayName;
37
- }
38
- return config;
39
- }
@@ -1,49 +0,0 @@
1
- "use strict";
2
-
3
- var _visTypes = require("../../../../../../modules/visTypes.js");
4
- var _index = _interopRequireDefault(require("../index.js"));
5
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
- jest.mock('../singleValue', () => () => 'The sv filter title');
7
- jest.mock('../../../../../util/getFilterText', () => () => 'The default filter text');
8
- describe('getSubtitle', () => {
9
- it('returns empty subtitle when flag hideSubtitle exists', () => {
10
- expect((0, _index.default)({
11
- hideSubtitle: true
12
- })).toEqual('');
13
- });
14
- it('returns the subtitle provided in the layout', () => {
15
- const subtitle = 'The subtitle was already set';
16
- expect((0, _index.default)({
17
- subtitle
18
- })).toEqual(subtitle);
19
- });
20
- it('returns subtitle for single value vis', () => {
21
- expect((0, _index.default)({
22
- type: _visTypes.VIS_TYPE_SINGLE_VALUE
23
- })).toEqual('The sv filter title');
24
- });
25
- describe('not dashboard', () => {
26
- describe('layout does not include title', () => {
27
- it('returns empty subtitle', () => {
28
- expect((0, _index.default)({
29
- filters: {}
30
- }, {}, false)).toEqual('');
31
- });
32
- });
33
- describe('layout includes title', () => {
34
- it('returns filter title as subtitle', () => {
35
- expect((0, _index.default)({
36
- filters: {},
37
- title: 'Chart title'
38
- }, {}, false)).toEqual('The default filter text');
39
- });
40
- });
41
- });
42
- describe('dashboard', () => {
43
- it('returns filter title as subtitle', () => {
44
- expect((0, _index.default)({
45
- filters: {}
46
- }, {}, true)).toEqual('The default filter text');
47
- });
48
- });
49
- });
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- var _singleValue = _interopRequireDefault(require("../singleValue.js"));
4
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
5
- jest.mock('../../../../../util/getFilterText', () => () => 'The filter text');
6
- describe('getSingleValueSubtitle', () => {
7
- it('returns null when layout does not have filters', () => {
8
- expect((0, _singleValue.default)({})).toEqual('');
9
- });
10
- it('returns the filter text', () => {
11
- expect((0, _singleValue.default)({
12
- filters: []
13
- })).toEqual('The filter text');
14
- });
15
- });
@@ -1,34 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _visTypes = require("../../../../../modules/visTypes.js");
8
- var _getFilterText = _interopRequireDefault(require("../../../../util/getFilterText.js"));
9
- var _singleValue = _interopRequireDefault(require("./singleValue.js"));
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
- function getDefault(layout, dashboard, metaData) {
12
- if (dashboard || typeof layout.title === 'string') {
13
- return (0, _getFilterText.default)(layout.filters, metaData);
14
- }
15
- return '';
16
- }
17
- function _default(layout, metaData, dashboard) {
18
- if (layout.hideSubtitle) {
19
- return '';
20
- }
21
- if (typeof layout.subtitle === 'string' && layout.subtitle.length) {
22
- return layout.subtitle;
23
- } else {
24
- let subtitle;
25
- switch (layout.type) {
26
- case _visTypes.VIS_TYPE_SINGLE_VALUE:
27
- subtitle = (0, _singleValue.default)(layout, metaData);
28
- break;
29
- default:
30
- subtitle = getDefault(layout, dashboard, metaData);
31
- }
32
- return subtitle;
33
- }
34
- }
@@ -1,11 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _getFilterText = _interopRequireDefault(require("../../../../util/getFilterText.js"));
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
- function _default(layout, metaData) {
10
- return layout.filters ? (0, _getFilterText.default)(layout.filters, metaData) : '';
11
- }
@@ -1,39 +0,0 @@
1
- "use strict";
2
-
3
- var _visTypes = require("../../../../../../modules/visTypes.js");
4
- var _index = _interopRequireDefault(require("../index.js"));
5
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
- jest.mock('../singleValue', () => () => 'The sv filter title');
7
- jest.mock('../../../../../util/getFilterText', () => () => 'The filter text');
8
- describe('getTitle', () => {
9
- it('returns empty title when flag hideTitle exists', () => {
10
- expect((0, _index.default)({
11
- hideTitle: true
12
- })).toEqual('');
13
- });
14
- it('returns the title provided in the layout', () => {
15
- const title = 'The title was already set';
16
- expect((0, _index.default)({
17
- title
18
- })).toEqual(title);
19
- });
20
- it('returns title for single value vis', () => {
21
- expect((0, _index.default)({
22
- type: _visTypes.VIS_TYPE_SINGLE_VALUE
23
- })).toEqual('The sv filter title');
24
- });
25
- describe('not dashboard', () => {
26
- it('returns filter text as title', () => {
27
- expect((0, _index.default)({
28
- filters: {}
29
- }, {}, false)).toEqual('The filter text');
30
- });
31
- });
32
- describe('dashboard', () => {
33
- it('returns empty string', () => {
34
- expect((0, _index.default)({
35
- filters: {}
36
- }, {}, true)).toEqual('');
37
- });
38
- });
39
- });
@@ -1,17 +0,0 @@
1
- "use strict";
2
-
3
- var _singleValue = _interopRequireDefault(require("../singleValue.js"));
4
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
5
- jest.mock('../../../../../util/getFilterText', () => () => 'The filter text');
6
- describe('getSingleValueTitle', () => {
7
- it('returns null when layout does not have columns', () => {
8
- expect((0, _singleValue.default)({})).toEqual('');
9
- });
10
- it('returns the filter text based on column items', () => {
11
- expect((0, _singleValue.default)({
12
- columns: [{
13
- items: [{}]
14
- }]
15
- })).toEqual('The filter text');
16
- });
17
- });
@@ -1,31 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _visTypes = require("../../../../../modules/visTypes.js");
8
- var _getFilterText = _interopRequireDefault(require("../../../../util/getFilterText.js"));
9
- var _singleValue = _interopRequireDefault(require("./singleValue.js"));
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
- function getDefault(layout, metaData, dashboard) {
12
- return layout.filters && !dashboard ? (0, _getFilterText.default)(layout.filters, metaData) : '';
13
- }
14
- function _default(layout, metaData, dashboard) {
15
- if (layout.hideTitle) {
16
- return '';
17
- }
18
- if (typeof layout.title === 'string' && layout.title.length) {
19
- return layout.title;
20
- } else {
21
- let title;
22
- switch (layout.type) {
23
- case _visTypes.VIS_TYPE_SINGLE_VALUE:
24
- title = (0, _singleValue.default)(layout, metaData);
25
- break;
26
- default:
27
- title = getDefault(layout, metaData, dashboard);
28
- }
29
- return title;
30
- }
31
- }
@@ -1,18 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _getFilterText = _interopRequireDefault(require("../../../../util/getFilterText.js"));
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
- function _default(layout, metaData) {
10
- if (layout.columns) {
11
- const firstItem = layout.columns[0].items[0];
12
- const column = Object.assign({}, layout.columns[0], {
13
- items: [firstItem]
14
- });
15
- return (0, _getFilterText.default)([column], metaData);
16
- }
17
- return '';
18
- }
@@ -1,19 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _visTypes = require("../../../../modules/visTypes.js");
8
- function _default(type) {
9
- switch (type) {
10
- case _visTypes.VIS_TYPE_SINGLE_VALUE:
11
- return {
12
- type: _visTypes.VIS_TYPE_SINGLE_VALUE
13
- };
14
- default:
15
- return {
16
- type: _visTypes.VIS_TYPE_SINGLE_VALUE
17
- };
18
- }
19
- }
@@ -1,39 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _type = _interopRequireDefault(require("./type.js"));
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
- const DEFAULT_CHART = {
10
- spacingTop: 20,
11
- style: {
12
- fontFamily: 'Roboto,Helvetica Neue,Helvetica,Arial,sans-serif'
13
- }
14
- };
15
- const DASHBOARD_CHART = {
16
- spacingTop: 0,
17
- spacingRight: 5,
18
- spacingBottom: 2,
19
- spacingLeft: 5
20
- };
21
- const getEvents = () => ({
22
- events: {
23
- load: function () {
24
- // Align legend icon with legend text
25
- this.legend.allItems.forEach(item => {
26
- if (item.legendSymbol) {
27
- item.legendSymbol.attr({
28
- translateY: -(item.legendItem.label.getBBox().height * 0.75 / 4) + item.legendSymbol.r / 2
29
- });
30
- }
31
- });
32
- }
33
- }
34
- });
35
- function _default(layout, el, dashboard) {
36
- return Object.assign({}, (0, _type.default)(layout.type), {
37
- renderTo: el || layout.el
38
- }, DEFAULT_CHART, dashboard ? DASHBOARD_CHART : undefined, getEvents());
39
- }