diff --git a/awx/ui/client/legacy-styles/job-details.less b/awx/ui/client/legacy-styles/job-details.less index d3cc2bae50..d4a21a9421 100644 --- a/awx/ui/client/legacy-styles/job-details.less +++ b/awx/ui/client/legacy-styles/job-details.less @@ -503,7 +503,7 @@ } #graph-section svg{ - margin-top: 15px; + margin: 0 auto; } path.slice{ diff --git a/awx/ui/client/src/helpers/JobDetail.js b/awx/ui/client/src/helpers/JobDetail.js index 689e7139b5..562b73d0eb 100644 --- a/awx/ui/client/src/helpers/JobDetail.js +++ b/awx/ui/client/src/helpers/JobDetail.js @@ -40,9 +40,9 @@ export default angular.module('JobDetailHelper', ['Utilities', 'RestServices', 'ModalDialog']) .factory('DigestEvent', ['$rootScope', '$log', 'UpdatePlayStatus', 'UpdateHostStatus', 'AddHostResult', - 'GetElapsed', 'UpdateTaskStatus', 'DrawGraph', 'LoadHostSummary', 'JobIsFinished', 'AddNewTask', 'AddNewPlay', + 'GetElapsed', 'UpdateTaskStatus', 'JobIsFinished', 'AddNewTask', 'AddNewPlay', function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, GetElapsed, - UpdateTaskStatus, DrawGraph, LoadHostSummary, JobIsFinished, AddNewTask, AddNewPlay) { + UpdateTaskStatus, JobIsFinished, AddNewTask, AddNewPlay, longDateFilter) { return function(params) { var scope = params.scope, @@ -185,7 +185,7 @@ export default }; }]) - .factory('GetElapsed', [ function() { + .factory('GetElapsed', [function() { return function(params) { var start = params.start, end = params.end, @@ -299,7 +299,7 @@ export default }; }]) - .factory('AddNewTask', ['DrawGraph', 'UpdatePlayStatus', 'SetActivePlay', 'SetActiveTask', function(DrawGraph, UpdatePlayStatus, SetActivePlay, SetActiveTask) { + .factory('AddNewTask', ['UpdatePlayStatus', 'SetActivePlay', 'SetActiveTask', function(UpdatePlayStatus, SetActivePlay, SetActiveTask) { return function(params) { var scope = params.scope, event = params.event, @@ -363,17 +363,17 @@ export default scope.job_status.status = 'failed'; } if (JobIsFinished(scope) && !Empty(modified)) { - scope.job_status.finished = modified; + scope.job_status.finished = longDateFilter(modified) } if (!Empty(started) && Empty(scope.job_status.started)) { - scope.job_status.started = started; + scope.job_status.started = longDateFilter(modified) } if (!Empty(scope.job_status.finished) && !Empty(scope.job_status.started)) { scope.job_status.elapsed = GetElapsed({ - start: scope.job_status.started, - end: scope.job_status.finished + start: started, + end: finished }); - } + } }; }]) @@ -488,15 +488,6 @@ export default counter = params.counter, h, host; - /* - scope.host_summary.ok += (status === 'successful') ? 1 : 0; - scope.host_summary.changed += (status === 'changed') ? 1 : 0; - scope.host_summary.unreachable += (status === 'unreachable') ? 1 : 0; - scope.host_summary.failed += (status === 'failed') ? 1 : 0; - scope.host_summary.total = scope.host_summary.ok + scope.host_summary.changed + scope.host_summary.unreachable + - scope.host_summary.failed; - */ - if (scope.jobData.hostSummaries[host_id] !== undefined) { scope.jobData.hostSummaries[host_id].ok += (status === 'successful') ? 1 : 0; scope.jobData.hostSummaries[host_id].changed += (status === 'changed') ? 1 : 0; @@ -517,29 +508,6 @@ export default status: (status === 'failed' || status === 'unreachable') ? 'failed' : 'successful' }; } - - scope.host_summary.ok = 0; - scope.host_summary.changed = 0; - scope.host_summary.unreachable = 0; - scope.host_summary.failed = 0; - for (h in scope.jobData.hostSummaries) { - host = scope.jobData.hostSummaries[h]; - if (host.ok > 0 && host.failed === 0 && host.unreachable === 0 && host.changed === 0) { - scope.host_summary.ok++; - } - if (host.changed > 0 && host.failed === 0 && host.unreachable === 0) { - scope.host_summary.changed++; - } - if (host.failed > 0) { - scope.host_summary.failed++; - } - if (host.unreachable > 0) { - scope.host_summary.unreachable++; - } - } - scope.host_summary.total = scope.host_summary.ok + scope.host_summary.changed + scope.host_summary.unreachable + - scope.host_summary.failed; - UpdateTaskStatus({ scope: scope, task_id: task_id, @@ -822,7 +790,6 @@ export default url += (scope.search_task_name) ? '&task__icontains=' + scope.search_task_name : ''; url += (scope.search_task_status === 'failed') ? '&failed=true' : ''; url += '&page_size=' + scope.tasksMaxRows + '&order=id'; - scope.plays.every(function(p, idx) { if (p.id === scope.selectedPlay) { play = scope.plays[idx]; @@ -931,7 +898,7 @@ export default }]) // Call when the selected task needs to change - .factory('SelectTask', ['LoadHosts', function(LoadHosts) { + .factory('SelectTask', ['JobDetailService', function(JobDetailService) { return function(params) { var scope = params.scope, id = params.id, @@ -946,239 +913,52 @@ export default scope.tasks[idx].taskActiveClass = ''; } }); - - LoadHosts({ - scope: scope, - callback: callback, - clear: true + var params = { + parent: scope.selectedTask, + event__startswith: 'runner', + page_size: scope.hostResultsMaxRows, + order: 'host_name,counter', + }; + JobDetailService.getRelatedJobEvents(scope.job.id, params).success(function(res){ + scope.hostResults = JobDetailService.processHostEvents(res.results) + scope.hostResultsLoading = false; }); }; }]) - // Refresh the list of hosts - .factory('LoadHosts', ['Rest', 'ProcessErrors', function(Rest, ProcessErrors) { - return function(params) { - var scope = params.scope, - callback = params.callback, - url; - - scope.hostResults = []; - - if (scope.selectedTask) { - // If we have a selected task, then get the list of hosts - url = scope.job.related.job_events + '?parent=' + scope.selectedTask + '&'; - url += (scope.search_host_name) ? 'host__name__icontains=' + scope.search_host_name + '&' : ''; - url += (scope.search_host_status === 'failed') ? 'failed=true&' : ''; - url += 'event__startswith=runner&page_size=' + scope.hostResultsMaxRows + '&order=host_name,counter'; - scope.hostResultsLoading = true; - Rest.setUrl(url); - Rest.get() - .success(function(data) { - scope.next_host_results = data.next; - scope.hostResults = []; - data.results.forEach(function(event) { - var status, status_text, item, msg; - if (event.event === "runner_on_skipped") { - status = 'skipped'; - } - else if (event.event === "runner_on_unreachable") { - status = 'unreachable'; - } - else { - status = (event.failed) ? 'failed' : (event.changed) ? 'changed' : 'successful'; - } - switch(status) { - case "successful": - status_text = 'OK'; - break; - case "changed": - status_text = "Changed"; - break; - case "failed": - status_text = "Failed"; - break; - case "unreachable": - status_text = "Unreachable"; - break; - case "skipped": - status_text = "Skipped"; - } - - if (event.event_data && event.event_data.res) { - item = event.event_data.res.item; - if (typeof item === "object") { - item = JSON.stringify(item); - item = item.replace(/\"/g,'').replace(/:/g,': ').replace(/,/g,', '); - } - } - - msg = ''; - if (event.event_data && event.event_data.res) { - if (typeof event.event_data.res === 'object') { - msg = event.event_data.res.msg; - } else { - msg = event.event_data.res; - } - } - - if (event.event !== "runner_on_no_hosts") { - scope.hostResults.push({ - id: event.id, - status: status, - status_text: status_text, - host_id: event.host, - task_id: event.parent, - name: event.event_data.host, - created: event.created, - msg: msg, - item: item - }); - } - }); - - scope.hostResultsLoading = false; - - if (callback) { - scope.$emit(callback); - } - }) - .error(function(data, status) { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + '. GET returned: ' + status }); - }); - } - else { - if (callback) { - scope.$emit(callback); - } - //$('#hosts-table-detail').mCustomScrollbar("update"); - } - }; - }]) - - // Refresh the list of hosts in the hosts summary section - .factory('ReloadHostSummaryList', ['Rest', 'ProcessErrors', function(Rest, ProcessErrors) { - return function(params) { - var scope = params.scope, - callback = params.callback, - url; - - url = scope.job.related.job_host_summaries + '?'; - url += (scope.search_host_summary_name) ? 'host_name__icontains=' + scope.search_host_summary_name + '&': ''; - url += (scope.search_host_summary_status === 'failed') ? 'failed=true&' : ''; - url += '&page_size=' + scope.hostSummariesMaxRows + '&order=host_name'; - - scope.hosts = []; - scope.hostSummariesLoading = true; - - Rest.setUrl(url); - Rest.get() - .success(function(data) { - scope.next_host_summaries = data.next; - scope.hosts = []; - data.results.forEach(function(event) { - var name; - if (event.host_name) { - name = event.host_name; - } - else { - name = ""; - } - scope.hosts.push({ - id: name, - name: event.host_name, - ok: event.ok, - changed: event.changed, - unreachable: event.dark, - failed: event.failures, - status: (event.failed) ? 'failed' : 'successful' - }); - }); - - scope.hostSummariesLoading = false; - - if (callback) { - scope.$emit(callback); - } - }) - .error(function(data, status) { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + '. GET returned: ' + status }); - }); - }; - }]) - - .factory('LoadHostSummary', [ function() { - return function(params) { - var scope = params.scope, - data = params.data, - host; - scope.host_summary.ok = 0; - for (host in data.ok) { - if (!data.changed[host] && !data.dark[host] && !data.failures[host]) { - scope.host_summary.ok += 1; - } - } - scope.host_summary.changed = 0; - for (host in data.changed) { - if (!data.dark[host] && !data.failures[host]) { - scope.host_summary.changed += 1; - } - } - scope.host_summary.unreachable = 0; - for (host in data.dark) { - scope.host_summary.unreachable += 1; - } - scope.host_summary.failed = 0; - for (host in data.failures) { - scope.host_summary.failed += 1; - } - scope.host_summary.total = scope.host_summary.ok + scope.host_summary.changed + - scope.host_summary.unreachable + scope.host_summary.failed; - }; - }]) - - .factory('DrawGraph', ['DonutChart', function(DonutChart) { return function(params) { - var scope = params.scope, + var count = params.count, graph_data = []; - // Ready the data - if (scope.host_summary.ok) { + if (count.ok.length > 0) { graph_data.push({ label: 'OK', - value: scope.host_summary.ok, + value: count.ok.length, color: '#60D66F' }); } - if (scope.host_summary.changed) { + if (count.changed.length > 0) { graph_data.push({ label: 'CHANGED', - value: scope.host_summary.changed, + value: count.changed.length, color: '#FF9900' }); } - if (scope.host_summary.unreachable) { + if (count.unreachable.length > 0) { graph_data.push({ label: 'UNREACHABLE', - value: scope.host_summary.unreachable, + value: count.unreachable.length, color: '#FF0000' }); } - if (scope.host_summary.failed) { + if (count.failures.length > 0) { graph_data.push({ label: 'FAILED', - value: scope.host_summary.failed, + value: count.failures.length, color: '#ff5850' }); } - scope.graph_data = graph_data; - var total_count = 0, gd_obj; - for (gd_obj in graph_data) { - total_count += graph_data[gd_obj].value; - } - scope.total_count_for_graph = total_count; DonutChart({ data: graph_data }); @@ -1220,44 +1000,42 @@ export default "font-family": 'Open Sans', "font-style": "normal", "font-weight":400, - "src": "url(/static/assets/OpenSans-Regular.ttf)" + "src": "url(/static/assets/OpenSans-Regular.ttf)", + "width": 500, + "height": 300, }); d3.select(element.find(".nv-label text")[0]) - .attr("class", "DashboardGraphs-hostStatusLabel--successful") + .attr("class", "HostSummary-graph--successful") .style({ "font-family": 'Open Sans', - "text-anchor": "start", "font-size": "16px", "text-transform" : "uppercase", "fill" : colors[0], "src": "url(/static/assets/OpenSans-Regular.ttf)" }); d3.select(element.find(".nv-label text")[1]) - .attr("class", "DashboardGraphs-hostStatusLabel--failed") + .attr("class", "HostSummary-graph--changed") .style({ "font-family": 'Open Sans', - "text-anchor" : "end !imporant", "font-size": "16px", "text-transform" : "uppercase", "fill" : colors[1], "src": "url(/static/assets/OpenSans-Regular.ttf)" }); d3.select(element.find(".nv-label text")[2]) - .attr("class", "DashboardGraphs-hostStatusLabel--successful") + .attr("class", "HostSummary-graph--failed") .style({ "font-family": 'Open Sans', - "text-anchor" : "end !imporant", "font-size": "16px", "text-transform" : "uppercase", "fill" : colors[2], "src": "url(/static/assets/OpenSans-Regular.ttf)" }); d3.select(element.find(".nv-label text")[3]) - .attr("class", "DashboardGraphs-hostStatusLabel--failed") + .attr("class", "HostSummary-graph--unreachable") .style({ "font-family": 'Open Sans', - "text-anchor" : "end !imporant", "font-size": "16px", "text-transform" : "uppercase", "fill" : colors[3], @@ -1274,7 +1052,8 @@ export default idx = 0, result = [], newKeys = [], - plays = JSON.parse(JSON.stringify(scope.jobData.plays)), + //plays = JSON.parse(JSON.stringify(scope.jobData.plays)), + plays = scope.jobData.plays, filteredListX = [], filteredListA = [], filteredListB = [], @@ -1363,7 +1142,8 @@ export default if (scope.activePlay && scope.jobData.plays[scope.activePlay]) { - tasks = JSON.parse(JSON.stringify(scope.jobData.plays[scope.activePlay].tasks)); + //tasks = JSON.parse(JSON.stringify(scope.jobData.plays[scope.activePlay].tasks)); + tasks = scope.jobData.plays[scope.activePlay].tasks; // Only draw tasks that are in the 'active' list for (key in tasks) { @@ -1437,7 +1217,8 @@ export default if (scope.activePlay && scope.activeTask && scope.jobData.plays[scope.activePlay] && scope.jobData.plays[scope.activePlay].tasks[scope.activeTask]) { - hostResults = JSON.parse(JSON.stringify(scope.jobData.plays[scope.activePlay].tasks[scope.activeTask].hostResults)); + //hostResults = JSON.parse(JSON.stringify(scope.jobData.plays[scope.activePlay].tasks[scope.activeTask].hostResults)); + hostResults = scope.jobData.plays[scope.activePlay].tasks[scope.activeTask].hostResults; if (scope.search_host_name) { for (key in hostResults) { @@ -1498,88 +1279,20 @@ export default }; }]) - .factory('DrawHostSummaries', [ function() { - return function(params) { - var scope = params.scope, - result = [], - filteredListA = [], - filteredListB = [], - idx = 0, - hostSummaries, - key, - keys = Object.keys(scope.jobData.hostSummaries); - if (keys.length > 0) { - hostSummaries = JSON.parse(JSON.stringify(scope.jobData.hostSummaries)); - if (scope.search_host_summary_name) { - for (key in hostSummaries) { - if (hostSummaries[key].name.indexOf(scope.search_host_summary_name) > 0) { - filteredListA[key] = hostSummaries[key]; - } - } - } - else { - filteredListA = hostSummaries; - } - - if (scope.search_host_summary_status === 'failed') { - for (key in filteredListA) { - if (filteredListA[key].status === 'failed' || filteredListA[key].status === 'unreachable') { - filteredListB[key] = filteredListA[key]; - } - } - } - else { - filteredListB = filteredListA; - } - - keys = Object.keys(filteredListB); - - keys.sort(function(a,b) { - if (filteredListB[a].name > filteredListB[b].name) { - return 1; - } - if (filteredListB[a].name < filteredListB[b].name) { - return -1; - } - // a must be equal to b - return 0; - }); - - while (idx < keys.length && result.length < scope.hostSummariesMaxRows) { - result.push(filteredListB[keys[idx]]); - idx++; - } - } - setTimeout( function() { - scope.$apply( function() { - scope.hosts = result; - }); - }); - }; - }]) - - .factory('UpdateDOM', ['DrawPlays', 'DrawTasks', 'DrawHostResults', 'DrawHostSummaries', 'DrawGraph', - function(DrawPlays, DrawTasks, DrawHostResults, DrawHostSummaries, DrawGraph) { + .factory('UpdateDOM', ['DrawPlays', 'DrawTasks', 'DrawHostResults', + function(DrawPlays, DrawTasks, DrawHostResults) { return function(params) { var scope = params.scope; - if (!scope.pauseLiveEvents) { DrawPlays({ scope: scope }); DrawTasks({ scope: scope }); DrawHostResults({ 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) { - DrawGraph({ scope: scope, resize: true }); - } }; }]); diff --git a/awx/ui/client/src/helpers/JobSubmission.js b/awx/ui/client/src/helpers/JobSubmission.js index aee3570311..e357e5d436 100644 --- a/awx/ui/client/src/helpers/JobSubmission.js +++ b/awx/ui/client/src/helpers/JobSubmission.js @@ -752,9 +752,9 @@ function($compile, Rest, GetBasePath, TextareaResize,CreateDialog, GenerateForm, * */ // Submit request to run a playbook - .factory('PlaybookRun', ['$location','$stateParams', 'LaunchJob', 'PromptForPasswords', 'Rest', 'GetBasePath', 'Alert', 'ProcessErrors', 'Wait', 'Empty', + .factory('PlaybookRun', ['$location', '$state', '$stateParams', 'LaunchJob', 'PromptForPasswords', 'Rest', 'GetBasePath', 'Alert', 'ProcessErrors', 'Wait', 'Empty', 'PromptForCredential', 'PromptForVars', 'PromptForSurvey' , 'CreateLaunchDialog', - function ($location, $stateParams, LaunchJob, PromptForPasswords, Rest, GetBasePath, Alert, ProcessErrors, Wait, Empty, + function ($location, $state, $stateParams, LaunchJob, PromptForPasswords, Rest, GetBasePath, Alert, ProcessErrors, Wait, Empty, PromptForCredential, PromptForVars, PromptForSurvey, CreateLaunchDialog) { return function (params) { var //parent_scope = params.scope, @@ -803,7 +803,8 @@ function($compile, Rest, GetBasePath, TextareaResize,CreateDialog, GenerateForm, var job = data.job || data.system_job; if((scope.portalMode===false || scope.$parent.portalMode===false ) && Empty(data.system_job) || (base === 'home')){ - $location.path('/jobs/' + job); + // use $state.go with reload: true option to re-instantiate sockets in + $state.go('jobDetail', {id: job}, {reload: true}) } }); diff --git a/awx/ui/client/src/helpers/Jobs.js b/awx/ui/client/src/helpers/Jobs.js index 7700bdcd1d..6b0095b6da 100644 --- a/awx/ui/client/src/helpers/Jobs.js +++ b/awx/ui/client/src/helpers/Jobs.js @@ -75,7 +75,7 @@ export default scope.viewJobDetails = function(job) { var goToJobDetails = function(state) { - $state.go(state, {id: job.id}); + $state.go(state, {id: job.id}, {reload:true}); } switch(job.type) { diff --git a/awx/ui/client/src/helpers/Schedules.js b/awx/ui/client/src/helpers/Schedules.js index 9b7566e678..35f5023b06 100644 --- a/awx/ui/client/src/helpers/Schedules.js +++ b/awx/ui/client/src/helpers/Schedules.js @@ -173,8 +173,8 @@ export default } $state.go("^"); }); - scope.saveSchedule = function() { + schedule.extra_data = scope.serializedExtraVars; SchedulePost({ scope: scope, url: url, @@ -192,6 +192,7 @@ export default Rest.get() .success(function(data) { schedule = data; + scope.serializedExtraVars = schedule.extra_data; if(schedule.extra_data.hasOwnProperty('granularity')){ scope.isFactCleanup = true; } @@ -312,7 +313,6 @@ export default schedule = (params.schedule) ? params.schedule : {}, callback = params.callback, newSchedule, rrule, extra_vars; - if (scheduler.isValid()) { Wait('start'); newSchedule = scheduler.getValue(); @@ -326,14 +326,16 @@ export default "older_than": scope.scheduler_form.keep_amount.$viewValue + scope.scheduler_form.keep_unit.$viewValue.value, "granularity": scope.scheduler_form.granularity_keep_amount.$viewValue + scope.scheduler_form.granularity_keep_unit.$viewValue.value }; + schedule.extra_data = JSON.stringify(extra_vars); } else if (scope.cleanupJob) { extra_vars = { "days" : scope.scheduler_form.schedulerPurgeDays.$viewValue }; + schedule.extra_data = JSON.stringify(extra_vars); + } + else if (scope.serializedExtraVars){ + schedule.extra_data = scope.serializedExtraVars; } - schedule.extra_data = JSON.stringify(extra_vars); - - Rest.setUrl(url); if (mode === 'add') { Rest.post(schedule) diff --git a/awx/ui/client/src/job-detail/host-event/host-event-details.partial.html b/awx/ui/client/src/job-detail/host-event/host-event-details.partial.html index 66a60fcec9..f650b4335a 100644 --- a/awx/ui/client/src/job-detail/host-event/host-event-details.partial.html +++ b/awx/ui/client/src/job-detail/host-event/host-event-details.partial.html @@ -1,49 +1,49 @@
-
-
EVENT
- -
- -
- STATUS - - - - - {{event.status || "No result found"}} - -
-
- ID - {{event.id || "No result found"}} -
-
- CREATED - {{event.created || "No result found"}} -
-
- PLAY - {{event.play || "No result found"}} -
-
- TASK - {{event.task || "No result found"}} -
-
- MODULE - {{event.event_data.res.invocation.module_name || "No result found"}} -
+
+
EVENT
+ +
+ +
+ STATUS + + + + + {{processEventStatus(event).status || "No result found"}} + +
+
+ ID + {{event.id || "No result found"}} +
+
+ CREATED + {{event.created || "No result found"}} +
+
+ PLAY + {{event.play || "No result found"}} +
+
+ TASK + {{event.task || "No result found"}} +
+
+ MODULE + {{event.event_data.res.invocation.module_name || "No result found"}} +
-
RESULTS
- -
- {{key}} - {{value}} -
+
RESULTS
+ +
+ {{key}} + {{value}} +
diff --git a/awx/ui/client/src/job-detail/host-event/host-event-modal.partial.html b/awx/ui/client/src/job-detail/host-event/host-event-modal.partial.html index db106deb1b..919617a333 100644 --- a/awx/ui/client/src/job-detail/host-event/host-event-modal.partial.html +++ b/awx/ui/client/src/job-detail/host-event/host-event-modal.partial.html @@ -1,4 +1,4 @@ -
+
- - -
+
+ + +
+ A schedule name is required. +
+
+
+ +
+ + + + +
+
+
+
+
+ +
+ + + : + + + + : + + + +
+
+ The time must be in HH24:MM:SS format. +
+
+
+ + +
+
+ + +
+
+
+
+ Frequency Details
+
+
+ + + +
+ Please provide a value between 1 and 999. +
+
+
+
+
+ +
+ The day must be between 1 and 31. +
+
+
+
+ +
+
+ + +
+
+
+
+ * + +
+
+ + +
+
+ The day must be between 1 and 31. +
+
+
+
+ +
+
+ + + +
+
+
+ +
+
+ + + + + + + +
+
+
+ Please select one or more days. +
+
+
+ +
+ +
+
+
+ +
+ Please provide a value between 1 and 999. +
+
+
+ +
+ -
- A schedule name is required. -
-
-
- -
- - - - -
-
-
-
-
- -
- - - : - - - - : - - - -
-
- The time must be in HH24:MM:SS format. -
-
-
- - -
-
- - -
-
-
-
- Frequency Details
-
-
- - + +
-
-
- -
- -
- The day must be between 1 and 31. -
-
-
-
- -
-
- - -
-
-
-
- * - -
-
- - -
-
- The day must be between 1 and 31. -
-
-
-
- -
-
- - - -
-
-
- -
-
- - - - - - - -
-
-
- Please select one or more days. -
-
-
- -
- -
-
-
- - -
- Please provide a value between 1 and 999. -
-
-
- -
- - - - -
-
- Please provide a valid date. -
-
+ + +
-
+
+ Please provide a valid date.
- - - - - - -
-

