import { InteractionItem, TooltipItem, Tooltip, TooltipModel } from 'chart.js'; export interface ExtendedTooltip extends TooltipModel<'boxplot' | 'violin'> { _tooltipOutlier?: { index: number; datasetIndex: number; }; } /** * @hidden */ export function patchInHoveredOutlier( this: TooltipModel<'boxplot' | 'violin'>, item: TooltipItem<'boxplot' | 'violin'> ): void { const value = item.formattedValue as any; const that = this as ExtendedTooltip; if (value && that._tooltipOutlier != null && item.datasetIndex === that._tooltipOutlier.datasetIndex) { value.hoveredOutlierIndex = that._tooltipOutlier.index; } } /** * based on average positioner but allow access to the tooltip instance * @hidden */ export function outlierPositioner( this: TooltipModel<'boxplot' | 'violin'>, items: readonly InteractionItem[], eventPosition: { x: number; y: number } ): false | { x: number; y: number } { if (!items.length) { return false; } let x = 0; let y = 0; let count = 0; for (let i = 0; i < items.length; i += 1) { const el = items[i].element; if (el && el.hasValue()) { const pos = (el as any).tooltipPosition(eventPosition, this); x += pos.x; y += pos.y; count += 1; } } return { x: x / count, y: y / count, }; } outlierPositioner.id = 'average'; outlierPositioner.register = () => { Tooltip.positioners.average = outlierPositioner as any; return outlierPositioner; };