Merge "VfModule and VolumeGroup RequestParameters: introduce objects hierarchy"
[vid.git] / vid-webpack-master / src / app / drawingBoard / service-planning / objectsToTree / models / vrf / vrfModal / networkStep / network.step.service.ts
1 import {Injectable} from "@angular/core";
2 import {NgRedux} from "@angular-redux/store";
3 import {AppState} from "../../../../../../../shared/store/reducers";
4 import {AaiService} from "../../../../../../../shared/services/aaiService/aai.service";
5 import {
6   updateGenericModalCriteria,
7   updateGenericModalhelper
8 } from "../../../../../../../shared/storeUtil/utils/global/global.actions";
9 import {ElementsTableService} from "../../../../../../../shared/components/searchMembersModal/members-table/elements-table.service";
10 import {
11   ICriteria,
12   ISearchField,
13   ITableContent,
14   ModalInformation
15 } from "../../../../../../../shared/components/searchMembersModal/members-table/element-table-row.model";
16 import {Observable, of} from "rxjs";
17 import * as _ from "lodash";
18 import {CustomTableColumnDefinition} from "../../../../../../../shared/components/searchMembersModal/members-table/elements-table.component";
19 import {NetworkModalRow} from "./network.step.model";
20
21 @Injectable()
22 export class NetworkStepService {
23   constructor(private _store: NgRedux<AppState>, private _aaiService: AaiService) {}
24
25   uniqObjectField: string = "instanceId";
26   type: string = "Network";
27
28   getNetworkStep = (serviceInstance, serviceModelId, ...otherSteps): ModalInformation => {
29     return {
30       type: this.type,
31       serviceModelId: serviceModelId,
32       title: 'Associate network to VRF Entry',
33       description: 'Select a network to associate to the VRF Entry',
34       noElementsMsg: 'No network were found.',
35       maxSelectRow: 1,
36       uniqObjectField: this.uniqObjectField,
37       backAction: (searchElementsModalComponent) => {
38         searchElementsModalComponent.closeDialog();
39       },
40       topButton: {
41         text: 'Next',
42         action: (searchElementsModalComponent) => {
43           let tmpMembers = searchElementsModalComponent._membersTableService.allElementsStatusMap;
44           let vpnStep = otherSteps[0];
45           for (let key in tmpMembers) {
46             if (tmpMembers[key].isSelected) {
47               this._store.dispatch(updateGenericModalhelper(`selected${this.type}`, tmpMembers[key], this.uniqObjectField));
48             }
49           }
50           ElementsTableService.changeModalInformationDataTrigger.next({
51             modalInformation: vpnStep.getVpnStep(serviceInstance, searchElementsModalComponent.modalInformation.serviceModelId, ...otherSteps),
52             selectedRowsIds: []
53           })
54         }
55       },
56       searchButton: {
57         text: 'Search',
58         action: (searchElementsModalComponent) => {
59           this.getNetworks(serviceInstance).subscribe((networks) => {
60             const currentRole = searchElementsModalComponent.modalInformation.criteria.find((criteria: ICriteria) => {
61               criteria.label === 'Roles';
62             });
63             ElementsTableService.changeFnTableDataTrigger.next(
64               networks.filter((network) => {
65                 if (_.isNil(currentRole)) return network;
66                 return network.role === currentRole.currentValue;
67               }));
68           });
69         }
70       },
71       getElements: (...args) => this.getNetworks(serviceInstance),
72       criteria: this.getNetworkStepCriteria(serviceInstance),
73       searchFields: this.getsNetworkStepSearchFields(serviceInstance),
74       tableHeaders: this.getNetworkStepHeaders(),
75       tableContent: this.getNetworkTableContent()
76     };
77   };
78
79   getNetworks = (serviceInstance): Observable<any[]> => {
80     let cloudRegion = serviceInstance.lcpCloudRegionId;
81     let tenantId = serviceInstance.tenantId;
82     return this._aaiService.retrieveActiveNetwork(cloudRegion, tenantId).map((networks: NetworkModalRow[]) => {
83       this.generateRolesOptions(networks);
84       return this.sortElementsResultByField(networks, this.uniqObjectField);
85     });
86   };
87
88   getNetworkStepCriteria(serviceInstance): ICriteria[] {
89     return [{
90       label: "Roles",
91       defaultValue: "",
92       type: 'DROPDOWN',
93       onInit: (): Observable<any> => of(this._store.getState().global.genericModalCriteria.roles),
94       onChange: (that, selectedOption): void => {
95         that.currentValue = selectedOption;
96       },
97       dataTestId: 'roles-criteria',
98       isRequired: false
99     }]
100   }
101
102   getsNetworkStepSearchFields = (serviceInstance): ISearchField[] => {
103     return [
104       {
105         title: 'Region',
106         dataTestId: 'Region',
107         value: serviceInstance["lcpCloudRegionId"],
108         type: "LABEL"
109       }, {
110         title: 'Tenant',
111         dataTestId: 'Tenant',
112         value: serviceInstance["tenantName"],
113         type: "LABEL"
114       },
115       {
116         title: 'Orch. status',
117         dataTestId: 'Orch_status',
118         value: "Active",
119         type: "LABEL"
120       },
121       {
122         title: 'Related to',
123         dataTestId: 'Related_to',
124         value: "VPN binding",
125         type: "LABEL"
126       }
127     ]
128   };
129
130   generateRolesOptions = (networks): void => {
131     let roles: string[] = (_.uniq(_.flatten(_.map(networks, 'role').filter((role) => !_.isNil(role))))).sort();
132     const SELECTED_AN_OPTION: string = "-- select an option --";
133     const NOT_ASSIGNED: string = "Not assigned";
134
135     roles = _.remove([SELECTED_AN_OPTION, this.shouldAddNotAssigned(networks) ? NOT_ASSIGNED : null, ...roles], null);
136     this._store.dispatch(updateGenericModalCriteria("roles", roles));
137   };
138
139   getNetworkStepHeaders = (): CustomTableColumnDefinition[] => {
140     return [
141       {displayName: `Name`, key: ['instanceName']},
142       {displayName: `Type`, key: ['instanceType']},
143       {displayName: `Role`, key: ['role']},
144       {displayName: 'Orch. Status', key: ['orchStatus']},
145       {displayName: 'Physical name', key: ['physicalName']},
146       {displayName: 'Instance ID', key: ['instanceId']},
147       {displayName: 'Model UUID', key: ['modelInfo', 'modelVersionId']},
148       {displayName: 'Service name', key: ['serviceName']},
149       {displayName: 'Service UUID', key: ['serviceUUID']},
150       {displayName: 'Tenant', key: ['tenantName']},
151       {displayName: 'Region', key: ['lcpCloudRegionId']}
152     ];
153   };
154
155   getNetworkTableContent = (): ITableContent[] => {
156     return [
157       {
158         id: 'instanceName',
159         contents: [{
160           id: ['name'],
161           value: ["instanceName"]
162         }]
163       },
164       {
165         id: 'instanceType',
166         contents: [{
167           id: ['type'],
168           value: ['instanceType']
169         }]
170       },
171       {
172         id: 'role',
173         contents: [{
174           id: ['role'],
175           value: ['role']
176         }]
177       },
178       {
179         id: 'network-orch-status',
180         contents: [{
181           id: ['orchStatus'],
182           value: ['orchStatus']
183         }]
184       },
185       {
186         id: 'network-physical-name',
187         contents: [{
188           id: ['physicalName'],
189           value: ['physicalName']
190         }]
191       },
192       {
193         id: 'network-instance-id',
194         contents: [{
195           id: ['instanceID'],
196           value: ['instanceId']
197         }]
198       },
199       {
200         id: 'network-model-uuid',
201         contents: [{
202           id: ['modelUUID'],
203           value: ['modelInfo', 'modelVersionId']
204         }]
205       },
206       {
207         id: 'network-serviceName',
208         contents: [{
209           id: ['serviceName'],
210           value: ['serviceName']
211         }]
212       },
213       {
214         id: 'network-service-id',
215         contents: [{
216           id: ['serviceUUID'],
217           value: ['serviceUUID']
218         }]
219       },
220       {
221         id: 'network-tenantName',
222         contents: [{
223           id: ['tenant'],
224           value: ['tenantName']
225         }]
226       },
227       {
228         id: 'network-region',
229         contents: [{
230           id: ['region'],
231           value: ['lcpCloudRegionId']
232         }]
233       }
234     ];
235   };
236
237   sortElementsResultByField = (elements, fieldName): any[] => {
238     return _.sortBy(elements, o => o[fieldName]);
239   };
240
241   shouldAddNotAssigned = (networks): boolean => {
242     return _.values(networks).some(network => _.isNil(network.role) || network.role === "");
243   };
244 }