Make it possible to link to a search/browse for stories
This commit makes it so that the story list view adds the currently selected filter parameters to the URL. It also makes the starting criteria be set based on the query string of the URL, which allows one to share a link to a search/browse. Change-Id: I83661de0ae2a3b773abc3bf74e6627d8d601e34d
This commit is contained in:
parent
29aa6271d4
commit
32c702e3d4
|
@ -21,7 +21,7 @@
|
|||
* may be property filters (title = foo) or resource filters (story_id = 22).
|
||||
*/
|
||||
angular.module('sb.search').controller('SearchCriteriaController',
|
||||
function ($log, $q, $scope, Criteria) {
|
||||
function ($log, $q, $scope, $location, $injector, Criteria) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
|
@ -55,6 +55,18 @@ angular.module('sb.search').controller('SearchCriteriaController',
|
|||
$scope.init();
|
||||
});
|
||||
|
||||
$scope.rewriteQueryString = function() {
|
||||
var params = {};
|
||||
angular.forEach(resourceTypes, function(resourceName) {
|
||||
var resource = $injector.get(resourceName);
|
||||
angular.forEach($scope.criteria, function() {
|
||||
var criteriaMap = resource.criteriaMap($scope.criteria);
|
||||
angular.extend(params, criteriaMap);
|
||||
});
|
||||
});
|
||||
$location.search(params);
|
||||
};
|
||||
|
||||
/**
|
||||
* When a criteria is added, make sure we remove all previous criteria
|
||||
* that have the same type.
|
||||
|
@ -72,6 +84,7 @@ angular.module('sb.search').controller('SearchCriteriaController',
|
|||
$scope.criteria.splice(i, 1);
|
||||
}
|
||||
}
|
||||
$scope.rewriteQueryString();
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -82,6 +95,7 @@ angular.module('sb.search').controller('SearchCriteriaController',
|
|||
if (idx > -1) {
|
||||
$scope.criteria.splice(idx, 1);
|
||||
}
|
||||
$scope.rewriteQueryString();
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -19,16 +19,63 @@
|
|||
*/
|
||||
angular.module('sb.story').controller('StoryListController',
|
||||
function ($scope, $state, Criteria, NewStoryService,
|
||||
SubscriptionList, CurrentUser) {
|
||||
SubscriptionList, CurrentUser, $stateParams, $filter, $q,
|
||||
Tags, User, Project, ProjectGroup) {
|
||||
'use strict';
|
||||
|
||||
// search results must be of type "story"
|
||||
$scope.resourceTypes = ['Story'];
|
||||
|
||||
// Search result criteria default must be "active"
|
||||
$scope.defaultCriteria = [
|
||||
Criteria.create('StoryStatus', 'active', 'Active')
|
||||
];
|
||||
$scope.defaultCriteria = [];
|
||||
|
||||
if ($stateParams.q) {
|
||||
$scope.defaultCriteria.push(
|
||||
Criteria.create('Text', $stateParams.q)
|
||||
);
|
||||
}
|
||||
if ($stateParams.status) {
|
||||
$scope.defaultCriteria.push(
|
||||
Criteria.create('StoryStatus', $stateParams.status,
|
||||
$filter('capitalize')($stateParams.status))
|
||||
);
|
||||
}
|
||||
if ($stateParams.tags) {
|
||||
$scope.defaultCriteria.push(
|
||||
Criteria.create('Tags', $stateParams.tags, $stateParams.tags)
|
||||
);
|
||||
}
|
||||
if ($stateParams.assignee_id) {
|
||||
User.get({'id': $stateParams.assignee_id}).$promise
|
||||
.then(function(result) {
|
||||
$scope.defaultCriteria.push(
|
||||
Criteria.create('User', $stateParams.assignee_id,
|
||||
result.full_name)
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
if ($stateParams.project_id) {
|
||||
Project.get({'id': $stateParams.project_id}).$promise
|
||||
.then(function(result) {
|
||||
$scope.defaultCriteria.push(
|
||||
Criteria.create('Project', $stateParams.project_id,
|
||||
result.name)
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
if ($stateParams.project_group_id) {
|
||||
ProjectGroup.get({'id': $stateParams.project_group_id}).$promise
|
||||
.then(function(result) {
|
||||
$scope.defaultCriteria.push(
|
||||
Criteria.create('ProjectGroup',
|
||||
$stateParams.project_group_id,
|
||||
result.title)
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new story.
|
||||
|
|
|
@ -27,6 +27,9 @@ angular.module('sb.story', ['ui.router', 'sb.services', 'sb.util',
|
|||
// URL Defaults.
|
||||
$urlRouterProvider.when('/story', '/story/list');
|
||||
|
||||
var queryParams = 'q&status&tags&project_group_id&'
|
||||
+ 'project_id&assignee_id';
|
||||
|
||||
// Set our page routes.
|
||||
$stateProvider
|
||||
.state('sb.story', {
|
||||
|
@ -35,7 +38,10 @@ angular.module('sb.story', ['ui.router', 'sb.services', 'sb.util',
|
|||
template: '<div ui-view></div>'
|
||||
})
|
||||
.state('sb.story.list', {
|
||||
url: '/list',
|
||||
url: '/list?' + queryParams,
|
||||
params: {
|
||||
'status': 'active'
|
||||
},
|
||||
templateUrl: 'app/stories/template/list.html',
|
||||
controller: 'StoryListController'
|
||||
})
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
tag-complete-tag-template-url="'app/search/template/criteria_tag_item.html'"
|
||||
tag-complete-loading="loadingCriteria = isLoading"
|
||||
tag-complete-on-select="addCriteria(tag)"
|
||||
tag-remove-callback="rewriteQueryString()"
|
||||
placeholder="Search Stories">
|
||||
</div>
|
||||
<span class="form-control-feedback text-muted">
|
||||
|
|
Loading…
Reference in New Issue