From d55ff00a303ac908c29a238089c6c0103f7c0411 Mon Sep 17 00:00:00 2001 From: bnymncoskuner Date: Tue, 15 Sep 2020 17:05:49 +0300 Subject: [PATCH 1/2] feat: add handleUpdate to tree adapter --- .../tree/src/lib/utils/nz-tree-adapter.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 index 6c66315e69..ebabd201b0 100644 --- 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 @@ -48,7 +48,18 @@ export class TreeAdapter { } handleRemove({ key }: TreeNode) { - this.tree = createTreeFromList(this.list.filter(item => item.id !== key)); + this.updateTreeFromList(this.list.filter(item => item.id !== key)); + } + + handleUpdate({ key, children }: { key: string; children: T[] }) { + // remove current children and update tree + this.updateTreeFromList(this.list.filter(item => item.parentId !== key)); + // add new children and update tree + this.updateTreeFromList(this.list.concat(children)); + } + + updateTreeFromList(list: T[]) { + this.tree = createTreeFromList(list); this.list = createListFromTree(this.tree); } } From 494e2dba9132bf901527fcc859c2d7005a7ccbb6 Mon Sep 17 00:00:00 2001 From: bnymncoskuner Date: Wed, 16 Sep 2020 09:22:59 +0300 Subject: [PATCH 2/2] chore: add explanation to handleUpdate --- .../tree/src/lib/utils/nz-tree-adapter.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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 index ebabd201b0..d5d32f0146 100644 --- 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 @@ -52,15 +52,22 @@ export class TreeAdapter { } handleUpdate({ key, children }: { key: string; children: T[] }) { - // remove current children and update tree - this.updateTreeFromList(this.list.filter(item => item.parentId !== key)); - // add new children and update tree - this.updateTreeFromList(this.list.concat(children)); + /** + * When we need to update a node with new children, first we need to remove any descendant nodes. + * If we remove immediate children and create a new tree, any other descendant nodes will be removed + * and we won't need to recursively remove sub children. + * Then, you simply add back the new children and create a new tree. + */ + const listWithDescendantNodesRemoved = this.updateTreeFromList( + this.list.filter(item => item.parentId !== key), + ); + this.updateTreeFromList(listWithDescendantNodesRemoved.concat(children)); } updateTreeFromList(list: T[]) { this.tree = createTreeFromList(list); this.list = createListFromTree(this.tree); + return this.list; } }