Fix race when browsing stories by certain fields
When navigating to a view of search results, there is a race condition where the API request for the browse happens twice, once for the criteria which don't require API calls to create useful Criteria for, and once for the full set. This commit fixes this by waiting for the required extra API calls to finish before updating the list of criteria. Change-Id: I6af2f3a7185bd32a33afbb0fcafadd218e5d3567
This commit is contained in:
parent
9a20857262
commit
786814087c
|
@ -25,11 +25,8 @@ angular.module('sb.project_group').controller('ProjectGroupListController',
|
|||
// search results must be of type "ProjectGroup"
|
||||
$scope.resourceTypes = ['ProjectGroup'];
|
||||
|
||||
// Projects have no default criteria
|
||||
$scope.defaultCriteria = [];
|
||||
|
||||
var params = $location.search();
|
||||
SearchHelper.parseParameters(params, $scope.defaultCriteria);
|
||||
$scope.defaultCriteria = SearchHelper.parseParameters(params);
|
||||
|
||||
/**
|
||||
* Create a new project-group.
|
||||
|
|
|
@ -30,11 +30,8 @@ angular.module('sb.projects').controller('ProjectListController',
|
|||
// search results must be of type "project"
|
||||
$scope.resourceTypes = ['Project'];
|
||||
|
||||
// Projects have no default criteria
|
||||
$scope.defaultCriteria = [];
|
||||
|
||||
var params = $location.search();
|
||||
SearchHelper.parseParameters(params, $scope.defaultCriteria);
|
||||
$scope.defaultCriteria = SearchHelper.parseParameters(params);
|
||||
|
||||
/**
|
||||
* Launches the add-project modal.
|
||||
|
|
|
@ -26,7 +26,8 @@ angular.module('sb.search').controller('SearchController',
|
|||
*
|
||||
* @type {Array}
|
||||
*/
|
||||
$scope.defaultCriteria = [];
|
||||
var params = $location.search();
|
||||
$scope.defaultCriteria = SearchHelper.parseParameters(params);
|
||||
|
||||
/**
|
||||
* List of resource types which this view will be searching on.
|
||||
|
@ -35,11 +36,5 @@ angular.module('sb.search').controller('SearchController',
|
|||
*/
|
||||
$scope.resourceTypes = ['TaskStatus', 'Story', 'Project', 'User',
|
||||
'Task', 'ProjectGroup', 'Board', 'Worklist'];
|
||||
|
||||
/**
|
||||
* If a 'q' exists in the state params, go ahead and add it.
|
||||
*/
|
||||
var params = $location.search();
|
||||
SearchHelper.parseParameters(params, $scope.defaultCriteria);
|
||||
}
|
||||
);
|
||||
|
|
|
@ -46,7 +46,13 @@ angular.module('sb.search').controller('SearchCriteriaController',
|
|||
*/
|
||||
$scope.init = function (types, defaultCriteria) {
|
||||
resourceTypes = types || $scope.resourceTypes || resourceTypes;
|
||||
$scope.criteria = defaultCriteria || [];
|
||||
if (!!defaultCriteria) {
|
||||
defaultCriteria.then(function(criteria) {
|
||||
$scope.criteria = criteria;
|
||||
});
|
||||
} else {
|
||||
$scope.criteria = [];
|
||||
}
|
||||
$scope.searchForCriteria =
|
||||
Criteria.buildCriteriaSearch(resourceTypes, 5);
|
||||
};
|
||||
|
|
|
@ -19,13 +19,16 @@
|
|||
* A service providing helper functions for search views.
|
||||
*/
|
||||
angular.module('sb.search').factory('SearchHelper',
|
||||
function(User, Project, ProjectGroup, Story, Task, Criteria, $filter) {
|
||||
function(User, Project, ProjectGroup, Story, Task, Criteria,
|
||||
$filter, $q) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Create search criteria based on some given parameters.
|
||||
*/
|
||||
function parseParameters(params, criteria) {
|
||||
function parseParameters(params) {
|
||||
var criteria = [];
|
||||
var promises = [];
|
||||
if (params.q) {
|
||||
criteria.push(
|
||||
Criteria.create('Text', params.q)
|
||||
|
@ -57,8 +60,10 @@ angular.module('sb.search').factory('SearchHelper',
|
|||
}
|
||||
if (params.assignee_id || params.creator_id) {
|
||||
var id = params.assignee_id || params.creator_id;
|
||||
User.get({'id': id}).$promise
|
||||
.then(function(result) {
|
||||
var userPromise = User.get({'id': id}).$promise;
|
||||
promises.push(userPromise);
|
||||
|
||||
userPromise.then(function(result) {
|
||||
criteria.push(
|
||||
Criteria.create('User',
|
||||
params.assignee_id,
|
||||
|
@ -68,8 +73,11 @@ angular.module('sb.search').factory('SearchHelper',
|
|||
);
|
||||
}
|
||||
if (params.project_id) {
|
||||
Project.get({'id': params.project_id}).$promise
|
||||
.then(function(result) {
|
||||
var projectParams = {'id': params.project_id};
|
||||
var projectPromise = Project.get(projectParams).$promise;
|
||||
promises.push(projectPromise);
|
||||
|
||||
projectPromise.then(function(result) {
|
||||
criteria.push(
|
||||
Criteria.create('Project',
|
||||
params.project_id,
|
||||
|
@ -79,8 +87,11 @@ angular.module('sb.search').factory('SearchHelper',
|
|||
);
|
||||
}
|
||||
if (params.project_group_id) {
|
||||
ProjectGroup.get({'id': params.project_group_id}).$promise
|
||||
.then(function(result) {
|
||||
var groupParams = {'id': params.project_group_id};
|
||||
var groupPromise = ProjectGroup.get(groupParams).$promise;
|
||||
promises.push(groupPromise);
|
||||
|
||||
groupPromise.then(function(result) {
|
||||
criteria.push(
|
||||
Criteria.create('ProjectGroup',
|
||||
params.project_group_id,
|
||||
|
@ -90,8 +101,11 @@ angular.module('sb.search').factory('SearchHelper',
|
|||
);
|
||||
}
|
||||
if (params.story_id) {
|
||||
Story.get({'id': params.story_id}).$promise
|
||||
.then(function(result) {
|
||||
var storyParams = {'id': params.story_id};
|
||||
var storyPromise = Story.get(storyParams).$promise;
|
||||
promises.push(storyPromise);
|
||||
|
||||
storyPromise.then(function(result) {
|
||||
criteria.push(
|
||||
Criteria.create('Story',
|
||||
params.story_id,
|
||||
|
@ -101,8 +115,11 @@ angular.module('sb.search').factory('SearchHelper',
|
|||
);
|
||||
}
|
||||
if (params.task_id) {
|
||||
Task.get({'id': params.task_id}).$promise
|
||||
.then(function(result) {
|
||||
var taskParams = {'id': params.task_id};
|
||||
var taskPromise = Task.get(taskParams).$promise;
|
||||
promises.push(taskPromise);
|
||||
|
||||
taskPromise.then(function(result) {
|
||||
criteria.push(
|
||||
Criteria.create('Task',
|
||||
params.task_id,
|
||||
|
@ -111,6 +128,13 @@ angular.module('sb.search').factory('SearchHelper',
|
|||
}
|
||||
);
|
||||
}
|
||||
|
||||
var deferred = $q.defer();
|
||||
$q.all(promises).then(function() {
|
||||
deferred.resolve(criteria);
|
||||
});
|
||||
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
|
@ -27,9 +27,7 @@ angular.module('sb.story').controller('StoryListController',
|
|||
$scope.resourceTypes = ['Story'];
|
||||
|
||||
// Search result criteria default must be "active"
|
||||
$scope.defaultCriteria = [];
|
||||
|
||||
SearchHelper.parseParameters($stateParams, $scope.defaultCriteria);
|
||||
$scope.defaultCriteria = SearchHelper.parseParameters($stateParams);
|
||||
|
||||
/**
|
||||
* Creates a new story.
|
||||
|
|
Loading…
Reference in New Issue