diff --git a/web_src/js/components/RepoBuildView.vue b/web_src/js/components/RepoBuildView.vue
index e7812578a3..c1174d3859 100644
--- a/web_src/js/components/RepoBuildView.vue
+++ b/web_src/js/components/RepoBuildView.vue
@@ -14,6 +14,7 @@
+
{{ job.name }}
@@ -39,10 +40,11 @@
+
{{ jobStep.summary }}
- {{ Math.round(jobStep.duration/1000) }}s
+ {{ formatDuration(jobStep.duration) }}
@@ -135,6 +137,26 @@ const sfc = {
this.currentJobStepsStates[idx].expanded = !this.currentJobStepsStates[idx].expanded;
},
+ formatDuration(d) {
+ d = Math.round(d);
+ const unitValues = [60, 60, 24];
+ const unitNames = ['s', 'm', 'h', 'd'];
+ const parts = [];
+ for (let i = 0; i < unitValues.length; i++) {
+ parts[i] = d % unitValues[i];
+ d = Math.floor(d / unitValues[i]);
+ }
+ parts.push(d);
+ let res = '';
+ for (let i = parts.length - 1; i >= 0; i--) {
+ if (parts[i] > 0) {
+ res += parts[i] + unitNames[i] + ' ';
+ }
+ }
+ if (!res) return '0s';
+ return res.substring(0, res.length - 1);
+ },
+
createLogLine(line) {
const el = document.createElement('div');
el.classList.add('job-log-line');
@@ -145,7 +167,7 @@ const sfc = {
el.appendChild(elLineNum);
const elLogTime = document.createElement('log-time');
- elLogTime.innerText = new Date(line.t).toUTCString();
+ elLogTime.innerText = new Date(line.t*1000).toISOString();
el.appendChild(elLogTime);
const elLogMsg = document.createElement('log-msg');
@@ -170,15 +192,26 @@ const sfc = {
const stateData = {
buildInfo: {title: 'The Demo Build'},
allJobGroups: [
- {summary: 'Job Group Foo', jobs: [{id: 1, name: 'Job A', status: 'success'}, {id: 2, name: 'Job B', status: 'error'}]},
- {summary: 'Job Group Bar', jobs: [{id: 3, name: 'Job X', status: 'skipped'}, {id: 4, name: 'Job Y', status: 'waiting'}]},
+ {
+ summary: 'Job Group Foo',
+ jobs: [{id: 1, name: 'Job A', status: 'success'}, {id: 2, name: 'Job B', status: 'error'}]
+ },
+ {
+ summary: 'Job Group Bar',
+ jobs: [{id: 3, name: 'Job X', status: 'skipped'}, {id: 4, name: 'Job Y', status: 'waiting'}, {
+ id: 5,
+ name: 'Job Z',
+ status: 'running'
+ }]
+ },
],
currentJobInfo: {title: 'the job title', detail: ' succeeded 3 hours ago in 11s'},
currentJobSteps: [
- {summary: 'Job Step 1', duration: 3000, status: 'success'},
- {summary: 'Job Step 2', duration: 3000, status: 'error'},
- {summary: 'Job Step 3', duration: 3000, status: 'skipped'},
- {summary: 'Job Step 4', duration: 3000, status: 'waiting'},
+ {summary: 'Job Step 1', duration: 0.5, status: 'success'},
+ {summary: 'Job Step 2', duration: 2, status: 'error'},
+ {summary: 'Job Step 3', duration: 64, status: 'skipped'},
+ {summary: 'Job Step 4', duration: 3600 + 60, status: 'waiting'},
+ {summary: 'Job Step 5', duration: 86400 + 1, status: 'running'},
],
};
const logsData = {
@@ -197,7 +230,7 @@ const sfc = {
lines.push({
ln: cursor, // demo only, use cursor for line number
m: ' '.repeat(i % 4) + `\x1B[1;3;31mDemo Log\x1B[0m, tag test
, hello world ${Date.now()}, cursor: ${cursor}`,
- t: Date.now(),
+ t: Date.now()/1000, // use second as unit
});
cursor++;
}
@@ -224,7 +257,7 @@ const sfc = {
});
const reqData = {stepLogCursors};
- // const data = await this.fetchJobData();
+ // const respData = await this.fetchJobData();
const respData = this.fetchMockData(reqData);
// console.log('loadJobData by request', reqData, ', get response ', respData);
@@ -275,6 +308,7 @@ export function initRepositoryBuildView() {
height: 100%;
}
+
// ================
// build view left
@@ -358,6 +392,15 @@ export function initRepositoryBuildView() {