diff --git a/web_src/js/components/RepoActionView.vue b/web_src/js/components/RepoActionView.vue index 9641431508..f826bf5e7d 100644 --- a/web_src/js/components/RepoActionView.vue +++ b/web_src/js/components/RepoActionView.vue @@ -151,9 +151,9 @@ const sfc = { POST(`${this.run.link}/approve`); }, - createLogLine(line, startTime, stepIndex) { + createLogLine(line, startTime, stepIndex, {classNames, wrappings} = {}) { const div = document.createElement('div'); - div.classList.add('job-log-line'); + div.classList.add('job-log-line', ...classNames); div.setAttribute('id', `jobstep-${stepIndex}-${line.index}`); div._jobLogTime = line.timestamp; @@ -179,19 +179,50 @@ const sfc = { const logMessage = document.createElement('span'); logMessage.className = 'log-msg'; - logMessage.innerHTML = renderAnsi(line.message); - div.append(logTimeStamp); - div.append(logMessage); - div.append(logTimeSeconds); + let html = renderAnsi(line.message); + for (const [before, after] of wrappings) { + html = `${before}${html}${after}`; + } + logMessage.innerHTML = html; + + div.append(logTimeStamp, logMessage, logTimeSeconds); return div; }, + getLineHTML({message, index, timestamp}, startTime, stepIndex) { + const wrappings = []; + const classNames = []; + + if (message.startsWith('::endgroup')) { + classNames.push('endgroup'); + } else if (message.startsWith('::add-matcher')) { + classNames.push('add-matcher'); + } else if (message.startsWith('::remove-matcher')) { + classNames.push('remove-matcher'); + } else { + if (message.startsWith('::group::')) { + message = message.substring(9); + wrappings.push(['
', '
']); + } + if (message.startsWith('::error::')) { + message = message.substring(9); + wrappings.push(['', '']); + } + if (message.startsWith('[command]')) { + message = message.substring(9); + wrappings.push(['', '']); + } + } + + return this.createLogLine({message, index, timestamp}, startTime, stepIndex, {classNames, wrappings}); + }, + appendLogs(stepIndex, logLines, startTime) { + const el = this.getLogsContainer(stepIndex); + for (const line of logLines) { - // TODO: group support: ##[group]GroupTitle , ##[endgroup] - const el = this.getLogsContainer(stepIndex); - el.append(this.createLogLine(line, startTime, stepIndex)); + el.append(this.getLineHTML(line, startTime, stepIndex)); } }, @@ -789,6 +820,12 @@ export function initRepositoryActionView() { scroll-margin-top: 95px; } +.job-log-line.add-matcher, +.job-log-line.remove-matcher, +.job-log-line.endgroup { + display: none !important; +} + /* class names 'log-time-seconds' and 'log-time-stamp' are used in the method toggleTimeDisplay */ .job-log-line .line-num, .log-time-seconds { width: 48px;