diff --git a/ansibleworks/ui/static/css/ansible-ui.css b/ansibleworks/ui/static/css/ansible-ui.css index cce4e4b41e..7dc44fb7f7 100644 --- a/ansibleworks/ui/static/css/ansible-ui.css +++ b/ansibleworks/ui/static/css/ansible-ui.css @@ -295,12 +295,18 @@ .job-error, .job-failed, .active-failures-true, + .active-failures-true a, + .active-failures-true a:active, input[type="text"].job-failed, input[type="text"].job-error { color: #da4f49; } + .active-failures-true a:hover { + color: #FF0000; + } + .job-new, input[type="text"].job-new, .job-canceled, input[type="text"].job-canceled { color: #778899; @@ -443,6 +449,11 @@ margin-left: 0; } + tr td button i { + margin-right: 0; + padding-top: 0; + } + #event_display-header { min-width: 250px; } diff --git a/ansibleworks/ui/static/js/controllers/Inventories.js b/ansibleworks/ui/static/js/controllers/Inventories.js index 123817e751..bdaffca095 100644 --- a/ansibleworks/ui/static/js/controllers/Inventories.js +++ b/ansibleworks/ui/static/js/controllers/Inventories.js @@ -417,6 +417,20 @@ function InventoriesEdit ($scope, $rootScope, $compile, $location, $log, $routeP HostsDelete({ scope: scope, "inventory_id": id, group_id: scope.group_id, host_id: host_id, host_name: host_name }); } + scope.showEvents = function(host_name, last_job) { + // When click on !Failed Events link, redirect to latest job/job_events for the host + Rest.setUrl(last_job); + Rest.get() + .success( function(data, status, headers, config) { + LoadBreadCrumbs({ path: '/jobs/' + data.id, title: data.name }); + $location.url('/jobs/' + data.id + '/job_events/?host=' + escape(host_name)); + }) + .error( function(data, status, headers, config) { + ProcessErrors(scope, data, status, form, + { hdr: 'Error!', msg: 'Failed to lookup last job: ' + last_job + '. GET status: ' + status }); + }); + } + } InventoriesEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'InventoryForm', diff --git a/ansibleworks/ui/static/js/controllers/JobEvents.js b/ansibleworks/ui/static/js/controllers/JobEvents.js index 90170cfe59..6d36622cff 100644 --- a/ansibleworks/ui/static/js/controllers/JobEvents.js +++ b/ansibleworks/ui/static/js/controllers/JobEvents.js @@ -46,8 +46,16 @@ function JobEventsList ($scope, $rootScope, $location, $log, $routeParams, Rest, SearchInit({ scope: scope, set: 'jobevents', list: list, url: defaultUrl }); PaginateInit({ scope: scope, list: list, url: defaultUrl }); - scope.search(list.iterator); + // Called from Inventories tab host failed events link: + if ($routeParams.host) { + scope[list.iterator + 'SearchField'] = 'host'; + scope[list.iterator + 'SearchValue'] = $routeParams.host; + scope[list.iterator + 'SearchFieldLabel'] = list.fields['host'].label; + } + + scope.search(list.iterator); + scope.toggleChildren = function(id, children) { ToggleChildren({ scope: scope, diff --git a/ansibleworks/ui/static/js/forms/Inventories.js b/ansibleworks/ui/static/js/forms/Inventories.js index 9a8d50cfa8..58f0dc77ea 100644 --- a/ansibleworks/ui/static/js/forms/Inventories.js +++ b/ansibleworks/ui/static/js/forms/Inventories.js @@ -102,6 +102,7 @@ angular.module('InventoryFormDefinition', []) has_active_failures: { label: 'Failures', showValue: false, + ngClick: "showEvents('\{\{ host.name \}\}', '\{\{ host.related.last_job \}\}')", ngShow: "\{\{ host.has_active_failures \}\}", icon: 'icon-exclamation-sign', "class": 'active-failures-\{\{ host.has_active_failures \}\}', diff --git a/ansibleworks/ui/static/js/helpers/Events.js b/ansibleworks/ui/static/js/helpers/Events.js index bc068d758f..5e112d5f1d 100644 --- a/ansibleworks/ui/static/js/helpers/Events.js +++ b/ansibleworks/ui/static/js/helpers/Events.js @@ -1,4 +1,11 @@ - +/********************************************* + * Copyright (c) 2013 AnsibleWorks, Inc. + * + * EventsHelper + * + * EventView - show the job_events form in a modal dialog + * + */ angular.module('EventsHelper', ['RestServices', 'Utilities', 'JobEventFormDefinition']) .factory('EventView', ['$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'JobEventForm', 'GenerateForm', 'Prompt', 'ProcessErrors', 'GetBasePath',