ng2-tree-hackaday
Version:
angular2 component for visualizing data that can be naturally represented as a tree
81 lines (71 loc) • 2.71 kB
text/typescript
import { Component, EventEmitter, Output, Renderer, Inject, OnDestroy, OnInit } from '@angular/core';
import { NodeMenuService } from './node-menu.service';
import { NodeMenuItemSelectedEvent, NodeMenuItemAction, NodeMenuAction } from './menu.events';
import { isLeftButtonClicked, isEscapePressed } from '../utils/event.utils';
export class NodeMenuComponent implements OnInit, OnDestroy {
public menuItemSelected: EventEmitter<NodeMenuItemSelectedEvent> = new EventEmitter<NodeMenuItemSelectedEvent>();
public availableMenuItems: NodeMenuItem[] = [
{
name: 'New Document',
action: NodeMenuItemAction.NewTag,
cssClass: 'new-tag'
},
{
name: 'New Folder',
action: NodeMenuItemAction.NewFolder,
cssClass: 'new-folder'
},
{
name: 'Rename',
action: NodeMenuItemAction.Rename,
cssClass: 'rename'
},
{
name: 'Remove',
action: NodeMenuItemAction.Remove,
cssClass: 'remove'
}
];
private disposersForGlobalListeners: Function[] = [];
public constructor( private renderer: Renderer,
private nodeMenuService: NodeMenuService) {
}
public ngOnInit(): void {
this.disposersForGlobalListeners.push(this.renderer.listenGlobal('document', 'keyup', this.closeMenu.bind(this)));
this.disposersForGlobalListeners.push(this.renderer.listenGlobal('document', 'click', this.closeMenu.bind(this)));
}
public ngOnDestroy(): void {
this.disposersForGlobalListeners.forEach((dispose: Function) => dispose());
}
public onMenuItemSelected(e: MouseEvent, selectedMenuItem: NodeMenuItem): void {
if (isLeftButtonClicked(e)) {
this.menuItemSelected.emit({nodeMenuItemAction: selectedMenuItem.action});
}
}
private closeMenu(e: MouseEvent | KeyboardEvent): void {
const mouseClicked = e instanceof MouseEvent;
if (mouseClicked || isEscapePressed(e as KeyboardEvent)) {
this.nodeMenuService.fireMenuEvent(e.target as HTMLElement, NodeMenuAction.Close);
}
}
}
export interface NodeMenuItem {
name: string;
action: NodeMenuItemAction;
cssClass: string;
}