blob: 6998d6ad56ede3a7317b5b16d4f8ebc9eefce435 [file] [log] [blame]
import {AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild,} from '@angular/core';
import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu';
import {Constants} from '../../../shared/utils/constants';
import {IDType, ITreeNode} from "angular-tree-component/dist/defs/api";
import {TreeComponent, TreeModel, TreeNode} from "angular-tree-component";
import {DialogService} from "ng2-bootstrap-modal";
import {ActivatedRoute} from "@angular/router";
import {NgRedux} from "@angular-redux/store";
import {AppState} from "../../../shared/store/reducers";
import {IframeService} from "../../../shared/utils/iframe.service";
import {DuplicateService} from '../duplicate/duplicate.service';
import {DrawingBoardTreeService, TreeNodeContextMenuModel} from "./drawing-board-tree.service";
import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
import {VfModulePopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popup.service";
import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
import {HighlightPipe} from "../../../shared/pipes/highlight/highlight-filter.pipe";
import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
import {ObjectToInstanceTreeService} from "../objectsToTree/objectToInstanceTree/objectToInstanceTree.service";
import {SharedTreeService} from "../objectsToTree/shared.tree.service";
import {Subject} from "rxjs/Subject";
import {changeServiceIsDirty} from "../../../shared/storeUtil/utils/service/service.actions";
import * as _ from 'lodash';
import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service";
import {DragAndDropService} from "./dragAndDrop/dragAndDrop.service";
import {FeatureFlagsService, Features} from "../../../shared/services/featureFlag/feature-flags.service";
import {ComponentInfoService} from "../component-info/component-info.service";
import {ComponentInfoModel} from "../component-info/component-info-model";
import {ObjectToModelTreeService} from "../objectsToTree/objectToModelTree/objectToModelTree.service";
import {DrawingBoardModes} from "../drawing-board.modes";
import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
import {ModalService} from "../../../shared/components/customModal/services/modal.service";
@Component({
selector: 'drawing-board-tree',
templateUrl: './drawing-board-tree.html',
styleUrls: ['./drawing-board-tree.scss'],
providers: [HighlightPipe]
})
export class DrawingBoardTreeComponent implements OnInit, AfterViewInit {
_store: NgRedux<AppState>;
duplicateService: DuplicateService;
drawingBoardTreeService: DrawingBoardTreeService;
objectToModelTreeService : ObjectToModelTreeService;
objectToInstanceTreeService : ObjectToInstanceTreeService;
errorMsgService: ErrorMsgService;
isFilterEnabled: boolean = false;
filterValue: string = '';
contextMenuOptions: TreeNodeContextMenuModel[];
@Input() pageMode : DrawingBoardModes;
static triggerDeleteActionService: Subject<string> = new Subject<string>();
static triggerUndoDeleteActionService: Subject<string> = new Subject<string>();
@ViewChild(ContextMenuComponent, {static: false}) public contextMenu: ContextMenuComponent;
constructor(private _contextMenuService: ContextMenuService,
private _iframeService: IframeService,
private dialogService: DialogService,
private store: NgRedux<AppState>,
private route: ActivatedRoute,
private _duplicateService: DuplicateService,
private modalService: ModalService,
private _drawingBoardTreeService: DrawingBoardTreeService,
private _networkPopupService: NetworkPopupService,
private _vfModulePopuopService: VfModulePopupService,
private _vnfPopupService: VnfPopupService,
private _vnfGroupPopupService: VnfGroupPopupService,
private _errorMsgService: ErrorMsgService,
private _highlightPipe: HighlightPipe,
private _objectToInstanceTreeService: ObjectToInstanceTreeService,
private _sharedTreeService: SharedTreeService,
private _dragAndDropService : DragAndDropService,
private _objectToModelTreeService : ObjectToModelTreeService,
private _componentInfoService: ComponentInfoService) {
this.errorMsgService = _errorMsgService;
this.duplicateService = _duplicateService;
this.drawingBoardTreeService = _drawingBoardTreeService;
this.contextMenuOptions = _drawingBoardTreeService.generateContextMenuOptions();
this.objectToModelTreeService = _objectToModelTreeService;
this.objectToInstanceTreeService = _objectToInstanceTreeService;
DrawingBoardTreeComponent.triggerDeleteActionService.subscribe((serviceModelId) => {
this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(this.nodes, serviceModelId, (node, serviceModelId)=>{
this.drawingBoardTreeService.deleteActionService(this.nodes, serviceModelId);
this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId));
});
});
DrawingBoardTreeService.triggerCheckIsDirty.subscribe((serviceModelId)=>{
this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId));
})
DrawingBoardTreeComponent.triggerUndoDeleteActionService.subscribe((serviceModelId) => {
this.drawingBoardTreeService.undoDeleteActionService(this.nodes, serviceModelId);
this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId));
});
this._store = store;
this.route
.queryParams
.subscribe(params => {
this.serviceModelId = params['serviceModelId'];
});
}
getNodeId(node: ITreeNode): string {
return (node.data.parentType !== "" ? (node.data.parentType + "_") : "") + node.data.typeName;
}
updateNodes(updateData: { nodes: any, filterValue: string }): void {
this.nodes = updateData.nodes;
this.filterValue = updateData.filterValue;
}
isLinkedInstance = (node) : boolean => {
return !_.isNil(node) && node.parentType === "VRF" || node.parentType === "VnfGroup";
};
@Output()
highlightNode: EventEmitter<number> = new EventEmitter<number>();
@ViewChild('tree', {static: false}) tree: TreeComponent;
missingDataTooltip: string = Constants.Error.MISSING_VNF_DETAILS;
currentNode: ITreeNode = null;
flags: any;
nodes = [];
serviceModelId: string;
options = {
allowDrag: this._dragAndDropService.checkFeatureFlag(Features.FLAG_1911_INSTANTIATION_ORDER_IN_ASYNC_ALACARTE),
actionMapping: {
mouse: {
drop: (tree:TreeModel, node:TreeNode, $event:any, {from, to}) => {
this._dragAndDropService.drop(this.store, this.serviceModelId, this.nodes, {from, to});
},
drag:(tree: TreeModel, node:TreeNode, $event:any) => {
this._dragAndDropService.drag(this.store,this.serviceModelId, node);
}
}
},
nodeHeight: 45,
dropSlotHeight: 1
};
parentElementClassName = 'content';
ngOnInit(): void {
this.store.subscribe(() => {
this.updateTree();
});
this.updateTree()
}
getNodeName(node: ITreeNode, filter: string) {
return this._highlightPipe.transform(node.data.name, filter ? filter : '');
}
updateTree() {
const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
this.nodes = this._objectToInstanceTreeService.convertServiceInstanceToTreeData(serviceInstance, this.store.getState().service.serviceHierarchy[this.serviceModelId]).filter((item) => item !== null);
console.log('right nodes', this.nodes);
}
ngAfterViewInit(): void {
this.tree.treeModel.expandAll();
}
public onContextMenu($event: MouseEvent, node: ITreeNode): void {
this.flags = this.store.getState().global.flags;
this.currentNode = node;
node.focus();
node.setActiveAndVisible(false);
this.selectNode(node);
setTimeout(() => {
this._contextMenuService.show.next({
contextMenu: this.contextMenu,
event: <any>$event,
item: node,
});
$event.preventDefault();
$event.stopPropagation();
}, 250);
}
executeMenuAction(methodName: string): void {
if (!_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) {
this.currentNode.data.menuActions[methodName]['method'](this.currentNode, this.serviceModelId);
this.store.dispatch(changeServiceIsDirty(this.nodes, this.serviceModelId));
}
}
isEnabled(node: ITreeNode, serviceModelId: string, methodName: string): boolean {
if (!_.isNil(this.currentNode) && !_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) {
return this.currentNode.data.menuActions[methodName]['enable'](this.currentNode, this.serviceModelId);
}
return false;
}
isVisible(node: ITreeNode, methodName: string): boolean {
if (!_.isNil(this.currentNode) && !_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) {
return this.currentNode.data.menuActions[methodName]['visible'](this.currentNode, this.serviceModelId);
}
return false;
}
isUpgraded(node: ITreeNode): boolean {
return this.isLabeledAsAction(node, "Upgrade");
}
isDeleted(node: ITreeNode): boolean {
return this.isLabeledAsAction(node, "Delete");
}
isPaused(node: ITreeNode): boolean {
let isPaused = node.data.pauseInstantiation;
return !_.isNil(isPaused);
}
private isLabeledAsAction(node: ITreeNode, action) {
let nodeAction = node.data.action.split('_').pop();
if (!_.isNil(nodeAction)) {
return nodeAction === action;
}
return false;
}
public selectNode(node: ITreeNode): void {
node.expand();
this._sharedTreeService.setSelectedNF(node);
this.highlightNode.emit(node.data.modelUniqueId);
if (FeatureFlagsService.getFlagState(Features.FLAG_1906_COMPONENT_INFO, this.store)) {
const serviceHierarchy = this._store.getState().service.serviceHierarchy[this.serviceModelId];
const instanceModel = this._sharedTreeService.modelByIdentifiers(
serviceHierarchy, node.data.modelTypeName,
this._sharedTreeService.modelUniqueNameOrId(node.data), node.data.modelName
);
const model = node.data.getModel(instanceModel);
const modelInfoItems = node.data.getInfo(model, node.data);
const componentInfoModel: ComponentInfoModel = this._sharedTreeService.addGeneralInfoItems(modelInfoItems, node.data.componentInfoType, model, node.data);
ComponentInfoService.triggerComponentInfoChange.next(componentInfoModel);
}
}
expandParentByNodeId(id: IDType): void {
this.tree.treeModel.getNodeById(id).parent.expand();
}
getcontextMenuOptionLabel(contextMenuOption: TreeNodeContextMenuModel): string{
let optionLabel = contextMenuOption.label;
if(contextMenuOption.label === ServiceInstanceActions.Upgrade) {
return optionLabel.concat(" to V" + this._store.getState().service.serviceInstance[this.serviceModelId].latestAvailableVersion);
}
return optionLabel;
}
isAddPositionFlagTrue() {
return this._sharedTreeService.isAddPositionFlagTrue();
}
}