From 3cf70a1b3c95feff3e13e1a4d2cbe64709e0ad2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 3 Feb 2023 15:34:32 +0100 Subject: [PATCH] request asObservable() --- .../repository/tree-repository.interface.ts | 3 + .../repository/document.repository.ts | 6 +- .../shared/collection/collection.context.ts | 36 +++--- .../repository/template.repository.ts | 16 ++- .../tree/data/template.tree.repository.ts | 103 ------------------ .../tree/data/template.tree.store.ts | 4 +- 6 files changed, 37 insertions(+), 131 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.repository.ts diff --git a/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts index 71e839c0dd..d23723eb3f 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts @@ -6,14 +6,17 @@ export interface UmbTreeRepository { requestRootTreeItems: () => Promise<{ data: PagedEntityTreeItem | undefined; error: ProblemDetails | undefined; + asObservable?: () => Observable; }>; requestTreeItemsOf: (parentKey: string | null) => Promise<{ data: PagedEntityTreeItem | undefined; error: ProblemDetails | undefined; + asObservable?: () => Observable; }>; requestTreeItems: (keys: string[]) => Promise<{ data: Array | undefined; error: ProblemDetails | undefined; + asObservable?: () => Observable; }>; rootTreeItems: () => Promise>; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts index 4409ff3aec..1c384a3af4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts @@ -64,7 +64,7 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailReposi this.#treeStore?.appendItems(data.items); } - return { data, error }; + return { data, error, asObservable: () => this.#treeStore!.rootItems }; } async requestTreeItemsOf(parentKey: string | null) { @@ -81,7 +81,7 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailReposi this.#treeStore?.appendItems(data.items); } - return { data, error }; + return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentKey) }; } async requestTreeItems(keys: Array) { @@ -94,7 +94,7 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailReposi const { data, error } = await this.#treeSource.getItems(keys); - return { data, error }; + return { data, error, asObservable: () => this.#treeStore!.items(keys) }; } async rootTreeItems() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts index 4c4ac87e92..796fc886f2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts @@ -47,7 +47,6 @@ export class UmbCollectionContext< this._onStoreSubscription(); }); } else if (repositoryAlias) { - console.log("has repo alias:", repositoryAlias); new UmbObserverController(this._host, umbExtensionsRegistry.getByTypeAndAlias('repository', repositoryAlias), async (repositoryManifest) => { @@ -111,26 +110,31 @@ export class UmbCollectionContext< if (this._entityKey) { // TODO: we should be able to get an observable from this call. either return a observable or a asObservable() method. - this.#repository.requestTreeItemsOf(this._entityKey); + const observable = (await this.#repository.requestTreeItemsOf(this._entityKey)).asObservable?.(); - this._dataObserver = new UmbObserverController( - this._host, - await this.#repository.treeItemsOf(this._entityKey), - (nodes) => { - if (nodes) { - this.#data.next(nodes); + if(observable) { + this._dataObserver = new UmbObserverController( + this._host, + observable, + (nodes) => { + if (nodes) { + this.#data.next(nodes); + } } - } - ); + ); + } } else { - this.#repository.requestRootTreeItems() - this._dataObserver = new UmbObserverController(this._host, await this.#repository.rootTreeItems(), (nodes) => { - if (nodes) { - this.#data.next(nodes); - } - }); + const observable = (await this.#repository.requestRootTreeItems()).asObservable?.(); + + if(observable) { + this._dataObserver = new UmbObserverController(this._host, observable, (nodes) => { + if (nodes) { + this.#data.next(nodes); + } + }); + } } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts index be80a176d7..67d02f4938 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts @@ -55,6 +55,8 @@ export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailReposi // TREE: + + async requestRootTreeItems() { await this.#init; @@ -64,14 +66,15 @@ export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailReposi this.#treeStore?.appendItems(data.items); } - return { data, error }; + return { data, error, asObservable: () => this.#treeStore!.rootItems }; } async requestTreeItemsOf(parentKey: string | null) { await this.#init; if (!parentKey) { - throw new Error('Parent key is missing'); + const error: ProblemDetails = { title: 'Parent key is missing' }; + return { data: undefined, error }; } const { data, error } = await this.#treeDataSource.getChildrenOf(parentKey); @@ -80,24 +83,25 @@ export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailReposi this.#treeStore?.appendItems(data.items); } - return { data, error }; + return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentKey) }; } async requestTreeItems(keys: Array) { await this.#init; if (!keys) { - throw new Error('Keys is missing'); + const error: ProblemDetails = { title: 'Keys are missing' }; + return { data: undefined, error }; } const { data, error } = await this.#treeDataSource.getItems(keys); - return { data, error }; + return { data, error, asObservable: () => this.#treeStore!.items(keys) }; } async rootTreeItems() { await this.#init; - return this.#treeStore!.rootItems(); + return this.#treeStore!.rootItems; } async treeItemsOf(parentKey: string | null) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.repository.ts deleted file mode 100644 index 66b511b1be..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.repository.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { TemplateTreeServerDataSource } from './sources/template.tree.server.data'; -import { UmbTemplateTreeStore, UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN } from './template.tree.store'; -import { UmbControllerHostInterface } from '@umbraco-cms/controller'; -import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification'; -import { UmbContextConsumerController } from '@umbraco-cms/context-api'; -import { ProblemDetails } from '@umbraco-cms/backend-api'; - -// Move to documentation / JSdoc -/* We need to create a new instance of the repository from within the element context. We want the notifications to be displayed in the right context. */ -// element -> context -> repository -> (store) -> data source -// All methods should be async and return a promise. Some methods might return an observable as part of the promise response. -export class UmbTemplateTreeRepository implements UmbTreeRepository { - #host: UmbControllerHostInterface; - #dataSource: TemplateTreeServerDataSource; - #treeStore?: UmbTemplateTreeStore; - #notificationService?: UmbNotificationService; - #initResolver?: () => void; - #initialized = false; - - constructor(host: UmbControllerHostInterface) { - this.#host = host; - // TODO: figure out how spin up get the correct data source - this.#dataSource = new TemplateTreeServerDataSource(this.#host); - - new UmbContextConsumerController(this.#host, UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN, (instance) => { - this.#treeStore = instance; - this.#checkIfInitialized(); - }); - - new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => { - this.#notificationService = instance; - this.#checkIfInitialized(); - }); - } - - #init = new Promise((resolve) => { - this.#initialized ? resolve() : (this.#initResolver = resolve); - }); - - #checkIfInitialized() { - if (this.#treeStore && this.#notificationService) { - this.#initialized = true; - this.#initResolver?.(); - } - } - - async requestRootItems() { - await this.#init; - - const { data, error } = await this.#dataSource.getRootItems(); - - if (data) { - this.#treeStore?.appendItems(data.items); - } - - return { data, error }; - } - - async requestChildrenOf(parentKey: string | null) { - await this.#init; - - if (!parentKey) { - const error: ProblemDetails = { title: 'Parent key is missing' }; - return { data: undefined, error }; - } - - const { data, error } = await this.#dataSource.getChildrenOf(parentKey); - - if (data) { - this.#treeStore?.appendItems(data.items); - } - - return { data, error }; - } - - async requestItems(keys: Array) { - await this.#init; - - if (!keys) { - const error: ProblemDetails = { title: 'Keys are missing' }; - return { data: undefined, error }; - } - - const { data, error } = await this.#dataSource.getItems(keys); - - return { data, error }; - } - - async rootItems() { - await this.#init; - return this.#treeStore!.rootItems(); - } - - async childrenOf(parentKey: string | null) { - await this.#init; - return this.#treeStore!.childrenOf(parentKey); - } - - async items(keys: Array) { - await this.#init; - return this.#treeStore!.items(keys); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.store.ts index c9bbaaafba..f998a52d9b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.store.ts @@ -65,9 +65,7 @@ export class UmbTemplateTreeStore extends UmbStoreBase { * @return {*} * @memberof UmbTemplateTreeStore */ - rootItems() { - return this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === null)); - } + rootItems = this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === null)); /** * Returns an observable to observe the children of a given parent