浏览代码

feat: prevent input of non-numeric values ​​in numer input (#21562)

tags/1.5.1
CorrectRoad 4 个月前
父节点
当前提交
d2814650e6
没有帐户链接到提交者的电子邮件

+ 5
- 5
web/app/components/base/input-number/index.spec.tsx 查看文件



it('renders input with default values', () => { it('renders input with default values', () => {
render(<InputNumber {...defaultProps} />) render(<InputNumber {...defaultProps} />)
const input = screen.getByRole('textbox')
const input = screen.getByRole('spinbutton')
expect(input).toBeInTheDocument() expect(input).toBeInTheDocument()
}) })




it('handles direct input changes', () => { it('handles direct input changes', () => {
render(<InputNumber {...defaultProps} />) render(<InputNumber {...defaultProps} />)
const input = screen.getByRole('textbox')
const input = screen.getByRole('spinbutton')


fireEvent.change(input, { target: { value: '42' } }) fireEvent.change(input, { target: { value: '42' } })
expect(defaultProps.onChange).toHaveBeenCalledWith(42) expect(defaultProps.onChange).toHaveBeenCalledWith(42)


it('handles empty input', () => { it('handles empty input', () => {
render(<InputNumber {...defaultProps} value={0} />) render(<InputNumber {...defaultProps} value={0} />)
const input = screen.getByRole('textbox')
const input = screen.getByRole('spinbutton')


fireEvent.change(input, { target: { value: '' } }) fireEvent.change(input, { target: { value: '' } })
expect(defaultProps.onChange).toHaveBeenCalledWith(undefined) expect(defaultProps.onChange).toHaveBeenCalledWith(undefined)


it('handles invalid input', () => { it('handles invalid input', () => {
render(<InputNumber {...defaultProps} />) render(<InputNumber {...defaultProps} />)
const input = screen.getByRole('textbox')
const input = screen.getByRole('spinbutton')


fireEvent.change(input, { target: { value: 'abc' } }) fireEvent.change(input, { target: { value: 'abc' } })
expect(defaultProps.onChange).not.toHaveBeenCalled() expect(defaultProps.onChange).not.toHaveBeenCalled()


it('disables controls when disabled prop is true', () => { it('disables controls when disabled prop is true', () => {
render(<InputNumber {...defaultProps} disabled />) render(<InputNumber {...defaultProps} disabled />)
const input = screen.getByRole('textbox')
const input = screen.getByRole('spinbutton')
const incrementBtn = screen.getByRole('button', { name: /increment/i }) const incrementBtn = screen.getByRole('button', { name: /increment/i })
const decrementBtn = screen.getByRole('button', { name: /decrement/i }) const decrementBtn = screen.getByRole('button', { name: /decrement/i })



+ 4
- 4
web/app/components/base/input-number/index.tsx 查看文件

return <div className={classNames('flex', wrapClassName)}> return <div className={classNames('flex', wrapClassName)}>
<Input {...rest} <Input {...rest}
// disable default controller // disable default controller
type='text'
className={classNames('rounded-r-none', className)}
type='number'
className={classNames('no-spinner rounded-r-none', className)}
value={value} value={value}
max={max} max={max}
min={min} min={min}
size={size} size={size}
/> />
<div className={classNames( <div className={classNames(
'flex flex-col bg-components-input-bg-normal rounded-r-md border-l border-divider-subtle text-text-tertiary focus:shadow-xs',
disabled && 'opacity-50 cursor-not-allowed',
'flex flex-col rounded-r-md border-l border-divider-subtle bg-components-input-bg-normal text-text-tertiary focus:shadow-xs',
disabled && 'cursor-not-allowed opacity-50',
controlWrapClassName)} controlWrapClassName)}
> >
<button <button

+ 11
- 0
web/app/styles/globals.css 查看文件

-ms-overflow-style: none; -ms-overflow-style: none;
scrollbar-width: none; scrollbar-width: none;
} }

/* Hide arrows from number input */
.no-spinner::-webkit-outer-spin-button,
.no-spinner::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}

.no-spinner {
-moz-appearance: textfield;
}
} }

正在加载...
取消
保存