Update integration UI tests selenium image
[sdc.git] / catalog-ui / src / app / ng2 / components / modals / onboarding-modal / onboarding-modal.component.ts
1 /**
2  * Created by rc2122 on 6/3/2018.
3  */
4 import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
5 import * as _ from 'lodash';
6 import { SdcUiServices } from 'onap-ui-angular';
7 import { ComponentMetadata, IComponentMetadata } from '../../../../models/component-metadata';
8 import { IUserProperties } from '../../../../models/user';
9
10 import { Resource } from '../../../../models/components/resource';
11 import { ComponentType } from '../../../../utils/constants';
12 import { CacheService } from '../../../services/cache.service';
13 import { FileUtilsService } from '../../../services/file-utils.service';
14 import { OnboardingService } from '../../../services/onboarding.service';
15 import { TranslateService } from '../../../shared/translator/translate.service';
16
17 export interface ImportVSPdata {
18     componentCsar: Resource;
19     previousComponent?: Resource;
20     type: string;
21 }
22
23 // tslint:disable-next-line:interface-name
24 export interface IPoint {
25     x: number;
26     y: number;
27 }
28
29 @Component({
30     selector: 'onboarding-modal',
31     templateUrl: './onboarding-modal.component.html',
32     styleUrls: ['onboarding-modal.component.less', '../../../../../assets/styles/table-style.less']
33 })
34 export class OnboardingModalComponent implements OnInit {
35     @Input() currentCsarUUID: string;
36     @Input() currentCsarVersion: string;
37     @ViewChild('componentsMetadataTable') table: any;
38     @Output() closeModalEvent: EventEmitter<ImportVSPdata> = new EventEmitter<ImportVSPdata>();
39
40     private columns = [
41         {name: 'Name', prop: 'name', flexGrow: 22},
42         {name: 'Vendor', prop: 'vendorName', flexGrow: 26},
43         {name: 'Category', prop: 'categories', flexGrow: 33},
44         {name: 'Version', prop: 'csarVersion', flexGrow: 10},
45         {name: 'Type', prop: 'resourceType', flexGrow: 10},
46         {name: '#', prop: '', flexGrow: 20}
47     ];
48     private componentsMetadataList: IComponentMetadata[] = [];
49     private temp: IComponentMetadata[] = [];
50     private componentFromServer: ComponentMetadata;
51     private isCsarComponentExists: boolean = false;
52     private selectedComponent: ComponentMetadata;
53     private isLoading: boolean;
54     private user: IUserProperties;
55
56     constructor(private onBoardingService: OnboardingService,
57                 private translateService: TranslateService,
58                 private cacheService: CacheService,
59                 private fileUtilsService: FileUtilsService,
60                 private popoverService: SdcUiServices.PopoverService,
61                 private loaderService: SdcUiServices.LoaderService) {
62     }
63
64     public ngOnInit(): void {
65         this.initOnboardingComponentsList();
66         this.user = this.cacheService.get('user');
67     }
68
69     initMaxVersionOfItemsInList = (onboardingResponse: IComponentMetadata[]): void => {
70         // Get only the latest version of each item
71         this.componentsMetadataList = [];
72
73         // group all items according to packageId
74         const groupByPackageIdItems = _.groupBy(onboardingResponse, 'packageId');
75         // Loop on all the groups and push to componentsMetadataList the max version for each package
76         _.each(groupByPackageIdItems, (items: any): void => {
77             let maxItem: any = items[0];
78             items.forEach((item) => {
79                 if (parseFloat(maxItem.csarVersion) < parseFloat(item.csarVersion)) {
80                     maxItem = item;
81                 }
82             });
83             if (maxItem) {
84                 this.componentsMetadataList.push(maxItem);
85             }
86         });
87     }
88
89     onSelectComponent({selected}) {
90         this.table.rowDetail.collapseAllRows();
91         if (selected[0] === this.selectedComponent) {
92             this.selectedComponent = undefined;
93             this.componentFromServer = undefined;
94             this.table.rowDetail.toggleExpandRow(null);
95             return;
96         }
97         this.isLoading = true;
98         this.componentFromServer = undefined;
99         this.selectedComponent = selected[0];
100         this.onBoardingService.getComponentFromCsarUuid(this.selectedComponent.csarUUID).subscribe(
101             (componentFromServer: ComponentMetadata) => {
102                 this.isLoading = false;
103                 if (componentFromServer) {
104                     this.componentFromServer = componentFromServer;
105                     this.populateRowDetails(true);
106                 } else {
107                     this.populateRowDetails(false);
108                 }
109             }, (error) => {
110                 this.isLoading = false;
111                 this.populateRowDetails(false);
112             });
113     }
114
115     populateRowDetails(isCsarComponentExists: boolean) {
116         this.isCsarComponentExists = isCsarComponentExists;
117         this.table.rowDetail.toggleExpandRow(this.selectedComponent);
118     }
119
120     importOrUpdateCsar = (): void => {
121         const selectedComponentConverted = this.onBoardingService.convertMetaDataToComponent(this.selectedComponent);
122         const componentFromServerConverted = this.componentFromServer ?
123             this.onBoardingService.convertMetaDataToComponent(this.componentFromServer) : undefined;
124         const importVSPdata: ImportVSPdata = {
125             componentCsar: selectedComponentConverted,
126             previousComponent: componentFromServerConverted,
127             type: ComponentType.RESOURCE.toLowerCase()
128         };
129         this.closeModalEvent.emit(importVSPdata);
130     }
131
132     downloadCsar = (packageId: string): void => {
133         this.isLoading = true;
134         this.onBoardingService.downloadOnboardingCsar(packageId).subscribe(
135             (file: any): void => {
136                 this.isLoading = false;
137                 if (file.body) {
138                     this.fileUtilsService.downloadFile(new Blob([file.body],
139                         {type: 'application/octet-stream'}), packageId + '.csar');
140                 }
141             }, (): void => {
142                 this.isLoading = false;
143             }
144         );
145     }
146
147     updateFilter(event) {
148         const val = event.target.value.toLowerCase();
149
150         // filter our data
151         const temp = this.temp.filter((componentMetadata: ComponentMetadata) => {
152             return !val ||
153                 (componentMetadata.name && componentMetadata.name.toLowerCase().indexOf(val) !== -1) ||
154                 (componentMetadata.vendorName && componentMetadata.vendorName.toLowerCase().indexOf(val) !== -1) ||
155                 (componentMetadata.categories[0] && componentMetadata.categories[0].name.toLowerCase().indexOf(val) !== -1) ||
156                 (componentMetadata.categories[0] && componentMetadata.categories[0].subcategories[0] && componentMetadata.categories[0].subcategories[0].name.toLowerCase().indexOf(val) !== -1) ||
157                 (componentMetadata.csarVersion && componentMetadata.csarVersion.toLowerCase().indexOf(val) !== -1) ||
158                 (componentMetadata.description && componentMetadata.description.toLowerCase().indexOf(val) !== -1);
159         });
160
161         // update the rows
162         this.componentsMetadataList = temp;
163     }
164
165     checkNotCertified = (): boolean => {
166         return this.componentFromServer && this.componentFromServer.lifecycleState === 'NOT_CERTIFIED_CHECKOUT' &&
167             this.componentFromServer.lastUpdaterUserId !== this.user.userId;
168     }
169
170     openPopover = ($event: any, popoverContent): void => {
171         this.popoverService.createPopOver('', this.translateService.translate(popoverContent), {
172             x: $event.pageX,
173             y: $event.pageY
174         }, 'bottom');
175     }
176
177     private initOnboardingComponentsList = (): void => {
178         this.loaderService.activate();
179         this.onBoardingService.getOnboardingComponents().subscribe(
180             (onboardingResponse: IComponentMetadata[]) => {
181                 this.loaderService.deactivate();
182                 if (this.currentCsarUUID) {
183                     onboardingResponse = _.filter(onboardingResponse, (input): boolean => {
184                         return (input as ComponentMetadata).csarUUID === this.currentCsarUUID;
185                     });
186                 }
187                 this.initMaxVersionOfItemsInList(onboardingResponse);
188                 this.temp = [...this.componentsMetadataList];
189             }, (error) => {
190                 this.loaderService.deactivate();
191             }
192         );
193     }
194 }