Skip to content

Commit 57caa31

Browse files
committed
feat: add config customFilter to legend, support cutomized filter function, close #3492
1 parent e5d8652 commit 57caa31

File tree

7 files changed

+29
-12
lines changed

7 files changed

+29
-12
lines changed

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)