From 86c57bf113ba5b89cabf65aa72d2017a6eb98250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 22 Jan 2024 21:55:16 +0100 Subject: [PATCH] create block at a decired index --- .../libs/observable-api/states/array-state.ts | 28 +++++++++++++++ .../utils/push-at-to-unique-array.function.ts | 29 ++++++++++++++++ .../block-grid-workspace.modal-token.ts | 20 +++++++++++ .../block/block-grid/workspace/index.ts | 1 + .../manager/block-list-manager.context.ts | 7 ++-- .../property-editor-ui-block-list.element.ts | 20 +++++++---- .../block-list-workspace.modal-token.ts | 19 +++++++++++ .../block/block-list/workspace/index.ts | 1 + .../block-rte-workspace.modal-token.ts | 19 +++++++++++ .../block/block-rte/workspace/index.ts | 1 + .../block/manager/block-manager.context.ts | 31 +++++++++++------ .../block-catalogue-modal.element.ts | 34 ++++++++++++------- .../block-catalogue-modal.token.ts | 3 +- .../workspace/block-workspace.context.ts | 20 ++++++++--- .../workspace/block-workspace.modal-token.ts | 21 ++++++++---- 15 files changed, 210 insertions(+), 44 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/push-at-to-unique-array.function.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-workspace.modal-token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/block-list-workspace.modal-token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/block-rte-workspace.modal-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts index 5d5b5f12a7..402cb2b4f5 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts @@ -1,4 +1,5 @@ import { partialUpdateFrozenArray } from '../utils/partial-update-frozen-array.function.js'; +import { pushAtToUniqueArray } from '../utils/push-at-to-unique-array.function.js'; import { pushToUniqueArray } from '../utils/push-to-unique-array.function.js'; import { UmbDeepState } from './deep-state.js'; @@ -166,6 +167,33 @@ export class UmbArrayState extends UmbDeepState { return this; } + /** + * @method appendOneAt + * @param {T} entry - new data to be added in this Subject. + * @param {T} index - index of where to append this data into the Subject. + * @return {UmbArrayState} Reference to it self. + * @description - Append some new data to this Subject. + * @example Example append some data. + * const data = [ + * { key: 1, value: 'foo'}, + * { key: 3, value: 'bar'} + * ]; + * const myState = new UmbArrayState(data); + * myState.appendOneAt({ key: 2, value: 'in-between'}, 1); + */ + appendOneAt(entry: T, index: number) { + const next = [...this.getValue()]; + if (this.getUniqueMethod) { + pushAtToUniqueArray(next, entry, this.getUniqueMethod, index); + } else if (index === -1 || index >= next.length) { + next.push(entry); + } else { + next.splice(index, 0, entry); + } + this.setValue(next); + return this; + } + /** * @method append * @param {T[]} entries - A array of new data to be added in this Subject. diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/push-at-to-unique-array.function.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/push-at-to-unique-array.function.ts new file mode 100644 index 0000000000..4d27c9c0bb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/push-at-to-unique-array.function.ts @@ -0,0 +1,29 @@ +/** + * @export + * @method pushToUniqueArray + * @param {T[]} data - An array of objects. + * @param {T} entry - The object to insert or replace with. + * @param {getUniqueMethod: (entry: T) => unknown} [getUniqueMethod] - Method to get the unique value of an entry. + * @description - Append or replaces an item of an Array. + * @example Example append new entry for a Array. Where the key is unique and the item will be updated if matched with existing. + * const entry = {key: 'myKey', value: 'myValue'}; + * const newDataSet = pushToUniqueArray([], entry, x => x.key === key, 1); + * mySubject.next(newDataSet); + */ +export function pushAtToUniqueArray( + data: T[], + entry: T, + getUniqueMethod: (entry: T) => unknown, + index: number, +): T[] { + const unique = getUniqueMethod(entry); + const indexToReplace = data.findIndex((x) => getUniqueMethod(x) === unique); + if (indexToReplace !== -1) { + data[indexToReplace] = entry; + } else if (index === -1 || index >= data.length) { + data.push(entry); + } else { + data.splice(index, 0, entry); + } + return data; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-workspace.modal-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-workspace.modal-token.ts new file mode 100644 index 0000000000..644cd75751 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-workspace.modal-token.ts @@ -0,0 +1,20 @@ +import { UmbBlockWorkspaceData } from '../../index.js'; +import { UmbModalToken, UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal'; + +export interface UmbBlockListWorkspaceData + extends UmbBlockWorkspaceData<{ + index: number; + parentId: string | null; + }> {} + +export const UMB_BLOCK_GRID_WORKSPACE_MODAL = new UmbModalToken( + 'Umb.Modal.Workspace', + { + modal: { + type: 'sidebar', + size: 'medium', + }, + data: { entityType: 'block', preset: {}, originData: { index: -1, parentId: null } }, + // Recast the type, so the entityType data prop is not required: + }, +) as UmbModalToken, UmbWorkspaceValue>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/index.ts index ff371a313e..e94538cd86 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/index.ts @@ -1 +1,2 @@ export const UMB_BLOCK_GRID_TYPE_WORKSPACE_ALIAS = 'Umb.Workspace.BlockGridType'; +export * from './block-grid-workspace.modal-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/manager/block-list-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/manager/block-list-manager.context.ts index a53003c06a..265645fe82 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/manager/block-list-manager.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/manager/block-list-manager.context.ts @@ -1,5 +1,6 @@ import type { UmbBlockListLayoutModel, UmbBlockListTypeModel } from '../types.js'; import { UmbBlockManagerContext } from '../../block/manager/block-manager.context.js'; +import type { UmbBlockListWorkspaceData } from '../index.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; @@ -17,10 +18,12 @@ export class UmbBlockListManagerContext< this.#inlineEditingMode.setValue(inlineEditingMode ?? false); } - createBlock(layoutEntry: Omit, contentElementTypeKey: string) { + _createBlock(modalData: UmbBlockListWorkspaceData, layoutEntry: BlockLayoutType, contentElementTypeKey: string) { // Here is room to append some extra layout properties if needed for this type. - return super._createBlockData(layoutEntry, contentElementTypeKey); + this._layouts.appendOneAt(layoutEntry, modalData.originData.index ?? -1); + + return true; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.element.ts index 4e779bc0bc..eb9e5d801c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.element.ts @@ -136,9 +136,16 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement }); new UmbModalRouteRegistrationController(this, UMB_BLOCK_CATALOGUE_MODAL) - .addAdditionalPath(':view') + .addAdditionalPath(':view/:index') .onSetup((routingInfo) => { - return { data: { blocks: this._blocks ?? [], openClipboard: routingInfo.view === 'clipboard' } }; + const index = routingInfo.index ? parseInt(routingInfo.index) : -1; + return { + data: { + blocks: this._blocks ?? [], + openClipboard: routingInfo.view === 'clipboard', + blockOriginData: { index: index }, + }, + }; }) .observeRouteBuilder((routeBuilder) => { this._catalogueRouteBuilder = routeBuilder; @@ -149,8 +156,9 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement return html` ${repeat( this._layouts, (x) => x.contentUdi, - (layoutEntry) => - html` + (layoutEntry, index) => + html` `, )} @@ -159,13 +167,13 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement id="add-button" look="placeholder" label=${this.localize.term('content_createEmpty')} - href=${this._catalogueRouteBuilder?.({ view: 'create' }) ?? ''}> + href=${this._catalogueRouteBuilder?.({ view: 'create', index: -1 }) ?? ''}> ${this.localize.term('content_createEmpty')} + href=${this._catalogueRouteBuilder?.({ view: 'clipboard', index: -1 }) ?? ''}> `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/block-list-workspace.modal-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/block-list-workspace.modal-token.ts new file mode 100644 index 0000000000..4c2cee12ac --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/block-list-workspace.modal-token.ts @@ -0,0 +1,19 @@ +import { UmbBlockWorkspaceData } from '../../index.js'; +import { UmbModalToken, UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal'; + +export interface UmbBlockListWorkspaceData + extends UmbBlockWorkspaceData<{ + index: number; + }> {} + +export const UMB_BLOCK_LIST_WORKSPACE_MODAL = new UmbModalToken( + 'Umb.Modal.Workspace', + { + modal: { + type: 'sidebar', + size: 'medium', + }, + data: { entityType: 'block', preset: {}, originData: { index: -1 } }, + // Recast the type, so the entityType data prop is not required: + }, +) as UmbModalToken, UmbWorkspaceValue>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/index.ts index b4685e9690..3aef41c3bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/index.ts @@ -1 +1,2 @@ export const UMB_BLOCK_LIST_TYPE_WORKSPACE_ALIAS = 'Umb.Workspace.BlockListType'; +export * from './block-list-workspace.modal-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/block-rte-workspace.modal-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/block-rte-workspace.modal-token.ts new file mode 100644 index 0000000000..274007f4c0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/block-rte-workspace.modal-token.ts @@ -0,0 +1,19 @@ +import { UmbBlockWorkspaceData } from '../../index.js'; +import { UmbModalToken, UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal'; + +export interface UmbBlockListWorkspaceData + extends UmbBlockWorkspaceData<{ + index: number; + }> {} + +export const UMB_BLOCK_RTE_WORKSPACE_MODAL = new UmbModalToken( + 'Umb.Modal.Workspace', + { + modal: { + type: 'sidebar', + size: 'medium', + }, + data: { entityType: 'block', preset: {}, originData: { index: -1 } }, + // Recast the type, so the entityType data prop is not required: + }, +) as UmbModalToken, UmbWorkspaceValue>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/index.ts index 557b771a07..9065e8bf6c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/index.ts @@ -1 +1,2 @@ export const UMB_BLOCK_RTE_TYPE_WORKSPACE_ALIAS = 'Umb.Workspace.BlockRteType'; +export * from './block-rte-workspace.modal-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/block-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/block-manager.context.ts index 4baf548c1b..0003d05b40 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/block-manager.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/block-manager.context.ts @@ -8,6 +8,7 @@ import { UMB_BLOCK_MANAGER_CONTEXT, UMB_BLOCK_WORKSPACE_MODAL, UmbBlockTypeBaseModel, + UmbBlockWorkspaceData, } from '@umbraco-cms/backoffice/block'; import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import { UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type'; @@ -36,8 +37,8 @@ export abstract class UmbBlockManagerContext< #editorConfiguration = new UmbClassState(undefined); public readonly editorConfiguration = this.#editorConfiguration.asObservable(); - #layouts = new UmbArrayState(>[], (x) => x.contentUdi); - public readonly layouts = this.#layouts.asObservable(); + protected _layouts = new UmbArrayState(>[], (x) => x.contentUdi); + public readonly layouts = this._layouts.asObservable(); #contents = new UmbArrayState(>[], (x) => x.udi); public readonly contents = this.#contents.asObservable(); @@ -57,7 +58,7 @@ export abstract class UmbBlockManagerContext< } setLayouts(layouts: Array) { - this.#layouts.setValue(layouts); + this._layouts.setValue(layouts); } setContents(contents: Array) { @@ -116,7 +117,7 @@ export abstract class UmbBlockManagerContext< } layoutOf(contentUdi: string) { - return this.#layouts.asObservablePart((source) => source.find((x) => x.contentUdi === contentUdi)); + return this._layouts.asObservablePart((source) => source.find((x) => x.contentUdi === contentUdi)); } contentOf(udi: string) { return this.#contents.asObservablePart((source) => source.find((x) => x.udi === udi)); @@ -126,7 +127,7 @@ export abstract class UmbBlockManagerContext< } setOneLayout(layoutData: BlockLayoutType) { - return this.#layouts.appendOne(layoutData); + return this._layouts.appendOne(layoutData); } setOneContent(contentData: UmbBlockDataType) { this.#contents.appendOne(contentData); @@ -135,9 +136,17 @@ export abstract class UmbBlockManagerContext< this.#settings.appendOne(settingsData); } - abstract createBlock(layoutEntry: Omit, contentElementTypeKey: string): boolean; + abstract _createBlock( + modalData: UmbBlockWorkspaceData, + layoutEntry: Omit, + contentElementTypeKey: string, + ): boolean; - protected _createBlockData(layoutEntry: Omit, contentElementTypeKey: string) { + public createBlock( + modalData: UmbBlockWorkspaceData, + layoutEntry: Omit, + contentElementTypeKey: string, + ) { // Find block type. const blockType = this.#blockTypes.value.find((x) => x.contentElementTypeKey === contentElementTypeKey); if (!blockType) { @@ -154,7 +163,9 @@ export abstract class UmbBlockManagerContext< fullLayoutEntry.settingsUdi = buildUdi('element', UmbId.new()); } - this.#layouts.appendOne(fullLayoutEntry); + if (this._createBlock(modalData, fullLayoutEntry, contentElementTypeKey) === false) { + return false; + } // Create content entry: if (fullLayoutEntry.contentUdi) { @@ -184,14 +195,14 @@ export abstract class UmbBlockManagerContext< } deleteBlock(contentUdi: string) { - const layout = this.#layouts.value.find((x) => x.contentUdi === contentUdi); + const layout = this._layouts.value.find((x) => x.contentUdi === contentUdi); if (!layout) return; if (layout.settingsUdi) { this.#settings.removeOne(layout.settingsUdi); } - this.#layouts.removeOne(contentUdi); + this._layouts.removeOne(contentUdi); this.#contents.removeOne(contentUdi); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts index f941ef81a8..683d0862dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts @@ -6,7 +6,11 @@ import { } from '@umbraco-cms/backoffice/block'; import { css, html, customElement, state, repeat, ifDefined, nothing } from '@umbraco-cms/backoffice/external/lit'; import { groupBy } from '@umbraco-cms/backoffice/external/lodash'; -import { UmbModalBaseElement, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; +import { + UMB_MODAL_CONTEXT_TOKEN, + UmbModalBaseElement, + UmbModalRouteRegistrationController, +} from '@umbraco-cms/backoffice/modal'; @customElement('umb-block-catalogue-modal') export class UmbBlockCatalogueModalElement extends UmbModalBaseElement< @@ -28,18 +32,22 @@ export class UmbBlockCatalogueModalElement extends UmbModalBaseElement< constructor() { super(); - new UmbModalRouteRegistrationController(this, UMB_BLOCK_WORKSPACE_MODAL) - //.addAdditionalPath('block') // No need for additional path specification in this context as this is for sure the only workspace we want to open here. - .onSetup(() => { - return { data: { preset: {} } }; - }) - .onSubmit(() => { - // When workspace is submitted, we want to close this modal. - this.modalContext?.submit(); - }) - .observeRouteBuilder((routeBuilder) => { - this._workspacePath = routeBuilder({}); - }); + this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (modalContext) => { + new UmbModalRouteRegistrationController(this, UMB_BLOCK_WORKSPACE_MODAL) + //.addAdditionalPath('block') // No need for additional path specification in this context as this is for sure the only workspace we want to open here. + .onSetup(() => { + return { + data: { preset: {}, originData: (modalContext.data as UmbBlockCatalogueModalData).blockOriginData }, + }; + }) + .onSubmit(() => { + // When workspace is submitted, we want to close this modal. + this.modalContext?.submit(); + }) + .observeRouteBuilder((routeBuilder) => { + this._workspacePath = routeBuilder({}); + }); + }); } connectedCallback() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.token.ts index 99cedd7654..9d64c42970 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.token.ts @@ -1,10 +1,11 @@ -import { UmbBlockTypeBaseModel } from '@umbraco-cms/backoffice/block'; +import type { UmbBlockTypeBaseModel, UmbBlockWorkspaceData } from '@umbraco-cms/backoffice/block'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbBlockCatalogueModalData { blocks: Array; blockGroups?: Array<{ name: string; key: string }>; openClipboard?: boolean; + blockOriginData: UmbBlockWorkspaceData; } export type UmbBlockCatalogueModalValue = never; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts index 9f5c0c7ad0..e36ccbe97f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts @@ -5,7 +5,7 @@ import { UmbBooleanState, UmbObjectState, UmbStringState } from '@umbraco-cms/ba import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; import { UmbId } from '@umbraco-cms/backoffice/id'; -import { UMB_BLOCK_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/block'; +import { UMB_BLOCK_MANAGER_CONTEXT, UmbBlockWorkspaceData } from '@umbraco-cms/backoffice/block'; import { buildUdi } from '@umbraco-cms/backoffice/utils'; import { UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; @@ -18,8 +18,9 @@ export class UmbBlockWorkspaceContext< readonly workspaceAlias; #blockManager?: typeof UMB_BLOCK_MANAGER_CONTEXT.TYPE; - #retrieveModalContext; #retrieveBlockManager; + #modalContext?: typeof UMB_MODAL_CONTEXT_TOKEN.TYPE; + #retrieveModalContext; #editorConfigPromise?: Promise; #entityType: string; @@ -49,6 +50,7 @@ export class UmbBlockWorkspaceContext< this.workspaceAlias = workspaceArgs.manifest.alias; this.#retrieveModalContext = this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (context) => { + this.#modalContext = context; context.onSubmit().catch(this.#modalRejected); }).asPromise(); @@ -111,13 +113,17 @@ export class UmbBlockWorkspaceContext< async create(contentElementTypeId: string) { await this.#retrieveBlockManager; + await this.#retrieveModalContext; if (!this.#blockManager) { - throw new Error('Block manager not found'); + throw new Error('Block Manager not found'); + return; + } + if (!this.#modalContext) { + throw new Error('Modal Context not found'); return; } // // TODO: Condense this into some kind of create method? - const key = UmbId.new(); const contentUdi = buildUdi('block', key); const layoutData: UmbBlockLayoutBaseModel = { @@ -135,7 +141,11 @@ export class UmbBlockWorkspaceContext< this.#layout.setValue(layoutData as LayoutDataType); if (this.#liveEditingMode) { - const blockCreated = this.#blockManager.createBlock(layoutData, contentElementTypeId); + const blockCreated = this.#blockManager.createBlock( + this.#modalContext.data as UmbBlockWorkspaceData, + layoutData, + contentElementTypeId, + ); if (!blockCreated) { throw new Error('Block Manager could not create block'); return; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.modal-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.modal-token.ts index b23ffe2e7c..e015bc4b7a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.modal-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.modal-token.ts @@ -1,10 +1,17 @@ import { UmbModalToken, UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal'; -export const UMB_BLOCK_WORKSPACE_MODAL = new UmbModalToken('Umb.Modal.Workspace', { - modal: { - type: 'sidebar', - size: 'large', +export interface UmbBlockWorkspaceData extends UmbWorkspaceData { + originData: OriginDataType; +} + +export const UMB_BLOCK_WORKSPACE_MODAL = new UmbModalToken( + 'Umb.Modal.Workspace', + { + modal: { + type: 'sidebar', + size: 'large', + }, + data: { entityType: 'block', preset: {}, originData: {} }, + // Recast the type, so the entityType data prop is not required: }, - data: { entityType: 'block', preset: {} }, - // Recast the type, so the entityType data prop is not required: -}) as UmbModalToken, UmbWorkspaceValue>; +) as UmbModalToken, UmbWorkspaceValue>;