mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 00:55:47 -06:00
1a0c1a39e4
* added moment timezone package. * added a qnd way of selecting timezone. * added a first draft to display how it can be used. * fixed failing tests. * made moment.local to be in utc when running tests. * added tests to verify that the timeZone support works as expected. * Fixed so we use the formatter in the graph context menu. * changed so we will format d3 according to timeZone. * changed from class base to function based for easier consumption. * fixed so tests got green. * renamed to make it shorter. * fixed formatting in logRow. * removed unused value. * added time formatter to flot. * fixed failing tests. * changed so history will use the formatting with support for timezone. * added todo. * added so we append the correct abbrivation behind time. * added time zone abbrevation in timepicker. * adding timezone in rangeutil tool. * will use timezone when formatting range. * changed so we use new functions to format date so timezone is respected. * wip - dashboard settings. * changed so the time picker settings is in react. * added force update. * wip to get the react graph to work. * fixed formatting and parsing on the timepicker. * updated snap to be correct. * fixed so we format values properly in time picker. * make sure we pass timezone on all the proper places. * fixed so we use correct timeZone in explore. * fixed failing tests. * fixed so we always parse from local to selected timezone. * removed unused variable. * reverted back. * trying to fix issue with directive. * fixed issue. * fixed strict null errors. * fixed so we still can select default. * make sure we reads the time zone from getTimezone
190 lines
5.2 KiB
TypeScript
190 lines
5.2 KiB
TypeScript
import React, { PureComponent } from 'react';
|
|
import { css, cx } from 'emotion';
|
|
import { GrafanaTheme, TimeZone, AbsoluteTimeRange, GraphSeriesXY, dateTime } from '@grafana/data';
|
|
|
|
import {
|
|
selectThemeVariant,
|
|
Themeable,
|
|
GraphWithLegend,
|
|
LegendDisplayMode,
|
|
withTheme,
|
|
Collapse,
|
|
GraphSeriesToggler,
|
|
GraphSeriesTogglerAPI,
|
|
Chart,
|
|
Icon,
|
|
} from '@grafana/ui';
|
|
|
|
const MAX_NUMBER_OF_TIME_SERIES = 20;
|
|
|
|
const getStyles = (theme: GrafanaTheme) => ({
|
|
timeSeriesDisclaimer: css`
|
|
label: time-series-disclaimer;
|
|
width: 300px;
|
|
margin: ${theme.spacing.sm} auto;
|
|
padding: 10px 0;
|
|
border-radius: ${theme.border.radius.md};
|
|
text-align: center;
|
|
background-color: ${selectThemeVariant({ light: theme.palette.white, dark: theme.palette.dark4 }, theme.type)};
|
|
`,
|
|
disclaimerIcon: css`
|
|
label: disclaimer-icon;
|
|
color: ${theme.palette.yellow};
|
|
margin-right: ${theme.spacing.xs};
|
|
`,
|
|
showAllTimeSeries: css`
|
|
label: show-all-time-series;
|
|
cursor: pointer;
|
|
color: ${theme.colors.linkExternal};
|
|
`,
|
|
});
|
|
|
|
interface Props extends Themeable {
|
|
series?: GraphSeriesXY[];
|
|
width: number;
|
|
absoluteRange: AbsoluteTimeRange;
|
|
loading?: boolean;
|
|
showPanel: boolean;
|
|
showBars: boolean;
|
|
showLines: boolean;
|
|
isStacked: boolean;
|
|
showingGraph?: boolean;
|
|
showingTable?: boolean;
|
|
timeZone?: TimeZone;
|
|
onUpdateTimeRange: (absoluteRange: AbsoluteTimeRange) => void;
|
|
onToggleGraph?: (showingGraph: boolean) => void;
|
|
onHiddenSeriesChanged?: (hiddenSeries: string[]) => void;
|
|
}
|
|
|
|
interface State {
|
|
hiddenSeries: string[];
|
|
showAllTimeSeries: boolean;
|
|
}
|
|
|
|
class UnThemedExploreGraphPanel extends PureComponent<Props, State> {
|
|
state: State = {
|
|
hiddenSeries: [],
|
|
showAllTimeSeries: false,
|
|
};
|
|
|
|
onShowAllTimeSeries = () => {
|
|
this.setState({
|
|
showAllTimeSeries: true,
|
|
});
|
|
};
|
|
|
|
onClickGraphButton = () => {
|
|
const { onToggleGraph, showingGraph } = this.props;
|
|
if (onToggleGraph) {
|
|
onToggleGraph(showingGraph ?? false);
|
|
}
|
|
};
|
|
|
|
onChangeTime = (from: number, to: number) => {
|
|
const { onUpdateTimeRange } = this.props;
|
|
onUpdateTimeRange({ from, to });
|
|
};
|
|
|
|
renderGraph = () => {
|
|
const {
|
|
width,
|
|
series,
|
|
onHiddenSeriesChanged,
|
|
timeZone,
|
|
absoluteRange,
|
|
showPanel,
|
|
showingGraph,
|
|
showingTable,
|
|
showBars,
|
|
showLines,
|
|
isStacked,
|
|
} = this.props;
|
|
const { showAllTimeSeries } = this.state;
|
|
|
|
if (!series) {
|
|
return null;
|
|
}
|
|
|
|
const timeRange = {
|
|
from: dateTime(absoluteRange.from),
|
|
to: dateTime(absoluteRange.to),
|
|
raw: {
|
|
from: dateTime(absoluteRange.from),
|
|
to: dateTime(absoluteRange.to),
|
|
},
|
|
};
|
|
|
|
const height = showPanel === false ? 100 : showingGraph && showingTable ? 200 : 400;
|
|
const lineWidth = showLines ? 1 : 5;
|
|
const seriesToShow = showAllTimeSeries ? series : series.slice(0, MAX_NUMBER_OF_TIME_SERIES);
|
|
|
|
return (
|
|
<GraphSeriesToggler series={seriesToShow} onHiddenSeriesChanged={onHiddenSeriesChanged}>
|
|
{({ onSeriesToggle, toggledSeries }: GraphSeriesTogglerAPI) => {
|
|
return (
|
|
<GraphWithLegend
|
|
displayMode={LegendDisplayMode.List}
|
|
height={height}
|
|
isLegendVisible={true}
|
|
placement={'under'}
|
|
width={width}
|
|
timeRange={timeRange}
|
|
timeZone={timeZone}
|
|
showBars={showBars}
|
|
showLines={showLines}
|
|
showPoints={false}
|
|
onToggleSort={() => {}}
|
|
series={toggledSeries}
|
|
isStacked={isStacked}
|
|
lineWidth={lineWidth}
|
|
onSeriesToggle={onSeriesToggle}
|
|
onHorizontalRegionSelected={this.onChangeTime}
|
|
>
|
|
{/* For logs we are using mulit mode until we refactor logs histogram to use barWidth instead of lineWidth to render bars */}
|
|
<Chart.Tooltip mode={showBars ? 'multi' : 'single'} />
|
|
</GraphWithLegend>
|
|
);
|
|
}}
|
|
</GraphSeriesToggler>
|
|
);
|
|
};
|
|
|
|
render() {
|
|
const { series, showPanel, showingGraph, loading, theme } = this.props;
|
|
const { showAllTimeSeries } = this.state;
|
|
const style = getStyles(theme);
|
|
|
|
return (
|
|
<>
|
|
{series && series.length > MAX_NUMBER_OF_TIME_SERIES && !showAllTimeSeries && (
|
|
<div className={cx([style.timeSeriesDisclaimer])}>
|
|
<Icon className={style.disclaimerIcon} name="exclamation-triangle" />
|
|
{`Showing only ${MAX_NUMBER_OF_TIME_SERIES} time series. `}
|
|
<span
|
|
className={cx([style.showAllTimeSeries])}
|
|
onClick={this.onShowAllTimeSeries}
|
|
>{`Show all ${series.length}`}</span>
|
|
</div>
|
|
)}
|
|
|
|
{showPanel && (
|
|
<Collapse
|
|
label="Graph"
|
|
collapsible
|
|
isOpen={showingGraph}
|
|
loading={loading}
|
|
onToggle={this.onClickGraphButton}
|
|
>
|
|
{this.renderGraph()}
|
|
</Collapse>
|
|
)}
|
|
|
|
{!showPanel && this.renderGraph()}
|
|
</>
|
|
);
|
|
}
|
|
}
|
|
|
|
export const ExploreGraphPanel = withTheme(UnThemedExploreGraphPanel);
|
|
ExploreGraphPanel.displayName = 'ExploreGraphPanel';
|