update to standard out pane

- add lines to pane
- support show and hide toggling of lines

NOTE: layout is hardcoded, will need to move to dealing with various browser heights better
This commit is contained in:
John Mitchell 2016-11-06 13:41:17 -05:00 committed by jaredevantabor
parent 66e90075d4
commit 783f784e69
9 changed files with 273 additions and 62 deletions

View File

@ -175,6 +175,12 @@ export default ['jobResultsService', 'parseStdoutService', '$q', function(jobRes
val.populateDefers[event.counter] = $q.defer();
}
if (val.queue[event.counter] &&
val.queue[event.counter].processed) {
val.populateDefers.reject("duplicate event: " +
event);
}
if (!val.queue[event.counter]) {
var resolvePopulation = function(event) {
// to resolve, put the event on the queue and

View File

@ -1,19 +1,128 @@
@import '../../shared/branding/colors.default.less';
.JobResultsStdOut{
.JobResultsStdOut {
height: 100%;
margin-top: 15px;
background-color: @default-no-items-bord;
border-radius: 5px;
margin-bottom: 10px;
}
.JobResultsStdOut-aLineOfStdOut,
.JobResultsStdOut-expandLine {
.JobResultsStdOut-toolbar {
display: flex;
height: 38px;
margin-top: 15px;
border: 1px solid @default-list-header-bg;
border-bottom: 0px;
border-radius: 5px;
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
}
.JobResultsStdOut-lineNumberColumn{
.JobResultsStdOut-toolbarNumberColumn {
background-color: @default-list-header-bg;
color: @b7grey;
flex: initial;
display: flex;
justify-content: space-between;
width: 70px;
padding-bottom: 0px;
padding-left: 8px;
padding-right: 8px;
padding-top: 10px;
border-top-left-radius: 5px;
}
.JobResultsStdOut-expandAllButton {
height: 18px;
width: 18px;
padding-left: 4px;
padding-top: 1px;
border-radius: 50%;
background-color: @default-bg;
font-size: 12px;
cursor: pointer;
}
.JobResultsStdOut-expandAllButton:hover .JobResultsStdOut-expandAllIcon,
.JobResultsStdOut-expandAllIcon:hover {
color: @default-data-txt;
}
.JobResultsStdOut-toolbarStdoutColumn {
white-space: normal;
flex: 1;
display: flex;
justify-content: flex-end;
padding-right: 10px;
background-color: @default-no-items-bord;
}
.JobResultsStdOut-followButton {
cursor: pointer;
width: 18px;
height: 18px;
width: 18px;
padding-left: 3.8px;
border-radius: 50%;
margin-top: 10px;
font-size: 12px;
background-color: @default-icon;
color: @default-border;
}
.JobResultsStdOut-followIcon {
color: @default-border;
}
.JobResultsStdOut-followButton:hover {
background-color: @default-icon-hov;
}
.JobResultsStdOut-followButton:hover .JobResultsStdOut-followIcon,
.JobResultsStdOut-followIcon:hover {
color: @default-interface-txt;
}
.JobResultsStdOut-stdoutContainer {
height: ~"calc(100% - 108px)";
background-color: @default-no-items-bord;
border: 1px solid @default-list-header-bg;
border-top: 0px;
border-radius: 5px;
border-top-left-radius: 0px;
border-top-right-radius: 0px;
margin-bottom: 10px;
overflow: scroll;
}
.JobResultsStdOut-numberColumnPreload {
background-color: #EBEBEB;
width: 70px;
position: fixed;
}
.JobResultsStdOut-aLineOfStdOut {
display: flex;
font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
}
.JobResultsStdOut-lineExpander {
text-align: left;
padding-left: 11px;
margin-right: auto;
}
.JobResultsStdOut-lineExpanderIcon {
font-size: 19px;
cursor: pointer;
}
.JobResultsStdOut-lineExpanderIcon:hover {
color: @default-data-txt;
}
.JobResultsStdOut-lineNumberColumn {
display: flex;
background-color: @default-list-header-bg;
text-align: right;
@ -22,28 +131,16 @@
padding-bottom: 2px;
color: @b7grey;
width: 75px;
flex: initial;
white-space: pre-line;
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
z-index: 1;
}
.JobResultsStdOut-lineExpander {
text-align: left;
padding-left: 10px;
margin-right: auto;
}
.JobResultsStdOut-lineNumberColumn--first{
text-align: left;
padding: 0px;
padding-left: 11px;
padding-top: 10px;
white-space: normal;
}
.JobResultsStdOut-stdoutColumn{
.JobResultsStdOut-stdoutColumn {
padding-left: 20px;
padding-top: 2px;
padding-bottom: 2px;
@ -54,6 +151,8 @@
width:100%;
}
.JobResultsStdOut-stdoutColumn--first{
padding-top:0px;
// TODO: needs to be set based on height of browser window
.JobResultsStdOut-numberColumnPreload {
height: 720px;
}

View File

@ -5,15 +5,75 @@
*************************************************/
// import hostStatusBarController from './host-status-bar.controller';
export default [ 'templateUrl',
function(templateUrl) {
export default [ 'templateUrl', '$timeout',
function(templateUrl, $timeout) {
return {
scope: true,
scope: false,
templateUrl: templateUrl('job-results/job-results-stdout/job-results-stdout'),
restrict: 'E',
// controller: jobResultsStdOutController,
link: function(scope) {
link: function(scope, element, attrs) {
scope.toggleAllStdout = function(type) {
var expandClass;
if (type === 'expand') {
expandClass = "fa-caret-right";
} else {
expandClass = "fa-caret-down";
}
element.find(".expanderizer--task."+expandClass)
.each((i, val) => {
$timeout(function(){
angular.element(val).trigger('click');
});
});
element.find(".expanderizer--play."+expandClass)
.each((i, val) => {
if(angular.element("." +
angular.element(val).attr("data-uuid"))
.find(".expanderizer--task")
.length === 0 ||
type !== 'collapse') {
$timeout(function(){
angular.element(val)
.trigger('click');
});
}
});
};
scope.toggleLine = function($event, id) {
if ($($event.currentTarget).hasClass("fa-caret-down")) {
$(id).hide();
$($event.currentTarget)
.removeClass("fa-caret-down");
$($event.currentTarget)
.addClass("fa-caret-right");
} else {
$(id).show();
$($event.currentTarget)
.removeClass("fa-caret-right");
$($event.currentTarget)
.addClass("fa-caret-down");
if ($($event.currentTarget)
.hasClass("expanderizer--play")) {
$("." + $($event.currentTarget)
.attr("data-uuid"))
.find(".expanderizer--task")
.each((i, val) => {
if ($(val)
.hasClass("fa-caret-right")) {
$timeout(function(){
angular.element(val)
.trigger('click');
});
}
});
}
}
};
}
};
}];

View File

@ -1,11 +1,31 @@
<div class="JobResultsStdOut">
<div class="JobResultsStdOut-expandLine">
<div class="JobResultsStdOut-lineNumberColumn
JobResultsStdOut-lineNumberColumn--first">
<i class="fa fa-plus"></i>
<div class="JobResultsStdOut-toolbar">
<div class="JobResultsStdOut-toolbarNumberColumn">
<div class="JobResultsStdOut-expandAllButton"
ng-click="toggleAllStdout('expand')"
aw-tool-tip="Expand all lines of standard out."
data-placement="top">
<i class ="JobResultsStdOut-expandAllIcon fa fa-plus">
</i>
</div>
<div class="JobResultsStdOut-expandAllButton"
ng-click="toggleAllStdout('collapse')"
aw-tool-tip="Collapse all lines of standard out except play and task headers."
data-placement="top">
<i class ="JobResultsStdOut-expandAllIcon fa fa-minus">
</i>
</div>
</div>
<div class="JobResultsStdOut-stdoutColumn
JobResultsStdOut-stdoutColumn--first">
<div class="JobResultsStdOut-toolbarStdoutColumn">
<div class="JobResultsStdOut-followButton"
aw-tool-tip="Follow standard out."
data-placement="left">
<i class="JobResultsStdOut-followIcon fa fa-arrow-down">
</i>
</div>
</div>
</div>
<div class="JobResultsStdOut-stdoutContainer">
<div class="JobResultsStdOut-numberColumnPreload"></div>
</div>
</div>

View File

@ -17,10 +17,14 @@
.JobResults-leftSide {
.OnePlusTwo-left--panel(100%, @breakpoint-md);
// TODO: needs to be set based on height of browser window
height: 870px !important;
}
.JobResults-rightSide {
.OnePlusTwo-right--panel(100%, @breakpoint-md);
// TODO: needs to be set based on height of browser window
height: 870px !important;
@media (max-width: @breakpoint-md - 1px) {
padding-right: 15px;

View File

@ -1,4 +1,4 @@
export default ['jobData', 'jobDataOptions', 'jobLabels', 'count', '$scope', 'ParseTypeChange', 'ParseVariableString', 'jobResultsService', '$rootScope', 'eventQueue', function(jobData, jobDataOptions, jobLabels, count, $scope, ParseTypeChange, ParseVariableString, jobResultsService, $rootScope, eventQueue) {
export default ['jobData', 'jobDataOptions', 'jobLabels', 'count', '$scope', 'ParseTypeChange', 'ParseVariableString', 'jobResultsService', '$rootScope', 'eventQueue', '$compile', function(jobData, jobDataOptions, jobLabels, count, $scope, ParseTypeChange, ParseVariableString, jobResultsService, $rootScope, eventQueue, $compile) {
var getTowerLinks = function() {
var getTowerLink = function(key) {
if ($scope.job.related[key]) {
@ -132,7 +132,10 @@ export default ['jobData', 'jobDataOptions', 'jobLabels', 'count', '$scope', 'Pa
}
if(change === 'stdout'){
$(".JobResultsStdOut").append(mungedEvent.stdout);
angular
.element(".JobResultsStdOut-stdoutContainer")
.append($compile(mungedEvent
.stdout)($scope));
}
});
}

View File

@ -53,8 +53,8 @@ export default {
if (jobData.finished) {
// if the job is finished, grab the playbook_on_stats
// role to get the final count
Rest.setUrl(jobData.related.job_events);// +
// "?event=playbook_on_stats");
Rest.setUrl(jobData.related.job_events +
"?event=playbook_on_stats");
Rest.get()
.success(function(data) {
if(!data.results[0]){

View File

@ -81,7 +81,8 @@ export default ['$q', 'Prompt', '$filter', 'Wait', 'Rest', '$state', 'ProcessErr
Rest.setUrl(url);
Rest.get()
.success(function(data) {
val.resolve({results: data.results, next: data.next});
val.resolve({results: data.results,
next: data.next});
})
.error(function(obj, status) {
ProcessErrors(null, obj, status, null, {

View File

@ -7,21 +7,13 @@
export default [function(){
var val = {
prettify: function(line){
// this function right now just removes the 'rn' strings
// that i'm currently seeing on this branch on the beginning
// and end of each event string. In the future it could be
// used to add styling classes to the actual lines of stdout
// line = line.replace(/rn/g, '\n');
// TODO: figure out from Jared what this is
line = line.replace(/u001b/g, '');
// ok
// ansi classes
line = line.replace(/\[0;32m/g, '<span class="ansi32">');
//unreachable
line = line.replace(/\[1;31m/g, '<span class="ansi1 ansi31">');
line = line.replace(/\[0;31m/g, '<span class="ansi1 ansi31">');
line = line.replace(/\[0;32m=/g, '<span class="ansi32">');
line = line.replace(/\[0;32m1/g, '<span class="ansi36">');
line = line.replace(/\[0;33m/g, '<span class="ansi33">');
@ -34,12 +26,12 @@ export default [function(){
getCollapseClasses: function(event) {
var string = "";
if (event.event_name === "playbook_on_play_start") {
return string;
string += " header_play";
} else if (event.event_name === "playbook_on_task_start") {
string += " header_task";
if (event.event_data.play_uuid) {
string += " play_" + event.event_data.play_uuid;
}
return string;
} else {
if (event.event_data.play_uuid) {
string += " play_" + event.event_data.play_uuid;
@ -47,18 +39,48 @@ export default [function(){
if (event.event_data.task_uuid) {
string += " task_" + event.event_data.task_uuid;
}
return string;
}
return string;
},
getCollapseIcon: function(event, line) {
if ((event.event_name === "playbook_on_play_start" || event.event_name === "playbook_on_task_start") && line !== "") {
return `<span class="JobResultsStdOut-lineExpander"><i class="fa fa-caret-down"></i></span>`;
var clickClass,
expanderizerSpecifier;
var emptySpan = `
<span class="JobResultsStdOut-lineExpander"></span>`;
if ((event.event_name === "playbook_on_play_start" ||
event.event_name === "playbook_on_task_start") &&
line !== "") {
if (event.event_name === "playbook_on_play_start" &&
line.indexOf("PLAY") > -1) {
expanderizerSpecifier = "play";
clickClass = "play_" +
event.event_data.play_uuid;
} else if (line.indexOf("TASK") > -1 ||
line.indexOf("RUNNING HANDLER") > -1) {
expanderizerSpecifier = "task";
clickClass = "task_" +
event.event_data.task_uuid;
} else {
return emptySpan;
}
return `
<span class="JobResultsStdOut-lineExpander">
<i class="JobResultsStdOut-lineExpanderIcon fa fa-caret-down expanderizer
expanderizer--${expanderizerSpecifier} expanded"
ng-click="toggleLine($event, '.${clickClass}')"
data-uuid="${clickClass}">
</i>
</span>`;
} else {
return `<span class="JobResultsStdOut-lineExpander"></span>`;
return emptySpan;
}
},
parseStdout: function(event){
var stdoutStrings = _
return _
.zip(_.range(event.start_line + 1,
event.end_line + 1),
event.stdout.split("\r\n").slice(0, -1))
@ -69,10 +91,6 @@ export default [function(){
<div class="JobResultsStdOut-stdoutColumn">${this.prettify(lineArr[1])}</div>
</div>`;
}).join("");
// this object will be used by the ng-repeat in the
// job-results-stdout.partial.html. probably need to add the
// elapsed time in here too
return stdoutStrings;
}
};
return val;