Skip to content

Commit dc80db2

Browse files
authored
fix: legend 自定义items 添加marker回调 (#3591)
Co-authored-by: ai-qing-hai <[email protected]>
1 parent d5588a0 commit dc80db2

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

src/interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,7 @@ export interface LegendItem {
899899
/** 值 */
900900
value: any;
901901
/** 图形标记 */
902-
marker?: MarkerCfg;
902+
marker?: MarkerCfg | ((name: string, index: number, item: { name: string; value: string } & MarkerCfg) => MarkerCfg);
903903
/** 初始是否处于未激活状态 */
904904
unchecked?: boolean;
905905
}

src/util/legend.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,13 @@ export function getCustomLegendItems(themeMarker: object, userMarker: object, cu
145145
// 如果有自定义的 item,那么就直接使用,并合并主题的 marker 配置
146146
return customItems.map((item: LegendItem, index: number) => {
147147
let markerCfg = userMarker;
148-
if (isFunction(markerCfg)) {
149-
markerCfg = markerCfg(item.name, index, deepMix({}, themeMarker, item))
150-
}
151-
const marker = deepMix({}, themeMarker, markerCfg, item.marker);
148+
if (isFunction(markerCfg)) {
149+
markerCfg = markerCfg(item.name, index, deepMix({}, themeMarker, item))
150+
}
151+
152+
const itemMarker = isFunction(item.marker) ? item.marker(item.name, index, deepMix({}, themeMarker, item)) : item.marker;
153+
154+
const marker = deepMix({}, themeMarker, markerCfg, itemMarker);
152155
setMarkerSymbol(marker);
153156

154157
item.marker = marker;

tests/unit/chart/controller/legend-spec.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,43 @@ describe('Legend', () => {
147147
expect(legends[0].component.get('title').text).toBe('城市');
148148
});
149149

150+
it('items marker callback custom', () => {
151+
const container = createDiv();
152+
chart = new Chart({
153+
container,
154+
height: 500,
155+
width: 600,
156+
autoFit: false,
157+
});
158+
chart.data([
159+
{ name: 'London', 月份: 'Jan.', 月均降雨量: 18.9 },
160+
{ name: 'London', 月份: 'Feb.', 月均降雨量: 28.8 },
161+
{ name: 'London', 月份: 'Mar.', 月均降雨量: 39.3 },
162+
{ name: 'Berlin', 月份: 'Jan.', 月均降雨量: 12.4 },
163+
{ name: 'Berlin', 月份: 'Feb.', 月均降雨量: 23.2 },
164+
{ name: 'Berlin', 月份: 'Mar.', 月均降雨量: 34.5 },
165+
]);
166+
167+
chart.legend({
168+
custom: true,
169+
items: [
170+
{ name: 'London', value: 'London', marker: () => ({ symbol: 'tick', style: { r: 10 } }) },
171+
{ name: 'Berlin', value: 'Berlin', marker: () => ({ symbol: 'circle', style: { r: 10 } }) },
172+
],
173+
title: {
174+
text: '城市',
175+
},
176+
});
177+
178+
chart.interval().position('月份*月均降雨量').size('月均降雨量').adjust('dodge');
179+
chart.render();
180+
181+
const legends = chart.getComponents().filter((co) => co.type === COMPONENT_TYPE.LEGEND);
182+
expect(legends[0].component.get('items')[0].marker.symbol).toBeInstanceOf(Function);
183+
expect(legends[0].component.get('items')[1].marker.symbol).toBe('circle');
184+
expect(legends[0].component.get('title').text).toBe('城市');
185+
});
186+
150187
it('category legend, use hexagon marker', () => {
151188
const container = createDiv();
152189
chart = new Chart({

0 commit comments

Comments
 (0)