diff --git a/client/package.json b/client/package.json
index 41d63408093..7943980114f 100644
--- a/client/package.json
+++ b/client/package.json
@@ -32,6 +32,7 @@
"bootstrap-vue": "^2.15.0",
"citation-js": "^0.5.0-alpha.5",
"d3": "3",
+ "date-fns": "^2.21.1",
"decode-uri-component": "^0.2.0",
"deep-diff": "^1.0.2",
"deep-equal": "^2.0.5",
diff --git a/client/src/components/JobInformation/JobInformation.vue b/client/src/components/JobInformation/JobInformation.vue
index 38eb4b4e914..117b229a2f5 100644
--- a/client/src/components/JobInformation/JobInformation.vue
+++ b/client/src/components/JobInformation/JobInformation.vue
@@ -30,6 +30,12 @@
+
+ | Time To Finish |
+
+ {{ runTime }}
+ |
+
@@ -45,6 +51,7 @@
+
| Job API ID: |
{{ job.id }} |
@@ -67,6 +74,8 @@ import DecodedId from "../DecodedId.vue";
import CodeRow from "./CodeRow.vue";
import UtcDate from "components/UtcDate";
import CopyToClipboard from "components/CopyToClipboard";
+import JOB_STATES_MODEL from "mvc/history/job-states-model";
+import { formatDuration, intervalToDuration } from "date-fns";
export default {
components: {
@@ -90,8 +99,15 @@ export default {
},
computed: {
job: function () {
- const job = this.$store.getters.job(this.job_id);
- return job;
+ return this.$store.getters.job(this.job_id);
+ },
+ runTime: function () {
+ return formatDuration(
+ intervalToDuration({ start: new Date(this.job.create_time), end: new Date(this.job.update_time) })
+ );
+ },
+ jobIsTerminal() {
+ return !JOB_STATES_MODEL.NON_TERMINAL_STATES.includes(this.job.state);
},
},
methods: {
diff --git a/client/src/components/admin/JobDetails.vue b/client/src/components/admin/JobDetails.vue
index 6abeb4cc934..aec7aa7cfcc 100644
--- a/client/src/components/admin/JobDetails.vue
+++ b/client/src/components/admin/JobDetails.vue
@@ -1,8 +1,30 @@
- Job Parameters
+
+
+ | Traceback |
+
+
+ |
+
+
+ | Info |
+
+
+ |
+
+
+ | Remote Host |
+
+ {{ job.remote_host }}
+ |
+
+
+
+ Job Parameters
- Job Metrics
+
+ Job Metrics
@@ -10,9 +32,13 @@