From 7142ba3f4e51b9c0671f90fc729391e8b01ad322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 8 Nov 2023 17:04:10 +1300 Subject: [PATCH] item store --- .../repository/media-type-item.store.ts | 38 +++++++++++++ .../repository/media-type.detail.store.ts | 4 ++ .../repository/media-type.repository.ts | 56 +++++++++++++++++-- .../sources/media-type-item.server.data.ts | 39 +++++++++++++ 4 files changed, 131 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type-item.store.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/sources/media-type-item.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type-item.store.ts new file mode 100644 index 0000000000..d0c24782bf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type-item.store.ts @@ -0,0 +1,38 @@ +import { MediaTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbItemStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; +import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; + +/** + * @export + * @class UmbMediaTypeItemStore + * @extends {UmbStoreBase} + * @description - Data Store for Media Type items + */ + +export class UmbMediaTypeItemStore + extends UmbStoreBase + implements UmbItemStore +{ + /** + * Creates an instance of UmbMediaTypeItemStore. + * @param {UmbControllerHostElement} host + * @memberof UmbMediaTypeItemStore + */ + constructor(host: UmbControllerHostElement) { + super( + host, + UMB_MEDIA_TYPE_ITEM_STORE_CONTEXT_TOKEN.toString(), + new UmbArrayState([], (x) => x.id), + ); + } + + items(ids: Array) { + return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.id ?? ''))); + } +} + +export const UMB_MEDIA_TYPE_ITEM_STORE_CONTEXT_TOKEN = new UmbContextToken( + 'UmbMediaTypeItemStore', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.detail.store.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.detail.store.ts index 79c2691c77..75b924d9b9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.detail.store.ts @@ -19,6 +19,10 @@ export class UmbMediaTypeStore extends UmbStoreBase { ); } + byId(id: MediaTypeResponseModel['id']) { + return this._data.asObservablePart((x) => x.find((y) => y.id === id)); + } + append(mediaType: MediaTypeResponseModel) { this._data.append([mediaType]); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.repository.ts index 109785e1f6..3dd17bef26 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.repository.ts @@ -2,18 +2,33 @@ import { UmbMediaTypeTreeStore, UMB_MEDIA_TYPE_TREE_STORE_CONTEXT_TOKEN } from ' import { UmbMediaTypeDetailServerDataSource } from './sources/media-type.detail.server.data.js'; import { UmbMediaTypeStore, UMB_MEDIA_TYPE_STORE_CONTEXT_TOKEN } from './media-type.detail.store.js'; import { UmbMediaTypeTreeServerDataSource } from './sources/media-type.tree.server.data.js'; +import { UmbMediaTypeItemStore } from './media-type-item.store.js'; +import { UmbMediaTypeItemServerDataSource } from './sources/media-type-item.server.data.js'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; -import { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { + UmbTreeRepository, + UmbTreeDataSource, + UmbDataSource, + UmbItemRepository, + UmbDetailRepository, + UmbItemDataSource, +} from '@umbraco-cms/backoffice/repository'; import { CreateMediaTypeRequestModel, - EntityTreeItemResponseModel, + FolderTreeItemResponseModel, + MediaTypeItemResponseModel, MediaTypeResponseModel, UpdateMediaTypeRequestModel, } from '@umbraco-cms/backoffice/backend-api'; -export class UmbMediaTypeRepository implements UmbTreeRepository { +export class UmbMediaTypeRepository + implements + UmbItemRepository, + UmbTreeRepository, + UmbDetailRepository +{ #init!: Promise; #host: UmbControllerHostElement; @@ -21,9 +36,12 @@ export class UmbMediaTypeRepository implements UmbTreeRepository; #detailStore?: UmbMediaTypeStore; + #itemSource: UmbItemDataSource; + #itemStore?: UmbMediaTypeItemStore; + #notificationContext?: UmbNotificationContext; constructor(host: UmbControllerHostElement) { @@ -32,6 +50,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { @@ -88,6 +107,12 @@ export class UmbMediaTypeRepository implements UmbTreeRepository this.#treeStore!.childrenOf(parentId) }; } + async byId(id: string) { + if (!id) throw new Error('Key is missing'); + await this.#init; + return this.#detailStore!.byId(id); + } + async requestItemsLegacy(ids: Array) { await this.#init; @@ -117,9 +142,10 @@ export class UmbMediaTypeRepository implements UmbTreeRepository) { + if (!ids) throw new Error('Keys are missing'); + await this.#init; + + const { data, error } = await this.#itemSource.getItems(ids); + + if (data) { + this.#itemStore?.appendItems(data); + } + + return { data, error, asObservable: () => this.#itemStore!.items(ids) }; + } + + async items(ids: Array) { + await this.#init; + return this.#itemStore!.items(ids); + } + async delete(id: string) { await this.#init; return this.#detailSource.delete(id); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/sources/media-type-item.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/sources/media-type-item.server.data.ts new file mode 100644 index 0000000000..baf0eaeb61 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/sources/media-type-item.server.data.ts @@ -0,0 +1,39 @@ +import type { UmbItemDataSource } from '@umbraco-cms/backoffice/repository'; +import { MediaTypeItemResponseModel, MediaTypeResource } from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for Media Type items that fetches data from the server + * @export + * @class UmbMediaTypeItemServerDataSource + * @implements {DocumentTreeDataSource} + */ +export class UmbMediaTypeItemServerDataSource implements UmbItemDataSource { + #host: UmbControllerHostElement; + + /** + * Creates an instance of UmbMediaTypeItemServerDataSource. + * @param {UmbControllerHostElement} host + * @memberof UmbMediaTypeItemServerDataSource + */ + constructor(host: UmbControllerHostElement) { + this.#host = host; + } + + /** + * Fetches the items for the given ids from the server + * @param {Array} ids + * @return {*} + * @memberof UmbMediaTypeItemServerDataSource + */ + async getItems(ids: Array) { + if (!ids) throw new Error('Ids are missing'); + return tryExecuteAndNotify( + this.#host, + MediaTypeResource.getMediaTypeItem({ + id: ids, + }), + ); + } +}