Skip to content

Commit f23ceba

Browse files
authored
Merge pull request #3516 from Kingwl/feat/tooltip-filter-range-as-function
feat: support tooltip filter range as function
2 parents e5d8652 + 00e0646 commit f23ceba

File tree

5 files changed

+19
-8
lines changed

5 files changed

+19
-8
lines changed

docs/assets/option/zh/component/axis-common/linear-axis.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,14 @@
7575

7676
使这个轴的 tick 与目标轴保持比例对齐
7777

78-
#${prefix} tooltipFilterRange(number | [number, number])
78+
#${prefix} tooltipFilterRange(number | [number, number] | (({ scale: IBaseScale }) => number | [number, number]))
7979

8080
**仅当轴为线性轴或时间轴时生效**,配置连续轴上的 dimension tooltip 数据筛选范围。从 1.4.0 版本开始支持。
8181

8282
如果配置为单个数字形如 `d`,则筛选区间为 `[x0 - d, x0 + d]`;如果配置为二元组形如 `[d1, d2]`,则筛选区间为 `[x0 + d1, x0 + d2]`
8383

84+
如果配置为函数 `f`, 函数的返回值将会作为数据筛选范围的值。
85+
8486
#${prefix} breaks(Array|Object)
8587

8688
`1.12.4` 版本开始支持。

packages/vchart-types/types/component/axis/interface.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export interface ILinearAxisSpec {
5454
min?: number;
5555
max?: number;
5656
};
57-
tooltipFilterRange?: number | [number, number];
57+
tooltipFilterRange?: number | [number, number] | ((params: { scale: IBaseScale }) => number | [number, number]);
5858
}
5959
export interface IBandAxisSpec {
6060
bandPadding?: number | number[];

packages/vchart-types/types/component/axis/interface/spec.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export interface ILinearAxisSpec {
3535
min?: number;
3636
max?: number;
3737
};
38-
tooltipFilterRange?: number | [number, number];
38+
tooltipFilterRange?: number | [number, number] | ((params: { scale: IBaseScale }) => number | [number, number]);
3939
breaks?: ILinearAxisBreakSpec[];
4040
}
4141
export interface IBandAxisSpec {

packages/vchart/src/component/axis/interface/spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { ITextFormatMethod } from './../../../typings/spec/common';
21
import type { AxisBreakProps, AxisItem, AxisItemStateStyle } from '@visactor/vrender-components';
32
import type { IAnimationSpec } from '../../../animation/spec';
43
import type {
@@ -14,6 +13,7 @@ import type {
1413
} from '../../../typings';
1514
import type { IComponentSpec } from '../../base/interface';
1615
import type { AxisType, IAxisItem, IBandAxisLayer, ITickCalculationCfg, StyleCallback } from './common';
16+
import type { IBaseScale } from '@visactor/vscale';
1717

1818
export interface ICommonAxisSpec extends Omit<IComponentSpec, 'orient' | 'center'>, IAnimationSpec<string, string> {
1919
/**
@@ -148,9 +148,10 @@ export interface ILinearAxisSpec {
148148
/**
149149
* 连续轴上的 dimension tooltip 数据筛选范围
150150
* 如果配置为单个数字 d,则筛选区间为 [x0 - d, x0 + d];如果配置为二元组 [d1, d2],则筛选区间为 [x0 + d1, x0 + d2]
151+
* 如果配置为函数 f, 函数的返回值将会作为数据筛选范围的值
151152
* @since 1.4.0
152153
*/
153-
tooltipFilterRange?: number | [number, number];
154+
tooltipFilterRange?: number | [number, number] | ((params: { scale: IBaseScale }) => number | [number, number]);
154155
/**
155156
* 轴截断配置,只对笛卡尔坐标系的 linear 轴生效
156157
* @since 1.12.4

packages/vchart/src/event/events/dimension/util/common.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { isNil, array, isValid, isValidNumber } from '@visactor/vutils';
66
import type { Maybe } from '@visactor/vutils';
77
import type { AxisComponent } from '../../../../component/axis/base-axis';
88
import type { CoordinateType, Datum, ILayoutPoint } from '../../../../typings';
9+
import type { IBaseScale } from '@visactor/vscale';
910
import { isDiscrete } from '@visactor/vscale';
1011
import type { ICartesianLinearAxisSpec } from '../../../../component';
1112
import type { ISeries } from '../../../../series';
@@ -42,6 +43,13 @@ export const isSameDimensionInfo = (a?: IDimensionInfo, b?: IDimensionInfo): boo
4243
return true;
4344
};
4445

46+
const resolveTooltipFilterRange = (spec: ICartesianLinearAxisSpec, scale: IBaseScale) => {
47+
const range = spec.tooltipFilterRange;
48+
const rangeValue = typeof range === 'function' ? range({ scale }) : range;
49+
const rangeArr = (isValidNumber(rangeValue) ? [-rangeValue, rangeValue] : rangeValue) as Maybe<[number, number]>;
50+
return rangeArr;
51+
};
52+
4553
/** 给定维度项的值,获取对应维度数据 */
4654
export const getDimensionData = (
4755
value: any,
@@ -98,13 +106,13 @@ export const getDimensionData = (
98106
});
99107
} else {
100108
// 散点图情况,依据轴上的配置判断
101-
const range = (axis.getSpec() as ICartesianLinearAxisSpec).tooltipFilterRange;
102-
const rangeArr = (isValidNumber(range) ? [-range, range] : range) as Maybe<[number, number]>;
109+
const spec = axis.getSpec() as ICartesianLinearAxisSpec;
110+
const rangeArr = resolveTooltipFilterRange(spec, scale);
103111
let datums: Datum[] = [];
104112
let datumIdList: number[] = [];
105113
if (rangeArr) {
106114
// 根据范围取 datum
107-
viewData.forEach((datum: any, i: number) => {
115+
viewData.forEach((datum: Datum, i: number) => {
108116
if (isValid(datum[dimensionField[0]])) {
109117
const delta = datum[dimensionField[0]] - value;
110118
if (delta >= rangeArr[0] && delta <= rangeArr[1]) {

0 commit comments

Comments
 (0)