@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.
- package/build/cjs/__demo__/SingleValue.stories.js +706 -0
- package/build/cjs/locales/lo/translations.json +16 -12
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart/default.js +26 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart/index.js +18 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart/singleValue.js +19 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/index.js +36 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueBackgroundColor.js +12 -0
- package/build/cjs/visualizations/config/adapters/{dhis_dhis/value/index.js → dhis_highcharts/customSVGOptions/singleValue/getSingleValueFormattedValue.js} +8 -6
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueLegendColor.js +11 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueSubtext.js +11 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTextColor.js +20 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTitleColor.js +26 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/index.js +31 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/index.js +24 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/index.js +18 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/addIconElement.js +34 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/checkIfFitsWithinContainer.js +19 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeLayoutRect.js +39 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeSpacingTop.js +21 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/constants.js +11 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/getAvailableSpace.js +14 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/index.js +48 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/positionElements.js +46 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/styles.js +109 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/exporting.js +30 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/index.js +33 -23
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/lang.js +17 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/plotOptions.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/series/index.js +5 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/__tests__/singleValue.spec.js +62 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +56 -22
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/singleValue.js +27 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/__tests__/singleValue.spec.js +44 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/index.js +50 -22
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/singleValue.js +31 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/type.js +2 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/xAxis/index.js +1 -0
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/yAxis/index.js +4 -5
- package/build/cjs/visualizations/config/adapters/index.js +2 -4
- package/build/cjs/visualizations/config/generators/highcharts/index.js +8 -0
- package/build/cjs/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/index.js +13 -0
- package/build/cjs/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/nonASCIIFont.js +17 -0
- package/build/cjs/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/textShadow.js +289 -0
- package/build/cjs/visualizations/config/generators/index.js +2 -4
- package/build/cjs/visualizations/store/adapters/dhis_highcharts/index.js +3 -0
- package/build/cjs/visualizations/store/adapters/dhis_highcharts/singleValue.js +10 -0
- package/build/cjs/visualizations/store/adapters/index.js +2 -4
- package/build/cjs/visualizations/util/shouldUseContrastColor.js +24 -0
- package/build/es/__demo__/SingleValue.stories.js +702 -0
- package/build/es/locales/lo/translations.json +16 -12
- package/build/es/visualizations/config/adapters/dhis_highcharts/chart/default.js +19 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/chart/index.js +11 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/chart/singleValue.js +12 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/index.js +29 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueBackgroundColor.js +6 -0
- package/build/es/visualizations/config/adapters/{dhis_dhis/value/index.js → dhis_highcharts/customSVGOptions/singleValue/getSingleValueFormattedValue.js} +4 -4
- package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueLegendColor.js +5 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueSubtext.js +5 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTextColor.js +14 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/getSingleValueTitleColor.js +20 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/customSVGOptions/singleValue/index.js +25 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/index.js +16 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/index.js +11 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/addIconElement.js +28 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/checkIfFitsWithinContainer.js +13 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeLayoutRect.js +33 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/computeSpacingTop.js +15 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/constants.js +4 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/getAvailableSpace.js +8 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/index.js +42 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/positionElements.js +40 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/styles.js +101 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/exporting.js +23 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/index.js +23 -13
- package/build/es/visualizations/config/adapters/dhis_highcharts/lang.js +11 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/plotOptions.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/series/index.js +6 -2
- package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/__tests__/singleValue.spec.js +59 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +56 -24
- package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/singleValue.js +14 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/title/__tests__/singleValue.spec.js +42 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/title/index.js +52 -24
- package/build/es/visualizations/config/adapters/dhis_highcharts/title/singleValue.js +18 -0
- package/build/es/visualizations/config/adapters/dhis_highcharts/type.js +3 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/xAxis/index.js +2 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/yAxis/index.js +5 -6
- package/build/es/visualizations/config/adapters/index.js +1 -3
- package/build/es/visualizations/config/generators/highcharts/index.js +8 -0
- package/build/es/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/index.js +6 -0
- package/build/es/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/nonASCIIFont.js +11 -0
- package/build/es/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/textShadow.js +283 -0
- package/build/es/visualizations/config/generators/index.js +1 -3
- package/build/es/visualizations/store/adapters/dhis_highcharts/index.js +4 -1
- package/build/es/visualizations/store/adapters/dhis_highcharts/singleValue.js +4 -0
- package/build/es/visualizations/store/adapters/index.js +1 -3
- package/build/es/visualizations/util/shouldUseContrastColor.js +17 -0
- package/package.json +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_dhis/index.js +0 -39
- package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/index.spec.js +0 -49
- package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/singleValue.spec.js +0 -15
- package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/index.js +0 -34
- package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/singleValue.js +0 -11
- package/build/cjs/visualizations/config/adapters/dhis_dhis/title/__tests__/index.spec.js +0 -39
- package/build/cjs/visualizations/config/adapters/dhis_dhis/title/__tests__/singleValue.spec.js +0 -17
- package/build/cjs/visualizations/config/adapters/dhis_dhis/title/index.js +0 -31
- package/build/cjs/visualizations/config/adapters/dhis_dhis/title/singleValue.js +0 -18
- package/build/cjs/visualizations/config/adapters/dhis_dhis/type.js +0 -19
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/chart.js +0 -39
- package/build/cjs/visualizations/config/generators/dhis/index.js +0 -28
- package/build/cjs/visualizations/config/generators/dhis/singleValue.js +0 -359
- package/build/cjs/visualizations/store/adapters/dhis_dhis/index.js +0 -83
- package/build/cjs/visualizations/store/adapters/dhis_dhis/singleValue.js +0 -10
- package/build/es/visualizations/config/adapters/dhis_dhis/index.js +0 -30
- package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/index.spec.js +0 -46
- package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/singleValue.spec.js +0 -12
- package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/index.js +0 -27
- package/build/es/visualizations/config/adapters/dhis_dhis/subtitle/singleValue.js +0 -4
- package/build/es/visualizations/config/adapters/dhis_dhis/title/__tests__/index.spec.js +0 -36
- package/build/es/visualizations/config/adapters/dhis_dhis/title/__tests__/singleValue.spec.js +0 -14
- package/build/es/visualizations/config/adapters/dhis_dhis/title/index.js +0 -24
- package/build/es/visualizations/config/adapters/dhis_dhis/title/singleValue.js +0 -11
- package/build/es/visualizations/config/adapters/dhis_dhis/type.js +0 -13
- package/build/es/visualizations/config/adapters/dhis_highcharts/chart.js +0 -32
- package/build/es/visualizations/config/generators/dhis/index.js +0 -21
- package/build/es/visualizations/config/generators/dhis/singleValue.js +0 -353
- package/build/es/visualizations/store/adapters/dhis_dhis/index.js +0 -76
- package/build/es/visualizations/store/adapters/dhis_dhis/singleValue.js +0 -4
package/build/es/visualizations/config/generators/highcharts/pdfExportBugFixPlugin/textShadow.js
ADDED
|
@@ -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,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,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,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
|
-
});
|
package/build/cjs/visualizations/config/adapters/dhis_dhis/subtitle/__tests__/singleValue.spec.js
DELETED
|
@@ -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
|
-
});
|
package/build/cjs/visualizations/config/adapters/dhis_dhis/title/__tests__/singleValue.spec.js
DELETED
|
@@ -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
|
-
}
|