request asObservable()

This commit is contained in:
Niels Lyngsø
2023-02-03 15:34:32 +01:00
parent 425794952a
commit 3cf70a1b3c
6 changed files with 37 additions and 131 deletions

View File

@@ -6,14 +6,17 @@ export interface UmbTreeRepository {
requestRootTreeItems: () => Promise<{
data: PagedEntityTreeItem | undefined;
error: ProblemDetails | undefined;
asObservable?: () => Observable<EntityTreeItem[]>;
}>;
requestTreeItemsOf: (parentKey: string | null) => Promise<{
data: PagedEntityTreeItem | undefined;
error: ProblemDetails | undefined;
asObservable?: () => Observable<EntityTreeItem[]>;
}>;
requestTreeItems: (keys: string[]) => Promise<{
data: Array<EntityTreeItem> | undefined;
error: ProblemDetails | undefined;
asObservable?: () => Observable<EntityTreeItem[]>;
}>;
rootTreeItems: () => Promise<Observable<EntityTreeItem[]>>;

View File

@@ -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<string>) {
@@ -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() {

View File

@@ -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);
}
});
}
}
}

View File

@@ -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<string>) {
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) {

View File

@@ -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<void>((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<string>) {
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<string>) {
await this.#init;
return this.#treeStore!.items(keys);
}
}

View File

@@ -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