import * as React from 'react'; import { texts } from '../../texts'; import { useAsyncSubmit } from '../../hooks/useAsyncSubmit'; import { boolToTriState, isValidSlaHours, parseSlaHours, slaHoursToInput, triStateToBool, TriState, TRI_STATE_OPTIONS } from '../../utils/sla'; import { Field, FormGrid, FormModal, Select, TextInput } from '../ui'; export interface IManageRequestsSlaModalProps { /** Номер шага — только для заголовка, чтобы было видно, что правим. */ orderNo: number; // eslint-disable-next-line @rushstack/no-new-null -- null = «в строке не задано», это не 0 slaHours: number | null; // eslint-disable-next-line @rushstack/no-new-null -- null = «в строке не задано» askOverdueReason: boolean | null; // eslint-disable-next-line @rushstack/no-new-null -- см. выше onSave: (slaHours: number | null, askOverdueReason: boolean | null) => Promise; onClose: () => void; } /** * SLA конкретной строки маршрута конкретной заявки. * * Правится отдельно от маршрута-шаблона: шаблон задаёт значение на момент * создания заявки, а здесь его можно поменять для одной уже идущей заявки, не * трогая остальные. * * Пустое поле сохраняется как «не задано» — тогда работает SLA типа заявки. * Ноль пустотой не считается: это «напоминать сразу». */ export const ManageRequestsSlaModal: React.FC = ({ orderNo, slaHours, askOverdueReason, onSave, onClose }) => { const [hours, setHours] = React.useState(() => slaHoursToInput(slaHours)); const [ask, setAsk] = React.useState(() => boolToTriState(askOverdueReason)); const submit = useAsyncSubmit(); const handleSubmit = (): void => { if (!isValidSlaHours(hours)) { submit.fail(texts.manageRequests.validationSlaHours); return; } submit.run(() => onSave(parseSlaHours(hours), triStateToBool(ask))); }; return ( setHours(e.target.value)} placeholder={texts.manageRequests.slaHoursPlaceholder} />