Bugfix: Variant Blocks create duplicates in the frontend when created in an area (#2464)

* revert to previous code before tiptap

* correct rte-entries context
This commit is contained in:
Niels Lyngsø
2024-10-16 17:11:47 +02:00
committed by GitHub
parent 53ccd2344b
commit 19de38f021
7 changed files with 68 additions and 18 deletions

View File

@@ -186,7 +186,7 @@ export class UmbBlockGridManagerContext<
originData: UmbBlockGridWorkspaceOriginData,
) {
this.setOneLayout(layoutEntry, originData);
this.insertBlockData(layoutEntry, content, settings);
this.insertBlockData(layoutEntry, content, settings, originData);
return true;
}

View File

@@ -48,7 +48,11 @@ export class UmbBlockListEntriesContext extends UmbBlockEntriesContext<
})
.onSubmit(async (value, data) => {
if (value?.create && data) {
const created = await this.create(value.create.contentElementTypeKey, {});
const created = await this.create(
value.create.contentElementTypeKey,
{},
data.originData as UmbBlockListWorkspaceOriginData,
);
if (created) {
this.insert(
created.layout,
@@ -127,9 +131,13 @@ export class UmbBlockListEntriesContext extends UmbBlockEntriesContext<
this._manager?.setLayouts(layouts);
}
async create(contentElementTypeKey: string, partialLayoutEntry?: Omit<UmbBlockListLayoutModel, 'contentKey'>) {
async create(
contentElementTypeKey: string,
partialLayoutEntry?: Omit<UmbBlockListLayoutModel, 'contentKey'>,
originData?: UmbBlockListWorkspaceOriginData,
) {
await this._retrieveManager;
return this._manager?.create(contentElementTypeKey, partialLayoutEntry);
return this._manager?.create(contentElementTypeKey, partialLayoutEntry, originData);
}
// insert Block?

View File

@@ -21,7 +21,13 @@ export class UmbBlockListManagerContext<
return this.#inlineEditingMode.getValue();
}
create(contentElementTypeKey: string, partialLayoutEntry?: Omit<BlockLayoutType, 'contentKey'>) {
create(
contentElementTypeKey: string,
partialLayoutEntry?: Omit<BlockLayoutType, 'contentKey'>,
// This property is used by some implementations, but not used in this. Do not remove. [NL]
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_originData?: UmbBlockListWorkspaceOriginData,
) {
return super._createBlockData(contentElementTypeKey, partialLayoutEntry);
}
@@ -33,7 +39,7 @@ export class UmbBlockListManagerContext<
) {
this._layouts.appendOneAt(layoutEntry, originData.index ?? -1);
this.insertBlockData(layoutEntry, content, settings);
this.insertBlockData(layoutEntry, content, settings, originData);
return true;
}

View File

@@ -53,7 +53,12 @@ export class UmbBlockRteEntriesContext extends UmbBlockEntriesContext<
{} as any,
);
if (created) {
this.insert(created.layout, created.content, created.settings);
this.insert(
created.layout,
created.content,
created.settings,
data.originData as UmbBlockRteWorkspaceOriginData,
);
} else {
throw new Error('Failed to create block');
}
@@ -122,9 +127,13 @@ export class UmbBlockRteEntriesContext extends UmbBlockEntriesContext<
this._manager?.setLayouts(layouts);
}
async create(contentElementTypeKey: string, partialLayoutEntry?: Omit<UmbBlockRteLayoutModel, 'contentKey'>) {
async create(
contentElementTypeKey: string,
partialLayoutEntry?: Omit<UmbBlockRteLayoutModel, 'contentKey'>,
originData?: UmbBlockRteWorkspaceOriginData,
) {
await this._retrieveManager;
return this._manager?.create(contentElementTypeKey, partialLayoutEntry);
return this._manager?.create(contentElementTypeKey, partialLayoutEntry, originData);
}
// insert Block?
@@ -133,9 +142,10 @@ export class UmbBlockRteEntriesContext extends UmbBlockEntriesContext<
layoutEntry: UmbBlockRteLayoutModel,
content: UmbBlockDataModel,
settings: UmbBlockDataModel | undefined,
originData: UmbBlockRteWorkspaceOriginData,
) {
await this._retrieveManager;
return this._manager?.insert(layoutEntry, content, settings) ?? false;
return this._manager?.insert(layoutEntry, content, settings, originData) ?? false;
}
// create Block?

View File

@@ -1,3 +1,4 @@
import type { UmbBlockRteWorkspaceOriginData } from '../workspace/block-rte-workspace.modal-token.js';
import type { UmbBlockRteLayoutModel, UmbBlockRteTypeModel } from '../types.js';
import type { UmbBlockDataModel } from '../../block/types.js';
import { UmbBlockManagerContext } from '@umbraco-cms/backoffice/block';
@@ -14,7 +15,13 @@ export class UmbBlockRteManagerContext<
this._layouts.removeOne(contentKey);
}
create(contentElementTypeKey: string, partialLayoutEntry?: Omit<BlockLayoutType, 'contentKey'>) {
create(
contentElementTypeKey: string,
partialLayoutEntry?: Omit<BlockLayoutType, 'contentKey'>,
// This property is used by some implementations, but not used in this, do not remove. [NL]
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_originData?: UmbBlockRteWorkspaceOriginData,
) {
const data = super._createBlockData(contentElementTypeKey, partialLayoutEntry);
// Find block type.
@@ -30,10 +37,15 @@ export class UmbBlockRteManagerContext<
return data;
}
insert(layoutEntry: BlockLayoutType, content: UmbBlockDataModel, settings: UmbBlockDataModel | undefined) {
insert(
layoutEntry: BlockLayoutType,
content: UmbBlockDataModel,
settings: UmbBlockDataModel | undefined,
originData: UmbBlockRteWorkspaceOriginData,
) {
this._layouts.appendOne(layoutEntry);
this.insertBlockData(layoutEntry, content, settings);
this.insertBlockData(layoutEntry, content, settings, originData);
return true;
}

View File

@@ -203,7 +203,9 @@ export abstract class UmbBlockManagerContext<
getContentOf(contentKey: string) {
return this.#contents.value.find((x) => x.key === contentKey);
}
setOneLayout(layoutData: BlockLayoutType) {
// originData param is used by some implementations. [NL] should be here, do not remove it.
// eslint-disable-next-line @typescript-eslint/no-unused-vars
setOneLayout(layoutData: BlockLayoutType, _originData?: BlockOriginDataType) {
this._layouts.appendOne(layoutData);
}
setOneContent(contentData: UmbBlockDataModel) {
@@ -316,7 +318,13 @@ export abstract class UmbBlockManagerContext<
originData: BlockOriginDataType,
): boolean;
protected insertBlockData(layoutEntry: BlockLayoutType, content: UmbBlockDataModel, settings?: UmbBlockDataModel) {
protected insertBlockData(
layoutEntry: BlockLayoutType,
content: UmbBlockDataModel,
settings: UmbBlockDataModel | undefined,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_originData: BlockOriginDataType,
) {
// Create content entry:
if (layoutEntry.contentKey) {
this.#contents.appendOne(content);

View File

@@ -352,7 +352,10 @@ export class UmbBlockWorkspaceContext<LayoutDataType extends UmbBlockLayoutBaseM
this.layout,
(layoutData) => {
if (layoutData) {
this.#blockManager?.setOneLayout(layoutData);
this.#blockManager?.setOneLayout(
layoutData,
this.#modalContext?.data.originData as UmbBlockWorkspaceOriginData,
);
}
},
'observeThisLayout',
@@ -448,7 +451,7 @@ export class UmbBlockWorkspaceContext<LayoutDataType extends UmbBlockLayoutBaseM
} else {
// Update data:
this.#blockManager.setOneLayout(layoutData);
this.#blockManager.setOneLayout(layoutData, this.#modalContext.data.originData as UmbBlockWorkspaceOriginData);
if (contentData) {
this.#blockManager.setOneContent(contentData);
}
@@ -485,7 +488,10 @@ export class UmbBlockWorkspaceContext<LayoutDataType extends UmbBlockLayoutBaseM
} else {
// Revert the layout, content & settings data to the original state: [NL]
if (this.#initialLayout) {
this.#blockManager?.setOneLayout(this.#initialLayout);
this.#blockManager?.setOneLayout(
this.#initialLayout,
this.#modalContext?.data.originData as UmbBlockWorkspaceOriginData,
);
}
if (this.#initialContent) {
this.#blockManager?.setOneContent(this.#initialContent);