request asObservable()
This commit is contained in:
@@ -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[]>>;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user