diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts new file mode 100644 index 0000000000..893a1f9797 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts @@ -0,0 +1,80 @@ +import { css, html, customElement, repeat, nothing, when } from '@umbraco-cms/backoffice/external/lit'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbItemPickerModalData, UmbItemPickerModel } from '@umbraco-cms/backoffice/modal'; + +@customElement('umb-item-picker-modal') +export class UmbItemPickerModalElement extends UmbModalBaseElement { + #close() { + this.modalContext?.reject(); + } + + #submit(item: UmbItemPickerModel) { + this.modalContext?.setValue(item); + this.modalContext?.submit(); + } + + render() { + if (!this.data) return nothing; + const items = this.data.items; + return html` + +
+ ${when( + items.length, + () => html` + + ${repeat( + items, + (item) => item.value, + (item) => html` + this.#submit(item)} look="placeholder" label="${item.label}"> +

${item.label}

+

${item.description}

+
+ `, + )} +
+ `, + () => html`

There are no items to select.

`, + )} +
+
+ +
+
+ `; + } + + static styles = [ + UmbTextStyles, + css` + uui-box > uui-button { + display: block; + --uui-button-content-align: flex-start; + } + + uui-box > uui-button:not(:last-of-type) { + margin-bottom: var(--uui-size-space-5); + } + + h4 { + text-align: left; + margin: 0.5rem 0; + } + + p { + text-align: left; + margin: 0 0 0.5rem 0; + } + `, + ]; +} + +export default UmbItemPickerModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-item-picker-modal': UmbItemPickerModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts index 6635895244..5af2132b69 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts @@ -37,6 +37,12 @@ const modals: Array = [ name: 'Embedded Media Modal', js: () => import('./embedded-media/embedded-media-modal.element.js'), }, + { + type: 'modal', + alias: 'Umb.Modal.ItemPicker', + name: 'Item Picker Modal', + element: () => import('./item-picker/item-picker-modal.element.js'), + }, ]; export const manifests = [...modals]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts index ad9c8dc47e..f6a1399b9d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts @@ -6,6 +6,7 @@ export * from './embedded-media-modal.token.js'; export * from './entity-user-permission-settings-modal.token.js'; export * from './examine-fields-settings-modal.token.js'; export * from './icon-picker-modal.token.js'; +export * from './item-picker-modal.token.js'; export * from './link-picker-modal.token.js'; export * from './media-tree-picker-modal.token.js'; export * from './media-type-picker-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/item-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/item-picker-modal.token.ts new file mode 100644 index 0000000000..c55a63cb8f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/item-picker-modal.token.ts @@ -0,0 +1,22 @@ +import { UmbModalToken } from './modal-token.js'; + +export type UmbItemPickerModalData = { + headline: string; + items: Array; +}; + +export type UmbItemPickerModel = { + label: string; + description?: string; + value: string; +}; + +export const UMB_ITEM_PICKER_MODAL = new UmbModalToken( + 'Umb.Modal.ItemPicker', + { + modal: { + type: 'sidebar', + size: 'small', + }, + }, +);