From a28471352e577ebc03b47772a439d3a3eff005c6 Mon Sep 17 00:00:00 2001 From: crupest Date: Sun, 24 Feb 2019 00:39:23 +0800 Subject: Fixed! --- .../src/app/todo-list-page/todo-list.service.ts | 76 ++++++++++++---------- 1 file changed, 43 insertions(+), 33 deletions(-) (limited to 'Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts') diff --git a/Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts b/Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts index 17ded67b..af3617fe 100644 --- a/Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts +++ b/Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts @@ -26,14 +26,14 @@ export interface WorkItemResult { export interface WorkItemTypeResult { icon: { - url: string + url: string; }; } export interface WorkItem { id: number; title: string; - closed: boolean; + isCompleted: boolean; detailUrl: string; iconUrl: string; } @@ -42,52 +42,62 @@ export interface WorkItem { providedIn: 'root' }) export class TodoListService { - public static titleFieldName = 'System.Title'; public static stateFieldName = 'System.State'; public static typeFieldName = 'System.WorkItemType'; - constructor(private client: HttpClient) { } + constructor(private client: HttpClient) {} private getAzureDevOpsAccessInfo(): Observable { return this.client.get('/api/TodoPage/AzureDevOpsAccessInfo'); } private getItemIconUrl(baseUrl: string, headers: HttpHeaders, type: string): Observable { - return this.client.get(`${baseUrl}_apis/wit/workitemtypes/${encodeURIComponent(type)}?api-version=5.0`, { - headers: headers - }).pipe( - map(result => result.icon.url) - ); + return this.client + .get(`${baseUrl}_apis/wit/workitemtypes/${encodeURIComponent(type)}?api-version=5.0`, { + headers: headers + }) + .pipe(map(result => result.icon.url)); } getWorkItemList(): Observable { return this.getAzureDevOpsAccessInfo().pipe( - switchMap( - accessInfo => { - const baseUrl = `https://dev.azure.com/${accessInfo.organization}/${accessInfo.project}/`; - const headers = new HttpHeaders({ - 'Accept': 'application/json', - 'Authorization': `Basic ${btoa(accessInfo.username + ':' + accessInfo.personalAccessToken)}` - }); - return this.client.post( - `${baseUrl}_apis/wit/wiql?api-version=5.0`, { + switchMap(accessInfo => { + const baseUrl = `https://dev.azure.com/${accessInfo.organization}/${accessInfo.project}/`; + const headers = new HttpHeaders({ + Accept: 'application/json', + Authorization: `Basic ${btoa(accessInfo.username + ':' + accessInfo.personalAccessToken)}` + }); + return this.client + .post( + `${baseUrl}_apis/wit/wiql?api-version=5.0`, + { query: 'SELECT [System.Id] FROM workitems WHERE [System.TeamProject] = @project' - }, { headers: headers }).pipe( - switchMap(result => result.workItems), - concatMap(result => this.client.get(result.url, { headers: headers })), - concatMap(result => this.getItemIconUrl(baseUrl, headers, result.fields[TodoListService.typeFieldName]).pipe( - map(iconResult => { - id: result.id, - title: result.fields[TodoListService.titleFieldName], - closed: ((result.fields[TodoListService.stateFieldName]).toLowerCase() === 'closed'), - detailUrl: `${baseUrl}_workitems/edit/${result.id}/`, - iconUrl: iconResult - }))), - toArray() - ); - } - ) + }, + { headers: headers } + ) + .pipe( + switchMap(result => result.workItems), + concatMap(result => this.client.get(result.url, { headers: headers })), + concatMap(result => + this.getItemIconUrl(baseUrl, headers, result.fields[TodoListService.typeFieldName]).pipe( + map( + iconResult => + { + id: result.id, + title: result.fields[TodoListService.titleFieldName], + isCompleted: (function(stateErasedCase: string): Boolean { + return stateErasedCase === 'closed' || stateErasedCase === 'resolved'; + })((result.fields[TodoListService.stateFieldName] as string).toLowerCase()), + detailUrl: `${baseUrl}_workitems/edit/${result.id}/`, + iconUrl: iconResult + } + ) + ) + ), + toArray() + ); + }) ); } } -- cgit v1.2.3