Skip to content

Commit 3e4c9f2

Browse files
authored
fix(ui5-step-input): format value with new locale symbols when language is changed
Fixes: #12334
1 parent f2d95f8 commit 3e4c9f2

3 files changed

Lines changed: 85 additions & 5 deletions

File tree

packages/main/cypress/specs/StepInput.cy.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import StepInput from "../../src/StepInput.js";
2+
import { setLanguage } from "@ui5/webcomponents-base/dist/config/Language.js";
3+
import "../../src/Assets.js";
24

35
const decreaseValue = true;
46

@@ -650,6 +652,44 @@ describe("StepInput thousand separator formatting", () => {
650652
expect(num).to.equal(12345);
651653
});
652654
});
655+
656+
it("should update input value when language is changed", () => {
657+
cy.wrap({ setLanguage })
658+
.then(async ({ setLanguage }) => {
659+
await setLanguage("en");
660+
});
661+
662+
cy.mount(
663+
<StepInput value={10000.56} valuePrecision={2}></StepInput>
664+
);
665+
666+
cy.get("[ui5-step-input]")
667+
.as("stepInput");
668+
cy.get<StepInput>("@stepInput")
669+
.ui5StepInputGetInnerInput()
670+
.should($input => {
671+
const val = $input.val() as string;
672+
expect(val).to.equal("10,000.56");
673+
});
674+
675+
cy.wrap({ setLanguage })
676+
.then(async ({ setLanguage }) => {
677+
await setLanguage("de");
678+
})
679+
.then(() => {
680+
cy.get<StepInput>("@stepInput")
681+
.ui5StepInputGetInnerInput()
682+
.should($input => {
683+
const val = $input.val() as string;
684+
expect(val).to.equal("10.000,56");
685+
});
686+
});
687+
688+
cy.wrap({ setLanguage })
689+
.then(async ({ setLanguage }) => {
690+
await setLanguage("en");
691+
});
692+
});
653693
});
654694

655695
describe("StepInput property propagation", () => {

packages/main/src/StepInput.ts

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import NumberFormat from "@ui5/webcomponents-localization/dist/NumberFormat.js";
4545
import StepInputCss from "./generated/themes/StepInput.css.js";
4646
import getCachedLocaleDataInstance from "@ui5/webcomponents-localization/dist/getCachedLocaleDataInstance.js";
4747
import getLocale from "@ui5/webcomponents-base/dist/locale/getLocale.js";
48+
import { attachLanguageChange, detachLanguageChange } from "@ui5/webcomponents-base/dist/locale/languageChange.js";
4849

4950
// Spin variables
5051
const INITIAL_WAIT_TIMEOUT = 500; // milliseconds
@@ -301,6 +302,10 @@ class StepInput extends UI5Element implements IFormInputElement {
301302

302303
_formatter?: NumberFormat;
303304

305+
_languageChangeHandler?: (lang: string) => Promise<void>;
306+
307+
_languageChanged?: boolean = false;
308+
304309
@i18n("@ui5/webcomponents")
305310
static i18nBundle: I18nBundle;
306311

@@ -363,6 +368,11 @@ class StepInput extends UI5Element implements IFormInputElement {
363368
}
364369

365370
get _displayValue() {
371+
if (this._languageChanged) {
372+
this._languageChanged = false;
373+
this.valueState = ValueState.None; // to reset the value state visual
374+
return this._formatNumber(this.value);
375+
}
366376
// For the cases when there is set value precision but the input value is not with correct precision we don't need to format it
367377
const value = this.input?.value && !this._isValueWithCorrectPrecision ? this.input.value : this._formatNumber(this.value);
368378
if ((this.value === 0) || (Number.isInteger(this.value))) {
@@ -394,6 +404,34 @@ class StepInput extends UI5Element implements IFormInputElement {
394404
onBeforeRendering() {
395405
this._setButtonState();
396406
}
407+
onEnterDOM() {
408+
this._setupLanguageChangeHandler();
409+
}
410+
411+
onExitDOM() {
412+
this._cleanupLanguageChangeHandler();
413+
}
414+
415+
_setupLanguageChangeHandler() {
416+
if (this._languageChangeHandler) {
417+
return;
418+
}
419+
420+
this._languageChangeHandler = () => {
421+
this._formatter = undefined;
422+
this._languageChanged = true;
423+
424+
return Promise.resolve();
425+
};
426+
attachLanguageChange(this._languageChangeHandler);
427+
}
428+
429+
_cleanupLanguageChangeHandler() {
430+
if (this._languageChangeHandler) {
431+
detachLanguageChange(this._languageChangeHandler);
432+
this._languageChangeHandler = undefined;
433+
}
434+
}
397435

398436
get formatter(): NumberFormat {
399437
if (!this._formatter) {
@@ -563,16 +601,15 @@ class StepInput extends UI5Element implements IFormInputElement {
563601
}
564602

565603
get _isValueWithCorrectPrecision() {
604+
const localeData = getCachedLocaleDataInstance(getLocale());
605+
// gets either "." or "," as delimiter which is based on locale, and splits the number by it
606+
const delimiter = localeData.getNumberSymbol("decimal") || ".";
566607
// check if the value will be displayed with correct precision
567608
// _displayValue has special formatting logic
568-
if (this.valuePrecision === 0 && ((this.value === 0) || (Number.isInteger(this.value)))) {
609+
if (this.valuePrecision === 0 && !this.input?.value.includes(delimiter) && ((this.value === 0) || (Number.isInteger(this.value)))) {
569610
// integers and zero will be formatted with toFixed, so thex y're always valid
570611
return true;
571612
}
572-
573-
const localeData = getCachedLocaleDataInstance(getLocale());
574-
// gets either "." or "," as delimiter which is based on locale, and splits the number by it
575-
const delimiter = localeData?.getNumberSymbol("decimal") || ".";
576613
const numberParts = this.input?.value?.split(delimiter);
577614
const decimalPartLength = numberParts?.length > 1 ? numberParts[1].length : 0;
578615

packages/main/src/bundle.common.bootstrap.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ import { getFirstDayOfWeek } from "@ui5/webcomponents-base/dist/config/FormatSet
7070
import { _getRegisteredNames as getIconNames, getIconAccessibleName } from "@ui5/webcomponents-base/dist/asset-registries/Icons.js";
7171
import applyDirection from "@ui5/webcomponents-base/dist/locale/applyDirection.js";
7272
import { attachDirectionChange } from "@ui5/webcomponents-base/dist/locale/directionChange.js";
73+
import { attachLanguageChange, detachLanguageChange } from "@ui5/webcomponents-base/dist/locale/languageChange.js";
7374
import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
7475
import announce from "@ui5/webcomponents-base/dist/util/InvisibleMessage.js";
7576
import { ignoreCustomElements, shouldIgnoreCustomElement } from "@ui5/webcomponents-base/dist/IgnoreCustomElements.js";
@@ -114,6 +115,8 @@ const testAssets = {
114115
getLocaleData,
115116
applyDirection,
116117
attachDirectionChange,
118+
attachLanguageChange,
119+
detachLanguageChange,
117120
ResizeHandler,
118121
addCustomCSS,
119122
attachThemeLoaded,

0 commit comments

Comments
 (0)