Skip to content

Commit 660ceed

Browse files
josercarcamobenelan
andcommitted
fix(input-number): allow editing of numbers that start with zeros (#11705)
**Related Issue:** #9611 ## Summary Allows editing of numbers that start with zeros --------- Co-authored-by: Ben Elan <[email protected]>
1 parent 9e547aa commit 660ceed

File tree

3 files changed

+104
-6
lines changed

3 files changed

+104
-6
lines changed

packages/calcite-components/src/components/input-number/input-number.e2e.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1490,6 +1490,86 @@ describe("calcite-input-number", () => {
14901490
expect(await input.getProperty("value")).toBe(numberStringFormatter.localize(initialValue));
14911491
});
14921492

1493+
it("allows editing numbers that start with zeros and have a group separator and minus sign", async () => {
1494+
const page = await newE2EPage();
1495+
await page.setContent(html`<calcite-input-number group-separator></calcite-input-number>`);
1496+
1497+
const calciteInput = await page.find("calcite-input-number");
1498+
const input = await page.find("calcite-input-number >>> input");
1499+
await calciteInput.callMethod("setFocus");
1500+
await page.waitForChanges();
1501+
await typeNumberValue(page, "-7000");
1502+
await page.waitForChanges();
1503+
expect(await calciteInput.getProperty("value")).toBe("-7000");
1504+
expect(await input.getProperty("value")).toBe("-7,000");
1505+
1506+
await page.keyboard.press("ArrowLeft");
1507+
await page.keyboard.press("ArrowLeft");
1508+
await page.keyboard.press("ArrowLeft");
1509+
await page.keyboard.press("ArrowLeft");
1510+
await page.keyboard.press("Backspace");
1511+
await page.waitForChanges();
1512+
expect(await calciteInput.getProperty("value")).toBe("-0");
1513+
expect(await input.getProperty("value")).toBe("-000");
1514+
1515+
await page.keyboard.press("Home");
1516+
await page.keyboard.press("ArrowRight");
1517+
await page.keyboard.type("5");
1518+
await page.waitForChanges();
1519+
expect(await calciteInput.getProperty("value")).toBe("-5000");
1520+
expect(await input.getProperty("value")).toBe("-5,000");
1521+
1522+
await page.keyboard.press("Home");
1523+
await page.keyboard.press("ArrowRight");
1524+
await page.keyboard.press("ArrowRight");
1525+
await page.keyboard.press("Backspace");
1526+
await page.keyboard.press("Home");
1527+
await page.keyboard.press("ArrowRight");
1528+
await page.keyboard.type("7");
1529+
await page.waitForChanges();
1530+
expect(await calciteInput.getProperty("value")).toBe("-7000");
1531+
expect(await input.getProperty("value")).toBe("-7,000");
1532+
});
1533+
1534+
it("allows editing numbers that start with zeros and have decimals in the ar locale and arab numbering system", async () => {
1535+
const initialValue = "10000.0001";
1536+
numberStringFormatter.numberFormatOptions = {
1537+
locale: "ar",
1538+
numberingSystem: "arab",
1539+
useGrouping: false,
1540+
};
1541+
1542+
const page = await newE2EPage();
1543+
await page.setContent(
1544+
html`<calcite-input-number lang="ar" numbering-system="arab" value="${initialValue}"></calcite-input-number>`,
1545+
);
1546+
1547+
const calciteInput = await page.find("calcite-input-number");
1548+
const input = await page.find("calcite-input-number >>> input");
1549+
await calciteInput.callMethod("setFocus");
1550+
await page.waitForChanges();
1551+
1552+
expect(await calciteInput.getProperty("value")).toBe(initialValue);
1553+
expect(await input.getProperty("value")).toBe(numberStringFormatter.localize(initialValue));
1554+
1555+
await page.keyboard.press("Home");
1556+
await page.keyboard.press("Delete");
1557+
await page.waitForChanges();
1558+
1559+
expect(await calciteInput.getProperty("value")).toBe("0.0001");
1560+
expect(await input.getProperty("value")).toBe(
1561+
// the localize method converts the string to a number, which removes the leading zeros
1562+
// so we need to manually add them back in the test when confirming the expected value
1563+
`${numberStringFormatter.localize("0").repeat(3)}${numberStringFormatter.localize("0.0001")}`,
1564+
);
1565+
1566+
await typeNumberValue(page, "2");
1567+
await page.waitForChanges();
1568+
1569+
expect(await calciteInput.getProperty("value")).toBe("20000.0001");
1570+
expect(await input.getProperty("value")).toBe(numberStringFormatter.localize("20000.0001"));
1571+
});
1572+
14931573
it("cannot be modified when readOnly is true", async () => {
14941574
const page = await newE2EPage();
14951575
await page.setContent(html`<calcite-input-number read-only value="123" clearable></calcite-input-number>`);

packages/calcite-components/src/components/input-number/input-number.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,9 @@ export class InputNumber
823823
const hasTrailingDecimalSeparator =
824824
valueHandleInteger.charAt(valueHandleInteger.length - 1) === ".";
825825

826+
const hasLeadingMinusSign = valueHandleInteger.charAt(0) === "-";
827+
const hasLeadingZeros = valueHandleInteger.match(/^-?(0+)\d/);
828+
826829
const sanitizedValue =
827830
hasTrailingDecimalSeparator && isValueDeleted
828831
? valueHandleInteger
@@ -846,11 +849,20 @@ export class InputNumber
846849
}
847850

848851
// adds localized trailing decimal separator
849-
this.displayedValue =
850-
hasTrailingDecimalSeparator && isValueDeleted
851-
? `${newLocalizedValue}${numberStringFormatter.decimal}`
852-
: newLocalizedValue;
852+
if (hasTrailingDecimalSeparator && isValueDeleted) {
853+
newLocalizedValue = `${newLocalizedValue}${numberStringFormatter.decimal}`;
854+
}
855+
856+
// adds localized leading zeros
857+
if (hasLeadingZeros) {
858+
newLocalizedValue = `${
859+
hasLeadingMinusSign ? newLocalizedValue.charAt(0) : ""
860+
}${numberStringFormatter.localize("0").repeat(hasLeadingZeros[1].length)}${
861+
hasLeadingMinusSign ? newLocalizedValue.slice(1) : newLocalizedValue
862+
}`;
863+
}
853864

865+
this.displayedValue = newLocalizedValue;
854866
this.setPreviousNumberValue(previousValue ?? this.value);
855867
this.previousValueOrigin = origin;
856868
this.userChangedValue = origin === "user" && this.value !== newValue;

packages/calcite-components/src/demos/input-number.html

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,14 @@
135135
<div class="child-flex font right-aligned-text">Number Vertical</div>
136136
<div class="child-flex">
137137
<calcite-label scale="s">
138-
Input Label
139-
<calcite-input-number placeholder="Placeholder" scale="s" value="123" step="1"></calcite-input-number>
138+
Input Label AR2
139+
<calcite-input-number
140+
placeholder="Placeholder"
141+
scale="s"
142+
value="123"
143+
lang="ar"
144+
numbering-system="arab"
145+
></calcite-input-number>
140146
</calcite-label>
141147
</div>
142148

0 commit comments

Comments
 (0)