1- import { Input , Component , OnInit } from 'angular2/core' ;
1+ import { Input , Component , OnInit , EventEmitter , Output } from 'angular2/core' ;
22import { CORE_DIRECTIVES } from 'angular2/common' ;
33import { Ng2TreeService } from './ng2-tree.service' ;
4- import { EditableNodeDirective } from './editable-node.directive.ts' ;
4+ import { EditableNodeDirective } from './editable-node.directive' ;
5+ import { NodeMenuComponent } from "./node-menu.component" ;
6+ import { TreeStatus } from "./types" ;
57
68@Component ( {
79 selector : 'ng2-tree' ,
@@ -13,18 +15,17 @@ import {EditableNodeDirective} from './editable-node.directive.ts';
1315 <span class="node-value" *ngIf="!edit">{{tree.value}}</span>
1416 <input type="text" class="node-value" editable [nodeValue]="tree.value" (valueChanged)="applyNewValue($event, tree)" *ngIf="edit"/>
1517 </div>
16- <div class="node-menu" *ngIf="isMenuVisible">
17- <ul class="node-menu-content">
18- <li (click)="rename($event, tree)">Rename node</li>
19- <li (click)="addNode($event, tree)">Add node</li>
20- <li (click)="remove($event, tree)">Remove node</li>
21- </ul>
22- </div>
23- <ng2-tree *ngFor="#child of tree.children" [tree]="child"></ng2-tree>
18+
19+ <node-menu *ngIf="isMenuVisible"
20+ (removeSelected)="onRemoveSelected()"
21+ (renameSelected)="onRenameSelected()"
22+ (newSelected)="onNewSelected()"></node-menu>
23+
24+ <ng2-tree *ngFor="#child of tree.children" [tree]="child" (nodeRemoved)="onChildRemoved($event)"></ng2-tree>
2425 </li>
2526 </ul>
2627 ` ,
27- directives : [ EditableNodeDirective , Ng2Tree , CORE_DIRECTIVES ]
28+ directives : [ EditableNodeDirective , Ng2Tree , NodeMenuComponent , CORE_DIRECTIVES ]
2829} )
2930export class Ng2Tree implements OnInit {
3031 private static COMPONENT_TAG_NAME : string = 'NG2-TREE' ;
@@ -35,6 +36,9 @@ export class Ng2Tree implements OnInit {
3536 @Input ( )
3637 private tree : any ;
3738
39+ @Output ( )
40+ private nodeRemoved : EventEmitter < any > = new EventEmitter ( ) ;
41+
3842 private treeService : Ng2TreeService ;
3943 private isMenuVisible : boolean = false ;
4044 private edit : boolean = false ;
@@ -88,25 +92,28 @@ export class Ng2Tree implements OnInit {
8892 }
8993 }
9094
95+ private onRenameSelected ( ) {
96+ this . edit = true ;
97+ }
9198
92- private addNode ( $event : any , node : any ) {
93- if ( $event . which === 1 ) {
94- if ( ! node . children || ! node . children . push ) {
95- node . children = [ ] ;
96- }
97- node . children . push ( { value : '' , status : 'new' } ) ;
98- }
99+ private onRemoveSelected ( ) {
100+ this . nodeRemoved . emit ( { node : this . tree } ) ;
99101 }
100102
101- private rename ( $event : any , node : any ) {
102- if ( $event . which === 1 ) {
103- this . edit = true ;
103+ private onNewSelected ( ) {
104+ if ( ! this . tree . children || ! this . tree . children . push ) {
105+ this . tree . children = [ ] ;
104106 }
107+ this . tree . children . push ( { value : '' , status : TreeStatus . New } ) ;
105108 }
106109
107- private remove ( $event : any , node : any ) {
108- if ( $event . which === 1 ) {
109- this . treeService . emitRemoveEvent ( { node} ) ;
110+ private onChildRemoved ( event : any ) {
111+ for ( let i = 0 ; i < this . tree . children . length ; i ++ ) {
112+ const child = this . tree . children [ i ] ;
113+ if ( child === event . node ) {
114+ this . tree . children . splice ( i , 1 ) ;
115+ break ;
116+ }
110117 }
111118 }
112119
@@ -129,7 +136,7 @@ export class Ng2Tree implements OnInit {
129136 }
130137
131138 if ( ! $event . value ) {
132- return this . treeService . emitRemoveEvent ( { node} ) ;
139+ return this . nodeRemoved . emit ( { node : this . tree } ) ;
133140 }
134141
135142 this . previousEvent = $event . type ;
@@ -140,7 +147,7 @@ export class Ng2Tree implements OnInit {
140147 ngOnInit ( ) : void {
141148 if ( ! this . tree ) return ;
142149
143- if ( this . tree . status === 'new' ) {
150+ if ( this . tree . status === TreeStatus . New ) {
144151 this . edit = true ;
145152 }
146153
@@ -150,18 +157,5 @@ export class Ng2Tree implements OnInit {
150157 this . isMenuVisible = false ;
151158 }
152159 } ) ;
153-
154- this . treeService . removeNodeEventStream ( )
155- . subscribe ( removeEvent => {
156- if ( ! this . tree || ! this . tree . children ) return ;
157- for ( let i = 0 ; i < this . tree . children . length ; i ++ ) {
158- const child = this . tree . children [ i ] ;
159- if ( child === removeEvent . node ) {
160- delete this . tree . children [ i ] ;
161-
162- break ;
163- }
164- }
165- } ) ;
166160 }
167161}
0 commit comments