From 0218c799c59b9a4a7fde9a6f22b0c03ac2619119 Mon Sep 17 00:00:00 2001 From: nns <278048682+nurdotnet@users.noreply.github.com> Date: Sat, 25 Apr 2026 12:55:33 +0500 Subject: [PATCH] =?UTF-8?q?fix(money-input):=20toFixed(2)=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20allowFractional=3Dtrue=20=D0=B4=D0=BB=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit formatFromValue использовал String(v) для дробного режима, поэтому целые значения в БД (1317, 1860) показывались как «1317» / «1860» даже при включённой галке «Разрешить дробные цены». Теперь: - fractional=true → v.toFixed(2): 1317 → «1317.00», 1317.5 → «1317.50»; - fractional=false → String(Math.round(v)): 1317.5 → «1318». Хелпер используется в init useState, useEffect-синке и commitDraft — таким образом при onBlur поле всегда возвращается к корректному формату «1317.00». Co-Authored-By: Claude Opus 4.7 (1M context) --- src/food-market.web/src/components/Field.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/food-market.web/src/components/Field.tsx b/src/food-market.web/src/components/Field.tsx index d910c7e..aeb54f7 100644 --- a/src/food-market.web/src/components/Field.tsx +++ b/src/food-market.web/src/components/Field.tsx @@ -60,8 +60,14 @@ export function MoneyInput({ const settingKnown = allowFractional !== undefined || org.data !== undefined const fractional = allowFractional ?? org.data?.allowFractionalPrices ?? true - const formatFromValue = (v: number | null | undefined, frac: boolean) => - v == null ? '' : (frac ? String(v) : String(Math.round(v))) + const formatFromValue = (v: number | null | undefined, frac: boolean) => { + if (v == null) return '' + // При fractional=true всегда показываем ровно 2 знака после запятой + // (1317 → «1317.00», 1317.5 → «1317.50»). Так юзеру визуально понятно, + // что поле допускает копейки и текущее значение — это целое. + if (frac) return v.toFixed(2) + return String(Math.round(v)) + } // Локальный draft — то что юзер реально печатает. Может быть промежуточным // ("100.", "100.5", "0."). Sync с внешним value только когда поле не в фокусе.