mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 08:35:43 -06:00
db48ec1f08
* Wip: Initial commit * Refactor: Adds support in Loki datasource for streaming * Refactor: Adds Live option to RefreshInterval * Refactor: Adds styles to logrows * Style: Reverses the order of Explore layout on Live * Refactor: Adds LiveLogs component * Tests: Adds tests for epics * Style: Adds animation to Live in RefreshPicker * Refactor: Adds ElapsedTime and progress line to LiveLogs * Style: Adds specific colors to each theme * Refactor: Adds support for Lokis new API * Fix: Adds null to resulting empty array * Refactor: Limits the rate of incoming messages from websockets * Refactor: Throttles messages instead for simplicity * Refactor: Optimizes row processing performance * Refactor: Adds stop live button * Fix: Fixes so that RefreshPicker shows the correct value when called programmatically * Refactor: Merges with master and removes a console.log * Refactor: Sorts rows in correct order and fixes minor UI issues * Refactor: Adds minor improvments to sorting and container size
72 lines
1.6 KiB
TypeScript
72 lines
1.6 KiB
TypeScript
import React, { PureComponent } from 'react';
|
|
import { toDuration } from '@grafana/ui/src/utils/moment_wrapper';
|
|
|
|
const INTERVAL = 150;
|
|
|
|
export interface Props {
|
|
time?: number;
|
|
renderCount?: number;
|
|
className?: string;
|
|
humanize?: boolean;
|
|
}
|
|
|
|
export interface State {
|
|
elapsed: number;
|
|
}
|
|
|
|
export default class ElapsedTime extends PureComponent<Props, State> {
|
|
offset: number;
|
|
timer: number;
|
|
|
|
state = {
|
|
elapsed: 0,
|
|
};
|
|
|
|
start() {
|
|
this.offset = Date.now();
|
|
this.timer = window.setInterval(this.tick, INTERVAL);
|
|
}
|
|
|
|
tick = () => {
|
|
const jetzt = Date.now();
|
|
const elapsed = jetzt - this.offset;
|
|
this.setState({ elapsed });
|
|
};
|
|
|
|
componentWillReceiveProps(nextProps: Props) {
|
|
if (nextProps.time) {
|
|
clearInterval(this.timer);
|
|
} else if (this.props.time) {
|
|
this.start();
|
|
}
|
|
|
|
if (nextProps.renderCount) {
|
|
clearInterval(this.timer);
|
|
this.start();
|
|
}
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.start();
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
clearInterval(this.timer);
|
|
}
|
|
|
|
render() {
|
|
const { elapsed } = this.state;
|
|
const { className, time, humanize } = this.props;
|
|
const value = (time || elapsed) / 1000;
|
|
let displayValue = `${value.toFixed(1)}s`;
|
|
if (humanize) {
|
|
const duration = toDuration(elapsed);
|
|
const hours = duration.hours();
|
|
const minutes = duration.minutes();
|
|
const seconds = duration.seconds();
|
|
displayValue = hours ? `${hours}h ${minutes}m ${seconds}s` : minutes ? ` ${minutes}m ${seconds}s` : `${seconds}s`;
|
|
}
|
|
return <span className={`elapsed-time ${className}`}>{displayValue}</span>;
|
|
}
|
|
}
|