CSIT Fix for SDC-2585
[sdc.git] / catalog-ui / src / app / view-models / workspace / tabs / composition / tabs / relations / relations-view-model.ts
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 'use strict';
22 import * as _ from "lodash";
23 import {ICompositionViewModelScope} from "../../composition-view-model";
24 import {CapabilitiesGroup, Requirement, RequirementsGroup} from "app/models";
25 import {ComponentServiceNg2} from "app/ng2/services/component-services/component.service";
26 import {ComponentGenericResponse} from "app/ng2/services/responses/component-generic-response";
27 import {GRAPH_EVENTS} from "app/utils";
28 import {EventListenerService} from "app/services";
29 import {ComponentInstance, Capability} from "app/models";
30
31 interface IRelationsViewModelScope extends ICompositionViewModelScope {
32     isLoading:boolean;
33     $parent:ICompositionViewModelScope;
34     getRelation(requirement:any):any;
35     capabilities:Array<Capability>;
36     requirements:Array<Requirement>;
37
38     //for complex components
39     capabilitiesInstancesMap:InstanceCapabilitiesMap;
40     requirementsInstancesMap:InstanceRequirementsMap;
41 }
42 export class InstanceCapabilitiesMap {
43     [key:string]:Array<Capability>;
44 }
45
46 export class InstanceRequirementsMap {
47     [key:string]:Array<Requirement>;
48 }
49
50 export class RelationsViewModel {
51
52     static '$inject' = [
53         '$scope',
54         '$filter',
55         'ComponentServiceNg2',
56         'EventListenerService'
57     ];
58
59     constructor(private $scope:IRelationsViewModelScope,
60                 private $filter:ng.IFilterService,
61                 private ComponentServiceNg2:ComponentServiceNg2,
62                 private eventListenerService:EventListenerService) {
63         this.initScope();
64     }
65
66     private loadComplexComponentData = () => {
67         this.$scope.isLoading = true;
68         this.ComponentServiceNg2.getCapabilitiesAndRequirements(this.$scope.currentComponent.componentType, this.$scope.currentComponent.uniqueId).subscribe((response:ComponentGenericResponse) => {
69             this.$scope.currentComponent.capabilities = response.capabilities;
70             this.$scope.currentComponent.requirements = response.requirements;
71             this.setScopeCapabilitiesRequirements(this.$scope.currentComponent.capabilities, this.$scope.currentComponent.requirements);
72             this.initInstancesMap();
73             this.$scope.isLoading = false;
74         });
75     }
76
77
78     private extractValuesFromMap = (map:CapabilitiesGroup | RequirementsGroup):Array<any> => {
79         let values = [];
80         _.forEach(map, (capabilitiesOrRequirements:Array<Capability> | Array<Requirement>, key) => {
81                 values = values.concat(capabilitiesOrRequirements)
82             }
83         );
84         return values;
85     }
86
87     private setScopeCapabilitiesRequirements = (capabilities:CapabilitiesGroup, requirements:RequirementsGroup) => {
88         this.$scope.capabilities = this.extractValuesFromMap(capabilities);
89         this.$scope.requirements = this.extractValuesFromMap(requirements);
90     }
91
92
93     private initInstancesMap = ():void => {
94
95         this.$scope.capabilitiesInstancesMap = new InstanceCapabilitiesMap();
96         _.forEach(this.$scope.capabilities, (capability:Capability) => {
97             if (this.$scope.capabilitiesInstancesMap[capability.ownerName]) {
98                 this.$scope.capabilitiesInstancesMap[capability.ownerName] = this.$scope.capabilitiesInstancesMap[capability.ownerName].concat(capability);
99             } else {
100                 this.$scope.capabilitiesInstancesMap[capability.ownerName] = new Array<Capability>(capability);
101             }
102         });
103
104         this.$scope.requirementsInstancesMap = new InstanceRequirementsMap();
105         _.forEach(this.$scope.requirements, (requirement:Requirement) => {
106             if (this.$scope.requirementsInstancesMap[requirement.ownerName]) {
107                 this.$scope.requirementsInstancesMap[requirement.ownerName] = this.$scope.requirementsInstancesMap[requirement.ownerName].concat(requirement);
108             } else {
109                 this.$scope.requirementsInstancesMap[requirement.ownerName] = new Array<Requirement>(requirement);
110             }
111         });
112     }
113
114     private initRequirementsAndCapabilities = (needUpdate?: boolean) => {
115
116         // if instance selected, we take the requirement and capabilities of the instance - always exist because we load them with the graph
117         if (this.$scope.isComponentInstanceSelected()) {
118             this.$scope.isLoading = false;
119             this.setScopeCapabilitiesRequirements(this.$scope.currentComponent.selectedInstance.capabilities, this.$scope.currentComponent.selectedInstance.requirements);
120             if (this.$scope.currentComponent.selectedInstance.originType === 'VF') {
121                 this.initInstancesMap();
122             }
123         } else {
124             // if instance not selected, we take the requirement and capabilities of the VF/SERVICE, if not exist we call api
125             if (needUpdate || !this.$scope.currentComponent.capabilities || !this.$scope.currentComponent.requirements) {
126                 this.loadComplexComponentData();
127
128             } else {
129                 this.$scope.isLoading = false;
130                 this.setScopeCapabilitiesRequirements(this.$scope.currentComponent.capabilities, this.$scope.currentComponent.requirements);
131                 this.initInstancesMap();
132             }
133         }
134     }
135
136     private updateRequirementCapabilities = () => {
137         if (!this.$scope.isComponentInstanceSelected()) {
138             this.loadComplexComponentData();
139         }
140     }
141
142     private initEvents = ():void => {
143         this.eventListenerService.registerObserverCallback(GRAPH_EVENTS.ON_NODE_SELECTED, this.initRequirementsAndCapabilities);
144         this.eventListenerService.registerObserverCallback(GRAPH_EVENTS.ON_GRAPH_BACKGROUND_CLICKED, this.updateRequirementCapabilities);
145         this.eventListenerService.registerObserverCallback(GRAPH_EVENTS.ON_CREATE_COMPONENT_INSTANCE,  this.updateRequirementCapabilities);
146         this.eventListenerService.registerObserverCallback(GRAPH_EVENTS.ON_DELETE_COMPONENT_INSTANCE,  this.updateRequirementCapabilities);
147     }
148
149     private initScope = ():void => {
150
151         this.$scope.requirements = [];
152         this.$scope.capabilities = [];
153
154         this.initEvents();
155         this.initRequirementsAndCapabilities();
156
157         this.$scope.isCurrentDisplayComponentIsComplex = ():boolean => {
158             if (this.$scope.isComponentInstanceSelected()) {
159                 if (this.$scope.currentComponent.selectedInstance.originType === 'VF') {
160                     return true;
161                 }
162                 return false;
163             } else {
164                 return this.$scope.currentComponent.isComplex();
165             }
166         }
167
168         this.$scope.$on('$destroy', () => {
169
170             this.eventListenerService.unRegisterObserver(GRAPH_EVENTS.ON_NODE_SELECTED, this.initRequirementsAndCapabilities);
171             this.eventListenerService.unRegisterObserver(GRAPH_EVENTS.ON_GRAPH_BACKGROUND_CLICKED, this.updateRequirementCapabilities);
172             this.eventListenerService.unRegisterObserver(GRAPH_EVENTS.ON_CREATE_COMPONENT_INSTANCE, this.updateRequirementCapabilities);
173             this.eventListenerService.unRegisterObserver(GRAPH_EVENTS.ON_DELETE_COMPONENT_INSTANCE, this.updateRequirementCapabilities);
174         });
175
176     }
177 }