mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 17:43:47 +00:00
fix: allow clearing number inputs and add validation
- Add inputHelpers utility for number inputs that allow empty values - Update tariff, campaign, promo offers, and server forms - Add validation for required fields (deviceLimit, tierLevel, dailyPrice) - Add placeholders and error indicators for empty required fields - Add fieldRequired and dailyPriceRequired translations
This commit is contained in:
48
src/utils/inputHelpers.ts
Normal file
48
src/utils/inputHelpers.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { ChangeEvent } from 'react';
|
||||
|
||||
/**
|
||||
* Creates an onChange handler for number inputs that allows empty values while typing.
|
||||
* This fixes the issue where inputs can't be cleared because `parseInt('') || 0` immediately fills with 0.
|
||||
*
|
||||
* @param setter - The state setter function
|
||||
* @param min - Optional minimum value constraint
|
||||
* @param max - Optional maximum value constraint
|
||||
*/
|
||||
export function createNumberInputHandler(
|
||||
setter: (value: number | '') => void,
|
||||
min?: number,
|
||||
max?: number,
|
||||
) {
|
||||
return (e: ChangeEvent<HTMLInputElement>) => {
|
||||
const val = e.target.value;
|
||||
|
||||
if (val === '') {
|
||||
setter('');
|
||||
return;
|
||||
}
|
||||
|
||||
let num = parseFloat(val);
|
||||
|
||||
if (isNaN(num)) return;
|
||||
|
||||
if (min !== undefined) num = Math.max(min, num);
|
||||
if (max !== undefined) num = Math.min(max, num);
|
||||
|
||||
setter(num);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a number|'' state value to a number, using a default for empty.
|
||||
*/
|
||||
export function toNumber(value: number | '', defaultValue = 0): number {
|
||||
return value === '' ? defaultValue : value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the display value for a kopeks field (converts to rubles).
|
||||
* Returns '' if the value is empty, otherwise divides by 100.
|
||||
*/
|
||||
export function kopeksToDisplay(value: number | ''): number | '' {
|
||||
return value === '' ? '' : value / 100;
|
||||
}
|
||||
Reference in New Issue
Block a user