in backlogs-panel/src/workdetailsdata.ts [27:107]
public static beginGetWorkDetails(projectId: string, teamId: string, ids: number[]): IPromise<IModel> {
let context = VSS.getWebContext();
let workClient = Tfs_Work_WebApi.getClient();
let witClient = TFS_Wit_Client.getClient();
let taskTypes: string[] = ["Task"];
let bugTypes: string[] = ["Bug"];
return workClient.getTeamSettings({ project: null, team: null, projectId: projectId, teamId: teamId }).then(teamSettings => {
let childTypes: string[] = taskTypes;
if (teamSettings.bugsBehavior === Tfs_Work_Contracts.BugsBehavior.AsTasks) {
childTypes = childTypes.concat(bugTypes);
}
let wiql = `SELECT [System.Id] FROM WorkItemLinks WHERE (Source.[System.Id] in (${ids.join(",")})) and ([System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward') AND (Target.[System.WorkItemType] in ('${childTypes.join("','")}')) ORDER BY [System.State] mode(Recursive)`;
return witClient.queryByWiql({ query: wiql }, projectId).then(queryResult => {
let allWorkItemIds: number[] = [];
queryResult.workItemRelations.forEach(element => {
allWorkItemIds.push(element.target.id);
});
return witClient.getWorkItems(allWorkItemIds, null, null, TFS_Wit_Contracts.WorkItemExpand.Relations).then(workItems => {
let notStarted = 0;
let inProgress = 0;
let completed = 0;
let displayNames = {};
let pullRequestLookup = {};
let pullRequests: IPullrequest[] = [];
let promises: IPromise<VCContracts.GitPullRequest>[] = [];
workItems.forEach(element => {
let assignedTo = element.fields["System.AssignedTo"];
if (!!assignedTo) {
displayNames[assignedTo] = true;
}
if(element && element.relations){
element.relations.forEach(relation => {
if (relation.rel === "ArtifactLink" && relation.attributes["name"] === "Pull Request") {
let splitURI = decodeURIComponent(relation.url).split('/');
// eg. "vstfs:", "", "", "Git", "PullRequestId", "aff28a9e-c113-4df5-b233-aac79b0b2bd5", "337492b2-c0f2-4067-a47f-56569b237a50", "1"
if (splitURI.length === 8) {
var promise = Git_RestClient.getClient().getPullRequest(splitURI[6], parseInt(splitURI[7]), splitURI[5]).then(pullRequestRaw => {
var pullRequest: IPullrequest = {
id: pullRequestRaw.pullRequestId,
name: pullRequestRaw.title,
lastUpdated: pullRequestRaw.creationDate,
user: IdentityHelper.parseIdentityName(pullRequestRaw.createdBy.displayName, pullRequestRaw.createdBy.uniqueName),
uri: `${context.host.uri}${splitURI[5]}/_git/${splitURI[6]}/pullrequest/${splitURI[7]}`,
status: WorkDetailsData._computePullRequestState(pullRequestRaw)
};
displayNames[pullRequestRaw.createdBy.displayName + " <" + pullRequestRaw.createdBy.uniqueName + ">"] = true;
if(!pullRequestLookup[pullRequestRaw.pullRequestId]) {
pullRequestLookup[pullRequestRaw.pullRequestId] = true;
pullRequests.push(pullRequest);
}
});
promises.push(promise);
}
}
});
}
});
let usernames = Object.keys(displayNames);
return Q.allSettled(promises).then(() => {
return <IModel>{
workItemIds: ids,
identities: IdentityHelper.parseUniquefiedIdentityNames(usernames),
pullRequests: pullRequests
};
});
});
});
});
}