From 5f41645cbcd525b09d7ea1ab3d77b6abd7b244e4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 3 Mar 2024 15:14:32 +0100 Subject: [PATCH] add script item repo + store --- .../scripts/entity-actions/manifests.ts | 3 +- .../scripts/repository/item/index.ts | 3 + .../scripts/repository/item/manifests.ts | 20 ++++++ .../repository/item/script-item.repository.ts | 13 ++++ .../item/script-item.server.data-source.ts | 68 +++++++++++++++++++ .../repository/item/script-item.store.ts | 26 +++++++ .../scripts/repository/manifests.ts | 3 +- .../src/packages/templating/scripts/types.ts | 11 ++- 8 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.store.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts index 5e21f2966f..65532d43d1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts @@ -1,5 +1,6 @@ import { UMB_SCRIPT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_SCRIPT_ENTITY_TYPE } from '../entity.js'; +import { UMB_SCRIPT_ITEM_REPOSITORY_ALIAS } from '../repository/item/index.js'; import { manifests as createManifests } from './create/manifests.js'; import { manifests as renameManifests } from './rename/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -14,7 +15,7 @@ const scriptViewActions: Array = [ kind: 'delete', meta: { detailRepositoryAlias: UMB_SCRIPT_DETAIL_REPOSITORY_ALIAS, - itemRepositoryAlias: UMB_SCRIPT_DETAIL_ITEM_REPOSITORY_ALIAS, // TODO: implement item repo + itemRepositoryAlias: UMB_SCRIPT_ITEM_REPOSITORY_ALIAS, entityTypes: [UMB_SCRIPT_ENTITY_TYPE], }, }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/index.ts new file mode 100644 index 0000000000..2ce544e48a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/index.ts @@ -0,0 +1,3 @@ +export { UmbScriptItemRepository } from './script-item.repository.js'; +export { UMB_SCRIPT_ITEM_REPOSITORY_ALIAS, UMB_SCRIPT_ITEM_STORE_ALIAS } from './manifests.js'; +export { UMB_SCRIPT_ITEM_STORE_CONTEXT } from './script-item.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/manifests.ts new file mode 100644 index 0000000000..d540832bc9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/manifests.ts @@ -0,0 +1,20 @@ +import type { ManifestRepository, ManifestItemStore } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_SCRIPT_ITEM_REPOSITORY_ALIAS = 'Umb.Repository.Script.Item'; +export const UMB_SCRIPT_ITEM_STORE_ALIAS = 'Umb.ItemStore.Script'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_SCRIPT_ITEM_REPOSITORY_ALIAS, + name: 'Script Item Repository', + api: () => import('./script-item.repository.js'), +}; + +const itemStore: ManifestItemStore = { + type: 'itemStore', + alias: 'Umb.ItemStore.Script', + name: 'Script Item Store', + api: () => import('./script-item.store.js'), +}; + +export const manifests = [repository, itemStore]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.repository.ts new file mode 100644 index 0000000000..f4aeb8ba78 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.repository.ts @@ -0,0 +1,13 @@ +import type { UmbScriptItemModel } from '../../types.js'; +import { UmbScriptItemServerDataSource } from './script-item.server.data-source.js'; +import { UMB_SCRIPT_ITEM_STORE_CONTEXT } from './script-item.store.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbScriptItemRepository extends UmbItemRepositoryBase { + constructor(host: UmbControllerHost) { + super(host, UmbScriptItemServerDataSource, UMB_SCRIPT_ITEM_STORE_CONTEXT); + } +} + +export default UmbScriptItemRepository; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.server.data-source.ts new file mode 100644 index 0000000000..0ea0652db2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.server.data-source.ts @@ -0,0 +1,68 @@ +import { UMB_SCRIPT_ENTITY_TYPE, UMB_SCRIPT_FOLDER_ENTITY_TYPE } from '../../entity.js'; +import type { UmbScriptItemModel } from '../../types.js'; +import { UmbServerFilePathUniqueSerializer } from '@umbraco-cms/backoffice/server-file-system'; +import type { UmbItemDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import { ScriptResource } from '@umbraco-cms/backoffice/external/backend-api'; + +/** + * A data source for script items that fetches data from the server + * @export + * @class UmbScriptItemServerDataSource + * @implements {UmbItemDataSource} + */ +export class UmbScriptItemServerDataSource implements UmbItemDataSource { + #host: UmbControllerHost; + #serverFilePathUniqueSerializer = new UmbServerFilePathUniqueSerializer(); + + /** + * Creates an instance of UmbScriptItemServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbScriptItemServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Fetches the items for the given uniques from the server + * @param {Array} uniques + * @return {*} + * @memberof UmbScriptItemServerDataSource + */ + async getItems(uniques: Array) { + if (!uniques) throw new Error('Uniques are missing'); + + const paths = uniques + .map((unique) => { + const serverPath = this.#serverFilePathUniqueSerializer.toServerPath(unique); + return serverPath ? encodeURI(serverPath) : null; + }) + .filter((x) => x !== null) as string[]; + + const { data, error } = await tryExecuteAndNotify( + this.#host, + ScriptResource.getItemScript({ + path: paths, + }), + ); + + if (data) { + const items: Array = data.map((item) => { + return { + entityType: item.isFolder ? UMB_SCRIPT_FOLDER_ENTITY_TYPE : UMB_SCRIPT_ENTITY_TYPE, + unique: this.#serverFilePathUniqueSerializer.toUnique(item.path), + parentUnique: item.parent ? this.#serverFilePathUniqueSerializer.toUnique(item.parent.path) : null, + name: item.name, + isFolder: item.isFolder, + path: item.path, + }; + }); + + return { data: items }; + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.store.ts new file mode 100644 index 0000000000..30674ccb4b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.store.ts @@ -0,0 +1,26 @@ +import type { UmbScriptItemModel } from '../../types.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbItemStoreBase } from '@umbraco-cms/backoffice/store'; + +/** + * @export + * @class UmbScriptItemStore + * @extends {UmbItemStoreBase} + * @description - Data Store for Script items + */ + +export class UmbScriptItemStore extends UmbItemStoreBase { + /** + * Creates an instance of UmbScriptItemStore. + * @param {UmbControllerHostElement} host + * @memberof UmbScriptItemStore + */ + constructor(host: UmbControllerHostElement) { + super(host, UMB_SCRIPT_ITEM_STORE_CONTEXT.toString()); + } +} + +export default UmbScriptItemStore; + +export const UMB_SCRIPT_ITEM_STORE_CONTEXT = new UmbContextToken('UmbScriptItemStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts index 07f2b658bf..aa5e20d905 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts @@ -1,3 +1,4 @@ +import { manifests as itemManifests } from './item/manifests.js'; import type { ManifestRepository, ManifestStore } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_SCRIPT_DETAIL_REPOSITORY_ALIAS = 'Umb.Repository.Script.Detail'; @@ -17,4 +18,4 @@ const store: ManifestStore = { api: () => import('./script-detail.store.js'), }; -export const manifests = [repository, store]; +export const manifests = [repository, store, ...itemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/types.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/types.ts index 2c904c19b2..c009c34a21 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/types.ts @@ -1,4 +1,4 @@ -import type { UmbScriptEntityType } from './entity.js'; +import type { UmbScriptEntityType, UmbScriptFolderEntityType } from './entity.js'; export interface UmbScriptDetailModel { entityType: UmbScriptEntityType; @@ -8,3 +8,12 @@ export interface UmbScriptDetailModel { name: string; content: string; } + +export interface UmbScriptItemModel { + entityType: UmbScriptEntityType | UmbScriptFolderEntityType; + unique: string; + parentUnique: string | null; + path: string; + name: string; + isFolder: boolean; +}