ng2-tree-pms
Version:
angular2 component for visualizing data that can be naturally represented as a tree
57 lines (47 loc) • 2.22 kB
text/typescript
import {
NodeRemovedEvent,
NodeRenamedEvent,
NodeCreatedEvent,
NodeSelectedEvent,
NodeMovedEvent
} from './tree.events';
import { RenamableNode } from './tree.types';
import { Tree } from './tree';
import { Subject, Observable } from 'rxjs/Rx';
import { Injectable, Inject, ElementRef } from '@angular/core';
import { NodeDraggableService } from './draggable/node-draggable.service';
import { NodeDraggableEvent } from './draggable/draggable.events';
()
export class TreeService {
public nodeMoved$: Subject<NodeMovedEvent> = new Subject<NodeMovedEvent>();
public nodeRemoved$: Subject<NodeRemovedEvent> = new Subject<NodeRemovedEvent>();
public nodeRenamed$: Subject<NodeRenamedEvent> = new Subject<NodeRenamedEvent>();
public nodeCreated$: Subject<NodeCreatedEvent> = new Subject<NodeCreatedEvent>();
public nodeSelected$: Subject<NodeSelectedEvent> = new Subject<NodeSelectedEvent>();
public constructor((NodeDraggableService) private nodeDraggableService: NodeDraggableService) {
this.nodeRemoved$.subscribe((e: NodeRemovedEvent) => e.node.removeItselfFromParent());
}
public unselectStream(tree: Tree): Observable<any> {
return this.nodeSelected$.filter((e: NodeSelectedEvent) => tree !== e.node);
}
public fireNodeRemoved(tree: Tree): void {
this.nodeRemoved$.next(new NodeRemovedEvent(tree));
}
public fireNodeCreated(tree: Tree): void {
this.nodeCreated$.next(new NodeCreatedEvent(tree));
}
public fireNodeSelected(tree: Tree): void {
this.nodeSelected$.next(new NodeSelectedEvent(tree));
}
public fireNodeRenamed(oldValue: RenamableNode | string, tree: Tree): void {
this.nodeRenamed$.next(new NodeRenamedEvent(tree, oldValue, tree.value));
}
public fireNodeMoved(tree: Tree, parent: Tree): void {
this.nodeMoved$.next(new NodeMovedEvent(tree, parent));
}
public draggedStream(tree: Tree, element: ElementRef): Observable<NodeDraggableEvent> {
return this.nodeDraggableService.draggableNodeEvents$
.filter((e: NodeDraggableEvent) => e.target === element)
.filter((e: NodeDraggableEvent) => !e.captured.tree.hasChild(tree));
}
}