diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.element.ts index 7d1f356ac4..b52be82f13 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.element.ts @@ -1,55 +1,52 @@ import { css, html, nothing, repeat, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import type { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-input-radio-button-list') export class UmbInputRadioButtonListElement extends FormControlMixin(UmbLitElement) { - /** - * List of items. - */ - @property({ attribute: false }) - public list: Array<{ key: string; sortOrder: number; value: string }> = []; - - #selected = ''; - public set selected(key: string) { - this.#selected = key; - super.value = key; - } - public get selected(): string { - return this.#selected; - } + #value: string = ''; @property() - public set value(key: string) { - if (key !== this._value) { - this.selected = key; - } + public set value(value: string) { + this.#value = value; } public get value(): string { - return this.selected; + return this.#value; } + @property({ type: Array }) + public list: Array<{ label: string; value: string }> = []; + protected getFormElement() { return undefined; } - #setSelection(e: UUIBooleanInputEvent) { - e.stopPropagation(); - if (e.target.value) this.selected = e.target.value; - this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); + #onChange(event: UUIBooleanInputEvent) { + event.stopPropagation(); + + this.value = event.target.value; + + this.dispatchEvent(new UmbChangeEvent()); } render() { if (!this.list) return nothing; - return html` - ${repeat(this.list, (item) => item, this.renderRadioButton)} - `; + return html` + + ${repeat( + this.list, + (item) => item, + (item) => this.#renderRadioButton(item), + )} + + `; } - renderRadioButton(item: { key: string; sortOrder: number; value: string }) { - return html``; + #renderRadioButton(item: (typeof this.list)[0]) { + return html``; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.stories.ts index be6c9cefc8..435af7254d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.stories.ts @@ -13,21 +13,9 @@ type Story = StoryObj; export const Overview: Story = { args: { list: [ - { - key: '1', - sortOrder: 0, - value: 'One', - }, - { - key: '2', - sortOrder: 1, - value: 'Two', - }, - { - key: '3', - sortOrder: 2, - value: 'Three', - }, + { label: 'One', value: '1' }, + { label: 'Two', value: '2' }, + { label: 'Three', value: '3' }, ], }, }; @@ -35,45 +23,20 @@ export const Overview: Story = { export const WithSelectedValue: Story = { args: { list: [ - { - key: '1', - sortOrder: 0, - value: 'One', - }, - { - key: '2', - sortOrder: 1, - value: 'Two', - }, - { - key: '3', - sortOrder: 2, - value: 'Three', - }, + { label: 'One', value: '1' }, + { label: 'Two', value: '2' }, + { label: 'Three', value: '3' }, ], - selected: '2', - value: 'Two', + value: '2', }, }; export const SortOrder: Story = { args: { list: [ - { - key: '1', - sortOrder: 4, - value: 'One', - }, - { - key: '2', - sortOrder: 1, - value: 'Two', - }, - { - key: '3', - sortOrder: 2, - value: 'Three', - }, + { label: 'One', value: '1' }, + { label: 'Two', value: '2' }, + { label: 'Three', value: '3' }, ], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/radio-button-list/property-editor-ui-radio-button-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/radio-button-list/property-editor-ui-radio-button-list.element.ts index cfc798da13..e5f2f00257 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/radio-button-list/property-editor-ui-radio-button-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/radio-button-list/property-editor-ui-radio-button-list.element.ts @@ -1,59 +1,39 @@ import type { UmbInputRadioButtonListElement } from '../../../components/input-radio-button-list/input-radio-button-list.element.js'; -import '../../../components/input-radio-button-list/input-radio-button-list.element.js'; import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbPropertyValueChangeEvent } from '@umbraco-cms/backoffice/property-editor'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +import '../../../components/input-radio-button-list/input-radio-button-list.element.js'; /** * @element umb-property-editor-ui-radio-button-list */ @customElement('umb-property-editor-ui-radio-button-list') export class UmbPropertyEditorUIRadioButtonListElement extends UmbLitElement implements UmbPropertyEditorUiElement { - #value = ''; - @property({ type: String }) - public set value(value: string | undefined) { - this.#value = value?.trim() || ''; - } - public get value(): string { - return this.#value; - } + @property() + value?: string = ''; public set config(config: UmbPropertyEditorConfigCollection | undefined) { - if (!config) return; - const listData: Record | undefined = config.getValueByAlias('items'); - - if (!listData) return; - - // formatting the items in the dictionary into an array - const sortedItems = []; - const values = Object.values<{ value: string; sortOrder: number }>(listData); - const keys = Object.keys(listData); - for (let i = 0; i < values.length; i++) { - sortedItems.push({ key: keys[i], sortOrder: values[i].sortOrder, value: values[i].value }); - } - - // ensure the items are sorted by the provided sort order - sortedItems.sort((a, b) => { - return a.sortOrder > b.sortOrder ? 1 : b.sortOrder > a.sortOrder ? -1 : 0; - }); - - this._list = sortedItems; + const listData: string[] | undefined = config?.getValueByAlias('items'); + this._list = listData?.map((item) => ({ label: item, value: item })) ?? []; } @state() - private _list: Array<{ key: string; sortOrder: number; value: string }> = []; + private _list: UmbInputRadioButtonListElement['list'] = []; #onChange(event: CustomEvent) { - this.value = (event.target as UmbInputRadioButtonListElement).selected; - this.dispatchEvent(new CustomEvent('property-value-change')); + const element = event.target as UmbInputRadioButtonListElement; + this.value = element.value; + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { return html``; + .list=${this._list} + .value=${this.value ?? ''} + @change=${this.#onChange}>`; } }