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()} />