Added pagesize to browse service.

The default page size of 500 is causing a bit of a slowdown
on storyboard.o.o when using the typeahead in search and
quicknav. This patch applies a few changes to the Criteria and the
ResourceFactory as follows:

- Default pagesize for criteria searches is now Preference.page_size.
- PageSize can be overridden in the actual invocation of the
criteria resolver and/or the search builder.
- SearchResults have been fixed to use the user's preference setting
instead of a hardcoded 20.
- List population for the typeahead dropdowns has been hardcoded to
no more than 5 records per type, since the speed of a user's typing
tends to alter the result set very quickly.

Change-Id: I12c4fa8d62e0510ebd2287a709d93d6f922fdfcd
Story: 131
This commit is contained in:
Michael Krotscheck
2014-07-24 11:09:59 -07:00
parent 1c85800f88
commit ed9dcd6b4f
5 changed files with 41 additions and 32 deletions

View File

@@ -48,7 +48,7 @@ angular.module('sb.search').controller('SearchCriteriaController',
resourceTypes = types || resourceTypes; resourceTypes = types || resourceTypes;
$scope.criteria = defaultCriteria || []; $scope.criteria = defaultCriteria || [];
$scope.searchForCriteria = $scope.searchForCriteria =
Criteria.buildCriteriaSearch(resourceTypes); Criteria.buildCriteriaSearch(resourceTypes, 5);
}; };
/** /**

View File

@@ -20,7 +20,7 @@
* @see ProjectListController * @see ProjectListController
*/ */
angular.module('sb.search').directive('searchResults', angular.module('sb.search').directive('searchResults',
function ($log, $parse, Criteria, $injector) { function ($log, $parse, Criteria, $injector, Preference) {
'use strict'; 'use strict';
return { return {
@@ -30,7 +30,8 @@ angular.module('sb.search').directive('searchResults',
// Extract the resource type. // Extract the resource type.
var resourceName = args.searchResource; var resourceName = args.searchResource;
var pageSize = args.searchPageSize || 20; var pageSize = args.searchPageSize ||
Preference.get('page_size');
var searchWithoutCriteria = var searchWithoutCriteria =
args.searchWithoutCriteria === 'true'; args.searchWithoutCriteria === 'true';
var criteria = []; var criteria = [];

View File

@@ -19,7 +19,7 @@
* validation, filtering, criteria-to-parameter mapping, and more. * validation, filtering, criteria-to-parameter mapping, and more.
*/ */
angular.module('sb.services').service('Criteria', angular.module('sb.services').service('Criteria',
function ($q, $log, $injector) { function ($q, $log, $injector, Preference) {
'use strict'; 'use strict';
return { return {
@@ -91,8 +91,12 @@ angular.module('sb.services').service('Criteria',
* customized lambda that will perform our browse search for us. * customized lambda that will perform our browse search for us.
* *
* @param types An array of resource types to browse. * @param types An array of resource types to browse.
* @param pageSize An optional page size for the criteria. Defaults
* to the global page_size preference.
*/ */
buildCriteriaSearch: function (types) { buildCriteriaSearch: function (types, pageSize) {
pageSize = pageSize || Preference.get('page_size');
var resolvers = []; var resolvers = [];
types.forEach(function (type) { types.forEach(function (type) {
// Retrieve an instance of the declared resource. // Retrieve an instance of the declared resource.
@@ -122,7 +126,7 @@ angular.module('sb.services').service('Criteria',
var promises = []; var promises = [];
resolvers.forEach(function (resolver) { resolvers.forEach(function (resolver) {
promises.push(resolver(searchString)); promises.push(resolver(searchString, pageSize));
}); });
// Wrap everything into a collective promise // Wrap everything into a collective promise

View File

@@ -21,7 +21,8 @@
*/ */
angular.module('sb.services') angular.module('sb.services')
.service('ResourceFactory', .service('ResourceFactory',
function ($q, $log, $injector, Criteria, $resource, storyboardApiBase) { function ($q, $log, $injector, Criteria, $resource, storyboardApiBase,
Preference) {
'use strict'; 'use strict';
/** /**
@@ -147,33 +148,36 @@ angular.module('sb.services')
/** /**
* Add the criteria resolver method. * Add the criteria resolver method.
*/ */
resource.criteriaResolver = function (searchString) { resource.criteriaResolver =
function (searchString, pageSize) {
pageSize = pageSize || Preference.get('page_size');
var deferred = $q.defer(); var deferred = $q.defer();
// build the query parameters. // build the query parameters.
var queryParams = {}; var queryParams = {};
queryParams[nameField] = searchString; queryParams[nameField] = searchString;
queryParams.limit = pageSize;
resource.query(queryParams, resource.query(queryParams,
function (result) { function (result) {
// Transform the results to criteria tags. // Transform the results to criteria tags.
var criteriaResults = []; var criteriaResults = [];
result.forEach(function (item) { result.forEach(function (item) {
criteriaResults.push( criteriaResults.push(
Criteria.create(resourceName, Criteria.create(resourceName,
item.id, item.id,
item[nameField]) item[nameField])
); );
}); });
deferred.resolve(criteriaResults); deferred.resolve(criteriaResults);
}, function () { }, function () {
deferred.resolve([]); deferred.resolve([]);
} }
); );
return deferred.promise; return deferred.promise;
}; };
} }

View File

@@ -96,8 +96,8 @@ angular.module('storyboard').controller('HeaderController',
searchString = searchString || ''; searchString = searchString || '';
$q.all({ $q.all({
projects: Project.criteriaResolver(searchString), projects: Project.criteriaResolver(searchString, 5),
stories: Story.criteriaResolver(searchString) stories: Story.criteriaResolver(searchString, 5)
}).then(function (results) { }).then(function (results) {
var criteria = [ var criteria = [