/** * Селектор предметов по названию (как SubjectSelect, для прогресса ученика). */ 'use client'; import React, { useState, useRef, useEffect } from 'react'; export interface SubjectNameOption { subject: string; } interface SubjectNameSelectProps { options: SubjectNameOption[]; value: string | null; onChange: (value: string | null) => void; disabled?: boolean; placeholder?: string; } export const SubjectNameSelect: React.FC = ({ options, value, onChange, disabled = false, placeholder = 'Выберите предмет', }) => { const [isOpen, setIsOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const containerRef = useRef(null); const searchInputRef = useRef(null); const filtered = options.filter((o) => o.subject.toLowerCase().includes(searchQuery.toLowerCase().trim()) ); useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(e.target as Node)) { setIsOpen(false); setSearchQuery(''); } }; if (isOpen) { document.addEventListener('mousedown', handleClickOutside); setTimeout(() => searchInputRef.current?.focus(), 0); } return () => document.removeEventListener('mousedown', handleClickOutside); }, [isOpen]); const selected = options.find((o) => o.subject === value); return (
{isOpen && (
setSearchQuery(e.target.value)} placeholder="Поиск предмета..." style={{ width: '100%', padding: '8px 12px 8px 40px', fontSize: 14, color: 'var(--md-sys-color-on-surface)', background: 'var(--md-sys-color-surface-variant)', border: 'none', borderRadius: 8, fontFamily: 'inherit', outline: 'none', }} /> {searchQuery && ( )}
{filtered.length === 0 ? (
{searchQuery ? 'Предметы не найдены' : 'Нет доступных предметов'}
) : ( filtered.map((o) => ( )) )}
)}
); };