1 import { HttpClient, HttpParams } from '@angular/common/http';
2 import { Inject, Injectable } from '@angular/core';
3 import { LeftPaletteComponent, LeftPaletteMetadataTypes } from 'app/models/components/displayComponent';
4 import { GroupMetadata } from 'app/models/group-metadata';
5 import { PolicyMetadata } from 'app/models/policy-metadata';
6 import { IComponentMetadata } from 'app/models/component-metadata';
7 import { SdcConfigToken } from 'app/ng2/config/sdc-config.config';
8 import { ISdcConfig } from 'app/ng2/config/sdc-config.config.factory';
9 import { WorkspaceService } from 'app/ng2/pages/workspace/workspace.service';
10 import 'rxjs/add/observable/forkJoin';
11 import { Observable } from 'rxjs/Rx';
12 import Dictionary = _.Dictionary;
17 export class CompositionPaletteService {
19 protected baseUrl = '';
21 private leftPaletteComponents: Dictionary<Dictionary<LeftPaletteComponent[]>>;
22 private facadeUrl: string;
23 constructor(protected http: HttpClient, @Inject(SdcConfigToken) sdcConfig: ISdcConfig, private workspaceService: WorkspaceService) {
24 this.baseUrl = sdcConfig.api.root + sdcConfig.api.component_api_root;
25 this.facadeUrl = sdcConfig.api.uicache_root + sdcConfig.api.GET_uicache_left_palette;
29 public subscribeToLeftPaletteElements(next, error) {
30 let params = new HttpParams();
31 params = params.append('internalComponentType', this.workspaceService.getMetadataType());
32 let model = this.workspaceService.metadata.model
34 params = params.append('componentModel', model);
36 const loadInstances = this.http.get(this.facadeUrl, {params});
37 const loadGroups = this.http.get(this.baseUrl + 'groupTypes', {params});
38 const loadPolicies = this.http.get(this.baseUrl + 'policyTypes', {params});
39 Observable.forkJoin(loadInstances, loadGroups, loadPolicies).subscribe( ([resInstances, resGrouops, resPolicies]) => {
40 const combinedDictionary = this.combineResoponses(resInstances, resGrouops, resPolicies);
41 this.leftPaletteComponents = combinedDictionary;
42 next(this.leftPaletteComponents);
46 public getLeftPaletteElements = (): Dictionary<Dictionary<LeftPaletteComponent[]>> => {
47 return this.leftPaletteComponents;
51 public convertPoliciesOrGroups = (paletteListResult, type: string ) => {
52 const components: LeftPaletteComponent[] = [];
54 if (type === 'Policies') {
55 _.forEach(paletteListResult, (policyMetadata: PolicyMetadata) => {
56 components.push(new LeftPaletteComponent(LeftPaletteMetadataTypes.Policy, policyMetadata));
63 if (type === 'Groups') {
64 _.forEach(paletteListResult, (groupMetadata: GroupMetadata) => {
65 const item = new LeftPaletteComponent(LeftPaletteMetadataTypes.Group, groupMetadata);
66 components.push(item);
76 private combineResoponses(resInstances: object, resGrouops: object, resPolicies: object) {
77 const retValObject = {};
79 if (resInstances['Generic']) {
80 if (this.isSubstitutionForNestedServices()) {
81 const serviceGroup = this.createServiceGroup(resInstances);
83 retValObject['Service'] = serviceGroup;
86 retValObject['Generic'] = resInstances['Generic'];
89 // Add all other categories
90 for (const category in resInstances) {
91 if (category === 'Generic') {
94 retValObject[category] = resInstances[category];
98 retValObject["Groups"] = this.convertPoliciesOrGroups(resGrouops, 'Groups');
101 retValObject["Policies"] = this.convertPoliciesOrGroups(resPolicies, 'Policies');
106 private isSubstitutionForNestedServices(): boolean {
107 return this.workspaceService.metadata.categories[0].useServiceSubstitutionForNestedServices;
110 private createServiceGroup(resInstances: object): object {
111 const servicesList = resInstances['Generic']['Generic'];
112 if (Array.isArray(servicesList) && servicesList.length > 0) {
113 delete resInstances['Generic']['Generic'];
114 return servicesList.reduce(function (map, component) {
115 if (map[component.categories[0].name]) {
116 map[component.categories[0].name].push(component);
118 map[component.categories[0].name] = [component];