Skip to content

Commit

Permalink
fix(elements/ino-input): enforce min max limits on arrow click (#1248)
Browse files Browse the repository at this point in the history
* enforce min max constrain on arrow click in input

* run formatter

* add tests
  • Loading branch information
BenPag committed Feb 16, 2024
1 parent f5f73d7 commit f16d155
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 4 deletions.
28 changes: 28 additions & 0 deletions packages/elements/src/components/ino-input/ino-input.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,34 @@ describe('InoInput', () => {

expect(valueChangedSpy).toHaveReceivedEventDetail('-1');
});

it('should emit min value when clicking on down and new value is lower than min', async () => {
inoInputEl.setAttribute('type', 'number');
inoInputEl.setAttribute('min', '1');
await page.waitForChanges();

const valueChangedSpy = await page.spyOnEvent('valueChange');

await page.evaluate(() => {
(document.querySelector('.down') as HTMLElement).click();
});

expect(valueChangedSpy).toHaveReceivedEventDetail('1');
});

it('should emit max value when clicking on up arrow and new value is greater than max', async () => {
inoInputEl.setAttribute('type', 'number');
inoInputEl.setAttribute('max', '0');
await page.waitForChanges();

const valueChangedSpy = await page.spyOnEvent('valueChange');

await page.evaluate(() => {
(document.querySelector('.up') as HTMLElement).click();
});

expect(valueChangedSpy).toHaveReceivedEventDetail('0');
});
});

describe('Input validation', () => {
Expand Down
14 changes: 10 additions & 4 deletions packages/elements/src/components/ino-input/ino-input.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -413,10 +413,16 @@ export class Input implements ComponentInterface {
minimumFractionDigits: precision,
maximumFractionDigits: precision,
};
const formattedValue = new Intl.NumberFormat([], opts).format(
value + Number(stepWithFallback),
);
this.valueChange.emit(formattedValue);

let nextValue = value + Number(stepWithFallback);
if (nextValue > Number(this.max)) {
nextValue = Number(this.max);
} else if (nextValue < Number(this.min)) {
nextValue = Number(this.min);
}

const formattedValue = new Intl.NumberFormat([], opts).format(nextValue);
if (this.value !== formattedValue) this.valueChange.emit(formattedValue);
};

// ----
Expand Down

0 comments on commit f16d155

Please sign in to comment.