Feature: Media Type Create Options (#18196)

* use extension point for media type create options

* register collection action
This commit is contained in:
Mads Rasmussen
2025-02-03 16:42:02 +01:00
committed by GitHub
parent 058f901293
commit 1e5bfd8c3a
11 changed files with 109 additions and 43 deletions

View File

@@ -2,8 +2,9 @@ import { manifests as mediaManifests } from './media/manifests.js';
import { manifests as mediaSectionManifests } from './media-section/manifests.js';
import { manifests as mediaTypesManifests } from './media-types/manifests.js';
import { manifests as imagingManifests } from './imaging/manifests.js';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<UmbExtensionManifest> = [
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
...mediaSectionManifests,
...mediaManifests,
...mediaTypesManifests,

View File

@@ -1,27 +0,0 @@
import { UMB_MEDIA_TYPE_CREATE_OPTIONS_MODAL } from './modal/constants.js';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
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';
export class UmbCreateMediaTypeEntityAction extends UmbEntityActionBase<never> {
constructor(host: UmbControllerHost, args: UmbEntityActionArgs<never>) {
super(host, args);
}
override async execute() {
const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);
const modalContext = modalManager.open(this, UMB_MEDIA_TYPE_CREATE_OPTIONS_MODAL, {
data: {
parent: {
unique: this.args.unique,
entityType: this.args.entityType,
},
},
});
await modalContext.onSubmit();
}
}
export { UmbCreateMediaTypeEntityAction as api };

View File

@@ -0,0 +1,20 @@
import { UMB_CREATE_MEDIA_TYPE_WORKSPACE_PATH_PATTERN } from '../../../paths.js';
import type { UmbMediaTypeFolderEntityType, UmbMediaTypeRootEntityType } from '../../../entity.js';
import { UmbEntityCreateOptionActionBase } from '@umbraco-cms/backoffice/entity-create-option-action';
import type { MetaEntityCreateOptionAction } from '@umbraco-cms/backoffice/entity-create-option-action';
export class UmbDefaultMediaTypeCreateOptionAction extends UmbEntityCreateOptionActionBase<MetaEntityCreateOptionAction> {
override async getHref() {
const parentEntityType = this.args.entityType as UmbMediaTypeRootEntityType | UmbMediaTypeFolderEntityType;
if (!parentEntityType) throw new Error('Entity type is required to create a document type');
const parentUnique = this.args.unique ?? null;
return UMB_CREATE_MEDIA_TYPE_WORKSPACE_PATH_PATTERN.generateAbsolute({
parentEntityType,
parentUnique,
});
}
}
export { UmbDefaultMediaTypeCreateOptionAction as api };

View File

@@ -0,0 +1,17 @@
import { UMB_MEDIA_TYPE_FOLDER_ENTITY_TYPE, UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE } from '../../../entity.js';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
{
type: 'entityCreateOptionAction',
alias: 'Umb.EntityCreateOptionAction.MediaType.Default',
name: 'Default Media Type Entity Create Option Action',
weight: 1200,
api: () => import('./default-media-type-create-option-action.js'),
forEntityTypes: [UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE, UMB_MEDIA_TYPE_FOLDER_ENTITY_TYPE],
meta: {
icon: 'icon-add',
label: '#actions_create',
},
},
];

View File

@@ -0,0 +1,19 @@
import { UMB_MEDIA_TYPE_FOLDER_ENTITY_TYPE, UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE } from '../../../entity.js';
import { UMB_MEDIA_TYPE_FOLDER_REPOSITORY_ALIAS } from '../../../constants.js';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
{
type: 'entityCreateOptionAction',
kind: 'folder',
alias: 'Umb.EntityCreateOptionAction.MediaType.Folder',
name: 'Media Type Folder Entity Create Option Action',
forEntityTypes: [UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE, UMB_MEDIA_TYPE_FOLDER_ENTITY_TYPE],
meta: {
icon: 'icon-folder',
label: '#create_folder',
description: '#create_folderDescription',
folderRepositoryAlias: UMB_MEDIA_TYPE_FOLDER_REPOSITORY_ALIAS,
},
},
];

View File

@@ -4,25 +4,26 @@ import {
UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE,
} from '../../entity.js';
export const manifests: Array<UmbExtensionManifest> = [
import { manifests as defaultManifests } from './default/manifests.js';
import { manifests as folderManifests } from './folder/manifests.js';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
{
type: 'entityAction',
kind: 'default',
kind: 'create',
alias: 'Umb.EntityAction.MediaType.Create',
name: 'Create Media Type Entity Action',
weight: 1200,
api: () => import('./create.action.js'),
forEntityTypes: [UMB_MEDIA_TYPE_ENTITY_TYPE, UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE, UMB_MEDIA_TYPE_FOLDER_ENTITY_TYPE],
meta: {
icon: 'icon-add',
label: '#actions_create',
additionalOptions: true,
},
},
// TODO: Deprecated: Will be removed in 17.0.0
{
type: 'modal',
alias: 'Umb.Modal.MediaTypeCreateOptions',
name: 'Media Type Create Options Modal',
element: () => import('./modal/media-type-create-options-modal.element.js'),
},
...defaultManifests,
...folderManifests,
];

