Skip to content

Commit fbb2662

Browse files
committed
feat: point mark and bar mark support group tooltip
1 parent f526f9a commit fbb2662

File tree

7 files changed

+75
-39
lines changed

7 files changed

+75
-39
lines changed

packages/vchart/src/component/tooltip/interface/common.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ export type TooltipHandlerParams = DimensionEventParams & {
1313
tooltipSpec?: ITooltipSpec;
1414
/** 本次触发的 tooltip 的显示数据 */
1515
tooltipActual?: ITooltipActual;
16+
/** 和 datum 同组的数据项 */
17+
groupDatum?: Datum[];
1618
};
1719

1820
export interface ITooltipActiveTypeAsKeys<T, K, U> {

packages/vchart/src/component/tooltip/processor/base.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { ITooltipSpec, TooltipHandlerParams } from '../interface';
55
// eslint-disable-next-line no-duplicate-imports
66
import { TooltipResult } from '../interface/common';
77
import type { Tooltip } from '../tooltip';
8-
import type { MouseEventData, TooltipInfo } from './interface';
8+
import type { DimensionTooltipInfo, MouseEventData, TooltipInfo } from './interface';
99
import { ChartEvent } from '../../../constant';
1010
import type { TooltipEventParams } from '../interface/event';
1111
import type { IDimensionData, IDimensionInfo } from '../../../event/events/dimension';
@@ -35,7 +35,7 @@ export abstract class BaseTooltipProcessor {
3535
abstract shouldHandleTooltip(params: BaseEventParams, mouseEventData: Partial<MouseEventData>): boolean;
3636

3737
/** 获取触发 tooltip 需要的信息 */
38-
abstract getMouseEventData(params: BaseEventParams): MouseEventData;
38+
abstract getMouseEventData(params: BaseEventParams, dimensionInfo?: DimensionTooltipInfo): MouseEventData;
3939

4040
protected _showTooltipByHandler = (data: TooltipData | undefined, params: TooltipHandlerParams): TooltipResult => {
4141
if (isNil(data)) {

packages/vchart/src/component/tooltip/processor/group-tooltip.ts

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { BaseEventParams } from '../../../event/interface';
2-
import type { IGroupTooltipPattern, TooltipActiveType } from '../../../typings';
2+
import type { Datum, IGroupTooltipPattern, TooltipActiveType } from '../../../typings';
33
import type { ITooltipSpec, TooltipHandlerParams } from '../interface';
4-
import type { GroupTooltipInfo, MouseEventData } from './interface';
4+
import type { DimensionTooltipInfo, GroupTooltipInfo, MouseEventData } from './interface';
55
import { BaseTooltipProcessor } from './base';
66
import { array, isNil } from '@visactor/vutils';
77
import type { ISeries } from '../../../series/interface';
@@ -15,6 +15,7 @@ export class GroupTooltipProcessor extends BaseTooltipProcessor {
1515
const tooltipData = [{ datum: array(datum), series }];
1616
const newParams: TooltipHandlerParams = {
1717
...(params as any),
18+
groupDatum: this._getGroupDatum(params),
1819
dimensionInfo: this._preprocessDimensionInfo(dimensionInfo),
1920
changePositionOnly,
2021
tooltip: this.component
@@ -37,7 +38,7 @@ export class GroupTooltipProcessor extends BaseTooltipProcessor {
3738
}
3839

3940
/** 获取触发 tooltip 需要的信息 */
40-
getMouseEventData(params: BaseEventParams): MouseEventData {
41+
getMouseEventData(params: BaseEventParams, dimensionInfo?: DimensionTooltipInfo): MouseEventData {
4142
let info: GroupTooltipInfo | undefined;
4243
let ignore: boolean | undefined;
4344

@@ -54,9 +55,9 @@ export class GroupTooltipProcessor extends BaseTooltipProcessor {
5455
if (triggerMark.includes(params.mark?.name as any)) {
5556
info = {
5657
mark: params.mark,
57-
datum: array(params.datum),
58+
datum: params.datum,
5859
series,
59-
dimensionInfo: this._getDimensionInfo(params)
60+
dimensionInfo
6061
};
6162
}
6263
} else if (ignoreTriggers?.has(params.model) || ignoreTriggers?.has(params.mark)) {
@@ -69,4 +70,21 @@ export class GroupTooltipProcessor extends BaseTooltipProcessor {
6970
ignore
7071
};
7172
}
73+
74+
protected _getGroupDatum(params: BaseEventParams) {
75+
const { model, mark, datum } = params;
76+
const series = model as ISeries;
77+
if (['line', 'area'].includes(mark.type)) {
78+
return array(datum);
79+
}
80+
81+
const datumList = series.getViewData().latestData;
82+
const seriesField = series.getSeriesField();
83+
if (!seriesField) {
84+
return datumList;
85+
}
86+
87+
const seriesFieldValue = array(datum)[0][seriesField];
88+
return datumList.filter((d: Datum) => d[seriesField] === seriesFieldValue);
89+
}
7290
}

packages/vchart/src/component/tooltip/processor/interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export type MarkTooltipInfo<T = Datum> = {
1212
dimensionInfo: DimensionTooltipInfo;
1313
};
1414

15-
export type GroupTooltipInfo = MarkTooltipInfo<Datum[]>;
15+
export type GroupTooltipInfo = MarkTooltipInfo<Datum | Datum[]>;
1616

1717
export type TooltipInfo = DimensionTooltipInfo | MarkTooltipInfo | GroupTooltipInfo;
1818

packages/vchart/src/component/tooltip/processor/mark-tooltip.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { BaseEventParams } from '../../../event/interface';
22
import type { TooltipActiveType } from '../../../typings';
33
import type { TooltipHandlerParams } from '../interface';
4-
import type { MarkTooltipInfo, MouseEventData } from './interface';
4+
import type { DimensionTooltipInfo, MarkTooltipInfo, MouseEventData } from './interface';
55
import { BaseTooltipProcessor } from './base';
66
import { isNil } from '@visactor/vutils';
77
import type { ISeries } from '../../../series/interface';
@@ -37,7 +37,7 @@ export class MarkTooltipProcessor extends BaseTooltipProcessor {
3737
}
3838

3939
/** 获取触发 tooltip 需要的信息 */
40-
getMouseEventData(params: BaseEventParams): MouseEventData {
40+
getMouseEventData(params: BaseEventParams, dimensionInfo?: DimensionTooltipInfo): MouseEventData {
4141
let info: MarkTooltipInfo | undefined;
4242
let ignore: boolean | undefined;
4343

@@ -52,7 +52,7 @@ export class MarkTooltipProcessor extends BaseTooltipProcessor {
5252
mark: params.mark,
5353
datum: params.datum,
5454
series,
55-
dimensionInfo: this._getDimensionInfo(params)
55+
dimensionInfo
5656
};
5757
} else if (ignoreTriggers?.has(params.model) || ignoreTriggers?.has(params.mark)) {
5858
ignore = true;

packages/vchart/src/component/tooltip/tooltip.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,9 @@ export class Tooltip extends BaseComponent<any> implements ITooltip {
299299
};
300300

301301
/* 显示常规tooltip */
302-
success.mark = this._showTooltipByMouseEvent('mark', mouseEventData, params, isClick);
303-
if (!success.mark) {
304-
success.group = this._showTooltipByMouseEvent('group', mouseEventData, params, isClick);
302+
success.group = this._showTooltipByMouseEvent('group', mouseEventData, params, isClick);
303+
if (!success.group) {
304+
success.mark = this._showTooltipByMouseEvent('mark', mouseEventData, params, isClick);
305305
}
306306
if (!success.mark && !success.group) {
307307
success.dimension = this._showTooltipByMouseEvent('dimension', mouseEventData, params, isClick);
@@ -389,11 +389,21 @@ export class Tooltip extends BaseComponent<any> implements ITooltip {
389389
tooltipInfo: {},
390390
ignore: {}
391391
};
392-
Object.keys(this._processor).forEach(activeType => {
393-
const { tooltipInfo, ignore } = (this._processor[activeType] as BaseTooltipProcessor).getMouseEventData(params);
394-
result.tooltipInfo[activeType] = tooltipInfo;
395-
result.ignore[activeType] = ignore;
396-
});
392+
393+
let activeType: TooltipActiveType = 'dimension';
394+
const { tooltipInfo, ignore } = this._processor[activeType].getMouseEventData(params);
395+
result.tooltipInfo[activeType] = tooltipInfo as any;
396+
result.ignore[activeType] = ignore;
397+
398+
const dimensionInfo = tooltipInfo as DimensionTooltipInfo;
399+
400+
for (activeType of Object.keys(this._processor) as any) {
401+
if (activeType !== 'dimension') {
402+
const { tooltipInfo, ignore } = this._processor[activeType].getMouseEventData(params, dimensionInfo);
403+
result.tooltipInfo[activeType] = tooltipInfo as any;
404+
result.ignore[activeType] = ignore;
405+
}
406+
}
397407
return result;
398408
};
399409

packages/vchart/src/component/tooltip/utils/compose.ts

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { IDimensionData, IDimensionInfo } from '../../../event';
1010
import { TOOLTIP_MAX_LINE_COUNT, TOOLTIP_OTHERS_LINE } from '../constant';
1111
import { getTooltipActualActiveType } from '.';
1212
import type { TooltipActualTitleContent, TooltipHandlerParams } from '..';
13+
import type { Datum } from '../../../typings';
1314

1415
const getTimeString = (value: any, timeFormat?: string, timeFormatMode?: 'local' | 'utc') => {
1516
if (!timeFormat && !timeFormatMode) {
@@ -86,30 +87,35 @@ export const getShowContent = (
8687
}
8788
: TOOLTIP_OTHERS_LINE;
8889

89-
switch (pattern.activeType) {
90-
case 'mark':
91-
case 'group':
92-
const datumList = (data as IDimensionData[])[0]?.datum;
93-
if (datumList?.length) {
94-
for (const datum of datumList) {
95-
for (const content of patternContent ?? []) {
96-
const oneLineData = getOneLineData(datum, content, params);
97-
if (oneLineData.visible !== false) {
98-
if (tooltipActualTitleContent.content.length === maxLineCount - 1) {
99-
tooltipActualTitleContent.content.push({
100-
...oneLineData,
101-
...othersLine
102-
});
103-
break;
104-
} else if (tooltipActualTitleContent.content.length < maxLineCount) {
105-
tooltipActualTitleContent.content.push(oneLineData);
106-
} else {
107-
break;
108-
}
90+
const getTooltipContentFromDatumList = (datumList?: Datum[]) => {
91+
if (datumList?.length) {
92+
for (const datum of datumList) {
93+
for (const content of patternContent ?? []) {
94+
const oneLineData = getOneLineData(datum, content, params);
95+
if (oneLineData.visible !== false) {
96+
if (tooltipActualTitleContent.content.length === maxLineCount - 1) {
97+
tooltipActualTitleContent.content.push({
98+
...oneLineData,
99+
...othersLine
100+
});
101+
break;
102+
} else if (tooltipActualTitleContent.content.length < maxLineCount) {
103+
tooltipActualTitleContent.content.push(oneLineData);
104+
} else {
105+
break;
109106
}
110107
}
111108
}
112109
}
110+
}
111+
};
112+
113+
switch (pattern.activeType) {
114+
case 'mark':
115+
getTooltipContentFromDatumList((data as IDimensionData[])[0]?.datum);
116+
break;
117+
case 'group':
118+
getTooltipContentFromDatumList(params.groupDatum);
113119
break;
114120
case 'dimension':
115121
for (const { data: d } of data as IDimensionInfo[]) {

0 commit comments

Comments
 (0)