Tree component display tree structure
npm install @rign/angular2-treeSimple component to display tree structure
![npm (scoped)]()



npm i @rign/angular2-tree --save
It also require to install dependencies:
* @angular/animations
* @angular/cdk
* @angular/common
* @angular/core
* @angular/forms
* @angular/http
* @ngrx/core
* @ngrx/effects
* @ngrx/store
* @ngrx/store-devtools
* angular2-uuid
* bootstrap
* core-js
* font-awesome
* lodash.isequal
* ng2-dnd
* ngx-contextmenu
* rxjs
* zone.js
You can install them using below command:
npm i @angular/cdk @angular/common @angular/core @angular/forms @angular/http @ngrx/core @ngrx/effects @ngrx/store angular2-uuid bootstrap core-js font-awesome lodash.isequal ng2-dnd ngx-contextmenu rxjs zone.js --save
@Injectable()
export class AppNodeService extends NodeService {
public get treeId(): string {
return 'tree3';
}
protected apiConfig = {
addUrl: '/api/nodes',
getUrl: '/api/nodes',
updateUrl: '/api/nodes',
removeUrl: '/api/nodes',
}
}
and use it to load/save/delete/etc. your node data. Or you can extend and rewrite all methods of that service to store your data wherever you want. See example _localStorage.service.ts_
Include _TreeModule_ in your application module and create Store with empty state and initialize Effects. Do not forget to pass yours _AppNodesService_ as a parameter of _TreeModule_.
import {TreeModule} from '@rign/angular2-tree';
@NgModule({
declarations: [
...
],
imports: [
...
TreeModule.forRoot(AppNodeService),
EffectsModule.forRoot([]),
StoreModule.forRoot({})
]
})
You need also init animations module, because Tree needs it to animate expanding and collapsing node.
@NgModule({
declarations: [
...
],
imports: [
...
BrowserAnimationsModule,
TreeModule.forRoot()
]
})
In any html file put
In component where you create tree, you should create _TreeModel_ passing _configuration_ and _AppNodeService_.
export class MyTreeComponent implements OnInit {
public folders: Observable
public contextMenu: IContextMenu[] = [];
public treeConfiguration: IConfiguration = {
showAddButton: true,
disableMoveNodes: false,
treeId: 'tree3',
dragZone: 'tree3',
dropZone: ['tree3'],
isAnimation: true // add animation to action "expand" and "collapse"
};
public treeModel: TreeModel;
public constructor(private treeInitializerService: TreeInitializerService,
private appNodeService: AppNodeService) {
}
public ngOnInit(): void {
const nodes: IOuterNode[] = JSON.parse(localStorage.getItem('treeOne')) || [];
this.treeModel = this.treeInitializerService.init(this.treeConfiguration, this.appNodeService, nodes);
}
}
If function _init_ has got third parameter - array of nodes, then the tree will be marked as fully loaded. It will not use _load API_ function to get new subnodes it will use only passed nodes.
To load default CSS styles and makes our tree looks nice you have to add 2 CSS files to your _angular-cli.json_ file:
...
"styles": [
"../node_modules/bootstrap/dist/css/bootstrap.css",
"../node_modules/font-awesome/css/font-awesome.css",
"styles.css"
],
Also you can use your own template to display items. You can do that when you extend _ItemComponent_
@Component({
selector: 'new-tree-item',
templateUrl: './newItem.component.html',
styleUrls: ['./newItem.component.scss']
})
export class NewItemComponent extends ItemComponent {
}
and _newItem.component.html_
[ngClass]="{'tree-item-selected': isSelected}"
Then when you create tree component in your application use such construction
[treeModel]="treeModel"
[isSelected]="treeModel.isSelected(node)"
[isExpanded]="treeModel.isExpanded(node)"
[contextMenu]="contextMenu">
and that is all. Please see Demo where is such example.
If you would like to open some path at the begin you can do that invoking such method after creating _TreeModel_.
this.treeModel.initPath([
// list of node ids sorted by level of node (grandparent id, parent id, child id)
]);
From version 3.0.1 there is possibility to display current selected node path. To do that place in your component html file such code:
The _treeModel_ value is the same object that is used in _ri-tree_.
Using _ngrx/store_ you can listen on below actions and do whatever you want:
TreeActionTypes.TREE_SAVE_NODE
TreeActionTypes.TREE_SAVE_NODE_ERROR
TreeActionTypes.TREE_SAVE_NODE_SUCCESS
TreeActionTypes.TREE_DELETE_NODE
TreeActionTypes.TREE_DELETE_NODE_ERROR
TreeActionTypes.TREE_DELETE_NODE_SUCCESS
TreeActionTypes.TREE_EDIT_NODE_START
TreeActionTypes.TREE_EXPAND_NODE
TreeActionTypes.TREE_LOAD
TreeActionTypes.TREE_LOAD_ERROR
TreeActionTypes.TREE_LOAD_SUCCESS
TreeActionTypes.TREE_LOAD_PATH
TreeActionTypes.TREE_MOVE_NODE
TreeActionTypes.TREE_MOVE_NODE_ERROR
TreeActionTypes.TREE_MOVE_NODE_SUCCESS
TreeActionTypes.TREE_REGISTER
TreeActionTypes.TREE_SET_ALL_NODES
TreeActionTypes.TREE_SELECT_NODE
From version 5.0.0 translation dependency is removed from _@rign/angular2-tree_. Now you have to create service which implements ITreeTranslation interface:
import {ITreeTranslations} from '@rign/angular2-tree';
export class TreeTranslationService implements ITreeTranslations {
readonly RI_TREE_LBL_ADD_NODE = 'Add data';
readonly RI_TREE_LBL_EDIT_NODE = 'Edit data';
readonly RI_TREE_LBL_REMOVE_NODE = 'Delete data';
readonly RI_TREE_LBL_DROP_ZONE = 'Drop here to move data to root level';
}
and set is as provider in module which use _TreeModule_
providers: [
TreeOneNodeService,
{provide: TREE_TRANSLATION_TOKEN, useClass: TreeTranslationService},
]
In such case you can use your own translation module and its implementation or even if you don't use translations in your app, you don't have to import additional dependency.
Now you have new possibilities to move different elements to the tree (files or other data). To do that, you have to use _riDraggable_ directive in following way
Then you have to create _@Effects_ similar to that one in _treeEffects.service_or create only Observable and subscribe to it.
@Effect() move$ = this.actions$
.pipe(
ofType(TreeActionTypes.TREE_MOVE_NODE),
filter((action: ITreeAction) => {
return action.payload.sourceOfDroppedData === DragAndDrop.DROP_DATA_TYPE;
})
)
...
but you have to replace
ofType(TreeActionTypes.TREE_MOVE_NODE)
to
ofType('YOUR_SOURCE_TYPE')
At the end do not forget to add this effects to your app.
* use ngrx/store
* remove events ITreeItemEvents - use Actions and Effects
* remove NodeModel
* simplify using tree
* fix package.json
* allow to create own template for tree item (if not specify it use default) - look in demo
* input option _disableContextMenu_ to disable context menu (default: false)
* update Demo - add alternative view of tree
* remove API config service (see section _Usage_)
* change name FolderService to NodeService
* change params names from _dirId_ to _nodeId_
* now you can use in your API paths parameter _{nodeId}_ which will be replaced on _nodeId_
* expose _ConfigService_ - it allow override urls for create, edit, and delete folder
* upgrade angular/cli to version _beta.32.3_
* fix demo
* primary version with all features described below.
Working demo with _local storage_ you can find here.
To run Demo locally clone this repository and run
ng start --project=tree-example
Licensed under MIT.