/** * TimePicker на базе MUI X: Static variant (как на скрине). */ 'use client'; import React from 'react'; import { ru } from 'date-fns/locale'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; import { StaticTimePicker } from '@mui/x-date-pickers/StaticTimePicker'; import { Box, Dialog, DialogContent, DialogTitle, Button } from '@mui/material'; interface TimePickerProps { value: string; // HH:mm format onChange: (value: string) => void; disabled?: boolean; required?: boolean; } export const TimePicker: React.FC = ({ value, onChange, disabled = false, required = false, }) => { const [open, setOpen] = React.useState(false); const [draft, setDraft] = React.useState(null); const valueDate = React.useMemo(() => { const base = new Date(); const parts = (value || '').split(':'); const hh = Number(parts[0]); const mm = Number(parts[1]); if (Number.isFinite(hh) && Number.isFinite(mm)) { base.setHours(hh, mm, 0, 0); return base; } base.setHours(0, 0, 0, 0); return base; }, [value]); const openPicker = () => { if (disabled) return; setDraft(valueDate); setOpen(true); }; const closePicker = () => setOpen(false); const commit = () => { const d = draft ?? valueDate; const hh = String(d.getHours()).padStart(2, '0'); const mm = String(d.getMinutes()).padStart(2, '0'); onChange(`${hh}:${mm}`); closePicker(); }; return ( <> ВЫБЕРИТЕ ВРЕМЯ setDraft(v == null ? null : v instanceof Date ? v : (v as { toDate?: () => Date }).toDate?.() ?? null)} ampm={false} minutesStep={5} localeText={{}} sx={{ '& .MuiClockPointer-root': { backgroundColor: 'var(--md-sys-color-primary)', }, '& .MuiClockPointer-thumb': { borderColor: 'var(--md-sys-color-primary)', backgroundColor: 'var(--md-sys-color-primary)', }, '& .MuiClock-pin': { backgroundColor: 'var(--md-sys-color-primary)', }, '& .MuiClockNumber-root.Mui-selected': { backgroundColor: 'var(--md-sys-color-primary)', color: 'var(--md-sys-color-on-primary)', }, }} slotProps={{ // убираем встроенные CANCEL/OK у MUI actionBar: { actions: [] }, }} /> ); };