Skip to content

Commit 42ece5f

Browse files
committed
feat: add range select
1 parent d557f98 commit 42ece5f

3 files changed

Lines changed: 349 additions & 109 deletions

File tree

src/components/Select/Select.stories.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export default {
2020
isFullWidth: { control: { type: 'boolean' } },
2121
isSearchable: { control: { type: 'boolean' } },
2222
isMultiple: { control: { type: 'boolean' } },
23+
isRange: { control: { type: 'boolean' } },
2324
onChange: { action: 'Select Changed' },
2425
onClose: { action: 'Dropdown Closed' },
2526
options: { control: 'object' },
@@ -124,3 +125,12 @@ NotFullWidth.args = {
124125
},
125126
],
126127
};
128+
129+
export const RangeSelect = Template.bind({});
130+
RangeSelect.args = {
131+
isRange: true,
132+
placeholder: 'Select a range',
133+
rangeMin: 1,
134+
rangeMax: 100,
135+
options: [],
136+
};

src/components/Select/Select.test.tsx

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,76 @@ describe('The Select component', () => {
238238
expect(handleChange).toHaveBeenCalledWith(['1']);
239239
});
240240

241+
it('handles range selection mode', async () => {
242+
const handleChange = jest.fn();
243+
244+
render(<Select color="black" options={mockOptions} isRange={true} onChange={handleChange} />);
245+
246+
const toggleButton = screen.getByRole('combobox');
247+
248+
await act(async () => {
249+
fireEvent.click(toggleButton);
250+
});
251+
252+
expect(screen.getByText('From')).toBeInTheDocument();
253+
expect(screen.getByText('To')).toBeInTheDocument();
254+
255+
const inputFields = screen.getAllByRole('spinbutton');
256+
257+
fireEvent.change(inputFields[0], {
258+
target: { value: '1' },
259+
});
260+
fireEvent.change(inputFields[1], {
261+
target: { value: '100' },
262+
});
263+
264+
expect(handleChange).toHaveBeenCalledWith(['1', '100']);
265+
});
266+
267+
it('displays error messages when the range is invalid', async () => {
268+
render(
269+
<Select color="black" options={mockOptions} isRange={true} rangeMin={5} rangeMax={10} />
270+
);
271+
272+
const toggleButton = screen.getByRole('combobox');
273+
await act(async () => {
274+
fireEvent.click(toggleButton);
275+
});
276+
277+
const inputFields = screen.getAllByRole('spinbutton');
278+
fireEvent.change(inputFields[0], {
279+
target: { value: '4' },
280+
});
281+
fireEvent.change(inputFields[1], {
282+
target: { value: '11' },
283+
});
284+
285+
expect(screen.getByText('Value must be at least 5')).toBeInTheDocument();
286+
expect(screen.getByText('Value must be at most 10')).toBeInTheDocument();
287+
});
288+
289+
it('displays an error message when the min value of the range is greater than the max value', async () => {
290+
render(
291+
<Select color="black" options={mockOptions} isRange={true} rangeMin={0} rangeMax={10} />
292+
);
293+
const toggleButton = screen.getByRole('combobox');
294+
await act(async () => {
295+
fireEvent.click(toggleButton);
296+
});
297+
298+
const inputFields = screen.getAllByRole('spinbutton');
299+
fireEvent.change(inputFields[0], {
300+
target: { value: '9' },
301+
});
302+
fireEvent.change(inputFields[1], {
303+
target: { value: '4' },
304+
});
305+
306+
expect(
307+
screen.getByText('The minimum value cannot be greater than the maximum value')
308+
).toBeInTheDocument();
309+
});
310+
241311
it('prevents deselection when preventDeselection is true', async () => {
242312
const handleChange = jest.fn();
243313

0 commit comments

Comments
 (0)