Skip to content

Commit f1542d5

Browse files
committed
shell: Rewrite language selector into react and PF4
1 parent da08084 commit f1542d5

File tree

6 files changed

+88
-77
lines changed

6 files changed

+88
-77
lines changed

pkg/shell/base_index.js

Lines changed: 16 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@
1919

2020
import $ from "jquery";
2121
import cockpit from "cockpit";
22+
import React from "react";
23+
import ReactDOM from "react-dom";
24+
2225
import { showDialog } from "./active-pages";
26+
import { LangModal } from "./shell-modals.jsx";
2327

2428
var shell_embedded = window.location.pathname.indexOf(".html") !== -1;
2529
const _ = cockpit.gettext;
@@ -486,7 +490,7 @@ function Router(index) {
486490
* As a convenience, common menu items can be setup by adding the
487491
* selector to be used to hook them up. The accepted selectors
488492
* are.
489-
* oops_sel, logout_sel, language_sel
493+
* oops_sel, logout_sel
490494
*
491495
* Emits "disconnect" and "expect_restart" signals, that should be
492496
* handled by the caller.
@@ -818,44 +822,6 @@ function Index() {
818822
});
819823
}
820824

821-
/* Display language dialog */
822-
function setup_language(id) {
823-
/*
824-
* Note that we don't go ahead and load all the po files in order
825-
* to produce this list. Perhaps we would include it somewhere in a
826-
* separate automatically generated file. Need to see.
827-
*/
828-
var manifest = cockpit.manifests.shell || { };
829-
$(".display-language-menu").toggle(!!manifest.locales);
830-
var language = document.cookie.replace(/(?:(?:^|.*;\s*)CockpitLang\s*=\s*([^;]*).*$)|^.*$/, "$1");
831-
if (!language)
832-
language = "en-us";
833-
834-
$('html').attr('lang', language);
835-
836-
$.each(manifest.locales || { }, function(code, name) {
837-
var el = $("<option>").text(name)
838-
.val(code);
839-
if (code == language)
840-
el.attr("selected", "true");
841-
$("#display-language-list").append(el);
842-
});
843-
844-
$("#display-language-select-button").on("click", function(event) {
845-
var code_to_select = $("#display-language-list").val();
846-
var cookie = "CockpitLang=" + encodeURIComponent(code_to_select) +
847-
"; path=/; expires=Sun, 16 Jul 3567 06:23:41 GMT";
848-
document.cookie = cookie;
849-
window.localStorage.setItem("cockpit.lang", code_to_select);
850-
window.location.reload(true);
851-
return false;
852-
});
853-
854-
$(id).on("shown.bs.modal", function() {
855-
$("display-language-list").focus();
856-
});
857-
}
858-
859825
function setup_killer(id) {
860826
$(id).on("click", function(ev) {
861827
if (ev && ev.button === 0)
@@ -869,11 +835,19 @@ function Index() {
869835
if (self.logout_sel)
870836
setup_logout(self.logout_sel);
871837

872-
if (self.language_sel)
873-
setup_language(self.language_sel);
874-
875838
if (self.killer_sel)
876839
setup_killer(self.killer_sel);
840+
841+
const manifest = cockpit.manifests.shell || { };
842+
$(".display-language-menu").toggle(!!manifest.locales);
843+
844+
$("#open-display-language").click(() => {
845+
ReactDOM.render(React.createElement(LangModal, {
846+
onClose: () =>
847+
ReactDOM.unmountComponentAtNode(document.getElementById('display-language'))
848+
}),
849+
document.getElementById('display-language'));
850+
});
877851
}
878852

879853
function CompiledComponents() {

pkg/shell/index.html

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
<li id="super-user-indicator-mobile" class="mobile_v"></li>
7070
<li class="divider mobile_v"></li>
7171
<li class="display-language-menu">
72-
<a role="link" tabindex="0" data-toggle="modal" data-target="#display-language" translate="yes">Display language</a>
72+
<a role="link" tabindex="0" translate="yes" id="open-display-language">Display language</a>
7373
</li>
7474
<li class="divider display-language-menu"></li>
7575
<li>
@@ -104,24 +104,7 @@
104104
</div>
105105
</div>
106106

107-
<div class="modal" id="display-language" tabindex="-1" role="dialog" data-backdrop="static">
108-
<div class="modal-dialog">
109-
<div class="modal-content">
110-
<div class="modal-header">
111-
<h4 class="modal-title" translate="yes">Display language</h4>
112-
</div>
113-
<div class="modal-body">
114-
<p translate="yes">Choose the language to be used in the application</p>
115-
<select id="display-language-list" size="5" data-role="none">
116-
</select>
117-
</div>
118-
<div class="modal-footer">
119-
<button class="pf-c-button pf-m-primary" id="display-language-select-button" translate="yes">Select</button>
120-
<button class="pf-c-button pf-m-link" data-dismiss="modal" translate="yes">Cancel</button>
121-
</div>
122-
</div>
123-
</div>
124-
</div>
107+
<div id="display-language"></div>
125108

126109
<div class="modal" id="session-timeout-dialog" tabindex="-1" role="dialog" data-backdrop="static">
127110
<div class="modal-dialog">

pkg/shell/index.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ document.addEventListener("click", function(ev) {
4545
var options = {
4646
logout_sel: "#go-logout",
4747
oops_sel: "#navbar-oops",
48-
language_sel: "#display-language",
4948
killer_sel: "#active-pages",
5049
default_title: "Cockpit",
5150
};

pkg/shell/shell-modals.jsx

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,53 @@ export function AboutModal(props) {
4646
</div>
4747
</Modal>);
4848
}
49+
50+
export class LangModal extends React.Component {
51+
constructor(props) {
52+
super();
53+
54+
let language = document.cookie.replace(/(?:(?:^|.*;\s*)CockpitLang\s*=\s*([^;]*).*$)|^.*$/, "$1");
55+
if (!language)
56+
language = "en-us";
57+
58+
this.state = {
59+
selected: language,
60+
};
61+
62+
this.onSelect = this.onSelect.bind(this);
63+
}
64+
65+
onSelect() {
66+
const lang = this.state.selected;
67+
68+
if (!lang)
69+
return;
70+
71+
const cookie = "CockpitLang=" + encodeURIComponent(lang) + "; path=/; expires=Sun, 16 Jul 3567 06:23:41 GMT";
72+
document.cookie = cookie;
73+
window.localStorage.setItem("cockpit.lang", lang);
74+
window.location.reload(true);
75+
}
76+
77+
render() {
78+
const manifest = cockpit.manifests.shell || { };
79+
80+
return (
81+
<Modal isOpen position="top" variant="medium"
82+
id="display-language-modal"
83+
onClose={this.props.onClose}
84+
title={_("Display language")}
85+
footer={<>
86+
<Button variant='primary' onClick={this.onSelect}>{_("Select")}</Button>
87+
<Button variant='link' onClick={this.props.onClose}>{_("Cancel")}</Button>
88+
</>}
89+
>
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>
96+
</Modal>);
97+
}
98+
}

test/verify/check-apps

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,14 @@ class TestApps(PackageCase):
164164
b.switch_to_top()
165165
b.click("#navbar-dropdown")
166166
b.click(".display-language-menu a")
167-
b.wait_popup('display-language')
168-
b.set_val("#display-language select", lang)
169-
b.click("#display-language-select-button")
167+
if m.image == "rhel-8-3-distropkg": # Changed in #14890
168+
b.wait_popup('display-language')
169+
b.set_val("#display-language select", lang)
170+
b.click("#display-language-select-button")
171+
else:
172+
b.wait_visible('#display-language-modal')
173+
b.set_val("#display-language-modal select", lang)
174+
b.click("#display-language-modal footer button.pf-m-primary")
170175
b.expect_load()
171176
# HACK: work around language switching in Chrome not working in current session (issue #8160)
172177
b.reload(ignore_cache=True)
@@ -177,7 +182,7 @@ class TestApps(PackageCase):
177182
b.wait_present(".app-description:contains('DESCRIPTION:de')")
178183
b.wait_not_present(".app-description:contains('DESCRIPTION:none')")
179184

180-
set_lang("ja-ja")
185+
set_lang("ja-jp")
181186
b.wait_present(".app-description:contains('DESCRIPTION:none')")
182187
b.wait_not_present(".app-description:contains('DESCRIPTION:de')")
183188

test/verify/check-pages

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class TestPages(MachineCase):
5151
self.browser.click("#navbar-dropdown")
5252

5353
self.browser.click(".display-language-menu a")
54-
self.browser.wait_popup('display-language')
54+
self.browser.wait_visible('#display-language-modal')
5555

5656

5757
def testBasic(self):
@@ -166,8 +166,8 @@ OnCalendar=daily
166166
# Lets try changing the language
167167

168168
self.open_lang_modal()
169-
b.set_val("#display-language select", "de-de")
170-
b.click("#display-language-select-button")
169+
b.set_val("#display-language-modal select", "de-de")
170+
b.click("#display-language-modal footer button.pf-m-primary")
171171
b.expect_load()
172172
if b.cdp.browser in ["chrome", "chromium"]:
173173
# HACK: work around language switching in Chrome not working in current session (issue #8160)
@@ -249,16 +249,16 @@ OnCalendar=daily
249249
b.wait_present('#overview')
250250

251251
self.open_lang_modal()
252-
languages = b.eval_js("ph_select('#display-language-list option').map(function(e) { return e.value })")
253-
b.click("#display-language button[data-dismiss]") # Close the menu
252+
languages = b.eval_js("ph_select('#display-language-modal-list option').map(function(e) { return e.value })")
253+
b.click("#display-language-modal footer button.pf-m-link") # Close the menu
254254

255255
for language in languages:
256256
b.go("/system")
257257
b.enter_page("/system")
258258

259259
self.open_lang_modal()
260-
b.set_val("#display-language select", language)
261-
b.click("#display-language-select-button")
260+
b.set_val("#display-language-modal select", language)
261+
b.click("#display-language-modal footer button.pf-m-primary")
262262
b.expect_load()
263263
if b.cdp.browser in ["chrome", "chromium"]:
264264
# HACK: work around language switching in Chrome not working in current session (issue #8160)
@@ -308,8 +308,8 @@ OnCalendar=daily
308308
self.login_and_go('/system')
309309
b.wait_present('#overview')
310310
self.open_lang_modal()
311-
b.set_val('#display-language select', 'pt-br')
312-
b.click('#display-language-select-button')
311+
b.set_val('#display-language-modal select', 'pt-br')
312+
b.click('#display-language-modal footer button.pf-m-primary')
313313
b.expect_load()
314314
if b.cdp.browser in ["chrome", "chromium"]:
315315
# HACK: work around language switching in Chrome not working in current session (issue #8160)
@@ -501,8 +501,8 @@ OnCalendar=daily
501501

502502
# Search internationalized menu
503503
self.open_lang_modal()
504-
b.set_val("#display-language select", "de-de")
505-
b.click("#display-language-select-button")
504+
b.set_val("#display-language-modal select", "de-de")
505+
b.click("#display-language-modal footer button.pf-m-primary")
506506
b.expect_load()
507507
if b.cdp.browser in ["chrome", "chromium"]:
508508
# HACK: work around language switching in Chrome not working in current session (issue #8160)

0 commit comments

Comments
 (0)