2018-11-15 07:56:52 -06:00
|
|
|
import React, { MouseEvent, PureComponent } from 'react';
|
|
|
|
import classNames from 'classnames';
|
|
|
|
import { TimeSeries } from 'app/core/core';
|
2018-04-26 04:58:42 -05:00
|
|
|
|
2018-11-15 07:56:52 -06:00
|
|
|
interface LegendProps {
|
|
|
|
data: TimeSeries[];
|
|
|
|
hiddenSeries: Set<string>;
|
|
|
|
onToggleSeries?: (series: TimeSeries, exclusive: boolean) => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface LegendItemProps {
|
|
|
|
hidden: boolean;
|
|
|
|
onClickLabel?: (series: TimeSeries, event: MouseEvent) => void;
|
|
|
|
series: TimeSeries;
|
|
|
|
}
|
|
|
|
|
|
|
|
class LegendItem extends PureComponent<LegendItemProps> {
|
|
|
|
onClickLabel = e => this.props.onClickLabel(this.props.series, e);
|
|
|
|
|
|
|
|
render() {
|
|
|
|
const { hidden, series } = this.props;
|
|
|
|
const seriesClasses = classNames({
|
|
|
|
'graph-legend-series-hidden': hidden,
|
|
|
|
});
|
|
|
|
return (
|
|
|
|
<div className={`graph-legend-series ${seriesClasses}`}>
|
|
|
|
<div className="graph-legend-icon">
|
|
|
|
<i className="fa fa-minus pointer" style={{ color: series.color }} />
|
|
|
|
</div>
|
|
|
|
<a className="graph-legend-alias pointer" title={series.alias} onClick={this.onClickLabel}>
|
|
|
|
{series.alias}
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default class Legend extends PureComponent<LegendProps> {
|
|
|
|
static defaultProps = {
|
|
|
|
onToggleSeries: () => {},
|
|
|
|
};
|
|
|
|
|
|
|
|
onClickLabel = (series: TimeSeries, event: MouseEvent) => {
|
|
|
|
const { onToggleSeries } = this.props;
|
|
|
|
const exclusive = event.ctrlKey || event.metaKey || event.shiftKey;
|
|
|
|
onToggleSeries(series, !exclusive);
|
|
|
|
};
|
2018-04-26 04:58:42 -05:00
|
|
|
|
|
|
|
render() {
|
2018-11-15 07:56:52 -06:00
|
|
|
const { data, hiddenSeries } = this.props;
|
2018-04-26 04:58:42 -05:00
|
|
|
const items = data || [];
|
|
|
|
return (
|
2018-11-15 07:56:52 -06:00
|
|
|
<div className="graph-legend ps">
|
|
|
|
{items.map((series, i) => (
|
|
|
|
<LegendItem
|
|
|
|
hidden={hiddenSeries.has(series.alias)}
|
|
|
|
// Workaround to resolve conflicts since series visibility tracks the alias property
|
|
|
|
key={`${series.id}-${i}`}
|
|
|
|
onClickLabel={this.onClickLabel}
|
|
|
|
series={series}
|
|
|
|
/>
|
|
|
|
))}
|
2018-04-26 04:58:42 -05:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|