-
Notifications
You must be signed in to change notification settings - Fork 3.8k
/
Copy pathduration.tsx
59 lines (54 loc) · 2 KB
/
duration.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Copyright 2022 The Cockroach Authors.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
import { cockroach } from "@cockroachlabs/crdb-protobuf-client";
import moment from "moment";
import React from "react";
import { TimestampToMoment } from "src/util";
import { JOB_STATUS_SUCCEEDED, isRunning } from "./jobOptions";
type Job = cockroach.server.serverpb.IJobResponse;
export const formatDuration = (d: moment.Duration) =>
[Math.floor(d.asHours()).toFixed(0), d.minutes(), d.seconds()]
.map(c => (c < 10 ? ("0" + c).slice(-2) : c))
.join(":");
export class Duration extends React.PureComponent<{
job: Job;
className?: string;
}> {
render() {
const { job, className } = this.props;
// Parse timestamp to default value NULL instead of Date.now.
// Conversion dates to Date.now causes trailing dates and constant
// duration increase even when job is finished.
const startedAt = TimestampToMoment(job.started, null);
const modifiedAt = TimestampToMoment(job.modified, null);
const finishedAt = TimestampToMoment(job.finished, null);
if (isRunning(job.status)) {
const fractionCompleted = job.fraction_completed;
if (fractionCompleted > 0) {
const duration = modifiedAt.diff(startedAt);
const remaining = duration / fractionCompleted - duration;
return (
<span className={className}>
{formatDuration(moment.duration(remaining)) + " remaining"}
</span>
);
}
return null;
} else if (job.status == JOB_STATUS_SUCCEEDED) {
return (
<span className={className}>
{"Duration: " +
formatDuration(moment.duration(finishedAt.diff(startedAt)))}
</span>
);
}
return null;
}
}