import _ from 'lodash'; import React from 'react'; import { TimeSeries } from 'app/core/core'; import CustomScrollbar from 'app/core/components/CustomScrollbar/CustomScrollbar'; import { LegendItem, LEGEND_STATS } from './LegendSeriesItem'; interface LegendProps { seriesList: TimeSeries[]; optionalClass?: string; onToggleSeries?: (series: TimeSeries, event: Event) => void; onToggleSort?: (sortBy, sortDesc) => void; onToggleAxis?: (series: TimeSeries) => void; onColorChange?: (series: TimeSeries, color: string) => void; } interface LegendDisplayProps { hiddenSeries: any; hideEmpty?: boolean; hideZero?: boolean; alignAsTable?: boolean; rightSide?: boolean; sideWidth?: number; } interface LegendValuesProps { values?: boolean; min?: boolean; max?: boolean; avg?: boolean; current?: boolean; total?: boolean; } interface LegendSortProps { sort?: 'min' | 'max' | 'avg' | 'current' | 'total'; sortDesc?: boolean; } export type GraphLegendProps = LegendProps & LegendDisplayProps & LegendValuesProps & LegendSortProps; export class GraphLegend extends React.PureComponent { static defaultProps: Partial = { values: false, min: false, max: false, avg: false, current: false, total: false, alignAsTable: false, rightSide: false, sort: undefined, sortDesc: false, optionalClass: '', onToggleSeries: () => {}, onToggleSort: () => {}, onToggleAxis: () => {}, onColorChange: () => {}, }; sortLegend() { let seriesList = this.props.seriesList || []; if (this.props.sort) { seriesList = _.sortBy(seriesList, series => { let sort = series.stats[this.props.sort]; if (sort === null) { sort = -Infinity; } return sort; }); if (this.props.sortDesc) { seriesList = seriesList.reverse(); } } return seriesList; } onToggleSeries(series: TimeSeries, event: Event) { // const scrollPosition = legendScrollbar.scroller.scrollTop; this.props.onToggleSeries(series, event); // legendScrollbar.scroller.scrollTop = scrollPosition; } render() { const { optionalClass, hiddenSeries, rightSide, sideWidth, sort, sortDesc, hideEmpty, hideZero } = this.props; const { values, min, max, avg, current, total } = this.props; const seriesValuesProps = { values, min, max, avg, current, total }; const seriesHideProps = { hideEmpty, hideZero }; const sortProps = { sort, sortDesc }; const seriesList = _.filter(this.sortLegend(), series => !series.hideFromLegend(seriesHideProps)); const legendClass = `${this.props.alignAsTable ? 'graph-legend-table' : ''} ${optionalClass}`; // Set min-width if side style and there is a value, otherwise remove the CSS property // Set width so it works with IE11 const width: any = rightSide && sideWidth ? sideWidth : undefined; const ieWidth: any = rightSide && sideWidth ? sideWidth - 1 : undefined; const legendStyle: React.CSSProperties = { minWidth: width, width: ieWidth, }; const legendProps: GraphLegendProps = { seriesList: seriesList, hiddenSeries: hiddenSeries, onToggleSeries: (s, e) => this.onToggleSeries(s, e), onToggleSort: (sortBy, sortDesc) => this.props.onToggleSort(sortBy, sortDesc), onColorChange: (series, color) => this.props.onColorChange(series, color), onToggleAxis: series => this.props.onToggleAxis(series), ...seriesValuesProps, ...sortProps, }; return (
{this.props.alignAsTable ? : }
); } } class LegendSeriesList extends React.PureComponent { render() { const { seriesList, hiddenSeries, values, min, max, avg, current, total } = this.props; const seriesValuesProps = { values, min, max, avg, current, total }; return seriesList.map((series, i) => ( this.props.onToggleSeries(series, e)} onColorChange={color => this.props.onColorChange(series, color)} onToggleAxis={() => this.props.onToggleAxis(series)} /> )); } } class LegendTable extends React.PureComponent> { onToggleSort(stat) { let sortDesc = this.props.sortDesc; let sortBy = this.props.sort; if (stat !== sortBy) { sortDesc = null; } // if already sort ascending, disable sorting if (sortDesc === false) { sortBy = null; sortDesc = null; } else { sortDesc = !sortDesc; sortBy = stat; } this.props.onToggleSort(sortBy, sortDesc); } render() { const seriesList = this.props.seriesList; const { values, min, max, avg, current, total, sort, sortDesc } = this.props; const seriesValuesProps = { values, min, max, avg, current, total }; return ( {seriesList.map((series, i) => ( this.props.onToggleSeries(series, e)} onColorChange={color => this.props.onColorChange(series, color)} onToggleAxis={() => this.props.onToggleAxis(series)} {...seriesValuesProps} /> ))}
{LEGEND_STATS.map( statName => seriesValuesProps[statName] && ( this.onToggleSort(statName)} /> ) )}
); } } interface LegendTableHeaderProps { statName: string; onClick?: (event) => void; } function LegendTableHeaderItem(props: LegendTableHeaderProps & LegendSortProps) { const { statName, sort, sortDesc } = props; return ( props.onClick(e)}> {statName} {sort === statName && } ); } export class Legend extends React.Component { render() { return ( ); } } export default Legend;