From 17e57cc3d702e9e9d3ed321a61fd1b25efc656be Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 11 Apr 2024 20:41:17 +0200 Subject: [PATCH] add action + interfaces --- .../duplicate-to.action.kind.ts} | 16 +++--- .../duplicate-to/duplicate-to.action.ts | 47 ++++++++++++++++ .../common/duplicate-to/manifests.ts | 3 + .../common/duplicate/duplicate.action.ts | 56 ------------------- .../common/duplicate/manifests.ts | 3 - .../duplicate-to-data-source.interface.ts | 6 ++ .../duplicate-to-repository.interface.ts | 7 +++ .../core/repository/duplicate-to/index.ts | 4 ++ .../core/repository/duplicate-to/types.ts | 6 ++ .../duplicate-data-source.interface.ts | 5 -- .../duplicate-repository.interface.ts | 5 -- .../core/repository/duplicate/index.ts | 2 - 12 files changed, 81 insertions(+), 79 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/{duplicate/duplicate.action.kind.ts => duplicate-to/duplicate-to.action.kind.ts} (64%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/duplicate-to.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/manifests.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/duplicate-to-data-source.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/duplicate-to-repository.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/types.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/duplicate-data-source.interface.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/duplicate-repository.interface.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/duplicate-to.action.kind.ts similarity index 64% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.kind.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/duplicate-to.action.kind.ts index 051ebdde0b..e123389b54 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/duplicate-to.action.kind.ts @@ -3,22 +3,22 @@ import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extensio export const manifest: UmbBackofficeManifestKind = { type: 'kind', - alias: 'Umb.Kind.EntityAction.Duplicate', - matchKind: 'duplicate', + alias: 'Umb.Kind.EntityAction.DuplicateTo', + matchKind: 'duplicateTo', matchType: 'entityAction', manifest: { ...UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST.manifest, type: 'entityAction', - kind: 'duplicate', - api: () => import('./duplicate.action.js'), + kind: 'duplicateTo', + api: () => import('./duplicate-to.action.js'), weight: 600, forEntityTypes: [], meta: { - icon: 'icon-documents', + icon: 'icon-enter', label: '#actions_copy', - itemRepositoryAlias: '', - duplicateRepositoryAlias: '', - pickerModal: '', + treeRepositoryAlias: '', + duplicateToRepositoryAlias: '', + treePickerModal: '', }, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/duplicate-to.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/duplicate-to.action.ts new file mode 100644 index 0000000000..8d05a22c9b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/duplicate-to.action.ts @@ -0,0 +1,47 @@ +import { UmbEntityActionBase } from '../../entity-action-base.js'; +import { UmbRequestReloadStructureForEntityEvent } from '../../request-reload-structure-for-entity.event.js'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import type { UmbduplicateToRepository } from '@umbraco-cms/backoffice/repository'; +import type { MetaEntityActionduplicateToKind } from '@umbraco-cms/backoffice/extension-registry'; +import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; + +export class UmbDuplicateToEntityAction extends UmbEntityActionBase { + async execute() { + if (!this.args.unique) throw new Error('Unique is not available'); + if (!this.args.entityType) throw new Error('Entity Type is not available'); + + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const modalContext = modalManager.open(this, this.args.meta.treePickerModal) as any; // TODO: make generic picker interface with selection + const value = await modalContext.onSubmit(); + const destinationUnique = value.selection[0]; + if (destinationUnique === undefined) throw new Error('Destination Unique is not available'); + + const duplicateToRepository = await createExtensionApiByAlias( + this, + this.args.meta.duplicateToRepositoryAlias, + ); + if (!duplicateToRepository) throw new Error('Duplicate repository is not available'); + + await duplicateToRepository.requestduplicate({ + unique: this.args.unique, + destination: { unique: destinationUnique }, + }); + + this.#reloadMenu(); + } + + async #reloadMenu() { + const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadStructureForEntityEvent({ + unique: this.args.unique, + entityType: this.args.entityType, + }); + + actionEventContext.dispatchEvent(event); + + // TODO: Reload destination + } +} + +export default UmbduplicateToEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/manifests.ts new file mode 100644 index 0000000000..e974b50a90 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate-to/manifests.ts @@ -0,0 +1,3 @@ +import { manifest as duplicateToKindManifest } from './duplicate-to.action.kind.js'; + +export const manifests = [duplicateToKindManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.ts deleted file mode 100644 index 14a1df3b0c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { UmbEntityActionBase } from '../../entity-action-base.js'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; -import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import type { MetaEntityActionDuplicateKind } from '@umbraco-cms/backoffice/extension-registry'; -import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import type { UmbDuplicateRepository, UmbItemRepository } from '@umbraco-cms/backoffice/repository'; - -export class UmbDuplicateEntityAction extends UmbEntityActionBase { - // TODO: make base type for item and detail models - #itemRepository?: UmbItemRepository; - #duplicateRepository?: UmbDuplicateRepository; - #init: Promise; - - constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { - super(host, args); - - // TODO: We should properly look into how we can simplify the one time usage of a extension api, as its a bit of overkill to take conditions/overwrites and observation of extensions into play here: [NL] - // But since this happens when we execute an action, it does most likely not hurt any users, but it is a bit of a overkill to do this for every action: [NL] - this.#init = Promise.all([ - new UmbExtensionApiInitializer( - this._host, - umbExtensionsRegistry, - this.args.meta.itemRepositoryAlias, - [this._host], - (permitted, ctrl) => { - this.#itemRepository = permitted ? (ctrl.api as UmbItemRepository) : undefined; - }, - ).asPromise(), - - new UmbExtensionApiInitializer( - this._host, - umbExtensionsRegistry, - this.args.meta.duplicateRepositoryAlias, - [this._host], - (permitted, ctrl) => { - this.#duplicateRepository = permitted ? (ctrl.api as UmbDuplicateRepository) : undefined; - }, - ).asPromise(), - ]); - } - - async execute() { - if (!this.args.unique) throw new Error('Unique is not available'); - await this.#init; - - const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const modalContext = modalManager.open(this, this.args.meta.pickerModal) as any; // TODO: make generic picker interface with selection - const value = await modalContext.onSubmit(); - if (!value) return; - await this.#duplicateRepository!.duplicate(this.args.unique, value.selection[0]); - } -} - -export default UmbDuplicateEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/manifests.ts deleted file mode 100644 index 52c2580961..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/manifests.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { manifest as duplicateKindManifest } from './duplicate.action.kind.js'; - -export const manifests = [duplicateKindManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/duplicate-to-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/duplicate-to-data-source.interface.ts new file mode 100644 index 0000000000..5f9f931b38 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/duplicate-to-data-source.interface.ts @@ -0,0 +1,6 @@ +import type { UmbDuplicateToRequestArgs } from './types.js'; +import type { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; + +export interface UmbDuplicateToDataSource { + moveTo(args: UmbDuplicateToRequestArgs): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/duplicate-to-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/duplicate-to-repository.interface.ts new file mode 100644 index 0000000000..5900298f47 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/duplicate-to-repository.interface.ts @@ -0,0 +1,7 @@ +import type { UmbRepositoryErrorResponse } from '../types.js'; +import type { UmbDuplicateToRequestArgs } from './types.js'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export interface UmbDuplicateToRepository extends UmbApi { + requestDuplicateTo(args: UmbDuplicateToRequestArgs): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/index.ts new file mode 100644 index 0000000000..ee794fb2e3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/index.ts @@ -0,0 +1,4 @@ +export type { UmbDuplicateToDataSource } from './duplicate-to-data-source.interface.js'; +export type { UmbDuplicateToRepository } from './duplicate-to-repository.interface.js'; + +export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/types.ts new file mode 100644 index 0000000000..f8b91ab3c2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate-to/types.ts @@ -0,0 +1,6 @@ +export interface UmbDuplicateToRequestArgs { + unique: string; + destination: { + unique: string | null; + }; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/duplicate-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/duplicate-data-source.interface.ts deleted file mode 100644 index fba239d0d9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/duplicate-data-source.interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; - -export interface UmbDuplicateDataSource { - duplicate(unique: string, targetUnique: string | null): Promise>; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/duplicate-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/duplicate-repository.interface.ts deleted file mode 100644 index 0b7ff3aae0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/duplicate-repository.interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { UmbRepositoryResponse } from '../types.js'; - -export interface UmbDuplicateRepository { - duplicate(unique: string, targetUnique: string): Promise>; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/index.ts deleted file mode 100644 index 4c9af6a56c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/duplicate/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { UmbDuplicateDataSource } from './duplicate-data-source.interface.js'; -export type { UmbDuplicateRepository } from './duplicate-repository.interface.js';