Skip to content

Commit 2fa2ea3

Browse files
authored
Merge pull request #3518 from VisActor/feat/legend-custom-filter
Feat/legend custom filter
2 parents f23ceba + 2fe08c6 commit 2fa2ea3

File tree

10 files changed

+74
-12
lines changed

10 files changed

+74
-12
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"changes": [
3+
{
4+
"comment": "feat: add config `customFilter` to legend, support cutomized filter function, close #3492\n\n",
5+
"type": "none",
6+
"packageName": "@visactor/vchart"
7+
}
8+
],
9+
"packageName": "@visactor/vchart",
10+
"email": "[email protected]"
11+
}

docs/assets/option/en/component/legend-common/base-legend.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,23 @@ Whether to enable legend interaction, enabled by default.
3333

3434
Whether to perform data filtering, the default is true. When this property is turned off, the legend click event will not trigger data filtering.
3535

36+
#${prefix} customFilter(Function)
37+
38+
Supported since version `1.13.1`
39+
40+
Custom legend filter callback function, defined as follows:
41+
42+
```
43+
/**
44+
* Custom filter function
45+
* @param data Current data
46+
* @param selectedRange Selected data range
47+
* @param datumField Field corresponding to the filtered data
48+
* @returns The final displayed data
49+
*/
50+
(data: any, selectedRange: StringOrNumber[], datumField: string) => any;
51+
```
52+
3653
#${prefix} title(Object)
3754

3855
Legend title configuration, not displayed by default.

docs/assets/option/zh/component/legend-common/base-legend.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,23 @@
3333

3434
是否进行数据筛选,默认为 true。该属性关闭之后,图例的点击事件将不会触发数据筛选。
3535

36+
#${prefix} customFilter(Function)
37+
38+
`1.13.1`版本开始支持
39+
40+
自定义图例筛选的回调函数,类型定义如下:
41+
42+
```
43+
/**
44+
* 自定义筛选函数
45+
* @param data 当前数据
46+
* @param selectedRange 选中的数据范围
47+
* @param datumField 筛选数据对应的字段
48+
* @returns 最终展示的数据
49+
*/
50+
(data: any, selectedRange: StringOrNumber[], datumField: string) => any;
51+
```
52+
3653
#${prefix} title(Object)
3754

3855
图例标题配置,默认不显示。

packages/vchart/src/component/legend/continuous/legend.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ export class ContinuousLegend<
8888
selected: () => this._selectedData,
8989
field: () => this._field,
9090
data: () => this._legendData.getLatestData(),
91-
isHierarchyData: s.isHierarchyData
91+
isHierarchyData: s.isHierarchyData,
92+
customFilter: this._spec.customFilter
9293
},
9394
level: TransformLevel.legendFilter
9495
});

packages/vchart/src/component/legend/discrete/legend.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ export class DiscreteLegend extends BaseLegend<IDiscreteLegendSpec> {
5656
series: s,
5757
selected: () => this._selectedData,
5858
field: () => this._getSeriesLegendField(s),
59-
data: () => this.getLegendDefaultData()
59+
data: () => this.getLegendDefaultData(),
60+
customFilter: this._spec.customFilter
6061
},
6162
level: TransformLevel.legendFilter
6263
});

