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;
name: string; // снапшот имени из прайса
price_catalog: number;
price_applied: number;
// "" допустим в процессе редактирования — иначе React при очистке inputа
// сразу подставляет "0" и его приходится курсором обходить, см. жалобу
// механиков. На submit пустое трактуется как 0 (или как ошибка валидации).
price_applied: number | "";
unlocked: boolean; // карандашик разблокировал поле
override_comment: string;
}
@@ -501,15 +504,19 @@ export default function CreateRepairPage() {
min={0}
value={w.price_applied}
disabled={!w.unlocked}
onChange={(e) =>
onChange={(e) => {
const v = e.target.value;
// Пустое поле остаётся пустым в стейте (не сбрасываем в 0),
// чтобы юзер мог сразу набрать новую цену поверх.
const next: number | "" = v === "" ? "" : Number(v);
setWorks((arr) =>
arr.map((row) =>
row.rowKey === w.rowKey
? { ...row, price_applied: Number(e.target.value) }
? { ...row, price_applied: next }
: row,
),
)
}
);
}}
className="w-24"
/>
<Button