mirror of
https://github.com/ansible/awx.git
synced 2026-03-13 15:09:32 -02:30
Wired up the Filter Events search dialog box. You can now filter all events by host name.
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
function JobDetailController ($scope, $compile, $routeParams, ClearScope, Breadcrumbs, LoadBreadCrumbs, GetBasePath, Wait, Rest, ProcessErrors, DigestEvents,
|
function JobDetailController ($scope, $compile, $routeParams, ClearScope, Breadcrumbs, LoadBreadCrumbs, GetBasePath, Wait, Rest, ProcessErrors, DigestEvents,
|
||||||
SelectPlay, SelectTask, Socket, GetElapsed, SelectHost) {
|
SelectPlay, SelectTask, Socket, GetElapsed, SelectHost, FilterAllByHostName) {
|
||||||
|
|
||||||
ClearScope();
|
ClearScope();
|
||||||
|
|
||||||
@@ -23,6 +23,8 @@ function JobDetailController ($scope, $compile, $routeParams, ClearScope, Breadc
|
|||||||
scope.plays = [];
|
scope.plays = [];
|
||||||
scope.tasks = [];
|
scope.tasks = [];
|
||||||
scope.hosts = [];
|
scope.hosts = [];
|
||||||
|
scope.search_all_tasks = [];
|
||||||
|
scope.search_all_plays = [];
|
||||||
scope.hostResults = [];
|
scope.hostResults = [];
|
||||||
scope.job_status = {};
|
scope.job_status = {};
|
||||||
scope.job_id = job_id;
|
scope.job_id = job_id;
|
||||||
@@ -457,7 +459,7 @@ function JobDetailController ($scope, $compile, $routeParams, ClearScope, Breadc
|
|||||||
// Called when user scrolls down (or forward in time). Using _.debounce
|
// Called when user scrolls down (or forward in time). Using _.debounce
|
||||||
var url, mcs = arguments[0];
|
var url, mcs = arguments[0];
|
||||||
scope.$apply(function() {
|
scope.$apply(function() {
|
||||||
if (!scope.auto_scroll && scope.activeTask && scope.hostResults) {
|
if (!scope.auto_scroll && scope.activeTask && scope.hostResults.length) {
|
||||||
scope.auto_scroll = true;
|
scope.auto_scroll = true;
|
||||||
url = GetBasePath('jobs') + job_id + '/job_events/?parent=' + scope.activeTask + '&';
|
url = GetBasePath('jobs') + job_id + '/job_events/?parent=' + scope.activeTask + '&';
|
||||||
url += (scope.task_host_name) ? 'host__name__icontains=' + scope.task_host_name + '&' : '';
|
url += (scope.task_host_name) ? 'host__name__icontains=' + scope.task_host_name + '&' : '';
|
||||||
@@ -502,7 +504,7 @@ function JobDetailController ($scope, $compile, $routeParams, ClearScope, Breadc
|
|||||||
// Called when user scrolls up (or back in time)
|
// Called when user scrolls up (or back in time)
|
||||||
var url, mcs = arguments[0];
|
var url, mcs = arguments[0];
|
||||||
scope.$apply(function() {
|
scope.$apply(function() {
|
||||||
if (!scope.auto_scroll && scope.activeTask && scope.hostResults) {
|
if (!scope.auto_scroll && scope.activeTask && scope.hostResults.length) {
|
||||||
scope.auto_scroll = true;
|
scope.auto_scroll = true;
|
||||||
url = GetBasePath('jobs') + job_id + '/job_events/?parent=' + scope.activeTask + '&';
|
url = GetBasePath('jobs') + job_id + '/job_events/?parent=' + scope.activeTask + '&';
|
||||||
url += (scope.task_host_name) ? 'host__name__icontains=' + scope.task_host_name + '&' : '';
|
url += (scope.task_host_name) ? 'host__name__icontains=' + scope.task_host_name + '&' : '';
|
||||||
@@ -716,8 +718,33 @@ function JobDetailController ($scope, $compile, $routeParams, ClearScope, Breadc
|
|||||||
scope.searchSummaryHosts();
|
scope.searchSummaryHosts();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
scope.searchAllByHost = function() {
|
||||||
|
if (scope.search_all_hosts_name) {
|
||||||
|
FilterAllByHostName({
|
||||||
|
scope: scope,
|
||||||
|
host: scope.search_all_hosts_name
|
||||||
|
});
|
||||||
|
scope.searchAllHostsEnabled = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
scope.search_all_tasks = [];
|
||||||
|
scope.search_all_plays = [];
|
||||||
|
scope.searchAllHostsEnabled = true;
|
||||||
|
}
|
||||||
|
scope.task_host_name = scope.search_all_hosts_name;
|
||||||
|
scope.searchTaskHosts();
|
||||||
|
scope.summary_host_name = scope.search_all_hosts_name;
|
||||||
|
scope.searchSummaryHosts();
|
||||||
|
};
|
||||||
|
|
||||||
|
scope.allHostNameKeyPress = function(e) {
|
||||||
|
if (e.keyCode === 13) {
|
||||||
|
scope.searchAllByHost();
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
JobDetailController.$inject = [ '$scope', '$compile', '$routeParams', 'ClearScope', 'Breadcrumbs', 'LoadBreadCrumbs', 'GetBasePath', 'Wait',
|
JobDetailController.$inject = [ '$scope', '$compile', '$routeParams', 'ClearScope', 'Breadcrumbs', 'LoadBreadCrumbs', 'GetBasePath', 'Wait',
|
||||||
'Rest', 'ProcessErrors', 'DigestEvents', 'SelectPlay', 'SelectTask', 'Socket', 'GetElapsed', 'SelectHost'
|
'Rest', 'ProcessErrors', 'DigestEvents', 'SelectPlay', 'SelectTask', 'Socket', 'GetElapsed', 'SelectHost', 'FilterAllByHostName'
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -229,8 +229,6 @@ function(UpdatePlayStatus, UpdateHostStatus, UpdatePlayChild, AddHostResult, Sel
|
|||||||
});
|
});
|
||||||
scope.job_status.status = (event.failed) ? 'failed' : 'successful';
|
scope.job_status.status = (event.failed) ? 'failed' : 'successful';
|
||||||
scope.job_status.status_class = "";
|
scope.job_status.status_class = "";
|
||||||
scope.liveEventsEnabled = true; // Show the stop button
|
|
||||||
scope.liveEventToggleDisabled = true; //Disable clicking on the button, the job is over
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -697,8 +695,8 @@ function(UpdatePlayStatus, UpdateHostStatus, UpdatePlayChild, AddHostResult, Sel
|
|||||||
};
|
};
|
||||||
}])
|
}])
|
||||||
|
|
||||||
.factory('SelectTask', ['SelectHost', 'GetBasePath', '$routeParams', 'Rest', 'ProcessErrors', 'Wait',
|
.factory('SelectTask', ['SelectHost', 'GetBasePath', '$routeParams', 'Rest', 'ProcessErrors',
|
||||||
function(SelectHost, GetBasePath, $routeParams, Rest, ProcessErrors, Wait) {
|
function(SelectHost, GetBasePath, $routeParams, Rest, ProcessErrors) {
|
||||||
return function(params) {
|
return function(params) {
|
||||||
var scope = params.scope,
|
var scope = params.scope,
|
||||||
id = params.id,
|
id = params.id,
|
||||||
@@ -730,7 +728,7 @@ function(UpdatePlayStatus, UpdateHostStatus, UpdatePlayChild, AddHostResult, Sel
|
|||||||
|
|
||||||
// is the job done? if so, only select hosts for the last task?
|
// is the job done? if so, only select hosts for the last task?
|
||||||
|
|
||||||
Wait('start');
|
//Wait('start');
|
||||||
scope.hostResults = [];
|
scope.hostResults = [];
|
||||||
url = GetBasePath('jobs') + $routeParams.id + '/job_events/?parent=' + id + '&';
|
url = GetBasePath('jobs') + $routeParams.id + '/job_events/?parent=' + id + '&';
|
||||||
url += (scope.task_host_name) ? 'host__name__icontains=' + scope.task_host_name + '&' : '';
|
url += (scope.task_host_name) ? 'host__name__icontains=' + scope.task_host_name + '&' : '';
|
||||||
@@ -749,7 +747,7 @@ function(UpdatePlayStatus, UpdateHostStatus, UpdatePlayChild, AddHostResult, Sel
|
|||||||
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 : '' )
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
Wait('stop');
|
//Wait('stop');
|
||||||
SelectHost({ scope: scope });
|
SelectHost({ scope: scope });
|
||||||
})
|
})
|
||||||
.error(function(data, status) {
|
.error(function(data, status) {
|
||||||
@@ -782,6 +780,75 @@ function(UpdatePlayStatus, UpdateHostStatus, UpdatePlayChild, AddHostResult, Sel
|
|||||||
{label:"Skipped", color:"#D4D4D4"},
|
{label:"Skipped", color:"#D4D4D4"},
|
||||||
{label:"Unreachable", color:""}
|
{label:"Unreachable", color:""}
|
||||||
];*/
|
];*/
|
||||||
|
}])
|
||||||
|
|
||||||
|
.factory('FilterAllByHostName', ['Rest', 'GetBasePath', 'ProcessErrors', 'SelectPlay', function(Rest, GetBasePath, ProcessErrors, SelectPlay) {
|
||||||
|
return function(params) {
|
||||||
|
var scope = params.scope,
|
||||||
|
host = params.host,
|
||||||
|
job_id = scope.job_id,
|
||||||
|
url = GetBasePath('jobs') + job_id + '/job_events/?event__icontains=runner&host_name__icontains=' + host;
|
||||||
|
|
||||||
|
scope.search_all_tasks = [];
|
||||||
|
scope.search_all_plays = [];
|
||||||
|
|
||||||
|
if (scope.removeAllPlaysReady) {
|
||||||
|
scope.removeAllPlaysReady();
|
||||||
|
}
|
||||||
|
scope.removeAllPlaysReady = scope.$on('AllPlaysReady', function() {
|
||||||
|
if (scope.activePlay) {
|
||||||
|
setTimeout(function() {
|
||||||
|
SelectPlay({ scope: scope, id: scope.activePlay });
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (scope.removeAllTasksReady) {
|
||||||
|
scope.removeAllTasksReady();
|
||||||
|
}
|
||||||
|
scope.removeAllTasksReady = scope.$on('AllTasksReady', function() {
|
||||||
|
url = GetBasePath('jobs') + job_id + '/job_events/?id__in=' + scope.search_all_tasks.join();
|
||||||
|
Rest.setUrl(url);
|
||||||
|
Rest.get()
|
||||||
|
.success(function(data) {
|
||||||
|
data.results.forEach(function(row) {
|
||||||
|
if (row.parent) {
|
||||||
|
scope.search_all_plays.push(row.parent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (scope.search_all_plays.length > 0) {
|
||||||
|
scope.search_all_plays.sort();
|
||||||
|
scope.activePlay = scope.search_all_plays[scope.search_all_plays.length - 1];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
scope.activePlay = null;
|
||||||
|
}
|
||||||
|
scope.$emit('AllPlaysReady');
|
||||||
|
})
|
||||||
|
.error(function(data, status) {
|
||||||
|
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
||||||
|
msg: 'Call to ' + url + '. GET returned: ' + status });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Rest.setUrl(url);
|
||||||
|
Rest.get()
|
||||||
|
.success(function(data) {
|
||||||
|
data.results.forEach(function(row) {
|
||||||
|
if (row.parent) {
|
||||||
|
scope.search_all_tasks.push(row.parent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (scope.search_all_tasks.length > 0) {
|
||||||
|
scope.search_all_tasks.sort();
|
||||||
|
}
|
||||||
|
scope.$emit('AllTasksReady');
|
||||||
|
})
|
||||||
|
.error(function(data, status) {
|
||||||
|
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
||||||
|
msg: 'Call to ' + url + '. GET returned: ' + status });
|
||||||
|
});
|
||||||
|
};
|
||||||
}]);
|
}]);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,18 +12,43 @@ angular.module('AWFilters', [])
|
|||||||
//
|
//
|
||||||
// capitalize -capitalize the first letter of each word
|
// capitalize -capitalize the first letter of each word
|
||||||
//
|
//
|
||||||
.filter('capitalize', [
|
.filter('capitalize', [ function () {
|
||||||
function () {
|
return function (input) {
|
||||||
return function (input) {
|
var values, result, i;
|
||||||
var values, result, i;
|
if (input) {
|
||||||
if (input) {
|
values = input.replace(/\_/g, ' ').split(" ");
|
||||||
values = input.replace(/\_/g, ' ').split(" ");
|
result = "";
|
||||||
result = "";
|
for (i = 0; i < values.length; i++) {
|
||||||
for (i = 0; i < values.length; i++) {
|
result += values[i].charAt(0).toUpperCase() + values[i].substr(1) + ' ';
|
||||||
result += values[i].charAt(0).toUpperCase() + values[i].substr(1) + ' ';
|
|
||||||
}
|
|
||||||
return result.trim();
|
|
||||||
}
|
}
|
||||||
};
|
return result.trim();
|
||||||
}
|
}
|
||||||
]);
|
};
|
||||||
|
}])
|
||||||
|
|
||||||
|
//
|
||||||
|
// Filter a list of objects by id using an array of id values
|
||||||
|
// Created specifically for Filter Events on job detail page.
|
||||||
|
//
|
||||||
|
.filter('FilterById', [ function() {
|
||||||
|
return function(input, list) {
|
||||||
|
var found, results = [];
|
||||||
|
if (list.length > 0) {
|
||||||
|
input.forEach(function(row) {
|
||||||
|
found = false;
|
||||||
|
list.every(function(id) {
|
||||||
|
if (row.id === id) {
|
||||||
|
found = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
if (found) {
|
||||||
|
results.push(row);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
return input;
|
||||||
|
};
|
||||||
|
}]);
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
<div class="col-lg-2 col-md-2 col-sm-4 col-xs-4 status-column"><i class="fa icon-job-{{ job_status.status }}"></i> {{ job_status.status }}</div>
|
<div class="col-lg-2 col-md-2 col-sm-4 col-xs-4 status-column"><i class="fa icon-job-{{ job_status.status }}"></i> {{ job_status.status }}</div>
|
||||||
<div class="col-lg-7 col-md-7 col-sm-4 col-xs-4">{{ job_status.explanation }}</div>
|
<div class="col-lg-7 col-md-7 col-sm-4 col-xs-4">{{ job_status.explanation }}</div>
|
||||||
<div class="col-lg-2 col-md-2 col-sm-2 col-xs-2 text-right">
|
<div class="col-lg-2 col-md-2 col-sm-2 col-xs-2 text-right">
|
||||||
<a href="/#/jobs/{{ job_id }}/stdout" target="_blank" type="button" class="btn btn-default btn-xs" aw-tool-tip="View standard out. Opens in new tab or window." data-placement="top" ng-show="job_status == 'successful' || job_status == 'failed' || job_status == 'error'"><i class="fa fa-external-link"></i></a>
|
<a href="/#/jobs/{{ job_id }}/stdout" target="_blank" type="button" class="btn btn-default btn-xs" aw-tool-tip="View standard out. Opens in new tab or window." data-placement="top" ng-show="job_status.status == 'successful' || job_status.status == 'failed' || job_status.status == 'error'"><i class="fa fa-external-link"></i></a>
|
||||||
<button type="button" id="summary-button" class="btn btn-default btn-xs" ng-click="toggleSummary()" aw-tool-tip="View summary" data-placement="top"><i class="fa fa-arrow-circle-left fa-lg"></i></button>
|
<button type="button" id="summary-button" class="btn btn-default btn-xs" ng-click="toggleSummary()" aw-tool-tip="View summary" data-placement="top"><i class="fa fa-arrow-circle-left fa-lg"></i></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="plays-table-detail" aw-custom-scroll class="table-detail">
|
<div id="plays-table-detail" aw-custom-scroll class="table-detail">
|
||||||
<div class="row cursor-pointer" ng-repeat="play in plays" ng-class="play.playActiveClass" ng-click="selectPlay(play.id)">
|
<div class="row cursor-pointer" ng-repeat="play in plays | FilterById : search_all_plays " ng-class="play.playActiveClass" ng-click="selectPlay(play.id)">
|
||||||
<div class="col-lg-1 col-md-1 col-sm-2 hidden-xs">{{ play.created | date: 'HH:mm:ss' }}</div>
|
<div class="col-lg-1 col-md-1 col-sm-2 hidden-xs">{{ play.created | date: 'HH:mm:ss' }}</div>
|
||||||
<div class="col-lg-1 col-md-1 hidden-sm hidden-xs" aw-tool-tip="Completed at {{ play.finished | date:'HH:mm:ss' }}"
|
<div class="col-lg-1 col-md-1 hidden-sm hidden-xs" aw-tool-tip="Completed at {{ play.finished | date:'HH:mm:ss' }}"
|
||||||
data-placement="top">{{ play.elapsed }}
|
data-placement="top">{{ play.elapsed }}
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="tasks-table-detail" aw-custom-scroll class="table-detail">
|
<div id="tasks-table-detail" aw-custom-scroll class="table-detail">
|
||||||
<div class="row cursor-pointer" ng-repeat="task in taskList = (tasks | filter:{ play_id: activePlay })" ng-class="task.taskActiveClass"
|
<div class="row cursor-pointer" ng-repeat="task in taskList = (tasks | FilterById : search_all_tasks | filter:{ play_id: activePlay })" ng-class="task.taskActiveClass"
|
||||||
ng-click="selectTask(task.id)">
|
ng-click="selectTask(task.id)">
|
||||||
<div class="col-lg-1 col-md-1 col-sm-2 hidden-xs">{{ task.created | date: 'HH:mm:ss' }}</div>
|
<div class="col-lg-1 col-md-1 col-sm-2 hidden-xs">{{ task.created | date: 'HH:mm:ss' }}</div>
|
||||||
<div class="col-lg-1 col-md-1 hidden-sm hidden-xs" aw-tool-tip="Completed at {{ task.finished | date:'HH:mm:ss' }}"
|
<div class="col-lg-1 col-md-1 hidden-sm hidden-xs" aw-tool-tip="Completed at {{ task.finished | date:'HH:mm:ss' }}"
|
||||||
@@ -149,7 +149,7 @@
|
|||||||
placeholder="Host Name" ng-disabled="searchAllDisabled" ng-keypress="allHostNameKeyPress($event)" />
|
placeholder="Host Name" ng-disabled="searchAllDisabled" ng-keypress="allHostNameKeyPress($event)" />
|
||||||
<div id="search-all-input-icons">
|
<div id="search-all-input-icons">
|
||||||
<a class="search-icon" ng-show="searchAllHostsEnabled" ng-click="searchAllHosts()"><i class="fa fa-search"></i></a>
|
<a class="search-icon" ng-show="searchAllHostsEnabled" ng-click="searchAllHosts()"><i class="fa fa-search"></i></a>
|
||||||
<a class="search-icon" ng-show="!searchAllHostsEnabled" ng-click="search_all_hosts_name=''; searchAllHosts()"><i class="fa fa-times"></i></a>
|
<a class="search-icon" ng-show="!searchAllHostsEnabled" ng-click="search_all_hosts_name=''; searchAllByHost()"><i class="fa fa-times"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user