From 22301934560d8b768018e54c2b2c90c1ec3df312 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 3 Mar 2024 16:50:36 +0100 Subject: [PATCH] register generic copy entity action --- .../common/copy/copy.action.kind.ts | 23 +++++++++ .../entity-action/common/copy/copy.action.ts | 50 +++++++++++++++++-- .../entity-action/common/copy/manifests.ts | 3 ++ .../entity-action/common/delete/manifests.ts | 3 ++ .../core/entity-action/common/index.ts | 2 +- .../entity-action/common/rename/manifests.ts | 3 +- .../packages/core/entity-action/manifests.ts | 5 +- .../models/entity-action.model.ts | 13 +++++ .../core/extension-registry/models/index.ts | 2 + 9 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/copy.action.kind.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/copy.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/copy.action.kind.ts new file mode 100644 index 0000000000..819cba9b0c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/copy.action.kind.ts @@ -0,0 +1,23 @@ +import { UmbCopyEntityAction } from './copy.action.js'; +import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifest: UmbBackofficeManifestKind = { + type: 'kind', + alias: 'Umb.Kind.EntityAction.Copy', + matchKind: 'copy', + matchType: 'entityAction', + manifest: { + type: 'entityAction', + kind: 'copy', + api: UmbCopyEntityAction, + weight: 900, + meta: { + icon: 'icon-trash', + label: 'Delete...', + entityTypes: [], + itemRepositoryAlias: '', + copyRepositoryAlias: '', + pickerModalAlias: '', + }, + }, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/copy.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/copy.action.ts index b7868d52ac..0022725ceb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/copy.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/copy.action.ts @@ -1,13 +1,55 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +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 { MetaEntityActionCopyKind } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import type { UmbCopyRepository, UmbItemRepository } from '@umbraco-cms/backoffice/repository'; -export class UmbCopyEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostElement, args: any) { +export class UmbCopyEntityAction extends UmbEntityActionBase { + // TODO: make base type for item and detail models + #itemRepository?: UmbItemRepository; + #copyRepository?: UmbCopyRepository; + #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.copyRepositoryAlias, + [this._host], + (permitted, ctrl) => { + this.#copyRepository = permitted ? (ctrl.api as UmbCopyRepository) : undefined; + }, + ).asPromise(), + ]); } async execute() { - console.log(`execute copy for: ${this.args.unique}`); + 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.pickerModalAlias) as any; // TODO: make generic picker interface with selection + const value = await modalContext.onSubmit(); + if (!value) return; + await this.#copyRepository!.copy(this.args.unique, value.selection[0]); } destroy(): void {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/manifests.ts new file mode 100644 index 0000000000..dc6437b76d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/copy/manifests.ts @@ -0,0 +1,3 @@ +import { manifest as copyKindManifest } from './copy.action.kind.js'; + +export const manifests = [copyKindManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/manifests.ts new file mode 100644 index 0000000000..f1a021c76a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/manifests.ts @@ -0,0 +1,3 @@ +import { manifest as deleteKindManifest } from './delete.action.kind.js'; + +export const manifests = [deleteKindManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts index 1d1c4fadd0..1f54d02f81 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts @@ -1,6 +1,6 @@ export * from './copy/copy.action.js'; export * from './delete/delete.action.js'; export * from './move/move.action.js'; +export * from './rename/index.js'; export * from './sort-children-of/sort-children-of.action.js'; export * from './trash/trash.action.js'; -export * from './rename/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/rename/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/rename/manifests.ts index 3dc49155de..cc8de2f35f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/rename/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/rename/manifests.ts @@ -1,3 +1,4 @@ import { manifests as renameModalManifests } from './modal/manifests.js'; +import { manifest as renameKindManifest } from './rename.action.kind.js'; -export const manifests = [...renameModalManifests]; +export const manifests = [...renameModalManifests, renameKindManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts index b9bd6c4ed0..2199a6d123 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts @@ -1,4 +1,5 @@ +import { manifests as copyEntityActionManifests } from './common/copy/manifests.js'; +import { manifests as deleteEntityActionManifests } from './common/delete/manifests.js'; import { manifests as renameEntityActionManifests } from './common/rename/manifests.js'; -import { manifest as deleteEntityActionManifest } from './common/delete/delete.action.kind.js'; -export const manifests = [...renameEntityActionManifests, deleteEntityActionManifest]; +export const manifests = [...copyEntityActionManifests, ...renameEntityActionManifests, deleteEntityActionManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts index 91201cffe1..d44713ed66 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts @@ -66,3 +66,16 @@ export interface ManifestEntityActionReloadTreeItemChildrenKind extends Manifest } export interface MetaEntityActionReloadTreeItemChildrenKind extends MetaEntityAction {} + +// COPY +export interface ManifestEntityActionCopyKind extends ManifestEntityAction { + type: 'entityAction'; + kind: 'copy'; + meta: MetaEntityActionCopyKind; +} + +export interface MetaEntityActionCopyKind extends MetaEntityAction { + copyRepositoryAlias: string; + itemRepositoryAlias: string; + pickerModalAlias: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts index 54bee0b152..9a11f6b821 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts @@ -8,6 +8,7 @@ import type { ManifestEntityActionDeleteKind, ManifestEntityActionRenameKind, ManifestEntityActionReloadTreeItemChildrenKind, + ManifestEntityActionCopyKind, } from './entity-action.model.js'; import type { ManifestDynamicRootOrigin, ManifestDynamicRootQueryStep } from './dynamic-root.model.js'; import type { ManifestEntityBulkAction } from './entity-bulk-action.model.js'; @@ -102,6 +103,7 @@ export type ManifestTypes = | ManifestEntityActionDeleteKind | ManifestEntityActionRenameKind | ManifestEntityActionReloadTreeItemChildrenKind + | ManifestEntityActionCopyKind | ManifestEntityBulkAction | ManifestEntryPoint | ManifestExternalLoginProvider