mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
graph: make table markup corresponding to standards
This commit is contained in:
parent
0e10fdb415
commit
329f39e4d7
@ -41,90 +41,39 @@ export class GraphLegend extends React.PureComponent<GraphLegendProps, GraphLege
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { className = '', hiddenSeries } = this.props;
|
const { className, hiddenSeries, sideWidth } = this.props;
|
||||||
const { values, min, max, avg, current, total } = this.props;
|
const { values, min, max, avg, current, total } = this.props;
|
||||||
const seriesValuesProps = { values, min, max, avg, current, total };
|
const seriesValuesProps = { values, min, max, avg, current, total };
|
||||||
const seriesList = this.sortLegend();
|
const seriesList = this.sortLegend();
|
||||||
|
const legendStyle: React.CSSProperties = {
|
||||||
|
width: sideWidth,
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={`${className} graph-legend`}>
|
<div
|
||||||
<div className={`graph-legend-content ${this.props.alignAsTable ? 'graph-legend-table' : ''}`}>
|
className={`graph-legend-content ${className} ${this.props.alignAsTable ? 'graph-legend-table' : ''}`}
|
||||||
<div className="graph-legend-scroll">
|
style={legendStyle}
|
||||||
{this.props.alignAsTable ? (
|
>
|
||||||
<LegendTable seriesList={seriesList} hiddenSeries={hiddenSeries} {...seriesValuesProps} />
|
<div className="graph-legend-scroll">
|
||||||
) : (
|
{this.props.alignAsTable ? (
|
||||||
seriesList.map((series, i) => (
|
<LegendTable seriesList={seriesList} hiddenSeries={hiddenSeries} {...seriesValuesProps} />
|
||||||
<LegendSeriesItem
|
) : (
|
||||||
key={series.id}
|
seriesList.map((series, i) => (
|
||||||
series={series}
|
<LegendSeriesItem
|
||||||
index={i}
|
key={series.id}
|
||||||
hiddenSeries={hiddenSeries}
|
series={series}
|
||||||
{...seriesValuesProps}
|
index={i}
|
||||||
/>
|
hiddenSeries={hiddenSeries}
|
||||||
))
|
{...seriesValuesProps}
|
||||||
)}
|
/>
|
||||||
</div>
|
))
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface LegendTableProps {
|
|
||||||
seriesList: any[];
|
|
||||||
hiddenSeries: any;
|
|
||||||
values?: boolean;
|
|
||||||
min?: boolean;
|
|
||||||
max?: boolean;
|
|
||||||
avg?: boolean;
|
|
||||||
current?: boolean;
|
|
||||||
total?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
class LegendTable extends React.PureComponent<LegendTableProps> {
|
|
||||||
render() {
|
|
||||||
const seriesList = this.props.seriesList;
|
|
||||||
const { values, min, max, avg, current, total } = this.props;
|
|
||||||
const seriesValuesProps = { values, min, max, avg, current, total };
|
|
||||||
const headerStyle: React.CSSProperties = {
|
|
||||||
textAlign: 'left',
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<th colSpan={2} style={headerStyle} />
|
|
||||||
{LEGEND_STATS.map(
|
|
||||||
statName => seriesValuesProps[statName] && <LegendTableHeader key={statName} statName={statName} />
|
|
||||||
)}
|
|
||||||
</tr>
|
|
||||||
{seriesList.map((series, i) => (
|
|
||||||
<LegendSeriesItem
|
|
||||||
key={series.id}
|
|
||||||
series={series}
|
|
||||||
index={i}
|
|
||||||
hiddenSeries={this.props.hiddenSeries}
|
|
||||||
{...seriesValuesProps}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</tbody>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface LegendTableHeaderProps {
|
|
||||||
statName: string;
|
|
||||||
sortDesc?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
function LegendTableHeader(props: LegendTableHeaderProps) {
|
|
||||||
return (
|
|
||||||
<th className="pointer" data-stat={props.statName}>
|
|
||||||
{props.statName}
|
|
||||||
<span className={props.sortDesc ? 'fa fa-caret-down' : 'fa fa-caret-up'} />
|
|
||||||
</th>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
interface LegendSeriesItemProps {
|
interface LegendSeriesItemProps {
|
||||||
series: any;
|
series: any;
|
||||||
index: number;
|
index: number;
|
||||||
@ -163,20 +112,105 @@ class LegendSeriesItem extends React.Component<LegendSeriesItemProps> {
|
|||||||
function LegendValue(props) {
|
function LegendValue(props) {
|
||||||
const value = props.value;
|
const value = props.value;
|
||||||
const valueName = props.valueName;
|
const valueName = props.valueName;
|
||||||
|
if (props.asTable) {
|
||||||
|
return <td className={`graph-legend-value ${valueName}`}>{value}</td>;
|
||||||
|
}
|
||||||
return <div className={`graph-legend-value ${valueName}`}>{value}</div>;
|
return <div className={`graph-legend-value ${valueName}`}>{value}</div>;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderLegendValues(props: LegendSeriesItemProps, series) {
|
function renderLegendValues(props: LegendSeriesItemProps, series, asTable = false) {
|
||||||
const legendValueItems = [];
|
const legendValueItems = [];
|
||||||
for (const valueName of LEGEND_STATS) {
|
for (const valueName of LEGEND_STATS) {
|
||||||
if (props[valueName]) {
|
if (props[valueName]) {
|
||||||
const valueFormatted = series.formatValue(series.stats[valueName]);
|
const valueFormatted = series.formatValue(series.stats[valueName]);
|
||||||
legendValueItems.push(<LegendValue key={valueName} valueName={valueName} value={valueFormatted} />);
|
legendValueItems.push(
|
||||||
|
<LegendValue key={valueName} valueName={valueName} value={valueFormatted} asTable={asTable} />
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return legendValueItems;
|
return legendValueItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface LegendTableProps {
|
||||||
|
seriesList: any[];
|
||||||
|
hiddenSeries: any;
|
||||||
|
values?: boolean;
|
||||||
|
min?: boolean;
|
||||||
|
max?: boolean;
|
||||||
|
avg?: boolean;
|
||||||
|
current?: boolean;
|
||||||
|
total?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
class LegendTable extends React.PureComponent<LegendTableProps> {
|
||||||
|
render() {
|
||||||
|
const seriesList = this.props.seriesList;
|
||||||
|
const { values, min, max, avg, current, total } = this.props;
|
||||||
|
const seriesValuesProps = { values, min, max, avg, current, total };
|
||||||
|
|
||||||
|
return (
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th style={{ textAlign: 'left' }} />
|
||||||
|
{LEGEND_STATS.map(
|
||||||
|
statName => seriesValuesProps[statName] && <LegendTableHeader key={statName} statName={statName} />
|
||||||
|
)}
|
||||||
|
</tr>
|
||||||
|
{seriesList.map((series, i) => (
|
||||||
|
<LegendSeriesItemAsTable
|
||||||
|
key={series.id}
|
||||||
|
series={series}
|
||||||
|
index={i}
|
||||||
|
hiddenSeries={this.props.hiddenSeries}
|
||||||
|
{...seriesValuesProps}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LegendSeriesItemAsTable extends React.Component<LegendSeriesItemProps> {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { series, index, hiddenSeries } = this.props;
|
||||||
|
const seriesOptionClasses = getOptionSeriesCSSClasses(series, hiddenSeries);
|
||||||
|
const valueItems = this.props.values ? renderLegendValues(this.props, series, true) : [];
|
||||||
|
return (
|
||||||
|
<tr className={`graph-legend-series ${seriesOptionClasses}`} data-series-index={index}>
|
||||||
|
<td>
|
||||||
|
<div className="graph-legend-icon">
|
||||||
|
<i className="fa fa-minus pointer" style={{ color: series.color }} />
|
||||||
|
</div>
|
||||||
|
<a className="graph-legend-alias pointer" title={series.aliasEscaped}>
|
||||||
|
{series.aliasEscaped}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
{valueItems}
|
||||||
|
</tr>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface LegendTableHeaderProps {
|
||||||
|
statName: string;
|
||||||
|
sortDesc?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
function LegendTableHeader(props: LegendTableHeaderProps) {
|
||||||
|
return (
|
||||||
|
<th className="pointer" data-stat={props.statName}>
|
||||||
|
{props.statName}
|
||||||
|
<span className={props.sortDesc ? 'fa fa-caret-down' : 'fa fa-caret-up'} />
|
||||||
|
</th>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function getOptionSeriesCSSClasses(series, hiddenSeries) {
|
function getOptionSeriesCSSClasses(series, hiddenSeries) {
|
||||||
const classes = [];
|
const classes = [];
|
||||||
if (series.yaxis === 2) {
|
if (series.yaxis === 2) {
|
||||||
|
Loading…
Reference in New Issue
Block a user