diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/app-language-select/app-language-select.element.ts b/src/Umbraco.Web.UI.Client/src/packages/language/app-language-select/app-language-select.element.ts index 91acaa5cdb75..6ea183dae178 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/app-language-select/app-language-select.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/app-language-select/app-language-select.element.ts @@ -2,17 +2,12 @@ import { UmbLanguageCollectionRepository } from '../collection/index.js'; import type { UmbLanguageDetailModel } from '../types.js'; import type { UmbAppLanguageContext } from '../global-contexts/index.js'; import { UMB_APP_LANGUAGE_CONTEXT } from '../constants.js'; -import type { UUIPopoverContainerElement } from '@umbraco-cms/backoffice/external/uui'; -import { - css, - html, - customElement, - state, - repeat, - ifDefined, - query, - nothing, -} from '@umbraco-cms/backoffice/external/lit'; +import type { + UUIComboboxListElement, + UUIComboboxListEvent, + UUIPopoverContainerElement, +} from '@umbraco-cms/backoffice/external/uui'; +import { css, html, customElement, state, repeat, query, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; @@ -98,12 +93,11 @@ export class UmbAppLanguageSelectElement extends UmbLitElement { } } - #onPopoverToggle(event: ToggleEvent) { + #onBeforePopoverToggle(event: ToggleEvent) { // TODO: This ignorer is just neede for JSON SCHEMA TO WORK, As its not updated with latest TS jet. // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - this._isOpen = event.newState === 'open'; - if (this._isOpen && !this.#languagesObserver) { + if (event.newState === 'open' && !this.#languagesObserver) { if (this._popoverElement) { const host = this.getBoundingClientRect(); this._popoverElement.style.width = `${host.width}px`; @@ -113,51 +107,101 @@ export class UmbAppLanguageSelectElement extends UmbLitElement { } } + #onPopoverToggle(event: ToggleEvent) { + // TODO: This ignorer is just neede for JSON SCHEMA TO WORK, As its not updated with latest TS jet. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this._isOpen = event.newState === 'open'; + } + + #onTriggerClick() { + if (this._isOpen) { + this._popoverElement?.hidePopover(); + } else { + this._popoverElement?.showPopover(); + } + this.requestUpdate(); + } + + #onTriggerKeydown = (e: KeyboardEvent) => { + if (e.key === 'ArrowDown' || e.key === 'ArrowUp') { + this._popoverElement?.showPopover(); + } + if (e.key === ' ') { + this._popoverElement?.togglePopover(); + } + }; + #chooseLanguage(unique: string) { this.#appLanguageContext?.setLanguage(unique); - this._isOpen = false; this._popoverElement?.hidePopover(); } + #onLanguageSelectionChange(event: UUIComboboxListEvent) { + if (!this._isOpen) return; + + const target = event.target as UUIComboboxListElement; + const value = target?.value as string; + if (value) { + this.#chooseLanguage(value); + } + } + override render() { return html`${this.#renderTrigger()} ${this.#renderContent()}`; } #renderTrigger() { - return html``; + `; } #renderContent() { return html` + @beforetoggle=${this.#onBeforePopoverToggle} + @toggle=${this.#onPopoverToggle}> - ${repeat( - this._languages, - (language) => language.unique, - (language) => html` - this.#chooseLanguage(language.unique)}> - ${this.#isLanguageReadOnly(language.unique) ? this.#renderReadOnlyTag(language.unique) : nothing} - - `, - )} + ${this.#renderOptions()} `; } + #renderOptions() { + if (!this._isOpen) return nothing; + + return html` + ${repeat( + this._languages, + (language) => language.unique, + (language) => html` + + ${language.name} + ${this.#isLanguageReadOnly(language.unique) ? this.#renderReadOnlyTag(language.unique) : nothing} + + `, + )} + `; + } + #isLanguageReadOnly(culture?: string) { if (!culture) return false; return this._disallowedLanguages.find((language) => language.unique === culture) ? true : false; @@ -178,7 +222,6 @@ export class UmbAppLanguageSelectElement extends UmbLitElement { #toggle { color: var(--uui-color-text); - width: 100%; text-align: left; background: none; border: none;