@dhis2/analytics 26.8.6 → 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 (139) hide show
  1. package/build/cjs/__demo__/SingleValue.stories.js +706 -0
  2. package/build/cjs/components/PivotTable/PivotTableValueCell.js +6 -2
  3. package/build/cjs/components/PivotTable/styles/PivotTable.style.js +2 -2
  4. package/build/cjs/locales/en/translations.json +2 -0
  5. package/build/cjs/locales/lo/translations.json +16 -12
  6. package/build/cjs/modules/pivotTable/PivotTableEngine.js +59 -24
  7. package/build/cjs/modules/pivotTable/pivotTableConstants.js +6 -2
  8. package/build/cjs/modules/valueTypes.js +4 -1
  9. package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart/default.js +26 -0
  10. package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart/index.js +18 -0
  11. package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart/singleValue.js +19 -0
  12. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/index.js +36 -0
  13. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueBackgroundColor.js +12 -0
  14. package/build/cjs/visualizations/config/adapters/{dhis_dhis/value/index.js → dhis_highcharts/customSVGOptions/singleValue/getSingleValueFormattedValue.js} +8 -6
  15. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueLegendColor.js +11 -0
  16. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueSubtext.js +11 -0
  17. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTextColor.js +20 -0
  18. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTitleColor.js +26 -0
  19. package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/index.js +31 -0
  20. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/index.js +24 -0
  21. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/index.js +18 -0
  22. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/addIconElement.js +34 -0
  23. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/checkIfFitsWithinContainer.js +19 -0
  24. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeLayoutRect.js +39 -0
  25. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeSpacingTop.js +21 -0
  26. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/constants.js +11 -0
  27. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/getAvailableSpace.js +14 -0
  28. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/index.js +48 -0
  29. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/positionElements.js +46 -0
  30. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/styles.js +109 -0
  31. package/build/cjs/visualizations/config/adapters/dhis_highcharts/exporting.js +30 -0
  32. package/build/cjs/visualizations/config/adapters/dhis_highcharts/index.js +33 -23
  33. package/build/cjs/visualizations/config/adapters/dhis_highcharts/lang.js +17 -0
  34. package/build/cjs/visualizations/config/adapters/dhis_highcharts/plotOptions.js +1 -1
  35. package/build/cjs/visualizations/config/adapters/dhis_highcharts/series/index.js +5 -1
  36. package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/__tests__/singleValue.spec.js +62 -0
  37. package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +56 -22
  38. package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/singleValue.js +27 -0
  39. package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/__tests__/singleValue.spec.js +44 -0
  40. package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/index.js +50 -22
  41. package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/singleValue.js +31 -0
  42. package/build/cjs/visualizations/config/adapters/dhis_highcharts/type.js +2 -0
  43. package/build/cjs/visualizations/config/adapters/dhis_highcharts/xAxis/index.js +1 -0
  44. package/build/cjs/visualizations/config/adapters/dhis_highcharts/yAxis/index.js +4 -5
  45. package/build/cjs/visualizations/config/adapters/index.js +2 -4
  46. package/build/cjs/visualizations/config/generators/highcharts/index.js +8 -0
  47. package/build/cjs/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/index.js +13 -0
  48. package/build/cjs/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/nonASCIIFont.js +17 -0
  49. package/build/cjs/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/textShadow.js +289 -0
  50. package/build/cjs/visualizations/config/generators/index.js +2 -4
  51. package/build/cjs/visualizations/store/adapters/dhis_highcharts/index.js +3 -0
  52. package/build/cjs/visualizations/store/adapters/dhis_highcharts/singleValue.js +10 -0
  53. package/build/cjs/visualizations/store/adapters/index.js +2 -4
  54. package/build/cjs/visualizations/util/shouldUseContrastColor.js +24 -0
  55. package/build/es/__demo__/SingleValue.stories.js +702 -0
  56. package/build/es/components/PivotTable/PivotTableValueCell.js +6 -2
  57. package/build/es/components/PivotTable/styles/PivotTable.style.js +2 -2
  58. package/build/es/locales/en/translations.json +2 -0
  59. package/build/es/locales/lo/translations.json +16 -12
  60. package/build/es/modules/pivotTable/PivotTableEngine.js +61 -26
  61. package/build/es/modules/pivotTable/pivotTableConstants.js +4 -1
  62. package/build/es/modules/valueTypes.js +2 -0
  63. package/build/es/visualizations/config/adapters/dhis_highcharts/chart/default.js +19 -0
  64. package/build/es/visualizations/config/adapters/dhis_highcharts/chart/index.js +11 -0
  65. package/build/es/visualizations/config/adapters/dhis_highcharts/chart/singleValue.js +12 -0
  66. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/index.js +29 -0
  67. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueBackgroundColor.js +6 -0
  68. package/build/es/visualizations/config/adapters/{dhis_dhis/value/index.js → dhis_highcharts/customSVGOptions/singleValue/getSingleValueFormattedValue.js} +4 -4
  69. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueLegendColor.js +5 -0
  70. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueSubtext.js +5 -0
  71. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTextColor.js +14 -0
  72. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTitleColor.js +20 -0
  73. package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/index.js +25 -0
  74. package/build/es/visualizations/config/adapters/dhis_highcharts/events/index.js +16 -0
  75. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/index.js +11 -0
  76. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/addIconElement.js +28 -0
  77. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/checkIfFitsWithinContainer.js +13 -0
  78. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeLayoutRect.js +33 -0
  79. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeSpacingTop.js +15 -0
  80. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/constants.js +4 -0
  81. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/getAvailableSpace.js +8 -0
  82. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/index.js +42 -0
  83. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/positionElements.js +40 -0
  84. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/styles.js +101 -0
  85. package/build/es/visualizations/config/adapters/dhis_highcharts/exporting.js +23 -0
  86. package/build/es/visualizations/config/adapters/dhis_highcharts/index.js +23 -13
  87. package/build/es/visualizations/config/adapters/dhis_highcharts/lang.js +11 -0
  88. package/build/es/visualizations/config/adapters/dhis_highcharts/plotOptions.js +1 -1
  89. package/build/es/visualizations/config/adapters/dhis_highcharts/series/index.js +6 -2
  90. package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/__tests__/singleValue.spec.js +59 -0
  91. package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +56 -24
  92. package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/singleValue.js +14 -0
  93. package/build/es/visualizations/config/adapters/dhis_highcharts/title/__tests__/singleValue.spec.js +42 -0
  94. package/build/es/visualizations/config/adapters/dhis_highcharts/title/index.js +52 -24
  95. package/build/es/visualizations/config/adapters/dhis_highcharts/title/singleValue.js +18 -0
  96. package/build/es/visualizations/config/adapters/dhis_highcharts/type.js +3 -1
  97. package/build/es/visualizations/config/adapters/dhis_highcharts/xAxis/index.js +2 -1
  98. package/build/es/visualizations/config/adapters/dhis_highcharts/yAxis/index.js +5 -6
  99. package/build/es/visualizations/config/adapters/index.js +1 -3
  100. package/build/es/visualizations/config/generators/highcharts/index.js +8 -0
  101. package/build/es/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/index.js +6 -0
  102. package/build/es/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/nonASCIIFont.js +11 -0
  103. package/build/es/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/textShadow.js +283 -0
  104. package/build/es/visualizations/config/generators/index.js +1 -3
  105. package/build/es/visualizations/store/adapters/dhis_highcharts/index.js +4 -1
  106. package/build/es/visualizations/store/adapters/dhis_highcharts/singleValue.js +4 -0
  107. package/build/es/visualizations/store/adapters/index.js +1 -3
  108. package/build/es/visualizations/util/shouldUseContrastColor.js +17 -0
  109. package/package.json +1 -2
  110. package/build/cjs/visualizations/config/adapters/dhis_dhis/index.js +0 -39
  111. package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/index.spec.js +0 -49
  112. package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/singleValue.spec.js +0 -15
  113. package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/index.js +0 -34
  114. package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/singleValue.js +0 -11
  115. package/build/cjs/visualizations/config/adapters/dhis_dhis/title/__tests__/index.spec.js +0 -39
  116. package/build/cjs/visualizations/config/adapters/dhis_dhis/title/__tests__/singleValue.spec.js +0 -17
  117. package/build/cjs/visualizations/config/adapters/dhis_dhis/title/index.js +0 -31
  118. package/build/cjs/visualizations/config/adapters/dhis_dhis/title/singleValue.js +0 -18
  119. package/build/cjs/visualizations/config/adapters/dhis_dhis/type.js +0 -19
  120. package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart.js +0 -39
  121. package/build/cjs/visualizations/config/generators/dhis/index.js +0 -28
  122. package/build/cjs/visualizations/config/generators/dhis/singleValue.js +0 -359
  123. package/build/cjs/visualizations/store/adapters/dhis_dhis/index.js +0 -83
  124. package/build/cjs/visualizations/store/adapters/dhis_dhis/singleValue.js +0 -10
  125. package/build/es/visualizations/config/adapters/dhis_dhis/index.js +0 -30
  126. package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/index.spec.js +0 -46
  127. package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/singleValue.spec.js +0 -12
  128. package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/index.js +0 -27
  129. package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/singleValue.js +0 -4
  130. package/build/es/visualizations/config/adapters/dhis_dhis/title/__tests__/index.spec.js +0 -36
  131. package/build/es/visualizations/config/adapters/dhis_dhis/title/__tests__/singleValue.spec.js +0 -14
  132. package/build/es/visualizations/config/adapters/dhis_dhis/title/index.js +0 -24
  133. package/build/es/visualizations/config/adapters/dhis_dhis/title/singleValue.js +0 -11
  134. package/build/es/visualizations/config/adapters/dhis_dhis/type.js +0 -13
  135. package/build/es/visualizations/config/adapters/dhis_highcharts/chart.js +0 -32
  136. package/build/es/visualizations/config/generators/dhis/index.js +0 -21
  137. package/build/es/visualizations/config/generators/dhis/singleValue.js +0 -353
  138. package/build/es/visualizations/store/adapters/dhis_dhis/index.js +0 -76
  139. package/build/es/visualizations/store/adapters/dhis_dhis/singleValue.js +0 -4
