@gravity-ui/chartkit 5.10.0 → 5.10.2
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/plugins/highcharts/renderer/components/HighchartsComponent.d.ts +1 -0
- package/build/plugins/highcharts/renderer/components/HighchartsComponent.js +7 -7
- package/build/plugins/highcharts/renderer/components/HighchartsReact.d.ts +2 -0
- package/build/plugins/highcharts/renderer/components/HighchartsReact.js +21 -0
- package/build/plugins/highcharts/renderer/components/useElementSize.d.ts +6 -0
- package/build/plugins/highcharts/renderer/components/useElementSize.js +50 -0
- package/build/plugins/highcharts/renderer/helpers/config/config.js +8 -2
- package/package.json +1 -1
|
@@ -103,12 +103,7 @@ export class HighchartsComponent extends React.PureComponent {
|
|
|
103
103
|
});
|
|
104
104
|
}
|
|
105
105
|
componentDidUpdate() {
|
|
106
|
-
|
|
107
|
-
const needRenderCallback = this.props.onRender && !this.state.isError && !this.props.splitTooltip;
|
|
108
|
-
if (needRenderCallback) {
|
|
109
|
-
(_b = (_a = this.props).onRender) === null || _b === void 0 ? void 0 : _b.call(_a, {
|
|
110
|
-
renderTime: getChartPerformanceDuration(this.getId()),
|
|
111
|
-
});
|
|
106
|
+
if (this.needRenderCallback()) {
|
|
112
107
|
const widget = this.chartComponent.current ? this.chartComponent.current.chart : null;
|
|
113
108
|
if (this.state.callback && widget) {
|
|
114
109
|
this.state.callback(widget);
|
|
@@ -124,7 +119,7 @@ export class HighchartsComponent extends React.PureComponent {
|
|
|
124
119
|
return null;
|
|
125
120
|
}
|
|
126
121
|
markChartPerformance(this.getId(true));
|
|
127
|
-
return (React.createElement(Component, { key: Math.random(), options: options, highcharts: Highcharts, onSplitPaneMountCallback: this.state.callback || undefined, onSplitPaneOrientationChange: this.props.onSplitPaneOrientationChange, paneSplitOrientation: this.props.paneSplitOrientation, callback: this.extendChartInstance, constructorType: (options === null || options === void 0 ? void 0 : options.useHighStock) ? 'stockChart' : 'chart', containerProps: { className: 'chartkit-graph' }, ref: this.chartComponent }));
|
|
122
|
+
return (React.createElement(Component, { key: Math.random(), options: options, highcharts: Highcharts, onSplitPaneMountCallback: this.state.callback || undefined, onSplitPaneOrientationChange: this.props.onSplitPaneOrientationChange, paneSplitOrientation: this.props.paneSplitOrientation, callback: this.extendChartInstance, constructorType: (options === null || options === void 0 ? void 0 : options.useHighStock) ? 'stockChart' : 'chart', containerProps: { className: 'chartkit-graph' }, ref: this.chartComponent, onRender: this.needRenderCallback() && this.props.onRender }));
|
|
128
123
|
}
|
|
129
124
|
getId(refresh = false) {
|
|
130
125
|
if (refresh) {
|
|
@@ -149,6 +144,11 @@ export class HighchartsComponent extends React.PureComponent {
|
|
|
149
144
|
window.requestAnimationFrame(this.reflow);
|
|
150
145
|
}
|
|
151
146
|
}
|
|
147
|
+
needRenderCallback() {
|
|
148
|
+
const { splitTooltip, onRender } = this.props;
|
|
149
|
+
const { isError } = this.state;
|
|
150
|
+
return !splitTooltip && onRender && !isError;
|
|
151
|
+
}
|
|
152
152
|
}
|
|
153
153
|
HighchartsComponent.defaultProps = {
|
|
154
154
|
hoistConfigError: true,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import Highcharts from 'highcharts';
|
|
3
|
+
import type { ChartKitProps } from '../../../../types';
|
|
3
4
|
interface HighchartsReactRefObject {
|
|
4
5
|
chart: Highcharts.Chart | null | undefined;
|
|
5
6
|
container: React.RefObject<HTMLDivElement | undefined>;
|
|
@@ -13,6 +14,7 @@ interface HighchartsReactProps {
|
|
|
13
14
|
highcharts?: typeof Highcharts;
|
|
14
15
|
options: Highcharts.Options;
|
|
15
16
|
callback?: Highcharts.ChartCallbackFunction;
|
|
17
|
+
onRender?: ChartKitProps<any>['onRender'];
|
|
16
18
|
}
|
|
17
19
|
export declare const HighchartsReact: React.ForwardRefExoticComponent<React.PropsWithoutRef<HighchartsReactProps> & React.RefAttributes<HighchartsReactRefObject>>;
|
|
18
20
|
export default HighchartsReact;
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
/* eslint no-console: ["error", { allow: ["warn", "error"]}] */
|
|
2
2
|
import React from 'react';
|
|
3
|
+
import afterFrame from 'afterframe';
|
|
4
|
+
import { measurePerformance } from '../../../../utils';
|
|
5
|
+
import { useElementSize } from './useElementSize';
|
|
3
6
|
const useIsomorphicLayoutEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;
|
|
4
7
|
export const HighchartsReact = React.memo(React.forwardRef(function HighchartsReact(props, ref) {
|
|
8
|
+
const { onRender } = props;
|
|
5
9
|
const containerRef = React.useRef(null);
|
|
6
10
|
const chartRef = React.useRef();
|
|
11
|
+
const { width, height } = useElementSize(containerRef);
|
|
12
|
+
const performanceMeasure = React.useRef(measurePerformance());
|
|
7
13
|
useIsomorphicLayoutEffect(() => {
|
|
8
14
|
function createChart() {
|
|
9
15
|
const { highcharts: HighchartsComponent } = props;
|
|
@@ -47,6 +53,21 @@ export const HighchartsReact = React.memo(React.forwardRef(function HighchartsRe
|
|
|
47
53
|
},
|
|
48
54
|
container: containerRef,
|
|
49
55
|
}), []);
|
|
56
|
+
React.useLayoutEffect(() => {
|
|
57
|
+
if (width && height) {
|
|
58
|
+
if (!performanceMeasure.current) {
|
|
59
|
+
performanceMeasure.current = measurePerformance();
|
|
60
|
+
}
|
|
61
|
+
afterFrame(() => {
|
|
62
|
+
var _a;
|
|
63
|
+
const renderTime = (_a = performanceMeasure.current) === null || _a === void 0 ? void 0 : _a.end();
|
|
64
|
+
if (typeof renderTime === 'number') {
|
|
65
|
+
onRender === null || onRender === void 0 ? void 0 : onRender({ renderTime });
|
|
66
|
+
}
|
|
67
|
+
performanceMeasure.current = null;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}, [width, height, onRender]);
|
|
50
71
|
return React.createElement("div", Object.assign({}, props.containerProps, { ref: containerRef }));
|
|
51
72
|
}));
|
|
52
73
|
HighchartsReact.displayName = 'HighchartsReact';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface UseElementSizeResult {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function useElementSize<T extends HTMLElement = HTMLDivElement>(ref: React.MutableRefObject<T | null> | null, key?: string): UseElementSizeResult;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import debounce from 'lodash/debounce';
|
|
3
|
+
import round from 'lodash/round';
|
|
4
|
+
const RESIZE_DEBOUNCE = 200;
|
|
5
|
+
const ROUND_PRESICION = 2;
|
|
6
|
+
export function useElementSize(ref,
|
|
7
|
+
// can be used, when it is needed to force reassign observer to element
|
|
8
|
+
// in order to get correct measures. might be related to below
|
|
9
|
+
// https://github.com/WICG/resize-observer/issues/65
|
|
10
|
+
key) {
|
|
11
|
+
const [size, setSize] = React.useState({
|
|
12
|
+
width: 0,
|
|
13
|
+
height: 0,
|
|
14
|
+
});
|
|
15
|
+
React.useLayoutEffect(() => {
|
|
16
|
+
if (!(ref === null || ref === void 0 ? void 0 : ref.current)) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const handleResize = (entries) => {
|
|
20
|
+
if (!Array.isArray(entries)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const entry = entries[0];
|
|
24
|
+
if (entry && entry.borderBoxSize) {
|
|
25
|
+
const borderBoxSize = entry.borderBoxSize[0]
|
|
26
|
+
? entry.borderBoxSize[0]
|
|
27
|
+
: entry.borderBoxSize;
|
|
28
|
+
// ...but old versions of Firefox treat it as a single item
|
|
29
|
+
// https://github.com/mdn/dom-examples/blob/main/resize-observer/resize-observer-text.html#L88
|
|
30
|
+
setSize({
|
|
31
|
+
width: round(borderBoxSize.inlineSize, ROUND_PRESICION),
|
|
32
|
+
height: round(borderBoxSize.blockSize, ROUND_PRESICION),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
else if (entry) {
|
|
36
|
+
const target = entry.target;
|
|
37
|
+
setSize({
|
|
38
|
+
width: round(target.offsetWidth, ROUND_PRESICION),
|
|
39
|
+
height: round(target.offsetHeight, ROUND_PRESICION),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const observer = new ResizeObserver(debounce(handleResize, RESIZE_DEBOUNCE));
|
|
44
|
+
observer.observe(ref.current);
|
|
45
|
+
return () => {
|
|
46
|
+
observer.disconnect();
|
|
47
|
+
};
|
|
48
|
+
}, [ref, key]);
|
|
49
|
+
return size;
|
|
50
|
+
}
|
|
@@ -423,7 +423,10 @@ function getTooltip(tooltip, options, comments, holidays) {
|
|
|
423
423
|
unsafe: Boolean(options.unsafe),
|
|
424
424
|
};
|
|
425
425
|
if (typeof options.manageTooltipConfig === 'function') {
|
|
426
|
-
|
|
426
|
+
// manageTooltipConfig could accidently break json variable
|
|
427
|
+
// and because of it we create new object as an argument
|
|
428
|
+
const updatedJSON = callManageTooltipConfig(options, Object.assign({}, json), chart);
|
|
429
|
+
merge(json, updatedJSON);
|
|
427
430
|
}
|
|
428
431
|
const usersPointFormat = get(options.highcharts, 'tooltip.pointFormat');
|
|
429
432
|
if (tooltipOptions.pointFormatter || usersPointFormat) {
|
|
@@ -640,7 +643,10 @@ function getTooltip(tooltip, options, comments, holidays) {
|
|
|
640
643
|
delete json.pre_lines;
|
|
641
644
|
if (json.lines && json.lines.length > 0) {
|
|
642
645
|
if (typeof options.manageTooltipConfig === 'function') {
|
|
643
|
-
|
|
646
|
+
// manageTooltipConfig could accidently break json variable
|
|
647
|
+
// and because of it we create new object as an argument
|
|
648
|
+
const updatedJSON = callManageTooltipConfig(options, Object.assign({}, json), chart);
|
|
649
|
+
merge(json, updatedJSON);
|
|
644
650
|
}
|
|
645
651
|
let hiddenRowsSum = 0;
|
|
646
652
|
let maxChartKitPrecision = null;
|
package/package.json
CHANGED