@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
@@ -5,10 +5,13 @@ import { getOutlierHelper } from '../../../../modules/outliers/index.js';
5
5
  import { isStacked, isLegendSetType, VIS_TYPE_SCATTER, VIS_TYPE_GAUGE, VIS_TYPE_LINE } from '../../../../modules/visTypes.js';
6
6
  import { defaultMultiAxisTheme1 } from '../../../util/colors/themes.js';
7
7
  import addTrendLines, { isRegressionIneligible } from './addTrendLines.js';
8
- import getChart from './chart.js';
8
+ import getChart from './chart/index.js';
9
+ import getCustomSVGOptions from './customSVGOptions/index.js';
10
+ import getExporting from './exporting.js';
9
11
  import getScatterData from './getScatterData.js';
10
12
  import getSortedConfig from './getSortedConfig.js';
11
13
  import getTrimmedConfig from './getTrimmedConfig.js';
14
+ import getLang from './lang.js';
12
15
  import getLegend from './legend.js';
13
16
  import { applyLegendSet, getLegendSetTooltip } from './legendSet.js';
14
17
  import getNoData from './noData.js';
@@ -58,11 +61,11 @@ export default function (_ref) {
58
61
  }
59
62
  let config = {
60
63
  // type etc
61
- chart: getChart(_layout, el, _extraOptions.dashboard),
64
+ chart: getChart(_layout, el, _extraOptions, series),
62
65
  // title
63
- title: getTitle(_layout, store.data[0].metaData, _extraOptions.dashboard),
66
+ title: getTitle(_layout, store.data[0].metaData, _extraOptions, series),
64
67
  // subtitle
65
- subtitle: getSubtitle(series, _layout, store.data[0].metaData, _extraOptions.dashboard),
68
+ subtitle: getSubtitle(series, _layout, store.data[0].metaData, _extraOptions),
66
69
  // x-axis
67
70
  xAxis: getXAxis(store, _layout, _extraOptions, series),
68
71
  // y-axis
@@ -87,20 +90,26 @@ export default function (_ref) {
87
90
  // pane
88
91
  pane: getPane(_layout.type),
89
92
  // no data + zoom
90
- lang: {
91
- noData: _extraOptions.noData.text,
92
- resetZoom: _extraOptions.resetZoom.text
93
- },
94
- noData: getNoData(),
93
+ lang: getLang(_layout.type, _extraOptions),
94
+ noData: getNoData(_layout.type),
95
95
  // credits
96
96
  credits: {
97
97
  enabled: false
98
98
  },
99
99
  // exporting
100
- exporting: {
101
- // disable exporting context menu
102
- enabled: false
103
- }
100
+ exporting: getExporting(_layout.type),
101
+ /* The config object passed to the Highcharts Chart constructor
102
+ * can contain arbitrary properties, which are made accessible
103
+ * under the Chart instance's `userOptions` member. This means
104
+ * that in event callback functions the custom SVG options are
105
+ * accessible as `this.userOptions.customSVGOptions` */
106
+ customSVGOptions: getCustomSVGOptions({
107
+ extraConfig,
108
+ layout: _layout,
109
+ extraOptions: _extraOptions,
110
+ metaData: store.data[0].metaData,
111
+ series
112
+ })
104
113
  };
105
114
 
106
115
  // get plot options for scatter
@@ -176,5 +185,6 @@ export default function (_ref) {
176
185
 
177
186
  // force apply extra config
178
187
  Object.assign(config, extraConfig);
188
+ console.log(objectClean(config));
179
189
  return objectClean(config);
180
190
  }
@@ -0,0 +1,11 @@
1
+ import { VIS_TYPE_SINGLE_VALUE } from '../../../../modules/visTypes.js';
2
+ export default function getLang(visType, extraOptions) {
3
+ return {
4
+ /* The SingleValue visualization consists of some custom SVG elements
5
+ * rendered on an empty chart. Since the chart is empty, there is never
6
+ * any data and Highcharts will show the noData text. To avoid this we
7
+ * clear the text here. */
8
+ noData: visType === VIS_TYPE_SINGLE_VALUE ? undefined : extraOptions.noData.text,
9
+ resetZoom: extraOptions.resetZoom.text
10
+ };
11
+ }
@@ -64,6 +64,6 @@ export default (_ref => {
64
64
  }
65
65
  } : {};
66
66
  default:
67
- return {};
67
+ return null;
68
68
  }
69
69
  });
@@ -2,7 +2,7 @@ import { colors } from '@dhis2/ui';
2
2
  import { hasCustomAxes } from '../../../../../modules/axis.js';
