import React, { useState, useRef, useEffect } from "react"; import { ArrowIcon } from "../../icons/ExportCommonIcons"; // Dropdown Item Component const DropdownItem = ({ label, onClick, disabled = false, }: { label: string; onClick: () => void; disabled?: boolean; }) => (
{ if (!disabled) onClick(); }} style={{ cursor: disabled ? "not-allowed": "default", opacity: disabled ? 0.5 : 1 }} > {label}
); // Nested Dropdown Component const NestedDropdown = ({ label, fields, onSelect, disabledFields = [], }: { label: string; fields: string[]; onSelect: (selectedData: { name: string; fields: string }) => void; disabledFields?: string[]; }) => { const [open, setOpen] = useState(false); return (
setOpen(!open)} > {label}
{open && (
{fields.map((field) => { const isDisabled = disabledFields.includes(`${label}-${field}`); return ( onSelect({ name: label, fields: field })} disabled={isDisabled} /> ); })}
)}
); }; // Props type for MultiLevelDropdown interface MultiLevelDropdownProps { data: Record; onSelect: (selectedData: { name: string; fields: string }) => void; onUnselect: () => void; selectedValue?: { name: string; fields: string }; allSelections?: Record; isLoading?: boolean; } // Main Multi-Level Dropdown Component const MultiLevelDropdown = ({ data, onSelect, onUnselect, selectedValue, allSelections = {}, isLoading = false, }: MultiLevelDropdownProps) => { const [open, setOpen] = useState(false); const dropdownRef = useRef(null); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) ) { setOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, []); // Handle item selection const handleItemSelect = (selectedData: { name: string; fields: string }) => { onSelect(selectedData); setOpen(false); }; // Handle unselect const handleItemUnselect = () => { onUnselect(); setOpen(false); }; // Determine the display label const displayLabel = selectedValue ? `${selectedValue.name} - ${selectedValue.fields}` : "Dropdown trigger"; // Build list of disabled selections const disabledFieldsList = Object.values(allSelections) .filter( (sel) => !(sel.name === selectedValue?.name && sel.fields === selectedValue?.fields) ) .map((sel) => `${sel.name}-${sel.fields}`); return (
{open && (
{isLoading ? (
) : ( <> {Object.entries(data).map(([key, value]) => ( ))} )}
)}
); }; export default MultiLevelDropdown;