@gravity-ui/charts 1.17.0 → 1.18.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/dist/cjs/components/AxisY/prepare-axis-data.d.ts +2 -1
- package/dist/cjs/components/AxisY/prepare-axis-data.js +7 -6
- package/dist/cjs/components/AxisY/utils.js +1 -10
- package/dist/cjs/components/ChartInner/index.js +10 -5
- package/dist/cjs/components/ChartInner/useChartInnerProps.d.ts +1 -1
- package/dist/cjs/components/ChartInner/useChartInnerProps.js +2 -0
- package/dist/cjs/components/Tooltip/ChartTooltipContent.d.ts +1 -0
- package/dist/cjs/components/Tooltip/ChartTooltipContent.js +2 -2
- package/dist/cjs/components/Tooltip/DefaultTooltipContent/index.d.ts +2 -1
- package/dist/cjs/components/Tooltip/DefaultTooltipContent/index.js +3 -3
- package/dist/cjs/components/Tooltip/DefaultTooltipContent/utils.d.ts +4 -3
- package/dist/cjs/components/Tooltip/DefaultTooltipContent/utils.js +6 -9
- package/dist/cjs/components/Tooltip/index.js +1 -1
- package/dist/cjs/hooks/useAxisScales/index.d.ts +3 -3
- package/dist/cjs/hooks/useAxisScales/index.js +40 -7
- package/dist/cjs/hooks/useChartOptions/index.d.ts +3 -1
- package/dist/cjs/hooks/useChartOptions/index.js +3 -3
- package/dist/cjs/hooks/useChartOptions/tooltip.d.ts +4 -1
- package/dist/cjs/hooks/useChartOptions/tooltip.js +18 -3
- package/dist/cjs/hooks/useChartOptions/x-axis.js +21 -9
- package/dist/cjs/hooks/useChartOptions/y-axis.js +20 -7
- package/dist/cjs/hooks/useCrosshair/index.d.ts +1 -1
- package/dist/cjs/hooks/useCrosshair/index.js +2 -1
- package/dist/cjs/hooks/useShapes/area/prepare-data.d.ts +1 -1
- package/dist/cjs/hooks/useShapes/area/prepare-data.js +3 -0
- package/dist/cjs/hooks/useShapes/bar-x/prepare-data.d.ts +1 -1
- package/dist/cjs/hooks/useShapes/bar-x/prepare-data.js +3 -0
- package/dist/cjs/hooks/useShapes/bar-y/prepare-data.d.ts +1 -1
- package/dist/cjs/hooks/useShapes/bar-y/prepare-data.js +8 -1
- package/dist/cjs/hooks/useShapes/index.d.ts +1 -1
- package/dist/cjs/hooks/useShapes/line/prepare-data.d.ts +1 -1
- package/dist/cjs/hooks/useShapes/line/prepare-data.js +3 -0
- package/dist/cjs/hooks/useShapes/scatter/prepare-data.d.ts +1 -1
- package/dist/cjs/hooks/useShapes/scatter/prepare-data.js +6 -0
- package/dist/cjs/hooks/useShapes/waterfall/prepare-data.d.ts +1 -1
- package/dist/cjs/hooks/useShapes/waterfall/prepare-data.js +6 -3
- package/dist/cjs/hooks/useZoom/index.d.ts +1 -1
- package/dist/cjs/hooks/useZoom/types.d.ts +1 -1
- package/dist/cjs/hooks/useZoom/utils.d.ts +1 -1
- package/dist/cjs/hooks/useZoom/utils.js +22 -10
- package/dist/cjs/types/chart/tooltip.d.ts +3 -0
- package/dist/cjs/utils/chart/array.d.ts +1 -0
- package/dist/cjs/utils/chart/array.js +9 -0
- package/dist/cjs/utils/chart/index.d.ts +1 -0
- package/dist/cjs/utils/chart/index.js +1 -0
- package/dist/cjs/utils/chart/zoom.js +14 -8
- package/dist/esm/components/AxisY/prepare-axis-data.d.ts +2 -1
- package/dist/esm/components/AxisY/prepare-axis-data.js +7 -6
- package/dist/esm/components/AxisY/utils.js +1 -10
- package/dist/esm/components/ChartInner/index.js +10 -5
- package/dist/esm/components/ChartInner/useChartInnerProps.d.ts +1 -1
- package/dist/esm/components/ChartInner/useChartInnerProps.js +2 -0
- package/dist/esm/components/Tooltip/ChartTooltipContent.d.ts +1 -0
- package/dist/esm/components/Tooltip/ChartTooltipContent.js +2 -2
- package/dist/esm/components/Tooltip/DefaultTooltipContent/index.d.ts +2 -1
- package/dist/esm/components/Tooltip/DefaultTooltipContent/index.js +3 -3
- package/dist/esm/components/Tooltip/DefaultTooltipContent/utils.d.ts +4 -3
- package/dist/esm/components/Tooltip/DefaultTooltipContent/utils.js +6 -9
- package/dist/esm/components/Tooltip/index.js +1 -1
- package/dist/esm/hooks/useAxisScales/index.d.ts +3 -3
- package/dist/esm/hooks/useAxisScales/index.js +40 -7
- package/dist/esm/hooks/useChartOptions/index.d.ts +3 -1
- package/dist/esm/hooks/useChartOptions/index.js +3 -3
- package/dist/esm/hooks/useChartOptions/tooltip.d.ts +4 -1
- package/dist/esm/hooks/useChartOptions/tooltip.js +18 -3
- package/dist/esm/hooks/useChartOptions/x-axis.js +21 -9
- package/dist/esm/hooks/useChartOptions/y-axis.js +20 -7
- package/dist/esm/hooks/useCrosshair/index.d.ts +1 -1
- package/dist/esm/hooks/useCrosshair/index.js +2 -1
- package/dist/esm/hooks/useShapes/area/prepare-data.d.ts +1 -1
- package/dist/esm/hooks/useShapes/area/prepare-data.js +3 -0
- package/dist/esm/hooks/useShapes/bar-x/prepare-data.d.ts +1 -1
- package/dist/esm/hooks/useShapes/bar-x/prepare-data.js +3 -0
- package/dist/esm/hooks/useShapes/bar-y/prepare-data.d.ts +1 -1
- package/dist/esm/hooks/useShapes/bar-y/prepare-data.js +8 -1
- package/dist/esm/hooks/useShapes/index.d.ts +1 -1
- package/dist/esm/hooks/useShapes/line/prepare-data.d.ts +1 -1
- package/dist/esm/hooks/useShapes/line/prepare-data.js +3 -0
- package/dist/esm/hooks/useShapes/scatter/prepare-data.d.ts +1 -1
- package/dist/esm/hooks/useShapes/scatter/prepare-data.js +6 -0
- package/dist/esm/hooks/useShapes/waterfall/prepare-data.d.ts +1 -1
- package/dist/esm/hooks/useShapes/waterfall/prepare-data.js +6 -3
- package/dist/esm/hooks/useZoom/index.d.ts +1 -1
- package/dist/esm/hooks/useZoom/types.d.ts +1 -1
- package/dist/esm/hooks/useZoom/utils.d.ts +1 -1
- package/dist/esm/hooks/useZoom/utils.js +22 -10
- package/dist/esm/types/chart/tooltip.d.ts +3 -0
- package/dist/esm/utils/chart/array.d.ts +1 -0
- package/dist/esm/utils/chart/array.js +9 -0
- package/dist/esm/utils/chart/index.d.ts +1 -0
- package/dist/esm/utils/chart/index.js +1 -0
- package/dist/esm/utils/chart/zoom.js +14 -8
- package/package.json +1 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { ChartScale, PreparedAxis, PreparedSplit } from '../../hooks';
|
|
2
2
|
import type { AxisYData } from './types';
|
|
3
|
-
export declare function prepareAxisData({ axis, split, scale, width, height, }: {
|
|
3
|
+
export declare function prepareAxisData({ axis, split, scale, top: topOffset, width, height, }: {
|
|
4
4
|
axis: PreparedAxis;
|
|
5
5
|
split: PreparedSplit;
|
|
6
6
|
scale: ChartScale;
|
|
7
|
+
top: number;
|
|
7
8
|
width: number;
|
|
8
9
|
height: number;
|
|
9
10
|
}): Promise<AxisYData>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getUniqId } from '@gravity-ui/uikit';
|
|
2
2
|
import { calculateCos, calculateSin, getBandsPosition, getLabelFormatter, getLabelsSize, getTextSizeFn, getTextWithElipsis, wrapText, } from '../../utils';
|
|
3
3
|
import { getTickValues } from './utils';
|
|
4
|
-
async function getSvgAxisLabel({ getTextSize, text, axis, top, left, labelMaxHeight, }) {
|
|
4
|
+
async function getSvgAxisLabel({ getTextSize, text, axis, top, left, labelMaxHeight, topOffset, }) {
|
|
5
5
|
var _a;
|
|
6
6
|
const originalTextSize = await getTextSize(text);
|
|
7
7
|
// Currently, a preliminary label calculation is used to build the chart - we cannot exceed it here.
|
|
@@ -17,7 +17,7 @@ async function getSvgAxisLabel({ getTextSize, text, axis, top, left, labelMaxHei
|
|
|
17
17
|
width: labelMaxWidth,
|
|
18
18
|
getTextSize,
|
|
19
19
|
});
|
|
20
|
-
let
|
|
20
|
+
let labelTopOffset = top;
|
|
21
21
|
let newLabelWidth = 0;
|
|
22
22
|
let newLabelHeight = 0;
|
|
23
23
|
for (let textRowIndex = 0; textRowIndex < textRows.length; textRowIndex++) {
|
|
@@ -49,10 +49,10 @@ async function getSvgAxisLabel({ getTextSize, text, axis, top, left, labelMaxHei
|
|
|
49
49
|
content.push({
|
|
50
50
|
text: rowText,
|
|
51
51
|
x,
|
|
52
|
-
y:
|
|
52
|
+
y: labelTopOffset,
|
|
53
53
|
size: textSize,
|
|
54
54
|
});
|
|
55
|
-
|
|
55
|
+
labelTopOffset += textSize.height;
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
content.forEach((row) => {
|
|
@@ -68,7 +68,7 @@ async function getSvgAxisLabel({ getTextSize, text, axis, top, left, labelMaxHei
|
|
|
68
68
|
content.push({
|
|
69
69
|
text,
|
|
70
70
|
x,
|
|
71
|
-
y: Math.max(
|
|
71
|
+
y: Math.max(-topOffset, top - size.height / 2),
|
|
72
72
|
size,
|
|
73
73
|
});
|
|
74
74
|
}
|
|
@@ -81,7 +81,7 @@ async function getSvgAxisLabel({ getTextSize, text, axis, top, left, labelMaxHei
|
|
|
81
81
|
return svgLabel;
|
|
82
82
|
}
|
|
83
83
|
// eslint-disable-next-line complexity
|
|
84
|
-
export async function prepareAxisData({ axis, split, scale, width, height, }) {
|
|
84
|
+
export async function prepareAxisData({ axis, split, scale, top: topOffset, width, height, }) {
|
|
85
85
|
var _a, _b, _c;
|
|
86
86
|
const axisPlotTopPosition = ((_a = split.plots[axis.plotIndex]) === null || _a === void 0 ? void 0 : _a.top) || 0;
|
|
87
87
|
const axisHeight = ((_b = split.plots[axis.plotIndex]) === null || _b === void 0 ? void 0 : _b.height) || height;
|
|
@@ -133,6 +133,7 @@ export async function prepareAxisData({ axis, split, scale, width, height, }) {
|
|
|
133
133
|
top: y,
|
|
134
134
|
left: domainX,
|
|
135
135
|
labelMaxHeight,
|
|
136
|
+
topOffset,
|
|
136
137
|
});
|
|
137
138
|
}
|
|
138
139
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getTicksCount, isBandScale } from '../../utils';
|
|
1
|
+
import { getMinSpaceBetween, getTicksCount, isBandScale } from '../../utils';
|
|
2
2
|
function thinOut(items, delta) {
|
|
3
3
|
const arr = [];
|
|
4
4
|
for (let i = 0; i < items.length; i = i + delta) {
|
|
@@ -6,15 +6,6 @@ function thinOut(items, delta) {
|
|
|
6
6
|
}
|
|
7
7
|
return arr;
|
|
8
8
|
}
|
|
9
|
-
function getMinSpaceBetween(arr, iterator) {
|
|
10
|
-
return arr.reduce((acc, item, index) => {
|
|
11
|
-
const prev = arr[index - 1];
|
|
12
|
-
if (prev) {
|
|
13
|
-
return Math.min(acc, Math.abs(iterator(prev) - iterator(item)));
|
|
14
|
-
}
|
|
15
|
-
return acc;
|
|
16
|
-
}, Infinity);
|
|
17
|
-
}
|
|
18
9
|
export function getTickValues({ scale, axis, labelLineHeight, }) {
|
|
19
10
|
if ('ticks' in scale && typeof scale.ticks === 'function') {
|
|
20
11
|
const range = scale.range();
|
|
@@ -96,6 +96,7 @@ export const ChartInner = (props) => {
|
|
|
96
96
|
const axisData = await prepareAxisData({
|
|
97
97
|
axis,
|
|
98
98
|
scale,
|
|
99
|
+
top: boundsOffsetTop,
|
|
99
100
|
width: boundsWidth,
|
|
100
101
|
height: boundsHeight,
|
|
101
102
|
split: preparedSplit,
|
|
@@ -107,7 +108,7 @@ export const ChartInner = (props) => {
|
|
|
107
108
|
setYAxisDataItems(items);
|
|
108
109
|
}
|
|
109
110
|
})();
|
|
110
|
-
}, [boundsHeight, boundsWidth, preparedSplit, yAxis, yScale]);
|
|
111
|
+
}, [boundsHeight, boundsOffsetTop, boundsWidth, preparedSplit, yAxis, yScale]);
|
|
111
112
|
return (React.createElement("div", { className: b() },
|
|
112
113
|
React.createElement("svg", { ref: svgRef, width: width, height: height,
|
|
113
114
|
// We use onPointerMove here because onMouseMove works incorrectly when the zoom setting is enabled:
|
|
@@ -121,10 +122,14 @@ export const ChartInner = (props) => {
|
|
|
121
122
|
return React.createElement(PlotTitle, { key: `plot-${index}`, title: plot.title });
|
|
122
123
|
})),
|
|
123
124
|
React.createElement("g", { width: boundsWidth, height: boundsHeight, transform: `translate(${[boundsOffsetLeft, boundsOffsetTop].join(',')})`, ref: plotRef },
|
|
124
|
-
xScale &&
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
xScale && xAxis && (React.createElement("g", { transform: `translate(0, ${boundsHeight})` },
|
|
126
|
+
React.createElement(AxisX, { axis: xAxis, boundsOffsetLeft: boundsOffsetLeft, boundsOffsetTop: boundsOffsetTop, height: boundsHeight, htmlLayout: htmlLayout, leftmostLimit: svgXPos, plotAfterRef: plotAfterRef, plotBeforeRef: plotBeforeRef, scale: xScale, split: preparedSplit, width: boundsWidth }))),
|
|
127
|
+
Boolean(yAxisDataItems.length) && (React.createElement(React.Fragment, null, yAxisDataItems.map((axisData, index) => {
|
|
128
|
+
if (!axisData) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
return (React.createElement(AxisY, { key: index, htmlLayout: htmlLayout, plotAfterRef: plotAfterRef, plotBeforeRef: plotBeforeRef, preparedAxisData: axisData }));
|
|
132
|
+
}))),
|
|
128
133
|
React.createElement("g", { ref: plotBeforeRef }),
|
|
129
134
|
shapes,
|
|
130
135
|
React.createElement("g", { ref: plotAfterRef })),
|
|
@@ -51,6 +51,6 @@ export declare function useChartInnerProps(props: Props): {
|
|
|
51
51
|
xAxis: PreparedAxis | null;
|
|
52
52
|
xScale: import("../../hooks").ChartScale | undefined;
|
|
53
53
|
yAxis: PreparedAxis[];
|
|
54
|
-
yScale: import("../../hooks").ChartScale[] | undefined;
|
|
54
|
+
yScale: (import("../../hooks").ChartScale | undefined)[] | undefined;
|
|
55
55
|
};
|
|
56
56
|
export {};
|
|
@@ -20,6 +20,8 @@ export function useChartInnerProps(props) {
|
|
|
20
20
|
colors: data.colors,
|
|
21
21
|
title: data.title,
|
|
22
22
|
tooltip: data.tooltip,
|
|
23
|
+
xAxis: data.xAxis,
|
|
24
|
+
yAxes: data.yAxis,
|
|
23
25
|
});
|
|
24
26
|
const preparedSeriesOptions = React.useMemo(() => {
|
|
25
27
|
return getPreparedOptions(data.series.options);
|
|
@@ -2,10 +2,10 @@ import React from 'react';
|
|
|
2
2
|
import isNil from 'lodash/isNil';
|
|
3
3
|
import { DefaultTooltipContent } from './DefaultTooltipContent';
|
|
4
4
|
export const ChartTooltipContent = (props) => {
|
|
5
|
-
const { hovered, xAxis, yAxis, renderer, rowRenderer, valueFormat, headerFormat, totals, pinned, } = props;
|
|
5
|
+
const { hovered, xAxis, yAxis, renderer, rowRenderer, valueFormat, headerFormat, totals, pinned, qa, } = props;
|
|
6
6
|
if (!hovered) {
|
|
7
7
|
return null;
|
|
8
8
|
}
|
|
9
9
|
const customTooltip = renderer === null || renderer === void 0 ? void 0 : renderer({ hovered, xAxis, yAxis });
|
|
10
|
-
return isNil(customTooltip) ? (React.createElement(DefaultTooltipContent, { hovered: hovered, pinned: pinned, rowRenderer: rowRenderer, totals: totals, valueFormat: valueFormat, headerFormat: headerFormat, xAxis: xAxis, yAxis: yAxis })) : (customTooltip);
|
|
10
|
+
return isNil(customTooltip) ? (React.createElement(DefaultTooltipContent, { hovered: hovered, pinned: pinned, rowRenderer: rowRenderer, totals: totals, valueFormat: valueFormat, headerFormat: headerFormat, xAxis: xAxis, yAxis: yAxis, qa: qa })) : (customTooltip);
|
|
11
11
|
};
|
|
@@ -9,6 +9,7 @@ type Props = {
|
|
|
9
9
|
headerFormat?: ChartTooltip['headerFormat'];
|
|
10
10
|
xAxis?: ChartXAxis | null;
|
|
11
11
|
yAxis?: ChartYAxis;
|
|
12
|
+
qa?: string;
|
|
12
13
|
};
|
|
13
|
-
export declare const DefaultTooltipContent: ({ hovered, pinned, rowRenderer, totals, valueFormat, headerFormat, xAxis, yAxis, }: Props) => React.JSX.Element;
|
|
14
|
+
export declare const DefaultTooltipContent: ({ hovered, pinned, rowRenderer, totals, valueFormat, headerFormat, xAxis, yAxis, qa, }: Props) => React.JSX.Element;
|
|
14
15
|
export {};
|
|
@@ -10,13 +10,13 @@ import { Row } from './Row';
|
|
|
10
10
|
import { RowWithAggregation } from './RowWithAggregation';
|
|
11
11
|
import { getDefaultValueFormat, getHoveredValues, getMeasureValue, getPreparedAggregation, getXRowData, } from './utils';
|
|
12
12
|
const b = block('tooltip');
|
|
13
|
-
export const DefaultTooltipContent = ({ hovered, pinned, rowRenderer, totals, valueFormat, headerFormat, xAxis, yAxis, }) => {
|
|
13
|
+
export const DefaultTooltipContent = ({ hovered, pinned, rowRenderer, totals, valueFormat, headerFormat, xAxis, yAxis, qa, }) => {
|
|
14
14
|
var _a;
|
|
15
15
|
const [visibleRows, setVisibleRows] = React.useState();
|
|
16
16
|
const [maxContentRowsHeight, setMaxContentRowsHeight] = React.useState();
|
|
17
17
|
const [scrollBarWidth, setScrollBarWidth] = React.useState(0);
|
|
18
18
|
const contentRowsRef = React.useRef(null);
|
|
19
|
-
const measureValue = getMeasureValue({ data: hovered, xAxis, yAxis });
|
|
19
|
+
const measureValue = getMeasureValue({ data: hovered, xAxis, yAxis, headerFormat });
|
|
20
20
|
const hoveredValues = getHoveredValues({ hovered, xAxis, yAxis });
|
|
21
21
|
const prevHoveredValues = usePrevious(hoveredValues);
|
|
22
22
|
const visibleHovered = pinned || !visibleRows ? hovered : hovered.slice(0, visibleRows);
|
|
@@ -83,7 +83,7 @@ export const DefaultTooltipContent = ({ hovered, pinned, rowRenderer, totals, va
|
|
|
83
83
|
setScrollBarWidth(0);
|
|
84
84
|
}
|
|
85
85
|
}, [pinned]);
|
|
86
|
-
return (React.createElement("div", { className: b('content') },
|
|
86
|
+
return (React.createElement("div", { className: b('content'), "data-qa": qa },
|
|
87
87
|
formattedHeadValue && (React.createElement("div", { className: b('series-name'), dangerouslySetInnerHTML: { __html: formattedHeadValue } })),
|
|
88
88
|
React.createElement("div", { className: b('content-rows', { pinned }), ref: contentRowsRef, style: { maxHeight: maxContentRowsHeight } },
|
|
89
89
|
visibleHovered.map((seriesItem, i) => {
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import type { ChartSeriesData, ChartTooltip, ChartTooltipTotalsAggregationValue, ChartTooltipTotalsBuiltInAggregation, ChartXAxis, ChartYAxis, TooltipDataChunk, ValueFormat } from '../../../types';
|
|
2
2
|
export type HoveredValue = string | number | null | undefined;
|
|
3
3
|
export declare function getXRowData(data: ChartSeriesData, xAxis?: ChartXAxis | null): string | number | undefined;
|
|
4
|
-
export declare function getDefaultValueFormat({ axis, }: {
|
|
4
|
+
export declare function getDefaultValueFormat({ axis, closestPointsRange, }: {
|
|
5
5
|
axis?: ChartXAxis | ChartYAxis | null;
|
|
6
|
+
closestPointsRange?: number;
|
|
6
7
|
}): ValueFormat | undefined;
|
|
7
|
-
export declare const getMeasureValue: ({ data, xAxis, yAxis,
|
|
8
|
+
export declare const getMeasureValue: ({ data, xAxis, yAxis, headerFormat, }: {
|
|
8
9
|
data: TooltipDataChunk[];
|
|
9
10
|
xAxis?: ChartXAxis | null;
|
|
10
11
|
yAxis?: ChartYAxis;
|
|
11
|
-
|
|
12
|
+
headerFormat?: ChartTooltip["headerFormat"];
|
|
12
13
|
}) => {
|
|
13
14
|
value: string | null;
|
|
14
15
|
formattedValue?: undefined;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import get from 'lodash/get';
|
|
2
|
-
import { DEFAULT_DATE_FORMAT } from '../../../constants';
|
|
3
2
|
import { i18n } from '../../../i18n';
|
|
4
|
-
import { getDataCategoryValue } from '../../../utils';
|
|
3
|
+
import { getDataCategoryValue, getDefaultDateFormat } from '../../../utils';
|
|
5
4
|
import { getFormattedValue } from '../../../utils/chart/format';
|
|
6
5
|
function getRowData(fieldName, data, axis) {
|
|
7
6
|
switch (axis === null || axis === void 0 ? void 0 : axis.type) {
|
|
@@ -20,7 +19,7 @@ export function getXRowData(data, xAxis) {
|
|
|
20
19
|
function getYRowData(data, yAxis) {
|
|
21
20
|
return getRowData('y', data, yAxis);
|
|
22
21
|
}
|
|
23
|
-
export function getDefaultValueFormat({ axis, }) {
|
|
22
|
+
export function getDefaultValueFormat({ axis, closestPointsRange, }) {
|
|
24
23
|
switch (axis === null || axis === void 0 ? void 0 : axis.type) {
|
|
25
24
|
case 'linear':
|
|
26
25
|
case 'logarithmic': {
|
|
@@ -31,14 +30,14 @@ export function getDefaultValueFormat({ axis, }) {
|
|
|
31
30
|
case 'datetime': {
|
|
32
31
|
return {
|
|
33
32
|
type: 'date',
|
|
34
|
-
format:
|
|
33
|
+
format: getDefaultDateFormat(closestPointsRange),
|
|
35
34
|
};
|
|
36
35
|
}
|
|
37
36
|
default:
|
|
38
37
|
return undefined;
|
|
39
38
|
}
|
|
40
39
|
}
|
|
41
|
-
export const getMeasureValue = ({ data, xAxis, yAxis,
|
|
40
|
+
export const getMeasureValue = ({ data, xAxis, yAxis, headerFormat, }) => {
|
|
42
41
|
var _a, _b, _c, _d, _e, _f;
|
|
43
42
|
if (data.every((item) => ['pie', 'treemap', 'waterfall', 'sankey'].includes(item.series.type))) {
|
|
44
43
|
return null;
|
|
@@ -49,18 +48,16 @@ export const getMeasureValue = ({ data, xAxis, yAxis, valueFormat, }) => {
|
|
|
49
48
|
}
|
|
50
49
|
if (data.some((item) => item.series.type === 'bar-y')) {
|
|
51
50
|
const value = getYRowData((_c = data[0]) === null || _c === void 0 ? void 0 : _c.data, yAxis);
|
|
52
|
-
const format = valueFormat !== null && valueFormat !== void 0 ? valueFormat : getDefaultValueFormat({ axis: yAxis });
|
|
53
51
|
const formattedValue = getFormattedValue({
|
|
54
52
|
value: getYRowData((_d = data[0]) === null || _d === void 0 ? void 0 : _d.data, yAxis),
|
|
55
|
-
format,
|
|
53
|
+
format: headerFormat,
|
|
56
54
|
});
|
|
57
55
|
return { value, formattedValue };
|
|
58
56
|
}
|
|
59
57
|
const value = getXRowData((_e = data[0]) === null || _e === void 0 ? void 0 : _e.data, xAxis);
|
|
60
|
-
const format = valueFormat !== null && valueFormat !== void 0 ? valueFormat : getDefaultValueFormat({ axis: xAxis });
|
|
61
58
|
const formattedValue = getFormattedValue({
|
|
62
59
|
value: getXRowData((_f = data[0]) === null || _f === void 0 ? void 0 : _f.data, xAxis),
|
|
63
|
-
format,
|
|
60
|
+
format: headerFormat,
|
|
64
61
|
});
|
|
65
62
|
return { value, formattedValue };
|
|
66
63
|
};
|
|
@@ -23,5 +23,5 @@ export const Tooltip = (props) => {
|
|
|
23
23
|
}, [left, top]);
|
|
24
24
|
return (hovered === null || hovered === void 0 ? void 0 : hovered.length) ? (React.createElement(Popup, { anchorElement: anchor, className: b({ pinned: tooltipPinned }), disableTransition: true, floatingStyles: tooltipPinned ? undefined : { pointerEvents: 'none' }, offset: { mainAxis: 20 }, onOpenChange: tooltipPinned ? handleOnOpenChange : undefined, open: true, placement: ['right', 'left', 'top', 'bottom'] },
|
|
25
25
|
React.createElement("div", { className: b('popup-content') },
|
|
26
|
-
React.createElement(ChartTooltipContent, { hovered: hovered, pinned: tooltipPinned, renderer: tooltip.renderer, rowRenderer: tooltip.rowRenderer, totals: tooltip.totals, valueFormat: tooltip.valueFormat, headerFormat: tooltip.headerFormat, xAxis: xAxis, yAxis: yAxis })))) : null;
|
|
26
|
+
React.createElement(ChartTooltipContent, { hovered: hovered, pinned: tooltipPinned, renderer: tooltip.renderer, rowRenderer: tooltip.rowRenderer, totals: tooltip.totals, valueFormat: tooltip.valueFormat, headerFormat: tooltip.headerFormat, xAxis: xAxis, yAxis: yAxis, qa: tooltip.qa })))) : null;
|
|
27
27
|
};
|
|
@@ -17,21 +17,21 @@ type Args = {
|
|
|
17
17
|
};
|
|
18
18
|
type ReturnValue = {
|
|
19
19
|
xScale?: ChartScale;
|
|
20
|
-
yScale?: ChartScale[];
|
|
20
|
+
yScale?: (ChartScale | undefined)[];
|
|
21
21
|
};
|
|
22
22
|
export declare function createYScale(args: {
|
|
23
23
|
axis: PreparedAxis;
|
|
24
24
|
boundsHeight: number;
|
|
25
25
|
series: (PreparedSeries | ChartSeries)[];
|
|
26
26
|
seriesOptions: PreparedSeriesOptions;
|
|
27
|
-
}): ScaleBand<string> | ScaleLinear<number, number, never> | ScaleTime<number, number, never
|
|
27
|
+
}): ScaleBand<string> | ScaleLinear<number, number, never> | ScaleTime<number, number, never> | undefined;
|
|
28
28
|
export declare function createXScale(args: {
|
|
29
29
|
axis: PreparedAxis | ChartAxis;
|
|
30
30
|
boundsWidth: number;
|
|
31
31
|
series: (PreparedSeries | ChartSeries)[];
|
|
32
32
|
seriesOptions: PreparedSeriesOptions;
|
|
33
33
|
hasZoomX?: boolean;
|
|
34
|
-
}): ScaleBand<string> | ScaleLinear<number, number, never> | ScaleTime<number, number, never
|
|
34
|
+
}): ScaleBand<string> | ScaleLinear<number, number, never> | ScaleTime<number, number, never> | undefined;
|
|
35
35
|
/**
|
|
36
36
|
* Uses to create scales for axis related series
|
|
37
37
|
*/
|
|
@@ -6,8 +6,23 @@ import { CHART_SERIES_WITH_VOLUME_ON_Y_AXIS, getAxisHeight, getDataCategoryValue
|
|
|
6
6
|
import { getBarYLayoutForNumericScale, groupBarYDataByYValue } from '../utils';
|
|
7
7
|
import { getBarXLayoutForNumericScale, groupBarXDataByXValue } from '../utils/bar-x';
|
|
8
8
|
const X_AXIS_ZOOM_PADDING = 0.02;
|
|
9
|
-
function
|
|
10
|
-
|
|
9
|
+
function validateArrayData(data) {
|
|
10
|
+
let hasNumberAndNullValues;
|
|
11
|
+
let hasOnlyNullValues;
|
|
12
|
+
for (const d of data) {
|
|
13
|
+
const isNumber = typeof d === 'number';
|
|
14
|
+
const isNull = d === null;
|
|
15
|
+
hasNumberAndNullValues =
|
|
16
|
+
typeof hasNumberAndNullValues === 'undefined'
|
|
17
|
+
? isNumber || isNull
|
|
18
|
+
: hasNumberAndNullValues && (isNumber || isNull);
|
|
19
|
+
hasOnlyNullValues =
|
|
20
|
+
typeof hasOnlyNullValues === 'undefined' ? isNull : hasOnlyNullValues && isNull;
|
|
21
|
+
if (!hasNumberAndNullValues) {
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return { hasNumberAndNullValues, hasOnlyNullValues };
|
|
11
26
|
}
|
|
12
27
|
function filterCategoriesByVisibleSeries(args) {
|
|
13
28
|
const { axisDirection, categories, series } = args;
|
|
@@ -19,7 +34,8 @@ function filterCategoriesByVisibleSeries(args) {
|
|
|
19
34
|
});
|
|
20
35
|
}
|
|
21
36
|
});
|
|
22
|
-
|
|
37
|
+
const filteredCategories = categories.filter((c) => visibleCategories.has(c));
|
|
38
|
+
return filteredCategories.length > 0 ? filteredCategories : categories;
|
|
23
39
|
}
|
|
24
40
|
// axis is validated in `validation/index.ts`, so the value of `axis.type` is definitely valid.
|
|
25
41
|
// eslint-disable-next-line consistent-return
|
|
@@ -56,6 +72,7 @@ function getYScaleRange(args) {
|
|
|
56
72
|
}
|
|
57
73
|
}
|
|
58
74
|
}
|
|
75
|
+
// eslint-disable-next-line complexity
|
|
59
76
|
export function createYScale(args) {
|
|
60
77
|
const { axis, boundsHeight, series, seriesOptions } = args;
|
|
61
78
|
const yMinProps = get(axis, 'min');
|
|
@@ -67,7 +84,11 @@ export function createYScale(args) {
|
|
|
67
84
|
case 'linear':
|
|
68
85
|
case 'logarithmic': {
|
|
69
86
|
const domain = getDomainDataYBySeries(series);
|
|
70
|
-
|
|
87
|
+
const { hasNumberAndNullValues, hasOnlyNullValues } = validateArrayData(domain);
|
|
88
|
+
if (hasOnlyNullValues || domain.length === 0) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
if (hasNumberAndNullValues) {
|
|
71
92
|
const [yMinDomain, yMaxDomain] = extent(domain);
|
|
72
93
|
const yMin = typeof yMinProps === 'number' ? yMinProps : yMinDomain;
|
|
73
94
|
let yMax;
|
|
@@ -103,7 +124,11 @@ export function createYScale(args) {
|
|
|
103
124
|
}
|
|
104
125
|
else {
|
|
105
126
|
const domain = getDomainDataYBySeries(series);
|
|
106
|
-
|
|
127
|
+
const { hasNumberAndNullValues, hasOnlyNullValues } = validateArrayData(domain);
|
|
128
|
+
if (hasOnlyNullValues || domain.length === 0) {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
if (hasNumberAndNullValues) {
|
|
107
132
|
const [yMinTimestamp, yMaxTimestamp] = extent(domain);
|
|
108
133
|
const yMin = typeof yMinProps === 'number' ? yMinProps : yMinTimestamp;
|
|
109
134
|
const yMax = typeof yMaxProps === 'number' ? yMaxProps : yMaxTimestamp;
|
|
@@ -178,7 +203,11 @@ export function createXScale(args) {
|
|
|
178
203
|
case 'linear':
|
|
179
204
|
case 'logarithmic': {
|
|
180
205
|
const domainData = getDomainDataXBySeries(series);
|
|
181
|
-
|
|
206
|
+
const { hasNumberAndNullValues, hasOnlyNullValues } = validateArrayData(domainData);
|
|
207
|
+
if (hasOnlyNullValues || domainData.length === 0) {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
if (hasNumberAndNullValues) {
|
|
182
211
|
const [xMinDomain, xMaxDomain] = extent(domainData);
|
|
183
212
|
let xMin;
|
|
184
213
|
let xMax;
|
|
@@ -227,7 +256,11 @@ export function createXScale(args) {
|
|
|
227
256
|
case 'datetime': {
|
|
228
257
|
let domain = null;
|
|
229
258
|
const domainData = get(axis, 'timestamps') || getDomainDataXBySeries(series);
|
|
230
|
-
|
|
259
|
+
const { hasNumberAndNullValues, hasOnlyNullValues } = validateArrayData(domainData);
|
|
260
|
+
if (hasOnlyNullValues || domainData.length === 0) {
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
if (hasNumberAndNullValues) {
|
|
231
264
|
const [xMinTimestamp, xMaxTimestamp] = extent(domainData);
|
|
232
265
|
const xMin = typeof xMinProps === 'number' ? xMinProps : xMinTimestamp;
|
|
233
266
|
const xMax = typeof xMaxProps === 'number' ? xMaxProps : xMaxTimestamp;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ChartSeries, ChartTitle, ChartTooltip, ChartOptions as GeneralChartOptions } from '../../types';
|
|
1
|
+
import type { ChartSeries, ChartTitle, ChartTooltip, ChartXAxis, ChartYAxis, ChartOptions as GeneralChartOptions } from '../../types';
|
|
2
2
|
import type { ChartOptions } from './types';
|
|
3
3
|
type Args = {
|
|
4
4
|
seriesData: ChartSeries[];
|
|
@@ -6,6 +6,8 @@ type Args = {
|
|
|
6
6
|
colors?: string[];
|
|
7
7
|
title?: ChartTitle;
|
|
8
8
|
tooltip?: ChartTooltip;
|
|
9
|
+
yAxes?: ChartYAxis[];
|
|
10
|
+
xAxis?: ChartXAxis;
|
|
9
11
|
};
|
|
10
12
|
export declare const useChartOptions: (args: Args) => ChartOptions;
|
|
11
13
|
export {};
|
|
@@ -4,10 +4,10 @@ import { getPreparedChart } from './chart';
|
|
|
4
4
|
import { getPreparedTitle } from './title';
|
|
5
5
|
import { getPreparedTooltip } from './tooltip';
|
|
6
6
|
export const useChartOptions = (args) => {
|
|
7
|
-
const { chart, colors, seriesData, title, tooltip } = args;
|
|
7
|
+
const { chart, colors, seriesData, title, tooltip, yAxes, xAxis } = args;
|
|
8
8
|
const options = React.useMemo(() => {
|
|
9
9
|
const preparedTitle = getPreparedTitle({ title });
|
|
10
|
-
const preparedTooltip = getPreparedTooltip({ tooltip });
|
|
10
|
+
const preparedTooltip = getPreparedTooltip({ tooltip, seriesData, yAxes, xAxis });
|
|
11
11
|
const preparedChart = getPreparedChart({
|
|
12
12
|
chart,
|
|
13
13
|
preparedTitle,
|
|
@@ -19,6 +19,6 @@ export const useChartOptions = (args) => {
|
|
|
19
19
|
title: preparedTitle,
|
|
20
20
|
tooltip: preparedTooltip,
|
|
21
21
|
};
|
|
22
|
-
}, [chart, colors, seriesData, title, tooltip]);
|
|
22
|
+
}, [chart, colors, seriesData, title, tooltip, xAxis, yAxes]);
|
|
23
23
|
return options;
|
|
24
24
|
};
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import type { ChartData } from '../../types';
|
|
1
|
+
import type { ChartData, ChartSeries, ChartXAxis, ChartYAxis } from '../../types';
|
|
2
2
|
import type { PreparedTooltip } from './types';
|
|
3
3
|
export declare const getPreparedTooltip: (args: {
|
|
4
4
|
tooltip: ChartData["tooltip"];
|
|
5
|
+
seriesData: ChartSeries[];
|
|
6
|
+
yAxes?: ChartYAxis[];
|
|
7
|
+
xAxis?: ChartXAxis;
|
|
5
8
|
}) => PreparedTooltip;
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import get from 'lodash/get';
|
|
2
|
+
import { getDefaultValueFormat } from '../../components/Tooltip/DefaultTooltipContent/utils';
|
|
3
|
+
import { getDomainDataXBySeries, getDomainDataYBySeries, getMinSpaceBetween } from '../../utils';
|
|
4
|
+
function getDefaultHeaderFormat({ seriesData, yAxes, xAxis, }) {
|
|
5
|
+
if (seriesData.every((item) => ['pie', 'treemap', 'waterfall', 'sankey', 'radar'].includes(item.type))) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
if (seriesData.some((item) => item.type === 'bar-y')) {
|
|
9
|
+
const domainData = getDomainDataYBySeries(seriesData);
|
|
10
|
+
const closestPointsRange = getMinSpaceBetween(domainData, (d) => d);
|
|
11
|
+
return getDefaultValueFormat({ axis: yAxes === null || yAxes === void 0 ? void 0 : yAxes[0], closestPointsRange });
|
|
12
|
+
}
|
|
13
|
+
const domainData = getDomainDataXBySeries(seriesData);
|
|
14
|
+
const closestPointsRange = getMinSpaceBetween(domainData, (d) => d);
|
|
15
|
+
return getDefaultValueFormat({ axis: xAxis, closestPointsRange });
|
|
16
|
+
}
|
|
2
17
|
export const getPreparedTooltip = (args) => {
|
|
3
|
-
var _a;
|
|
4
|
-
const { tooltip } = args;
|
|
5
|
-
return Object.assign(Object.assign({}, tooltip), { enabled: get(tooltip, 'enabled', true), throttle: (_a = tooltip === null || tooltip === void 0 ? void 0 : tooltip.throttle) !== null && _a !== void 0 ? _a : 0 });
|
|
18
|
+
var _a, _b;
|
|
19
|
+
const { tooltip, seriesData, yAxes, xAxis } = args;
|
|
20
|
+
return Object.assign(Object.assign({}, tooltip), { enabled: get(tooltip, 'enabled', true), throttle: (_a = tooltip === null || tooltip === void 0 ? void 0 : tooltip.throttle) !== null && _a !== void 0 ? _a : 0, headerFormat: (_b = tooltip === null || tooltip === void 0 ? void 0 : tooltip.headerFormat) !== null && _b !== void 0 ? _b : getDefaultHeaderFormat({ seriesData, yAxes, xAxis }) });
|
|
6
21
|
};
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import get from 'lodash/get';
|
|
2
2
|
import { DASH_STYLE, DEFAULT_AXIS_LABEL_FONT_SIZE, axisCrosshairDefaults, axisLabelsDefaults, xAxisTitleDefaults, } from '../../constants';
|
|
3
|
-
import { calculateCos, calculateNumericProperty, formatAxisTickLabel, getAxisItems, getClosestPointsRange, getHorizontalHtmlTextHeight, getHorizontalSvgTextHeight, getLabelsSize, getMaxTickCount, getTicksCount, hasOverlappingLabels, wrapText, } from '../../utils';
|
|
3
|
+
import { calculateCos, calculateNumericProperty, formatAxisTickLabel, getAxisItems, getClosestPointsRange, getDefaultDateFormat, getHorizontalHtmlTextHeight, getHorizontalSvgTextHeight, getLabelsSize, getMaxTickCount, getTicksCount, hasOverlappingLabels, wrapText, } from '../../utils';
|
|
4
4
|
import { createXScale } from '../useAxisScales';
|
|
5
5
|
import { getAxisCategories, prepareAxisPlotLabel } from './utils';
|
|
6
|
-
async function
|
|
6
|
+
async function setLabelSettings({ axis, seriesData, seriesOptions, width, autoRotation = true, }) {
|
|
7
7
|
const scale = createXScale({ axis, series: seriesData, seriesOptions, boundsWidth: width });
|
|
8
|
+
if (!scale) {
|
|
9
|
+
axis.labels.height = 0;
|
|
10
|
+
axis.labels.rotation = 0;
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
8
13
|
const tickCount = getTicksCount({ axis, range: width });
|
|
9
14
|
const ticks = getAxisItems({
|
|
10
15
|
scale: scale,
|
|
@@ -12,6 +17,9 @@ async function getLabelSettings({ axis, seriesData, seriesOptions, width, autoRo
|
|
|
12
17
|
maxCount: getMaxTickCount({ width, axis }),
|
|
13
18
|
});
|
|
14
19
|
const step = getClosestPointsRange(axis, ticks);
|
|
20
|
+
if (axis.type === 'datetime' && !axis.labels.dateFormat) {
|
|
21
|
+
axis.labels.dateFormat = getDefaultDateFormat(step);
|
|
22
|
+
}
|
|
15
23
|
const labels = ticks.map((value) => {
|
|
16
24
|
return formatAxisTickLabel({
|
|
17
25
|
axis,
|
|
@@ -38,10 +46,11 @@ async function getLabelSettings({ axis, seriesData, seriesOptions, width, autoRo
|
|
|
38
46
|
})).maxHeight
|
|
39
47
|
: axis.labels.lineHeight;
|
|
40
48
|
const maxHeight = rotation ? calculateCos(rotation) * axis.labels.maxWidth : labelsHeight;
|
|
41
|
-
|
|
49
|
+
axis.labels.height = Math.min(maxHeight, labelsHeight);
|
|
50
|
+
axis.labels.rotation = rotation;
|
|
42
51
|
}
|
|
43
52
|
export const getPreparedXAxis = async ({ xAxis, seriesData, seriesOptions, width, }) => {
|
|
44
|
-
var _a, _b, _c;
|
|
53
|
+
var _a, _b, _c, _d, _e;
|
|
45
54
|
const titleText = get(xAxis, 'title.text', '');
|
|
46
55
|
const titleStyle = Object.assign(Object.assign({}, xAxisTitleDefaults.style), get(xAxis, 'title.style'));
|
|
47
56
|
const titleMaxRowsCount = get(xAxis, 'title.maxRowCount', xAxisTitleDefaults.maxRowCount);
|
|
@@ -96,7 +105,12 @@ export const getPreparedXAxis = async ({ xAxis, seriesData, seriesOptions, width
|
|
|
96
105
|
enabled: get(xAxis, 'grid.enabled', true),
|
|
97
106
|
},
|
|
98
107
|
ticks: {
|
|
99
|
-
pixelInterval:
|
|
108
|
+
pixelInterval: ((_c = xAxis === null || xAxis === void 0 ? void 0 : xAxis.ticks) === null || _c === void 0 ? void 0 : _c.interval)
|
|
109
|
+
? calculateNumericProperty({
|
|
110
|
+
base: width,
|
|
111
|
+
value: xAxis.ticks.interval,
|
|
112
|
+
})
|
|
113
|
+
: (_d = xAxis === null || xAxis === void 0 ? void 0 : xAxis.ticks) === null || _d === void 0 ? void 0 : _d.pixelInterval,
|
|
100
114
|
},
|
|
101
115
|
position: 'bottom',
|
|
102
116
|
plotIndex: 0,
|
|
@@ -129,14 +143,12 @@ export const getPreparedXAxis = async ({ xAxis, seriesData, seriesOptions, width
|
|
|
129
143
|
visible: get(xAxis, 'visible', true),
|
|
130
144
|
order: xAxis === null || xAxis === void 0 ? void 0 : xAxis.order,
|
|
131
145
|
};
|
|
132
|
-
|
|
146
|
+
await setLabelSettings({
|
|
133
147
|
axis: preparedXAxis,
|
|
134
148
|
seriesData,
|
|
135
149
|
seriesOptions,
|
|
136
150
|
width,
|
|
137
|
-
autoRotation: (
|
|
151
|
+
autoRotation: (_e = xAxis === null || xAxis === void 0 ? void 0 : xAxis.labels) === null || _e === void 0 ? void 0 : _e.autoRotation,
|
|
138
152
|
});
|
|
139
|
-
preparedXAxis.labels.height = height;
|
|
140
|
-
preparedXAxis.labels.rotation = rotation;
|
|
141
153
|
return preparedXAxis;
|
|
142
154
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import get from 'lodash/get';
|
|
2
2
|
import { getTickValues } from '../../components/AxisY/utils';
|
|
3
3
|
import { DASH_STYLE, DEFAULT_AXIS_LABEL_FONT_SIZE, DEFAULT_AXIS_TYPE, axisCrosshairDefaults, axisLabelsDefaults, yAxisTitleDefaults, } from '../../constants';
|
|
4
|
-
import { calculateNumericProperty, getDefaultMinYAxisValue, getHorizontalHtmlTextHeight, getHorizontalSvgTextHeight,
|
|
4
|
+
import { calculateNumericProperty, formatAxisTickLabel, getClosestPointsRange, getDefaultDateFormat, getDefaultMinYAxisValue, getHorizontalHtmlTextHeight, getHorizontalSvgTextHeight, getLabelsSize, getScaleTicks, getTextSizeFn, isAxisRelatedSeries, wrapText, } from '../../utils';
|
|
5
5
|
import { createYScale } from '../useAxisScales';
|
|
6
6
|
import { getAxisCategories, prepareAxisPlotLabel } from './utils';
|
|
7
7
|
const getAxisLabelMaxWidth = async (args) => {
|
|
@@ -15,11 +15,22 @@ const getAxisLabelMaxWidth = async (args) => {
|
|
|
15
15
|
series: seriesData,
|
|
16
16
|
seriesOptions,
|
|
17
17
|
});
|
|
18
|
+
if (!scale) {
|
|
19
|
+
return { height: 0, width: 0 };
|
|
20
|
+
}
|
|
18
21
|
const getTextSize = getTextSizeFn({ style: axis.labels.style });
|
|
19
22
|
const labelLineHeight = (await getTextSize('Tmp')).height;
|
|
20
23
|
const tickValues = getTickValues({ axis, scale, labelLineHeight });
|
|
21
|
-
const
|
|
22
|
-
const
|
|
24
|
+
const ticks = getScaleTicks(scale);
|
|
25
|
+
const tickStep = getClosestPointsRange(axis, ticks);
|
|
26
|
+
if (axis.type === 'datetime' && !axis.labels.dateFormat) {
|
|
27
|
+
axis.labels.dateFormat = getDefaultDateFormat(tickStep);
|
|
28
|
+
}
|
|
29
|
+
const labels = tickValues.map((tick) => formatAxisTickLabel({
|
|
30
|
+
axis,
|
|
31
|
+
value: tick.value,
|
|
32
|
+
step: tickStep,
|
|
33
|
+
}));
|
|
23
34
|
const size = await getLabelsSize({
|
|
24
35
|
labels,
|
|
25
36
|
style: axis.labels.style,
|
|
@@ -100,10 +111,12 @@ export const getPreparedYAxis = ({ height, boundsHeight, width, seriesData, seri
|
|
|
100
111
|
(!firstPlotAxis && !((_d = axisByPlot[plotIndex][0].visible) !== null && _d !== void 0 ? _d : true))),
|
|
101
112
|
},
|
|
102
113
|
ticks: {
|
|
103
|
-
pixelInterval: (
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
114
|
+
pixelInterval: ((_e = axisItem.ticks) === null || _e === void 0 ? void 0 : _e.interval)
|
|
115
|
+
? calculateNumericProperty({
|
|
116
|
+
base: height,
|
|
117
|
+
value: (_f = axisItem.ticks) === null || _f === void 0 ? void 0 : _f.interval,
|
|
118
|
+
})
|
|
119
|
+
: (_g = axisItem.ticks) === null || _g === void 0 ? void 0 : _g.pixelInterval,
|
|
107
120
|
},
|
|
108
121
|
position: get(axisItem, 'position', defaultAxisPosition),
|
|
109
122
|
plotIndex: get(axisItem, 'plotIndex', 0),
|
|
@@ -63,7 +63,8 @@ export const useCrosshair = (props) => {
|
|
|
63
63
|
}
|
|
64
64
|
yAxes.forEach((yAxis, index, currentArr) => {
|
|
65
65
|
const yAxisScale = yScale[index];
|
|
66
|
-
if (
|
|
66
|
+
if (!yAxisScale ||
|
|
67
|
+
(index !== 0 && !yAxis.crosshair.snap && !currentArr[0].crosshair.snap)) {
|
|
67
68
|
return;
|
|
68
69
|
}
|
|
69
70
|
if (yAxis.crosshair.enabled && (hovered === null || hovered === void 0 ? void 0 : hovered.length)) {
|