// tslint:disable:no-any max-line-length import { SPHttpClient, SPHttpClientResponse } from '@microsoft/sp-http'; import { WebPartContext } from '@microsoft/sp-webpart-base'; import { ITermSetInfo } from '../core/ProviderContracts'; export class TaxonomyService { public constructor(private context: WebPartContext) { } public getTermSets(): Promise { const requestXml: string = ''; const url: string = this.context.pageContext.site.absoluteUrl.replace(/\/$/, '') + '/_vti_bin/client.svc/ProcessQuery'; return this.context.spHttpClient.post(url, SPHttpClient.configurations.v1, { headers: { 'Accept': 'application/json', 'Content-Type': 'application/xml' }, body: requestXml }).then((response: SPHttpClientResponse): Promise => { if (!response.ok) { return Promise.reject(new Error('Termsets konnten nicht geladen werden (' + response.status + ').')); } return response.text(); }).then((text: string): ITermSetInfo[] => this.parse(JSON.parse(text || '[]'))); } private parse(payload: any[]): ITermSetInfo[] { if (!Array.isArray(payload)) { return []; } if (payload.length && payload[0] && payload[0].ErrorInfo) { throw new Error(payload[0].ErrorInfo.ErrorMessage || 'Taxonomy-Abfrage fehlgeschlagen.'); } let store: any; for (let i: number = 0; i < payload.length; i++) { if (payload[i] && payload[i]._ObjectType_ === 'SP.Taxonomy.TermStore') { store = payload[i]; break; } } const groups: any[] = store && store.Groups && Array.isArray(store.Groups._Child_Items_) ? store.Groups._Child_Items_ : []; const result: ITermSetInfo[] = []; for (let g: number = 0; g < groups.length; g++) { if (!groups[g] || groups[g].IsSystemGroup === true) { continue; } const sets: any[] = groups[g].TermSets && Array.isArray(groups[g].TermSets._Child_Items_) ? groups[g].TermSets._Child_Items_ : []; for (let s: number = 0; s < sets.length; s++) { const id: string = this.cleanGuid(sets[s] && sets[s].Id); if (id) { result.push({ id: id, name: sets[s].Name || id, groupName: groups[g].Name || 'Ohne Gruppe', description: sets[s].Description || '' }); } } } return result.sort((left: ITermSetInfo, right: ITermSetInfo): number => (left.groupName + left.name).localeCompare(right.groupName + right.name)); } private cleanGuid(value: any): string { return String(value || '').replace('/Guid(', '').replace(')/', '').replace(')', '').replace(/[{}]/g, '').toLowerCase(); } }