mirror of
https://github.com/ansible/awx.git
synced 2026-05-09 02:17:37 -02:30
Job detail page
Added 'Loading...' message to each table. Loading message is turned on at initial page load. It is turned off at the last possible second after completion of page rendering. It is turned on before each API call and back off after the API call completes.
This commit is contained in:
@@ -33,6 +33,12 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
scope.tasksMaxRows = 200;
|
scope.tasksMaxRows = 200;
|
||||||
scope.playsMaxRows = 200;
|
scope.playsMaxRows = 200;
|
||||||
|
|
||||||
|
// Set the following to true when 'Loading...' message desired
|
||||||
|
scope.playsLoading = true;
|
||||||
|
scope.tasksLoading = true;
|
||||||
|
scope.hostResultsLoading = true;
|
||||||
|
scope.hostSummariesLoading = true;
|
||||||
|
|
||||||
scope.liveEventProcessing = true; // true while job is active and live events are arriving
|
scope.liveEventProcessing = true; // true while job is active and live events are arriving
|
||||||
scope.pauseLiveEvents = false; // control play/pause state of event processing
|
scope.pauseLiveEvents = false; // control play/pause state of event processing
|
||||||
|
|
||||||
@@ -137,6 +143,7 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
scope.removeInitialLoadComplete = scope.$on('InitialLoadComplete', function() {
|
scope.removeInitialLoadComplete = scope.$on('InitialLoadComplete', function() {
|
||||||
var url;
|
var url;
|
||||||
Wait('stop');
|
Wait('stop');
|
||||||
|
|
||||||
if (JobIsFinished(scope)) {
|
if (JobIsFinished(scope)) {
|
||||||
scope.liveEventProcessing = false; // signal that event processing is over and endless scroll
|
scope.liveEventProcessing = false; // signal that event processing is over and endless scroll
|
||||||
scope.pauseLiveEvents = false; // should be enabled
|
scope.pauseLiveEvents = false; // should be enabled
|
||||||
@@ -529,6 +536,12 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
scope.removeLoadJobRow = scope.$on('LoadJob', function() {
|
scope.removeLoadJobRow = scope.$on('LoadJob', function() {
|
||||||
Wait('start');
|
Wait('start');
|
||||||
scope.job_status = {};
|
scope.job_status = {};
|
||||||
|
|
||||||
|
scope.playsLoading = true;
|
||||||
|
scope.tasksLoading = true;
|
||||||
|
scope.hostResultsLoading = true;
|
||||||
|
scope.LoadHostSummaries = true;
|
||||||
|
|
||||||
// Load the job record
|
// Load the job record
|
||||||
Rest.setUrl(GetBasePath('jobs') + job_id + '/');
|
Rest.setUrl(GetBasePath('jobs') + job_id + '/');
|
||||||
Rest.get()
|
Rest.get()
|
||||||
@@ -939,6 +952,7 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
// check for more plays when user scrolls to bottom of play list...
|
// check for more plays when user scrolls to bottom of play list...
|
||||||
if (((!scope.liveEventProcessing) || (scope.liveEventProcessing && scope.pauseLiveEvents)) && scope.next_plays) {
|
if (((!scope.liveEventProcessing) || (scope.liveEventProcessing && scope.pauseLiveEvents)) && scope.next_plays) {
|
||||||
$('#playsMoreRows').fadeIn();
|
$('#playsMoreRows').fadeIn();
|
||||||
|
scope.playsLoading = true;
|
||||||
Rest.setUrl(scope.next_plays);
|
Rest.setUrl(scope.next_plays);
|
||||||
Rest.get()
|
Rest.get()
|
||||||
.success( function(data) {
|
.success( function(data) {
|
||||||
@@ -989,6 +1003,7 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
skipped = (event.skipped_count) ? event.skipped_count : 0;
|
skipped = (event.skipped_count) ? event.skipped_count : 0;
|
||||||
|
|
||||||
scope.plays[scope.plays.length - 1].hostCount = ok + changed + failed + skipped;
|
scope.plays[scope.plays.length - 1].hostCount = ok + changed + failed + skipped;
|
||||||
|
scope.playsLoading = false;
|
||||||
});
|
});
|
||||||
$('#playsMoreRows').fadeOut(400);
|
$('#playsMoreRows').fadeOut(400);
|
||||||
})
|
})
|
||||||
@@ -1003,6 +1018,7 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
// check for more tasks when user scrolls to bottom of task list...
|
// check for more tasks when user scrolls to bottom of task list...
|
||||||
if (((!scope.liveEventProcessing) || (scope.liveEventProcessing && scope.pauseLiveEvents)) && scope.next_tasks) {
|
if (((!scope.liveEventProcessing) || (scope.liveEventProcessing && scope.pauseLiveEvents)) && scope.next_tasks) {
|
||||||
$('#tasksMoreRows').fadeIn();
|
$('#tasksMoreRows').fadeIn();
|
||||||
|
scope.tasksLoading = true;
|
||||||
Rest.setUrl(scope.next_tasks);
|
Rest.setUrl(scope.next_tasks);
|
||||||
Rest.get()
|
Rest.get()
|
||||||
.success(function(data) {
|
.success(function(data) {
|
||||||
@@ -1060,6 +1076,7 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
$('#tasksMoreRows').fadeOut(400);
|
$('#tasksMoreRows').fadeOut(400);
|
||||||
|
scope.tasksLoading = false;
|
||||||
})
|
})
|
||||||
.error(function(data, status) {
|
.error(function(data, status) {
|
||||||
$('#tasksMoreRows').fadeOut(400);
|
$('#tasksMoreRows').fadeOut(400);
|
||||||
@@ -1073,6 +1090,7 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
// check for more hosts when user scrolls to bottom of host results list...
|
// check for more hosts when user scrolls to bottom of host results list...
|
||||||
if (((!scope.liveEventProcessing) || (scope.liveEventProcessing && scope.pauseLiveEvents)) && scope.next_host_results) {
|
if (((!scope.liveEventProcessing) || (scope.liveEventProcessing && scope.pauseLiveEvents)) && scope.next_host_results) {
|
||||||
$('#hostResultsMoreRows').fadeIn();
|
$('#hostResultsMoreRows').fadeIn();
|
||||||
|
scope.hostResultsLoading = true;
|
||||||
Rest.setUrl(scope.next_host_results);
|
Rest.setUrl(scope.next_host_results);
|
||||||
Rest.get()
|
Rest.get()
|
||||||
.success(function(data) {
|
.success(function(data) {
|
||||||
@@ -1121,6 +1139,7 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
msg: (row.event_data && row.event_data.res) ? row.event_data.res.msg : '',
|
msg: (row.event_data && row.event_data.res) ? row.event_data.res.msg : '',
|
||||||
item: item
|
item: item
|
||||||
});
|
});
|
||||||
|
scope.hostResultsLoading = false;
|
||||||
});
|
});
|
||||||
$('#hostResultsMoreRows').fadeOut(400);
|
$('#hostResultsMoreRows').fadeOut(400);
|
||||||
})
|
})
|
||||||
@@ -1135,6 +1154,7 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
scope.hostSummariesScrollDown = function() {
|
scope.hostSummariesScrollDown = function() {
|
||||||
// check for more hosts when user scrolls to bottom of host summaries list...
|
// check for more hosts when user scrolls to bottom of host summaries list...
|
||||||
if (((!scope.liveEventProcessing) || (scope.liveEventProcessing && scope.pauseLiveEvents)) && scope.next_host_summaries) {
|
if (((!scope.liveEventProcessing) || (scope.liveEventProcessing && scope.pauseLiveEvents)) && scope.next_host_summaries) {
|
||||||
|
scope.hostSummariesLoading = true;
|
||||||
Rest.setUrl(scope.next_host_summaries);
|
Rest.setUrl(scope.next_host_summaries);
|
||||||
Rest.get()
|
Rest.get()
|
||||||
.success(function(data) {
|
.success(function(data) {
|
||||||
@@ -1157,6 +1177,7 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
$('#hostSummariesMoreRows').fadeOut();
|
$('#hostSummariesMoreRows').fadeOut();
|
||||||
|
scope.hostSummariesLoading = false;
|
||||||
})
|
})
|
||||||
.error(function(data, status) {
|
.error(function(data, status) {
|
||||||
$('#hostSummariesMoreRows').fadeOut();
|
$('#hostSummariesMoreRows').fadeOut();
|
||||||
|
|||||||
@@ -665,7 +665,7 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
|
|||||||
url = scope.job.url + 'job_plays/?page_size=' + scope.playsMaxRows + '&order_by=id';
|
url = scope.job.url + 'job_plays/?page_size=' + scope.playsMaxRows + '&order_by=id';
|
||||||
url += (scope.search_play_name) ? '&play__icontains=' + scope.search_play_name : '';
|
url += (scope.search_play_name) ? '&play__icontains=' + scope.search_play_name : '';
|
||||||
url += (scope.search_play_status === 'failed') ? '&failed=true' : '';
|
url += (scope.search_play_status === 'failed') ? '&failed=true' : '';
|
||||||
|
scope.playsLoading = true;
|
||||||
Rest.setUrl(url);
|
Rest.setUrl(url);
|
||||||
Rest.get()
|
Rest.get()
|
||||||
.success(function(data) {
|
.success(function(data) {
|
||||||
@@ -717,6 +717,7 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
|
|||||||
id: (scope.plays.length > 0) ? scope.plays[0].id : null,
|
id: (scope.plays.length > 0) ? scope.plays[0].id : null,
|
||||||
callback: callback
|
callback: callback
|
||||||
});
|
});
|
||||||
|
scope.playsLoading = false;
|
||||||
})
|
})
|
||||||
.error(function(data) {
|
.error(function(data) {
|
||||||
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
||||||
@@ -774,6 +775,8 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
scope.tasksLoading = true;
|
||||||
|
|
||||||
Rest.setUrl(url);
|
Rest.setUrl(url);
|
||||||
Rest.get()
|
Rest.get()
|
||||||
.success(function(data) {
|
.success(function(data) {
|
||||||
@@ -852,6 +855,8 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
|
|||||||
callback: callback
|
callback: callback
|
||||||
});
|
});
|
||||||
|
|
||||||
|
scope.tasksLoading = false;
|
||||||
|
|
||||||
})
|
})
|
||||||
.error(function(data) {
|
.error(function(data) {
|
||||||
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
||||||
@@ -909,7 +914,7 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
|
|||||||
url += (scope.search_host_name) ? 'host__name__icontains=' + scope.search_host_name + '&' : '';
|
url += (scope.search_host_name) ? 'host__name__icontains=' + scope.search_host_name + '&' : '';
|
||||||
url += (scope.search_host_status === 'failed') ? 'failed=true&' : '';
|
url += (scope.search_host_status === 'failed') ? 'failed=true&' : '';
|
||||||
url += 'event__startswith=runner&page_size=' + scope.hostResultsMaxRows + '&order_by=host__name';
|
url += 'event__startswith=runner&page_size=' + scope.hostResultsMaxRows + '&order_by=host__name';
|
||||||
|
scope.hostResultsLoading = true;
|
||||||
Rest.setUrl(url);
|
Rest.setUrl(url);
|
||||||
Rest.get()
|
Rest.get()
|
||||||
.success(function(data) {
|
.success(function(data) {
|
||||||
@@ -963,6 +968,7 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
|
|||||||
item: item
|
item: item
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
scope.hostResultsLoading = false;
|
||||||
});
|
});
|
||||||
if (callback) {
|
if (callback) {
|
||||||
scope.$emit(callback);
|
scope.$emit(callback);
|
||||||
@@ -995,6 +1001,7 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
|
|||||||
url += '&page_size=' + scope.hostSummariesMaxRows + '&order_by=host_name';
|
url += '&page_size=' + scope.hostSummariesMaxRows + '&order_by=host_name';
|
||||||
|
|
||||||
scope.hosts = [];
|
scope.hosts = [];
|
||||||
|
scope.hostSummariesLoading = true;
|
||||||
|
|
||||||
Rest.setUrl(url);
|
Rest.setUrl(url);
|
||||||
Rest.get()
|
Rest.get()
|
||||||
@@ -1017,6 +1024,7 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
|
|||||||
failed: event.failures,
|
failed: event.failures,
|
||||||
status: (event.failed) ? 'failed' : 'successful'
|
status: (event.failed) ? 'failed' : 'successful'
|
||||||
});
|
});
|
||||||
|
scope.hostSummariesLoading = false;
|
||||||
});
|
});
|
||||||
if (callback) {
|
if (callback) {
|
||||||
scope.$emit(callback);
|
scope.$emit(callback);
|
||||||
@@ -1399,6 +1407,13 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
|
|||||||
|
|
||||||
DrawHostSummaries({ scope: scope });
|
DrawHostSummaries({ scope: scope });
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
scope.playsLoading = false;
|
||||||
|
scope.tasksLoading = false;
|
||||||
|
scope.hostResultsLoading = false;
|
||||||
|
scope.LoadHostSummaries = false;
|
||||||
|
},100);
|
||||||
|
|
||||||
if (scope.host_summary.total > 0) {
|
if (scope.host_summary.total > 0) {
|
||||||
DrawGraph({ scope: scope, resize: true });
|
DrawGraph({ scope: scope, resize: true });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -178,7 +178,10 @@
|
|||||||
<td class="col-lg-1 col-md-2 col-sm-2 col-xs-2 status-column" aw-tool-tip="{{ play.status_tip }}" data-tip-watch="play.status_tip" data-placement="top"><i class="fa icon-job-{{ play.status }}"></i></td>
|
<td class="col-lg-1 col-md-2 col-sm-2 col-xs-2 status-column" aw-tool-tip="{{ play.status_tip }}" data-tip-watch="play.status_tip" data-placement="top"><i class="fa icon-job-{{ play.status }}"></i></td>
|
||||||
<td class="col-lg-7 col-md-6 col-sm-6 col-xs-4">{{ play.name }}</td>
|
<td class="col-lg-7 col-md-6 col-sm-6 col-xs-4">{{ play.name }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-show="plays.length === 0">
|
<tr ng-show="plays.length === 0 && playsLoading">
|
||||||
|
<td colspan="4" class="col-lg-12 loading-info">Loading...</td>
|
||||||
|
</tr>
|
||||||
|
<tr ng-show="plays.length === 0 && !playsLoading">
|
||||||
<td colspan="4" class="col-lg-12 loading-info">No matching plays</td>
|
<td colspan="4" class="col-lg-12 loading-info">No matching plays</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -239,7 +242,10 @@
|
|||||||
<td class="col-lg-3 col-md-3 col-sm-6 col-xs-4" id="">{{ task.name }}</td>
|
<td class="col-lg-3 col-md-3 col-sm-6 col-xs-4" id="">{{ task.name }}</td>
|
||||||
<td class="col-lg-4 col-md-3 hidden-sm hidden-xs"><div class="status-bar"><div class="successful-hosts inner-bar" id="{{ task.id }}-successful-bar" aw-tool-tip="Hosts OK" data-placement="top" ng-style="task.successfulStyle">{{ task.successfulCount }}</div><div class="changed-hosts inner-bar" id="{{ task.id }}-changed-bar" aw-tool-tip="Hosts Changed" data-placement="top" ng-style="task.changedStyle">{{ task.changedCount }}</div><div class="skipped-hosts inner-bar" id="{{ task.id }}-skipped-bar" aw-tool-tip="Hosts Skipped" data-placement="top" ng-style="task.skippedStyle">{{ task.skippedCount }}</div><div class="failed-hosts inner-bar" id="{{ task.id }}-failed-bar" aw-tool-tip="Hosts Failed" data-placement="top" ng-style="task.failedStyle">{{ task.failedCount }}</div><div class="unreachable-hosts inner-bar" id="{{ task.id }}-unreachable-hosts-bar" aw-tool-tip="Hosts Unreachable" data-placement="top" ng-style="task.unreachableStyle">{{ task.unreachableCount }}</div><div class="missing-hosts inner-bar" id="{{ task.id }}-misssing-hosts-bar" ng-style="task.missingStyle">{{ task.missingCount }}</div><div class="no-matching-hosts inner-bar" id="{{ task.id }}-{{ task.play_id }}-no-matching-hosts-bar" aw-tool-tip="No matching hosts were found" data-placement="top" style="width: 100%;" ng-show="task.status === 'no-matching-hosts'">No matching hosts</div></div></td>
|
<td class="col-lg-4 col-md-3 hidden-sm hidden-xs"><div class="status-bar"><div class="successful-hosts inner-bar" id="{{ task.id }}-successful-bar" aw-tool-tip="Hosts OK" data-placement="top" ng-style="task.successfulStyle">{{ task.successfulCount }}</div><div class="changed-hosts inner-bar" id="{{ task.id }}-changed-bar" aw-tool-tip="Hosts Changed" data-placement="top" ng-style="task.changedStyle">{{ task.changedCount }}</div><div class="skipped-hosts inner-bar" id="{{ task.id }}-skipped-bar" aw-tool-tip="Hosts Skipped" data-placement="top" ng-style="task.skippedStyle">{{ task.skippedCount }}</div><div class="failed-hosts inner-bar" id="{{ task.id }}-failed-bar" aw-tool-tip="Hosts Failed" data-placement="top" ng-style="task.failedStyle">{{ task.failedCount }}</div><div class="unreachable-hosts inner-bar" id="{{ task.id }}-unreachable-hosts-bar" aw-tool-tip="Hosts Unreachable" data-placement="top" ng-style="task.unreachableStyle">{{ task.unreachableCount }}</div><div class="missing-hosts inner-bar" id="{{ task.id }}-misssing-hosts-bar" ng-style="task.missingStyle">{{ task.missingCount }}</div><div class="no-matching-hosts inner-bar" id="{{ task.id }}-{{ task.play_id }}-no-matching-hosts-bar" aw-tool-tip="No matching hosts were found" data-placement="top" style="width: 100%;" ng-show="task.status === 'no-matching-hosts'">No matching hosts</div></div></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-show="taskList.length === 0">
|
<tr ng-show="taskList.length === 0 && tasksLoading">
|
||||||
|
<td colspan="5" class="col-lg-12 loading-info">Loading...</td>
|
||||||
|
</tr>
|
||||||
|
<tr ng-show="taskList.length === 0 && !tasksLoading">
|
||||||
<td colspan="5" class="col-lg-12 loading-info">No matching tasks</td>
|
<td colspan="5" class="col-lg-12 loading-info">No matching tasks</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -298,7 +304,10 @@
|
|||||||
<td class="col-lg-4 col-md-4 col-sm-3 col-xs-3">{{ result.msg }}</td>
|
<td class="col-lg-4 col-md-4 col-sm-3 col-xs-3">{{ result.msg }}</td>
|
||||||
<td class="col-lg-1 col-md-1 col-sm-1 col-xs-1"><a ng-show="result.host_id" href="" ng-click="editHost(result.host_id)" aw-tool-tip="Edit host" data-placement="top"><i class="fa fa-pencil"></i></a></td>
|
<td class="col-lg-1 col-md-1 col-sm-1 col-xs-1"><a ng-show="result.host_id" href="" ng-click="editHost(result.host_id)" aw-tool-tip="Edit host" data-placement="top"><i class="fa fa-pencil"></i></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-show="results.length === 0">
|
<tr ng-show="results.length === 0 && hostResultsLoading">
|
||||||
|
<td colspan="5" class="col-lg-12 loading-info">Loading...</td>
|
||||||
|
</tr>
|
||||||
|
<tr ng-show="results.length === 0 && !hostResultsLoading">
|
||||||
<td colspan="5" class="col-lg-12 loading-info">No matching hosts</td>
|
<td colspan="5" class="col-lg-12 loading-info">No matching hosts</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -375,7 +384,10 @@
|
|||||||
<a href="" ng-click="hostEventsViewer(host.id, host.name, 'failed')" aw-tool-tip="Failed" data-placement="top" ng-hide="host.failed == 0"><span class="badge failed-hosts">{{ host.failed }}</span></a></td>
|
<a href="" ng-click="hostEventsViewer(host.id, host.name, 'failed')" aw-tool-tip="Failed" data-placement="top" ng-hide="host.failed == 0"><span class="badge failed-hosts">{{ host.failed }}</span></a></td>
|
||||||
<td class="col-lg-1 col-md-1 col-sm-1 col-xs-1"><a ng-show="host.id" href="" ng-click="editHost(host.id)" aw-tool-tip="Edit host" data-placement="top"><i class="fa fa-pencil"></i></a></td>
|
<td class="col-lg-1 col-md-1 col-sm-1 col-xs-1"><a ng-show="host.id" href="" ng-click="editHost(host.id)" aw-tool-tip="Edit host" data-placement="top"><i class="fa fa-pencil"></i></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-show="summaryList.length === 0">
|
<tr ng-show="summaryList.length === 0 && hostSummariesLoading">
|
||||||
|
<td colspan="5" class="col-lg-12 loading-info">Loading...</td>
|
||||||
|
</tr>
|
||||||
|
<tr ng-show="summaryList.length === 0 && !hostSummariesLoading">
|
||||||
<td colspan="2" class="col-lg-12 loading-info">No matching hosts</td>
|
<td colspan="2" class="col-lg-12 loading-info">No matching hosts</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
Reference in New Issue
Block a user