packages/vchart/src/component/legend/interface.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,15 @@ export type ILegendCommonSpec = {
8383
* 是否进行数据筛选,默认为 true
8484
*/
8585
filter?: boolean;
86+
/**
87+
* 自定义筛选函数
88+
* @since 1.13.1
89+
* @param data 当前数据
90+
* @param selectedRange 选中的数据范围
91+
* @param datumField 筛选数据对应的字段
92+
* @returns 最终展示的数据
93+
*/
94+
customFilter?: (data: any, selectedRange: StringOrNumber[], datumField: string) => any;
8695

8796
/**
8897
* 图例标题配置

packages/vchart/src/data/transforms/legend-data/continuous/continuous.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { constants } from 'fs';
2-
import { isArray, isEmpty, isValidNumber } from '@visactor/vutils';
1+
import { isEmpty, isValidNumber } from '@visactor/vutils';
32
import type { ISeries } from '../../../../series/interface';
43
import type { IContinuousLegendDataMakeOption, IContinuousLegendFilterOption } from './interface';
54
import { filterHierarchyDataByRange, isHierarchyItem } from '../../../../util';
@@ -36,7 +35,7 @@ export const continuousLegendDataMake = (data: Array<ISeries>, op: IContinuousLe
3635

3736
// 连续数据过滤
3837
export const continuousLegendFilter = (data: Array<any>, op: IContinuousLegendFilterOption) => {
39-
const { selected, field, data: legendData, isHierarchyData } = op;
38+
const { selected, field, data: legendData, isHierarchyData, customFilter } = op;
4039
const selectedRange = selected();
4140
const datumField = field();
4241
const dataRange = legendData();
@@ -50,13 +49,15 @@ export const continuousLegendFilter = (data: Array<any>, op: IContinuousLegendFi
5049
}
5150
if (datumField && !isEmpty(selectedRange)) {
5251
const [min, max] = selectedRange;
53-
if (isHierarchy(data)) {
52+
53+
if (customFilter) {
54+
return customFilter(data, selectedRange, datumField);
55+
} else if (isHierarchy(data)) {
5456
return filterHierarchyDataByRange(data, +min, +max, datumField);
55-
} else {
56-
return data.filter(datum => {
57-
return datum[datumField] >= min && datum[datumField] <= max;
58-
});
5957
}
58+
return data.filter(datum => {
59+
return datum[datumField] >= min && datum[datumField] <= max;
60+
});
6061
}
6162

6263
return data;

packages/vchart/src/data/transforms/legend-data/continuous/interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ export interface IContinuousLegendFilterOption {
1313
field: () => string | undefined;
1414
data: () => StringOrNumber[];
1515
isHierarchyData?: () => boolean;
16+
customFilter?: (data: any, selectedRange: StringOrNumber[], datumField: string) => any;
1617
}

packages/vchart/src/data/transforms/legend-data/discrete/discrete.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const discreteLegendDataMake = (data: Array<ISeries>, op: IDiscreteLegend
2727
};
2828

2929
export const discreteLegendFilter = (data: Array<any>, op: IDiscreteLegendFilterOption) => {
30-
const { series, selected, field, data: legendData } = op;
30+
const { series, selected, field, data: legendData, customFilter } = op;
3131
const selectedData = selected();
3232
const legendKeys = legendData(); // 全量的图例项
3333
if (selectedData.length === 0 && legendKeys.length) {
@@ -45,7 +45,9 @@ export const discreteLegendFilter = (data: Array<any>, op: IDiscreteLegendFilter
4545

4646
const datumField = field() ?? DEFAULT_DATA_SERIES_FIELD;
4747

48-
if (isArray(data) && data[0]?.nodes) {
48+
if (customFilter) {
49+
return customFilter(data, selectedData, datumField);
50+
} else if (isArray(data) && data[0]?.nodes) {
4951
// data silter for sankey chart
5052
data[0].nodes = data[0].nodes.filter((d: any) => selectedFilter[d.key] === true);
5153
if (data[0]?.links) {
@@ -58,5 +60,6 @@ export const discreteLegendFilter = (data: Array<any>, op: IDiscreteLegendFilter
5860
data = data.filter(d => selectedFilter[series.getSeriesFieldValue(d, datumField)] === true);
5961
}
6062
}
63+
6164
return data;
6265
};

packages/vchart/src/data/transforms/legend-data/discrete/interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ export interface IDiscreteLegendFilterOption {
1818
selected: () => StringOrNumber[];
1919
field: () => string;
2020
data: () => StringOrNumber[];
21+
customFilter?: (data: any, selectedRange: StringOrNumber[], datumField: string) => any;
2122
}

0 commit comments

Comments
 (0)