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";
10 GenericFormPopupComponent,
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";
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";
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>) {
37 name: string = 'vnfGroups';
38 type: string = 'VnfGroup';
39 typeName: string = 'G';
40 childType: string = 'RelatedVnfMemberInfoModel';
41 childName: string = 'vnfs';
42 limitMembers : number;
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";
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);
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);
70 getTooltip = (): string => 'VnfGroup';
72 getType = (): string => 'VnfGroup';
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;
86 getModel(modelId: string, instance: any, serviceHierarchy): any {
87 const originalModelName = instance.originalName ? instance.originalName : modelId;
88 return new VnfGroupModel(serviceHierarchy[this.name][originalModelName]);
91 hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
92 return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []);
95 onClickAdd(node: ITreeNode, serviceModelId: string): void {
96 this._dialogService.addDialog(GenericFormPopupComponent, {
97 type: PopupType.VNF_GROUP,
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
111 getNodeCount(node: ITreeNode, serviceModelId: string): number {
113 if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
114 map = this._store.getState().service.serviceInstance[serviceModelId].existingVnfGroupCounterMap || 0;
116 let count = map[node.data.modelUniqueId] || 0;
117 count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfGroups');
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);
134 getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
137 method: (node, serviceModelId) => {
138 this._iframeService.addClassOpenModal('content');
139 this._dialogService.addDialog(GenericFormPopupComponent, {
140 type: PopupType.VNF_GROUP,
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
153 visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
154 enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
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;
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?",
171 text: "Remove Group",
173 callback: this.removeGroup.bind(this, node, serviceModelId),
176 {text: "Don’t Remove", size: "medium", closeModal: true}
179 MessageBoxService.openModal.next(messageBoxData);
182 visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
183 enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
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,
199 title: 'Service model name',
200 dataTestId: 'sourceModelName',
201 value: (Object.values(vnfGroupModel.members))[0].sourceModelName
204 title: 'Service invariant UUID',
205 dataTestId: 'sourceModelInvariant',
206 value: (Object.values(vnfGroupModel.members))[0].sourceModelInvariant
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
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);
219 visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
220 enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
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));
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));
234 visible: (node) => this._sharedTreeService.shouldShowDelete(node),
235 enable: (node) => this._sharedTreeService.shouldShowDelete(node)
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));
242 this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
243 this._store.dispatch(undoDeleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
247 visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
248 enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
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;
261 updatePosition(that , node, instanceId): void {
265 getNodePosition(instance): number {
266 return !_.isNil(instance) ? instance.position : null;
269 onSelectedNode(node: ITreeNode): void {