diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/ref-item/ref-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/ref-item/ref-item.element.ts index bc4ad0c969..1bda4e17bc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/ref-item/ref-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/ref-item/ref-item.element.ts @@ -1,66 +1,29 @@ -import { html, customElement, css, property, when } from '@umbraco-cms/backoffice/external/lit'; +import { customElement, css, property, type PropertyValues } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UUIRefElement, UUIRefEvent, UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; +import { UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-ref-item') -export class UmbRefItemElement extends UmbElementMixin(UUIRefElement) { - @property({ type: String }) - name = ''; - - @property({ type: String }) - detail = ''; - +export class UmbRefItemElement extends UmbElementMixin(UUIRefNodeElement) { @property({ type: String }) icon = ''; - constructor() { - super(); + #iconElement = document.createElement('umb-icon'); - this.selectable = true; + protected override firstUpdated(_changedProperties: PropertyValues): void { + super.firstUpdated(_changedProperties); - this.addEventListener(UUIRefEvent.OPEN, () => this.dispatchEvent(new Event('click'))); - } - - override render() { - return html` - -
- - `; + // Temporary fix for the icon appending, this could in the future be changed to override a renderIcon method, or other ways to make this happen without appending children. + this.#iconElement.setAttribute('slot', 'icon'); + this.#iconElement.setAttribute('name', this.icon); + this.appendChild(this.#iconElement); } static override styles = [ - ...UUIRefElement.styles, ...UUIRefNodeElement.styles, - UmbTextStyles, css` :host { - padding: calc(var(--uui-size-4) + 1px); - } - - #btn-item { - text-decoration: none; - color: inherit; - align-self: stretch; - line-height: normal; - - display: flex; - position: relative; - align-items: center; - cursor: pointer; + padding-top: var(--uui-size-3); + padding-bottom: var(--uui-size-3); } `, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts index 5150c3946d..fc5eed5435 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/create/modal/entity-create-option-action-list-modal.element.ts @@ -18,8 +18,7 @@ import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; type ManifestType = ManifestEntityCreateOptionAction; -const elementName = 'umb-entity-create-option-action-list-modal'; -@customElement(elementName) +@customElement('umb-entity-create-option-action-list-modal') export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseElement< UmbEntityCreateOptionActionListModalData, UmbEntityCreateOptionActionListModalValue @@ -71,6 +70,8 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle if (!controller.api) throw new Error('No API found'); await controller.api.execute(); + + this._submitModal(); } #getTarget(href?: string) { @@ -83,17 +84,19 @@ export class UmbEntityCreateOptionActionListModalElement extends UmbModalBaseEle override render() { return html` - + ${this._apiControllers.length === 0 ? html`
No create options available.
` - : html` - ${repeat( - this._apiControllers, - (controller) => controller.manifest?.alias, - (controller, index) => this.#renderRefItem(controller, index), - )} - `} + : html` + + ${repeat( + this._apiControllers, + (controller) => controller.manifest?.alias, + (controller, index) => this.#renderRefItem(controller, index), + )} + + `}
this.#onClick(event, controller, href)} + detail=${ifDefined(description)} + icon=${manifest.meta.icon} href=${ifDefined(href)} target=${this.#getTarget(href)} - ?selectable=${!href} - ?readonly=${!href}> - - + @open=${(event: Event) => this.#onClick(event, controller, href)}> + `; } } @@ -129,6 +131,6 @@ export { UmbEntityCreateOptionActionListModalElement as element }; declare global { interface HTMLElementTagNameMap { - [elementName]: UmbEntityCreateOptionActionListModalElement; + 'umb-entity-create-option-action-list-modal': UmbEntityCreateOptionActionListModalElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts index 0f5fa9b803..dc6d976642 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts @@ -75,7 +75,7 @@ export class UmbItemPickerModalElement extends UmbModalBaseElement this.#submit(item)}> + @open=${() => this.#submit(item)}> `, )} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/default/default-picker-search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/default/default-picker-search-result-item.element.ts index f59d63e477..afd6fd610d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/default/default-picker-search-result-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/default/default-picker-search-result-item.element.ts @@ -53,6 +53,7 @@ export class UmbDefaultPickerSearchResultItemElement extends UmbLitElement { name=${item.name} id=${item.unique} icon=${item.icon ?? 'icon-document'} + select-only selectable @selected=${() => this.#pickerContext?.selection.select(item.unique)} @deselected=${() => this.#pickerContext?.selection.deselect(item.unique)} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/default/default-document-type-create-option-action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/default/default-document-type-create-option-action.ts new file mode 100644 index 0000000000..bca0e9cc8f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/default/default-document-type-create-option-action.ts @@ -0,0 +1,21 @@ +import { UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN } from '../../../paths.js'; +import type { UmbDocumentTypeEntityTypeUnion } 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 UmbDefaultDocumentTypeCreateOptionAction extends UmbEntityCreateOptionActionBase { + override async getHref() { + const parentEntityType = this.args.entityType as UmbDocumentTypeEntityTypeUnion; + if (!parentEntityType) throw new Error('Entity type is required to create a document type'); + + const parentUnique = this.args.unique ?? null; + + return UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN.generateAbsolute({ + parentEntityType, + parentUnique, + presetAlias: null, + }); + } +} + +export { UmbDefaultDocumentTypeCreateOptionAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/element/element-type-create-option-action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/element/element-type-create-option-action.ts new file mode 100644 index 0000000000..eb5dbd8544 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/element/element-type-create-option-action.ts @@ -0,0 +1,24 @@ +import { + UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN, + UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_ELEMENT, +} from '../../../paths.js'; +import type { UmbDocumentTypeEntityTypeUnion } 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 UmbElementTypeCreateOptionAction extends UmbEntityCreateOptionActionBase { + override async getHref() { + const parentEntityType = this.args.entityType as UmbDocumentTypeEntityTypeUnion; + if (!parentEntityType) throw new Error('Entity type is required to create a document type'); + + const parentUnique = this.args.unique ?? null; + + return UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN.generateAbsolute({ + parentEntityType, + parentUnique, + presetAlias: UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_ELEMENT, + }); + } +} + +export { UmbElementTypeCreateOptionAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/folder/document-type-folder-create-option-action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/folder/document-type-folder-create-option-action.ts new file mode 100644 index 0000000000..d184f789d0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/folder/document-type-folder-create-option-action.ts @@ -0,0 +1,12 @@ +import { UMB_DOCUMENT_TYPE_FOLDER_REPOSITORY_ALIAS } from '../../../tree/folder/repository/constants.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbCreateFolderEntityAction, type MetaEntityActionFolderKind } from '@umbraco-cms/backoffice/tree'; +import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; + +export class UmbDocumentTypeFolderCreateOptionAction extends UmbCreateFolderEntityAction { + constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { + super(host, { ...args, meta: { ...args.meta, folderRepositoryAlias: UMB_DOCUMENT_TYPE_FOLDER_REPOSITORY_ALIAS } }); + } +} + +export { UmbDocumentTypeFolderCreateOptionAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts index 59786bc3e6..b1cdc20482 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts @@ -1,25 +1,83 @@ -import { UMB_DOCUMENT_TYPE_ROOT_ENTITY_TYPE } from '../../entity.js'; +import { UMB_DOCUMENT_TYPE_ENTITY_TYPE, UMB_DOCUMENT_TYPE_ROOT_ENTITY_TYPE } from '../../entity.js'; import { UMB_DOCUMENT_TYPE_FOLDER_ENTITY_TYPE } from '../../tree/index.js'; export const manifests: Array = [ { type: 'entityAction', - kind: 'default', + kind: 'create', alias: 'Umb.EntityAction.DocumentType.Create', name: 'Create Document Type Entity Action', weight: 1200, - api: () => import('./create.action.js'), forEntityTypes: [UMB_DOCUMENT_TYPE_ROOT_ENTITY_TYPE, UMB_DOCUMENT_TYPE_FOLDER_ENTITY_TYPE], meta: { icon: 'icon-add', label: '#actions_create', additionalOptions: true, + headline: '#create_createUnder #treeHeaders_documentTypes', }, }, { - type: 'modal', - alias: 'Umb.Modal.DocumentTypeCreateOptions', - name: 'Document Type Create Options Modal', - element: () => import('./modal/document-type-create-options-modal.element.js'), + type: 'entityCreateOptionAction', + alias: 'Umb.EntityCreateOptionAction.DocumentType.Default', + name: 'Default Document Type Entity Create Option Action', + weight: 100, + api: () => import('./default/default-document-type-create-option-action.js'), + forEntityTypes: [ + UMB_DOCUMENT_TYPE_ENTITY_TYPE, + UMB_DOCUMENT_TYPE_ROOT_ENTITY_TYPE, + UMB_DOCUMENT_TYPE_FOLDER_ENTITY_TYPE, + ], + meta: { + icon: 'icon-document', + label: '#create_documentType', + description: '#create_documentTypeDescription', + }, + }, + { + type: 'entityCreateOptionAction', + alias: 'Umb.EntityCreateOptionAction.DocumentType.DocumentWithTemplate', + name: 'Document Type with Template Document Type Entity Create Option Action', + weight: 90, + api: () => import('./template/document-type-with-template-create-option-action.js'), + forEntityTypes: [ + UMB_DOCUMENT_TYPE_ENTITY_TYPE, + UMB_DOCUMENT_TYPE_ROOT_ENTITY_TYPE, + UMB_DOCUMENT_TYPE_FOLDER_ENTITY_TYPE, + ], + meta: { + icon: 'icon-document-html', + label: '#create_documentTypeWithTemplate', + description: '#create_documentTypeWithTemplateDescription', + }, + }, + { + type: 'entityCreateOptionAction', + alias: 'Umb.EntityCreateOptionAction.DocumentType.ElementType', + name: 'Element Type Document Type Entity Create Option Action', + weight: 80, + api: () => import('./element/element-type-create-option-action.js'), + forEntityTypes: [ + UMB_DOCUMENT_TYPE_ENTITY_TYPE, + UMB_DOCUMENT_TYPE_ROOT_ENTITY_TYPE, + UMB_DOCUMENT_TYPE_FOLDER_ENTITY_TYPE, + ], + meta: { + icon: 'icon-plugin', + label: '#create_elementType', + description: '#create_elementTypeDescription', + }, + }, + { + type: 'entityCreateOptionAction', + alias: 'Umb.EntityCreateOptionAction.DocumentType.Folder', + name: 'Folder Document Type Entity Create Option Action', + weight: 70, + api: () => import('./folder/document-type-folder-create-option-action.js'), + forEntityTypes: [UMB_DOCUMENT_TYPE_ROOT_ENTITY_TYPE, UMB_DOCUMENT_TYPE_FOLDER_ENTITY_TYPE], + meta: { + icon: 'icon-folder', + label: '#create_folder', + description: '#create_folderDescription', + }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/constants.ts index 2a256bc68d..5d9e988ff0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/constants.ts @@ -1,10 +1,12 @@ import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; +/** @deprecated No longer used internally. This will be removed in Umbraco 17. [LK] */ export interface UmbDocumentTypeCreateOptionsModalData { parent: UmbEntityModel; } +/** @deprecated No longer used internally. This will be removed in Umbraco 17. [LK] */ export const UMB_DOCUMENT_TYPE_CREATE_OPTIONS_MODAL = new UmbModalToken( 'Umb.Modal.DocumentTypeCreateOptions', { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts index e678373629..b9406aa3c2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts @@ -12,6 +12,7 @@ import { UmbCreateFolderEntityAction } from '@umbraco-cms/backoffice/tree'; // Include the types from the DocumentTypeWorkspacePresetType + folder. type OptionsPresetType = UmbCreateDocumentTypeWorkspacePresetType | 'folder' | null; +/** @deprecated No longer used internally. This will be removed in Umbraco 17. [LK] */ @customElement('umb-document-type-create-options-modal') export class UmbDataTypeCreateOptionsModalElement extends UmbModalBaseElement { #createFolderAction?: UmbCreateFolderEntityAction; @@ -110,7 +111,7 @@ export class UmbDataTypeCreateOptionsModalElement extends UmbModalBaseElement this.#onClick(item.preset)}> + @open=${() => this.#onClick(item.preset)}> `, )} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/template/document-type-with-template-create-option-action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/template/document-type-with-template-create-option-action.ts new file mode 100644 index 0000000000..4e5f7aace9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/template/document-type-with-template-create-option-action.ts @@ -0,0 +1,24 @@ +import { + UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN, + UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_TEMPLATE, +} from '../../../paths.js'; +import type { UmbDocumentTypeEntityTypeUnion } 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 UmbDocumentTypeWithTemplateCreateOptionAction extends UmbEntityCreateOptionActionBase { + override async getHref() { + const parentEntityType = this.args.entityType as UmbDocumentTypeEntityTypeUnion; + if (!parentEntityType) throw new Error('Entity type is required to create a document type'); + + const parentUnique = this.args.unique ?? null; + + return UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN.generateAbsolute({ + parentEntityType, + parentUnique, + presetAlias: UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_TEMPLATE, + }); + } +} + +export { UmbDocumentTypeWithTemplateCreateOptionAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/dynamic-root/modals/dynamic-root-origin-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/dynamic-root/modals/dynamic-root-origin-picker-modal.element.ts index a922316bf3..eacb4c4557 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/dynamic-root/modals/dynamic-root-origin-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/dynamic-root/modals/dynamic-root-origin-picker-modal.element.ts @@ -76,7 +76,7 @@ export class UmbDynamicRootOriginPickerModalModalElement extends UmbModalBaseEle name=${ifDefined(item.meta.label)} detail=${ifDefined(item.meta.description)} icon=${ifDefined(item.meta.icon)} - @click=${() => this.#choose(item)}> + @open=${() => this.#choose(item)}> `, )} diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/dynamic-root/modals/dynamic-root-query-step-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/dynamic-root/modals/dynamic-root-query-step-picker-modal.element.ts index a613d61828..99afeac359 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/dynamic-root/modals/dynamic-root-query-step-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/dynamic-root/modals/dynamic-root-query-step-picker-modal.element.ts @@ -63,7 +63,7 @@ export class UmbDynamicRootQueryStepPickerModalModalElement extends UmbModalBase name=${ifDefined(item.meta.label)} detail=${ifDefined(item.meta.description)} icon=${ifDefined(item.meta.icon)} - @click=${() => this.#choose(item)}> + @open=${() => this.#choose(item)}> `, )}