Merge pull request #5142 from mabashian/5042-fix-schedule-search-sorting

Fixed schedule sorting/search/pagination
This commit is contained in:
Michael Abashian
2017-02-06 10:26:26 -05:00
committed by GitHub
7 changed files with 100 additions and 54 deletions

View File

@@ -55,11 +55,11 @@ angular.module('inventory', [
url: '/schedules', url: '/schedules',
searchPrefix: 'schedule', searchPrefix: 'schedule',
ncyBreadcrumb: { ncyBreadcrumb: {
parent: 'inventoryManage.editGroup({group_id: parentObject.id})', parent: 'inventoryManage({group_id: parentObject.id})',
label: N_('SCHEDULES') label: N_('SCHEDULES')
}, },
resolve: { resolve: {
Dataset: ['SchedulesList', 'QuerySet', '$stateParams', 'GetBasePath', 'groupData', Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath', 'groupData',
function(list, qs, $stateParams, GetBasePath, groupData) { function(list, qs, $stateParams, GetBasePath, groupData) {
let path = `${groupData.related.inventory_source}schedules`; let path = `${groupData.related.inventory_source}schedules`;
return qs.search(path, $stateParams[`${list.iterator}_search`]); return qs.search(path, $stateParams[`${list.iterator}_search`]);
@@ -79,7 +79,14 @@ angular.module('inventory', [
val.reject(data); val.reject(data);
}); });
return val.promise; return val.promise;
}] }],
ScheduleList: ['SchedulesList', 'groupData',
(SchedulesList, groupData) => {
let list = _.cloneDeep(SchedulesList);
list.basePath = `${groupData.related.inventory_source}schedules`;
return list;
}
]
}, },
views: { views: {
// clear form template when views render in this substate // clear form template when views render in this substate
@@ -88,11 +95,11 @@ angular.module('inventory', [
}, },
// target the un-named ui-view @ root level // target the un-named ui-view @ root level
'@': { '@': {
templateProvider: function(SchedulesList, generateList, ParentObject) { templateProvider: function(ScheduleList, generateList, ParentObject) {
// include name of parent resource in listTitle // include name of parent resource in listTitle
SchedulesList.listTitle = `${ParentObject.name}<div class='List-titleLockup'></div>` + N_('Schedules'); ScheduleList.listTitle = `${ParentObject.name}<div class='List-titleLockup'></div>` + N_('Schedules');
let html = generateList.build({ let html = generateList.build({
list: SchedulesList, list: ScheduleList,
mode: 'edit' mode: 'edit'
}); });
html = generateList.wrapPanel(html); html = generateList.wrapPanel(html);

View File

@@ -27,11 +27,11 @@ angular.module('managementJobScheduler', [])
}, },
views: { views: {
'@': { '@': {
templateProvider: function(SchedulesList, generateList, ParentObject) { templateProvider: function(ScheduleList, generateList, ParentObject) {
// include name of parent resource in listTitle // include name of parent resource in listTitle
SchedulesList.listTitle = `${ParentObject.name}<div class='List-titleLockup'></div>` + N_('Schedules'); ScheduleList.listTitle = `${ParentObject.name}<div class='List-titleLockup'></div>` + N_('Schedules');
let html = generateList.build({ let html = generateList.build({
list: SchedulesList, list: ScheduleList,
mode: 'edit' mode: 'edit'
}); });
html = generateList.wrapPanel(html); html = generateList.wrapPanel(html);
@@ -41,7 +41,7 @@ angular.module('managementJobScheduler', [])
} }
}, },
resolve: { resolve: {
Dataset: ['SchedulesList', 'QuerySet', '$stateParams', 'GetBasePath', Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath',
function(list, qs, $stateParams, GetBasePath) { function(list, qs, $stateParams, GetBasePath) {
let path = `${GetBasePath('system_job_templates')}${$stateParams.id}/schedules`; let path = `${GetBasePath('system_job_templates')}${$stateParams.id}/schedules`;
return qs.search(path, $stateParams[`${list.iterator}_search`]); return qs.search(path, $stateParams[`${list.iterator}_search`]);
@@ -63,7 +63,14 @@ angular.module('managementJobScheduler', [])
val.reject(data); val.reject(data);
}); });
return val.promise; return val.promise;
}] }],
ScheduleList: ['SchedulesList', 'GetBasePath', '$stateParams',
(SchedulesList, GetBasePath, $stateParams) => {
let list = _.cloneDeep(SchedulesList);
list.basePath = GetBasePath('system_job_templates') + $stateParams.id + '/schedules';
return list;
}
]
} }
}); });
$stateExtender.addState({ $stateExtender.addState({

View File

@@ -36,7 +36,7 @@ export default
label: N_('SCHEDULES') label: N_('SCHEDULES')
}, },
resolve: { resolve: {
Dataset: ['SchedulesList', 'QuerySet', '$stateParams', 'GetBasePath', Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath',
function(list, qs, $stateParams, GetBasePath) { function(list, qs, $stateParams, GetBasePath) {
let path = `${GetBasePath('job_templates')}${$stateParams.id}/schedules`; let path = `${GetBasePath('job_templates')}${$stateParams.id}/schedules`;
return qs.search(path, $stateParams[`${list.iterator}_search`]); return qs.search(path, $stateParams[`${list.iterator}_search`]);
@@ -58,15 +58,22 @@ export default
val.reject(data); val.reject(data);
}); });
return val.promise; return val.promise;
}] }],
ScheduleList: ['SchedulesList', 'GetBasePath', '$stateParams',
(SchedulesList, GetBasePath, $stateParams) => {
let list = _.cloneDeep(SchedulesList);
list.basePath = GetBasePath('job_templates') + $stateParams.id + '/schedules/';
return list;
}
]
}, },
views: { views: {
'@': { '@': {
templateProvider: function(SchedulesList, generateList, ParentObject){ templateProvider: function(ScheduleList, generateList, ParentObject){
// include name of parent resource in listTitle // include name of parent resource in listTitle
SchedulesList.listTitle = `${ParentObject.name}<div class='List-titleLockup'></div>` + N_('Schedules'); ScheduleList.listTitle = `${ParentObject.name}<div class='List-titleLockup'></div>` + N_('Schedules');
let html = generateList.build({ let html = generateList.build({
list: SchedulesList, list: ScheduleList,
mode: 'edit' mode: 'edit'
}); });
html = generateList.wrapPanel(html); html = generateList.wrapPanel(html);
@@ -122,7 +129,7 @@ export default
label: N_('SCHEDULES') label: N_('SCHEDULES')
}, },
resolve: { resolve: {
Dataset: ['SchedulesList', 'QuerySet', '$stateParams', 'GetBasePath', Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath',
function(list, qs, $stateParams, GetBasePath) { function(list, qs, $stateParams, GetBasePath) {
let path = `${GetBasePath('workflow_job_templates')}${$stateParams.id}/schedules`; let path = `${GetBasePath('workflow_job_templates')}${$stateParams.id}/schedules`;
return qs.search(path, $stateParams[`${list.iterator}_search`]); return qs.search(path, $stateParams[`${list.iterator}_search`]);
@@ -144,15 +151,22 @@ export default
val.reject(data); val.reject(data);
}); });
return val.promise; return val.promise;
}] }],
ScheduleList: ['SchedulesList', 'GetBasePath', '$stateParams',
(SchedulesList, GetBasePath, $stateParams) => {
let list = _.cloneDeep(SchedulesList);
list.basePath = GetBasePath('workflow_job_templates') + $stateParams.id + '/schedules/';
return list;
}
]
}, },
views: { views: {
'@': { '@': {
templateProvider: function(SchedulesList, generateList, ParentObject){ templateProvider: function(ScheduleList, generateList, ParentObject){
// include name of parent resource in listTitle // include name of parent resource in listTitle
SchedulesList.listTitle = `${ParentObject.name}<div class='List-titleLockup'></div>` + N_('Schedules'); ScheduleList.listTitle = `${ParentObject.name}<div class='List-titleLockup'></div>` + N_('Schedules');
let html = generateList.build({ let html = generateList.build({
list: SchedulesList, list: ScheduleList,
mode: 'edit' mode: 'edit'
}); });
html = generateList.wrapPanel(html); html = generateList.wrapPanel(html);
@@ -205,7 +219,7 @@ export default
label: N_('SCHEDULES') label: N_('SCHEDULES')
}, },
resolve: { resolve: {
Dataset: ['SchedulesList', 'QuerySet', '$stateParams', 'GetBasePath', Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath',
function(list, qs, $stateParams, GetBasePath) { function(list, qs, $stateParams, GetBasePath) {
let path = `${GetBasePath('projects')}${$stateParams.id}/schedules`; let path = `${GetBasePath('projects')}${$stateParams.id}/schedules`;
return qs.search(path, $stateParams[`${list.iterator}_search`]); return qs.search(path, $stateParams[`${list.iterator}_search`]);
@@ -227,15 +241,22 @@ export default
val.reject(data); val.reject(data);
}); });
return val.promise; return val.promise;
}] }],
ScheduleList: ['SchedulesList', 'GetBasePath', '$stateParams',
(SchedulesList, GetBasePath, $stateParams) => {
let list = _.cloneDeep(SchedulesList);
list.basePath = GetBasePath('projects') + $stateParams.id + '/schedules/';
return list;
}
]
}, },
views: { views: {
'@': { '@': {
templateProvider: function(SchedulesList, generateList, ParentObject){ templateProvider: function(ScheduleList, generateList, ParentObject){
// include name of parent resource in listTitle // include name of parent resource in listTitle
SchedulesList.listTitle = `${ParentObject.name}<div class='List-titleLockup'></div>` + N_('Schedules'); ScheduleList.listTitle = `${ParentObject.name}<div class='List-titleLockup'></div>` + N_('Schedules');
let html = generateList.build({ let html = generateList.build({
list: SchedulesList, list: ScheduleList,
mode: 'edit' mode: 'edit'
}); });
html = generateList.wrapPanel(html); html = generateList.wrapPanel(html);
@@ -293,10 +314,10 @@ export default
label: N_('SCHEDULED') label: N_('SCHEDULED')
}, },
resolve: { resolve: {
SchedulesList: ['ScheduledJobsList', function(list){ ScheduleList: ['ScheduledJobsList', function(list){
return list; return list;
}], }],
Dataset: ['SchedulesList', 'QuerySet', '$stateParams', 'GetBasePath', Dataset: ['ScheduleList', '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`]);
@@ -318,9 +339,9 @@ export default
}, },
views: { views: {
'list@jobs': { 'list@jobs': {
templateProvider: function(SchedulesList, generateList){ templateProvider: function(ScheduleList, generateList){
let html = generateList.build({ let html = generateList.build({
list: SchedulesList, list: ScheduleList,
mode: 'edit', mode: 'edit',
title: false title: false
}); });

View File

@@ -12,11 +12,11 @@
export default [ export default [
'$scope', '$compile', '$location', '$stateParams', 'SchedulesList', 'Rest', '$scope', '$compile', '$location', '$stateParams', 'ScheduleList', 'Rest',
'ProcessErrors', 'ReturnToCaller', 'ClearScope', 'GetBasePath', 'Wait', 'rbacUiControlService', 'ProcessErrors', 'ReturnToCaller', 'ClearScope', 'GetBasePath', 'Wait', 'rbacUiControlService',
'Find', 'ToggleSchedule', 'DeleteSchedule', 'GetChoices', '$q', '$state', 'Dataset', 'ParentObject', 'UnifiedJobsOptions', 'Find', 'ToggleSchedule', 'DeleteSchedule', 'GetChoices', '$q', '$state', 'Dataset', 'ParentObject', 'UnifiedJobsOptions',
function($scope, $compile, $location, $stateParams, function($scope, $compile, $location, $stateParams,
SchedulesList, Rest, ProcessErrors, ReturnToCaller, ClearScope, ScheduleList, Rest, ProcessErrors, ReturnToCaller, ClearScope,
GetBasePath, Wait, rbacUiControlService, Find, GetBasePath, Wait, rbacUiControlService, Find,
ToggleSchedule, DeleteSchedule, GetChoices, ToggleSchedule, DeleteSchedule, GetChoices,
$q, $state, Dataset, ParentObject, UnifiedJobsOptions) { $q, $state, Dataset, ParentObject, UnifiedJobsOptions) {
@@ -24,7 +24,7 @@ export default [
ClearScope(); ClearScope();
var base, scheduleEndpoint, var base, scheduleEndpoint,
list = SchedulesList; list = ScheduleList;
init(); init();

View File

@@ -1,5 +1,5 @@
export default ['$scope', '$state', 'QuerySet', 'GetBasePath', export default ['$scope', '$state', 'QuerySet', 'GetBasePath', '$stateParams', '$interpolate',
function($scope, $state, qs, GetBasePath) { function($scope, $state, qs, GetBasePath, $stateParams, $interpolate) {
let queryset, path; let queryset, path;
@@ -52,7 +52,12 @@ export default ['$scope', '$state', 'QuerySet', 'GetBasePath',
else { else {
queryset = _.merge($state.params[`${$scope.columnIterator}_search`], { order_by: order_by }); queryset = _.merge($state.params[`${$scope.columnIterator}_search`], { order_by: order_by });
} }
path = GetBasePath($scope.basePath) || $scope.basePath; if (GetBasePath($scope.basePath) || $scope.basePath) {
path = GetBasePath($scope.basePath) || $scope.basePath;
} else {
let interpolator = $interpolate($scope.basePath);
path = interpolator({ $stateParams: $stateParams });
}
if(!$scope.querySet) { if(!$scope.querySet) {
$state.go('.', { [$scope.columnIterator + '_search']: queryset }, {notify: false}); $state.go('.', { [$scope.columnIterator + '_search']: queryset }, {notify: false});
} }

View File

@@ -1,5 +1,5 @@
export default ['$scope', '$stateParams', '$state', '$filter', 'GetBasePath', 'QuerySet', export default ['$scope', '$stateParams', '$state', '$filter', 'GetBasePath', 'QuerySet', '$interpolate',
function($scope, $stateParams, $state, $filter, GetBasePath, qs) { function($scope, $stateParams, $state, $filter, GetBasePath, qs, $interpolate) {
let pageSize, let pageSize,
queryset, path; queryset, path;
@@ -27,7 +27,12 @@ export default ['$scope', '$stateParams', '$state', '$filter', 'GetBasePath', 'Q
if(page === 0) { if(page === 0) {
return; return;
} }
path = GetBasePath($scope.basePath) || $scope.basePath; if (GetBasePath($scope.basePath) || $scope.basePath) {
path = GetBasePath($scope.basePath) || $scope.basePath;
} else {
let interpolator = $interpolate($scope.basePath);
path = interpolator({ $stateParams: $stateParams });
}
if($scope.querySet) { if($scope.querySet) {
// merging $scope.querySet seems to destroy our initial reference which // merging $scope.querySet seems to destroy our initial reference which
// kills the two-way binding here. To fix that, clone the queryset first // kills the two-way binding here. To fix that, clone the queryset first

View File

@@ -38,16 +38,17 @@ describe('Directive: column-sort', () =>{
go: jasmine.createSpy('go') go: jasmine.createSpy('go')
}; };
this.$stateParams = {};
angular.mock.module('ColumnSortModule', ($provide) =>{ angular.mock.module('ColumnSortModule', ($provide) =>{
QuerySet = jasmine.createSpyObj('qs', ['search']);
QuerySet = jasmine.createSpyObj('qs', ['search']); QuerySet.search.and.callFake(() => { return { then: function(){} }; });
QuerySet.search.and.callFake(() => { return { then: function(){} } }); GetBasePath = jasmine.createSpy('GetBasePath');
GetBasePath = jasmine.createSpy('GetBasePath'); $provide.value('QuerySet', QuerySet);
$provide.value('QuerySet', QuerySet); $provide.value('GetBasePath', GetBasePath);
$provide.value('GetBasePath', GetBasePath); $provide.value('$state', this.$state);
$provide.value('$state', this.$state); $provide.value('$stateParams', this.$stateParams);
}); });
}); });
@@ -67,7 +68,7 @@ describe('Directive: column-sort', () =>{
}; };
$compile(this.name_field)($scope); $compile(this.name_field)($scope);
$compile(this.idx_field)($scope) $compile(this.idx_field)($scope);
$scope.$digest(); $scope.$digest();
expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true); expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true);
@@ -81,7 +82,7 @@ describe('Directive: column-sort', () =>{
}; };
$compile(this.name_field)($scope); $compile(this.name_field)($scope);
$compile(this.idx_field)($scope) $compile(this.idx_field)($scope);
$scope.$digest(); $scope.$digest();
@@ -95,7 +96,7 @@ describe('Directive: column-sort', () =>{
$(this.idx_field).click(); $(this.idx_field).click();
expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true);
expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort-down') ).toEqual(true) expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort-down') ).toEqual(true);
}); });
}); });