Merge branch 'feature/entity-action-kind' of https://github.com/umbraco/Umbraco.CMS.Backoffice into feature/entity-action-kind

This commit is contained in:
Niels Lyngsø
2024-03-03 22:03:49 +01:00
12 changed files with 62 additions and 108 deletions

View File

@@ -10,10 +10,17 @@ export interface ManifestEntityAction<MetaType extends MetaEntityAction>
extends ManifestElementAndApi<UmbControllerHostElement, UmbEntityAction<MetaType>>,
ManifestWithDynamicConditions {
type: 'entityAction';
entityTypes: Array<string>;
meta: MetaType;
}
export interface MetaEntityAction {
export interface MetaEntityAction {}
export interface ManifestEntityActionDefaultKind extends ManifestEntityAction<MetaEntityActionDefaultKind> {
type: 'entityAction';
kind: 'default';
}
export interface MetaEntityActionDefaultKind extends MetaEntityAction {
/**
* An icon to represent the action to be performed
*
@@ -22,7 +29,7 @@ export interface MetaEntityAction {
* "icon-grid"
* ]
*/
icon?: string;
icon: string;
/**
* The friendly name of the action to perform
@@ -32,9 +39,7 @@ export interface MetaEntityAction {
* "Create Content Template"
* ]
*/
label?: string;
entityTypes: Array<string>;
label: string;
}
// DELETE
@@ -43,7 +48,7 @@ export interface ManifestEntityActionDeleteKind extends ManifestEntityAction<Met
kind: 'delete';
}
export interface MetaEntityActionDeleteKind extends MetaEntityAction {
export interface MetaEntityActionDeleteKind extends MetaEntityActionDefaultKind {
detailRepositoryAlias: string;
itemRepositoryAlias: string;
}
@@ -54,7 +59,7 @@ export interface ManifestEntityActionRenameKind extends ManifestEntityAction<Met
kind: 'rename';
}
export interface MetaEntityActionRenameKind extends MetaEntityAction {
export interface MetaEntityActionRenameKind extends MetaEntityActionDefaultKind {
renameRepositoryAlias: string;
itemRepositoryAlias: string;
}
@@ -66,7 +71,7 @@ export interface ManifestEntityActionReloadTreeItemChildrenKind
kind: 'reloadTreeItemChildren';
}
export interface MetaEntityActionReloadTreeItemChildrenKind extends MetaEntityAction {}
export interface MetaEntityActionReloadTreeItemChildrenKind extends MetaEntityActionDefaultKind {}
// DUPLICATE
export interface ManifestEntityActionDuplicateKind extends ManifestEntityAction<MetaEntityActionDuplicateKind> {
@@ -74,20 +79,19 @@ export interface ManifestEntityActionDuplicateKind extends ManifestEntityAction<
kind: 'duplicate';
}
export interface MetaEntityActionDuplicateKind extends MetaEntityAction {
export interface MetaEntityActionDuplicateKind extends MetaEntityActionDefaultKind {
duplicateRepositoryAlias: string;
itemRepositoryAlias: string;
pickerModalAlias: string;
}
// MOVE
export interface ManifestEntityActionMoveKind extends ManifestEntityAction<MetaEntityActionMoveKind> {
type: 'entityAction';
kind: 'move';
}
export interface MetaEntityActionMoveKind extends MetaEntityAction {
export interface MetaEntityActionMoveKind extends MetaEntityActionDefaultKind {
moveRepositoryAlias: string;
itemRepositoryAlias: string;
pickerModalAlias: string;

View File

@@ -1,9 +1,8 @@
import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js';
import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../../repository/index.js';
import { UmbDocumentCultureAndHostnamesEntityAction } from './culture-and-hostnames.action.js';
import type { ManifestEntityAction, ManifestModal } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestModal, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
const entityActions: Array<ManifestEntityAction> = [
const entityActions: Array<ManifestTypes> = [
{
type: 'entityAction',
alias: 'Umb.EntityAction.Document.CultureAndHostnames',
@@ -13,7 +12,6 @@ const entityActions: Array<ManifestEntityAction> = [
meta: {
icon: 'icon-home',
label: 'Culture and Hostnames',
repositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
entityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
},
},

View File

@@ -1,18 +1,13 @@
import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js';
import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../entity.js';
import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js';
import { UmbPublishDocumentEntityAction } from './publish.action.js';
import { UmbCreateDocumentBlueprintEntityAction } from './create-blueprint.action.js';
import { UmbUnpublishDocumentEntityAction } from './unpublish.action.js';
import { UmbRollbackDocumentEntityAction } from './rollback.action.js';
import { manifests as createManifests } from './create/manifests.js';
import { manifests as publicAccessManifests } from './public-access/manifests.js';
import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnames/manifests.js';
import {
UmbDuplicateEntityAction,
UmbMoveEntityAction,
UmbSortChildrenOfEntityAction,
} from '@umbraco-cms/backoffice/entity-action';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
import { UMB_DOCUMENT_PICKER_MODAL } from '@umbraco-cms/backoffice/modal';
const entityActions: Array<ManifestTypes> = [
...createManifests,
@@ -24,49 +19,35 @@ const entityActions: Array<ManifestTypes> = [
name: 'Create Document Blueprint Entity Action',
weight: 800,
api: UmbCreateDocumentBlueprintEntityAction,
kind: 'default',
meta: {
entityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
icon: 'icon-blueprint',
label: 'Create Document Blueprint (TBD)',
entityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
},
},
{
type: 'entityAction',
alias: 'Umb.EntityAction.Document.Move',
name: 'Move Document Entity Action ',
weight: 700,
api: UmbMoveEntityAction,
kind: 'move',
meta: {
icon: 'icon-enter',
label: 'Move (TBD)',
repositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
entityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
moveRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
itemRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
pickerModelAlias: UMB_DOCUMENT_PICKER_MODAL.toString(),
},
},
{
type: 'entityAction',
alias: 'Umb.EntityAction.Document.Copy',
name: 'Copy Document Entity Action',
weight: 600,
api: UmbDuplicateEntityAction,
name: 'Duplicate Document Entity Action',
kind: 'duplicate',
meta: {
icon: 'icon-documents',
label: 'Copy (TBD)',
repositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
entityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
},
},
{
type: 'entityAction',
alias: 'Umb.EntityAction.Document.Sort',
name: 'Sort Document Entity Action',
weight: 500,
api: UmbSortChildrenOfEntityAction,
meta: {
icon: 'icon-navigation-vertical',
label: 'Sort (TBD)',
repositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
entityTypes: [UMB_DOCUMENT_ROOT_ENTITY_TYPE, UMB_DOCUMENT_ENTITY_TYPE],
duplicateRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
itemRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
pickerModalAlias: UMB_DOCUMENT_PICKER_MODAL.toString(),
},
},
{
@@ -74,11 +55,11 @@ const entityActions: Array<ManifestTypes> = [
alias: 'Umb.EntityAction.Document.Publish',
name: 'Publish Document Entity Action',
api: UmbPublishDocumentEntityAction,
kind: 'default',
meta: {
entityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
icon: 'icon-globe',
label: 'Publish',
repositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
entityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
},
},
{
@@ -86,23 +67,11 @@ const entityActions: Array<ManifestTypes> = [
alias: 'Umb.EntityAction.Document.Unpublish',
name: 'Unpublish Document Entity Action',
api: UmbUnpublishDocumentEntityAction,
kind: 'default',
meta: {
entityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
icon: 'icon-globe',
label: 'Unpublish',
repositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
entityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
},
},
{
type: 'entityAction',
alias: 'Umb.EntityAction.Document.Rollback',
name: 'Rollback Document Entity Action',
api: UmbRollbackDocumentEntityAction,
meta: {
icon: 'icon-undo',
label: 'Rollback (TBD)',
repositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS,
entityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
},
},
];

View File

@@ -1,10 +1,9 @@
//import { UMB_DOCUMENT_REPOSITORY_ALIAS } from '../../repository/manifests.js';
import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js';
import { UMB_DOCUMENT_PUBLIC_ACCESS_REPOSITORY_ALIAS } from './repository/manifests.js';
import { UmbDocumentPublicAccessEntityAction } from './public-access.action.js';
import type { ManifestEntityAction, ManifestModal } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestModal, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
const entityActions: Array<ManifestEntityAction> = [
const entityActions: Array<ManifestTypes> = [
{
type: 'entityAction',
alias: 'Umb.EntityAction.Document.PublicAccess',

View File

@@ -1,12 +1,19 @@
import { UMB_PUBLIC_ACCESS_MODAL } from './modal/public-access-modal.token.js';
import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action';
import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action';
import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
import type { UmbDocumentDetailRepository } from '@umbraco-cms/backoffice/document';
export class UmbDocumentPublicAccessEntityAction extends UmbEntityActionBase<UmbDocumentDetailRepository> {
async execute() {
if (!this.unique) throw new Error('Unique is not available');
const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);
modalManager.open(this, UMB_PUBLIC_ACCESS_MODAL, { data: { unique: this.unique } });
export class UmbDocumentPublicAccessEntityAction extends UmbEntityActionBase<never> {
constructor(host: UmbDocumentDetailRepository, args: UmbEntityActionArgs<never>) {
super(host, args);
}
async execute() {
if (!this.args.unique) throw new Error('Unique is not available');
const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);
modalManager.open(this, UMB_PUBLIC_ACCESS_MODAL, { data: { unique: this.args.unique } });
}
destroy(): void {}
}

View File

@@ -1,14 +0,0 @@
import type { UmbDocumentDetailRepository } from '../repository/index.js';
import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
export class UmbRollbackDocumentEntityAction extends UmbEntityActionBase<UmbDocumentDetailRepository> {
constructor(host: UmbControllerHost, repositoryAlias: string, unique: string, entityType: string) {
super(host, repositoryAlias, unique, entityType);
}
async execute() {
console.log(`execute for: ${this.unique}`);
//await this.repository?.rollback();
}
}

View File

@@ -2,11 +2,10 @@ import { umbPickDocumentVariantModal } from '../modals/pick-document-variant-mod
import { UmbDocumentDetailRepository, UmbDocumentPublishingRepository } from '../repository/index.js';
import { UmbDocumentVariantState } from '../types.js';
import { UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language';
import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action';
import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action';
import { UmbVariantId } from '@umbraco-cms/backoffice/variant';
export class UmbUnpublishDocumentEntityAction extends UmbEntityActionBase<never> {
export class UmbUnpublishDocumentEntityAction extends UmbEntityActionBase<undefined> {
async execute() {
if (!this.args.unique) throw new Error('The document unique identifier is missing');

View File

@@ -1,7 +1,7 @@
import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../../entity.js';
import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestEntityAction> = [
export const manifests: Array<ManifestTypes> = [
{
type: 'entityAction',
alias: 'Umb.EntityAction.Document.Tree.ReloadChildrenOf',

View File

@@ -489,9 +489,12 @@ export class UmbDocumentWorkspaceContext
public async unpublish() {
const unique = this.getUnique();
const entityType = this.getEntityType();
if (!unique) throw new Error('Unique is missing');
new UmbUnpublishDocumentEntityAction(this, '', unique, '').execute();
if (!entityType) throw new Error('Entity type is missing');
// TODO: remove meta
new UmbUnpublishDocumentEntityAction(this, { unique, entityType, meta: undefined }).execute();
}
async delete() {

View File

@@ -1,8 +1,8 @@
import { UMB_MEDIA_ENTITY_TYPE, UMB_MEDIA_ROOT_ENTITY_TYPE } from '../../entity.js';
import { UmbCreateMediaEntityAction } from './create.action.js';
import type { ManifestEntityAction, ManifestModal } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestModal, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
const entityActions: Array<ManifestEntityAction> = [
const entityActions: Array<ManifestTypes> = [
{
type: 'entityAction',
alias: 'Umb.EntityAction.Media.Create',
@@ -14,17 +14,6 @@ const entityActions: Array<ManifestEntityAction> = [
label: 'Create',
entityTypes: [UMB_MEDIA_ROOT_ENTITY_TYPE, UMB_MEDIA_ENTITY_TYPE],
},
/* removed until we have permissions in place
conditions: [
{
alias: 'Umb.Condition.UserPermission',
// TODO: investigate why the match property is not typed
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
//@ts-ignore
match: 'Umb.UserPermission.Media.Create',
},
],
*/
},
];

View File

@@ -1,7 +1,7 @@
import { UMB_MEDIA_ENTITY_TYPE, UMB_MEDIA_ROOT_ENTITY_TYPE } from '../../entity.js';
import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestEntityAction> = [
export const manifests: Array<ManifestTypes> = [
{
type: 'entityAction',
alias: 'Umb.EntityAction.Media.Tree.ReloadChildrenOf',

View File

@@ -1,7 +1,7 @@
import { UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE } from '../../entity.js';
import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestEntityAction> = [
export const manifests: Array<ManifestTypes> = [
{
type: 'entityAction',
alias: 'Umb.EntityAction.MemberType.Tree.ReloadChildrenOf',