From 14828f569ee30e7f586cf50396ff974699503ae7 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 14 Nov 2023 10:05:42 +0100 Subject: [PATCH] add base class for entity tree repository --- .../core/tree/entity-tree.repository.ts | 77 +++++++++++++++++++ .../src/packages/core/tree/index.ts | 3 + 2 files changed, 80 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree.repository.ts new file mode 100644 index 0000000000..9d7e65c4cf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree.repository.ts @@ -0,0 +1,77 @@ +import { UmbTreeStore } from '../store/tree-store.interface.js'; +import { type UmbEntityTreeItemModel } from './types.js'; +import { + type UmbTreeRepository, + type UmbTreeDataSource, + UmbRepositoryBase, + UmbTreeDataSourceConstructor, +} from '@umbraco-cms/backoffice/repository'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export class UmbEntityTreeRepositoryBase + extends UmbRepositoryBase + implements UmbTreeRepository, UmbApi +{ + protected _init: Promise; + protected _treeStore?: UmbTreeStore; + #treeSource: UmbTreeDataSource; + + constructor( + host: UmbControllerHost, + treeSource: UmbTreeDataSourceConstructor, + treeStoreContextAlias: string | UmbContextToken, + ) { + super(host); + this.#treeSource = new treeSource(this); + + this._init = this.consumeContext(treeStoreContextAlias, (instance) => { + this._treeStore = instance as UmbTreeStore; + }).asPromise(); + } + + async requestTreeRoot() { + await this._init; + + const { data, error } = await this.#treeSource.getTreeRoot(); + + return { data, error }; + } + + async requestRootTreeItems() { + await this._init; + + const { data, error } = await this.#treeSource.getRootItems(); + + if (data) { + this._treeStore!.appendItems(data.items); + } + + return { data, error, asObservable: () => this._treeStore!.rootItems }; + } + + async requestTreeItemsOf(parentId: string | null) { + if (parentId === undefined) throw new Error('Parent id is missing'); + await this._init; + + const { data, error } = await this.#treeSource.getChildrenOf(parentId); + + if (data) { + this._treeStore!.appendItems(data.items); + } + + return { data, error, asObservable: () => this._treeStore!.childrenOf(parentId) }; + } + + async rootTreeItems() { + await this._init; + return this._treeStore!.rootItems; + } + + async treeItemsOf(parentId: string | null) { + if (parentId === undefined) throw new Error('Parent id is missing'); + await this._init; + return this._treeStore!.childrenOf(parentId); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts index 59a6bca6f3..0d443ef3f4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts @@ -5,6 +5,9 @@ export * from './tree-item-base/index.js'; export * from './tree-menu-item/index.js'; export * from './tree.context.js'; export * from './tree.element.js'; +export * from './types.js'; + +export { UmbEntityTreeRepositoryBase } from './entity-tree.repository.js'; export interface UmbTreeRootModel { type: string;