3
3
  import { axisHasRelativeItems } from '../../../../../modules/layout/axisHasRelativeItems.js';
4
4
  import { getLegendSetByDisplayStrategy } from '../../../../../modules/legends.js';
5
- import { VIS_TYPE_PIE, VIS_TYPE_GAUGE, isDualAxisType, isYearOverYear, VIS_TYPE_LINE, VIS_TYPE_SCATTER } from '../../../../../modules/visTypes.js';
5
+ import { VIS_TYPE_PIE, VIS_TYPE_GAUGE, isDualAxisType, isYearOverYear, VIS_TYPE_LINE, VIS_TYPE_SCATTER, VIS_TYPE_SINGLE_VALUE } from '../../../../../modules/visTypes.js';
6
6
  import { getAxisStringFromId } from '../../../../util/axisId.js';
7
7
  import { colorSets, COLOR_SET_PATTERNS } from '../../../../util/colors/colorSets.js';
8
8
  import { generateColors } from '../../../../util/colors/gradientColorGenerator.js';
@@ -153,6 +153,7 @@ function getDefault(_ref) {
153
153
  return series;
154
154
  }
155
155
  export default function (_ref2) {
156
+ var _series;
156
157
  let {
157
158
  series,
158
159
  metaData,
@@ -163,6 +164,9 @@ export default function (_ref2) {
163
164
  displayStrategy
164
165
  } = _ref2;
165
166
  switch (layout.type) {
167
+ case VIS_TYPE_SINGLE_VALUE:
168
+ series = [];
169
+ break;
166
170
  case VIS_TYPE_PIE:
167
171
  series = getPie(series, Object.values(getIdColorMap(series, layout, extraOptions)));
168
172
  break;
@@ -183,7 +187,7 @@ export default function (_ref2) {
183
187
  displayStrategy
184
188
  });
185
189
  }
186
- series.forEach(seriesObj => {
190
+ (_series = series) === null || _series === void 0 ? void 0 : _series.forEach(seriesObj => {
187
191
  // animation
188
192
  seriesObj.animation = {
189
193
  duration: getAnimation(extraOptions.animation, DEFAULT_ANIMATION_DURATION)
@@ -0,0 +1,59 @@
1
+ import getSingleValueSubtitle from '../singleValue.js';
2
+ jest.mock('../../../../../util/getFilterText', () => () => 'The default filter text');
3
+ describe('getSingleValueSubtitle', () => {
4
+ it('returns empty subtitle when flag hideSubtitle exists', () => {
5
+ expect(getSingleValueSubtitle({
6
+ hideSubtitle: true
7
+ })).toEqual('');
8
+ });
9
+ it('returns the subtitle provided in the layout', () => {
10
+ const subtitle = 'The subtitle was already set';
11
+ expect(getSingleValueSubtitle({
12
+ subtitle
13
+ })).toEqual(subtitle);
14
+ });
15
+ it('returns an empty string when layout does not have filters', () => {
16
+ expect(getSingleValueSubtitle({})).toEqual('');
17
+ });
18
+ it('returns the filter text', () => {
19
+ expect(getSingleValueSubtitle({
20
+ filters: []
21
+ })).toEqual('The default filter text');
22
+ });
23
+ describe('not dashboard', () => {
24
+ describe('layout does not include title', () => {
25
+ it('returns empty subtitle', () => {
26
+ expect(getSingleValueSubtitle({
27
+ filters: undefined
28
+ }, {}, false)).toEqual('');
29
+ });
30
+ });
31
+
32
+ /* All these tests have been moved and adjusted from here:
33
+ * src/visualizations/config/adapters/dhis_dhis/title/__tests__`
34
+ * The test below asserted the default subtitle behaviour, for
35
+ * visualization types other than SingleValue. It expected that
36
+ * the title was being used as subtitle. It fails now, and I
37
+ * believe that this behaviour does not make sense. So instead
38
+ * of fixing it, I disabled it. */
39
+ // describe('layout includes title', () => {
40
+ // it('returns filter title as subtitle', () => {
41
+ // expect(
42
+ // getSingleValueSubtitle(
43
+ // { filters: undefined, title: 'Chart title' },
44
+ // {},
45
+ // false
46
+ // )
47
+ // ).toEqual('The default filter text')
48
+ // })
49
+ // })
50
+ });
51
+
52
+ describe('dashboard', () => {
53
+ it('returns filter title as subtitle', () => {
54
+ expect(getSingleValueSubtitle({
55
+ filters: {}
56
+ }, {}, true)).toEqual('The default filter text');
57
+ });
58
+ });
59
+ });
@@ -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_SUBTITLE, mergeFontStyleWithDefault } from '../../../../../modules/fontStyle.js';
3
- import { VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, 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_SUBTITLE, mergeFontStyleWithDefault, defaultFontStyle } from '../../../../../modules/fontStyle.js';
3
+ import { VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, 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 getYearOverYearTitle from '../title/yearOverYear.js';
7
+ import getSingleValueSubtitle, { getSingleValueSubtitleColor } from './singleValue.js';
7
8
  const DASHBOARD_SUBTITLE = {
8
9
  style: {
9
10
  // DHIS2-578: dynamically truncate subtitle when it's taking more than 1 line
@@ -16,18 +17,33 @@ const DASHBOARD_SUBTITLE = {
16
17
  }
17
18
  };
18
19
  function getDefault(layout, dashboard, filterTitle) {
19
- return {
20
- text: dashboard || isString(layout.title) ? filterTitle : undefined
21
- };
20
+ return dashboard || isString(layout.title) ? filterTitle : undefined;
22
21
  }
23
- export default function (series, layout, metaData, dashboard) {
24
- const fontStyle = mergeFontStyleWithDefault(layout.fontStyle && layout.fontStyle[FONT_STYLE_VISUALIZATION_SUBTITLE], FONT_STYLE_VISUALIZATION_SUBTITLE);
25
- let subtitle = {
26
- text: undefined
27
- };
22
+ export default function (series, layout, metaData, extraOptions) {
28
23
  if (layout.hideSubtitle) {
29
24
  return null;
30
25
  }
26
+ const {
27
+ dashboard,
28
+ legendSets
29
+ } = extraOptions;
30
+ const legendOptions = layout.legend;
31
+ const fontStyle = mergeFontStyleWithDefault(layout.fontStyle && layout.fontStyle[FONT_STYLE_VISUALIZATION_SUBTITLE], FONT_STYLE_VISUALIZATION_SUBTITLE);
32
+ const subtitle = Object.assign({
33
+ text: undefined
34
+ }, dashboard ? DASHBOARD_SUBTITLE : {
35
+ align: getTextAlignOption(fontStyle[FONT_STYLE_OPTION_TEXT_ALIGN], FONT_STYLE_VISUALIZATION_SUBTITLE, isVerticalType(layout.type)),
36
+ style: {
37
+ // DHIS2-578: dynamically truncate subtitle when it's taking more than 1 line
38
+ color: undefined,
39
+ fontSize: `${fontStyle[FONT_STYLE_OPTION_FONT_SIZE]}px`,
40
+ fontWeight: fontStyle[FONT_STYLE_OPTION_BOLD] ? FONT_STYLE_OPTION_BOLD : 'normal',
41
+ fontStyle: fontStyle[FONT_STYLE_OPTION_ITALIC] ? FONT_STYLE_OPTION_ITALIC : 'normal',
42
+ whiteSpace: 'nowrap',
43
+ overflow: 'hidden',
44
+ textOverflow: 'ellipsis'
45
+ }
46
+ });
31
47
 
32
48
  // DHIS2-578: allow for optional custom subtitle
33
49
  const customSubtitle = layout.subtitle && layout.displaySubtitle || layout.subtitle;
@@ -36,6 +52,9 @@ export default function (series, layout, metaData, dashboard) {
36
52
  } else {
37
53
  const filterTitle = getFilterText(layout.filters, metaData);
38
54
  switch (layout.type) {
55
+ case VIS_TYPE_SINGLE_VALUE:
56
+ subtitle.text = getSingleValueSubtitle(layout, metaData);
57
+ break;
39
58
  case VIS_TYPE_YEAR_OVER_YEAR_LINE:
40
59
  case VIS_TYPE_YEAR_OVER_YEAR_COLUMN:
41
60
  subtitle.text = getYearOverYearTitle(layout, metaData, Boolean(!dashboard));
@@ -44,20 +63,33 @@ export default function (series, layout, metaData, dashboard) {
44
63
  subtitle.text = filterTitle;
45
64
  break;
46
65
  default:
47
- subtitle = getDefault(layout, dashboard, filterTitle);
66
+ subtitle.text = getDefault(layout, dashboard, filterTitle);
48
67
  }
49
68
  }
50
- return subtitle ? Object.assign({}, dashboard ? DASHBOARD_SUBTITLE : {
51
- align: getTextAlignOption(fontStyle[FONT_STYLE_OPTION_TEXT_ALIGN], FONT_STYLE_VISUALIZATION_SUBTITLE, isVerticalType(layout.type)),
52
- style: {
53
- // DHIS2-578: dynamically truncate subtitle when it's taking more than 1 line
54
- color: fontStyle[FONT_STYLE_OPTION_TEXT_COLOR],
55
- fontSize: `${fontStyle[FONT_STYLE_OPTION_FONT_SIZE]}px`,
56
- fontWeight: fontStyle[FONT_STYLE_OPTION_BOLD] ? FONT_STYLE_OPTION_BOLD : 'normal',
57
- fontStyle: fontStyle[FONT_STYLE_OPTION_ITALIC] ? FONT_STYLE_OPTION_ITALIC : 'normal',
58
- whiteSpace: 'nowrap',
59
- overflow: 'hidden',
60
- textOverflow: 'ellipsis'
61
- }
62
- }, subtitle) : subtitle;
69
+ switch (layout.type) {
70
+ case VIS_TYPE_SINGLE_VALUE:
71
+ {
72
+ var _defaultFontStyle$FON, _layout$fontStyle, _layout$fontStyle$FON;
73
+ const defaultColor = defaultFontStyle === null || defaultFontStyle === void 0 ? void 0 : (_defaultFontStyle$FON = defaultFontStyle[FONT_STYLE_VISUALIZATION_SUBTITLE]) === null || _defaultFontStyle$FON === void 0 ? void 0 : _defaultFontStyle$FON[FONT_STYLE_OPTION_TEXT_COLOR];
74
+ 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_SUBTITLE]) === null || _layout$fontStyle$FON === void 0 ? void 0 : _layout$fontStyle$FON[FONT_STYLE_OPTION_TEXT_COLOR];
75
+ subtitle.style.color = getSingleValueSubtitleColor(customColor, defaultColor, series[0], legendOptions, legendSets);
76
+ if (dashboard) {
77
+ // Single value subtitle text should be multiline
78
+ /* TODO: The default color of the subtitle now is #4a5768 but the
79
+ * original implementation used #666, which is a lighter grey.
80
+ * If we want to keep this color, changes are needed here. */
81
+ Object.assign(subtitle.style, {
82
+ wordWrap: 'normal',
83
+ whiteSpace: 'normal',
84
+ overflow: 'visible',
85
+ textOverflow: 'initial'
86
+ });
87
+ }
88
+ }
89
+ break;
90
+ default:
91
+ subtitle.style.color = fontStyle[FONT_STYLE_OPTION_TEXT_COLOR];
92
+ break;
93
+ }
94
+ return subtitle;
63
95
  }
@@ -0,0 +1,14 @@
1
+ import getFilterText from '../../../../util/getFilterText.js';
2
+ export { getSingleValueTitleColor as getSingleValueSubtitleColor } from '../customSVGOptions/singleValue/getSingleValueTitleColor.js';
3
+ export default function getSingleValueSubtitle(layout, metaData) {
4
+ if (layout.hideSubtitle || 1 === 0) {
5
+ return '';
6
+ }
7
+ if (typeof layout.subtitle === 'string' && layout.subtitle.length) {
8
+ return layout.subtitle;
9
+ }
10
+ if (layout.filters) {
11
+ return getFilterText(layout.filters, metaData);
12
+ }
13
+ return '';
14
+ }
@@ -0,0 +1,42 @@
1
+ import { getSingleValueTitleText } from '../singleValue.js';
2
+ jest.mock('../../../../../util/getFilterText', () => () => 'The filter text');
3
+ describe('getSingleValueTitle', () => {
4
+ it('returns empty title when flag hideTitle exists', () => {
5
+ expect(getSingleValueTitleText({
6
+ hideTitle: true
7
+ })).toEqual('');
8
+ });
9
+ it('returns the title provided in the layout', () => {
10
+ const title = 'The title was already set';
11
+ expect(getSingleValueTitleText({
12
+ title
13
+ })).toEqual(title);
14
+ });
15
+ it('returns null when layout does not have columns', () => {
16
+ expect(getSingleValueTitleText({})).toEqual('');
17
+ });
18
+ it('returns the filter text based on column items', () => {
19
+ expect(getSingleValueTitleText({
20
+ columns: [{
21
+ items: [{}]
22
+ }]
23
+ })).toEqual('The filter text');
24
+ });
25
+ describe('not dashboard', () => {
26
+ it('returns filter text as title', () => {
27
+ expect(getSingleValueTitleText({
28
+ columns: [{
29
+ items: [{}]
30
+ }],
31
+ filters: []
32
+ }, {}, false)).toEqual('The filter text');
33
+ });
34
+ });
35
+ describe('dashboard', () => {
36
+ it('returns empty string', () => {
37
+ expect(getSingleValueTitleText({
38
+ filters: {}
39
+ }, {}, true)).toEqual('');
40
+ });
41
+ });
42
+ });
@@ -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
+ }