From 9fb1f1f7ee6441963e6022580f5d9a0990520bb9 Mon Sep 17 00:00:00 2001 From: Max Ronzhin Date: Tue, 11 Aug 2026 20:50:08 +0300 Subject: [PATCH] =?UTF-8?q?fix(calendar):=20=D0=BF=D0=BE=D1=87=D0=B8=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B2=D0=B2=D0=BE=D0=B4=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=B5=20=C2=AB=D0=94=D0=BB=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Числовое состояние (`Number(value) || 0`) не давало очистить поле — удаление тут же превращалось обратно в 0, и следующая цифра визуально дописывалась к нему. Состояние переведено на строку (пустое значение теперь возможно, приводится к числу перед отправкой), плюс выделение содержимого по фокусу — так первая же цифра заменяет старое значение, а не приписывается к нему. --- .../components/calendar/ConferenceFormCard.tsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/calendar/ConferenceFormCard.tsx b/frontend/src/components/calendar/ConferenceFormCard.tsx index db485d5..fe41964 100644 --- a/frontend/src/components/calendar/ConferenceFormCard.tsx +++ b/frontend/src/components/calendar/ConferenceFormCard.tsx @@ -75,7 +75,16 @@ export function ConferenceFormCard({ conference, onSaved, onDeleted, onCancelEdi const [title, setTitle] = useState(conference?.title ?? '') const [dateStr, setDateStr] = useState(initialSlot.date) const [timeStr, setTimeStr] = useState(initialSlot.time) - const [durationMinutes, setDurationMinutes] = useState(conference?.duration_minutes ?? 30) + // Строкой, а не числом: контролируемый number-инпут с числовым состоянием + // не даёт очистить поле (`Number('') || 0` тут же возвращает 0, значение + // "0" вспыхивает обратно) — строка хранит именно то, что ввёл пользователь, + // включая пустоту. Вторая половина жалобы («ввод дописывается после 0», а + // не заменяет его) — не про хранение, а про то, что при фокусе курсор + // просто вставал рядом с текущим значением; чинится `onFocus={select()}` + // у самого `` ниже. `durationMinutes` — производное число для + // валидации и отправки. + const [durationMinutesInput, setDurationMinutesInput] = useState(String(conference?.duration_minutes ?? 30)) + const durationMinutes = Number(durationMinutesInput) || 0 const [isClosed, setIsClosed] = useState(conference?.is_closed ?? false) const [password, setPassword] = useState('') @@ -306,8 +315,9 @@ export function ConferenceFormCard({ conference, onSaved, onDeleted, onCancelEdi type="number" min={5} step={5} - value={durationMinutes} - onChange={(e) => setDurationMinutes(Number(e.target.value) || 0)} + value={durationMinutesInput} + onChange={(e) => setDurationMinutesInput(e.target.value)} + onFocus={(e) => e.target.select()} />