blob: be6d4aff719bc370fffc02b142bc7ec8522aff4f [file] [log] [blame]
import React from 'react';
import { isCompleteFieldDef } from 'encodable';
import { uniqBy } from 'lodash';
import { Tooltip } from '@vx/tooltip';
import { TooltipFrame, TooltipTable } from '@superset-ui/core';
import { ChoroplethMapChannelOutputs, ChoroplethMapEncoder } from './Encoder';
export type MapDataPoint = Omit<ChoroplethMapChannelOutputs, 'tooltip'> & {
datum: Record<string, unknown>;
};
export type MapTooltipProps = {
top?: number;
left?: number;
encoder: ChoroplethMapEncoder;
tooltipData?: MapDataPoint;
};
export default function MapTooltip({ encoder, left, top, tooltipData }: MapTooltipProps) {
if (!tooltipData) {
return null;
}
const { channels } = encoder;
const { key, fill, stroke, strokeWidth, opacity, tooltip } = channels;
const { datum } = tooltipData;
const tooltipRows = [
{ key: 'key', keyColumn: key.getTitle(), valueColumn: key.formatDatum(datum) },
];
[fill, stroke, opacity, strokeWidth].forEach(channel => {
if (isCompleteFieldDef<string | number>(channel.definition)) {
tooltipRows.push({
key: channel.name as string,
keyColumn: channel.getTitle(),
valueColumn: channel.formatDatum(datum),
});
}
});
tooltip.forEach(g => {
tooltipRows.push({
key: `${g.name}`,
keyColumn: g.getTitle(),
valueColumn: g.formatDatum(datum),
});
});
return (
<Tooltip top={top} left={left}>
<TooltipFrame>
<TooltipTable data={uniqBy(tooltipRows, row => row.keyColumn)} />
</TooltipFrame>
</Tooltip>
);
}