7f2052a0ce4a65b6c59e60c12360d8216b233537
[vid.git] / vid-webpack-master / src / app / drawingBoard / service-planning / objectsToTree / models / vnfGrouping / vnfGrouping.model.info.ts
1 import {ILevelNodeInfo} from "../basic.model.info";
2 import {DynamicInputsService} from "../../dynamicInputs.service";
3 import {ITreeNode} from "angular-tree-component/dist/defs/api";
4 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
5 import {VnfGroupModel} from "../../../../../shared/models/vnfGroupModel";
6 import {VnfGroupTreeNode} from "../../../../../shared/models/vnfGroupTreeNode";
7 import {SharedTreeService} from "../../shared.tree.service";
8 import {VnfGroupPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
9 import {
10   GenericFormPopupComponent,
11   PopupType
12 } from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
13 import {DialogService} from 'ng2-bootstrap-modal';
14 import {AppState} from "../../../../../shared/store/reducers";
15 import {NgRedux} from "@angular-redux/store";
16 import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
17 import {IframeService} from "../../../../../shared/utils/iframe.service";
18 import {
19   deleteActionVnfGroupInstance,
20   undoDeleteActionVnfGroupInstance
21 } from "../../../../../shared/storeUtil/utils/vnfGroup/vnfGroup.actions";
22 import {RelatedVnfMemberInfoModel} from "../relatedVnfMember/relatedVnfMember.info.model";
23 import {SearchMembersModalComponent} from "../../../../../shared/components/searchMembersModal/search-members-modal.component";
24 import * as _ from "lodash";
25 import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
26 import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
27
28 export class VnfGroupingModelInfo implements ILevelNodeInfo {
29   constructor(private _dynamicInputsService: DynamicInputsService,
30               private _sharedTreeService: SharedTreeService,
31               private _dialogService: DialogService,
32               private _vnfGroupPopupService: VnfGroupPopupService,
33               private _iframeService: IframeService,
34               private _store: NgRedux<AppState>) {
35   }
36
37   name: string = 'vnfGroups';
38   type: string = 'VnfGroup';
39   typeName: string = 'G';
40   childType: string = 'RelatedVnfMemberInfoModel';
41   childName: string = 'vnfs';
42   limitMembers : number;
43
44   /***********************************************************
45    * return if user should provide instance name or not.
46    *        get info from parent (VNF)
47    * @param currentModel - current Model object
48    ************************************************************/
49   isEcompGeneratedNaming(currentModel): boolean {
50     const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
51     return ecompGeneratedNaming === "true";
52   }
53
54   /***********************************************************
55    * return model dynamic inputs
56    * @param currentModel - current Model object
57    ************************************************************/
58   updateDynamicInputsDataFromModel = (currentModel): any => {
59     let displayInputs = currentModel.inputs;
60     return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
61   };
62
63   /***********************************************************
64    * return next level object (null because is last level)
65    ************************************************************/
66   getNextLevelObject = (): RelatedVnfMemberInfoModel => {
67     return new RelatedVnfMemberInfoModel(this._sharedTreeService, this._dynamicInputsService, this._store);
68   };
69
70   getTooltip = (): string => 'VnfGroup';
71
72   getType = (): string => 'VnfGroup';
73
74   createInstanceTreeNode(instance: any, model: any, parentModel: any, storeKey: string): any {
75     let node = new VnfGroupTreeNode(instance, model, storeKey);
76     node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
77     node = this._sharedTreeService.addingStatusProperty(node);
78     node.typeName = this.typeName;
79     node.menuActions = this.getMenuAction(<any>node, model.uuid);
80     node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
81     node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
82     node.limitMembers = (!_.isNil(model.properties.quantity)) ? model.properties.quantity : null;
83     return node;
84   }
85
86   getModel(modelId: string, instance: any, serviceHierarchy): any {
87     const originalModelName = instance.originalName ? instance.originalName : modelId;
88     return new VnfGroupModel(serviceHierarchy[this.name][originalModelName]);
89   }
90
91   hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
92     return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []);
93   }
94
95   onClickAdd(node: ITreeNode, serviceModelId: string): void {
96     this._dialogService.addDialog(GenericFormPopupComponent, {
97       type: PopupType.VNF_GROUP,
98       uuidData: <any>{
99         serviceId: serviceModelId,
100         modelName: node.data.name,
101         vnfGroupStoreKey: null,
102         modelId: node.data.modelVersionId,
103         type: node.data.type,
104         popupService: this._vnfGroupPopupService
105       },
106       node: node,
107       isUpdateMode: false
108     });
109   }
110
111   getNodeCount(node: ITreeNode, serviceModelId: string): number {
112     let map = null;
113     if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
114       map = this._store.getState().service.serviceInstance[serviceModelId].existingVnfGroupCounterMap || 0;
115       if (!_.isNil(map)) {
116         let count = map[node.data.modelUniqueId] || 0;
117         count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfGroups');
118         return count;
119       }
120     }
121     return 0;
122   }
123
124   /***********************************************************
125    * should show node icon
126    * @param node - current ITrees node
127    * @param serviceModelId - service id
128    ************************************************************/
129   showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
130     const showAddIcon = this._sharedTreeService.shouldShowAddIcon();
131     return new AvailableNodeIcons(showAddIcon, false);
132   }
133
134   getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
135     return {
136       edit: {
137         method: (node, serviceModelId) => {
138           this._iframeService.addClassOpenModal('content');
139           this._dialogService.addDialog(GenericFormPopupComponent, {
140             type: PopupType.VNF_GROUP,
141             uuidData: <any>{
142               serviceId: serviceModelId,
143               modelName: node.data.modelName,
144               vnfGroupStoreKey: node.data.vnfGroupStoreKey,
145               modelId: node.data.modelId,
146               type: node.data.type,
147               popupService: this._vnfGroupPopupService
148             },
149             node: node,
150             isUpdateMode: true
151           });
152         },
153         visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
154         enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
155       },
156       remove: {
157         method: (node, serviceModelId) => {
158           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
159             let storeKey: string = node.data.vnfGroupStoreKey;
160             this._store.dispatch(removeInstance(node.data.vnfGroupStoreKey, serviceModelId, storeKey, node));
161             this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
162             this._sharedTreeService.selectedVNF = null;
163           } else {
164             let messageBoxData: MessageBoxData = new MessageBoxData(
165               "Remove VNFGroup",  // modal title
166               "You are about to remove this group and all its children from this service. Are you sure you want to remove it?",
167               <any>"warning",
168               <any>"md",
169               [
170                 {
171                   text: "Remove Group",
172                   size: "large",
173                   callback: this.removeGroup.bind(this, node, serviceModelId),
174                   closeModal: true
175                 },
176                 {text: "Don’t Remove", size: "medium", closeModal: true}
177               ]);
178
179             MessageBoxService.openModal.next(messageBoxData);
180           }
181         },
182         visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
183         enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
184       },
185       addGroupMember: {
186         method: (node, serviceModelId) => {
187           let serviceHierarchy = this._store.getState().service.serviceHierarchy[serviceModelId];
188           let serviceInstance = this._store.getState().service.serviceInstance[serviceModelId];
189           let vnfGroupModel = new VnfGroupModel(serviceHierarchy['vnfGroups'][node.data.modelName]);
190           this._dialogService.addDialog(SearchMembersModalComponent, {
191               title: 'Add members to group',
192               description: 'Select VNF instances to associate',
193               subscriberId: serviceInstance.globalSubscriberId,
194               serviceType: serviceInstance.subscriptionServiceType,
195               vnfGroupModel: vnfGroupModel,
196               serviceModelId: serviceModelId,
197               node: node.data,
198               searchFields: [{
199                 title: 'Service model name',
200                 dataTestId: 'sourceModelName',
201                 value: (Object.values(vnfGroupModel.members))[0].sourceModelName
202               },
203                 {
204                   title: 'Service invariant UUID',
205                   dataTestId: 'sourceModelInvariant',
206                   value: (Object.values(vnfGroupModel.members))[0].sourceModelInvariant
207                 }]
208             }
209           );
210         },
211         visible: (node) => !_.isNil(node.data.action) ? node.data.action.split('_').pop() !== 'Delete' : true,
212         enable: (node) => !_.isNil(node.data.action) ? node.data.action.split('_').pop() !== 'Delete' : true
213       },
214       showAuditInfo: {
215         method: (node, serviceModelId) => {
216           let instance = this._store.getState().service.serviceInstance[serviceModelId].vnfGroups[node.data.vnfGroupStoreKey];
217           this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNFGROUP', this);
218         },
219         visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
220         enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
221       },
222       delete: {
223         method: (node, serviceModelId) => {
224           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
225             this._store.dispatch(deleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
226           }else {
227             this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId)=>{
228               this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{
229                 this._store.dispatch(deleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
230               });
231             });
232           }
233         },
234         visible: (node) => this._sharedTreeService.shouldShowDelete(node),
235         enable: (node) => this._sharedTreeService.shouldShowDelete(node)
236       },
237       undoDelete: {
238         method: (node, serviceModelId) => {
239           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
240             this._store.dispatch(undoDeleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
241           } else {
242             this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
243               this._store.dispatch(undoDeleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
244             });
245           }
246         },
247         visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
248         enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
249       }
250     };
251
252
253   }
254
255   removeGroup(this, node, serviceModelId) {
256     this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfGroupStoreKey, node));
257     this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
258     this._sharedTreeService.selectedVNF = null;
259   }
260
261   updatePosition(that , node, instanceId): void {
262     // TODO
263   }
264
265   getNodePosition(instance): number {
266     return !_.isNil(instance) ? instance.position : null;
267   }
268
269   onSelectedNode(node: ITreeNode): void {
270   }
271
272 }