Merge pull request #2457 from jakemcdermott/output-line-fixup

dont render blank output lines for some event types + adjust line wrapping

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
This commit is contained in:
softwarefactory-project-zuul[bot] 2018-11-06 01:54:38 +00:00 committed by GitHub
commit 3fef7acaa8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 56 additions and 44 deletions

View File

@ -72,11 +72,19 @@
&-row {
display: flex;
&:hover {
background-color: white;
}
&:hover div {
background-color: white;
}
}
&-row--clickable {
cursor: pointer;
}
&-toggle {
background-color: @at-gray-eb;
color: @at-gray-848992;
@ -112,12 +120,6 @@
.at-mixin-event();
}
&-event--host {
.at-mixin-event();
cursor: pointer;
}
&-time {
padding-right: 2ch;
font-size: 12px;
@ -175,7 +177,6 @@
}
.at-mixin-event() {
flex: 1;
padding: 0 10px;
white-space: pre-wrap;
word-break: break-all;

View File

@ -6,7 +6,6 @@ import {
OUTPUT_PAGE_SIZE,
} from './constants';
let $compile;
let $q;
let $scope;
let $state;
@ -97,6 +96,7 @@ function firstRange () {
.then(() => render.pushFront(results));
})
.finally(() => {
render.compile();
scroll.resume();
lockFollow = false;
});
@ -124,6 +124,7 @@ function nextRange () {
.then(() => render.pushFront(results));
})
.finally(() => {
render.compile();
scroll.resume();
lockFrames = false;
@ -162,6 +163,7 @@ function previousRange () {
return $q.resolve();
})
.finally(() => {
render.compile();
scroll.resume();
lockFrames = false;
@ -189,6 +191,7 @@ function lastRange () {
return $q.resolve();
})
.finally(() => {
render.compile();
scroll.resume();
return $q.resolve();
@ -280,6 +283,7 @@ function firstPage () {
.then(() => render.pushFront(results));
})
.finally(() => {
render.compile();
scroll.resume();
return $q.resolve();
@ -309,6 +313,7 @@ function lastPage () {
return $q.resolve();
})
.finally(() => {
render.compile();
scroll.resume();
return $q.resolve();
@ -330,6 +335,7 @@ function nextPage () {
.then(() => render.pushFront(results));
})
.finally(() => {
render.compile();
scroll.resume();
});
}
@ -363,6 +369,7 @@ function previousPage () {
return $q.resolve();
})
.finally(() => {
render.compile();
scroll.resume();
return $q.resolve();
@ -546,10 +553,6 @@ function toggleTaskCollapse (uuid) {
render.records[uuid].isCollapsed = !isCollapsed;
}
function compile (html) {
return $compile(html)($scope);
}
function showHostDetails (id, uuid) {
$state.go('output.host-event.json', { eventId: id, taskUuid: uuid });
}
@ -599,7 +602,7 @@ function showMissingEvents (uuid) {
delete render.records[uuid];
}
})
.then(() => render.compile(elements))
.then(() => render.compile())
.then(() => lines);
});
}
@ -709,7 +712,6 @@ function clear () {
}
function OutputIndexController (
_$compile_,
_$q_,
_$scope_,
_$state_,
@ -727,7 +729,6 @@ function OutputIndexController (
const { isPanelExpanded, _debug } = $stateParams;
const isProcessingFinished = !_debug && _resource_.model.get('event_processing_finished');
$compile = _$compile_;
$q = _$q_;
$scope = _$scope_;
$state = _$state_;
@ -765,7 +766,7 @@ function OutputIndexController (
vm.debug = _debug;
render.requestAnimationFrame(() => {
render.init({ compile, toggles: vm.toggleLineEnabled });
render.init($scope, { toggles: vm.toggleLineEnabled });
status.init(resource);
page.init(resource.events);
@ -815,6 +816,7 @@ function OutputIndexController (
status.sync();
scroll.unlock();
scroll.unhide();
render.compile();
}
});
@ -850,7 +852,6 @@ function OutputIndexController (
}
OutputIndexController.$inject = [
'$compile',
'$q',
'$scope',
'$state',

View File

@ -3,7 +3,6 @@ import Entities from 'html-entities';
import {
EVENT_START_PLAY,
EVENT_START_PLAYBOOK,
EVENT_STATS_PLAY,
EVENT_START_TASK,
OUTPUT_ANSI_COLORMAP,
@ -34,9 +33,13 @@ const pattern = [
const re = new RegExp(pattern);
const hasAnsi = input => re.test(input);
function JobRenderService ($q, $sce, $window) {
this.init = ({ compile, toggles }) => {
this.hooks = { compile };
let $scope;
function JobRenderService ($q, $compile, $sce, $window) {
this.init = (_$scope_, { toggles }) => {
$scope = _$scope_;
this.setScope();
this.el = $(OUTPUT_ELEMENT_TBODY);
this.parent = null;
@ -209,7 +212,7 @@ function JobRenderService ($q, $sce, $window) {
const lines = stdout.split('\r\n');
const record = this.createRecord(event, lines);
if (event.event === EVENT_START_PLAYBOOK) {
if (lines.length === 1 && lines[0] === '') {
return { html: '', count: 0 };
}
@ -260,17 +263,17 @@ function JobRenderService ($q, $sce, $window) {
return this.records[event.counter];
}
let isHost = false;
if (typeof event.host === 'number') {
isHost = true;
let isClickable = false;
if (typeof event.host === 'number' || event.event_data && event.event_data.res) {
isClickable = true;
} else if (event.type === 'project_update_event' &&
event.event !== 'runner_on_skipped' &&
event.event_data.host) {
isHost = true;
isClickable = true;
}
const record = {
isHost,
isClickable,
id: event.id,
line: event.start_line + 1,
name: event.event,
@ -344,6 +347,7 @@ function JobRenderService ($q, $sce, $window) {
let tdToggle = '';
let tdEvent = '';
let classList = '';
let directives = '';
if (record.isMissing) {
return `<div id="${record.uuid}" class="at-Stdout-row">
@ -370,10 +374,6 @@ function JobRenderService ($q, $sce, $window) {
tdToggle = `<div class="at-Stdout-toggle" ng-click="vm.toggleCollapse('${id}')"><i class="fa ${icon} can-toggle"></i></div>`;
}
if (record.isHost) {
tdEvent = `<div class="at-Stdout-event--host" ng-click="vm.showHostDetails('${record.id}', '${record.uuid}')"><span ng-non-bindable>${content}</span></div>`;
}
if (record.time && record.line === ln) {
timestamp = `<span>${record.time}</span>`;
}
@ -401,11 +401,16 @@ function JobRenderService ($q, $sce, $window) {
}
}
if (record && record.isClickable) {
classList += ' at-Stdout-row--clickable';
directives = `ng-click="vm.showHostDetails('${record.id}', '${record.uuid}')"`;
}
return `
<div id="${id}" class="at-Stdout-row ${classList}">
<div id="${id}" class="at-Stdout-row ${classList}" ${directives}>
${tdToggle}
<div class="at-Stdout-line">${ln}</div>
${tdEvent}
<div class="at-Stdout-event"><span ng-non-bindable>${content}</span></div>
<div class="at-Stdout-time">${timestamp}</div>
</div>`;
};
@ -435,8 +440,16 @@ function JobRenderService ($q, $sce, $window) {
});
});
this.compile = content => {
this.hooks.compile(content);
this.setScope = () => {
if (this.scope) this.scope.$destroy();
delete this.scope;
this.scope = $scope.$new();
};
this.compile = () => {
this.setScope();
$compile(this.el)(this.scope);
return this.requestAnimationFrame();
};
@ -472,10 +485,7 @@ function JobRenderService ($q, $sce, $window) {
const result = this.prependEventGroup(events);
const html = this.trustHtml(result.html);
const newElements = angular.element(html);
return this.requestAnimationFrame(() => this.el.prepend(newElements))
.then(() => this.compile(newElements))
return this.requestAnimationFrame(() => this.el.prepend(html))
.then(() => result.lines);
};
@ -487,10 +497,7 @@ function JobRenderService ($q, $sce, $window) {
const result = this.appendEventGroup(events);
const html = this.trustHtml(result.html);
const newElements = angular.element(html);
return this.requestAnimationFrame(() => this.el.append(newElements))
.then(() => this.compile(newElements))
return this.requestAnimationFrame(() => this.el.append(html))
.then(() => result.lines);
};
@ -601,6 +608,6 @@ function JobRenderService ($q, $sce, $window) {
this.getCapacity = () => OUTPUT_EVENT_LIMIT - (this.getTailCounter() - this.getHeadCounter());
}
JobRenderService.$inject = ['$q', '$sce', '$window'];
JobRenderService.$inject = ['$q', '$compile', '$sce', '$window'];
export default JobRenderService;

View File

@ -114,6 +114,9 @@ function SlidingWindowService ($q) {
}
}
this.buffer.events.length = 0;
delete this.buffer.events;
this.buffer.events = frames;
this.buffer.min = min;
this.buffer.max = max;