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;
$scope.criteria = defaultCriteria || [];
$scope.searchForCriteria =
Criteria.buildCriteriaSearch(resourceTypes);
Criteria.buildCriteriaSearch(resourceTypes, 5);
};
/**

View File

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

View File

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

View File

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

View File

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