From c67cf508fe317a51ef2bb6cb1642b187486bd846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 5 Mar 2024 21:26:37 +0100 Subject: [PATCH 01/77] initial work on lit directive for focus --- .../src/external/lit/index.ts | 1 + .../directives/focus.lit-directive.ts | 33 +++++++++++++++++++ .../core/lit-element/directives/index.ts | 1 + .../src/packages/core/lit-element/index.ts | 1 + .../property-settings-modal.element.ts | 6 +++- 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/focus.lit-directive.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/external/lit/index.ts b/src/Umbraco.Web.UI.Client/src/external/lit/index.ts index 270a60fa6a..e7c9bc62c3 100644 --- a/src/Umbraco.Web.UI.Client/src/external/lit/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/lit/index.ts @@ -1,5 +1,6 @@ export * from 'lit'; export * from 'lit/decorators.js'; +export { directive, AsyncDirective } from 'lit/async-directive.js'; export * from 'lit/directives/class-map.js'; export * from 'lit/directives/if-defined.js'; export * from 'lit/directives/map.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/focus.lit-directive.ts b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/focus.lit-directive.ts new file mode 100644 index 0000000000..7e73e9103d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/focus.lit-directive.ts @@ -0,0 +1,33 @@ +import { AsyncDirective, directive, nothing, type ElementPart } from '@umbraco-cms/backoffice/external/lit'; + +class UmbFocusDirective extends AsyncDirective { + private _el?: HTMLElement; + + render() { + return nothing; + } + + override update(part: ElementPart) { + if (this._el !== part.element) { + (this._el = part.element as HTMLElement).focus(); + } + return nothing; + } + + override disconnected() { + this._el = undefined; + } + + //override reconnected() {} +} + +/** + * Sets focus on the given element once its connected to the DOM. + * + * ```js + * render(html``, container); + * ``` + */ +export const focus = directive(UmbFocusDirective); + +export type { UmbFocusDirective }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/index.ts new file mode 100644 index 0000000000..0ccb1bc7eb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/index.ts @@ -0,0 +1 @@ +export * from './focus.lit-directive.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/index.ts index c0b5f9cb8e..23bedd188b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/index.ts @@ -1 +1,2 @@ export * from './lit-element.element.js'; +export * from './directives/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/property-settings/property-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/property-settings/property-settings-modal.element.ts index 832bd3cdc0..fc2c9db4ab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/property-settings/property-settings-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/property-settings/property-settings-modal.element.ts @@ -9,6 +9,7 @@ import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import { css, html, nothing, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertySettingsModalValue, UmbPropertySettingsModalData } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import { focus } from '@umbraco-cms/backoffice/lit-element'; import { generateAlias } from '@umbraco-cms/backoffice/utils'; // TODO: Could base take a token to get its types?. @customElement('umb-property-settings-modal') @@ -92,10 +93,12 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement< protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { super.firstUpdated(_changedProperties); + /* // TODO: Make a general way to put focus on a input in a modal. (also make sure it only happens if its the top-most-modal.) requestAnimationFrame(() => { (this.shadowRoot!.querySelector('#name-input') as HTMLElement).focus(); }); + */ } #onSubmit(event: SubmitEvent) { @@ -233,6 +236,7 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement< - ` + ` : nothing} `; } From a089ec4e9cfb53435c26f56c5cb3aef014616cb3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Mar 2024 21:58:50 +0100 Subject: [PATCH 02/77] use put for move handlers --- src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/index.ts | 2 +- .../src/mocks/handlers/data-type/move.handlers.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/index.ts index c74b54913d..790a686bad 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/index.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/index.ts @@ -9,7 +9,7 @@ export const handlers = [ ...treeHandlers, ...itemHandlers, ...folderHandlers, + ...detailHandlers, ...moveHandlers, ...copyHandlers, - ...detailHandlers, ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts index bca11683f4..9dc2b49cc1 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts @@ -5,7 +5,7 @@ import type { MoveDataTypeRequestModel } from '@umbraco-cms/backoffice/external/ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const moveHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/:id/move`), async (req, res, ctx) => { + rest.put(umbracoPath(`${UMB_SLUG}/:id/move`), async (req, res, ctx) => { const id = req.params.id as string; if (!id) return res(ctx.status(400)); From b9bc8bd96eddfd6897d06f9de7ee4a7cc882f85f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Mar 2024 21:59:03 +0100 Subject: [PATCH 03/77] set correct parent state in mock data --- .../src/mocks/data/utils/entity/entity-tree.manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts index 38c08ccad5..e064cfdcdf 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts @@ -50,7 +50,7 @@ export class UmbMockEntityTreeManager { return { ...item, - parentId: destinationId, + parent: destinationId ? { id: destinationId } : null, }; }); From 01a1a6b945d04adc2b160476975008f11c4d9e30 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Mar 2024 21:59:58 +0100 Subject: [PATCH 04/77] remove tree store from data type move repo --- .../repository/move/data-type-move.repository.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.repository.ts index 78720534b1..45ba2fe329 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.repository.ts @@ -1,16 +1,13 @@ -import type { UmbDataTypeTreeStore } from '../../tree/data-type-tree.store.js'; -import { UMB_DATA_TYPE_TREE_STORE_CONTEXT } from '../../tree/data-type-tree.store.js'; import { UmbDataTypeMoveServerDataSource } from './data-type-move.server.data-source.js'; import type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbMoveDataSource, UmbMoveRepository} from '@umbraco-cms/backoffice/repository'; +import type { UmbMoveDataSource, UmbMoveRepository } from '@umbraco-cms/backoffice/repository'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; export class UmbMoveDataTypeRepository extends UmbRepositoryBase implements UmbMoveRepository { #init: Promise; #moveSource: UmbMoveDataSource; - #treeStore?: UmbDataTypeTreeStore; #notificationContext?: UmbNotificationContext; constructor(host: UmbControllerHost) { @@ -18,10 +15,6 @@ export class UmbMoveDataTypeRepository extends UmbRepositoryBase implements UmbM this.#moveSource = new UmbDataTypeMoveServerDataSource(this); this.#init = Promise.all([ - this.consumeContext(UMB_DATA_TYPE_TREE_STORE_CONTEXT, (instance) => { - this.#treeStore = instance; - }).asPromise(), - this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { this.#notificationContext = instance; }).asPromise(), @@ -33,9 +26,6 @@ export class UmbMoveDataTypeRepository extends UmbRepositoryBase implements UmbM const { error } = await this.#moveSource.move(unique, targetUnique); if (!error) { - // TODO: Be aware about this responsibility. - this.#treeStore!.updateItem(unique, { parentUnique: targetUnique }); - const notification = { data: { message: `Data type moved` } }; this.#notificationContext!.peek('positive', notification); } From 5db2798259bb0fe12b41fafc137d7630d70df5a9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 12 Mar 2024 10:28:33 +0100 Subject: [PATCH 05/77] dispatch event to reload tree --- .../entity-action/common/move/move.action.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts index cefe1cc8f8..d7bcd456c4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts @@ -5,6 +5,8 @@ import type { UmbItemRepository, UmbMoveRepository } from '@umbraco-cms/backoffi import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { umbExtensionsRegistry, type MetaEntityActionMoveKind } from '@umbraco-cms/backoffice/extension-registry'; import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; +import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/event'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; export class UmbMoveEntityAction extends UmbEntityActionBase { // TODO: make base type for item and detail models @@ -47,8 +49,19 @@ export class UmbMoveEntityAction extends UmbEntityActionBase { 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.#moveRepository!.move(this.args.unique, value.selection[0]); + const destinationUnique = value.selection[0]; + if (!destinationUnique) return; + await this.#moveRepository!.move(this.args.unique, destinationUnique); + + // TODO: we can't reload the destination entity as we don't know the type + // we will have to add this when a selection is refactored to include both type and unique + const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadStructureForEntityEvent({ + unique: this.args.unique, + entityType: this.args.entityType, + }); + + actionEventContext.dispatchEvent(event); } } From 138f299ef4374d40950a6772340b5a3ff9273c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 25 Mar 2024 11:21:06 +0100 Subject: [PATCH 06/77] remove old code --- .../property-type-settings-modal.element.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.element.ts index d679e88c7b..fcbcd89f8d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.element.ts @@ -8,7 +8,6 @@ import type { } from './property-type-settings-modal.token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UUIBooleanInputEvent, UUIInputEvent, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; -import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { focus } from '@umbraco-cms/backoffice/lit-element'; @@ -93,17 +92,6 @@ export class UmbPropertyTypeSettingsModalElement extends UmbModalBaseElement< } } - protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { - super.firstUpdated(_changedProperties); - - /* - // TODO: Make a general way to put focus on a input in a modal. (also make sure it only happens if its the top-most-modal.) - requestAnimationFrame(() => { - (this.shadowRoot!.querySelector('#name-input') as HTMLElement).focus(); - }); - */ - } - #onSubmit(event: SubmitEvent) { event.preventDefault(); From d94c2a15ebfbc2326b1cb27c11f719151cce7162 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 31 Mar 2024 20:52:17 +0200 Subject: [PATCH 07/77] extend api --- .../packages/core/repository/move/move-repository.interface.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts index 9502e8d409..3d8fd86273 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts @@ -1,5 +1,6 @@ import type { UmbRepositoryErrorResponse } from '../types.js'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export interface UmbMoveRepository { +export interface UmbMoveRepository extends UmbApi { move(unique: string, targetUnique: string): Promise; } From 78304a7f116650f1deb195380532135f755512f2 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 31 Mar 2024 20:52:36 +0200 Subject: [PATCH 08/77] require tree repo --- .../packages/core/entity-action/common/move/move.action.kind.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts index a872359e9f..bf37ca149b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts @@ -16,7 +16,7 @@ export const manifest: UmbBackofficeManifestKind = { meta: { icon: 'icon-enter', label: 'Move to (TBD)...', - itemRepositoryAlias: '', + treeRepositoryAlias: '', moveRepositoryAlias: '', pickerModal: '', }, From 50cf342a6749f57851f91d82dfb6ba8bfd7a3c11 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 31 Mar 2024 20:52:49 +0200 Subject: [PATCH 09/77] pass tree repo --- .../src/packages/data-type/entity-actions/move/manifests.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts index 79ef41ec28..55b1fa3e4a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts @@ -1,7 +1,7 @@ import { UMB_DATA_TYPE_ENTITY_TYPE } from '../../entity.js'; import { UMB_DATA_TYPE_PICKER_MODAL } from '../../modals/index.js'; -import { UMB_DATA_TYPE_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; -import { UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from '../../repository/move/manifests.js'; +import { UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ @@ -12,7 +12,7 @@ const entityActions: Array = [ name: 'Move Data Type Entity Action', forEntityTypes: [UMB_DATA_TYPE_ENTITY_TYPE], meta: { - itemRepositoryAlias: UMB_DATA_TYPE_ITEM_REPOSITORY_ALIAS, + treeRepositoryAlias: UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS, moveRepositoryAlias: UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS, pickerModal: UMB_DATA_TYPE_PICKER_MODAL, }, From e7dde3d5fe88cb39bd78372a1a29d9d7e61ee47c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 31 Mar 2024 20:56:20 +0200 Subject: [PATCH 10/77] wire up move --- .../entity-action/common/move/move.action.ts | 59 +++---------------- 1 file changed, 8 insertions(+), 51 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts index d7bcd456c4..ce53b00bab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts @@ -1,67 +1,24 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; -import type { UmbEntityActionArgs } from '../../types.js'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import type { UmbItemRepository, UmbMoveRepository } from '@umbraco-cms/backoffice/repository'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { umbExtensionsRegistry, type MetaEntityActionMoveKind } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; -import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/event'; -import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import type { UmbMoveRepository } from '@umbraco-cms/backoffice/repository'; +import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; export class UmbMoveEntityAction extends UmbEntityActionBase { - // TODO: make base type for item and detail models - #itemRepository?: UmbItemRepository; - #moveRepository?: UmbMoveRepository; - #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.moveRepositoryAlias, - [this._host], - (permitted, ctrl) => { - this.#moveRepository = permitted ? (ctrl.api as UmbMoveRepository) : undefined; - }, - ).asPromise(), - ]); - } - async execute() { if (!this.args.unique) throw new Error('Unique is not available'); - await this.#init; + 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.pickerModal) as any; // TODO: make generic picker interface with selection const value = await modalContext.onSubmit(); const destinationUnique = value.selection[0]; - if (!destinationUnique) return; - await this.#moveRepository!.move(this.args.unique, destinationUnique); + if (destinationUnique === undefined) throw new Error('Destination Unique is not available'); - // TODO: we can't reload the destination entity as we don't know the type - // we will have to add this when a selection is refactored to include both type and unique - const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - const event = new UmbRequestReloadStructureForEntityEvent({ - unique: this.args.unique, - entityType: this.args.entityType, - }); + const moveRepository = await createExtensionApiByAlias(this, this.args.meta.moveRepositoryAlias); + if (!moveRepository) throw new Error('Move Repository is not available'); - actionEventContext.dispatchEvent(event); + await moveRepository.move(this.args.unique, destinationUnique); + // TODO: refresh tree } } From f8a67d03b73b22fe8999f944d90c179d97d6b6a6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 31 Mar 2024 21:03:27 +0200 Subject: [PATCH 11/77] rename to move to --- .../src/packages/core/entity-action/common/index.ts | 2 +- .../core/entity-action/common/move-to/manifests.ts | 3 +++ .../move-to.action.kind.ts} | 10 +++++----- .../{move/move.action.ts => move-to/move-to.action.ts} | 4 ++-- .../core/entity-action/common/move/manifests.ts | 3 --- .../extension-registry/models/entity-action.model.ts | 6 +++--- .../packages/core/extension-registry/models/index.ts | 4 ++-- .../data-type/entity-actions/move/manifests.ts | 4 ++-- .../src/packages/dictionary/entity-action/manifests.ts | 4 ++-- .../document-types/entity-actions/manifests.ts | 4 ++-- .../documents/documents/entity-actions/manifests.ts | 4 ++-- .../media/media-types/entity-actions/manifests.ts | 4 ++-- 12 files changed, 26 insertions(+), 26 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/{move/move.action.kind.ts => move-to/move-to.action.kind.ts} (78%) rename src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/{move/move.action.ts => move-to/move-to.action.ts} (91%) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/manifests.ts 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 b9a9fa9944..8aa4dae0d2 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 './duplicate/duplicate.action.js'; export * from './delete/delete.action.js'; -export * from './move/move.action.js'; +export * from './move-to/move-to.action.js'; export * from './rename/index.js'; export * from './sort-children-of/sort-children-of.action.js'; export * from './trash/trash.action.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/manifests.ts new file mode 100644 index 0000000000..d25f71a9d6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/manifests.ts @@ -0,0 +1,3 @@ +import { manifest as moveToKindManifest } from './move-to.action.kind.js'; + +export const manifests = [moveToKindManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/move-to.action.kind.ts similarity index 78% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/move-to.action.kind.ts index bf37ca149b..2d6e8f3573 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/move-to.action.kind.ts @@ -3,19 +3,19 @@ import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extensio export const manifest: UmbBackofficeManifestKind = { type: 'kind', - alias: 'Umb.Kind.EntityAction.Move', - matchKind: 'move', + alias: 'Umb.Kind.EntityAction.MoveTo', + matchKind: 'moveTo', matchType: 'entityAction', manifest: { ...UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST.manifest, type: 'entityAction', - kind: 'move', - api: () => import('./move.action.js'), + kind: 'moveTo', + api: () => import('./move-to.action.js'), weight: 700, forEntityTypes: [], meta: { icon: 'icon-enter', - label: 'Move to (TBD)...', + label: 'Move to...', treeRepositoryAlias: '', moveRepositoryAlias: '', pickerModal: '', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/move-to.action.ts similarity index 91% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/move-to.action.ts index ce53b00bab..c77d0028ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/move-to.action.ts @@ -3,7 +3,7 @@ import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import type { UmbMoveRepository } from '@umbraco-cms/backoffice/repository'; import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; -export class UmbMoveEntityAction extends UmbEntityActionBase { +export class UmbMoveToEntityAction 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'); @@ -22,4 +22,4 @@ export class UmbMoveEntityAction extends UmbEntityActionBase { } } -export default UmbMoveEntityAction; +export default UmbMoveToEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/manifests.ts deleted file mode 100644 index c111cc6e3e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/manifests.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { manifest as moveKindManifest } from './move.action.kind.js'; - -export const manifests = [moveKindManifest]; 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 b48d33e454..8a896559e6 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 @@ -100,12 +100,12 @@ export interface MetaEntityActionDuplicateKind extends MetaEntityActionDefaultKi } // MOVE -export interface ManifestEntityActionMoveKind extends ManifestEntityAction { +export interface ManifestEntityActionMoveToKind extends ManifestEntityAction { type: 'entityAction'; - kind: 'move'; + kind: 'moveTo'; } -export interface MetaEntityActionMoveKind extends MetaEntityActionDefaultKind { +export interface MetaEntityActionMoveToKind extends MetaEntityActionDefaultKind { moveRepositoryAlias: string; itemRepositoryAlias: string; pickerModal: UmbModalToken | 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 fac0614d51..eff1101ccc 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 @@ -9,7 +9,7 @@ import type { ManifestEntityActionRenameKind, ManifestEntityActionReloadTreeItemChildrenKind, ManifestEntityActionDuplicateKind, - ManifestEntityActionMoveKind, + ManifestEntityActionMoveToKind, ManifestEntityActionCreateFolderKind, ManifestEntityActionUpdateFolderKind, ManifestEntityActionDeleteFolderKind, @@ -108,7 +108,7 @@ export type ManifestEntityActions = | ManifestEntityActionRenameKind | ManifestEntityActionReloadTreeItemChildrenKind | ManifestEntityActionDuplicateKind - | ManifestEntityActionMoveKind + | ManifestEntityActionMoveToKind | ManifestEntityActionCreateFolderKind | ManifestEntityActionUpdateFolderKind | ManifestEntityActionDeleteFolderKind diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts index 55b1fa3e4a..5346c352a8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts @@ -7,8 +7,8 @@ import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ { type: 'entityAction', - kind: 'move', - alias: 'Umb.EntityAction.DataType.Move', + kind: 'moveTo', + alias: 'Umb.EntityAction.DataType.MoveTo', name: 'Move Data Type Entity Action', forEntityTypes: [UMB_DATA_TYPE_ENTITY_TYPE], meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts index e3503e1c88..787f774de5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts @@ -18,8 +18,8 @@ const entityActions: Array = [ }, { type: 'entityAction', - kind: 'move', - alias: 'Umb.EntityAction.Dictionary.Move', + kind: 'moveTo', + alias: 'Umb.EntityAction.Dictionary.MoveTo', name: 'Move Dictionary Entity Action', forEntityTypes: [UMB_DICTIONARY_ENTITY_TYPE], meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts index ce0e502d8b..78b6f32438 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts @@ -19,8 +19,8 @@ const entityActions: Array = [ }, { type: 'entityAction', - kind: 'move', - alias: 'Umb.EntityAction.DocumentType.Move', + kind: 'moveTo', + alias: 'Umb.EntityAction.DocumentType.MoveTo', name: 'Move Document Type Entity Action', forEntityTypes: [entityType], meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 36d9a0cf3e..4e151b1d4b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -35,9 +35,9 @@ const entityActions: Array = [ }, { type: 'entityAction', - alias: 'Umb.EntityAction.Document.Move', + alias: 'Umb.EntityAction.Document.MoveTo', name: 'Move Document Entity Action ', - kind: 'move', + kind: 'moveTo', forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], weight: 900, meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/manifests.ts index c80d3fead0..80bc0c5231 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/manifests.ts @@ -7,8 +7,8 @@ import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ { type: 'entityAction', - kind: 'move', - alias: 'Umb.EntityAction.MediaType.Move', + kind: 'moveTo', + alias: 'Umb.EntityAction.MediaType.MoveTo', name: 'Move Media Type Entity Action', forEntityTypes: [UMB_MEDIA_TYPE_ENTITY_TYPE], meta: { From a6fd65f3166a9c820d9e958894702f3a16e7215e Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Wed, 10 Apr 2024 10:43:07 +0200 Subject: [PATCH 12/77] blueprint create action --- .../entity-actions/create/create.action.ts | 11 +++--- .../entity-actions/create/index.ts | 1 + .../entity-actions/create/manifests.ts | 26 ++++++++++--- ...blueprint-options-create-modal.element.ts} | 39 +++++-------------- ...nt-blueprint-options-create-modal.token.ts | 22 +++++++++++ .../entity-actions/create/modal/index.ts | 24 +----------- .../entity-actions/manifests.ts | 16 +------- 7 files changed, 64 insertions(+), 75 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/index.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/{document-blueprint-create-options-modal.element.ts => document-blueprint-options-create-modal.element.ts} (60%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts index d5034e8d25..86acf07824 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts @@ -1,5 +1,5 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../../entity.js'; -import { UMB_DOCUMENT_BLUEPRINT_CREATE_OPTIONS_MODAL } from './modal/index.js'; +import { UMB_DOCUMENT_BLUEPRINT_OPTIONS_CREATE_MODAL } from './modal/index.js'; import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -12,7 +12,7 @@ export class UmbCreateEntityAction extends UmbEntityActionBase { async execute() { const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const modalContext = modalManager.open(this, UMB_DOCUMENT_BLUEPRINT_CREATE_OPTIONS_MODAL, { + const modalContext = modalManager.open(this, UMB_DOCUMENT_BLUEPRINT_OPTIONS_CREATE_MODAL, { data: { parent: { unique: this.args.unique, @@ -24,10 +24,11 @@ export class UmbCreateEntityAction extends UmbEntityActionBase { await modalContext.onSubmit().catch(() => undefined); const documentTypeUnique = modalContext.getValue().documentTypeUnique; + if (!documentTypeUnique) return; - const url = `section/settings/workspace/${UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE}/create/parent/${this.args.entityType}/${ - documentTypeUnique || 'null' - }`; + const url = `section/settings/workspace/${UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE}/create/parent/${this.args.unique ?? 'null'}/${documentTypeUnique}`; history.pushState(null, '', url); } } + +export default UmbCreateEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/index.ts new file mode 100644 index 0000000000..28d9f38fba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/index.ts @@ -0,0 +1 @@ +export * from './modal/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts index 1c1c7a408d..1e80ab1c27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts @@ -1,12 +1,28 @@ +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ { - type: 'modal', - alias: 'Umb.Modal.DocumentBlueprintCreateOptions', - name: 'Document Blueprint Create Options Modal', - js: () => import('./modal/document-blueprint-create-options-modal.element.js'), + type: 'entityAction', + kind: 'default', + alias: 'Umb.EntityAction.DocumentBlueprint.Create', + name: 'Document Blueprint Options Create Entity Action', + api: () => import('./create.action.js'), + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], + meta: { + icon: 'icon-add', + label: 'Create Content Template', + }, }, ]; -export const manifests = [...entityActions]; +const manifestModals: Array = [ + { + type: 'modal', + alias: 'Umb.Modal.DocumentBlueprintOptionsCreate', + name: 'Document Blueprint Options Create Modal', + js: () => import('./modal/document-blueprint-options-create-modal.element.js'), + }, +]; + +export const manifests = [...entityActions, ...manifestModals]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-create-options-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.element.ts similarity index 60% rename from src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-create-options-modal.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.element.ts index ef7e3ac473..4ef5397d3a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-create-options-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.element.ts @@ -1,43 +1,24 @@ import type { - UmbDocumentBlueprintCreateOptionsModalData, - UmbDocumentBlueprintCreateOptionsModalValue, + UmbDocumentBlueprintOptionsCreateModalData, + UmbDocumentBlueprintOptionsCreateModalValue, } from './index.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { html, customElement, css, state } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; -import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UmbDocumentTypeStructureRepository } from '@umbraco-cms/backoffice/document-type'; import { type UmbSelectedEvent, UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; import type { UmbTreeElement } from '@umbraco-cms/backoffice/tree'; -@customElement('umb-document-blueprint-create-options-modal') -export class UmbDocumentBlueprintCreateOptionsModalElement extends UmbModalBaseElement< - UmbDocumentBlueprintCreateOptionsModalData, - UmbDocumentBlueprintCreateOptionsModalValue +@customElement('umb-document-blueprint-options-create-modal') +export class UmbDocumentBlueprintOptionsCreateModalElement extends UmbModalBaseElement< + UmbDocumentBlueprintOptionsCreateModalData, + UmbDocumentBlueprintOptionsCreateModalValue > { - @state() - private _documentTypes?: Array; - - #documentTypeRepository = new UmbDocumentTypeStructureRepository(this); - - connectedCallback(): void { - super.connectedCallback(); - } - - async #fetchTypes() { - //const something = await this.#documentTypeRepository. - } - - #onNavigate() { - this._submitModal(); - } - #onSelected(event: UmbSelectedEvent) { event.stopPropagation(); const element = event.target as UmbTreeElement; this.value = { documentTypeUnique: element.getSelection()[0] }; this.modalContext?.dispatchEvent(new UmbSelectionChangeEvent()); - this.#onNavigate(); + this._submitModal(); } render() { @@ -71,10 +52,10 @@ export class UmbDocumentBlueprintCreateOptionsModalElement extends UmbModalBaseE ]; } -export default UmbDocumentBlueprintCreateOptionsModalElement; +export default UmbDocumentBlueprintOptionsCreateModalElement; declare global { interface HTMLElementTagNameMap { - 'umb-document-blueprint-create-options-modal': UmbDocumentBlueprintCreateOptionsModalElement; + 'umb-document-blueprint-create-options-modal': UmbDocumentBlueprintOptionsCreateModalElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.token.ts new file mode 100644 index 0000000000..3ca912c321 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.token.ts @@ -0,0 +1,22 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbDocumentBlueprintOptionsCreateModalData { + parent: { + unique: string | null; + entityType: string; + }; +} + +export interface UmbDocumentBlueprintOptionsCreateModalValue { + documentTypeUnique: string; +} + +export const UMB_DOCUMENT_BLUEPRINT_OPTIONS_CREATE_MODAL = new UmbModalToken< + UmbDocumentBlueprintOptionsCreateModalData, + UmbDocumentBlueprintOptionsCreateModalValue +>('Umb.Modal.DocumentBlueprintOptionsCreate', { + modal: { + type: 'sidebar', + size: 'small', + }, +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts index 98a89164ec..e54c394594 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts @@ -1,22 +1,2 @@ -import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; - -export interface UmbDocumentBlueprintCreateOptionsModalData { - parent: { - unique: string | null; - entityType: string; - }; -} - -export interface UmbDocumentBlueprintCreateOptionsModalValue { - documentTypeUnique: string; -} - -export const UMB_DOCUMENT_BLUEPRINT_CREATE_OPTIONS_MODAL = new UmbModalToken< - UmbDocumentBlueprintCreateOptionsModalData, - UmbDocumentBlueprintCreateOptionsModalValue ->('Umb.Modal.DocumentBlueprintCreateOptions', { - modal: { - type: 'sidebar', - size: 'small', - }, -}); +export * from './document-blueprint-options-create-modal.token.js'; +export * from './document-blueprint-options-create-modal.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts index e5c2ec3ba5..c9a4479286 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts @@ -1,25 +1,13 @@ -import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS, } from '../index.js'; import { manifests as createManifests } from './create/manifests.js'; -import { UmbCreateEntityAction } from './create/create.action.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ - { - type: 'entityAction', - kind: 'default', - alias: 'Umb.EntityAction.DocumentBlueprint.Create', - name: 'Create Document Blueprint Entity Action', - api: UmbCreateEntityAction, - forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], - meta: { - icon: 'icon-add', - label: 'Create', - }, - }, + ...createManifests, { type: 'entityAction', kind: 'delete', From d96e77a626271882ff2181527888b547a17862b8 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:16:42 +0200 Subject: [PATCH 13/77] show names in tree --- .../entity-actions/create/manifests.ts | 2 +- ...ument-blueprint-item.server.data-source.ts | 24 +++++-------------- .../repository/item/types.ts | 5 +--- ...ument-blueprint-tree.server.data-source.ts | 9 ++----- 4 files changed, 10 insertions(+), 30 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts index 1e80ab1c27..09d4b17b63 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts @@ -11,7 +11,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create Content Template', + label: '#actions_createblueprint', }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts index c971e13bcf..67d068d7fe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts @@ -1,7 +1,7 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../../entity.js'; import type { UmbDocumentBlueprintItemModel } from './types.js'; -import type { CancelablePromise, DocumentItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentBlueprintResource, DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import type { DocumentBlueprintItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentBlueprintResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbItemServerDataSourceBase } from '@umbraco-cms/backoffice/repository'; @@ -12,7 +12,7 @@ import { UmbItemServerDataSourceBase } from '@umbraco-cms/backoffice/repository' * @implements {DocumentTreeDataSource} */ export class UmbDocumentBlueprintItemServerDataSource extends UmbItemServerDataSourceBase< - DocumentItemResponseModel, + DocumentBlueprintItemResponseModel, UmbDocumentBlueprintItemModel > { /** @@ -29,29 +29,17 @@ export class UmbDocumentBlueprintItemServerDataSource extends UmbItemServerDataS } /* eslint-disable local-rules/no-direct-api-import */ -const getItems = (uniques: Array) => - DocumentBlueprintResource.getItemDocumentBlueprint({ id: uniques }) as unknown as CancelablePromise< - DocumentItemResponseModel[] - >; +const getItems = (uniques: Array) => DocumentBlueprintResource.getItemDocumentBlueprint({ id: uniques }); -const mapper = (item: DocumentItemResponseModel): UmbDocumentBlueprintItemModel => { +const mapper = (item: DocumentBlueprintItemResponseModel): UmbDocumentBlueprintItemModel => { return { entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, unique: item.id, - isTrashed: item.isTrashed, - isProtected: item.isProtected, + name: item.name, documentType: { unique: item.documentType.id, icon: item.documentType.icon, collection: item.documentType.collection ? { unique: item.documentType.collection.id } : null, }, - variants: item.variants.map((variant) => { - return { - culture: variant.culture || null, - name: variant.name, - state: variant.state, - }; - }), - name: item.variants[0]?.name, // TODO: this is not correct. We need to get it from the variants. This is a temp solution. }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts index e054aac1d5..4a7a76f916 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts @@ -4,16 +4,13 @@ import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; export interface UmbDocumentBlueprintItemModel { entityType: UmbDocumentBlueprintEntityType; - name: string; // TODO: this is not correct. We need to get it from the variants. This is a temp solution. + name: string; unique: string; - isTrashed: boolean; - isProtected: boolean; documentType: { unique: string; icon: string; collection: UmbReferenceByUnique | null; }; - variants: Array; } export interface UmbDocumentBlueprintItemVariantModel { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts index f2b8fdb50c..4a04aea611 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts @@ -6,10 +6,7 @@ import type { UmbTreeRootItemsRequestArgs, } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; -import type { - DocumentBlueprintTreeItemResponseModel, - DocumentTreeItemResponseModel, -} from '@umbraco-cms/backoffice/external/backend-api'; +import type { DocumentBlueprintTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentBlueprintResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -61,12 +58,10 @@ const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => { }; const mapper = (item: DocumentBlueprintTreeItemResponseModel): UmbDocumentBlueprintTreeItemModel => { - //TODO remove temp hack when api endpoints are fixed - const hack = item as Partial; return { unique: item.id, parentUnique: item.parent?.id || null, - name: hack?.variants?.[0].name ?? '', + name: item.name, entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, isFolder: false, hasChildren: item.hasChildren, From 2810ab6f20ddc18c0596e092fc70d3e15a94ade9 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Wed, 10 Apr 2024 14:26:45 +0200 Subject: [PATCH 14/77] fix workspace setup --- ...lueprint-property-dataset-context.token.ts | 13 ++ ...ment-blueprint-property-dataset-context.ts | 121 ++++++++++++++++++ ...cument-blueprint-root-workspace.element.ts | 3 +- ...-blueprint-workspace-split-view.element.ts | 6 +- .../document-blueprint-workspace.context.ts | 22 +++- .../document-blueprints/workspace/index.ts | 1 + 6 files changed, 156 insertions(+), 10 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.token.ts new file mode 100644 index 0000000000..3c28da9db2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.token.ts @@ -0,0 +1,13 @@ +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; +import type { UmbDocumentBlueprintPropertyDataContext } from './document-blueprint-property-dataset-context.js'; +import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const IsDocumentBlueprintPropertyDatasetContext = ( + context: UmbPropertyDatasetContext, +): context is UmbDocumentBlueprintPropertyDataContext => context.getEntityType() === UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE; + +export const UMB_DOCUMENT_BLUEPRINT_PROPERTY_DATASET_CONTEXT = new UmbContextToken< + UmbPropertyDatasetContext, + UmbDocumentBlueprintPropertyDataContext +>('UmbVariantContext', undefined, IsDocumentBlueprintPropertyDatasetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts new file mode 100644 index 0000000000..1b67f782e3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts @@ -0,0 +1,121 @@ +import type { UmbDocumentBlueprintWorkspaceContext } from '../workspace/index.js'; +import type { UmbNameablePropertyDatasetContext, UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; +import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import { type Observable, map } from '@umbraco-cms/backoffice/external/rxjs'; +import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; +import type { UmbVariantModel } from '@umbraco-cms/backoffice/variant'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { UmbPropertyTypeModel } from '@umbraco-cms/backoffice/content-type'; + +// TODO: This code can be split into a UmbContentTypePropertyDatasetContext, leaving just the publishing state and methods to this class. +export class UmbDocumentBlueprintPropertyDataContext + extends UmbContextBase + implements UmbPropertyDatasetContext, UmbNameablePropertyDatasetContext +{ + #workspace: UmbDocumentBlueprintWorkspaceContext; + #variantId: UmbVariantId; + public getVariantId() { + return this.#variantId; + } + + #currentVariant = new UmbObjectState(undefined); + currentVariant = this.#currentVariant.asObservable(); + + name = this.#currentVariant.asObservablePart((x) => x?.name); + culture = this.#currentVariant.asObservablePart((x) => x?.culture); + segment = this.#currentVariant.asObservablePart((x) => x?.segment); + + // TODO: Refactor: Make a properties observable. (with such I think i mean a property value object array.. array with object with properties, alias, value, culture and segment) + // TO make such happen I think we need to maintain all properties and their value of this object. + // This will actually make it simpler if multiple are watching the same property. + // But it will also mean that we wil watch all properties and their structure, for variantID, all the time for all of the properties. + + getEntityType(): string { + return this.#workspace.getEntityType(); + } + getUnique(): string | undefined { + return this.#workspace.getUnique(); + } + getName(): string | undefined { + return this.#workspace.getName(this.#variantId); + } + setName(name: string) { + this.#workspace.setName(name, this.#variantId); + } + getVariantInfo() { + return this.#workspace.getVariant(this.#variantId); + } + + constructor(host: UmbControllerHost, workspace: UmbDocumentBlueprintWorkspaceContext, variantId?: UmbVariantId) { + // The controller alias, is a very generic name cause we want only one of these for this controller host. + super(host, UMB_PROPERTY_DATASET_CONTEXT); + this.#workspace = workspace; + this.#variantId = variantId ?? UmbVariantId.CreateInvariant(); + + this.observe( + this.#workspace.variantById(this.#variantId), + async (variantInfo) => { + if (!variantInfo) return; + this.#currentVariant.setValue(variantInfo); + }, + '_observeActiveVariant', + ); + } + + #createPropertyVariantId(property: UmbPropertyTypeModel) { + return UmbVariantId.Create({ + culture: property.variesByCulture ? this.#variantId.culture : null, + segment: property.variesBySegment ? this.#variantId.segment : null, + }); + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async propertyVariantId(propertyAlias: string) { + return (await this.#workspace.structure.propertyStructureByAlias(propertyAlias)).pipe( + map((property) => (property ? this.#createPropertyVariantId(property) : undefined)), + ); + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use this method, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async propertyValueByAlias( + propertyAlias: string, + ): Promise | undefined> { + await this.#workspace.isLoaded(); + const structure = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); + if (structure) { + return this.#workspace.propertyValueByAlias(propertyAlias, this.#createPropertyVariantId(structure)); + } + return; + } + + // TODO: Refactor: Not used currently, but should investigate if we can implement this, to spare some energy. + async propertyValueByAliasAndCulture( + propertyAlias: string, + propertyVariantId: UmbVariantId, + ): Promise | undefined> { + return this.#workspace.propertyValueByAlias(propertyAlias, propertyVariantId); + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async setPropertyValue(propertyAlias: string, value: unknown) { + // This is not reacting to if the property variant settings changes while running. + const property = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); + if (property) { + const variantId = this.#createPropertyVariantId(property); + + // This is not reacting to if the property variant settings changes while running. + this.#workspace.setPropertyValue(propertyAlias, value, variantId); + } + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts index a2595863dd..876fb1d3e4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts @@ -1,10 +1,11 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS } from './manifests.js'; import { html, customElement, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @customElement('umb-document-blueprint-root-workspace') export class UmbDocumentBlueprintRootWorkspaceElement extends UmbLitElement { render() { - return html` + return html`

diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts index 77cc3b90b3..5f8842615b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts @@ -1,3 +1,4 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS } from './manifests.js'; import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from './document-blueprint-workspace.context-token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; @@ -14,6 +15,7 @@ export class UmbDocumentBlueprintWorkspaceSplitViewElement extends UmbLitElement constructor() { super(); + console.log('split view'); // TODO: Refactor: use a split view workspace context token: this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (context) => { @@ -42,14 +44,14 @@ export class UmbDocumentBlueprintWorkspaceSplitViewElement extends UmbLitElement view.index + '_' + (view.culture ?? '') + '_' + (view.segment ?? '') + '_' + this._variants!.length, (view) => html` `, )}

- ` + ` : nothing; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts index 49024a6b9a..c1b7161e4e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts @@ -1,3 +1,4 @@ +import { UmbDocumentBlueprintPropertyDataContext } from '../property-dataset-context/document-blueprint-property-dataset-context.js'; import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import { UmbDocumentBlueprintDetailRepository } from '../repository/index.js'; import type { @@ -5,7 +6,7 @@ import type { UmbDocumentBlueprintVariantModel, UmbDocumentBlueprintVariantOptionModel, } from '../types.js'; -import { UmbDocumentPropertyDataContext } from '../../documents/property-dataset-context/document-property-dataset-context.js'; +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS } from './manifests.js'; import { appendToFrozenArray, mergeObservables, @@ -28,7 +29,6 @@ import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/var import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbLanguageDetailModel } from '@umbraco-cms/backoffice/language'; import type { UmbRoutableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -import { UmbDocumentWorkspaceContext } from '@umbraco-cms/backoffice/document'; type EntityType = UmbDocumentBlueprintDetailModel; @@ -47,12 +47,16 @@ export class UmbDocumentBlueprintWorkspaceContext #persistedData = new UmbObjectState(undefined); #currentData = new UmbObjectState(undefined); - - // TODo: Optimize this so it uses either a App Language Context? [NL] + #getDataPromise?: Promise; + // TODO: Optimize this so it uses either a App Language Context? [NL] #languageRepository = new UmbLanguageCollectionRepository(this); #languages = new UmbArrayState([], (x) => x.unique); public readonly languages = this.#languages.asObservable(); + public isLoaded() { + return this.#getDataPromise; + } + readonly unique = this.#currentData.asObservablePart((data) => data?.unique); readonly contentTypeUnique = this.#currentData.asObservablePart((data) => data?.documentType.unique); @@ -105,7 +109,7 @@ export class UmbDocumentBlueprintWorkspaceContext ); constructor(host: UmbControllerHost) { - super(host, 'Umb.Workspace.DocumentBlueprint'); + super(host, UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS); this.observe(this.contentTypeUnique, (unique) => this.structure.loadType(unique)); this.observe(this.varies, (varies) => (this.#varies = varies)); @@ -159,7 +163,7 @@ export class UmbDocumentBlueprintWorkspaceContext async load(unique: string) { this.resetState(); - + this.#getDataPromise = this.repository.requestByUnique(unique); const { data, asObservable } = await this.repository.requestByUnique(unique); if (data) { @@ -429,10 +433,14 @@ export class UmbDocumentBlueprintWorkspaceContext } */ - public createPropertyDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { + /*public createPropertyDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { // TODO: [LK] Temporary workaround/hack to get the workspace to load. const docCxt = new UmbDocumentWorkspaceContext(host); return new UmbDocumentPropertyDataContext(host, docCxt, variantId); + }*/ + + public createPropertyDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { + return new UmbDocumentBlueprintPropertyDataContext(host, this, variantId); } public destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts index 22a5c8eeab..0848864a8d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts @@ -1 +1,2 @@ export * from './document-blueprint-workspace.context-token.js'; +export * from './document-blueprint-workspace.context.js'; From df6a7d78292f0529b493dae522e2dfce590f48a2 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Wed, 10 Apr 2024 15:47:49 +0200 Subject: [PATCH 15/77] view --- ...ment-blueprint-property-dataset-context.ts | 1 + .../workspace/manifests.ts | 29 ++- ...-workspace-view-edit-properties.element.ts | 71 ++++++++ ...ueprint-workspace-view-edit-tab.element.ts | 88 +++++++++ ...t-blueprint-workspace-view-edit.element.ts | 169 ++++++++++++++++++ 5 files changed, 356 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-properties.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-tab.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts index 1b67f782e3..2d3836ae46 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts @@ -50,6 +50,7 @@ export class UmbDocumentBlueprintPropertyDataContext constructor(host: UmbControllerHost, workspace: UmbDocumentBlueprintWorkspaceContext, variantId?: UmbVariantId) { // The controller alias, is a very generic name cause we want only one of these for this controller host. + super(host, UMB_PROPERTY_DATASET_CONTEXT); this.#workspace = workspace; this.#variantId = variantId ?? UmbVariantId.CreateInvariant(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts index 9427a1084f..b0061305da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts @@ -1,6 +1,10 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; -import type { ManifestWorkspace, ManifestWorkspaceActions } from '@umbraco-cms/backoffice/extension-registry'; +import type { + ManifestWorkspace, + ManifestWorkspaceActions, + ManifestWorkspaceView, +} from '@umbraco-cms/backoffice/extension-registry'; export const UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS = 'Umb.Workspace.DocumentBlueprint'; @@ -15,6 +19,27 @@ const workspace: ManifestWorkspace = { }, }; +const workspaceViews: Array = [ + { + type: 'workspaceView', + alias: 'Umb.WorkspaceView.DocumentBlueprint.Edit', + name: 'Document Blueprint Workspace Edit View', + element: () => import('./views/edit/document-blueprint-workspace-view-edit.element.js'), + weight: 200, + meta: { + label: '#general_content', + pathname: 'content', + icon: 'document', + }, + conditions: [ + { + alias: 'Umb.Condition.WorkspaceAlias', + match: workspace.alias, + }, + ], + }, +]; + const workspaceActions: Array = [ { type: 'workspaceAction', @@ -37,4 +62,4 @@ const workspaceActions: Array = [ }, ]; -export const manifests = [workspace, ...workspaceActions]; +export const manifests = [workspace, ...workspaceViews, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-properties.element.ts new file mode 100644 index 0000000000..ebabfa0fe7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-properties.element.ts @@ -0,0 +1,71 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from '../../document-blueprint-workspace.context-token.js'; +import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbPropertyTypeModel } from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypePropertyStructureHelper } from '@umbraco-cms/backoffice/content-type'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; + +@customElement('umb-document-blueprint-workspace-view-edit-properties') +export class UmbDocumentBlueprintWorkspaceViewEditPropertiesElement extends UmbLitElement { + @property({ type: String, attribute: 'container-id', reflect: false }) + public get containerId(): string | null | undefined { + return this.#propertyStructureHelper.getContainerId(); + } + public set containerId(value: string | null | undefined) { + this.#propertyStructureHelper.setContainerId(value); + } + + #propertyStructureHelper = new UmbContentTypePropertyStructureHelper(this); + + @state() + _propertyStructure?: Array; + + constructor() { + super(); + + this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#propertyStructureHelper.setStructureManager(workspaceContext.structure); + }); + this.observe( + this.#propertyStructureHelper.propertyStructure, + (propertyStructure) => { + this._propertyStructure = propertyStructure; + }, + null, + ); + } + + render() { + return this._propertyStructure + ? repeat( + this._propertyStructure, + (property) => property.alias, + (property) => + html` `, + ) + : ''; + } + + static styles = [ + UmbTextStyles, + css` + .property { + border-bottom: 1px solid var(--uui-color-divider); + } + .property:last-child { + border-bottom: 0; + } + `, + ]; +} + +export default UmbDocumentBlueprintWorkspaceViewEditPropertiesElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-workspace-view-edit-properties': UmbDocumentBlueprintWorkspaceViewEditPropertiesElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-tab.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-tab.element.ts new file mode 100644 index 0000000000..ed60a266fc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-tab.element.ts @@ -0,0 +1,88 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from '../../document-blueprint-workspace.context-token.js'; +import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbPropertyTypeContainerModel } from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +import './document-blueprint-workspace-view-edit-properties.element.js'; + +@customElement('umb-document-blueprint-workspace-view-edit-tab') +export class UmbDocumentBlueprintWorkspaceViewEditTabElement extends UmbLitElement { + @property({ type: String }) + public get containerId(): string | null | undefined { + return this._containerId; + } + public set containerId(value: string | null | undefined) { + this._containerId = value; + this.#groupStructureHelper.setContainerId(value); + } + @state() + private _containerId?: string | null; + + #groupStructureHelper = new UmbContentTypeContainerStructureHelper(this); + + @state() + _groups: Array = []; + + @state() + _hasProperties = false; + + constructor() { + super(); + + this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#groupStructureHelper.setStructureManager(workspaceContext.structure); + }); + this.observe(this.#groupStructureHelper.mergedContainers, (groups) => { + this._groups = groups; + }); + this.observe(this.#groupStructureHelper.hasProperties, (hasProperties) => { + this._hasProperties = hasProperties; + }); + } + + render() { + return html` + ${this._hasProperties + ? html` + + + + ` + : ''} + ${repeat( + this._groups, + (group) => group.id, + (group) => + html` + + `, + )} + `; + } + + static styles = [ + UmbTextStyles, + css` + uui-box { + --uui-box-default-padding: 0 var(--uui-size-space-5); + } + uui-box:not(:first-child) { + margin-top: var(--uui-size-layout-1); + } + `, + ]; +} + +export default UmbDocumentBlueprintWorkspaceViewEditTabElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-workspace-view-edit-tab': UmbDocumentBlueprintWorkspaceViewEditTabElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit.element.ts new file mode 100644 index 0000000000..9f897c0e3b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit.element.ts @@ -0,0 +1,169 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from '../../document-blueprint-workspace.context-token.js'; +import type { UmbDocumentBlueprintWorkspaceViewEditTabElement } from './document-blueprint-workspace-view-edit-tab.element.js'; +import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbPropertyTypeContainerModel } from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; +import type { UmbRoute, UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; +import { encodeFolderName } from '@umbraco-cms/backoffice/router'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; + +@customElement('umb-document-blueprint-workspace-view-edit') +export class UmbDocumentBlueprintWorkspaceViewEditElement extends UmbLitElement implements UmbWorkspaceViewElement { + //@state() + //private _hasRootProperties = false; + + @state() + private _hasRootGroups = false; + + @state() + private _routes: UmbRoute[] = []; + + @state() + private _tabs?: Array; + + @state() + private _routerPath?: string; + + @state() + private _activePath = ''; + + private _workspaceContext?: typeof UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT.TYPE; + + private _tabsStructureHelper = new UmbContentTypeContainerStructureHelper(this); + + constructor() { + super(); + + this._tabsStructureHelper.setIsRoot(true); + this._tabsStructureHelper.setContainerChildType('Tab'); + this.observe( + this._tabsStructureHelper.mergedContainers, + (tabs) => { + this._tabs = tabs; + this._createRoutes(); + }, + null, + ); + + // _hasRootProperties can be gotten via _tabsStructureHelper.hasProperties. But we do not support root properties currently. + + this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (workspaceContext) => { + this._workspaceContext = workspaceContext; + this._tabsStructureHelper.setStructureManager(workspaceContext.structure); + this._observeRootGroups(); + }); + } + + private _observeRootGroups() { + if (!this._workspaceContext) return; + + this.observe( + this._workspaceContext.structure.hasRootContainers('Group'), + (hasRootGroups) => { + this._hasRootGroups = hasRootGroups; + this._createRoutes(); + }, + '_observeGroups', + ); + } + + private _createRoutes() { + if (!this._tabs || !this._workspaceContext) return; + const routes: UmbRoute[] = []; + + if (this._tabs.length > 0) { + this._tabs?.forEach((tab) => { + const tabName = tab.name ?? ''; + routes.push({ + path: `tab/${encodeFolderName(tabName).toString()}`, + component: () => import('./document-blueprint-workspace-view-edit-tab.element.js'), + setup: (component) => { + (component as UmbDocumentBlueprintWorkspaceViewEditTabElement).containerId = tab.id; + }, + }); + }); + } + + if (this._hasRootGroups) { + routes.push({ + path: '', + component: () => import('./document-blueprint-workspace-view-edit-tab.element.js'), + setup: (component) => { + (component as UmbDocumentBlueprintWorkspaceViewEditTabElement).containerId = null; + }, + }); + } + + if (routes.length !== 0) { + routes.push({ + path: '', + redirectTo: routes[0]?.path, + }); + } + + this._routes = routes; + } + + render() { + if (!this._routes || !this._tabs) return; + return html` + + ${this._routerPath && (this._tabs.length > 1 || (this._tabs.length === 1 && this._hasRootGroups)) + ? html` + ${this._hasRootGroups && this._tabs.length > 0 + ? html` + Content + ` + : ''} + ${repeat( + this._tabs, + (tab) => tab.name, + (tab) => { + const path = this._routerPath + '/tab/' + encodeFolderName(tab.name || ''); + return html`${tab.name}`; + }, + )} + ` + : ''} + + { + this._routerPath = event.target.absoluteRouterPath; + }} + @change=${(event: UmbRouterSlotChangeEvent) => { + this._activePath = event.target.absoluteActiveViewPath || ''; + }}> + + + `; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + height: 100%; + --uui-tab-background: var(--uui-color-surface); + } + `, + ]; +} + +export default UmbDocumentBlueprintWorkspaceViewEditElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-workspace-view-edit': UmbDocumentBlueprintWorkspaceViewEditElement; + } +} From f32fa0cbd00bef2e9dbe7c2916f076bb42f1c3f3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 16:26:17 +0200 Subject: [PATCH 16/77] update --- .../core/entity-action/common/move-to/move-to.action.ts | 3 ++- .../src/packages/core/entity-action/manifests.ts | 4 ++-- .../src/packages/data-type/entity-actions/manifests.ts | 2 +- .../data-type/entity-actions/{move => move-to}/manifests.ts | 1 + 4 files changed, 6 insertions(+), 4 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/{move => move-to}/manifests.ts (97%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/move-to.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/move-to.action.ts index c77d0028ac..c2ad2a689f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/move-to.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move-to/move-to.action.ts @@ -1,9 +1,10 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import type { UmbMoveRepository } from '@umbraco-cms/backoffice/repository'; +import type { MetaEntityActionMoveToKind } from '@umbraco-cms/backoffice/extension-registry'; import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; -export class UmbMoveToEntityAction extends UmbEntityActionBase { +export class UmbMoveToEntityAction 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'); 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 bbe018524f..4eaa3a8f87 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,13 +1,13 @@ import { manifests as defaultEntityActionManifests } from './default/manifests.js'; import { manifests as deleteEntityActionManifests } from './common/delete/manifests.js'; import { manifests as duplicateEntityActionManifests } from './common/duplicate/manifests.js'; -import { manifests as moveEntityActionManifests } from './common/move/manifests.js'; +import { manifests as moveToEntityActionManifests } from './common/move-to/manifests.js'; import { manifests as sortChildrenOfEntityActionManifests } from './common/sort-children-of/manifests.js'; export const manifests = [ ...defaultEntityActionManifests, ...deleteEntityActionManifests, ...duplicateEntityActionManifests, - ...moveEntityActionManifests, + ...moveToEntityActionManifests, ...sortChildrenOfEntityActionManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts index e75c7625ff..4220e0dea3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts @@ -2,7 +2,7 @@ import { UMB_DATA_TYPE_ENTITY_TYPE } from '../entity.js'; import { UMB_DATA_TYPE_DETAIL_REPOSITORY_ALIAS } from '../repository/detail/index.js'; import { UMB_DATA_TYPE_ITEM_REPOSITORY_ALIAS } from '../repository/item/manifests.js'; import { manifests as createManifests } from './create/manifests.js'; -import { manifests as moveManifests } from './move/manifests.js'; +import { manifests as moveManifests } from './move-to/manifests.js'; import { manifests as duplicateManifests } from './duplicate/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/manifests.ts similarity index 97% rename from src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/manifests.ts index 5346c352a8..fd4756e765 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/manifests.ts @@ -15,6 +15,7 @@ const entityActions: Array = [ treeRepositoryAlias: UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS, moveRepositoryAlias: UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS, pickerModal: UMB_DATA_TYPE_PICKER_MODAL, + foldersOnly: true, }, }, ]; From cbe8dbb1916ca171f5341d45b3db289770d1e351 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 17:34:57 +0100 Subject: [PATCH 17/77] Tweaks I couldn't get the `item.name` to display. --- .../document-blueprints/entity-actions/create/manifests.ts | 3 ++- .../tree/document-blueprint-tree.server.data-source.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts index 09d4b17b63..8b238686a4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts @@ -7,6 +7,7 @@ const entityActions: Array = [ kind: 'default', alias: 'Umb.EntityAction.DocumentBlueprint.Create', name: 'Document Blueprint Options Create Entity Action', + weight: 1200, api: () => import('./create.action.js'), forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], meta: { @@ -21,7 +22,7 @@ const manifestModals: Array = [ type: 'modal', alias: 'Umb.Modal.DocumentBlueprintOptionsCreate', name: 'Document Blueprint Options Create Modal', - js: () => import('./modal/document-blueprint-options-create-modal.element.js'), + element: () => import('./modal/document-blueprint-options-create-modal.element.js'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts index a7be4c5d67..c7d511a210 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts @@ -61,7 +61,7 @@ const mapper = (item: DocumentBlueprintTreeItemResponseModel): UmbDocumentBluepr return { unique: item.id, parentUnique: item.parent?.id || null, - name: item.name, + name: (item as any).variants?.[0].name ?? item.name, entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, isFolder: false, hasChildren: item.hasChildren, From abe8a1aeb2edfb5d80313ec045de9901ac22e627 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 19:27:44 +0100 Subject: [PATCH 18/77] Adds alignment for `umb-table` table-cells After chatting with @mattbrailsford about this, I wanted to explore if it was possible. --- .../core/components/table/table.element.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts index 43234edd3d..de12b4b965 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts @@ -30,6 +30,7 @@ export interface UmbTableColumn { elementName?: string; width?: string; allowSorting?: boolean; + align?: 'left' | 'center' | 'right'; } export interface UmbTableColumnLayoutElement extends HTMLElement { @@ -176,7 +177,9 @@ export class UmbTableElement extends LitElement { private _renderHeaderCell(column: UmbTableColumn) { return html` - ${column.allowSorting ? html`${this._renderSortingUI(column)}` : column.name} + ${column.allowSorting + ? html`${this._renderSortingUI(column)}` + : html`${column.name}`} `; } @@ -186,7 +189,7 @@ export class UmbTableElement extends LitElement { @@ -240,8 +243,11 @@ export class UmbTableElement extends LitElement { } private _renderRowCell(column: UmbTableColumn, item: UmbTableItem) { - return html`${this._renderCellContent(column, item)} + return html` + + ${this._renderCellContent(column, item)} + `; } @@ -313,6 +319,9 @@ export class UmbTableElement extends LitElement { justify-content: space-between; width: 100%; } + uui-table-head-cell button > span { + flex: 1 0 auto; + } uui-table-cell uui-icon { vertical-align: top; From f638a3ec1f5464b1866e23dee69ee89094ea4d88 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 19:28:46 +0100 Subject: [PATCH 19/77] `umb-table` UI tweaks Switches `uui-icon` to `umb-icon` to support colour. --- .../core/components/table/table.element.ts | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts index de12b4b965..4b7eaa35e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts @@ -187,7 +187,7 @@ export class UmbTableElement extends LitElement { private _renderSortingUI(column: UmbTableColumn) { return html`