Skip to content

Commit 7865138

Browse files
committed
feat: Add AUTO option, no lang is selected and web-eid-app uses language from host
WE2-1110 Signed-off-by: Sven Mitt <[email protected]>
1 parent f5040cc commit 7865138

File tree

2 files changed

+98
-40
lines changed

2 files changed

+98
-40
lines changed

example/src/main/resources/static/js/index.js

Lines changed: 91 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,44 +22,109 @@
2222

2323
"use strict";
2424

25-
const languageUi = {
25+
const NO_LANGUAGE_SELECTED = { lang: "auto", display: "AUTO", name: "Auto" };
26+
27+
const SUPPORTED_LANGUAGES = [
28+
{ lang: "et", display: "ET", name: "Eesti" },
29+
{ lang: "en", display: "EN", name: "English" },
30+
{ lang: "ru", display: "RU", name: "Русский" },
31+
{ lang: "fi", display: "FI", name: "Suomi" },
32+
{ lang: "hr", display: "HR", name: "Hrvatska" },
33+
{ lang: "de", display: "DE", name: "Deutsch" },
34+
{ lang: "fr", display: "FR", name: "Française" },
35+
{ lang: "nl", display: "NL", name: "Nederlands" },
36+
{ lang: "cs", display: "CS", name: "Čeština" },
37+
{ lang: "sk", display: "SK", name: "Slovenština" },
38+
NO_LANGUAGE_SELECTED
39+
];
40+
41+
const languageComponent = {
2642
selectedLang: document.querySelector("#selected-lang"),
2743
languageButton: document.querySelector("#language-button"),
2844
languageMenu: document.querySelector("#language-menu"),
29-
languageOptions: document.querySelectorAll(".language-option")
45+
languageGrid: document.querySelector(".language-grid"),
46+
languageOptions: () => document.querySelectorAll(".language-option")
3047
};
3148

32-
export function setupLanguageSelection(currentLang, onLangChange) {
33-
const selectedOption = Array.from(languageUi.languageOptions)
34-
.find(option => option.dataset.lang === currentLang);
49+
/**
50+
* Reads the `lang` query parameter from the current URL and validates it.
51+
*
52+
* - Returns the language code (e.g. "en", "et") if present and included in SUPPORTED_LANGUAGES.
53+
* - Returns `null` if the parameter is missing, empty, or not in the supported list.
54+
*
55+
* This ensures that only recognized languages are passed to the app. If `null`
56+
* is returned, the Web eID application will fall back to the OS default locale.
57+
*/
58+
export function getValidatedLangFromUrl() {
59+
const lang = new URLSearchParams(window.location.search).get("lang");
60+
if (!lang) {
61+
return null;
62+
}
63+
const normalizedLang = lang.trim().toLowerCase();
64+
const language = SUPPORTED_LANGUAGES.find(lang => lang.lang === normalizedLang);
65+
return language ? language.lang : null;
66+
}
67+
68+
/**
69+
* Creates a language selections in UI component
70+
*
71+
* @param lang Language to be selected in component, example en
72+
* @param onLangChange Action to be executed when language is changed
73+
*/
74+
export function setupLanguageSelection(lang, onLangChange) {
75+
const language = SUPPORTED_LANGUAGES.find(supportedLanguage => supportedLanguage.lang === lang) ?? NO_LANGUAGE_SELECTED;
76+
77+
SUPPORTED_LANGUAGES.forEach(supportedLanguage => {
78+
if (supportedLanguage === NO_LANGUAGE_SELECTED) {
79+
return;
80+
}
81+
82+
const button = document.createElement("button");
83+
button.className = "language-option";
84+
button.textContent = supportedLanguage.name;
85+
86+
if (supportedLanguage === language) {
87+
button.classList.add("selected");
88+
setSelectedLanguage(supportedLanguage);
89+
}
3590

36-
languageUi.selectedLang.textContent = selectedOption ? selectedOption.dataset.display : "EN";
91+
button.addEventListener("click", () => {
92+
languageComponent.languageOptions().forEach(o => o.classList.remove("selected"));
93+
button.classList.add("selected");
3794

38-
languageUi.languageOptions.forEach(option =>
39-
option.classList.toggle('selected', option.dataset.lang === currentLang)
40-
);
95+
setSelectedLanguage(supportedLanguage);
96+
hideLanguageSelectionMenu();
4197

42-
languageUi.languageButton.onclick = e => {
98+
onLangChange(supportedLanguage.lang);
99+
});
100+
101+
languageComponent.languageGrid.appendChild(button);
102+
});
103+
104+
setSelectedLanguage(language);
105+
106+
languageComponent.languageButton.onclick = e => {
43107
e.stopPropagation();
44-
languageUi.languageMenu.classList.toggle('show');
45-
e.target.classList.toggle('active');
108+
showLanguageSelectionMenu();
46109
};
47110

48111
document.onclick = () => {
49-
languageUi.languageMenu.classList.remove('show');
50-
languageUi.languageButton.classList.remove('active');
112+
hideLanguageSelectionMenu();
51113
};
52114

53-
languageUi.languageMenu.onclick = e => e.stopPropagation();
54-
55-
languageUi.languageOptions.forEach(option => {
56-
option.onclick = () => {
57-
onLangChange(option.dataset.lang);
58-
languageUi.selectedLang.textContent = option.dataset.display;
59-
languageUi.languageOptions.forEach(o => o.classList.remove('selected'));
60-
option.classList.add('selected');
61-
languageUi.languageMenu.classList.remove('show');
62-
languageUi.languageButton.classList.remove('active');
63-
};
64-
});
115+
languageComponent.languageMenu.onclick = e => e.stopPropagation();
116+
}
117+
118+
function setSelectedLanguage(supportedLanguage) {
119+
languageComponent.selectedLang.textContent = supportedLanguage.display;
120+
}
121+
122+
function showLanguageSelectionMenu() {
123+
languageComponent.languageMenu.classList.toggle("show");
124+
languageComponent.languageButton.classList.toggle("active");
125+
}
126+
127+
function hideLanguageSelectionMenu() {
128+
languageComponent.languageMenu.classList.remove("show");
129+
languageComponent.languageButton.classList.remove("active");
65130
}

example/src/main/resources/templates/index.html

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -108,16 +108,6 @@ <h3><a id="usage"></a>Usage</h3>
108108
</button>
109109
<div id="language-menu" class="language-menu">
110110
<div class="language-grid">
111-
<button class="language-option" data-lang="et" data-display="ET">Eesti</button>
112-
<button class="language-option" data-lang="en" data-display="EN">English</button>
113-
<button class="language-option" data-lang="ru" data-display="RU">Русский</button>
114-
<button class="language-option" data-lang="fi" data-display="FI">Suomi</button>
115-
<button class="language-option" data-lang="hr" data-display="HR">Hrvatska</button>
116-
<button class="language-option" data-lang="de" data-display="DE">Deutsch</button>
117-
<button class="language-option" data-lang="fr" data-display="FR">Française</button>
118-
<button class="language-option" data-lang="nl" data-display="NL">Nederlands</button>
119-
<button class="language-option" data-lang="cs" data-display="CS">Čeština</button>
120-
<button class="language-option" data-lang="sk" data-display="SK">Slovenština</button>
121111
</div>
122112
</div>
123113
</div>
@@ -276,7 +266,7 @@ <h3><a id="for-developers"></a>For developers</h3>
276266
"use strict";
277267
import * as webeid from "/js/web-eid.js";
278268
import {hideErrorMessage, showErrorMessage, checkHttpError} from "/js/errors.js";
279-
import {setupLanguageSelection} from "/js/index.js";
269+
import {setupLanguageSelection, getValidatedLangFromUrl} from "/js/index.js";
280270

281271
hideErrorMessage();
282272

@@ -285,7 +275,7 @@ <h3><a id="for-developers"></a>For developers</h3>
285275
const csrfToken = document.querySelector('#csrftoken').content;
286276
const csrfHeaderName = document.querySelector('#csrfheadername').content;
287277

288-
let lang = new URLSearchParams(window.location.search).get("lang") || "en";
278+
let lang = getValidatedLangFromUrl();
289279
setupLanguageSelection(lang, changedLang => lang = changedLang);
290280

291281
authButton.addEventListener("click", async () => {
@@ -317,8 +307,11 @@ <h3><a id="for-developers"></a>For developers</h3>
317307

318308
console.log("Authentication successful! Result:", authTokenResult);
319309

320-
window.location.href = "/welcome?lang=" + lang;
321-
310+
const welcomePageUrl = new URL("/welcome", window.location.origin);
311+
if (lang) {
312+
welcomePageUrl.searchParams.set("lang", lang);
313+
}
314+
window.location.href = welcomePageUrl.toString();
322315
} catch (error) {
323316
showErrorMessage(error);
324317
throw error;

0 commit comments

Comments
 (0)