From 0cf00634a02cd9d1b6c985320d728f73345d855b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 20 Dec 2022 13:34:18 +0100 Subject: [PATCH] UmbContentStoreBase --- .../workspace-content.context.ts | 36 +++++++++++++++++++ .../workspace-with-store.context.ts | 10 +++--- .../core/stores/document/document.store.ts | 4 +-- .../src/core/stores/store.ts | 20 +++++++++++ 4 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/workspaces/shared/workspace-content/workspace-content.context.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/workspaces/shared/workspace-content/workspace-content.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/workspaces/shared/workspace-content/workspace-content.context.ts new file mode 100644 index 0000000000..76e11b62b0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/workspaces/shared/workspace-content/workspace-content.context.ts @@ -0,0 +1,36 @@ + +import { UmbWorkspaceWithStoreContext } from "../workspace-context/workspace-with-store.context"; +import type { DocumentDetails } from "@umbraco-cms/models"; +import { UmbContentStoreBase } from "@umbraco-cms/stores/store"; +import { UmbNotificationDefaultData } from "@umbraco-cms/services"; + +export class UmbWorkspaceContentContext> extends UmbWorkspaceWithStoreContext { + + constructor(target:HTMLElement, defaultData:ContentTypeType, storeAlias:string, entityType: string, entityKey: string) { + super(target, defaultData, storeAlias, entityType, entityKey); + } + + + protected _observeStore(): void { + this._dataObserver = this._store.getByKey(this.entityKey).subscribe((content) => { + if (!content) return; // TODO: Handle nicely if there is no content data. + this.update(content as any); + }); + } + + + + public save() { + this._store.save([this.getData()]).then(() => { + const data: UmbNotificationDefaultData = { message: 'Document Saved' }; + this._notificationService?.peek('positive', { data }); + }).catch(() => { + const data: UmbNotificationDefaultData = { message: 'Failed to save Document' }; + this._notificationService?.peek('danger', { data }); + }); + } + + // TODO: trash? + +} + diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/workspaces/shared/workspace-context/workspace-with-store.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/workspaces/shared/workspace-context/workspace-with-store.context.ts index 2544e7a6b7..eaf5e0a0f8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/workspaces/shared/workspace-context/workspace-with-store.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/workspaces/shared/workspace-context/workspace-with-store.context.ts @@ -5,14 +5,14 @@ import type { DocumentDetails } from "@umbraco-cms/models"; import { UmbNotificationService } from "@umbraco-cms/services"; import { UmbDataStoreBase } from "@umbraco-cms/stores/store"; -export abstract class UmbWorkspaceWithStoreContext extends UmbWorkspaceContext { +export abstract class UmbWorkspaceWithStoreContext> extends UmbWorkspaceContext { protected _notificationConsumer!:UmbContextConsumer; protected _notificationService?: UmbNotificationService; protected _storeConsumer!:UmbContextConsumer; - protected _store!: UmbDataStoreBase; // TODO: Double check its right to assume it here, at least from a type perspective? + protected _store!: StoreType; // TODO: Double check its right to assume it here, at least from a type perspective? protected _dataObserver?:Subscription; @@ -20,7 +20,7 @@ export abstract class UmbWorkspaceWithStoreContext ex public entityKey:string; - constructor(target:HTMLElement, defaultData:T, storeAlias:string, entityType: string, entityKey: string) { + constructor(target:HTMLElement, defaultData:DataType, storeAlias:string, entityType: string, entityKey: string) { super(target, defaultData) this.entityType = entityType; this.entityKey = entityKey; @@ -30,7 +30,7 @@ export abstract class UmbWorkspaceWithStoreContext ex }); // TODO: consider if store alias should be configurable of manifest: - this._storeConsumer = new UmbContextConsumer(this._target, storeAlias, (_instance: UmbDataStoreBase) => { + this._storeConsumer = new UmbContextConsumer(this._target, storeAlias, (_instance: UmbDataStoreBase) => { this._store = _instance; if(!this._store) { // TODO: if we keep the type assumption of _store existing, then we should here make sure to break the application in a good way. @@ -59,7 +59,7 @@ export abstract class UmbWorkspaceWithStoreContext ex }*/ - public getStore():UmbDataStoreBase { + public getStore():UmbDataStoreBase { return this._store; } diff --git a/src/Umbraco.Web.UI.Client/src/core/stores/document/document.store.ts b/src/Umbraco.Web.UI.Client/src/core/stores/document/document.store.ts index 105c5b6206..a1c50d0e63 100644 --- a/src/Umbraco.Web.UI.Client/src/core/stores/document/document.store.ts +++ b/src/Umbraco.Web.UI.Client/src/core/stores/document/document.store.ts @@ -1,5 +1,5 @@ import { map, Observable } from 'rxjs'; -import { UmbDataStoreBase } from '../store'; +import { UmbContentStoreBase } from '../store'; import type { DocumentDetails } from '@umbraco-cms/models'; import { ApiError, DocumentResource, DocumentTreeItem, FolderTreeItem, ProblemDetails } from '@umbraco-cms/backend-api'; @@ -13,7 +13,7 @@ const isDocumentDetails = (document: DocumentDetails | DocumentTreeItem): docume * @extends {UmbDocumentStoreBase} * @description - Data Store for Documents */ -export class UmbDocumentStore extends UmbDataStoreBase { +export class UmbDocumentStore extends UmbContentStoreBase { getByKey(key: string): Observable { // TODO: use backend cli when available. fetch(`/umbraco/management/api/v1/document/details/${key}`) diff --git a/src/Umbraco.Web.UI.Client/src/core/stores/store.ts b/src/Umbraco.Web.UI.Client/src/core/stores/store.ts index 58cd323532..7bcf532771 100644 --- a/src/Umbraco.Web.UI.Client/src/core/stores/store.ts +++ b/src/Umbraco.Web.UI.Client/src/core/stores/store.ts @@ -73,3 +73,23 @@ export abstract class UmbDataStoreBase implem this._items.next([...storedItems]); } } + + +/** + * @export + * @class UmbContentStoreBase + * @implements {UmbDataStore} + * @template T + * @description - Base class for Data Stores + */ +export abstract class UmbContentStoreBase extends UmbDataStoreBase { + + /** + * @description - Save data. + * @param {object} data + * @return {*} {(Promise)} + * @memberof UmbContentStoreBase + */ + abstract save(data: T[]): Promise + +}