@@ -1,9 +1,10 @@
1
1
  import isString from 'd2-utilizr/lib/isString';
2
- import { FONT_STYLE_OPTION_ITALIC, FONT_STYLE_OPTION_BOLD, FONT_STYLE_OPTION_TEXT_COLOR, FONT_STYLE_OPTION_FONT_SIZE, FONT_STYLE_OPTION_TEXT_ALIGN, FONT_STYLE_VISUALIZATION_TITLE, mergeFontStyleWithDefault } from '../../../../../modules/fontStyle.js';
3
- import { VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_GAUGE, isVerticalType, VIS_TYPE_SCATTER } from '../../../../../modules/visTypes.js';
2
+ import { FONT_STYLE_OPTION_ITALIC, FONT_STYLE_OPTION_BOLD, FONT_STYLE_OPTION_TEXT_COLOR, FONT_STYLE_OPTION_FONT_SIZE, FONT_STYLE_OPTION_TEXT_ALIGN, FONT_STYLE_VISUALIZATION_TITLE, mergeFontStyleWithDefault, defaultFontStyle } from '../../../../../modules/fontStyle.js';
3
+ import { VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_GAUGE, isVerticalType, VIS_TYPE_SCATTER, VIS_TYPE_SINGLE_VALUE } from '../../../../../modules/visTypes.js';
4
4
  import getFilterText from '../../../../util/getFilterText.js';
