import { Autocomplete, ListItem, ListItemText, type SxProps, TextField, type Theme } from "@mui/material"; import { getLocalizedString } from "@olenbetong/appframe-core"; import { useDataWithFilter, useDebounce } from "@olenbetong/appframe-react"; import { useMemo, useRef, useState } from "react"; import { dsProjects, type ProjectsRecord } from "./data/dsProjects"; import { dsReportProjects } from "./data/dsReportProjects"; type ProjectSelectProps = { className?: string; disabled?: boolean; id?: string; names?: { domain?: string; projectId?: string; name?: string; }; nullable?: boolean; readOnly?: boolean; required?: boolean; onChange?: (project: Partial | null) => void; defaultValue?: Partial | null; value?: Partial | null; label?: string; sx?: SxProps | undefined; report?: boolean; }; export function ProjectSelect({ className, disabled, id, names, onChange, readOnly, required, defaultValue, value, label, sx, report, }: ProjectSelectProps) { let [selected, setSelected] = useState>(defaultValue ?? null); let [query, setQuery] = useState(""); let search = useDebounce(query); let projects = useDataWithFilter( report ? dsReportProjects : dsProjects, search ? `[SearchColumn] LIKE '%${search}%'` : "", ); let highlightRef = useRef>(null); function handleSelect(value: Partial | null) { highlightRef.current = null; if (!disabled && !readOnly) { if (onChange) { onChange(value); } else { setSelected(value); } } } let current = value === undefined ? selected : value; const duplicatedNames = useMemo(() => { const nameCount = new Map(); projects.forEach((opt) => { nameCount.set(opt.ProjectName, (nameCount.get(opt.ProjectName) || 0) + 1); }); return new Set([...nameCount.entries()].filter(([, count]) => count > 1).map(([name]) => name)); }, [projects]); return ( <> > sx={sx} autoHighlight autoSelect clearOnEscape className={className} options={projects} disabled={disabled} getOptionLabel={(option) => option?.ProjectID !== undefined ? `${option.ProjectID}: ${option.ProjectName}` : "" } isOptionEqualToValue={(option, value) => option.Domain === value.Domain && option.ProjectID === value.ProjectID} onChange={(_, value) => handleSelect(value)} onClose={() => setQuery("")} value={value !== undefined ? value : selected} renderInput={(params) => ( setQuery(evt.target.value)} value={query} /> )} renderOption={(props, option) => { let isDuplicated = option.ProjectName && duplicatedNames.has(option.ProjectName); return ( ); }} /> ); }