diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts index 6e1d3d7518..f47ba36f5d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts @@ -3,17 +3,24 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbUserGroupStore, UMB_USER_GROUP_STORE_CONTEXT_TOKEN } from '../../repository/user-group.store'; import type { UserGroupDetails } from '../../types'; -import { UmbModalElementPickerBase } from '@umbraco-cms/internal/modal'; +import { UmbSelectionManagerBase } from '@umbraco-cms/backoffice/utils'; +import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; @customElement('umb-user-group-picker-modal') -export class UmbUserGroupPickerModalElement extends UmbModalElementPickerBase { +export class UmbUserGroupPickerModalElement extends UmbModalBaseElement { @state() private _userGroups: Array = []; private _userGroupStore?: UmbUserGroupStore; + #selectionManager = new UmbSelectionManagerBase(); connectedCallback(): void { super.connectedCallback(); + + // TODO: in theory this config could change during the lifetime of the modal, so we could observe it + this.#selectionManager.setMultiple(this.data?.multiple ?? false); + this.#selectionManager.setSelection(this.data?.selection ?? []); + this.consumeContext(UMB_USER_GROUP_STORE_CONTEXT_TOKEN, (userGroupStore) => { this._userGroupStore = userGroupStore; this._observeUserGroups(); @@ -25,79 +32,42 @@ export class UmbUserGroupPickerModalElement extends UmbModalElementPickerBase (this._userGroups = userGroups)); } + #submit() { + this.modalHandler?.submit({ + selection: this.#selectionManager.getSelection(), + }); + } + + #close() { + this.modalHandler?.reject(); + } + render() { return html` - -
-
- ${this._userGroups.map( - (item) => html` -
this.handleSelection(item.id)} - @keydown=${(e: KeyboardEvent) => this._handleKeydown(e, item.id)} - class=${this.isSelected(item.id) ? 'item selected' : 'item'}> - - ${item.name} -
- ` - )} -
+ ${this._userGroups.map( + (item) => html` + this.#selectionManager.select(item.id!)} + @unselected=${() => this.#selectionManager.deselect(item.id!)} + ?selected=${this.#selectionManager.isSelected(item.id!)}> + + + ` + )}
- - + +
`; } - static styles = [ - UUITextStyles, - css` - uui-input { - width: 100%; - } - hr { - border: none; - border-bottom: 1px solid var(--uui-color-divider); - margin: 16px 0; - } - #item-list { - display: flex; - flex-direction: column; - gap: var(--uui-size-1); - } - .item { - color: var(--uui-color-interactive); - display: grid; - grid-template-columns: var(--uui-size-8) 1fr; - padding: var(--uui-size-4) var(--uui-size-2); - gap: var(--uui-size-space-5); - align-items: center; - border-radius: var(--uui-border-radius); - cursor: pointer; - } - .item.selected { - background-color: var(--uui-color-selected); - color: var(--uui-color-selected-contrast); - } - .item:not(.selected):hover { - background-color: var(--uui-color-surface-emphasis); - color: var(--uui-color-interactive-emphasis); - } - .item.selected:hover { - background-color: var(--uui-color-selected-emphasis); - } - .item uui-icon { - width: 100%; - box-sizing: border-box; - display: flex; - height: fit-content; - } - `, - ]; + static styles = [UUITextStyles, css``]; } export default UmbUserGroupPickerModalElement;