@@ -2,17 +2,12 @@ import { UmbLanguageCollectionRepository } from '../collection/index.js';
2
2
import type { UmbLanguageDetailModel } from '../types.js' ;
3
3
import type { UmbAppLanguageContext } from '../global-contexts/index.js' ;
4
4
import { UMB_APP_LANGUAGE_CONTEXT } from '../constants.js' ;
5
- import type { UUIPopoverContainerElement } from '@umbraco-cms/backoffice/external/uui' ;
6
- import {
7
- css ,
8
- html ,
9
- customElement ,
10
- state ,
11
- repeat ,
12
- ifDefined ,
13
- query ,
14
- nothing ,
15
- } from '@umbraco-cms/backoffice/external/lit' ;
5
+ import type {
6
+ UUIComboboxListElement ,
7
+ UUIComboboxListEvent ,
8
+ UUIPopoverContainerElement ,
9
+ } from '@umbraco-cms/backoffice/external/uui' ;
10
+ import { css , html , customElement , state , repeat , query , nothing } from '@umbraco-cms/backoffice/external/lit' ;
16
11
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element' ;
17
12
import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user' ;
18
13
@@ -98,12 +93,11 @@ export class UmbAppLanguageSelectElement extends UmbLitElement {
98
93
}
99
94
}
100
95
101
- #onPopoverToggle ( event : ToggleEvent ) {
96
+ #onBeforePopoverToggle ( event : ToggleEvent ) {
102
97
// TODO: This ignorer is just neede for JSON SCHEMA TO WORK, As its not updated with latest TS jet.
103
98
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
104
99
// @ts -ignore
105
- this . _isOpen = event . newState === 'open' ;
106
- if ( this . _isOpen && ! this . #languagesObserver) {
100
+ if ( event . newState === 'open' && ! this . #languagesObserver) {
107
101
if ( this . _popoverElement ) {
108
102
const host = this . getBoundingClientRect ( ) ;
109
103
this . _popoverElement . style . width = `${ host . width } px` ;
@@ -113,51 +107,101 @@ export class UmbAppLanguageSelectElement extends UmbLitElement {
113
107
}
114
108
}
115
109
110
+ #onPopoverToggle( event : ToggleEvent ) {
111
+ // TODO: This ignorer is just neede for JSON SCHEMA TO WORK, As its not updated with latest TS jet.
112
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
113
+ // @ts -ignore
114
+ this . _isOpen = event . newState === 'open' ;
115
+ }
116
+
117
+ #onTriggerClick( ) {
118
+ if ( this . _isOpen ) {
119
+ this . _popoverElement ?. hidePopover ( ) ;
120
+ } else {
121
+ this . _popoverElement ?. showPopover ( ) ;
122
+ }
123
+ this . requestUpdate ( ) ;
124
+ }
125
+
126
+ #onTriggerKeydown = ( e : KeyboardEvent ) => {
127
+ if ( e . key === 'ArrowDown' || e . key === 'ArrowUp' ) {
128
+ this . _popoverElement ?. showPopover ( ) ;
129
+ }
130
+ if ( e . key === ' ' ) {
131
+ this . _popoverElement ?. togglePopover ( ) ;
132
+ }
133
+ } ;
134
+
116
135
#chooseLanguage( unique : string ) {
117
136
this . #appLanguageContext?. setLanguage ( unique ) ;
118
- this . _isOpen = false ;
119
137
this . _popoverElement ?. hidePopover ( ) ;
120
138
}
121
139
140
+ #onLanguageSelectionChange( event : UUIComboboxListEvent ) {
141
+ if ( ! this . _isOpen ) return ;
142
+
143
+ const target = event . target as UUIComboboxListElement ;
144
+ const value = target ?. value as string ;
145
+ if ( value ) {
146
+ this . #chooseLanguage( value ) ;
147
+ }
148
+ }
149
+
122
150
override render ( ) {
123
151
return html `${ this . #renderTrigger( ) } ${ this . #renderContent( ) } ` ;
124
152
}
125
153
126
154
#renderTrigger( ) {
127
- return html `<butto n id= "toggle" data-mark = "action:open" popovertarget = "dropdown-popover" >
128
- <span
129
- > ${ this . _appLanguage ?. name }
130
- ${ this . _appLanguageIsReadOnly ? this . #renderReadOnlyTag( this . _appLanguage ?. unique ) : nothing } </ span
131
- >
155
+ return html ` <div
156
+ id= "toggle"
157
+ data-mark = "action:open"
158
+ popovertarget = "dropdown-popover"
159
+ tabindex = "0"
160
+ @click = ${ this . #onTriggerClick}
161
+ @keydown = ${ this . #onTriggerKeydown} >
162
+ <span>
163
+ ${ this . _appLanguage ?. name }
164
+ ${ this . _appLanguageIsReadOnly ? this . #renderReadOnlyTag( this . _appLanguage ?. unique ) : nothing }
165
+ </ span>
132
166
<uui- symbol- expand .open = ${ this . _isOpen } > </ uui- symbol- expand >
133
- </ but to n > ` ;
167
+ </ div > ` ;
134
168
}
135
169
136
170
#renderContent( ) {
137
171
return html ` <uui- popover- container
138
172
id= "dropdown-popover"
139
173
data-mark = "app-language-menu"
140
- @beforetoggle = ${ this . #onPopoverToggle} >
174
+ @beforetoggle = ${ this . #onBeforePopoverToggle}
175
+ @toggle = ${ this . #onPopoverToggle} >
141
176
<umb- popover- layout>
142
177
<uui- scroll- container style= "max-height:calc(100vh - (var(--umb-header-layout-height) + 60px));" >
143
- ${ repeat (
144
- this . _languages ,
145
- ( language ) => language . unique ,
146
- ( language ) => html `
147
- <uui- menu- item
148
- label= ${ ifDefined ( language . name ) }
149
- data- mark= "${ language . entityType } :${ language . unique } "
150
- ?active= ${ language . unique === this . _appLanguage ?. unique }
151
- @click-label = ${ ( ) => this . #chooseLanguage( language . unique ) } >
152
- ${ this . #isLanguageReadOnly( language . unique ) ? this . #renderReadOnlyTag( language . unique ) : nothing }
153
- </ uui- menu- item>
154
- ` ,
155
- ) }
178
+ ${ this . #renderOptions( ) }
156
179
</ uui- scroll- container>
157
180
</ umb- popover- layout>
158
181
</ uui- popover- container> ` ;
159
182
}
160
183
184
+ #renderOptions( ) {
185
+ if ( ! this . _isOpen ) return nothing ;
186
+
187
+ return html `<uui- combobox- lis t
188
+ aria- label= "App language"
189
+ .for = ${ this }
190
+ .value = ${ this . _appLanguage ?. unique || '' }
191
+ @change = ${ this . #onLanguageSelectionChange} >
192
+ ${ repeat (
193
+ this . _languages ,
194
+ ( language ) => language . unique ,
195
+ ( language ) => html `
196
+ <uui- combobox- lis t- option tabindex= "0" value = ${ language . unique } >
197
+ ${ language . name }
198
+ ${ this . #isLanguageReadOnly( language . unique ) ? this . #renderReadOnlyTag( language . unique ) : nothing }
199
+ </ uui- combobox- lis t- option>
200
+ ` ,
201
+ ) }
202
+ </ uui- combobox- lis t> ` ;
203
+ }
204
+
161
205
#isLanguageReadOnly( culture ?: string ) {
162
206
if ( ! culture ) return false ;
163
207
return this . _disallowedLanguages . find ( ( language ) => language . unique === culture ) ? true : false ;
@@ -178,7 +222,6 @@ export class UmbAppLanguageSelectElement extends UmbLitElement {
178
222
179
223
# toggle {
180
224
color : var (--uui-color-text );
181
- width : 100% ;
182
225
text-align : left;
183
226
background : none;
184
227
border : none;
0 commit comments