split into tree repository

This commit is contained in:
Mads Rasmussen
2023-11-13 20:07:01 +01:00
parent 289f007fd8
commit 0e19d5285b
4 changed files with 87 additions and 73 deletions

View File

@@ -1,91 +1,24 @@
import { DATA_TYPE_ROOT_ENTITY_TYPE } from '../entities.js';
import { UmbDataTypeTreeServerDataSource } from './sources/data-type.tree.server.data.js';
import { UmbDataTypeServerDataSource } from './sources/data-type.server.data.js';
import { UmbDataTypeRepositoryBase } from './data-type-repository-base.js';
import { createTreeItem } from './utils.js';
import type {
UmbTreeRepository,
UmbDetailRepository,
UmbTreeDataSource,
UmbDataSource,
} from '@umbraco-cms/backoffice/repository';
import type { UmbDetailRepository, UmbDataSource } from '@umbraco-cms/backoffice/repository';
import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import {
CreateDataTypeRequestModel,
DataTypeResponseModel,
FolderTreeItemResponseModel,
UpdateDataTypeRequestModel,
} from '@umbraco-cms/backoffice/backend-api';
import { UmbApi } from '@umbraco-cms/backoffice/extension-api';
export class UmbDataTypeRepository
extends UmbDataTypeRepositoryBase
implements
UmbTreeRepository<FolderTreeItemResponseModel>,
UmbDetailRepository<CreateDataTypeRequestModel, any, UpdateDataTypeRequestModel, DataTypeResponseModel>,
UmbApi
implements UmbDetailRepository<CreateDataTypeRequestModel, any, UpdateDataTypeRequestModel, DataTypeResponseModel>
{
#treeSource: UmbTreeDataSource<FolderTreeItemResponseModel>;
#detailSource: UmbDataSource<CreateDataTypeRequestModel, any, UpdateDataTypeRequestModel, DataTypeResponseModel>;
constructor(host: UmbControllerHost) {
super(host);
// TODO: figure out how spin up get the correct data source
this.#treeSource = new UmbDataTypeTreeServerDataSource(this);
this.#detailSource = new UmbDataTypeServerDataSource(this);
}
// TREE:
async requestTreeRoot() {
await this._init;
const data = {
id: null,
type: DATA_TYPE_ROOT_ENTITY_TYPE,
name: 'Data Types',
icon: 'icon-folder',
hasChildren: true,
};
return { data };
}
async requestRootTreeItems() {
await this._init;
const { data, error } = await this.#treeSource.getRootItems();
if (data) {
this._treeStore!.appendItems(data.items);
}
return { data, error, asObservable: () => this._treeStore!.rootItems };
}
async requestTreeItemsOf(parentId: string | null) {
await this._init;
if (parentId === undefined) throw new Error('Parent id is missing');
const { data, error } = await this.#treeSource.getChildrenOf(parentId);
if (data) {
this._treeStore!.appendItems(data.items);
}
return { data, error, asObservable: () => this._treeStore!.childrenOf(parentId) };
}
async rootTreeItems() {
await this._init;
return this._treeStore!.rootItems;
}
async treeItemsOf(parentId: string | null) {
if (parentId === undefined) throw new Error('Parent id is missing');
await this._init;
return this._treeStore!.childrenOf(parentId);
}
// DETAILS:
async createScaffold(parentId: string | null) {
if (parentId === undefined) throw new Error('Parent id is missing');

View File

@@ -0,0 +1,68 @@
import { DATA_TYPE_ROOT_ENTITY_TYPE } from '../entities.js';
import { UmbDataTypeTreeServerDataSource } from '../tree/data-type.tree.server.data.js';
import { UmbDataTypeRepositoryBase } from '../repository/data-type-repository-base.js';
import type { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/repository';
import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { FolderTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
import { UmbApi } from '@umbraco-cms/backoffice/extension-api';
export class UmbDataTypeTreeRepository
extends UmbDataTypeRepositoryBase
implements UmbTreeRepository<FolderTreeItemResponseModel>, UmbApi
{
#treeSource: UmbTreeDataSource<FolderTreeItemResponseModel>;
constructor(host: UmbControllerHost) {
super(host);
this.#treeSource = new UmbDataTypeTreeServerDataSource(this);
}
async requestTreeRoot() {
await this._init;
const data = {
id: null,
type: DATA_TYPE_ROOT_ENTITY_TYPE,
name: 'Data Types',
icon: 'icon-folder',
hasChildren: true,
};
return { data };
}
async requestRootTreeItems() {
await this._init;
const { data, error } = await this.#treeSource.getRootItems();
if (data) {
this._treeStore!.appendItems(data.items);
}
return { data, error, asObservable: () => this._treeStore!.rootItems };
}
async requestTreeItemsOf(parentId: string | null) {
await this._init;
if (parentId === undefined) throw new Error('Parent id is missing');
const { data, error } = await this.#treeSource.getChildrenOf(parentId);
if (data) {
this._treeStore!.appendItems(data.items);
}
return { data, error, asObservable: () => this._treeStore!.childrenOf(parentId) };
}
async rootTreeItems() {
await this._init;
return this._treeStore!.rootItems;
}
async treeItemsOf(parentId: string | null) {
if (parentId === undefined) throw new Error('Parent id is missing');
await this._init;
return this._treeStore!.childrenOf(parentId);
}
}

View File

@@ -1,9 +1,22 @@
import { DATA_TYPE_REPOSITORY_ALIAS } from '../repository/manifests.js';
import { UmbDataTypeTreeRepository } from './data-type-tree.repository.js';
import { UmbDataTypeTreeStore } from './data-type.tree.store.js';
import type { ManifestTree, ManifestTreeItem, ManifestTreeStore } from '@umbraco-cms/backoffice/extension-registry';
import type {
ManifestRepository,
ManifestTree,
ManifestTreeItem,
ManifestTreeStore,
} from '@umbraco-cms/backoffice/extension-registry';
export const DATA_TYPE_TREE_REPOSITORY_ALIAS = 'Umb.Repository.DataType.Tree';
export const DATA_TYPE_TREE_STORE_ALIAS = 'Umb.Store.DataType.Tree';
const treeRepository: ManifestRepository = {
type: 'repository',
alias: DATA_TYPE_TREE_REPOSITORY_ALIAS,
name: 'Data Type Tree Repository',
api: UmbDataTypeTreeRepository,
};
const treeStore: ManifestTreeStore = {
type: 'treeStore',
alias: DATA_TYPE_TREE_STORE_ALIAS,
@@ -16,7 +29,7 @@ const tree: ManifestTree = {
alias: 'Umb.Tree.DataTypes',
name: 'Data Types Tree',
meta: {
repositoryAlias: DATA_TYPE_REPOSITORY_ALIAS,
repositoryAlias: DATA_TYPE_TREE_REPOSITORY_ALIAS,
},
};
@@ -30,4 +43,4 @@ const treeItem: ManifestTreeItem = {
},
};
export const manifests = [treeStore, tree, treeItem];
export const manifests = [treeRepository, treeStore, tree, treeItem];