1 import {Component, EventEmitter, Output, ViewChild} from '@angular/core';
2 import {ITreeOptions, TreeComponent} from 'angular-tree-component';
3 import '../../../../node_modules/angular-tree-component/dist/angular-tree-component.css';
4 import {IDType, ITreeNode} from 'angular-tree-component/dist/defs/api';
5 import {DialogService} from 'ng2-bootstrap-modal';
6 import {AvailableModelsTreeService} from './available-models-tree.service';
7 import {NgRedux} from "@angular-redux/store";
8 import {ActivatedRoute} from '@angular/router';
9 import {AppState} from '../../store/reducers';
10 import {AaiService} from '../../services/aaiService/aai.service';
11 import {ServicePlanningService} from '../../services/service-planning.service';
12 import {VnfPopupComponent} from '../../components/vnf-popup/vnf-popup.components';
13 import {ServiceNodeTypes} from '../../shared/models/ServiceNodeTypes';
14 import {VfModuleMap} from '../../shared/models/vfModulesMap';
15 import {IframeService} from "../../shared/utils/iframe.service";
16 import {createVFModuleInstance} from "../../service.actions";
17 import {DefaultDataGeneratorService} from "../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
21 selector: 'available-models-tree',
22 templateUrl: './available-models-tree.component.html',
23 styleUrls: ['./available-models-tree.component.scss']
27 export class AvailableModelsTreeComponent{
29 serviceModelId: string;
31 parentElementClassName = 'content';
32 _store : NgRedux<AppState>;
33 constructor(private _servicePlanningService: ServicePlanningService,
34 private _iframeService: IframeService,
35 private _aaiService: AaiService,
36 private route: ActivatedRoute,
37 private dialogService: DialogService,
38 private _availableModelsTreeService: AvailableModelsTreeService,
39 private _defaultDataGeneratorService: DefaultDataGeneratorService,
40 private store: NgRedux<AppState>) {
44 .subscribe(params => {
45 this.serviceModelId = params['serviceModelId'];
46 this._aaiService.getServiceModelById(this.serviceModelId).subscribe(
48 this.serviceHierarchy = value;
49 this.nodes = this._servicePlanningService.convertServiceModelToTreeNodes(this.serviceHierarchy);
52 console.log('error is ', error)
60 highlightInstances: EventEmitter<number> = new EventEmitter<number>();
61 @ViewChild('tree') tree: TreeComponent;
65 isFilterEnabled: boolean = false;
67 options: ITreeOptions = {
70 nodeClass: (node: ITreeNode) => {
71 if(node.data.type === ServiceNodeTypes.VFmodule && !this.getNodeCount(node.parent))
73 node.data.disabled = true;
74 return 'tree-node tree-node-disabled';
76 node.data.disabled = false;
81 expandParentByNodeId(id: IDType): void {
82 this.tree.treeModel.getNodeById(id).parent.expand();
85 searchTree(searchText: string, event: KeyboardEvent): void {
86 if (searchText === '') {
89 this.isFilterEnabled = event.key === 'Delete' || event.key === 'Backspace' || searchText.length > 1;
90 if (this.isFilterEnabled) {
92 let results: ITreeNode[] = [];
93 this.nodes.forEach(function (node) {
94 __this.searchTreeNode(node, searchText, results);
96 results.forEach(function (result) {
97 __this.expandParentByNodeId(result.id)
102 searchTreeNode(node, searchText: string, results): void {
103 if (node.name.toLowerCase().indexOf(searchText.toLowerCase()) != -1) {
106 if (node.children != null) {
107 for (let i = 0; i < node.children.length; i++) {
108 this.searchTreeNode(node.children[i], searchText, results);
113 selectNode(node: ITreeNode): void {
115 this.highlightInstances.emit(node.data.id);
118 onClickAdd(e: MouseEvent, node: ITreeNode): void {
119 let data = node.data;
120 let dynamicInputs = data.dynamicInputs;
121 let userProvidedNaming:boolean = data.userProvidedNaming;
122 let type:string = data.type;
123 if(!this.store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD']|| node.data.type === ServiceNodeTypes.VF || this._availableModelsTreeService.shouldOpenDialog(type, dynamicInputs, userProvidedNaming)) {
124 this._iframeService.addClassOpenModal(this.parentElementClassName);
125 this.dialogService.addDialog(VnfPopupComponent, {
126 serviceModelId: this.serviceModelId,
127 parentModelName: node.parent && node.parent.data.name,
128 modelName: data.name,
130 dynamicInputs: dynamicInputs,
131 userProvidedNaming: userProvidedNaming,
136 let vfModule = this._defaultDataGeneratorService.generateVFModule(this.serviceHierarchy, node.parent.data.name, node.data.name);
137 this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId));
143 getNodeCount(node: ITreeNode): number {
144 let modelName: string = node.data.name;
145 if (ServicePlanningService.isVfModule(node)) {
146 let parentVnfModelName = node.parent.data.name;
147 let vfModuleMap: VfModuleMap = this._servicePlanningService.getVfModuleMap(this.serviceModelId, parentVnfModelName, modelName);
148 return vfModuleMap ? Object.keys(vfModuleMap).length : 0;
149 } else if (ServicePlanningService.isVnf(node)) {
150 let vnfInstance = this._servicePlanningService.getVnfInstance(this.serviceModelId, modelName);
151 return vnfInstance ? 1 : 0;
155 isShowIconV(node: ITreeNode): boolean {
156 return this.getNodeCount(node) > 0;
159 isShowNodeCount(node: ITreeNode): boolean {
160 return this.getNodeCount(node) > 0;
163 isShowIconAdd(node: ITreeNode): boolean {
164 return this._availableModelsTreeService.shouldShowAddIcon(node, this.store.getState().service.serviceHierarchy, this.serviceModelId, this.getNodeCount(node));