From f575c4b22e13d92ddc2cd5d7ae06095a9431a080 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 30 Jan 2023 15:15:54 +0100 Subject: [PATCH] split up tree and detail --- .../libs/models/index.ts | 7 +++ .../src/backoffice/backoffice.element.ts | 4 +- .../templating/templates/data/index.ts | 22 ---------- .../templates/tree/data/sources/index.ts | 8 ++++ .../data/sources/template.tree.server.data.ts | 43 +++++++++++++++++++ .../{ => data}/template.tree.repository.ts | 6 +-- .../tree/{ => data}/template.tree.store.ts | 0 .../templating/templates/tree/manifests.ts | 2 +- .../templates/workspace/data/sources/index.ts | 10 +++++ .../sources/template.detail.server.data.ts} | 36 +--------------- .../data}/template.detail.repository.ts | 6 +-- .../data}/template.detail.store.ts | 0 .../workspace/template-workspace.context.ts | 14 +++--- 13 files changed, 86 insertions(+), 72 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/data/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/sources/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/sources/template.tree.server.data.ts rename src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/{ => data}/template.tree.repository.ts (93%) rename src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/{ => data}/template.tree.store.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/sources/index.ts rename src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/{data/template.server.ts => workspace/data/sources/template.detail.server.data.ts} (72%) rename src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/{ => workspace/data}/template.detail.repository.ts (94%) rename src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/{ => workspace/data}/template.detail.store.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/libs/models/index.ts b/src/Umbraco.Web.UI.Client/libs/models/index.ts index 3c43ea7c17..c11ad58bea 100644 --- a/src/Umbraco.Web.UI.Client/libs/models/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/models/index.ts @@ -149,3 +149,10 @@ export interface DocumentBlueprintDetails { icon: string; documentTypeKey: string; } + +export type DataSourceError = Record; + +export interface DataSourceResponse { + data?: T; + error?: DataSourceError; +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts index c64cd3fa2e..70ae113c0b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts @@ -32,8 +32,8 @@ import { UmbDocumentBlueprintDetailStore } from './documents/document-blueprints import { UmbDocumentBlueprintTreeStore } from './documents/document-blueprints/document-blueprint.tree.store'; import { UmbDataTypeDetailStore } from './settings/data-types/data-type.detail.store'; import { UmbDataTypeTreeStore } from './settings/data-types/tree/data-type.tree.store'; -import { UmbTemplateTreeStore } from './templating/templates/tree/template.tree.store'; -import { UmbTemplateDetailStore } from './templating/templates/template.detail.store'; +import { UmbTemplateTreeStore } from './templating/templates/tree/data/template.tree.store'; +import { UmbTemplateDetailStore } from './templating/templates/workspace/data/template.detail.store'; import { UmbThemeService, UMB_THEME_SERVICE_CONTEXT_TOKEN } from './themes/theme.service'; import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/data/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/data/index.ts deleted file mode 100644 index da130c02f7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/data/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { EntityTreeItem, PagedEntityTreeItem, ProblemDetails, Template } from '@umbraco-cms/backend-api'; - -export interface DataOrErrorResponse { - data?: T; - error?: ProblemDetails; -} - -export interface ErrorResponse { - data?: undefined; - error?: ProblemDetails; -} - -export interface TemplateDataSource { - createScaffold(parentKey: string | null): Promise>; - get(key: string): Promise>; - insert(template: Template): Promise; - update(template: Template): Promise; - delete(key: string): Promise; - getTreeRoot(): Promise>; - getTreeItemChildren(parentKey: string): Promise>; - getTreeItems(key: Array): Promise>; -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/sources/index.ts new file mode 100644 index 0000000000..d013339592 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/sources/index.ts @@ -0,0 +1,8 @@ +import { DataSourceResponse } from '../../../workspace/data'; +import { EntityTreeItem, PagedEntityTreeItem } from '@umbraco-cms/backend-api'; + +export interface TemplateTreeDataSource { + getTreeRoot(): Promise>; + getTreeItemChildren(parentKey: string): Promise>; + getTreeItems(key: Array): Promise>; +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/sources/template.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/sources/template.tree.server.data.ts new file mode 100644 index 0000000000..3668a57440 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/sources/template.tree.server.data.ts @@ -0,0 +1,43 @@ +import { TemplateTreeDataSource } from '.'; +import { ProblemDetails, TemplateResource } from '@umbraco-cms/backend-api'; +import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { tryExecuteAndNotify } from '@umbraco-cms/resources'; + +export class TemplateTreeServerDataSource implements TemplateTreeDataSource { + #host: UmbControllerHostInterface; + constructor(host: UmbControllerHostInterface) { + this.#host = host; + } + + async getTreeRoot() { + return tryExecuteAndNotify(this.#host, TemplateResource.getTreeTemplateRoot({})); + } + + async getTreeItemChildren(parentKey: string | null) { + if (!parentKey) { + const error: ProblemDetails = { title: 'Parent key is missing' }; + return { error }; + } + + return tryExecuteAndNotify( + this.#host, + TemplateResource.getTreeTemplateChildren({ + parentKey, + }) + ); + } + + async getTreeItems(keys: Array) { + if (keys) { + const error: ProblemDetails = { title: 'Keys are missing' }; + return { error }; + } + + return tryExecuteAndNotify( + this.#host, + TemplateResource.getTreeTemplateItem({ + key: keys, + }) + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/template.tree.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.repository.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/template.tree.repository.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.repository.ts index 3e4d3904e1..323aa48ed9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/template.tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.repository.ts @@ -1,5 +1,5 @@ import { Observable } from 'rxjs'; -import { TemplateServerDataSource } from '../data/template.server'; +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'; @@ -8,7 +8,7 @@ import { EntityTreeItem, PagedEntityTreeItem, ProblemDetails } from '@umbraco-cm export class UmbTemplateTreeRepository { #host: UmbControllerHostInterface; - #dataSource: TemplateServerDataSource; + #dataSource: TemplateTreeServerDataSource; #treeStore!: UmbTemplateTreeStore; #notificationService?: UmbNotificationService; #initResolver?: (value: unknown) => void; @@ -17,7 +17,7 @@ export class UmbTemplateTreeRepository { constructor(host: UmbControllerHostInterface) { this.#host = host; // TODO: figure out how spin up get the correct data source - this.#dataSource = new TemplateServerDataSource(this.#host); + this.#dataSource = new TemplateTreeServerDataSource(this.#host); new UmbContextConsumerController(this.#host, UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN, (instance) => { this.#treeStore = instance; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/template.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.store.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/template.tree.store.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/data/template.tree.store.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/manifests.ts index f4e87059ca..2b9a3ab45d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/tree/manifests.ts @@ -1,4 +1,4 @@ -import { UmbTemplateTreeRepository } from './template.tree.repository'; +import { UmbTemplateTreeRepository } from './data/template.tree.repository'; import type { ManifestTree, ManifestTreeItemAction } from '@umbraco-cms/models'; const tree: ManifestTree = { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/sources/index.ts new file mode 100644 index 0000000000..bfea9e5977 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/sources/index.ts @@ -0,0 +1,10 @@ +import { Template } from '@umbraco-cms/backend-api'; +import type { DataSourceResponse } from '@umbraco-cms/models'; + +export interface TemplateDetailDataSource { + createScaffold(parentKey: string | null): Promise>; + get(key: string): Promise>; + insert(template: Template): Promise; + update(template: Template): Promise; + delete(key: string): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/data/template.server.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/sources/template.detail.server.data.ts similarity index 72% rename from src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/data/template.server.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/sources/template.detail.server.data.ts index 35dbad5c10..4a2e2cec99 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/data/template.server.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/sources/template.detail.server.data.ts @@ -1,10 +1,10 @@ import { v4 as uuid } from 'uuid'; -import { TemplateDataSource } from '.'; +import { TemplateDetailDataSource } from '.'; import { ProblemDetails, Template, TemplateResource } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/resources'; -export class TemplateServerDataSource implements TemplateDataSource { +export class UmbTemplateDetailServerDataSource implements TemplateDetailDataSource { #host: UmbControllerHostInterface; constructor(host: UmbControllerHostInterface) { this.#host = host; @@ -71,36 +71,4 @@ export class TemplateServerDataSource implements TemplateDataSource { return await tryExecuteAndNotify(this.#host, TemplateResource.deleteTemplateByKey({ key })); } - - async getTreeRoot() { - return tryExecuteAndNotify(this.#host, TemplateResource.getTreeTemplateRoot({})); - } - - async getTreeItemChildren(parentKey: string | null) { - if (!parentKey) { - const error: ProblemDetails = { title: 'Parent key is missing' }; - return { error }; - } - - return tryExecuteAndNotify( - this.#host, - TemplateResource.getTreeTemplateChildren({ - parentKey, - }) - ); - } - - async getTreeItems(keys: Array) { - if (keys) { - const error: ProblemDetails = { title: 'Keys are missing' }; - return { error }; - } - - return tryExecuteAndNotify( - this.#host, - TemplateResource.getTreeTemplateItem({ - key: keys, - }) - ); - } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/template.detail.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/template.detail.repository.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/template.detail.repository.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/template.detail.repository.ts index a7e12afaa6..e221b01e01 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/template.detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/template.detail.repository.ts @@ -1,5 +1,5 @@ import { UmbTemplateDetailStore, UMB_TEMPLATE_DETAIL_STORE_CONTEXT_TOKEN } from './template.detail.store'; -import { TemplateServerDataSource } from './data/template.server'; +import { UmbTemplateDetailServerDataSource } from './sources/template.detail.server.data'; import { ProblemDetails, Template } from '@umbraco-cms/backend-api'; import { UmbContextConsumerController } from '@umbraco-cms/context-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; @@ -9,7 +9,7 @@ import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from ' // element -> context -> repository -> (store) -> data source export class UmbTemplateDetailRepository { #host: UmbControllerHostInterface; - #dataSource: TemplateServerDataSource; + #dataSource: UmbTemplateDetailServerDataSource; #detailStore?: UmbTemplateDetailStore; #notificationService?: UmbNotificationService; #initResolver?: (value: unknown) => void; @@ -18,7 +18,7 @@ export class UmbTemplateDetailRepository { constructor(host: UmbControllerHostInterface) { this.#host = host; // TODO: figure out how spin up get the correct data source - this.#dataSource = new TemplateServerDataSource(this.#host); + this.#dataSource = new UmbTemplateDetailServerDataSource(this.#host); new UmbContextConsumerController(this.#host, UMB_TEMPLATE_DETAIL_STORE_CONTEXT_TOKEN, (instance) => { this.#detailStore = instance; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/template.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/template.detail.store.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/template.detail.store.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/data/template.detail.store.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.context.ts index 2dcfb4a56d..d7dfa0020b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.context.ts @@ -1,11 +1,11 @@ -import { UmbTemplateDetailRepository } from '../template.detail.repository'; +import { UmbTemplateDetailRepository } from './data/template.detail.repository'; import { createObservablePart, DeepState } from '@umbraco-cms/observable-api'; import { Template } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; export class UmbTemplateWorkspaceContext { #host: UmbControllerHostInterface; - #templateRepository: UmbTemplateDetailRepository; + #templateDetailRepo: UmbTemplateDetailRepository; #data = new DeepState