import { Component, Injector } from '@angular/core'; import { PermissionTreeEditModel } from '@app/admin/shared/permission-tree-edit.model'; import { AppComponentBase } from '@shared/common/app-component-base'; import { ArrayToTreeConverterService } from '@shared/utils/array-to-tree-converter.service'; import { TreeDataHelperService } from '@shared/utils/tree-data-helper.service'; import { FlatPermissionDto } from '@shared/service-proxies/service-proxies'; import { TreeNode } from 'primeng/api'; import * as _ from 'lodash'; @Component({ selector: 'permission-tree', template: `
` }) export class PermissionTreeComponent extends AppComponentBase { set editData(val: PermissionTreeEditModel) { this.setTreeData(val.permissions); this.setSelectedNodes(val.grantedPermissionNames); } treeData: any; selectedPermissions: TreeNode[] = []; filter = ''; constructor( private _arrayToTreeConverterService: ArrayToTreeConverterService, private _treeDataHelperService: TreeDataHelperService, injector: Injector ) { super(injector); } setTreeData(permissions: FlatPermissionDto[]) { this.treeData = this._arrayToTreeConverterService.createTree(permissions, 'parentName', 'name', 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(grantedPermissionNames: string[]) { this.selectedPermissions = []; _.forEach(grantedPermissionNames, permission => { let item = this._treeDataHelperService.findNode(this.treeData, { data: { name: permission } }); if (item) { this.selectedPermissions.push(item); } }); } getGrantedPermissionNames(): string[] { if (!this.selectedPermissions || !this.selectedPermissions.length) { return []; } let permissionNames = []; for (let i = 0; i < this.selectedPermissions.length; i++) { permissionNames.push(this.selectedPermissions[i].data.name); } return permissionNames; } nodeSelect(event) { let parentNode = this._treeDataHelperService.findParent(this.treeData, { data: { name: event.node.data.name } }); while (parentNode != null) { this.selectedPermissions.push(parentNode); parentNode = this._treeDataHelperService.findParent(this.treeData, { data: { name: parentNode.data.name } }); } } onNodeUnselect(event) { let childrenNodes = this._treeDataHelperService.findChildren(this.treeData, { data: { name: event.node.data.name } }); childrenNodes.push(event.node.data.name); _.remove(this.selectedPermissions, x => childrenNodes.indexOf(x.data.name) !== -1); } filterPermissions(event): void { this.filterPermission(this.treeData, this.filter); } filterPermission(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.filterPermission(node.children, filterText); } }); } showParentNodes(node): void { if (!node.parent) { return; } node.parent.styleClass = ''; this.showParentNodes(node.parent); } }