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 @@
Jobs
-
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) {