- The scheduler options are invalid or incomplete. -

-
-
+
+
+ +
+

+ The scheduler options are invalid or incomplete. +

+
+
+ +
+ {{ rrule_nlp_description }} +
+
+ +
+ -
- {{ rrule_nlp_description }} -
-
- -
- - - -
-
-
    -
  • - {{ occurrence.utc }} -
  • -
-
    -
  • - {{ occurrence.local }} -
  • -
+ + +
+
+
    +
  • + {{ occurrence.utc }} +
  • +
+
    +
  • + {{ occurrence.local }} +
  • +
+ +
+
+ +
+ +
+
+
+
+ + +
diff --git a/awx/ui/client/src/search/tagSearch.controller.js b/awx/ui/client/src/search/tagSearch.controller.js index 8edcfdce12..21121a648a 100644 --- a/awx/ui/client/src/search/tagSearch.controller.js +++ b/awx/ui/client/src/search/tagSearch.controller.js @@ -2,7 +2,8 @@ export default ['$scope', 'Refresh', 'tagSearchService', function($scope, Refresh, tagSearchService) { // JSONify passed field elements that can be searched $scope.list = JSON.parse($scope.list); - + // Access config lines from list spec + $scope.listConfig = $scope.$parent.list; // Grab options for the left-dropdown of the searchbar tagSearchService.getSearchTypes($scope.list, $scope.endpoint) .then(function(searchTypes) { diff --git a/awx/ui/client/src/search/tagSearch.partial.html b/awx/ui/client/src/search/tagSearch.partial.html index de379cf3d9..5609adc229 100644 --- a/awx/ui/client/src/search/tagSearch.partial.html +++ b/awx/ui/client/src/search/tagSearch.partial.html @@ -1,5 +1,5 @@
-
+
For facts collected older than the time period specified, save one fact scan (snapshot) per time window (frequency). For example, facts older than 30 days are purged, while one - weekly fact scan is kept.
- Caution: Setting both numerical variables to "0" will delete all facts.
+ weekly fact scan is kept.

+ + CAUTION: Setting both numerical variables to "0" will delete all facts.

-
+