From 94b4d1073b46800df67a87551559b5ae8f81c84e Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Sun, 21 Jun 2020 03:04:23 +0300 Subject: [PATCH] feat: add find method to abstract tree service --- .../core/src/lib/services/routes.service.ts | 7 +++++++ .../core/src/lib/tests/routes.service.spec.ts | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts index 083f10c8a4..bf3917f5cd 100644 --- a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts @@ -77,6 +77,13 @@ export abstract class AbstractTreeService { return this.publish(flatItems, visibleItems); } + find(predicate: (item: TreeNode) => boolean, tree = this.tree) { + return tree.reduce( + (acc, node) => (acc ? acc : predicate(node) ? node : this.find(predicate, node.children)), + null, + ); + } + patch(identifier: string, props: Partial): T[] | false { const flatItems = this._flat$.value; const index = flatItems.findIndex(item => item[this.id] === identifier); diff --git a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts index 5b15653e91..ffb5c8b2f0 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts @@ -52,6 +52,22 @@ describe('Routes Service', () => { }); }); + describe('#find', () => { + it('should return node found based on query', () => { + service.add(routes); + const result = service.find(route => route.invisible); + expect(result.name).toBe('bar'); + expect(result.children.length).toBe(1); + expect(result.children[0].name).toBe('baz'); + }); + + it('should return null when query is not found', () => { + service.add(routes); + const result = service.find(route => route.requiredPolicy === 'X'); + expect(result).toBe(null); + }); + }); + describe('#remove', () => { it('should remove routes based on given routeNames', () => { service.add(routes);