diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/manifests.ts index 87eb7c30b8..0f5e990a07 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/manifests.ts @@ -1,5 +1,7 @@ import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/extension-registry'; +export const UMB_BLOCK_LIST_PROPERTY_EDITOR_ALIAS = 'Umbraco.BlockList'; + export const manifest: ManifestPropertyEditorUi = { type: 'propertyEditorUi', alias: 'Umb.PropertyEditorUi.BlockList', @@ -7,7 +9,7 @@ export const manifest: ManifestPropertyEditorUi = { js: () => import('./property-editor-ui-block-list.element.js'), meta: { label: 'Block List', - propertyEditorSchemaAlias: 'Umbraco.BlockList', + propertyEditorSchemaAlias: UMB_BLOCK_LIST_PROPERTY_EDITOR_ALIAS, icon: 'icon-thumbnail-list', group: 'lists', settings: { 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 8d1d2e19a0..8274f10243 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 @@ -1,47 +1,60 @@ -import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { UMB_BLOCK_LIST_PROPERTY_EDITOR_ALIAS } from './manifests.js'; +import { html, customElement, property, state, styleMap } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { UmbBlockManagerContext, type UmbBlockValueType } from '@umbraco-cms/backoffice/block'; /** * @element umb-property-editor-ui-block-list */ @customElement('umb-property-editor-ui-block-list') export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implements UmbPropertyEditorUiElement { - private _value: Array = []; + private _value?: UmbBlockValueType; - @property({ type: Array }) - public get value(): Array { + @property({ attribute: false }) + public get value(): UmbBlockValueType | undefined { return this._value; } - public set value(value: Array) { - this._value = value || []; + public set value(value: UmbBlockValueType | undefined) { + const buildUpValue: Partial = value ?? {}; + buildUpValue.layout ??= {}; + buildUpValue.contentData ??= []; + buildUpValue.settingsData ??= []; + this._value = buildUpValue as UmbBlockValueType; + + this.#context.setLayouts(this._value.layout[UMB_BLOCK_LIST_PROPERTY_EDITOR_ALIAS]); } @property({ attribute: false }) public set config(config: UmbPropertyEditorConfigCollection | undefined) { - const validationLimit = config['validationLimit']; + if (!config) return; + const validationLimit = config.find((x) => x.alias === 'validationLimit')?.value; - this._limitMin = (validationLimit?.value as any)?.min; - this._limitMax = (validationLimit?.value as any)?.max; + this._limitMin = validationLimit?.min; + this._limitMax = validationLimit?.max; - //config.blocks + const blocks = config.find((x) => x.alias === 'blocks')?.value; + this.#context.setBlockTypes(blocks); //config.useSingleBlockMode //config.useLiveEditing //config.useInlineEditingAsDefault - this._maxPropertyWidth = config.maxPropertyWidth; + this.inlineStyles.width = config.find((x) => x.alias === 'maxPropertyWidth')?.value; } @state() private _limitMin?: number; @state() private _limitMax?: number; + + #context = new UmbBlockManagerContext(this); + @state() - private _maxPropertyWidth?: string; + inlineStyles = { width: undefined }; render() { - return html`
umb-property-editor-ui-block-list
`; + return html`
umb-property-editor-ui-block-list
`; } static styles = [UmbTextStyles]; 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 new file mode 100644 index 0000000000..1a8a5240bd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/block-manager.context.ts @@ -0,0 +1,62 @@ +import type { UmbBlockTypeBase } from '../block-type/types.js'; +import type { UmbBlockLayoutBaseModel, UmbBlockDataType } from './types.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'; +import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; + +export class UmbBlockManagerContext< + BlockType extends UmbBlockTypeBase = UmbBlockTypeBase, + BlockLayoutType extends UmbBlockLayoutBaseModel = UmbBlockLayoutBaseModel, +> extends UmbContextBase { + // + #blockTypes = new UmbArrayState(>[], (x) => x.contentElementTypeKey); + public readonly blockTypes = this.#blockTypes.asObservable(); + + #layouts = new UmbArrayState(>[], (x) => x.contentUdi); + public readonly layouts = this.#layouts.asObservable(); + + #contents = new UmbArrayState(>[], (x) => x.udi); + public readonly contents = this.#contents.asObservable(); + + #settings = new UmbArrayState(>[], (x) => x.udi); + public readonly settings = this.#settings.asObservable(); + + setBlockTypes(blockTypes: Array) { + this.#blockTypes.next(blockTypes); + } + + setLayouts(layouts: Array) { + this.#layouts.next(layouts); + } + + setContents(contents: Array) { + this.#contents.next(contents); + } + setSettings(settings: Array) { + this.#settings.next(settings); + } + + constructor(host: UmbControllerHost) { + super(host, UMB_BLOCK_MANAGER_CONTEXT_TOKEN); + } + + blockTypeOf(contentElementTypeKey: string) { + return this.#blockTypes.asObservablePart((source) => + source.find((x) => x.contentElementTypeKey === contentElementTypeKey), + ); + } + layoutOf(contentUdi: string) { + 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)); + } + settingsOf(udi: string) { + return this.#settings.asObservablePart((source) => source.find((x) => x.udi === udi)); + } +} + +export const UMB_BLOCK_MANAGER_CONTEXT_TOKEN = new UmbContextToken( + 'UmbBlockManagerContext', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/index.ts new file mode 100644 index 0000000000..37eda73bec --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/index.ts @@ -0,0 +1,2 @@ +export * from './block-manager.context.js'; +export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/types.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/types.ts new file mode 100644 index 0000000000..19bd495128 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/types.ts @@ -0,0 +1,15 @@ +export interface UmbBlockLayoutBaseModel { + contentUdi: string; + settingsUdi?: string; +} + +export interface UmbBlockDataType { + udi: string; + contentTypeKey: string; +} + +export interface UmbBlockValueType { + layout: { [key: string]: Array }; + contentData: Array; + settingsData: Array; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/index.ts index c33c8c30d2..5363d0d197 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/index.ts @@ -1 +1,2 @@ export * from './block-type/index.js'; +export * from './block-manager/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-manager.context.ts index 39dc691543..a18c26fe09 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-manager.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-manager.context.ts @@ -4,7 +4,7 @@ import type { UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; import { UmbBasicState, appendToFrozenArray } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export type UmbModalType = 'dialog' | 'sidebar';