Fixes routing to scheduled jobs view (#4280)

* Issue #4267

* Fixes routing issues to upcoming scheduled jobs view
* Fixes edit schedule routing from scheduled jobs list view

* re-enable jobDetails route, match jobDetais route only when url is /jobs/integer/
This commit is contained in:
Leigh Johnson
2016-12-12 14:51:09 -05:00
committed by GitHub
parent 824fb21b3f
commit e895c0989a
5 changed files with 84 additions and 12 deletions

View File

@@ -83,7 +83,7 @@ angular.module('inventory', [
mode: 'edit' mode: 'edit'
}); });
html = generateList.wrapPanel(html); html = generateList.wrapPanel(html);
return html; return generateList.insertFormView() + html;
}, },
controller: 'schedulerListController' controller: 'schedulerListController'
} }

View File

@@ -31,7 +31,7 @@ export default
name: { name: {
key: true, key: true,
label: 'Name', label: 'Name',
ngClick: "editSchedule(schedule.id)", ngClick: "editSchedule(schedule)",
columnClass: "col-md-3 col-sm-3 col-xs-6" columnClass: "col-md-3 col-sm-3 col-xs-6"
}, },
dtstart: { dtstart: {
@@ -73,7 +73,7 @@ export default
fieldActions: { fieldActions: {
edit: { edit: {
label: 'Edit', label: 'Edit',
ngClick: "editSchedule(schedule.id)", ngClick: "editSchedule(schedule)",
icon: 'icon-edit', icon: 'icon-edit',
awToolTip: 'Edit schedule', awToolTip: 'Edit schedule',
dataPlacement: 'top', dataPlacement: 'top',
@@ -81,7 +81,7 @@ export default
}, },
view: { view: {
label: 'View', label: 'View',
ngClick: "editSchedule(schedule.id)", ngClick: "editSchedule(schedule)",
awToolTip: 'View schedule', awToolTip: 'View schedule',
dataPlacement: 'top', dataPlacement: 'top',
ngShow: '!schedule.summary_fields.user_capabilities.edit' ngShow: '!schedule.summary_fields.user_capabilities.edit'

View File

@@ -6,7 +6,7 @@
<div class="Form-tab" id="active_jobs_link" ng-class="{'is-selected': $state.is('jobs')}" ng-click="$state.go('jobs')"> <div class="Form-tab" id="active_jobs_link" ng-class="{'is-selected': $state.is('jobs')}" ng-click="$state.go('jobs')">
<translate>Jobs</translate> <translate>Jobs</translate>
</div> </div>
<div id="scheduled_jobs_link" class="Form-tab" ng-class="{'is-selected': $state.is('jobs.scheduled')}" ng-click="$state.go('.scheduled')"> <div id="scheduled_jobs_link" class="Form-tab" ng-class="{'is-selected': $state.is('jobs.schedules')}" ng-click="$state.go('.schedules')">
<translate>Schedules</translate> <translate>Schedules</translate>
</div> </div>
</div> </div>

View File

@@ -238,13 +238,13 @@ export default
// upcoming scheduled jobs // upcoming scheduled jobs
$stateExtender.addState({ $stateExtender.addState({
searchPrefix: 'schedule', searchPrefix: 'schedule',
name: 'jobs.scheduled', name: 'jobs.schedules',
route: '/scheduled', route: '/schedules',
params: { params: {
schedule_search: { schedule_search: {
value: { value: {
next_run__isnull: 'false', next_run__isnull: 'false',
order_by: 'next_run' order_by: 'unified_job_template__polymorphic_ctype__model'
} }
} }
}, },
@@ -258,13 +258,16 @@ export default
label: 'SCHEDULED' label: 'SCHEDULED'
}, },
resolve: { resolve: {
SchedulesList: ['ScheduledJobsList', function(list){
return list;
}],
Dataset: ['SchedulesList', 'QuerySet', '$stateParams', 'GetBasePath', Dataset: ['SchedulesList', 'QuerySet', '$stateParams', 'GetBasePath',
function(list, qs, $stateParams, GetBasePath) { function(list, qs, $stateParams, GetBasePath) {
let path = GetBasePath('schedules'); let path = GetBasePath('schedules');
return qs.search(path, $stateParams[`${list.iterator}_search`]); return qs.search(path, $stateParams[`${list.iterator}_search`]);
} }
], ],
ParentObject: [() =>{return null;}] ParentObject: [() =>{return {endpoint:'/api/v1/schedules'}; }],
}, },
views: { views: {
'list@jobs': { 'list@jobs': {

View File

@@ -31,7 +31,7 @@ export default [
function init() { function init() {
if (ParentObject){ if (ParentObject){
$scope.parentObject = 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; $scope.canAdd = false;
rbacUiControlService.canAdd(scheduleEndpoint) rbacUiControlService.canAdd(scheduleEndpoint)
.then(function(canAdd) { .then(function(canAdd) {
@@ -67,8 +67,77 @@ export default [
$state.go('.add'); $state.go('.add');
}; };
$scope.editSchedule = function(schedule_id) { $scope.editSchedule = function(schedule) {
$state.go('.edit', { schedule_id: schedule_id }); 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) { $scope.toggleSchedule = function(event, id) {