create block methods

This commit is contained in:
Niels Lyngsø
2024-01-18 09:37:01 +01:00
parent df2be6d049
commit 3e4c66c210
4 changed files with 38 additions and 17 deletions

View File

@@ -0,0 +1,15 @@
import { UmbBlockManagerContext } from '@umbraco-cms/backoffice/block';
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
import { UmbId } from '@umbraco-cms/backoffice/id';
import { buildUdi } from '@umbraco-cms/backoffice/utils';
export class UmbBlockListManagerContext extends UmbBlockManagerContext {
createBlock(contentElementTypeKey: string) {
return super._createBlockData({}, contentElementTypeKey);
}
}
export const UMB_BLOCK_LIST_MANAGER_CONTEXT = new UmbContextToken<
UmbBlockListManagerContext,
UmbBlockListManagerContext
>('UmbBlockManagerContext');

View File

@@ -7,16 +7,14 @@ import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/
import {
UMB_BLOCK_CATALOGUE_MODAL,
UmbBlockLayoutBaseModel,
UmbBlockManagerContext,
UmbBlockTypeBase,
type UmbBlockValueType,
} from '@umbraco-cms/backoffice/block';
import '../../components/block-list-block/index.js';
import { buildUdi } from '@umbraco-cms/backoffice/utils';
import { UmbId } from '@umbraco-cms/backoffice/id';
import type { NumberRangeValueType } from '@umbraco-cms/backoffice/models';
import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalManagerContext } from '@umbraco-cms/backoffice/modal';
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event';
import { UmbBlockListManagerContext } from '../../manager/block-list-manager.context.js';
export interface UmbBlockListLayoutModel extends UmbBlockLayoutBaseModel {}
@@ -73,7 +71,7 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement
@state()
private _blocks?: Array<UmbBlockTypeBase>;
#context = new UmbBlockManagerContext(this);
#context = new UmbBlockListManagerContext(this);
@state()
_layouts: Array<UmbBlockLayoutBaseModel> = [];
@@ -133,13 +131,7 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement
if (!block?.contentElementTypeKey) return;
this.#context.createBlock(
{
contentUdi: buildUdi('element', UmbId.new()),
settingsUdi: buildUdi('element', UmbId.new()),
},
block.contentElementTypeKey,
);
this.#context.createBlock(block.contentElementTypeKey);
}
render() {

View File

@@ -1,6 +1,6 @@
import type { UmbBlockTypeBase } from '../../block-type/types.js';
import type { UmbBlockLayoutBaseModel, UmbBlockDataType } from '../types.js';
import { UMB_BLOCK_MANAGER_CONTEXT, type UmbBlockManagerContext } from '../manager/index.js';
import { UMB_BLOCK_MANAGER_CONTEXT } from '../manager/index.js';
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
@@ -11,7 +11,7 @@ export class UmbBlockContext<
BlockLayoutType extends UmbBlockLayoutBaseModel = UmbBlockLayoutBaseModel,
> extends UmbContextBase<UmbBlockContext> {
//
#manager?: UmbBlockManagerContext;
#manager?: typeof UMB_BLOCK_MANAGER_CONTEXT.TYPE;
#blockTypeName = new UmbStringState(undefined);
public readonly blockTypeName = this.#blockTypeName.asObservable();

View File

@@ -5,14 +5,15 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UmbArrayState, UmbStringState } from '@umbraco-cms/backoffice/observable-api';
import { UmbDocumentTypeDetailRepository } from '@umbraco-cms/backoffice/document-type';
import { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api';
import { getKeyFromUdi } from '@umbraco-cms/backoffice/utils';
import { buildUdi, getKeyFromUdi } from '@umbraco-cms/backoffice/utils';
import { UmbBlockTypeBase } from '@umbraco-cms/backoffice/block';
import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal';
import { UmbId } from '@umbraco-cms/backoffice/id';
// TODO: We are using backend model here, I think we should get our own model:
type ElementTypeModel = DocumentTypeResponseModel;
export class UmbBlockManagerContext<
export abstract class UmbBlockManagerContext<
BlockType extends UmbBlockTypeBase = UmbBlockTypeBase,
BlockLayoutType extends UmbBlockLayoutBaseModel = UmbBlockLayoutBaseModel,
> extends UmbContextBase<UmbBlockManagerContext> {
@@ -124,14 +125,23 @@ export class UmbBlockManagerContext<
this.#settings.appendOne(settingsData);
}
createBlock(layoutEntry: BlockLayoutType, contentElementTypeKey: string) {
abstract createBlock(contentElementTypeKey: string): boolean;
protected _createBlockData(layoutEntry: Omit<BlockLayoutType, 'contentUdi'>, contentElementTypeKey: string) {
// Find block type.
const blockType = this.#blockTypes.value.find((x) => x.contentElementTypeKey === contentElementTypeKey);
if (!blockType) {
throw new Error(`Cannot create block, missing block type for ${contentElementTypeKey}`);
return false;
}
this.#layouts.appendOne(layoutEntry);
// Create layout entry:
layoutEntry.contentUdi = buildUdi('element', UmbId.new());
if (blockType.settingsElementTypeKey) {
layoutEntry.settingsUdi = buildUdi('element', UmbId.new());
}
this.#layouts.appendOne(layoutEntry as BlockLayoutType);
// Create content entry:
if (layoutEntry.contentUdi) {
@@ -141,6 +151,7 @@ export class UmbBlockManagerContext<
});
} else {
throw new Error('Cannot create block, missing contentUdi');
return false;
}
//Create settings entry:
@@ -152,8 +163,11 @@ export class UmbBlockManagerContext<
});
} else {
throw new Error('Cannot create block, missing settingsUdi');
return false;
}
}
return true;
}
deleteBlock(contentUdi: string) {