Skip to content

Commit bf1f645

Browse files
KKoukioumarusak
authored andcommitted
shell: use pf4 Menu component for the display language list
This component now also offers search functionality.
1 parent b39f08c commit bf1f645

File tree

4 files changed

+56
-16
lines changed

4 files changed

+56
-16
lines changed

pkg/shell/shell-modals.jsx

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@
1919

2020
import cockpit from "cockpit";
2121
import React from "react";
22-
import { Button, Modal } from '@patternfly/react-core';
22+
import {
23+
Button,
24+
Divider,
25+
Menu, MenuList, MenuItem, MenuContent, MenuInput,
26+
Modal,
27+
TextInput,
28+
} from '@patternfly/react-core';
2329

2430
import "form-layout.scss";
2531

@@ -80,19 +86,39 @@ export class LangModal extends React.Component {
8086
return (
8187
<Modal isOpen position="top" variant="medium"
8288
id="display-language-modal"
89+
className="display-language-modal"
8390
onClose={this.props.onClose}
8491
title={_("Display language")}
8592
footer={<>
8693
<Button variant='primary' onClick={this.onSelect}>{_("Select")}</Button>
8794
<Button variant='link' onClick={this.props.onClose}>{_("Cancel")}</Button>
8895
</>}
8996
>
90-
<p translate="yes">Choose the language to be used in the application</p>
91-
<select id="display-language-list" size="5" data-role="none" defaultValue={this.state.selected} onChange={e => this.setState({ selected: e.target.value })}>
92-
{Object.keys(manifest.locales || { }).map(key => {
93-
return <option key={key} value={key}>{manifest.locales[key]}</option>;
94-
})}
95-
</select>
97+
<p>{_("Choose the language to be used in the application")}</p>
98+
<Menu id="display-language-list"
99+
onSelect={(_, selected) => this.setState({ selected })}
100+
activeItemId={this.state.selected}
101+
selected={this.state.selected}>
102+
<MenuInput>
103+
<TextInput
104+
value={this.state.searchInput}
105+
aria-label={_("Filter menu items")}
106+
iconVariant="search"
107+
type="search"
108+
onChange={searchInput => this.setState({ searchInput })}
109+
/>
110+
</MenuInput>
111+
<Divider />
112+
<MenuContent>
113+
<MenuList>
114+
{Object.keys(manifest.locales || { })
115+
.filter(key => !this.state.searchInput || manifest.locales[key].toLowerCase().includes(this.state.searchInput.toString().toLowerCase()))
116+
.map(key => {
117+
return <MenuItem itemId={key} key={key} data-value={key}>{manifest.locales[key]}</MenuItem>;
118+
})}
119+
</MenuList>
120+
</MenuContent>
121+
</Menu>
96122
</Modal>);
97123
}
98124
}

pkg/shell/shell.scss

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,16 @@ html.index-page body {
121121
font-weight: bold;
122122
}
123123

124-
#display-language-list {
125-
width: 100%;
124+
.display-language-modal {
125+
/* Do not let the language menu expand to the end of the page */
126+
.pf-c-menu__content {
127+
max-height: 20rem;
128+
overflow: auto;
129+
}
126130
}
127131

128-
#display-language-list option {
129-
padding: 10px;
132+
#display-language-list {
133+
margin-bottom: var(--pf-global--spacer--sm);
130134
}
131135

132136
iframe.container-frame {

test/verify/check-apps

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,10 @@ class TestApps(PackageCase):
178178
b.click("#display-language-select-button")
179179
else:
180180
b.wait_visible('#display-language-modal')
181-
b.set_val("#display-language-modal select", lang)
181+
if m.image in ["rhel-8-5-distropkg"]:
182+
b.set_val("#display-language-modal select", lang)
183+
else:
184+
b.click('#display-language-modal li[data-value=%s] button' % lang)
182185
b.click("#display-language-modal footer button.pf-m-primary")
183186
b.expect_load()
184187
# HACK: work around language switching in Chrome not working in current session (issue #8160)

test/verify/check-pages

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ OnCalendar=daily
165165
# Lets try changing the language
166166

167167
self.open_lang_modal()
168-
b.set_val("#display-language-modal select", "de-de")
168+
b.click('#display-language-modal li[data-value=de-de] button')
169169
b.click("#display-language-modal footer button.pf-m-primary")
170170
b.expect_load()
171171
if b.cdp.browser in ["chrome", "chromium"]:
@@ -266,7 +266,7 @@ OnCalendar=daily
266266
b.enter_page("/system")
267267

268268
self.open_lang_modal()
269-
b.set_val("#display-language-modal select", language)
269+
b.click("#display-language-modal li[data-value=%s] button" % language)
270270
b.click("#display-language-modal footer button.pf-m-primary")
271271
b.expect_load()
272272
if b.cdp.browser in ["chrome", "chromium"]:
@@ -318,7 +318,7 @@ OnCalendar=daily
318318
self.login_and_go('/system')
319319
b.wait_visible('#overview')
320320
self.open_lang_modal()
321-
b.set_val('#display-language-modal select', 'pt-br')
321+
b.click('#display-language-modal li[data-value=pt-br] button')
322322
b.click('#display-language-modal footer button.pf-m-primary')
323323
b.expect_load()
324324
if b.cdp.browser in ["chrome", "chromium"]:
@@ -511,7 +511,14 @@ OnCalendar=daily
511511

512512
# Search internationalized menu
513513
self.open_lang_modal()
514-
b.set_val("#display-language-modal select", "de-de")
514+
515+
# Filter the available languages
516+
b.set_input_text('#display-language-modal input[type=search]', "Deutsch")
517+
b.click('#display-language-modal li[data-value=de-de] button')
518+
b.wait_js_func("ph_count_check", "#display-language-modal li", 1)
519+
b.set_input_text('#display-language-modal input[type=search]', "")
520+
521+
b.click('#display-language-modal li[data-value=de-de] button')
515522
b.click("#display-language-modal footer button.pf-m-primary")
516523
b.expect_load()
517524
if b.cdp.browser in ["chrome", "chromium"]:

0 commit comments

Comments
 (0)