diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts index 8d4671d077..596c8924e8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts @@ -1,58 +1,61 @@ -import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; -import { EntityTreeItemResponseModel, DocumentResource } from '@umbraco-cms/backoffice/backend-api'; +import { UmbDocumentTreeItemModel } from './types.js'; +import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; +import { DocumentResource, DocumentTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** * A data source for the Document tree that fetches data from the server * @export * @class UmbDocumentTreeServerDataSource - * @implements {UmbTreeDataSource} + * @extends {UmbTreeServerDataSourceBase} */ -export class UmbDocumentTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHost; - +export class UmbDocumentTreeServerDataSource extends UmbTreeServerDataSourceBase< + DocumentTreeItemResponseModel, + UmbDocumentTreeItemModel +> { /** * Creates an instance of UmbDocumentTreeServerDataSource. * @param {UmbControllerHost} host * @memberof UmbDocumentTreeServerDataSource */ constructor(host: UmbControllerHost) { - this.#host = host; - } - - /** - * Fetches the root items for the tree from the server - * @return {*} - * @memberof UmbDocumentTreeServerDataSource - */ - async getRootItems() { - return tryExecuteAndNotify(this.#host, DocumentResource.getTreeDocumentRoot({})); - } - - /** - * Fetches the children of a given parent id from the server - * @param {(string)} parentId - * @return {*} - * @memberof UmbDocumentTreeServerDataSource - */ - async getChildrenOf(parentId: string | null) { - /* TODO: should we make getRootItems() internal - so it only is a server concern that there are two endpoints? */ - if (parentId === null) { - return this.getRootItems(); - } else { - return tryExecuteAndNotify( - this.#host, - DocumentResource.getTreeDocumentChildren({ - parentId, - }), - ); - } - } - - // TODO: remove when interface is cleaned up - async getItems(unique: Array): Promise { - throw new Error('Dot not use this method. Use the item source instead'); + super(host, { + getChildrenOf, + mapper, + }); } } + +const getChildrenOf = (parentUnique: string | null) => { + if (parentUnique === null) { + // eslint-disable-next-line local-rules/no-direct-api-import + return DocumentResource.getTreeDocumentRoot({}); + } else { + // eslint-disable-next-line local-rules/no-direct-api-import + return DocumentResource.getTreeDocumentChildren({ + parentId: parentUnique, + }); + } +}; + +const mapper = (item: DocumentTreeItemResponseModel): UmbDocumentTreeItemModel => { + return { + id: item.id!, + parentId: item.parentId || null, + name: item.name!, + type: 'document', + isContainer: item.isContainer!, + hasChildren: item.hasChildren!, + isProtected: item.isProtected!, + isPublished: item.isPublished!, + isEdited: item.isEdited!, + contentTypeId: item.contentTypeId!, + variants: + item.variants?.map((variant) => ({ + name: variant.name!, + culture: variant.culture!, + state: variant.state!, + })) || [], + icon: item.icon!, + }; +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/types.ts index 384bb88d75..25531a2e35 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/types.ts @@ -1,5 +1,20 @@ +import { PublishedStateModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbEntityTreeItemModel, UmbEntityTreeRootModel } from '@umbraco-cms/backoffice/tree'; -export interface UmbDocumentTreeItemModel extends UmbEntityTreeItemModel {} +export interface UmbDocumentTreeItemModel extends UmbEntityTreeItemModel { + isProtected: boolean; + isPublished: boolean; + isEdited: boolean; + contentTypeId: string; + variants: Array; + icon: string; +} + +export interface UmbDocumentVariantTreeItemModel { + name: string; + culture: string | null; + state: PublishedStateModel; // TODO: make our own enum for this. We might have states for "unsaved changes" etc. +} + // TODO: TREE STORE TYPE PROBLEM: export interface UmbDocumentTreeRootModel extends UmbEntityTreeRootModel {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/tree/member-group-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/tree/member-group-tree.server.data-source.ts index 69e30eee90..79157ca889 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/tree/member-group-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/tree/member-group-tree.server.data-source.ts @@ -1,7 +1,7 @@ -import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; +import { UmbMemberGroupTreeItemModel } from './types.js'; +import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import { EntityTreeItemResponseModel, MemberGroupResource } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** * A data source for the MemberGroup tree that fetches data from the server @@ -9,53 +9,34 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @class UmbMemberGroupTreeServerDataSource * @implements {UmbTreeDataSource} */ -export class UmbMemberGroupTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHost; - +export class UmbMemberGroupTreeServerDataSource extends UmbTreeServerDataSourceBase< + EntityTreeItemResponseModel, + UmbMemberGroupTreeItemModel +> { /** * Creates an instance of UmbMemberGroupTreeServerDataSource. * @param {UmbControllerHost} host * @memberof UmbMemberGroupTreeServerDataSource */ constructor(host: UmbControllerHost) { - this.#host = host; - } - - /** - * Fetches the root items for the tree from the server - * @return {*} - * @memberof UmbMemberGroupTreeServerDataSource - */ - async getRootItems() { - return tryExecuteAndNotify(this.#host, MemberGroupResource.getTreeMemberGroupRoot({})); - } - - /** - * Fetches the children of a given parent id from the server - * @param {(string)} parentId - * @return {*} - * @memberof UmbMemberGroupTreeServerDataSource - */ - async getChildrenOf(parentId: string | null) { - /* TODO: should we make getRootItems() internal - so it only is a server concern that there are two endpoints? */ - if (parentId === null) { - return this.getRootItems(); - } else { - alert('not implemented'); - /* - return tryExecuteAndNotify( - this.#host, - MemberGroupResource.getTreeMemberGroupChildren({ - parentId, - }), - ); - */ - } - } - - // TODO: remove when interface is cleaned up - async getItems(unique: Array): Promise { - throw new Error('Dot not use this method. Use the item source instead'); + super(host, { + getChildrenOf, + mapper, + }); } } + +const getChildrenOf = () => { + return MemberGroupResource.getTreeMemberGroupRoot({}); +}; + +const mapper = (item: EntityTreeItemResponseModel): UmbMemberGroupTreeItemModel => { + return { + id: item.id!, + parentId: item.parentId || null, + name: item.name!, + type: 'member-group', + isContainer: item.isContainer!, + hasChildren: item.hasChildren!, + }; +};