From b54fc6aacba562b121ae0a5bc669b935f88781b6 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 30 Sep 2022 13:38:12 +0800 Subject: [PATCH] view logs --- web_src/js/components/RepoBuildView.vue | 63 +++++++++++++++++++++---- web_src/js/svg.js | 2 + 2 files changed, 55 insertions(+), 10 deletions(-) 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() {