Legend.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import React, { MouseEvent, PureComponent } from 'react';
  2. import classNames from 'classnames';
  3. import { TimeSeries } from 'app/core/core';
  4. interface LegendProps {
  5. data: TimeSeries[];
  6. hiddenSeries: Set<string>;
  7. onToggleSeries?: (series: TimeSeries, exclusive: boolean) => void;
  8. }
  9. interface LegendItemProps {
  10. hidden: boolean;
  11. onClickLabel?: (series: TimeSeries, event: MouseEvent) => void;
  12. series: TimeSeries;
  13. }
  14. class LegendItem extends PureComponent<LegendItemProps> {
  15. onClickLabel = e => this.props.onClickLabel(this.props.series, e);
  16. render() {
  17. const { hidden, series } = this.props;
  18. const seriesClasses = classNames({
  19. 'graph-legend-series-hidden': hidden,
  20. });
  21. return (
  22. <div className={`graph-legend-series ${seriesClasses}`}>
  23. <div className="graph-legend-icon">
  24. <i className="fa fa-minus pointer" style={{ color: series.color }} />
  25. </div>
  26. <a className="graph-legend-alias pointer" title={series.alias} onClick={this.onClickLabel}>
  27. {series.alias}
  28. </a>
  29. </div>
  30. );
  31. }
  32. }
  33. export default class Legend extends PureComponent<LegendProps> {
  34. static defaultProps = {
  35. onToggleSeries: () => {},
  36. };
  37. onClickLabel = (series: TimeSeries, event: MouseEvent) => {
  38. const { onToggleSeries } = this.props;
  39. const exclusive = event.ctrlKey || event.metaKey || event.shiftKey;
  40. onToggleSeries(series, !exclusive);
  41. };
  42. render() {
  43. const { data, hiddenSeries } = this.props;
  44. const items = data || [];
  45. return (
  46. <div className="graph-legend ps">
  47. {items.map((series, i) => (
  48. <LegendItem
  49. hidden={hiddenSeries.has(series.alias)}
  50. // Workaround to resolve conflicts since series visibility tracks the alias property
  51. key={`${series.id}-${i}`}
  52. onClickLabel={this.onClickLabel}
  53. series={series}
  54. />
  55. ))}
  56. </div>
  57. );
  58. }
  59. }