fix(pwa/repairs): allow clearing price input without sticky 0

В CreateRepairPage поле «Цена применённая» хранило цифру через
price_applied: number. При удалении символов React сразу подставлял 0
и его нельзя было стереть — приходилось каретку перед нулём ставить
руками. Поменяли тип на number | "" в WorkRow и в onChange оставляем
пустую строку в стейте, пока юзер не ввёл новую цифру. На submit и в
сумму "" трактуется как 0 (Number("") === 0).

EditRepairPage не задет — там цена правится через модалку, цена там
уже жила как string (useState(String(...))) и пустое было допустимо.
This commit is contained in:
2026-05-25 21:43:07 +10:00
parent 205078c5ce
commit 3b7b2ae56d
@@ -54,7 +54,10 @@ interface WorkRow {
work_catalog_id: number; work_catalog_id: number;
name: string; // снапшот имени из прайса name: string; // снапшот имени из прайса
price_catalog: number; price_catalog: number;
price_applied: number; // "" допустим в процессе редактирования — иначе React при очистке inputа
// сразу подставляет "0" и его приходится курсором обходить, см. жалобу
// механиков. На submit пустое трактуется как 0 (или как ошибка валидации).
price_applied: number | "";
unlocked: boolean; // карандашик разблокировал поле unlocked: boolean; // карандашик разблокировал поле
override_comment: string; override_comment: string;
} }
@@ -501,15 +504,19 @@ export default function CreateRepairPage() {
min={0} min={0}
value={w.price_applied} value={w.price_applied}
disabled={!w.unlocked} disabled={!w.unlocked}
onChange={(e) => onChange={(e) => {
const v = e.target.value;
// Пустое поле остаётся пустым в стейте (не сбрасываем в 0),
// чтобы юзер мог сразу набрать новую цену поверх.
const next: number | "" = v === "" ? "" : Number(v);
setWorks((arr) => setWorks((arr) =>
arr.map((row) => arr.map((row) =>
row.rowKey === w.rowKey row.rowKey === w.rowKey
? { ...row, price_applied: Number(e.target.value) } ? { ...row, price_applied: next }
: row, : row,
), ),
) );
} }}
className="w-24" className="w-24"
/> />
<Button <Button