diff --git a/awx/ui/client/src/inventories/main.js b/awx/ui/client/src/inventories/main.js index 191bfbb17c..aa2b450332 100644 --- a/awx/ui/client/src/inventories/main.js +++ b/awx/ui/client/src/inventories/main.js @@ -83,7 +83,7 @@ angular.module('inventory', [ mode: 'edit' }); html = generateList.wrapPanel(html); - return html; + return generateList.insertFormView() + html; }, controller: 'schedulerListController' } diff --git a/awx/ui/client/src/lists/Schedules.js b/awx/ui/client/src/lists/Schedules.js index 30d0ceb4e5..fbf03f5678 100644 --- a/awx/ui/client/src/lists/Schedules.js +++ b/awx/ui/client/src/lists/Schedules.js @@ -31,7 +31,7 @@ export default name: { key: true, label: 'Name', - ngClick: "editSchedule(schedule.id)", + ngClick: "editSchedule(schedule)", columnClass: "col-md-3 col-sm-3 col-xs-6" }, dtstart: { @@ -73,7 +73,7 @@ export default fieldActions: { edit: { label: 'Edit', - ngClick: "editSchedule(schedule.id)", + ngClick: "editSchedule(schedule)", icon: 'icon-edit', awToolTip: 'Edit schedule', dataPlacement: 'top', @@ -81,7 +81,7 @@ export default }, view: { label: 'View', - ngClick: "editSchedule(schedule.id)", + ngClick: "editSchedule(schedule)", awToolTip: 'View schedule', dataPlacement: 'top', ngShow: '!schedule.summary_fields.user_capabilities.edit' diff --git a/awx/ui/client/src/partials/jobs.html b/awx/ui/client/src/partials/jobs.html index 1477b87ab7..00de9af821 100644 --- a/awx/ui/client/src/partials/jobs.html +++ b/awx/ui/client/src/partials/jobs.html @@ -6,7 +6,7 @@ - diff --git a/awx/ui/client/src/scheduler/main.js b/awx/ui/client/src/scheduler/main.js index 3acd6a4d79..840197d944 100644 --- a/awx/ui/client/src/scheduler/main.js +++ b/awx/ui/client/src/scheduler/main.js @@ -238,13 +238,13 @@ export default // upcoming scheduled jobs $stateExtender.addState({ searchPrefix: 'schedule', - name: 'jobs.scheduled', - route: '/scheduled', + name: 'jobs.schedules', + route: '/schedules', params: { schedule_search: { value: { next_run__isnull: 'false', - order_by: 'next_run' + order_by: 'unified_job_template__polymorphic_ctype__model' } } }, @@ -258,13 +258,16 @@ export default label: 'SCHEDULED' }, resolve: { + SchedulesList: ['ScheduledJobsList', function(list){ + return list; + }], Dataset: ['SchedulesList', 'QuerySet', '$stateParams', 'GetBasePath', function(list, qs, $stateParams, GetBasePath) { let path = GetBasePath('schedules'); return qs.search(path, $stateParams[`${list.iterator}_search`]); } ], - ParentObject: [() =>{return null;}] + ParentObject: [() =>{return {endpoint:'/api/v1/schedules'}; }], }, views: { 'list@jobs': { diff --git a/awx/ui/client/src/scheduler/schedulerList.controller.js b/awx/ui/client/src/scheduler/schedulerList.controller.js index b532c6d6dd..e003ea1fd2 100644 --- a/awx/ui/client/src/scheduler/schedulerList.controller.js +++ b/awx/ui/client/src/scheduler/schedulerList.controller.js @@ -31,7 +31,7 @@ export default [ function init() { if (ParentObject){ $scope.parentObject = ParentObject; - scheduleEndpoint = ParentObject.related.schedules || `${ParentObject.related.inventory_source}schedules`; + scheduleEndpoint = ParentObject.endpoint|| ParentObject.related.schedules || `${ParentObject.related.inventory_source}schedules`; $scope.canAdd = false; rbacUiControlService.canAdd(scheduleEndpoint) .then(function(canAdd) { @@ -67,8 +67,77 @@ export default [ $state.go('.add'); }; - $scope.editSchedule = function(schedule_id) { - $state.go('.edit', { schedule_id: schedule_id }); + $scope.editSchedule = function(schedule) { + if ($state.is('jobs.schedules')){ + routeToScheduleForm(schedule, 'edit'); + } + else { + $state.go('.edit', { schedule_id: schedule.id }); + } + + function buildStateMap(schedule){ + + let deferred = $q.defer(); + + switch(schedule.summary_fields.unified_job_template.unified_job_type){ + case 'inventory_update': + Rest.setUrl(schedule.related.unified_job_template); + Rest.get().then( (res) => { + deferred.resolve({ + name: 'inventoryManage.editGroup.schedules.edit', + params: { + group_id: res.data.group, + inventory_id: res.data.inventory, + schedule_id: schedule.id, + } + }); + }); + break; + + case 'project_update': + deferred.resolve({ + name: 'projectSchedules.edit', + params: { + id: schedule.unified_job_template, + schedule_id: schedule.id + } + }); + break; + + case 'system_job': + deferred.resolve({ + name: 'managementJobSchedules.edit', + params: { + id: schedule.unified_job_template, + schedule_id: schedule.id + } + }); + break; + } + + return deferred.promise; + } + + function routeToScheduleForm(schedule){ + + buildStateMap(schedule).then( (state) =>{ + $state.go(state.name, state.params).catch((err) =>{ + // stateDefinition.lazyLoad'd state name matcher is not configured to match inventoryManage.* state names + // However, the stateDefinition.lazyLoad url matcher will load the correct tree. + // Expected error: + // Transition rejection error + // type: 4 // SUPERSEDED = 2, ABORTED = 3, INVALID = 4, IGNORED = 5, ERROR = 6 + // detail : "Could not resolve 'inventoryManage.editGroup.schedules.edit' from state 'jobs.schedules'" + // message: "This transition is invalid" + if (err.type === 4 && err.detail.includes('inventoryManage.editGroup.schedules.edit')){ + $location.path(`/inventories/${state.params.inventory_id}/manage/edit-group/${state.params.group_id}/schedules/${state.params.schedule_id}`); + } + else { + throw err; + } + }); + }); + } }; $scope.toggleSchedule = function(event, id) {