From 7ebd5795fcdf079790da520c0ff1cca939dde0b5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 15 Apr 2024 11:15:57 +0200 Subject: [PATCH] add duplicate for data types --- .../entity-actions/duplicate/index.ts | 1 + .../entity-actions/duplicate/manifests.ts | 22 ++++++++++ .../duplicate/repository/constants.ts | 1 + .../data-type-duplicate.repository.ts | 20 +++++++++ .../data-type-duplicate.server.data-source.ts | 43 +++++++++++++++++++ .../duplicate/repository/index.ts | 2 + .../duplicate/repository/manifests.ts | 12 ++++++ .../data-type/entity-actions/manifests.ts | 3 +- .../entity-actions/move-to/manifests.ts | 3 +- .../src/packages/data-type/tree/constants.ts | 3 ++ .../src/packages/data-type/tree/index.ts | 2 +- .../src/packages/data-type/tree/manifests.ts | 9 ++-- .../import/import-dictionary-modal.element.ts | 1 - 13 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/data-type-duplicate.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/data-type-duplicate.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/data-type/tree/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/index.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/index.ts new file mode 100644 index 0000000000..dcf04b2be8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/index.ts @@ -0,0 +1 @@ +export { UmbDuplicateDataTypeRepository, UMB_DUPLICATE_DATA_TYPE_REPOSITORY_ALIAS } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/manifests.ts new file mode 100644 index 0000000000..df0bce2250 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/manifests.ts @@ -0,0 +1,22 @@ +import { UMB_DATA_TYPE_ENTITY_TYPE } from '../../entity.js'; +import { UMB_DATA_TYPE_TREE_ALIAS, UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; +import { UMB_DUPLICATE_DATA_TYPE_REPOSITORY_ALIAS } from './repository/index.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'duplicateTo', + alias: 'Umb.EntityAction.DataType.DuplicateTo', + name: 'Duplicate Document To Entity Action', + forEntityTypes: [UMB_DATA_TYPE_ENTITY_TYPE], + meta: { + duplicateRepositoryAlias: UMB_DUPLICATE_DATA_TYPE_REPOSITORY_ALIAS, + treeAlias: UMB_DATA_TYPE_TREE_ALIAS, + treeRepositoryAlias: UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS, + }, + }, +]; + +export const manifests = [...entityActions, ...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/constants.ts new file mode 100644 index 0000000000..c3e47d1038 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_DUPLICATE_DATA_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DataType.Duplicate'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/data-type-duplicate.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/data-type-duplicate.repository.ts new file mode 100644 index 0000000000..69e94c3b91 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/data-type-duplicate.repository.ts @@ -0,0 +1,20 @@ +import { UmbDuplicateDataTypeServerDataSource } from './data-type-duplicate.server.data-source.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbDuplicateRepository, UmbDuplicateToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbDuplicateDataTypeRepository extends UmbRepositoryBase implements UmbDuplicateRepository { + #duplicateSource = new UmbDuplicateDataTypeServerDataSource(this); + + async requestDuplicateTo(args: UmbDuplicateToRequestArgs) { + const { error } = await this.#duplicateSource.duplicateTo(args); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + const notification = { data: { message: `Duplicated` } }; + notificationContext.peek('positive', notification); + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/data-type-duplicate.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/data-type-duplicate.server.data-source.ts new file mode 100644 index 0000000000..9b95270e14 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/data-type-duplicate.server.data-source.ts @@ -0,0 +1,43 @@ +import { DataTypeService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import type { UmbDuplicateDataSource, UmbDuplicateToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; + +/** + * Duplicate Document Server Data Source + * @export + * @class UmbDuplicateDataTypeServerDataSource + */ +export class UmbDuplicateDataTypeServerDataSource implements UmbDuplicateDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbDuplicateDataTypeServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbDuplicateDataTypeServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Duplicate an item for the given id to the destination unique + * @param {UmbDuplicateToRequestArgs} args + * @return {*} + * @memberof UmbDuplicateDataTypeServerDataSource + */ + async duplicateTo(args: UmbDuplicateToRequestArgs) { + if (!args.unique) throw new Error('Unique is missing'); + if (args.destination.unique === undefined) throw new Error('Destination unique is missing'); + + return tryExecuteAndNotify( + this.#host, + DataTypeService.postDataTypeByIdCopy({ + id: args.unique, + requestBody: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/index.ts new file mode 100644 index 0000000000..c9d3788472 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbDuplicateDataTypeRepository } from './data-type-duplicate.repository.js'; +export { UMB_DUPLICATE_DATA_TYPE_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/manifests.ts new file mode 100644 index 0000000000..3795502bab --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/duplicate/repository/manifests.ts @@ -0,0 +1,12 @@ +import { UMB_DUPLICATE_DATA_TYPE_REPOSITORY_ALIAS } from './constants.js'; +import { UmbDuplicateDataTypeRepository } from './data-type-duplicate.repository.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +const duplicateRepository: ManifestRepository = { + type: 'repository', + alias: UMB_DUPLICATE_DATA_TYPE_REPOSITORY_ALIAS, + name: 'Duplicate Data Type Repository', + api: UmbDuplicateDataTypeRepository, +}; + +export const manifests = [duplicateRepository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts index 8ef5a64149..4220e0dea3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts @@ -3,6 +3,7 @@ import { UMB_DATA_TYPE_DETAIL_REPOSITORY_ALIAS } from '../repository/detail/inde import { UMB_DATA_TYPE_ITEM_REPOSITORY_ALIAS } from '../repository/item/manifests.js'; import { manifests as createManifests } from './create/manifests.js'; import { manifests as moveManifests } from './move-to/manifests.js'; +import { manifests as duplicateManifests } from './duplicate/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ @@ -19,4 +20,4 @@ const entityActions: Array = [ }, ]; -export const manifests = [...entityActions, ...createManifests, ...moveManifests]; +export const manifests = [...entityActions, ...createManifests, ...moveManifests, ...duplicateManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/manifests.ts index 84363a8f97..eeaeeab9e9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/manifests.ts @@ -1,6 +1,5 @@ import { UMB_DATA_TYPE_ENTITY_TYPE } from '../../entity.js'; -import { UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; -import { UMB_DATA_TYPE_TREE_ALIAS } from '../../tree/manifests.js'; +import { UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS, UMB_DATA_TYPE_TREE_ALIAS } from '../../tree/index.js'; import { UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from './repository/index.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/constants.ts new file mode 100644 index 0000000000..549e7adde3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/constants.ts @@ -0,0 +1,3 @@ +export const UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS = 'Umb.Repository.DataType.Tree'; +export const UMB_DATA_TYPE_TREE_STORE_ALIAS = 'Umb.Store.DataType.Tree'; +export const UMB_DATA_TYPE_TREE_ALIAS = 'Umb.Tree.DataType'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/index.ts index 09e37032a3..e66f77e3d3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/index.ts @@ -1,3 +1,3 @@ export { UMB_DATA_TYPE_TREE_STORE_CONTEXT } from './data-type-tree.store.js'; -export { UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS } from './manifests.js'; +export { UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS, UMB_DATA_TYPE_TREE_ALIAS } from './constants.js'; export * from './folder/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts index 0d57f28704..d8f1ba33ec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts @@ -2,6 +2,11 @@ import { manifests as folderManifests } from './folder/manifests.js'; import { manifests as reloadManifests } from './reload-tree-item-children/manifests.js'; import { UmbDataTypeTreeRepository } from './data-type-tree.repository.js'; import { UmbDataTypeTreeStore } from './data-type-tree.store.js'; +import { + UMB_DATA_TYPE_TREE_ALIAS, + UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS, + UMB_DATA_TYPE_TREE_STORE_ALIAS, +} from './constants.js'; import type { ManifestRepository, ManifestTree, @@ -9,10 +14,6 @@ import type { ManifestTreeStore, } from '@umbraco-cms/backoffice/extension-registry'; -export const UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS = 'Umb.Repository.DataType.Tree'; -export const UMB_DATA_TYPE_TREE_STORE_ALIAS = 'Umb.Store.DataType.Tree'; -export const UMB_DATA_TYPE_TREE_ALIAS = 'Umb.Tree.DataType'; - const treeRepository: ManifestRepository = { type: 'repository', alias: UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS, diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/import/import-dictionary-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/import/import-dictionary-modal.element.ts index 57f39265e4..e873f32bc7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/import/import-dictionary-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/import/import-dictionary-modal.element.ts @@ -1,4 +1,3 @@ -import { UMB_DICTIONARY_TREE_ALIAS } from '../../tree/manifests.js'; import { UmbDictionaryImportRepository } from '../../repository/index.js'; import type { UmbImportDictionaryModalData, UmbImportDictionaryModalValue } from './import-dictionary-modal.token.js'; import { css, html, customElement, query, state, when } from '@umbraco-cms/backoffice/external/lit';