@fluentui/react-charting 5.16.44 → 5.16.45

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 (125) hide show
  1. package/CHANGELOG.json +22 -1
  2. package/CHANGELOG.md +12 -2
  3. package/dist/react-charting.js +1 -1
  4. package/dist/react-charting.min.js +1 -1
  5. package/docs/TestPlans/GaugeChart/ComponentTests.md +31 -0
  6. package/lib/GaugeChart.d.ts +1 -0
  7. package/lib/GaugeChart.js +2 -0
  8. package/lib/GaugeChart.js.map +1 -0
  9. package/lib/components/GaugeChart/GaugeChart.base.d.ts +67 -0
  10. package/lib/components/GaugeChart/GaugeChart.base.js +376 -0
  11. package/lib/components/GaugeChart/GaugeChart.base.js.map +1 -0
  12. package/lib/components/GaugeChart/GaugeChart.d.ts +3 -0
  13. package/lib/components/GaugeChart/GaugeChart.js +5 -0
  14. package/lib/components/GaugeChart/GaugeChart.js.map +1 -0
  15. package/lib/components/GaugeChart/GaugeChart.styles.d.ts +2 -0
  16. package/lib/components/GaugeChart/GaugeChart.styles.js +118 -0
  17. package/lib/components/GaugeChart/GaugeChart.styles.js.map +1 -0
  18. package/lib/components/GaugeChart/GaugeChart.types.d.ts +207 -0
  19. package/lib/components/GaugeChart/GaugeChart.types.js +6 -0
  20. package/lib/components/GaugeChart/GaugeChart.types.js.map +1 -0
  21. package/lib/components/GaugeChart/index.d.ts +2 -0
  22. package/lib/components/GaugeChart/index.js +3 -0
  23. package/lib/components/GaugeChart/index.js.map +1 -0
  24. package/lib/components/LineChart/LineChart.base.js +1 -1
  25. package/lib/components/LineChart/LineChart.base.js.map +1 -1
  26. package/lib/components/LineChart/LineChart.types.d.ts +2 -2
  27. package/lib/components/LineChart/LineChart.types.js.map +1 -1
  28. package/lib/components/LineChart/eventAnnotation/EventAnnotation.d.ts +2 -0
  29. package/lib/components/LineChart/eventAnnotation/EventAnnotation.js +6 -3
  30. package/lib/components/LineChart/eventAnnotation/EventAnnotation.js.map +1 -1
  31. package/lib/components/LineChart/eventAnnotation/LabelLink.d.ts +3 -1
  32. package/lib/components/LineChart/eventAnnotation/LabelLink.js +6 -3
  33. package/lib/components/LineChart/eventAnnotation/LabelLink.js.map +1 -1
  34. package/lib/index.d.ts +1 -0
  35. package/lib/index.js +1 -0
  36. package/lib/index.js.map +1 -1
  37. package/lib/utilities/SVGTooltipText.d.ts +81 -0
  38. package/lib/utilities/SVGTooltipText.js +173 -0
  39. package/lib/utilities/SVGTooltipText.js.map +1 -0
  40. package/lib/utilities/utilities.d.ts +1 -0
  41. package/lib/utilities/utilities.js +11 -0
  42. package/lib/utilities/utilities.js.map +1 -1
  43. package/lib/version.js +1 -1
  44. package/lib/version.js.map +1 -1
  45. package/lib-amd/GaugeChart.d.ts +1 -0
  46. package/lib-amd/GaugeChart.js +6 -0
  47. package/lib-amd/GaugeChart.js.map +1 -0
  48. package/lib-amd/components/GaugeChart/GaugeChart.base.d.ts +67 -0
  49. package/lib-amd/components/GaugeChart/GaugeChart.base.js +370 -0
  50. package/lib-amd/components/GaugeChart/GaugeChart.base.js.map +1 -0
  51. package/lib-amd/components/GaugeChart/GaugeChart.d.ts +3 -0
  52. package/lib-amd/components/GaugeChart/GaugeChart.js +7 -0
  53. package/lib-amd/components/GaugeChart/GaugeChart.js.map +1 -0
  54. package/lib-amd/components/GaugeChart/GaugeChart.styles.d.ts +2 -0
  55. package/lib-amd/components/GaugeChart/GaugeChart.styles.js +122 -0
  56. package/lib-amd/components/GaugeChart/GaugeChart.styles.js.map +1 -0
  57. package/lib-amd/components/GaugeChart/GaugeChart.types.d.ts +207 -0
  58. package/lib-amd/components/GaugeChart/GaugeChart.types.js +11 -0
  59. package/lib-amd/components/GaugeChart/GaugeChart.types.js.map +1 -0
  60. package/lib-amd/components/GaugeChart/index.d.ts +2 -0
  61. package/lib-amd/components/GaugeChart/index.js +7 -0
  62. package/lib-amd/components/GaugeChart/index.js.map +1 -0
  63. package/lib-amd/components/LineChart/LineChart.base.js +1 -1
  64. package/lib-amd/components/LineChart/LineChart.base.js.map +1 -1
  65. package/lib-amd/components/LineChart/LineChart.types.d.ts +2 -2
  66. package/lib-amd/components/LineChart/LineChart.types.js.map +1 -1
  67. package/lib-amd/components/LineChart/eventAnnotation/EventAnnotation.d.ts +2 -0
  68. package/lib-amd/components/LineChart/eventAnnotation/EventAnnotation.js +6 -4
  69. package/lib-amd/components/LineChart/eventAnnotation/EventAnnotation.js.map +1 -1
  70. package/lib-amd/components/LineChart/eventAnnotation/LabelLink.d.ts +3 -1
  71. package/lib-amd/components/LineChart/eventAnnotation/LabelLink.js +6 -4
  72. package/lib-amd/components/LineChart/eventAnnotation/LabelLink.js.map +1 -1
  73. package/lib-amd/index.d.ts +1 -0
  74. package/lib-amd/index.js +2 -1
  75. package/lib-amd/index.js.map +1 -1
  76. package/lib-amd/utilities/SVGTooltipText.d.ts +81 -0
  77. package/lib-amd/utilities/SVGTooltipText.js +174 -0
  78. package/lib-amd/utilities/SVGTooltipText.js.map +1 -0
  79. package/lib-amd/utilities/utilities.d.ts +1 -0
  80. package/lib-amd/utilities/utilities.js +13 -2
  81. package/lib-amd/utilities/utilities.js.map +1 -1
  82. package/lib-amd/version.js +1 -1
  83. package/lib-amd/version.js.map +1 -1
  84. package/lib-commonjs/GaugeChart.d.ts +1 -0
  85. package/lib-commonjs/GaugeChart.js +5 -0
  86. package/lib-commonjs/GaugeChart.js.map +1 -0
  87. package/lib-commonjs/components/GaugeChart/GaugeChart.base.d.ts +67 -0
  88. package/lib-commonjs/components/GaugeChart/GaugeChart.base.js +379 -0
  89. package/lib-commonjs/components/GaugeChart/GaugeChart.base.js.map +1 -0
  90. package/lib-commonjs/components/GaugeChart/GaugeChart.d.ts +3 -0
  91. package/lib-commonjs/components/GaugeChart/GaugeChart.js +8 -0
  92. package/lib-commonjs/components/GaugeChart/GaugeChart.js.map +1 -0
  93. package/lib-commonjs/components/GaugeChart/GaugeChart.styles.d.ts +2 -0
  94. package/lib-commonjs/components/GaugeChart/GaugeChart.styles.js +122 -0
  95. package/lib-commonjs/components/GaugeChart/GaugeChart.styles.js.map +1 -0
  96. package/lib-commonjs/components/GaugeChart/GaugeChart.types.d.ts +207 -0
  97. package/lib-commonjs/components/GaugeChart/GaugeChart.types.js +9 -0
  98. package/lib-commonjs/components/GaugeChart/GaugeChart.types.js.map +1 -0
  99. package/lib-commonjs/components/GaugeChart/index.d.ts +2 -0
  100. package/lib-commonjs/components/GaugeChart/index.js +6 -0
  101. package/lib-commonjs/components/GaugeChart/index.js.map +1 -0
  102. package/lib-commonjs/components/LineChart/LineChart.base.js +1 -1
  103. package/lib-commonjs/components/LineChart/LineChart.base.js.map +1 -1
  104. package/lib-commonjs/components/LineChart/LineChart.types.d.ts +2 -2
  105. package/lib-commonjs/components/LineChart/LineChart.types.js.map +1 -1
  106. package/lib-commonjs/components/LineChart/eventAnnotation/EventAnnotation.d.ts +2 -0
  107. package/lib-commonjs/components/LineChart/eventAnnotation/EventAnnotation.js +6 -3
  108. package/lib-commonjs/components/LineChart/eventAnnotation/EventAnnotation.js.map +1 -1
  109. package/lib-commonjs/components/LineChart/eventAnnotation/LabelLink.d.ts +3 -1
  110. package/lib-commonjs/components/LineChart/eventAnnotation/LabelLink.js +6 -3
  111. package/lib-commonjs/components/LineChart/eventAnnotation/LabelLink.js.map +1 -1
  112. package/lib-commonjs/index.d.ts +1 -0
  113. package/lib-commonjs/index.js +1 -0
  114. package/lib-commonjs/index.js.map +1 -1
  115. package/lib-commonjs/utilities/SVGTooltipText.d.ts +81 -0
  116. package/lib-commonjs/utilities/SVGTooltipText.js +176 -0
  117. package/lib-commonjs/utilities/SVGTooltipText.js.map +1 -0
  118. package/lib-commonjs/utilities/utilities.d.ts +1 -0
  119. package/lib-commonjs/utilities/utilities.js +13 -1
  120. package/lib-commonjs/utilities/utilities.js.map +1 -1
  121. package/lib-commonjs/version.js +1 -1
  122. package/lib-commonjs/version.js.map +1 -1
  123. package/package.json +1 -1
  124. package/src/components/GaugeChart/GaugeChart.types.ts +258 -0
  125. package/src/components/LineChart/LineChart.types.ts +2 -2
