diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/member.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/member.data.ts index 48eeb82231..102acd3683 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/member.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/member.data.ts @@ -1,4 +1,4 @@ -import type { MemberDetails } from '../../packages/members/members/types.js'; +import type { UmbMemberDetailModel } from '../../packages/members/members/types.js'; import { UmbEntityData } from './entity.data.js'; import { createEntityTreeItem } from './utils.js'; import type { @@ -6,7 +6,7 @@ import type { PagedEntityTreeItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; -export const data: Array = [ +export const data: Array = [ { name: 'Member AAA', type: 'member', @@ -21,7 +21,7 @@ export const data: Array = [ // TODO: all properties are optional in the server schema. I don't think this is correct. // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -class UmbMemberData extends UmbEntityData { +class UmbMemberData extends UmbEntityData { constructor() { super(data); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/entity-actions/manifests.ts index c44e9bb46a..2ae2b4d5d9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/entity-actions/manifests.ts @@ -1,4 +1,5 @@ -import { MEMBER_REPOSITORY_ALIAS } from '../repository/manifests.js'; +import { UMB_MEMBER_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; +import { UMB_MEMBER_ENTITY_TYPE } from '../entity.js'; import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry'; import { UmbDeleteEntityAction } from '@umbraco-cms/backoffice/entity-action'; @@ -11,8 +12,8 @@ const entityActions: Array = [ meta: { icon: 'icon-trash', label: 'Delete', - repositoryAlias: MEMBER_REPOSITORY_ALIAS, - entityTypes: ['member'], + repositoryAlias: UMB_MEMBER_DETAIL_REPOSITORY_ALIAS, + entityTypes: [UMB_MEMBER_ENTITY_TYPE], }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/entity.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/entity.ts new file mode 100644 index 0000000000..83251d9555 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/entity.ts @@ -0,0 +1,2 @@ +export const UMB_MEMBER_ROOT_ENTITY_TYPE = 'member-root'; +export const UMB_MEMBER_ENTITY_TYPE = 'member'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/index.ts new file mode 100644 index 0000000000..3d76f338dd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/index.ts @@ -0,0 +1 @@ +export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/member.detail.store.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/member.detail.store.ts deleted file mode 100644 index 3b5994db10..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/member.detail.store.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { umbMemberData } from '../../../mocks/data/member.data.js'; -import type { MemberDetails } from './types.js'; -import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbArrayState, createObservablePart } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbEntityDetailStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; - -/** - * @export - * @class UmbMemberStore - * @extends {UmbStoreBase} - * @description - Data Store for Members - */ -export class UmbMemberStore extends UmbStoreBase implements UmbEntityDetailStore { - constructor(private host: UmbControllerHostElement) { - super(host, UMB_MEMBER_STORE_CONTEXT_TOKEN.toString(), new UmbArrayState([], (x) => x.id)); - } - - getScaffold(entityType: string, parentId: string | null) { - return {} as MemberDetails; - } - - /** - * @description - Request a Member by id. The Member is added to the store and is returned as an Observable. - * @param {string} id - * @return {*} {(Observable)} - * @memberof UmbMemberStore - */ - getByKey(id: string): Observable { - // tryExecuteAndNotify(this.host, MemberResource.getMemberByKey({ id })).then(({ data }) => { - // if (data) {} - // this.#data.appendOne(data); - // } - // }); - - // temp until Resource is updated - const member = umbMemberData.getById(id); - if (member) { - this._data.appendOne(member); - } - - return this._data.asObservablePart((members) => members.find((member) => member.id === id) as MemberDetails); - } - - async save(member: Array): Promise { - return null as any; - } -} - -export const UMB_MEMBER_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/menu-item/manifests.ts index 147e64b1a1..d28c74e953 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/menu-item/manifests.ts @@ -1,16 +1,16 @@ +import { UMB_MEMBER_TREE_ALIAS } from '../tree/index.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const menuItem: ManifestTypes = { type: 'menuItem', kind: 'tree', - alias: 'Umb.MenuItem.Members', + alias: 'Umb.MenuItem.Member', name: 'Members Menu Item', weight: 400, meta: { label: 'Members', icon: 'icon-folder', - entityType: 'member', - treeAlias: 'Umb.Tree.Members', + treeAlias: UMB_MEMBER_TREE_ALIAS, menus: ['Umb.Menu.Members'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/index.ts new file mode 100644 index 0000000000..5cfb20d3b7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/index.ts @@ -0,0 +1,2 @@ +export { UmbMemberDetailRepository } from './member-detail.repository.js'; +export { UMB_MEMBER_DETAIL_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/manifests.ts new file mode 100644 index 0000000000..2c452268ae --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/manifests.ts @@ -0,0 +1,22 @@ +import { UmbMemberDetailRepository } from './member-detail.repository.js'; +import { UmbMemberDetailStore } from './member-detail.store.js'; +import type { ManifestRepository, ManifestStore } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_MEMBER_DETAIL_REPOSITORY_ALIAS = 'Umb.Repository.Member.Detail'; +export const UMB_MEMBER_DETAIL_STORE_ALIAS = 'Umb.Store.Member.Detail'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_MEMBER_DETAIL_REPOSITORY_ALIAS, + name: 'Member Detail Detail Repository', + api: UmbMemberDetailRepository, +}; + +const store: ManifestStore = { + type: 'store', + alias: UMB_MEMBER_DETAIL_STORE_ALIAS, + name: 'Member Detail Store', + api: UmbMemberDetailStore, +}; + +export const manifests = [repository, store]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/member-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/member-detail.repository.ts new file mode 100644 index 0000000000..0ccdd38aaa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/member-detail.repository.ts @@ -0,0 +1,9 @@ +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbMemberDetailRepository extends UmbRepositoryBase { + constructor(host: UmbControllerHost) { + super(host); + console.log('UmbMemberDetailRepository'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/member-detail.store.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/member-detail.store.ts new file mode 100644 index 0000000000..3bea5a8962 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/detail/member-detail.store.ts @@ -0,0 +1,19 @@ +import type { UmbMemberDetailModel } from '../../types.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; + +/** + * @export + * @class UmbMemberDetailStore + * @extends {UmbStoreBase} + * @description - Data Store for Member Detail + */ +export class UmbMemberDetailStore extends UmbStoreBase { + constructor(host: UmbControllerHostElement) { + super(host, UMB_MEMBER_DETAIL_STORE_CONTEXT.toString(), new UmbArrayState([], (x) => x.id)); + } +} + +export const UMB_MEMBER_DETAIL_STORE_CONTEXT = new UmbContextToken('UmbMemberDetailStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/index.ts new file mode 100644 index 0000000000..b82ce18469 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/index.ts @@ -0,0 +1 @@ +export { UmbMemberDetailRepository, UMB_MEMBER_DETAIL_REPOSITORY_ALIAS } from './detail/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/manifests.ts index d6ba3fce98..448c479022 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/manifests.ts @@ -1,32 +1,3 @@ -import { UmbMemberRepository } from './member.repository.js'; -import { UmbMemberStore } from './member.store.js'; -import { UmbMemberTreeStore } from './member.tree.store.js'; -import type { ManifestStore, ManifestTreeStore, ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; +import { manifests as detailManifests } from './detail/manifests.js'; -export const MEMBER_REPOSITORY_ALIAS = 'Umb.Repository.Member'; - -const repository: ManifestRepository = { - type: 'repository', - alias: MEMBER_REPOSITORY_ALIAS, - name: 'Member Repository', - api: UmbMemberRepository, -}; - -export const MEMBER_STORE_ALIAS = 'Umb.Store.Member'; -export const MEMBER_TREE_STORE_ALIAS = 'Umb.Store.MemberTree'; - -const store: ManifestStore = { - type: 'store', - alias: MEMBER_STORE_ALIAS, - name: 'Member Store', - api: UmbMemberStore, -}; - -const treeStore: ManifestTreeStore = { - type: 'treeStore', - alias: MEMBER_TREE_STORE_ALIAS, - name: 'Member Tree Store', - api: UmbMemberTreeStore, -}; - -export const manifests = [store, treeStore, repository]; +export const manifests = [...detailManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.repository.ts deleted file mode 100644 index 80afb72da6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.repository.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { UmbMemberTreeStore, UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN } from './member.tree.store.js'; -import { UmbMemberTreeServerDataSource } from './sources/member.tree.server.data.js'; -import { UmbBaseController, type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { type UmbTreeRepository } from '@umbraco-cms/backoffice/tree'; -import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; - -export class UmbMemberRepository extends UmbBaseController implements UmbTreeRepository, UmbApi { - #dataSource: UmbMemberTreeServerDataSource; - #treeStore?: UmbMemberTreeStore; - #init; - - constructor(host: UmbControllerHostElement) { - super(host); - // TODO: figure out how spin up get the correct data source - this.#dataSource = new UmbMemberTreeServerDataSource(this); - - this.#init = Promise.all([ - this.consumeContext(UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN, (instance) => { - this.#treeStore = instance; - }).asPromise(), - ]); - } - - // TREE: - async requestTreeRoot() { - await this.#init; - - const data = { - id: null, - parentId: null, - type: 'member-root', - name: 'Members', - icon: 'icon-folder', - hasChildren: true, - }; - - return { data }; - } - - async requestRootTreeItems() { - await this.#init; - - const { data, error } = await this.#dataSource.getRootItems(); - - if (data) { - this.#treeStore?.appendItems(data.items); - } - - return { data, error }; - } - - async requestTreeItemsOf(parentId: string | null) { - return { data: undefined, error: { title: 'Not implemented', message: 'Not implemented' } }; - } - - async requestItemsLegacy(ids: Array) { - await this.#init; - - if (!ids) { - throw new Error('Ids are missing'); - } - - const { data, error } = await this.#dataSource.getItems(ids); - - return { data, error }; - } - - async rootTreeItems() { - await this.#init; - return this.#treeStore!.rootItems; - } - - async treeItemsOf(parentId: string | null) { - await this.#init; - return this.#treeStore!.childrenOf(parentId); - } - - async itemsLegacy(ids: Array) { - await this.#init; - return this.#treeStore!.items(ids); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.store.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.store.ts deleted file mode 100644 index 011b0529fc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.store.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { MemberDetails } from '../types.js'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; - -/** - * @export - * @class UmbMemberStore - * @extends {UmbStoreBase} - * @description - Data Store for Members - */ -export class UmbMemberStore extends UmbStoreBase { - constructor(host: UmbControllerHostElement) { - super(host, UMB_MEMBER_STORE_CONTEXT_TOKEN.toString(), new UmbArrayState([], (x) => x.id)); - } - - append(member: MemberDetails) { - this._data.append([member]); - } - - remove(uniques: string[]) { - this._data.remove(uniques); - } -} - -export const UMB_MEMBER_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.tree.store.ts deleted file mode 100644 index 647747ea5d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.tree.store.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; - -export const UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberTreeStore'); - -/** - * @export - * @class UmbMemberTreeStore - * @extends {UmbEntityTreeStore} - * @description - Tree Data Store for Members - */ -export class UmbMemberTreeStore extends UmbEntityTreeStore { - /** - * Creates an instance of UmbTemplateTreeStore. - * @param {UmbControllerHostElement} host - * @memberof UmbMemberGroupTreeStore - */ - constructor(host: UmbControllerHostElement) { - super(host, UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN.toString()); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/sources/index.ts deleted file mode 100644 index 2b26859baf..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/sources/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; -import type { - EntityTreeItemResponseModel, - PagedEntityTreeItemResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; - -export interface MemberTreeDataSource { - getRootItems(): Promise>; - getItems(id: Array): Promise>; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/sources/member.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/sources/member.tree.server.data.ts deleted file mode 100644 index ea05bb5f43..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/sources/member.tree.server.data.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { MemberTreeDataSource } from './index.js'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; - -/** - * A data source for the Member tree that fetches data from the server - * @export - * @class UmbMemberTreeServerDataSource - * @implements {MemberTreeDataSource} - */ -export class UmbMemberTreeServerDataSource implements MemberTreeDataSource { - #host: UmbControllerHost; - - /** - * Creates an instance of UmbMemberTreeServerDataSource. - * @param {UmbControllerHost} host - * @memberof UmbMemberTreeServerDataSource - */ - constructor(host: UmbControllerHost) { - this.#host = host; - } - - /** - * Fetches the root items for the tree from the server - * @return {*} - * @memberof UmbMemberTreeServerDataSource - */ - async getRootItems() { - const response = await fetch('/umbraco/management/api/v1/tree/member/root'); - const data = await response.json(); - - return { data, error: undefined }; - //return tryExecuteAndNotify(this.#host, MemberResource.getTreeMemberRoot({})); - } - - /** - * Fetches the items for the given ids from the server - * @param {Array} ids - * @return {*} - * @memberof UmbMemberTreeServerDataSource - */ - async getItems(ids: Array) { - const response = await fetch('/umbraco/management/api/v1/tree/member/item'); - const data = await response.json(); - - return { data, error: undefined }; - - // if (ids) { - // const error: ProblemDetails = { title: 'Ids are missing' }; - // return { error }; - // } - - // return tryExecuteAndNotify( - // this.#host, - // MemberResource.getTreeMemberItem({ - // id: ids, - // }) - // ); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/index.ts new file mode 100644 index 0000000000..d5d15304b1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/index.ts @@ -0,0 +1,5 @@ +export { UmbMemberTreeRepository } from './member-tree.repository.js'; +export { UMB_MEMBER_TREE_REPOSITORY_ALIAS, UMB_MEMBER_TREE_STORE_ALIAS, UMB_MEMBER_TREE_ALIAS } from './manifests.js'; +export { UMB_MEMBER_TREE_STORE_CONTEXT } from './member-tree.store.js'; +export { type UmbMemberTreeStore } from './member-tree.store.js'; +export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/manifests.ts index 9e58f6a548..40fc0a89f5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/manifests.ts @@ -1,13 +1,37 @@ -import { MEMBER_REPOSITORY_ALIAS } from '../repository/manifests.js'; -import type { ManifestTree, ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_MEMBER_ENTITY_TYPE, UMB_MEMBER_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UmbMemberTreeRepository } from './member-tree.repository.js'; +import { UmbMemberTreeStore } from './member-tree.store.js'; +import type { + ManifestRepository, + ManifestTree, + ManifestTreeItem, + ManifestTreeStore, +} from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_MEMBER_TREE_REPOSITORY_ALIAS = 'Umb.Repository.Member.Tree'; +export const UMB_MEMBER_TREE_STORE_ALIAS = 'Umb.Store.Member.Tree'; +export const UMB_MEMBER_TREE_ALIAS = 'Umb.Tree.Member'; + +const treeRepository: ManifestRepository = { + type: 'repository', + alias: UMB_MEMBER_TREE_REPOSITORY_ALIAS, + name: 'Member Tree Repository', + api: UmbMemberTreeRepository, +}; + +const treeStore: ManifestTreeStore = { + type: 'treeStore', + alias: UMB_MEMBER_TREE_STORE_ALIAS, + name: 'Member Tree Store', + api: UmbMemberTreeStore, +}; const tree: ManifestTree = { type: 'tree', - alias: 'Umb.Tree.Members', - name: 'Members Tree', - weight: 10, + alias: UMB_MEMBER_TREE_ALIAS, + name: 'Member Tree', meta: { - repositoryAlias: MEMBER_REPOSITORY_ALIAS, + repositoryAlias: UMB_MEMBER_TREE_REPOSITORY_ALIAS, }, }; @@ -17,8 +41,8 @@ const treeItem: ManifestTreeItem = { alias: 'Umb.TreeItem.Member', name: 'Member Tree Item', meta: { - entityTypes: ['member-root', 'member'], + entityTypes: [UMB_MEMBER_ROOT_ENTITY_TYPE, UMB_MEMBER_ENTITY_TYPE], }, }; -export const manifests = [tree, treeItem]; +export const manifests = [treeRepository, treeStore, tree, treeItem]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/member-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/member-tree.repository.ts new file mode 100644 index 0000000000..443c5bede2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/member-tree.repository.ts @@ -0,0 +1,28 @@ +import { UMB_MEMBER_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UmbMemberTreeServerDataSource } from './member-tree.server.data-source.js'; +import { UmbMemberTreeItemModel, UmbMemberTreeRootModel } from './types.js'; +import { UMB_MEMBER_TREE_STORE_CONTEXT } from './member-tree.store.js'; +import { UmbTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbMemberTreeRepository + extends UmbTreeRepositoryBase + implements UmbApi +{ + constructor(host: UmbControllerHost) { + super(host, UmbMemberTreeServerDataSource, UMB_MEMBER_TREE_STORE_CONTEXT); + } + + async requestTreeRoot() { + const data = { + id: null, + type: UMB_MEMBER_ROOT_ENTITY_TYPE, + name: 'Members', + icon: 'icon-folder', + hasChildren: true, + }; + + return { data }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/member-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/member-tree.server.data-source.ts new file mode 100644 index 0000000000..627afe3745 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/member-tree.server.data-source.ts @@ -0,0 +1,61 @@ +import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; +import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +/** + * A data source for the Member tree that fetches data from the server + * @export + * @class UmbMemberTreeServerDataSource + * @implements {UmbTreeDataSource} + */ +export class UmbMemberTreeServerDataSource implements UmbTreeDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMemberTreeServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMemberTreeServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Fetches the root items for the tree from the server + * @return {*} + * @memberof UmbMemberTreeServerDataSource + */ + async getRootItems(): Promise { + alert('not implemented'); + //return tryExecuteAndNotify(this.#host, MemberResource.getTreeMemberRoot({})); + } + + /** + * Fetches the children of a given parent id from the server + * @param {(string)} parentId + * @return {*} + * @memberof UmbMemberTreeServerDataSource + */ + async getChildrenOf(parentId: string | null): Promise { + alert('not implemented'); + /* 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, + MemberResource.getTreeMemberChildren({ + 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'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/member-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/member-tree.store.ts new file mode 100644 index 0000000000..2634d20b4e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/member-tree.store.ts @@ -0,0 +1,22 @@ +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; + +/** + * @export + * @class UmbMemberTreeStore + * @extends {UmbStoreBase} + * @description - Tree Data Store for Member Items + */ +export class UmbMemberTreeStore extends UmbEntityTreeStore { + /** + * Creates an instance of UmbMemberTreeStore. + * @param {UmbControllerHostElement} host + * @memberof UmbMemberTreeStore + */ + constructor(host: UmbControllerHostElement) { + super(host, UMB_MEMBER_TREE_STORE_CONTEXT.toString()); + } +} + +export const UMB_MEMBER_TREE_STORE_CONTEXT = new UmbContextToken('UmbMemberTreeStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/types.ts new file mode 100644 index 0000000000..0e16589f77 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/tree/types.ts @@ -0,0 +1,5 @@ +import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbEntityTreeItemModel, UmbEntityTreeRootModel } from '@umbraco-cms/backoffice/tree'; + +export type UmbMemberTreeItemModel = EntityTreeItemResponseModel & UmbEntityTreeItemModel; +export type UmbMemberTreeRootModel = EntityTreeItemResponseModel & UmbEntityTreeRootModel; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/types.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/types.ts index f4b03017ed..33e9d2196b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/types.ts @@ -1,5 +1,5 @@ import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -export interface MemberDetails extends EntityTreeItemResponseModel { +export interface UmbMemberDetailModel extends EntityTreeItemResponseModel { id: string; // TODO: Remove this when the backend is fixed } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/index.ts new file mode 100644 index 0000000000..27359aaa74 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/index.ts @@ -0,0 +1 @@ +export { UMB_MEMBER_WORKSPACE_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/manifests.ts index b547fe9a67..bd1d228b24 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/manifests.ts @@ -1,16 +1,19 @@ +import { UMB_MEMBER_ENTITY_TYPE } from '../entity.js'; import type { ManifestWorkspace, ManifestWorkspaceAction, ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extension-registry'; +export const UMB_MEMBER_WORKSPACE_ALIAS = 'Umb.Workspace.Member'; + const workspace: ManifestWorkspace = { type: 'workspace', - alias: 'Umb.Workspace.Member', + alias: UMB_MEMBER_WORKSPACE_ALIAS, name: 'Member Workspace', loader: () => import('./member-workspace.element.js'), meta: { - entityType: 'member', + entityType: UMB_MEMBER_ENTITY_TYPE, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts index 17804d541f..c9fcce913e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts @@ -1,19 +1,21 @@ -import { UmbMemberRepository } from '../repository/member.repository.js'; -import type { MemberDetails } from '../types.js'; +import { UmbMemberDetailRepository } from '../repository/index.js'; +import type { UmbMemberDetailModel } from '../types.js'; +import { UMB_MEMBER_ENTITY_TYPE } from '../entity.js'; +import { UMB_MEMBER_WORKSPACE_ALIAS } from './manifests.js'; import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbMemberWorkspaceContext - extends UmbWorkspaceContext - implements UmbSaveableWorkspaceContextInterface + extends UmbWorkspaceContext + implements UmbSaveableWorkspaceContextInterface { constructor(host: UmbControllerHostElement) { - super(host, 'Umb.Workspace.Member', new UmbMemberRepository(host)); + super(host, UMB_MEMBER_WORKSPACE_ALIAS, new UmbMemberDetailRepository(host)); } getEntityType(): string { - return 'member'; + return UMB_MEMBER_ENTITY_TYPE; } getEntityId() { @@ -21,7 +23,7 @@ export class UmbMemberWorkspaceContext } getData() { - return 'fake' as unknown as MemberDetails; + return 'fake' as unknown as UmbMemberDetailModel; } async save() { @@ -37,7 +39,10 @@ export class UmbMemberWorkspaceContext } } -export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken< + UmbSaveableWorkspaceContextInterface, + UmbMemberWorkspaceContext +>( 'UmbWorkspaceContext', - (context): context is UmbMemberWorkspaceContext => context.getEntityType?.() === 'member' + (context): context is UmbMemberWorkspaceContext => context.getEntityType?.() === UMB_MEMBER_ENTITY_TYPE, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.element.ts index 849123ce5a..d6ea3d69db 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.element.ts @@ -1,6 +1,6 @@ import { UmbMemberWorkspaceEditorElement } from './member-workspace-editor.element.js'; import { UmbMemberWorkspaceContext } from './member-workspace.context.js'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element';