diff --git a/awx/ui/client/src/job-results/job-results.block.less b/awx/ui/client/src/job-results/job-results.block.less
index 2185cb0e3d..5b6e46e373 100644
--- a/awx/ui/client/src/job-results/job-results.block.less
+++ b/awx/ui/client/src/job-results/job-results.block.less
@@ -127,3 +127,16 @@
height: inherit;
}
}
+
+.JobResults-timeBadge {
+ float:right;
+ font-size: 11px;
+ font-weight: normal;
+ padding: 1px 10px;
+ height: 14px;
+ margin: 3px 15px;
+ width: 80px;
+ background-color: @default-bg;
+ border-radius: 5px;
+ color: @default-interface-txt;
+}
diff --git a/awx/ui/client/src/job-results/parse-stdout.service.js b/awx/ui/client/src/job-results/parse-stdout.service.js
index e75c364013..3607b0e3e3 100644
--- a/awx/ui/client/src/job-results/parse-stdout.service.js
+++ b/awx/ui/client/src/job-results/parse-stdout.service.js
@@ -4,7 +4,7 @@
* All Rights Reserved
*************************************************/
-export default ['$log', function($log){
+export default ['$log', 'moment', function($log, moment){
var val = {
// parses stdout string from api and formats various codes to the
// correct dom structure
@@ -123,6 +123,27 @@ export default ['$log', function($log){
return string;
},
+ getStartTimeBadge: function(event, line){
+ // This will return a div with the badge class
+ // for the start time to show at the right hand
+ // side of each stdout header line.
+ // returns an empty string if not a header line
+ var emptySpan = "", time;
+ if ((event.event_name === "playbook_on_play_start" ||
+ event.event_name === "playbook_on_task_start") &&
+ line !== "") {
+ time = moment(event.created).format('HH:mm:ss');
+ return `
${time}
`;
+ }
+ else if(event.event_name === "playbook_on_stats" && line.indexOf("PLAY") > -1){
+ time = moment(event.created).format('HH:mm:ss');
+ return `${time}
`;
+ }
+ else {
+ return emptySpan;
+ }
+
+ },
// used to add expand/collapse icon next to line numbers of headers
getCollapseIcon: function(event, line) {
var clickClass,
@@ -195,7 +216,7 @@ export default ['$log', function($log){
return `
${this.getCollapseIcon(event, lineArr[1])}${lineArr[0]}
-
${this.getAnchorTags(event, this.prettify(lineArr[1]))}
+
${this.getAnchorTags(event, this.prettify(lineArr[1]))} ${this.getStartTimeBadge(event, lineArr[1] )}
`;
});
diff --git a/awx/ui/tests/spec/job-results/parse-stdout.service-test.js b/awx/ui/tests/spec/job-results/parse-stdout.service-test.js
index 530240a50b..3bd0563393 100644
--- a/awx/ui/tests/spec/job-results/parse-stdout.service-test.js
+++ b/awx/ui/tests/spec/job-results/parse-stdout.service-test.js
@@ -33,21 +33,34 @@ describe('parseStdoutService', () => {
});
});
- // describe('getLineClasses()', () => {
- // xit('creates a string that is used as a class', () => {
- // let headerEvent = {
- // event_name: 'playbook_on_task_start',
- // event_data: {
- // play_uuid:"0f667a23-d9ab-4128-a735-80566bcdbca0",
- // task_uuid: "80dd087c-268b-45e8-9aab-1083bcfd9364"
- // }
- // };
- // let lineNum = 3;
- // let line = "TASK [setup] *******************************************************************";
- // let styledLine = " header_task header_task_80dd087c-268b-45e8-9aab-1083bcfd9364 play_0f667a23-d9ab-4128-a735-80566bcdbca0 line_num_3";
- // expect(parseStdoutService.getLineClasses(headerEvent, line, lineNum)).toBe(styledLine);
- // });
- // });
+ describe('getLineClasses()', () => {
+ xit('creates a string that is used as a class', () => {
+ let headerEvent = {
+ event_name: 'playbook_on_task_start',
+ event_data: {
+ play_uuid:"0f667a23-d9ab-4128-a735-80566bcdbca0",
+ task_uuid: "80dd087c-268b-45e8-9aab-1083bcfd9364"
+ }
+ };
+ let lineNum = 3;
+ let line = "TASK [setup] *******************************************************************";
+ let styledLine = " header_task header_task_80dd087c-268b-45e8-9aab-1083bcfd9364 play_0f667a23-d9ab-4128-a735-80566bcdbca0 line_num_3";
+ expect(parseStdoutService.getLineClasses(headerEvent, line, lineNum)).toBe(styledLine);
+ });
+ });
+
+ describe('getStartTime()', () => {
+ xit('creates returns a badge with the start time of the event', () => {
+ let headerEvent = {
+ event_name: 'playbook_on_play_start',
+ created: "2016-11-22T21:15:54.736Z"
+ };
+
+ let line = "PLAY [add hosts to inventory] **************************************************";
+ let badgeDiv = '13:15:54
';
+ expect(parseStdoutService.getStartTimeBadge(headerEvent, line)).toBe(badgeDiv);
+ });
+ });
describe('getCollapseIcon()', () => {
let emptySpan = `
@@ -83,13 +96,7 @@ describe('parseStdoutService', () => {
data-uuid="task_1da9012d-18e6-4562-85cd-83cf10a97f86">
`;
-// `
-//
-//
-// `
+
expect(parseStdoutService.getCollapseIcon(headerEvent, line))
.toBe(expandSpan);
});
@@ -124,6 +131,8 @@ describe('parseStdoutService', () => {
.returnValue("");
spyOn(parseStdoutService, 'prettify').and
.returnValue("prettified_line");
+ spyOn(parseStdoutService, 'getStartTimeBadge').and
+ .returnValue("");
parseStdoutService.parseStdout(mockEvent);
@@ -137,6 +146,8 @@ describe('parseStdoutService', () => {
.toHaveBeenCalledWith(mockEvent, "prettified_line");
expect(parseStdoutService.prettify)
.toHaveBeenCalledWith('line1');
+ expect(parseStdoutService.getStartTimeBadge)
+ .toHaveBeenCalledWith(mockEvent, 'line1');
// get line arr should be called once for the event
expect(parseStdoutService.getLineArr.calls.count())
@@ -165,13 +176,15 @@ describe('parseStdoutService', () => {
.returnValue("anchor_tag_dom");
spyOn(parseStdoutService, 'prettify').and
.returnValue("prettified_line");
+ spyOn(parseStdoutService, 'getStartTimeBadge').and
+ .returnValue("");
var returnedString = parseStdoutService.parseStdout(mockEvent);
var expectedString = `
collapse_icon_dom13
-
anchor_tag_dom
+
anchor_tag_dom
`;
expect(returnedString).toBe(expectedString);
});