View File

@@ -3,15 +3,29 @@ import type { UmbMediaTypeCreateOptionsModalData } from './constants.js';
import { html, customElement } from '@umbraco-cms/backoffice/external/lit';
import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal';
import { UmbCreateFolderEntityAction } from '@umbraco-cms/backoffice/tree';
import { UmbDeprecation } from '@umbraco-cms/backoffice/utils';
/**
* @deprecated This element is deprecated and will be removed in v.17.0.0.
* Please use the UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL instead.
* @exports
* @class UmbMediaTypeCreateOptionsModalElement
* @augments {UmbModalBaseElement<UmbDataTypeCreateOptionsModalData>}
*/
@customElement('umb-media-type-create-options-modal')
export class UmbDataTypeCreateOptionsModalElement extends UmbModalBaseElement<UmbMediaTypeCreateOptionsModalData> {
export class UmbMediaTypeCreateOptionsModalElement extends UmbModalBaseElement<UmbMediaTypeCreateOptionsModalData> {
#createFolderAction?: UmbCreateFolderEntityAction;
override connectedCallback(): void {
super.connectedCallback();
if (!this.data?.parent) throw new Error('A parent is required to create a folder');
new UmbDeprecation({
deprecated: 'umb-media-type-create-options-modal',
removeInVersion: '17.0.0',
solution: 'Use UMB_ENTITY_CREATE_OPTION_ACTION_LIST_MODAL instead',
}).warn();
// TODO: render the info from this instance in the list of actions
this.#createFolderAction = new UmbCreateFolderEntityAction(this, {
unique: this.data.parent.unique,
@@ -68,10 +82,10 @@ export class UmbDataTypeCreateOptionsModalElement extends UmbModalBaseElement<Um
}
}
export default UmbDataTypeCreateOptionsModalElement;
export default UmbMediaTypeCreateOptionsModalElement;
declare global {
interface HTMLElementTagNameMap {
'umb-media-type-create-options-modal': UmbDataTypeCreateOptionsModalElement;
'umb-media-type-create-options-modal': UmbMediaTypeCreateOptionsModalElement;
}
}

View File

@@ -8,8 +8,9 @@ import { manifests as moveManifests } from './move-to/manifests.js';
import { manifests as duplicateManifests } from './duplicate/manifests.js';
import { manifests as exportManifests } from './export/manifests.js';
import { manifests as importManifests } from './import/manifests.js';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<UmbExtensionManifest> = [
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
{
type: 'entityAction',
kind: 'delete',

View File

@@ -5,8 +5,9 @@ import { manifests as treeManifests } from './tree/manifests.js';
import { manifests as workspaceManifests } from './workspace/manifests.js';
import { manifests as propertyEditorUiManifests } from './property-editors/manifests.js';
import { manifests as searchManifests } from './search/manifests.js';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<UmbExtensionManifest> = [
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
...entityActionsManifests,
...menuManifests,
...repositoryManifests,

View File

@@ -0,0 +1,17 @@
import { UMB_MEDIA_TYPE_TREE_ITEM_CHILDREN_COLLECTION_ALIAS } from '../constants.js';
import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection';
export const manifests: Array<UmbExtensionManifest> = [
{
type: 'collectionAction',
kind: 'create',
name: 'Media Type Tree Item Children Collection Create Action',
alias: 'Umb.CollectionAction.MediaTypeTreeItemChildren.Create',
conditions: [
{
alias: UMB_COLLECTION_ALIAS_CONDITION,
match: UMB_MEDIA_TYPE_TREE_ITEM_CHILDREN_COLLECTION_ALIAS,
},
],
},
];

View File

@@ -1,5 +1,6 @@
import { manifests as viewManifests } from './views/manifests.js';
import { manifests as actionManifests } from './action/manifests.js';
import { manifests as repositoryManifests } from './repository/manifests.js';
import { manifests as viewManifests } from './views/manifests.js';
import { UMB_MEDIA_TYPE_TREE_ITEM_CHILDREN_COLLECTION_ALIAS } from './constants.js';
import { UMB_MEDIA_TYPE_TREE_ITEM_CHILDREN_COLLECTION_REPOSITORY_ALIAS } from './repository/index.js';
@@ -13,6 +14,7 @@ export const manifests: Array<UmbExtensionManifest> = [
repositoryAlias: UMB_MEDIA_TYPE_TREE_ITEM_CHILDREN_COLLECTION_REPOSITORY_ALIAS,
},
},
...viewManifests,
...actionManifests,
...repositoryManifests,
...viewManifests,
];