@@ -0,0 +1,31 @@
1
+ # Component testing - Gauge chart test plan
2
+
3
+ ## Snapshot testing
4
+
5
+ | Test case | Validation | Tool used |
6
+ | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | --------- |
7
+ | When only segments and chartValue props are set | Should render gauge chart correctly | Enzyme |
8
+ | When hideMinMax prop is set to true | Should not render the min and max values of the gauge | Enzyme |
9
+ | When chartTitle prop is set | Should render the chart title correctly | Enzyme |
10
+ | When sublabel prop is set | Should render the sublabel correctly | Enzyme |
11
+ | When the layout direction is RTL | Should render gauge chart correctly | Enzyme |
12
+ | When hideLegend prop is set to true | Should not render the legends | Enzyme |
13
+ | When chartValueFormat is set to ‘fraction’ | Should render the chart value in fraction format | Enzyme |
14
+ | When a segment has no color | Should render a color from DataVizPalette for the segment | Enzyme |
15
+ | When the total size of the segments is less than the difference between maxValue and minValue props | Should render a placeholder segment | Enzyme |
16
+ | When the theme is dark | Should render gauge chart correctly | Enzyme |
17
+
18
+ ## Testing event listeners
19
+
20
+ | Test case | Validation | Tool used |
21
+ | ------------------------------------------------------------------- | -------------------------------------------------------------------------- | --------- |
22
+ | When the mouse moves over a segment and then leaves the chart | Should show a callout and hide it respectively | RTL |
23
+ | When a segment is focused and then blurred | Should show an outline around the segment and hide it respectively | RTL |
24
+ | When the mouse moves over the chart value and then leaves the chart | Should show a callout and hide it respectively | RTL |
25
+ | When the mouse moves over the needle and then leaves the chart | Should show a callout and hide it respectively | RTL |
26
+ | When the needle is focused and then blurred | Should show a callout and hide it respectively | RTL |
27
+ | When the mouse moves over a legend and then moves out of the legend | Should highlight the corresponding segment and unhighlight it respectively | RTL |
28
+ | When a legend is clicked once and then clicked again | Should highlight the corresponding segment and unhighlight it respectively | RTL |
29
+ | When the length of the chart value exceeds the max width | Should truncate the chart value with ellipsis | RTL |
30
+ | When the chart resizes | Should update the font size of the chart value | RTL |
31
+ | When hideTooltip prop is set to true | Should not show a callout | RTL |
@@ -0,0 +1 @@
1
+ export * from './components/GaugeChart/index';
@@ -0,0 +1,2 @@
1
+ export * from './components/GaugeChart/index';
2
+ //# sourceMappingURL=GaugeChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GaugeChart.js","sourceRoot":"../src/","sources":["GaugeChart.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC","sourcesContent":["export * from './components/GaugeChart/index';\n"]}
@@ -0,0 +1,67 @@
1
+ import * as React from 'react';
2
+ import { IGaugeChartProps } from './GaugeChart.types';
3
+ import { IYValueHover } from '../../index';
4
+ export declare const ARC_PADDING = 2;
5
+ export declare const BREAKPOINTS: {
6
+ minRadius: number;
7
+ arcWidth: number;
8
+ fontSize: number;
9
+ }[];
10
+ interface IYValue extends Omit<IYValueHover, 'y'> {
11
+ y?: string | number;
12
+ }
13
+ export interface IGaugeChartState {
14
+ hoveredLegend: string;
15
+ selectedLegend: string;
16
+ focusedElement?: string;
17
+ calloutTarget: any;
18
+ isCalloutVisible: boolean;
19
+ hoverXValue: string | number;
20
+ hoverYValues: IYValue[];
21
+ width: number;
22
+ height: number;
23
+ }
24
+ export declare class GaugeChartBase extends React.Component<IGaugeChartProps, IGaugeChartState> {
25
+ private _classNames;
26
+ private _isRTL;
27
+ private _innerRadius;
28
+ private _outerRadius;
29
+ private _minValue;
30
+ private _segments;
31
+ private _sweepFraction;
32
+ private _calloutAnchor;
33
+ private _rootElem;
34
+ private _margins;
35
+ private _legendsHeight;
36
+ constructor(props: IGaugeChartProps);
37
+ componentDidMount(): void;
38
+ render(): React.ReactNode;
39
+ private _getMargins;
40
+ private _getStylesBasedOnBreakpoint;
41
+ private _initProps;
42
+ private _renderNeedle;
43
+ private _renderLegends;
44
+ /**
45
+ * This function checks if the given legend is highlighted or not.
46
+ * A legend can be highlighted in 2 ways:
47
+ * 1. selection: if the user clicks on it
48
+ * 2. hovering: if there is no selected legend and the user hovers over it
49
+ */
50
+ private _legendHighlighted;
51
+ /**
52
+ * This function checks if none of the legends is selected or hovered.
53
+ */
54
+ private _noLegendHighlighted;
55
+ private _handleFocus;
56
+ private _handleBlur;
57
+ private _handleMouseOver;
58
+ private _handleMouseOut;
59
+ private _handleCalloutDismiss;
60
+ private _showCallout;
61
+ private _hideCallout;
62
+ private _wrapContent;
63
+ private _multiValueCallout;
64
+ private _yValueHoverSubCountsExists;
65
+ private _getCalloutContent;
66
+ }
67
+ export {};
@@ -0,0 +1,376 @@
1
+ import { __assign, __extends } from "tslib";
2
+ import * as React from 'react';
3
+ import * as shape from 'd3-shape';
4
+ import { classNamesFunction, getRTL } from '@fluentui/react/lib/Utilities';
5
+ import { GaugeValueFormat, } from './GaugeChart.types';
6
+ import { Points, convertToLocaleString, formatValueWithSIPrefix, getAccessibleDataObject, getColorFromToken, getNextColor, pointTypes, } from '../../utilities/index';
7
+ import { Legends, Shape } from '../Legends/index';
8
+ import { FocusZone, FocusZoneDirection } from '@fluentui/react-focus';
9
+ import { Callout, DirectionalHint } from '@fluentui/react/lib/Callout';
10
+ import { SVGTooltipText } from '../../utilities/SVGTooltipText';
11
+ import { select as d3Select } from 'd3-selection';
12
+ var GAUGE_MARGIN = 16;
13
+ var LABEL_WIDTH = 36;
14
+ var LABEL_HEIGHT = 16;
15
+ var LABEL_OFFSET = 4;
16
+ var TITLE_OFFSET = 11;
17
+ var EXTRA_NEEDLE_LENGTH = 4;
18
+ export var ARC_PADDING = 2;
19
+ export var BREAKPOINTS = [
20
+ { minRadius: 52, arcWidth: 12, fontSize: 20 },
21
+ { minRadius: 70, arcWidth: 16, fontSize: 24 },
22
+ { minRadius: 88, arcWidth: 20, fontSize: 32 },
23
+ { minRadius: 106, arcWidth: 24, fontSize: 32 },
24
+ { minRadius: 124, arcWidth: 28, fontSize: 40 },
25
+ { minRadius: 142, arcWidth: 32, fontSize: 40 },
26
+ ];
27
+ var getClassNames = classNamesFunction();
28
+ var GaugeChartBase = /** @class */ (function (_super) {
29
+ __extends(GaugeChartBase, _super);
30
+ function GaugeChartBase(props) {
31
+ var _this = _super.call(this, props) || this;
32
+ _this._getMargins = function () {
33
+ var _a = _this.props, hideMinMax = _a.hideMinMax, chartTitle = _a.chartTitle, sublabel = _a.sublabel;
34
+ return {
35
+ left: (!hideMinMax ? LABEL_OFFSET + LABEL_WIDTH : 0) + GAUGE_MARGIN,
36
+ right: (!hideMinMax ? LABEL_OFFSET + LABEL_WIDTH : 0) + GAUGE_MARGIN,
37
+ top: (chartTitle ? TITLE_OFFSET + LABEL_HEIGHT : EXTRA_NEEDLE_LENGTH / 2) + GAUGE_MARGIN,
38
+ bottom: (sublabel ? LABEL_OFFSET + LABEL_HEIGHT : 0) + GAUGE_MARGIN,
39
+ };
40
+ };
41
+ _this._getStylesBasedOnBreakpoint = function () {
42
+ for (var index = BREAKPOINTS.length - 1; index >= 0; index -= 1) {
43
+ if (_this._outerRadius >= BREAKPOINTS[index].minRadius) {
44
+ return {
45
+ arcWidth: BREAKPOINTS[index].arcWidth,
46
+ chartValueSize: BREAKPOINTS[index].fontSize,
47
+ };
48
+ }
49
+ }
50
+ return {
51
+ arcWidth: BREAKPOINTS[0].arcWidth,
52
+ chartValueSize: BREAKPOINTS[0].fontSize,
53
+ };
54
+ };
55
+ _this._initProps = function () {
56
+ var _a = _this.props, _b = _a.minValue, minValue = _b === void 0 ? 0 : _b, maxValue = _a.maxValue, theme = _a.theme;
57
+ var segments = Array.from(_this.props.segments);
58
+ var total = minValue;
59
+ segments.forEach(function (segment, index) {
60
+ total += segment.size;
61
+ segment.color =
62
+ typeof segment.color !== 'undefined'
63
+ ? getColorFromToken(segment.color, theme.isInverted)
64
+ : getNextColor(index, 0, theme.isInverted);
65
+ });
66
+ if (typeof maxValue !== 'undefined' && total < maxValue) {
67
+ segments.push({
68
+ legend: 'Unknown',
69
+ size: maxValue - total,
70
+ color: theme.palette.neutralLight,
71
+ });
72
+ total = maxValue;
73
+ }
74
+ var arcGenerator = shape
75
+ .arc()
76
+ .padAngle(ARC_PADDING / _this._outerRadius)
77
+ .padRadius(_this._outerRadius);
78
+ var rtlSafeSegments = _this._isRTL ? Array.from(segments).reverse() : segments;
79
+ var prevAngle = -Math.PI / 2;
80
+ var arcs = rtlSafeSegments.map(function (segment, index) {
81
+ var endAngle = prevAngle + (segment.size / (total - minValue)) * Math.PI;
82
+ var d = arcGenerator({
83
+ innerRadius: _this._innerRadius,
84
+ outerRadius: _this._outerRadius,
85
+ startAngle: prevAngle,
86
+ endAngle: endAngle,
87
+ });
88
+ prevAngle = endAngle;
89
+ return {
90
+ d: d,
91
+ segmentIndex: _this._isRTL ? segments.length - 1 - index : index,
92
+ };
93
+ });
94
+ return {
95
+ minValue: minValue,
96
+ maxValue: total,
97
+ segments: segments,
98
+ arcs: arcs,
99
+ };
100
+ };
101
+ _this._renderNeedle = function () {
102
+ var needleRotation = (_this._sweepFraction[0] / _this._sweepFraction[1]) * 180;
103
+ var rtlSafeNeedleRotation = _this._isRTL ? 180 - needleRotation : needleRotation;
104
+ var strokeWidth = 2;
105
+ var halfStrokeWidth = strokeWidth / 2;
106
+ var needleLength = _this._outerRadius - _this._innerRadius + EXTRA_NEEDLE_LENGTH;
107
+ return (React.createElement("g", { transform: "rotate(".concat(rtlSafeNeedleRotation, ", 0, 0)") },
108
+ React.createElement("path", { d: "\n M 0,".concat(-halfStrokeWidth - 3, "\n L ").concat(-needleLength, ",").concat(-halfStrokeWidth - 1, "\n A ").concat(halfStrokeWidth + 1, ",").concat(halfStrokeWidth + 1, ",0,0,0,").concat(-needleLength, ",").concat(halfStrokeWidth + 1, "\n L 0,").concat(halfStrokeWidth + 3, "\n A ").concat(halfStrokeWidth + 3, ",").concat(halfStrokeWidth + 3, ",0,0,0,0,").concat(-halfStrokeWidth - 3, "\n "), strokeWidth: strokeWidth, className: _this._classNames.needle, transform: "translate(".concat(-_this._innerRadius + EXTRA_NEEDLE_LENGTH / 2, ")"), "data-is-focusable": true, onFocus: function (e) { return _this._handleFocus(e, 'Needle'); }, onBlur: _this._handleBlur, onMouseEnter: function (e) { return _this._handleMouseOver(e, 'Needle'); }, onMouseMove: function (e) { return _this._handleMouseOver(e, 'Needle'); } })));
109
+ };
110
+ _this._renderLegends = function () {
111
+ if (_this.props.hideLegend) {
112
+ return null;
113
+ }
114
+ var legends = _this._segments.map(function (segment) {
115
+ return {
116
+ title: segment.legend,
117
+ color: segment.color,
118
+ action: function () {
119
+ if (_this.state.selectedLegend === segment.legend) {
120
+ _this.setState({ selectedLegend: '' });
121
+ }
122
+ else {
123
+ _this.setState({ selectedLegend: segment.legend });
124
+ }
125
+ },
126
+ hoverAction: function () {
127
+ _this.setState({ hoveredLegend: segment.legend });
128
+ },
129
+ onMouseOutAction: function () {
130
+ _this.setState({ hoveredLegend: '' });
131
+ },
132
+ };
133
+ });
134
+ return (React.createElement("div", { className: _this._classNames.legendsContainer },
135
+ React.createElement(Legends, __assign({ legends: legends, centerLegends: true }, _this.props.legendProps))));
136
+ };
137
+ /**
138
+ * This function checks if the given legend is highlighted or not.
139
+ * A legend can be highlighted in 2 ways:
140
+ * 1. selection: if the user clicks on it
141
+ * 2. hovering: if there is no selected legend and the user hovers over it
142
+ */
143
+ _this._legendHighlighted = function (legend) {
144
+ return (_this.state.selectedLegend === legend || (_this.state.selectedLegend === '' && _this.state.hoveredLegend === legend));
145
+ };
146
+ /**
147
+ * This function checks if none of the legends is selected or hovered.
148
+ */
149
+ _this._noLegendHighlighted = function () {
150
+ return _this.state.selectedLegend === '' && _this.state.hoveredLegend === '';
151
+ };
152
+ _this._handleFocus = function (focusEvent, focusedElement) {
153
+ _this._showCallout(focusEvent.target, focusedElement, true);
154
+ };
155
+ _this._handleBlur = function () {
156
+ _this._hideCallout(true);
157
+ };
158
+ _this._handleMouseOver = function (mouseEvent, hoveredElement) {
159
+ _this._showCallout(mouseEvent.target, hoveredElement, false);
160
+ };
161
+ _this._handleMouseOut = function () {
162
+ _this._hideCallout(false);
163
+ };
164
+ _this._handleCalloutDismiss = function () {
165
+ _this._hideCallout(false);
166
+ };
167
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
168
+ _this._showCallout = function (target, legend, isFocusEvent) {
169
+ if (_this._calloutAnchor === legend) {
170
+ return;
171
+ }
172
+ _this._calloutAnchor = legend;
173
+ var hoverXValue = 'Current value is ' +
174
+ (_this.props.chartValueFormat === GaugeValueFormat.Fraction
175
+ ? "".concat(((_this._sweepFraction[0] / _this._sweepFraction[1]) * 100).toFixed(), "%")
176
+ : "".concat(_this._sweepFraction[0], "/").concat(_this._sweepFraction[1]));
177
+ var total = _this._minValue;
178
+ var hoverYValues = _this._segments.map(function (segment, index) {
179
+ var yValue = {
180
+ legend: segment.legend,
181
+ y: "".concat(total + (index > 0 ? 1 : 0), " - ").concat(total + segment.size),
182
+ color: segment.color,
183
+ };
184
+ total += segment.size;
185
+ return yValue;
186
+ });
187
+ _this.setState(__assign({ calloutTarget: target,
188
+ /** Show the callout if highlighted arc is hovered/focused and Hide it if unhighlighted arc is hovered/focused */
189
+ isCalloutVisible: ['Needle', 'Chart value'].includes(legend) ||
190
+ _this.state.selectedLegend === '' ||
191
+ _this.state.selectedLegend === legend, hoverXValue: hoverXValue, hoverYValues: hoverYValues }, (isFocusEvent ? { focusedElement: legend } : {})));
192
+ };
193
+ _this._hideCallout = function (isBlurEvent) {
194
+ _this._calloutAnchor = '';
195
+ _this.setState(__assign({ calloutTarget: null, isCalloutVisible: false, hoverXValue: '', hoverYValues: [] }, (isBlurEvent ? { focusedElement: '' } : {})));
196
+ };
197
+ _this._wrapContent = function (content, id, maxWidth) {
198
+ var textElement = d3Select("#".concat(id));
199
+ textElement.text(content);
200
+ if (!textElement.node()) {
201
+ return false;
202
+ }
203
+ var isOverflowing = false;
204
+ var textLength = textElement.node().getComputedTextLength();
205
+ while (textLength > maxWidth && content.length > 0) {
206
+ content = content.slice(0, -1);
207
+ textElement.text(content + '...');
208
+ isOverflowing = true;
209
+ textLength = textElement.node().getComputedTextLength();
210
+ }
211
+ return isOverflowing;
212
+ };
213
+ // TO DO: Write a common functional component for Multi value callout and divide sub count method
214
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
215
+ _this._multiValueCallout = function (calloutProps) {
216
+ var yValueHoverSubCountsExists = _this._yValueHoverSubCountsExists(calloutProps.YValueHover);
217
+ return (React.createElement("div", { className: _this._classNames.calloutContentRoot },
218
+ React.createElement("div", { className: _this._classNames.calloutDateTimeContainer, style: yValueHoverSubCountsExists ? { marginBottom: '11px' } : {} },
219
+ React.createElement("div", __assign({ className: _this._classNames.calloutContentX }, getAccessibleDataObject(calloutProps.xAxisCalloutAccessibilityData, 'text', false)), convertToLocaleString(calloutProps.hoverXValue, _this.props.culture))),
220
+ React.createElement("div", { className: _this._classNames.calloutInfoContainer, style: yValueHoverSubCountsExists ? { display: 'flex' } : {} },
221
+ calloutProps.YValueHover &&
222
+ calloutProps.YValueHover.map(function (yValue, index, yValues) {
223
+ var isLast = index + 1 === yValues.length;
224
+ var _a = yValue.shouldDrawBorderBottom, shouldDrawBorderBottom = _a === void 0 ? false : _a;
225
+ return (React.createElement("div", __assign({}, getAccessibleDataObject(yValue.callOutAccessibilityData, 'text', false), { key: "callout-content-".concat(index), style: yValueHoverSubCountsExists
226
+ ? __assign({ display: 'inline-block' }, (shouldDrawBorderBottom && {
227
+ borderBottom: "1px solid ".concat(_this.props.theme.semanticColors.menuDivider),
228
+ paddingBottom: '10px',
229
+ })) : __assign({}, (shouldDrawBorderBottom && {
230
+ borderBottom: "1px solid ".concat(_this.props.theme.semanticColors.menuDivider),
231
+ paddingBottom: '10px',
232
+ })) }), _this._getCalloutContent(yValue, index, yValueHoverSubCountsExists, isLast)));
233
+ }),
234
+ !!calloutProps.descriptionMessage && (React.createElement("div", { className: _this._classNames.descriptionMessage }, calloutProps.descriptionMessage)))));
235
+ };
236
+ _this._margins = _this._getMargins();
237
+ _this._legendsHeight = !_this.props.hideLegend ? 24 : 0;
238
+ _this.state = {
239
+ hoveredLegend: '',
240
+ selectedLegend: '',
241
+ focusedElement: '',
242
+ calloutTarget: null,
243
+ isCalloutVisible: false,
244
+ hoverXValue: '',
245
+ hoverYValues: [],
246
+ width: 140 + _this._margins.left + _this._margins.right,
247
+ height: 70 + _this._margins.top + _this._margins.bottom + _this._legendsHeight,
248
+ };
249
+ _this._isRTL = getRTL();
250
+ _this._calloutAnchor = '';
251
+ return _this;
252
+ }
253
+ GaugeChartBase.prototype.componentDidMount = function () {
254
+ if (this._rootElem) {
255
+ this.setState({
256
+ width: this._rootElem.clientWidth,
257
+ height: this._rootElem.clientHeight,
258
+ });
259
+ }
260
+ };
261
+ GaugeChartBase.prototype.render = function () {
262
+ var _this = this;
263
+ this._margins = this._getMargins();
264
+ this._legendsHeight = !this.props.hideLegend ? 24 : 0;
265
+ var width = this.props.width || this.state.width;
266
+ var height = this.props.height || this.state.height;
267
+ this._outerRadius = Math.min((width - (this._margins.left + this._margins.right)) / 2, height - (this._margins.top + this._margins.bottom + this._legendsHeight));
268
+ var _a = this._getStylesBasedOnBreakpoint(), arcWidth = _a.arcWidth, chartValueSize = _a.chartValueSize;
269
+ this._innerRadius = this._outerRadius - arcWidth;
270
+ var _b = this._initProps(), minValue = _b.minValue, maxValue = _b.maxValue, segments = _b.segments, arcs = _b.arcs;
271
+ this._minValue = minValue;
272
+ this._segments = segments;
273
+ this._sweepFraction = [this.props.chartValue - this._minValue, maxValue - this._minValue];
274
+ this._classNames = getClassNames(this.props.styles, {
275
+ theme: this.props.theme,
276
+ className: this.props.className,
277
+ chartWidth: width,
278
+ chartHeight: height - this._legendsHeight,
279
+ chartValueSize: chartValueSize,
280
+ });
281
+ return (React.createElement("div", { className: this._classNames.root, ref: function (el) { return (_this._rootElem = el); } },
282
+ React.createElement(FocusZone, { direction: FocusZoneDirection.horizontal },
283
+ React.createElement("svg", { className: this._classNames.chart, role: "presentation", "aria-label": "This is a gauge chart with ".concat(this._segments.length, " section represented."), onMouseLeave: this._handleMouseOut },
284
+ React.createElement("g", { transform: "translate(".concat(width / 2, ", ").concat(height - (this._margins.bottom + this._legendsHeight), ")") },
285
+ this.props.chartTitle && (React.createElement("text", { x: 0, y: -(this._outerRadius + TITLE_OFFSET), textAnchor: "middle", className: this._classNames.chartTitle }, this.props.chartTitle)),
286
+ !this.props.hideMinMax && (React.createElement(React.Fragment, null,
287
+ React.createElement("text", { x: (this._isRTL ? 1 : -1) * (this._outerRadius + LABEL_OFFSET), y: 0, textAnchor: "end", className: this._classNames.limits, role: "img", "aria-label": "Min value: ".concat(this._minValue) }, formatValueWithSIPrefix(this._minValue)),
288
+ React.createElement("text", { x: (this._isRTL ? -1 : 1) * (this._outerRadius + LABEL_OFFSET), y: 0, textAnchor: "start", className: this._classNames.limits, role: "img", "aria-label": "Max value: ".concat(maxValue) }, formatValueWithSIPrefix(maxValue)))),
289
+ arcs.map(function (arc, index) { return (React.createElement("path", __assign({ key: index, d: arc.d, fill: _this._segments[arc.segmentIndex].color, fillOpacity: _this._legendHighlighted(_this._segments[arc.segmentIndex].legend) || _this._noLegendHighlighted()
290
+ ? 1
291
+ : 0.1, strokeWidth: _this.state.focusedElement === _this._segments[arc.segmentIndex].legend ? ARC_PADDING : 0, className: _this._classNames.segment }, getAccessibleDataObject(__assign({ ariaLabel: "".concat(_this._segments[arc.segmentIndex].legend, ", ").concat(_this._segments[arc.segmentIndex].size, " out of ").concat(maxValue - _this._minValue, " or ").concat(((_this._segments[arc.segmentIndex].size / (maxValue - _this._minValue)) *
292
+ 100).toFixed(), "%") }, _this._segments[arc.segmentIndex].accessibilityData), 'img', true), { onFocus: function (e) { return _this._handleFocus(e, _this._segments[arc.segmentIndex].legend); }, onBlur: _this._handleBlur, onMouseEnter: function (e) { return _this._handleMouseOver(e, _this._segments[arc.segmentIndex].legend); }, onMouseMove: function (e) { return _this._handleMouseOver(e, _this._segments[arc.segmentIndex].legend); } }))); }),
293
+ this._renderNeedle(),
294
+ React.createElement("g", { onMouseEnter: function (e) { return _this._handleMouseOver(e, 'Chart value'); }, onMouseMove: function (e) { return _this._handleMouseOver(e, 'Chart value'); } },
295
+ React.createElement(SVGTooltipText, { content: typeof this.props.chartValueFormat === 'function'
296
+ ? this.props.chartValueFormat(this._sweepFraction)
297
+ : this.props.chartValueFormat === GaugeValueFormat.Fraction
298
+ ? "".concat(this._sweepFraction[0], "/").concat(this._sweepFraction[1])
299
+ : "".concat(((this._sweepFraction[0] / this._sweepFraction[1]) * 100).toFixed(), "%"), textProps: {
300
+ x: 0,
301
+ y: 0,
302
+ textAnchor: 'middle',
303
+ className: this._classNames.chartValue,
304
+ role: 'img',
305
+ 'aria-label': "Current value: ".concat(this._sweepFraction[0], " out of ").concat(this._sweepFraction[1], ", or ").concat(((this._sweepFraction[0] / this._sweepFraction[1]) *
306
+ 100).toFixed(), "%"),
307
+ }, maxWidth: this._innerRadius * 2 - 24, wrapContent: this._wrapContent })),
308
+ this.props.sublabel && (React.createElement(SVGTooltipText, { content: this.props.sublabel, textProps: {
309
+ x: 0,
310
+ y: 4,
311
+ textAnchor: 'middle',
312
+ dominantBaseline: 'hanging',
313
+ className: this._classNames.sublabel,
314
+ role: 'img',
315
+ 'aria-label': this.props.sublabel,
316
+ }, maxWidth: this._innerRadius * 2, wrapContent: this._wrapContent }))))),
317
+ this._renderLegends(),
318
+ !this.props.hideTooltip && this.state.isCalloutVisible && (React.createElement(Callout, __assign({ target: this.state.calloutTarget, directionalHint: DirectionalHint.topAutoEdge, gapSpace: 15, isBeakVisible: false, onDismiss: this._handleCalloutDismiss }, this.props.calloutProps), this._multiValueCallout({
319
+ hoverXValue: this.state.hoverXValue,
320
+ YValueHover: this.state.hoverYValues,
321
+ })))));
322
+ };
323
+ GaugeChartBase.prototype._yValueHoverSubCountsExists = function (yValueHover) {
324
+ if (yValueHover) {
325
+ return yValueHover.some(function (yValue) { return yValue.yAxisCalloutData && typeof yValue.yAxisCalloutData !== 'string'; });
326
+ }
327
+ return false;
328
+ };
329
+ GaugeChartBase.prototype._getCalloutContent = function (xValue, index, yValueHoverSubCountsExists, isLast) {
330
+ var marginStyle = isLast ? {} : { marginRight: '16px' };
331
+ var toDrawShape = xValue.index !== undefined && xValue.index !== -1;
332
+ var _classNames = getClassNames(this.props.styles, {
333
+ theme: this.props.theme,
334
+ lineColor: xValue.color,
335
+ toDrawShape: toDrawShape,
336
+ });
337
+ var culture = this.props.culture;
338
+ var yValue = convertToLocaleString(xValue.y, culture);
339
+ if (!xValue.yAxisCalloutData || typeof xValue.yAxisCalloutData === 'string') {
340
+ return (React.createElement("div", { style: yValueHoverSubCountsExists ? marginStyle : {} },
341
+ yValueHoverSubCountsExists && (React.createElement("div", { className: "ms-fontWeight-semibold", style: { fontSize: '12pt' } },
342
+ xValue.legend,
343
+ " (",
344
+ yValue,
345
+ ")")),
346
+ React.createElement("div", { id: "".concat(index, "_").concat(xValue.y), className: _classNames.calloutBlockContainer },
347
+ toDrawShape && (React.createElement(Shape, { svgProps: {
348
+ className: _classNames.shapeStyles,
349
+ }, pathProps: { fill: xValue.color }, shape: Points[xValue.index % Object.keys(pointTypes).length] })),
350
+ React.createElement("div", null,
351
+ React.createElement("div", { className: _classNames.calloutlegendText },
352
+ " ",
353
+ xValue.legend),
354
+ React.createElement("div", { className: _classNames.calloutContentY }, convertToLocaleString(xValue.yAxisCalloutData ? xValue.yAxisCalloutData : xValue.y || xValue.data, culture))))));
355
+ }
356
+ else {
357
+ var subcounts_1 = xValue.yAxisCalloutData;
358
+ return (React.createElement("div", { style: marginStyle },
359
+ React.createElement("div", { className: "ms-fontWeight-semibold", style: { fontSize: '12pt' } },
360
+ xValue.legend,
361
+ " (",
362
+ yValue,
363
+ ")"),
364
+ Object.keys(subcounts_1).map(function (subcountName) {
365
+ return (React.createElement("div", { key: subcountName, className: _classNames.calloutBlockContainer },
366
+ React.createElement("div", { className: _classNames.calloutlegendText },
367
+ " ",
368
+ convertToLocaleString(subcountName, culture)),
369
+ React.createElement("div", { className: _classNames.calloutContentY }, convertToLocaleString(subcounts_1[subcountName], culture))));
370
+ })));
371
+ }
372
+ };
373
+ return GaugeChartBase;
374
+ }(React.Component));
375
+ export { GaugeChartBase };
376
+ //# sourceMappingURL=GaugeChart.base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GaugeChart.base.js","sourceRoot":"../src/","sources":["components/GaugeChart/GaugeChart.base.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport * as shape from 'd3-shape';\nimport { classNamesFunction, getRTL } from '@fluentui/react/lib/Utilities';\nimport {\n IGaugeChartProps,\n IGaugeChartSegment,\n IGaugeChartStyleProps,\n IGaugeChartStyles,\n GaugeValueFormat,\n} from './GaugeChart.types';\nimport { IProcessedStyleSet } from '@fluentui/react/lib/Styling';\nimport {\n Points,\n convertToLocaleString,\n formatValueWithSIPrefix,\n getAccessibleDataObject,\n getColorFromToken,\n getNextColor,\n pointTypes,\n} from '../../utilities/index';\nimport { ILegend, LegendShape, Legends, Shape } from '../Legends/index';\nimport { FocusZone, FocusZoneDirection } from '@fluentui/react-focus';\nimport { Callout, DirectionalHint } from '@fluentui/react/lib/Callout';\nimport { IYValueHover } from '../../index';\nimport { SVGTooltipText } from '../../utilities/SVGTooltipText';\nimport { select as d3Select } from 'd3-selection';\n\nconst GAUGE_MARGIN = 16;\nconst LABEL_WIDTH = 36;\nconst LABEL_HEIGHT = 16;\nconst LABEL_OFFSET = 4;\nconst TITLE_OFFSET = 11;\nconst EXTRA_NEEDLE_LENGTH = 4;\nexport const ARC_PADDING = 2;\nexport const BREAKPOINTS = [\n { minRadius: 52, arcWidth: 12, fontSize: 20 },\n { minRadius: 70, arcWidth: 16, fontSize: 24 },\n { minRadius: 88, arcWidth: 20, fontSize: 32 },\n { minRadius: 106, arcWidth: 24, fontSize: 32 },\n { minRadius: 124, arcWidth: 28, fontSize: 40 },\n { minRadius: 142, arcWidth: 32, fontSize: 40 },\n];\n\nconst getClassNames = classNamesFunction<IGaugeChartStyleProps, IGaugeChartStyles>();\n\ninterface IYValue extends Omit<IYValueHover, 'y'> {\n y?: string | number;\n}\nexport interface IGaugeChartState {\n hoveredLegend: string;\n selectedLegend: string;\n focusedElement?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n calloutTarget: any;\n isCalloutVisible: boolean;\n hoverXValue: string | number;\n hoverYValues: IYValue[];\n width: number;\n height: number;\n}\n\nexport class GaugeChartBase extends React.Component<IGaugeChartProps, IGaugeChartState> {\n private _classNames: IProcessedStyleSet<IGaugeChartStyles>;\n private _isRTL: boolean;\n private _innerRadius: number;\n private _outerRadius: number;\n private _minValue: number;\n private _segments: IGaugeChartSegment[];\n private _sweepFraction: number[];\n private _calloutAnchor: string;\n private _rootElem: HTMLDivElement | null;\n private _margins: { left: number; right: number; top: number; bottom: number };\n private _legendsHeight: number;\n\n constructor(props: IGaugeChartProps) {\n super(props);\n\n this._margins = this._getMargins();\n this._legendsHeight = !this.props.hideLegend ? 24 : 0;\n\n this.state = {\n hoveredLegend: '',\n selectedLegend: '',\n focusedElement: '',\n calloutTarget: null,\n isCalloutVisible: false,\n hoverXValue: '',\n hoverYValues: [],\n width: 140 + this._margins.left + this._margins.right,\n height: 70 + this._margins.top + this._margins.bottom + this._legendsHeight,\n };\n\n this._isRTL = getRTL();\n this._calloutAnchor = '';\n }\n\n public componentDidMount(): void {\n if (this._rootElem) {\n this.setState({\n width: this._rootElem.clientWidth,\n height: this._rootElem.clientHeight,\n });\n }\n }\n\n public render(): React.ReactNode {\n this._margins = this._getMargins();\n this._legendsHeight = !this.props.hideLegend ? 24 : 0;\n\n const width = this.props.width || this.state.width;\n const height = this.props.height || this.state.height;\n\n this._outerRadius = Math.min(\n (width - (this._margins.left + this._margins.right)) / 2,\n height - (this._margins.top + this._margins.bottom + this._legendsHeight),\n );\n\n const { arcWidth, chartValueSize } = this._getStylesBasedOnBreakpoint();\n this._innerRadius = this._outerRadius - arcWidth;\n\n const { minValue, maxValue, segments, arcs } = this._initProps();\n this._minValue = minValue;\n this._segments = segments;\n this._sweepFraction = [this.props.chartValue - this._minValue, maxValue - this._minValue];\n\n this._classNames = getClassNames(this.props.styles!, {\n theme: this.props.theme!,\n className: this.props.className,\n chartWidth: width,\n chartHeight: height - this._legendsHeight,\n chartValueSize,\n });\n\n return (\n <div className={this._classNames.root} ref={el => (this._rootElem = el)}>\n <FocusZone direction={FocusZoneDirection.horizontal}>\n <svg\n className={this._classNames.chart}\n role=\"presentation\"\n aria-label={`This is a gauge chart with ${this._segments.length} section represented.`}\n onMouseLeave={this._handleMouseOut}\n >\n <g transform={`translate(${width / 2}, ${height - (this._margins.bottom + this._legendsHeight)})`}>\n {this.props.chartTitle && (\n <text\n x={0}\n y={-(this._outerRadius + TITLE_OFFSET)}\n textAnchor=\"middle\"\n className={this._classNames.chartTitle}\n >\n {this.props.chartTitle}\n </text>\n )}\n {!this.props.hideMinMax && (\n <>\n <text\n x={(this._isRTL ? 1 : -1) * (this._outerRadius + LABEL_OFFSET)}\n y={0}\n textAnchor=\"end\"\n className={this._classNames.limits}\n role=\"img\"\n aria-label={`Min value: ${this._minValue}`}\n >\n {formatValueWithSIPrefix(this._minValue)}\n </text>\n <text\n x={(this._isRTL ? -1 : 1) * (this._outerRadius + LABEL_OFFSET)}\n y={0}\n textAnchor=\"start\"\n className={this._classNames.limits}\n role=\"img\"\n aria-label={`Max value: ${maxValue}`}\n >\n {formatValueWithSIPrefix(maxValue)}\n </text>\n </>\n )}\n {arcs.map((arc, index) => (\n <path\n key={index}\n d={arc.d}\n fill={this._segments[arc.segmentIndex].color}\n fillOpacity={\n this._legendHighlighted(this._segments[arc.segmentIndex].legend) || this._noLegendHighlighted()\n ? 1\n : 0.1\n }\n strokeWidth={this.state.focusedElement === this._segments[arc.segmentIndex].legend ? ARC_PADDING : 0}\n className={this._classNames.segment}\n {...getAccessibleDataObject(\n {\n ariaLabel: `${this._segments[arc.segmentIndex].legend}, ${\n this._segments[arc.segmentIndex].size\n } out of ${maxValue - this._minValue} or ${(\n (this._segments[arc.segmentIndex].size / (maxValue - this._minValue)) *\n 100\n ).toFixed()}%`,\n ...this._segments[arc.segmentIndex].accessibilityData,\n },\n 'img',\n true,\n )}\n onFocus={e => this._handleFocus(e, this._segments[arc.segmentIndex].legend)}\n onBlur={this._handleBlur}\n onMouseEnter={e => this._handleMouseOver(e, this._segments[arc.segmentIndex].legend)}\n onMouseMove={e => this._handleMouseOver(e, this._segments[arc.segmentIndex].legend)}\n />\n ))}\n {this._renderNeedle()}\n <g\n onMouseEnter={e => this._handleMouseOver(e, 'Chart value')}\n onMouseMove={e => this._handleMouseOver(e, 'Chart value')}\n >\n <SVGTooltipText\n content={\n typeof this.props.chartValueFormat === 'function'\n ? this.props.chartValueFormat(this._sweepFraction)\n : this.props.chartValueFormat === GaugeValueFormat.Fraction\n ? `${this._sweepFraction[0]}/${this._sweepFraction[1]}`\n : `${((this._sweepFraction[0] / this._sweepFraction[1]) * 100).toFixed()}%`\n }\n textProps={{\n x: 0,\n y: 0,\n textAnchor: 'middle',\n className: this._classNames.chartValue,\n role: 'img',\n 'aria-label': `Current value: ${this._sweepFraction[0]} out of ${this._sweepFraction[1]}, or ${(\n (this._sweepFraction[0] / this._sweepFraction[1]) *\n 100\n ).toFixed()}%`,\n }}\n maxWidth={this._innerRadius * 2 - 24}\n wrapContent={this._wrapContent}\n />\n </g>\n {this.props.sublabel && (\n <SVGTooltipText\n content={this.props.sublabel}\n textProps={{\n x: 0,\n y: 4,\n textAnchor: 'middle',\n dominantBaseline: 'hanging',\n className: this._classNames.sublabel,\n role: 'img',\n 'aria-label': this.props.sublabel,\n }}\n maxWidth={this._innerRadius * 2}\n wrapContent={this._wrapContent}\n />\n )}\n </g>\n </svg>\n </FocusZone>\n {this._renderLegends()}\n {!this.props.hideTooltip && this.state.isCalloutVisible && (\n <Callout\n target={this.state.calloutTarget}\n directionalHint={DirectionalHint.topAutoEdge}\n gapSpace={15}\n isBeakVisible={false}\n onDismiss={this._handleCalloutDismiss}\n {...this.props.calloutProps}\n >\n {this._multiValueCallout({\n hoverXValue: this.state.hoverXValue,\n YValueHover: this.state.hoverYValues,\n })}\n </Callout>\n )}\n </div>\n );\n }\n\n private _getMargins = () => {\n const { hideMinMax, chartTitle, sublabel } = this.props;\n\n return {\n left: (!hideMinMax ? LABEL_OFFSET + LABEL_WIDTH : 0) + GAUGE_MARGIN,\n right: (!hideMinMax ? LABEL_OFFSET + LABEL_WIDTH : 0) + GAUGE_MARGIN,\n top: (chartTitle ? TITLE_OFFSET + LABEL_HEIGHT : EXTRA_NEEDLE_LENGTH / 2) + GAUGE_MARGIN,\n bottom: (sublabel ? LABEL_OFFSET + LABEL_HEIGHT : 0) + GAUGE_MARGIN,\n };\n };\n\n private _getStylesBasedOnBreakpoint = () => {\n for (let index = BREAKPOINTS.length - 1; index >= 0; index -= 1) {\n if (this._outerRadius >= BREAKPOINTS[index].minRadius) {\n return {\n arcWidth: BREAKPOINTS[index].arcWidth,\n chartValueSize: BREAKPOINTS[index].fontSize,\n };\n }\n }\n return {\n arcWidth: BREAKPOINTS[0].arcWidth,\n chartValueSize: BREAKPOINTS[0].fontSize,\n };\n };\n\n private _initProps = () => {\n const { minValue = 0, maxValue, theme } = this.props;\n const segments = Array.from(this.props.segments);\n\n let total = minValue;\n segments.forEach((segment, index) => {\n total += segment.size;\n segment.color =\n typeof segment.color !== 'undefined'\n ? getColorFromToken(segment.color, theme!.isInverted)\n : getNextColor(index, 0, theme!.isInverted);\n });\n if (typeof maxValue !== 'undefined' && total < maxValue) {\n segments.push({\n legend: 'Unknown',\n size: maxValue - total,\n color: theme!.palette.neutralLight,\n });\n total = maxValue;\n }\n\n const arcGenerator = shape\n .arc()\n .padAngle(ARC_PADDING / this._outerRadius)\n .padRadius(this._outerRadius);\n const rtlSafeSegments = this._isRTL ? Array.from(segments).reverse() : segments;\n let prevAngle = -Math.PI / 2;\n const arcs = rtlSafeSegments.map((segment, index) => {\n const endAngle = prevAngle + (segment.size / (total - minValue)) * Math.PI;\n const d = arcGenerator({\n innerRadius: this._innerRadius,\n outerRadius: this._outerRadius,\n startAngle: prevAngle,\n endAngle,\n })!;\n prevAngle = endAngle;\n return {\n d,\n segmentIndex: this._isRTL ? segments.length - 1 - index : index,\n };\n });\n\n return {\n minValue,\n maxValue: total,\n segments,\n arcs,\n };\n };\n\n private _renderNeedle = () => {\n const needleRotation = (this._sweepFraction[0] / this._sweepFraction[1]) * 180;\n const rtlSafeNeedleRotation = this._isRTL ? 180 - needleRotation : needleRotation;\n const strokeWidth = 2;\n const halfStrokeWidth = strokeWidth / 2;\n const needleLength = this._outerRadius - this._innerRadius + EXTRA_NEEDLE_LENGTH;\n\n return (\n <g transform={`rotate(${rtlSafeNeedleRotation}, 0, 0)`}>\n <path\n d={`\n M 0,${-halfStrokeWidth - 3}\n L ${-needleLength},${-halfStrokeWidth - 1}\n A ${halfStrokeWidth + 1},${halfStrokeWidth + 1},0,0,0,${-needleLength},${halfStrokeWidth + 1}\n L 0,${halfStrokeWidth + 3}\n A ${halfStrokeWidth + 3},${halfStrokeWidth + 3},0,0,0,0,${-halfStrokeWidth - 3}\n `}\n strokeWidth={strokeWidth}\n className={this._classNames.needle}\n transform={`translate(${-this._innerRadius + EXTRA_NEEDLE_LENGTH / 2})`}\n data-is-focusable={true}\n onFocus={e => this._handleFocus(e, 'Needle')}\n onBlur={this._handleBlur}\n onMouseEnter={e => this._handleMouseOver(e, 'Needle')}\n onMouseMove={e => this._handleMouseOver(e, 'Needle')}\n />\n </g>\n );\n };\n\n private _renderLegends = () => {\n if (this.props.hideLegend) {\n return null;\n }\n\n const legends: ILegend[] = this._segments.map(segment => {\n return {\n title: segment.legend,\n color: segment.color!,\n action: () => {\n if (this.state.selectedLegend === segment.legend) {\n this.setState({ selectedLegend: '' });\n } else {\n this.setState({ selectedLegend: segment.legend });\n }\n },\n hoverAction: () => {\n this.setState({ hoveredLegend: segment.legend });\n },\n onMouseOutAction: () => {\n this.setState({ hoveredLegend: '' });\n },\n };\n });\n\n return (\n <div className={this._classNames.legendsContainer}>\n <Legends legends={legends} centerLegends {...this.props.legendProps} />\n </div>\n );\n };\n\n /**\n * This function checks if the given legend is highlighted or not.\n * A legend can be highlighted in 2 ways:\n * 1. selection: if the user clicks on it\n * 2. hovering: if there is no selected legend and the user hovers over it\n */\n private _legendHighlighted = (legend: string) => {\n return (\n this.state.selectedLegend === legend || (this.state.selectedLegend === '' && this.state.hoveredLegend === legend)\n );\n };\n\n /**\n * This function checks if none of the legends is selected or hovered.\n */\n private _noLegendHighlighted = () => {\n return this.state.selectedLegend === '' && this.state.hoveredLegend === '';\n };\n\n private _handleFocus = (focusEvent: React.FocusEvent<SVGElement>, focusedElement: string) => {\n this._showCallout(focusEvent.target, focusedElement, true);\n };\n\n private _handleBlur = () => {\n this._hideCallout(true);\n };\n\n private _handleMouseOver = (mouseEvent: React.MouseEvent<SVGElement>, hoveredElement: string) => {\n this._showCallout(mouseEvent.target, hoveredElement, false);\n };\n\n private _handleMouseOut = () => {\n this._hideCallout(false);\n };\n\n private _handleCalloutDismiss = () => {\n this._hideCallout(false);\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _showCallout = (target: any, legend: string, isFocusEvent: boolean) => {\n if (this._calloutAnchor === legend) {\n return;\n }\n\n this._calloutAnchor = legend;\n const hoverXValue: string =\n 'Current value is ' +\n (this.props.chartValueFormat === GaugeValueFormat.Fraction\n ? `${((this._sweepFraction[0] / this._sweepFraction[1]) * 100).toFixed()}%`\n : `${this._sweepFraction[0]}/${this._sweepFraction[1]}`);\n let total = this._minValue;\n const hoverYValues: IYValue[] = this._segments.map((segment, index) => {\n const yValue: IYValue = {\n legend: segment.legend,\n y: `${total + (index > 0 ? 1 : 0)} - ${total + segment.size}`,\n color: segment.color,\n };\n total += segment.size;\n return yValue;\n });\n this.setState({\n calloutTarget: target,\n /** Show the callout if highlighted arc is hovered/focused and Hide it if unhighlighted arc is hovered/focused */\n isCalloutVisible:\n ['Needle', 'Chart value'].includes(legend) ||\n this.state.selectedLegend === '' ||\n this.state.selectedLegend === legend,\n hoverXValue,\n hoverYValues,\n ...(isFocusEvent ? { focusedElement: legend } : {}),\n });\n };\n\n private _hideCallout = (isBlurEvent?: boolean) => {\n this._calloutAnchor = '';\n this.setState({\n calloutTarget: null,\n isCalloutVisible: false,\n hoverXValue: '',\n hoverYValues: [],\n ...(isBlurEvent ? { focusedElement: '' } : {}),\n });\n };\n\n private _wrapContent = (content: string, id: string, maxWidth: number) => {\n const textElement = d3Select<SVGTextElement, {}>(`#${id}`);\n textElement.text(content);\n if (!textElement.node()) {\n return false;\n }\n\n let isOverflowing = false;\n let textLength = textElement.node()!.getComputedTextLength();\n while (textLength > maxWidth && content.length > 0) {\n content = content.slice(0, -1);\n textElement.text(content + '...');\n isOverflowing = true;\n textLength = textElement.node()!.getComputedTextLength();\n }\n return isOverflowing;\n };\n\n // TO DO: Write a common functional component for Multi value callout and divide sub count method\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _multiValueCallout = (calloutProps: any) => {\n const yValueHoverSubCountsExists: boolean = this._yValueHoverSubCountsExists(calloutProps.YValueHover);\n return (\n <div className={this._classNames.calloutContentRoot}>\n <div\n className={this._classNames.calloutDateTimeContainer}\n style={yValueHoverSubCountsExists ? { marginBottom: '11px' } : {}}\n >\n <div\n className={this._classNames.calloutContentX}\n {...getAccessibleDataObject(calloutProps!.xAxisCalloutAccessibilityData, 'text', false)}\n >\n {convertToLocaleString(calloutProps!.hoverXValue, this.props.culture)}\n </div>\n </div>\n <div\n className={this._classNames.calloutInfoContainer}\n style={yValueHoverSubCountsExists ? { display: 'flex' } : {}}\n >\n {calloutProps!.YValueHover &&\n calloutProps!.YValueHover.map((yValue: IYValueHover, index: number, yValues: IYValueHover[]) => {\n const isLast: boolean = index + 1 === yValues.length;\n const { shouldDrawBorderBottom = false } = yValue;\n return (\n <div\n {...getAccessibleDataObject(yValue.callOutAccessibilityData, 'text', false)}\n key={`callout-content-${index}`}\n style={\n yValueHoverSubCountsExists\n ? {\n display: 'inline-block',\n ...(shouldDrawBorderBottom && {\n borderBottom: `1px solid ${this.props.theme!.semanticColors.menuDivider}`,\n paddingBottom: '10px',\n }),\n }\n : {\n ...(shouldDrawBorderBottom && {\n borderBottom: `1px solid ${this.props.theme!.semanticColors.menuDivider}`,\n paddingBottom: '10px',\n }),\n }\n }\n >\n {this._getCalloutContent(yValue, index, yValueHoverSubCountsExists, isLast)}\n </div>\n );\n })}\n {!!calloutProps.descriptionMessage && (\n <div className={this._classNames.descriptionMessage}>{calloutProps.descriptionMessage}</div>\n )}\n </div>\n </div>\n );\n };\n\n private _yValueHoverSubCountsExists(yValueHover?: IYValueHover[]) {\n if (yValueHover) {\n return yValueHover.some(\n (yValue: {\n legend?: string;\n y?: number;\n color?: string;\n yAxisCalloutData?: string | { [id: string]: number };\n }) => yValue.yAxisCalloutData && typeof yValue.yAxisCalloutData !== 'string',\n );\n }\n return false;\n }\n\n private _getCalloutContent(\n xValue: IYValueHover,\n index: number,\n yValueHoverSubCountsExists: boolean,\n isLast: boolean,\n ): React.ReactNode {\n const marginStyle: React.CSSProperties = isLast ? {} : { marginRight: '16px' };\n const toDrawShape = xValue.index !== undefined && xValue.index !== -1;\n const _classNames = getClassNames(this.props.styles!, {\n theme: this.props.theme!,\n lineColor: xValue.color,\n toDrawShape,\n });\n\n const { culture } = this.props;\n const yValue = convertToLocaleString(xValue.y, culture);\n if (!xValue.yAxisCalloutData || typeof xValue.yAxisCalloutData === 'string') {\n return (\n <div style={yValueHoverSubCountsExists ? marginStyle : {}}>\n {yValueHoverSubCountsExists && (\n <div className=\"ms-fontWeight-semibold\" style={{ fontSize: '12pt' }}>\n {xValue.legend!} ({yValue})\n </div>\n )}\n <div id={`${index}_${xValue.y}`} className={_classNames.calloutBlockContainer}>\n {toDrawShape && (\n <Shape\n svgProps={{\n className: _classNames.shapeStyles,\n }}\n pathProps={{ fill: xValue.color }}\n shape={Points[xValue.index! % Object.keys(pointTypes).length] as LegendShape}\n />\n )}\n <div>\n <div className={_classNames.calloutlegendText}> {xValue.legend}</div>\n <div className={_classNames.calloutContentY}>\n {convertToLocaleString(\n xValue.yAxisCalloutData ? xValue.yAxisCalloutData : xValue.y || xValue.data,\n culture,\n )}\n </div>\n </div>\n </div>\n </div>\n );\n } else {\n const subcounts: { [id: string]: number } = xValue.yAxisCalloutData as { [id: string]: number };\n return (\n <div style={marginStyle}>\n <div className=\"ms-fontWeight-semibold\" style={{ fontSize: '12pt' }}>\n {xValue.legend!} ({yValue})\n </div>\n {Object.keys(subcounts).map((subcountName: string) => {\n return (\n <div key={subcountName} className={_classNames.calloutBlockContainer}>\n <div className={_classNames.calloutlegendText}> {convertToLocaleString(subcountName, culture)}</div>\n <div className={_classNames.calloutContentY}>\n {convertToLocaleString(subcounts[subcountName], culture)}\n </div>\n </div>\n );\n })}\n </div>\n );\n }\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import * as React from 'react';
2
+ import { IGaugeChartProps } from './GaugeChart.types';
3
+ export declare const GaugeChart: React.FunctionComponent<IGaugeChartProps>;
@@ -0,0 +1,5 @@
1
+ import { styled } from '@fluentui/react';
2
+ import { GaugeChartBase } from './GaugeChart.base';
3
+ import { getStyles } from './GaugeChart.styles';
4
+ export var GaugeChart = styled(GaugeChartBase, getStyles);
5
+ //# sourceMappingURL=GaugeChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GaugeChart.js","sourceRoot":"../src/","sources":["components/GaugeChart/GaugeChart.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,CAAC,IAAM,UAAU,GAA8C,MAAM,CAIzE,cAAc,EAAE,SAAS,CAAC,CAAC","sourcesContent":["import { styled } from '@fluentui/react';\nimport * as React from 'react';\nimport { GaugeChartBase } from './GaugeChart.base';\nimport { getStyles } from './GaugeChart.styles';\nimport { IGaugeChartProps, IGaugeChartStyleProps, IGaugeChartStyles } from './GaugeChart.types';\n\nexport const GaugeChart: React.FunctionComponent<IGaugeChartProps> = styled<\n IGaugeChartProps,\n IGaugeChartStyleProps,\n IGaugeChartStyles\n>(GaugeChartBase, getStyles);\n"]}
@@ -0,0 +1,2 @@
1
+ import { IGaugeChartStyleProps, IGaugeChartStyles } from './GaugeChart.types';
2
+ export declare const getStyles: (props: IGaugeChartStyleProps) => IGaugeChartStyles;