5
5
  import { getTextAlignOption } from '../getTextAlignOption.js';
6
6
  import getScatterTitle from './scatter.js';
7
+ import { getSingleValueTitleColor, getSingleValueTitleText } from './singleValue.js';
7
8
  import getYearOverYearTitle from './yearOverYear.js';
8
9
  const DASHBOARD_TITLE_STYLE = {
9
10
  margin: 15,
@@ -23,19 +24,41 @@ function getDefault(layout, metaData, dashboard) {
23
24
  }
24
25
  return null;
25
26
  }
26
- export default function (layout, metaData, dashboard) {
27
- const fontStyle = mergeFontStyleWithDefault(layout.fontStyle && layout.fontStyle[FONT_STYLE_VISUALIZATION_TITLE], FONT_STYLE_VISUALIZATION_TITLE);
28
- const title = {
29
- text: undefined
30
- };
27
+ export default function (layout, metaData, extraOptions, series) {
31
28
  if (layout.hideTitle) {
32
- return title;
29
+ return {
30
+ text: undefined
31
+ };
33
32
  }
34
- const customTitle = layout.title && layout.displayTitle || layout.title;
35
- if (isString(customTitle) && customTitle.length) {
36
- title.text = customTitle;
33
+ const {
34
+ dashboard,
35
+ legendSets
36
+ } = extraOptions;
37
+ const legendOptions = layout.legend;
38
+ const fontStyle = mergeFontStyleWithDefault(layout.fontStyle && layout.fontStyle[FONT_STYLE_VISUALIZATION_TITLE], FONT_STYLE_VISUALIZATION_TITLE);
39
+ const title = Object.assign({
40
+ text: undefined
41
+ }, dashboard ? DASHBOARD_TITLE_STYLE : {
42
+ margin: 30,
43
+ align: getTextAlignOption(fontStyle[FONT_STYLE_OPTION_TEXT_ALIGN], FONT_STYLE_VISUALIZATION_TITLE, isVerticalType(layout.type)),
44
+ style: {
45
+ color: undefined,
46
+ fontSize: `${fontStyle[FONT_STYLE_OPTION_FONT_SIZE]}px`,
47
+ fontWeight: fontStyle[FONT_STYLE_OPTION_BOLD] ? FONT_STYLE_OPTION_BOLD : 'normal',
48
+ fontStyle: fontStyle[FONT_STYLE_OPTION_ITALIC] ? FONT_STYLE_OPTION_ITALIC : 'normal',
49
+ whiteSpace: 'nowrap',
50
+ overflow: 'hidden',
51
+ textOverflow: 'ellipsis'
52
+ }
53
+ });
54
+ const customTitleText = layout.title && layout.displayTitle || layout.title;
55
+ if (isString(customTitleText) && customTitleText.length) {
56
+ title.text = customTitleText;
37
57
  } else {
38
58
  switch (layout.type) {
59
+ case VIS_TYPE_SINGLE_VALUE:
60
+ title.text = getSingleValueTitleText(layout, metaData, dashboard);
61
+ break;
39
62
  case VIS_TYPE_GAUGE:
40
63
  case VIS_TYPE_YEAR_OVER_YEAR_LINE:
41
64
  case VIS_TYPE_YEAR_OVER_YEAR_COLUMN:
@@ -49,17 +72,22 @@ export default function (layout, metaData, dashboard) {
49
72
  break;
50
73
  }
51
74
  }
52
- return Object.assign({}, dashboard ? DASHBOARD_TITLE_STYLE : {
53
- margin: 30,
54
- align: getTextAlignOption(fontStyle[FONT_STYLE_OPTION_TEXT_ALIGN], FONT_STYLE_VISUALIZATION_TITLE, isVerticalType(layout.type)),
55
- style: {
56
- color: fontStyle[FONT_STYLE_OPTION_TEXT_COLOR],
57
- fontSize: `${fontStyle[FONT_STYLE_OPTION_FONT_SIZE]}px`,
58
- fontWeight: fontStyle[FONT_STYLE_OPTION_BOLD] ? FONT_STYLE_OPTION_BOLD : 'normal',
59
- fontStyle: fontStyle[FONT_STYLE_OPTION_ITALIC] ? FONT_STYLE_OPTION_ITALIC : 'normal',
60
- whiteSpace: 'nowrap',
61
- overflow: 'hidden',
62
- textOverflow: 'ellipsis'
63
- }
64
- }, title);
75
+ switch (layout.type) {
76
+ case VIS_TYPE_SINGLE_VALUE:
77
+ {
78
+ var _defaultFontStyle$FON, _layout$fontStyle, _layout$fontStyle$FON;
79
+ const defaultColor = defaultFontStyle === null || defaultFontStyle === void 0 ? void 0 : (_defaultFontStyle$FON = defaultFontStyle[FONT_STYLE_VISUALIZATION_TITLE]) === null || _defaultFontStyle$FON === void 0 ? void 0 : _defaultFontStyle$FON[FONT_STYLE_OPTION_TEXT_COLOR];
80
+ const customColor = layout === null || layout === void 0 ? void 0 : (_layout$fontStyle = layout.fontStyle) === null || _layout$fontStyle === void 0 ? void 0 : (_layout$fontStyle$FON = _layout$fontStyle[FONT_STYLE_VISUALIZATION_TITLE]) === null || _layout$fontStyle$FON === void 0 ? void 0 : _layout$fontStyle$FON[FONT_STYLE_OPTION_TEXT_COLOR];
81
+ title.style.color = getSingleValueTitleColor(customColor, defaultColor, series[0], legendOptions, legendSets);
82
+ if (dashboard) {
83
+ // TODO: is this always what we want?
84
+ title.style.fontWeight = 'normal';
85
+ }
86
+ }
87
+ break;
88
+ default:
89
+ title.style.color = fontStyle[FONT_STYLE_OPTION_TEXT_COLOR];
90
+ break;
91
+ }
92
+ return title;
65
93
  }
@@ -0,0 +1,18 @@
1
+ import getFilterText from '../../../../util/getFilterText.js';
2
+ export { getSingleValueTitleColor } from '../customSVGOptions/singleValue/getSingleValueTitleColor.js';
3
+ export function getSingleValueTitleText(layout, metaData) {
4
+ if (layout.hideTitle) {
5
+ return '';
6
+ }
7
+ if (typeof layout.title === 'string' && layout.title.length) {
8
+ return layout.title;
9
+ }
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 getFilterText([column], metaData);
16
+ }
17
+ return '';
18
+ }
@@ -1,4 +1,4 @@
1
- import { VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_SCATTER } from '../../../../modules/visTypes.js';
1
+ import { VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_SCATTER, VIS_TYPE_SINGLE_VALUE } from '../../../../modules/visTypes.js';
2
2
  export default function (type) {
3
3
  switch (type) {
4
4
  case VIS_TYPE_BAR:
@@ -34,6 +34,8 @@ export default function (type) {
34
34
  type: 'scatter',
35
35
  zoomType: 'xy'
36
36
  };
37
+ case VIS_TYPE_SINGLE_VALUE:
38
+ return {};
37
39
  case VIS_TYPE_COLUMN:
38
40
  case VIS_TYPE_STACKED_COLUMN:
39
41
  case VIS_TYPE_YEAR_OVER_YEAR_COLUMN:
@@ -1,6 +1,6 @@
1
1
  import objectClean from 'd2-utilizr/lib/objectClean';
2
2
  import { FONT_STYLE_HORIZONTAL_AXIS_TITLE, FONT_STYLE_AXIS_LABELS, FONT_STYLE_OPTION_TEXT_COLOR, FONT_STYLE_OPTION_FONT_SIZE, FONT_STYLE_OPTION_BOLD, FONT_STYLE_OPTION_ITALIC, mergeFontStyleWithDefault } from '../../../../../modules/fontStyle.js';
3
- import { VIS_TYPE_GAUGE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_SCATTER, isTwoCategoryChartType } from '../../../../../modules/visTypes.js';
3
+ import { VIS_TYPE_GAUGE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_SCATTER, isTwoCategoryChartType, VIS_TYPE_SINGLE_VALUE } from '../../../../../modules/visTypes.js';
4
4
  import { getAxis } from '../../../../util/axes.js';
5
5
  import getAxisTitle from '../getAxisTitle.js';
6
6
  import getCategories from '../getCategories.js';
@@ -44,6 +44,7 @@ export default function (store, layout, extraOptions, series) {
44
44
  switch (layout.type) {
45
45
  case VIS_TYPE_PIE:
46
46
  case VIS_TYPE_GAUGE:
47
+ case VIS_TYPE_SINGLE_VALUE:
47
48
  xAxis = noAxis();
48
49
  break;
49
50
  case VIS_TYPE_YEAR_OVER_YEAR_LINE:
@@ -2,7 +2,7 @@ import arrayClean from 'd2-utilizr/lib/arrayClean';
2
2
  import objectClean from 'd2-utilizr/lib/objectClean';
3
3
  import i18n from '../../../../../locales/index.js';
4
4
  import { FONT_STYLE_VERTICAL_AXIS_TITLE, mergeFontStyleWithDefault, TEXT_ALIGN_RIGHT } from '../../../../../modules/fontStyle.js';
5
- import { isDualAxisType, isStacked, VIS_TYPE_GAUGE, VIS_TYPE_SCATTER } from '../../../../../modules/visTypes.js';
5
+ import { isDualAxisType, isStacked, VIS_TYPE_GAUGE, VIS_TYPE_SCATTER, VIS_TYPE_SINGLE_VALUE } from '../../../../../modules/visTypes.js';
6
6
  import { getAxis } from '../../../../util/axes.js';
7
7
  import { getAxisStringFromId } from '../../../../util/axisId.js';
8
8
  import { getGridLineColor, getLabels, getMaxValue, getMinValue, getRegressionLine } from '../axis.js';
@@ -100,13 +100,12 @@ function getDefault(layout, series, extraOptions) {
100
100
  return axes;
101
101
  }
102
102
  export default function (layout, series, extraOptions) {
103
- let yAxis;
104
103
  switch (layout.type) {
104
+ case VIS_TYPE_SINGLE_VALUE:
105
+ return null;
105
106
  case VIS_TYPE_GAUGE:
106
- yAxis = getGauge(layout, series, extraOptions.legendSets[0]);
107
- break;
107
+ return getGauge(layout, series, extraOptions.legendSets[0]);
108
108
  default:
109
- yAxis = getDefault(layout, series, extraOptions);
109
+ return getDefault(layout, series, extraOptions);
110
110
  }
111
- return yAxis;
112
111
  }
@@ -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
  };
@@ -3,16 +3,24 @@ import HM from 'highcharts/highcharts-more';
3
3
  import HB from 'highcharts/modules/boost';
4
4
  import HE from 'highcharts/modules/exporting';
5
5
  import HNDTD from 'highcharts/modules/no-data-to-display';
6
+ import HOE from 'highcharts/modules/offline-exporting';
6
7
  import HPF from 'highcharts/modules/pattern-fill';
7
8
  import HSG from 'highcharts/modules/solid-gauge';
9
+ import PEBFP from './pdfExportBugFixPlugin/index.js';
8
10
 
9
11
  // apply
10
12
  HM(H);
11
13
  HSG(H);
12
14
  HNDTD(H);
13
15
  HE(H);
16
+ HOE(H);
14
17
  HPF(H);
15
18
  HB(H);
19
+ PEBFP(H);
20
+
21
+ /* Whitelist some additional SVG attributes here. Without this,
22
+ * the PDF export for the SingleValue visualization breaks. */
23
+ H.AST.allowedAttributes.push('fill-rule', 'clip-rule');
16
24
  function drawLegendSymbolWrap() {
17
25
  const pick = H.pick;
18
26
  H.wrap(H.seriesTypes.column.prototype, 'drawLegendSymbol', function (proceed, legend, item) {
@@ -0,0 +1,6 @@
1
+ import nonASCIIFontBugfix from './nonASCIIFont.js';
2
+ import textShadowBugFix from './textShadow.js';
3
+ export default function (H) {
4
+ textShadowBugFix(H);
5
+ nonASCIIFontBugfix(H);
6
+ }
@@ -0,0 +1,11 @@
1
+ /* This is a workaround for https://github.com/highcharts/highcharts/issues/22008
2
+ * We add some transparent text in a non-ASCII script to the chart to prevent
3
+ * the chart from being exported in a serif font */
4
+
5
+ export default function (H) {
6
+ H.addEvent(H.Chart, 'load', function () {
7
+ this.renderer.text('모', 20, 20).attr({
8
+ opacity: 0
9
+ }).add();
10
+ });
11
+ }
@@ -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.6",
3
+ "version": "26.9.0",
4
4
  "main": "./build/cjs/index.js",
5
5
  "module": "./build/es/index.js",
6
6
  "exports": {
@@ -20,7 +20,6 @@
20
20
  },
21
21
  "scripts": {
22
22
  "build": "d2-app-scripts build",
23
- "postbuild": "yarn build-storybook",
24
23
  "build-storybook": "build-storybook",
25
24
  "start-storybook": "start-storybook --port 5000",
26
25
  "start": "yarn start-storybook",
@@ -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
- }