diff --git a/npm/ng-packs/packages/components/tree/src/lib/tree.module.ts b/npm/ng-packs/packages/components/tree/src/lib/tree.module.ts index 35e01e4006..f16ed0dd55 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/tree.module.ts +++ b/npm/ng-packs/packages/components/tree/src/lib/tree.module.ts @@ -1,11 +1,12 @@ import { NgModule } from '@angular/core'; - +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { NzTreeModule } from 'ng-zorro-antd/tree'; import { TreeComponent } from './components/tree.component'; +import { CommonModule } from '@angular/common'; @NgModule({ - imports: [], - exports: [], + imports: [CommonModule, NzTreeModule, NgbDropdownModule], + exports: [TreeComponent], declarations: [TreeComponent], - providers: [], }) export class TreeModule {} diff --git a/npm/ng-packs/packages/components/tree/src/lib/utils/nz-tree-adapter.ts b/npm/ng-packs/packages/components/tree/src/lib/utils/nz-tree-adapter.ts new file mode 100644 index 0000000000..5d042602e2 --- /dev/null +++ b/npm/ng-packs/packages/components/tree/src/lib/utils/nz-tree-adapter.ts @@ -0,0 +1,95 @@ +export abstract class BaseNode { + name?: string; + displayName?: string; + + constructor(public id: string, public parentId: string | null) {} +} + +class TreeNode extends BaseNode { + title: string | undefined; + key: string; + icon: string | null = null; + children: TreeNode[] = []; + isLeaf = true; + checked = false; + selected = false; + expanded = false; + selectable = true; + disabled = false; + disableCheckbox = false; + parentNode?: TreeNode | null; + + constructor(public entity: T, private nameResolver = ent => ent.displayName || ent.name) { + super(entity.id, entity.parentId); + this.key = entity.id; + this.title = nameResolver(entity); + } +} + +export class TreeAdapter { + private tree: TreeNode[]; + + constructor(private list: T[] = []) { + this.tree = createTreeFromList(this.list); + } + + getList() { + return this.list; + } + + getTree() { + return this.tree; + } + + handleDrop(node: TreeNode) { + const { key, parentNode } = node; + const index = this.list.findIndex(({ id }) => id === key); + this.list[index].parentId = parentNode ? parentNode.key : null; + this.tree = createTreeFromList(this.list); + } + + handleRemove(node: TreeNode) { + const { key, parentNode } = node; + this.list = this.list.filter(({ id, parentId }) => id !== key && parentId !== key); + this.tree = createTreeFromList(this.list); + } +} + +// UTILITY FUNCTIONS + +function createTreeFromList(list: T[]): TreeNode[] { + const map = createMapFromList(list); + const tree: TreeNode[] = []; + + list.forEach(row => { + const parentId = row.parentId; + const node = map.get(row.id); + if (parentId) { + const parent = map.get(parentId); + parent.children.push(node); + parent.isLeaf = false; + } else { + tree.push(node); + } + }); + + return tree; +} + +function createListFromTree(tree: TreeNode[], list: T[] = []): T[] { + tree.forEach(node => { + list.push({ ...node.entity, parentId: node.parentId }); + if (node.children) createListFromTree(node.children, list); + }); + + return list; +} + +function createMapFromList( + list: T[], + map = new Map>(), +): Map> { + list.forEach(row => map.set(row.id, new TreeNode(row))); + + return map; +} diff --git a/npm/ng-packs/packages/components/tree/src/public-api.ts b/npm/ng-packs/packages/components/tree/src/public-api.ts index e1e08f510b..df82ac0f93 100644 --- a/npm/ng-packs/packages/components/tree/src/public-api.ts +++ b/npm/ng-packs/packages/components/tree/src/public-api.ts @@ -1,2 +1,3 @@ export * from './lib/tree.module'; export * from './lib/components/tree.component'; +export * from './lib/utils/nz-tree-adapter';