diff --git a/awx/ui/client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js b/awx/ui/client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js new file mode 100644 index 0000000000..8970ef8bc0 --- /dev/null +++ b/awx/ui/client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js @@ -0,0 +1,59 @@ +import { N_ } from '../../../src/i18n'; +import jobsListController from '../jobsList.controller'; + +const jobsListTemplate = require('~features/jobs/jobsList.view.html'); + +export default { + url: '/completed_jobs', + name: 'templates.editWorkflowJobTemplate.completed_jobs', + params: { + job_search: { + value: { + page_size: '20', + workflow_job__workflow_job_template: '', + order_by: '-id' + }, + dynamic: true, + squash: '' + } + }, + ncyBreadcrumb: { + label: N_('COMPLETED JOBS') + }, + views: { + related: { + templateUrl: jobsListTemplate, + controller: jobsListController, + controllerAs: 'vm' + } + }, + resolve: { + resolvedModels: [ + 'UnifiedJobModel', + (UnifiedJob) => { + const models = [ + new UnifiedJob(['options']), + ]; + return Promise.all(models); + }, + ], + Dataset: [ + '$stateParams', + 'Wait', + 'GetBasePath', + 'QuerySet', + ($stateParams, Wait, GetBasePath, qs) => { + const templateId = $stateParams.workflow_job_template_id; + + const searchParam = _.assign($stateParams + .job_search, { workflow_job__workflow_job_template: templateId }); + + const searchPath = GetBasePath('unified_jobs'); + + Wait('start'); + return qs.search(searchPath, searchParam) + .finally(() => Wait('stop')); + } + ] + } +}; diff --git a/awx/ui/client/src/templates/main.js b/awx/ui/client/src/templates/main.js index 5a77520a5c..ac0c5036a0 100644 --- a/awx/ui/client/src/templates/main.js +++ b/awx/ui/client/src/templates/main.js @@ -20,6 +20,7 @@ import InventorySourcesList from './inventory-sources.list'; import TemplateList from './templates.list'; import listRoute from '~features/templates/routes/templatesList.route.js'; import templateCompletedJobsRoute from '~features/jobs/routes/templateCompletedJobs.route.js'; +import workflowJobTemplateCompletedJobsRoute from '~features/jobs/routes/workflowJobTemplateCompletedJobs.route.js'; export default angular.module('templates', [surveyMaker.name, jobTemplates.name, labels.name, prompt.name, workflowAdd.name, workflowEdit.name, @@ -746,6 +747,7 @@ angular.module('templates', [surveyMaker.name, jobTemplates.name, labels.name, p }, [ stateExtender.buildDefinition(listRoute), stateExtender.buildDefinition(templateCompletedJobsRoute), + stateExtender.buildDefinition(workflowJobTemplateCompletedJobsRoute), stateExtender.buildDefinition(workflowMaker) ]) }; diff --git a/awx/ui/client/src/templates/workflows.form.js b/awx/ui/client/src/templates/workflows.form.js index 33c9568eef..5812ed7435 100644 --- a/awx/ui/client/src/templates/workflows.form.js +++ b/awx/ui/client/src/templates/workflows.form.js @@ -176,6 +176,11 @@ export default ['NotificationsList', 'i18n', function(NotificationsList, i18n) { }, "notifications": { include: "NotificationsList" + }, + "completed_jobs": { + title: i18n._('Completed Jobs'), + skipGenerator: true, + ngClick: "$state.go('templates.editWorkflowJobTemplate.completed_jobs')" } },