@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.
- package/build/cjs/__demo__/SingleValue.stories.js +706 -0
- package/build/cjs/components/PivotTable/PivotTableValueCell.js +6 -2
- package/build/cjs/components/PivotTable/styles/PivotTable.style.js +2 -2
- package/build/cjs/locales/en/translations.json +2 -0
- package/build/cjs/locales/lo/translations.json +16 -12
- package/build/cjs/modules/pivotTable/PivotTableEngine.js +59 -24
- package/build/cjs/modules/pivotTable/pivotTableConstants.js +6 -2
- package/build/cjs/modules/valueTypes.js +4 -1
- 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/components/PivotTable/PivotTableValueCell.js +6 -2
- package/build/es/components/PivotTable/styles/PivotTable.style.js +2 -2
- package/build/es/locales/en/translations.json +2 -0
- package/build/es/locales/lo/translations.json +16 -12
- package/build/es/modules/pivotTable/PivotTableEngine.js +61 -26
- package/build/es/modules/pivotTable/pivotTableConstants.js +4 -1
- package/build/es/modules/valueTypes.js +2 -0
- 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 -2
- 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
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { computeSpacingTop } from './computeSpacingTop.js';
|
|
2
|
+
import { MIN_SIDE_WHITESPACE } from './styles.js';
|
|
3
|
+
export function getAvailableSpace(valueSpacingTop) {
|
|
4
|
+
return {
|
|
5
|
+
height: this.chartHeight - computeSpacingTop.call(this, valueSpacingTop),
|
|
6
|
+
width: this.chartWidth - MIN_SIDE_WHITESPACE * 2
|
|
7
|
+
};
|
|
8
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { addIconElement } from './addIconElement.js';
|
|
2
|
+
import { checkIfFitsWithinContainer } from './checkIfFitsWithinContainer.js';
|
|
3
|
+
import { getAvailableSpace } from './getAvailableSpace.js';
|
|
4
|
+
import { positionElements } from './positionElements.js';
|
|
5
|
+
import { DynamicStyles } from './styles.js';
|
|
6
|
+
export default function loadSingleValueSVG() {
|
|
7
|
+
var _this$userOptions;
|
|
8
|
+
const {
|
|
9
|
+
formattedValue,
|
|
10
|
+
icon,
|
|
11
|
+
subText,
|
|
12
|
+
fontColor
|
|
13
|
+
} = this.userOptions.customSVGOptions;
|
|
14
|
+
const dynamicStyles = new DynamicStyles((_this$userOptions = this.userOptions) === null || _this$userOptions === void 0 ? void 0 : _this$userOptions.isPdfExport);
|
|
15
|
+
const valueElement = this.renderer.text(formattedValue).attr('data-test', 'visualization-primary-value').css({
|
|
16
|
+
color: fontColor,
|
|
17
|
+
visibility: 'hidden'
|
|
18
|
+
}).add();
|
|
19
|
+
const subTextElement = subText ? this.renderer.text(subText).attr('data-test', 'visualization-subtext').css({
|
|
20
|
+
color: fontColor,
|
|
21
|
+
visibility: 'hidden'
|
|
22
|
+
}).add() : null;
|
|
23
|
+
const iconElement = icon ? addIconElement.call(this, icon, fontColor) : null;
|
|
24
|
+
let fitsWithinContainer = false;
|
|
25
|
+
let styles = {};
|
|
26
|
+
while (!fitsWithinContainer && dynamicStyles.hasNext()) {
|
|
27
|
+
styles = dynamicStyles.next();
|
|
28
|
+
valueElement.css(styles.value);
|
|
29
|
+
subTextElement === null || subTextElement === void 0 ? void 0 : subTextElement.css(styles.subText);
|
|
30
|
+
fitsWithinContainer = checkIfFitsWithinContainer(getAvailableSpace.call(this, styles.spacing.valueTop), valueElement, subTextElement, icon, subText, styles.spacing);
|
|
31
|
+
}
|
|
32
|
+
positionElements.call(this, valueElement, subTextElement, iconElement, styles.spacing);
|
|
33
|
+
valueElement.css({
|
|
34
|
+
visibility: 'visible'
|
|
35
|
+
});
|
|
36
|
+
iconElement === null || iconElement === void 0 ? void 0 : iconElement.css({
|
|
37
|
+
visibility: 'visible'
|
|
38
|
+
});
|
|
39
|
+
subTextElement === null || subTextElement === void 0 ? void 0 : subTextElement.css({
|
|
40
|
+
visibility: 'visible'
|
|
41
|
+
});
|
|
42
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { computeLayoutRect } from './computeLayoutRect.js';
|
|
2
|
+
import { ACTUAL_NUMBER_HEIGHT_FACTOR } from './constants.js';
|
|
3
|
+
export function positionElements(valueElement, subTextElement, iconElement, spacing) {
|
|
4
|
+
const valueElementBox = valueElement.getBBox();
|
|
5
|
+
/* Layout here refers to a virtual rect that wraps
|
|
6
|
+
* all indiviual parts of the single value visualization
|
|
7
|
+
* (value, subtext and icon) */
|
|
8
|
+
const layoutRect = computeLayoutRect.call(this, valueElement, subTextElement, iconElement, spacing);
|
|
9
|
+
valueElement.align({
|
|
10
|
+
align: 'right',
|
|
11
|
+
verticalAlign: 'top',
|
|
12
|
+
alignByTranslate: false,
|
|
13
|
+
x: (valueElementBox.width + layoutRect.sideMarginTop) * -1,
|
|
14
|
+
y: valueElementBox.height * ACTUAL_NUMBER_HEIGHT_FACTOR
|
|
15
|
+
}, false, layoutRect);
|
|
16
|
+
if (iconElement) {
|
|
17
|
+
const {
|
|
18
|
+
height
|
|
19
|
+
} = iconElement.getBBox();
|
|
20
|
+
const scale = spacing.iconSize / height;
|
|
21
|
+
const translateX = layoutRect.x + layoutRect.sideMarginTop;
|
|
22
|
+
const iconHeight = height * scale;
|
|
23
|
+
const valueElementHeight = valueElementBox.height * ACTUAL_NUMBER_HEIGHT_FACTOR;
|
|
24
|
+
const translateY = layoutRect.y + (valueElementHeight - iconHeight) / 2;
|
|
25
|
+
|
|
26
|
+
/* The icon is a <g> with <path> elements that contain coordinates.
|
|
27
|
+
* These path-coordinates only scale correctly when using CSS translate */
|
|
28
|
+
iconElement.css({
|
|
29
|
+
transform: `translate(${translateX}px, ${translateY}px) scale(${scale})`
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (subTextElement) {
|
|
33
|
+
subTextElement.align({
|
|
34
|
+
align: 'left',
|
|
35
|
+
verticalAlign: 'bottom',
|
|
36
|
+
alignByTranslate: false,
|
|
37
|
+
x: layoutRect.sideMarginBottom
|
|
38
|
+
}, false, layoutRect);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
const valueStyles = [{
|
|
2
|
+
'font-size': '164px',
|
|
3
|
+
'letter-spacing': '-5px'
|
|
4
|
+
}, {
|
|
5
|
+
'font-size': '128px',
|
|
6
|
+
'letter-spacing': '-4px'
|
|
7
|
+
}, {
|
|
8
|
+
'font-size': '96px',
|
|
9
|
+
'letter-spacing': '-3px'
|
|
10
|
+
}, {
|
|
11
|
+
'font-size': '64px',
|
|
12
|
+
'letter-spacing': '-2.5px'
|
|
13
|
+
}, {
|
|
14
|
+
'font-size': '40px',
|
|
15
|
+
'letter-spacing': '-1.5px'
|
|
16
|
+
}, {
|
|
17
|
+
'font-size': '20px',
|
|
18
|
+
'letter-spacing': '-1px'
|
|
19
|
+
}];
|
|
20
|
+
const subTextStyles = [{
|
|
21
|
+
'font-size': '36px',
|
|
22
|
+
'letter-spacing': '-1.4px'
|
|
23
|
+
}, {
|
|
24
|
+
'font-size': '32px',
|
|
25
|
+
'letter-spacing': '-1.2px'
|
|
26
|
+
}, {
|
|
27
|
+
'font-size': '26px',
|
|
28
|
+
'letter-spacing': '-0.8px'
|
|
29
|
+
}, {
|
|
30
|
+
'font-size': '20px',
|
|
31
|
+
'letter-spacing': '-0.6px'
|
|
32
|
+
}, {
|
|
33
|
+
'font-size': '14px',
|
|
34
|
+
'letter-spacing': '0.2px'
|
|
35
|
+
}, {
|
|
36
|
+
'font-size': '9px',
|
|
37
|
+
'letter-spacing': '0px'
|
|
38
|
+
}];
|
|
39
|
+
const spacings = [{
|
|
40
|
+
valueTop: 8,
|
|
41
|
+
subTextTop: 12,
|
|
42
|
+
iconGap: 8,
|
|
43
|
+
iconSize: 164
|
|
44
|
+
}, {
|
|
45
|
+
valueTop: 8,
|
|
46
|
+
subTextTop: 12,
|
|
47
|
+
iconGap: 6,
|
|
48
|
+
iconSize: 128
|
|
49
|
+
}, {
|
|
50
|
+
valueTop: 8,
|
|
51
|
+
subTextTop: 8,
|
|
52
|
+
iconGap: 4,
|
|
53
|
+
iconSize: 96
|
|
54
|
+
}, {
|
|
55
|
+
valueTop: 8,
|
|
56
|
+
subTextTop: 8,
|
|
57
|
+
iconGap: 4,
|
|
58
|
+
iconSize: 64
|
|
59
|
+
}, {
|
|
60
|
+
valueTop: 8,
|
|
61
|
+
subTextTop: 8,
|
|
62
|
+
iconGap: 4,
|
|
63
|
+
iconSize: 40
|
|
64
|
+
}, {
|
|
65
|
+
valueTop: 8,
|
|
66
|
+
subTextTop: 4,
|
|
67
|
+
iconGap: 2,
|
|
68
|
+
iconSize: 20
|
|
69
|
+
}];
|
|
70
|
+
export const MIN_SIDE_WHITESPACE = 4;
|
|
71
|
+
export class DynamicStyles {
|
|
72
|
+
constructor(isPdfExport) {
|
|
73
|
+
this.currentIndex = 0;
|
|
74
|
+
this.isPdfExport = isPdfExport;
|
|
75
|
+
}
|
|
76
|
+
getStyle() {
|
|
77
|
+
return {
|
|
78
|
+
value: {
|
|
79
|
+
...valueStyles[this.currentIndex],
|
|
80
|
+
'font-weight': this.isPdfExport ? 'normal' : '300'
|
|
81
|
+
},
|
|
82
|
+
subText: subTextStyles[this.currentIndex],
|
|
83
|
+
spacing: spacings[this.currentIndex]
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
next() {
|
|
87
|
+
if (this.currentIndex === valueStyles.length - 1) {
|
|
88
|
+
throw new Error('No next available, already on the smallest style');
|
|
89
|
+
} else {
|
|
90
|
+
++this.currentIndex;
|
|
91
|
+
}
|
|
92
|
+
return this.getStyle();
|
|
93
|
+
}
|
|
94
|
+
first() {
|
|
95
|
+
this.currentIndex = 0;
|
|
96
|
+
return this.getStyle();
|
|
97
|
+
}
|
|
98
|
+
hasNext() {
|
|
99
|
+
return this.currentIndex < valueStyles.length - 1;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { VIS_TYPE_SINGLE_VALUE } from '../../../../modules/visTypes.js';
|
|
2
|
+
import loadSingleValueSVG from './events/loadCustomSVG/singleValue/index.js';
|
|
3
|
+
export default function getExporting(visType) {
|
|
4
|
+
const exporting = {
|
|
5
|
+
// disable exporting context menu
|
|
6
|
+
enabled: false
|
|
7
|
+
};
|
|
8
|
+
switch (visType) {
|
|
9
|
+
case VIS_TYPE_SINGLE_VALUE:
|
|
10
|
+
return {
|
|
11
|
+
...exporting,
|
|
12
|
+
chartOptions: {
|
|
13
|
+
chart: {
|
|
14
|
+
events: {
|
|
15
|
+
load: loadSingleValueSVG
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
default:
|
|
21
|
+
return exporting;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -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
|
|
64
|
+
chart: getChart(_layout, el, _extraOptions, series),
|
|
62
65
|
// title
|
|
63
|
-
title: getTitle(_layout, store.data[0].metaData, _extraOptions
|
|
66
|
+
title: getTitle(_layout, store.data[0].metaData, _extraOptions, series),
|
|
64
67
|
// subtitle
|
|
65
|
-
subtitle: getSubtitle(series, _layout, store.data[0].metaData, _extraOptions
|
|
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
|
-
|
|
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
|
-
|
|
102
|
-
|
|
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
|
+
}
|
|
@@ -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,
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
+
}
|
package/build/es/visualizations/config/adapters/dhis_highcharts/title/__tests__/singleValue.spec.js
ADDED
|
@@ -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
|
+
});
|