import { Component, Injector, Input } from '@angular/core';
import { AppComponentBase } from '@shared/common/app-component-base';
import { OrganizationUnitDto } from '@shared/service-proxies/service-proxies';
import { ArrayToTreeConverterService } from '@shared/utils/array-to-tree-converter.service';
import { TreeDataHelperService } from '@shared/utils/tree-data-helper.service';
import { TreeNode } from 'primeng/api';
import * as _ from 'lodash';
export interface IOrganizationUnitsTreeComponentData {
allOrganizationUnits: OrganizationUnitDto[];
selectedOrganizationUnits: string[];
}
@Component({
selector: 'organization-unit-tree',
template:
`
`
})
export class OrganizationUnitsTreeComponent extends AppComponentBase {
@Input() cascadeSelectEnabled = true;
set data(data: IOrganizationUnitsTreeComponentData) {
this.setTreeData(data.allOrganizationUnits);
this.setSelectedNodes(data.selectedOrganizationUnits);
this._allOrganizationUnits = data.allOrganizationUnits;
this._selectedOrganizationUnits = data.selectedOrganizationUnits;
}
treeData: any;
selectedOus: TreeNode[] = [];
private _allOrganizationUnits: OrganizationUnitDto[];
private _selectedOrganizationUnits: string[];
filter = '';
constructor(
private _arrayToTreeConverterService: ArrayToTreeConverterService,
private _treeDataHelperService: TreeDataHelperService,
injector: Injector
) {
super(injector);
}
setTreeData(organizationUnits: OrganizationUnitDto[]) {
this.treeData = this._arrayToTreeConverterService.createTree(organizationUnits, 'parentId', 'id', null, 'children',
[{
target: 'label',
source: 'displayName'
}, {
target: 'expandedIcon',
value: 'fa fa-folder-open m--font-warning'
},
{
target: 'collapsedIcon',
value: 'fa fa-folder m--font-warning'
},
{
target: 'expanded',
value: true
}]);
}
setSelectedNodes(selectedOrganizationUnits: string[]) {
this.selectedOus = [];
_.forEach(selectedOrganizationUnits, ou => {
let item = this._treeDataHelperService.findNode(this.treeData, { data: { code: ou } });
if (item) {
this.selectedOus.push(item);
}
});
}
getSelectedOrganizations(): number[] {
if (!this.selectedOus) {
return [];
}
let organizationIds = [];
_.forEach(this.selectedOus, ou => {
organizationIds.push(ou.data.id);
});
return organizationIds;
}
filterOrganizationUnit(nodes, filterText): any {
_.forEach(nodes, node => {
if (node.data.displayName.toLowerCase().indexOf(filterText.toLowerCase()) >= 0) {
node.styleClass =
this.showParentNodes(node);
} else {
node.styleClass = 'hidden-tree-node';
}
if (node.children) {
this.filterOrganizationUnit(node.children, filterText);
}
});
}
showParentNodes(node): void {
if (!node.parent) {
return;
}
node.parent.styleClass = '';
this.showParentNodes(node.parent);
}
filterOrganizationUnits(event): void {
this.filterOrganizationUnit(this.treeData, this.filter);
}
nodeSelect(event) {
if (!this.cascadeSelectEnabled) {
return;
}
let parentNode = this._treeDataHelperService.findParent(this.treeData, { data: { id: event.node.data.id } });
while (parentNode != null) {
this.selectedOus.push(parentNode);
parentNode = this._treeDataHelperService.findParent(this.treeData, { data: { id: parentNode.data.id } });
}
}
onNodeUnselect(event) {
let childrenNodes = this._treeDataHelperService.findChildren(this.treeData, { data: { name: event.node.data.name } });
childrenNodes.push(event.node.data.name);
_.remove(this.selectedOus, x => childrenNodes.indexOf(x.data.name) !== -1);
}
}