import { ExpandMore, ExpandMoreOutlined } from "@mui/icons-material"; import { Accordion, AccordionDetails, AccordionSummary, Checkbox, Divider, FormControlLabel, List, ListItem, MenuItem, OutlinedInput, Select, TextField } from "@mui/material"; import React from "react"; import CloseIcon from "../../../components/aisera-icons/custom/CloseIcon"; import { FilterData } from "../Filter"; import './filter-dropdown.scss'; interface Option { label: string; value?: string | number; filterOptions?: any; isSelected?: boolean; defaultSelected?: any[]; } export interface FilterOptions { label: string; type?: string; value: string options?: Option[]; onClear: (groupIndex: number, optionIndex: number, filter: FilterData | undefined) => void; groupIndex?: number | undefined; optionIndex?: number | undefined; hideClearIcon?: boolean; onChangeFilter: (filterData: FilterData) => void; defaultSelected: string[]; } const FilterDropdown = ({ label, type, value, options, onClear, groupIndex, optionIndex, onChangeFilter, hideClearIcon, defaultSelected }: FilterOptions) => { const [selectedOptions, setSelectedOptions] = React.useState([]); const [unselectedOptions, setUnselectedOptions] = React.useState(options || []); React.useEffect(() => { if (defaultSelected) { const { matchedRecords, unmatchedRecords } = unselectedOptions.reduce((acc: { matchedRecords: Option[], unmatchedRecords: Option[] }, option: Option) => { if (defaultSelected.some(val => val === option.value)) { acc.matchedRecords.push(option); } else { acc.unmatchedRecords.push(option); } return acc; }, { matchedRecords: [], unmatchedRecords: [] }); setSelectedOptions(matchedRecords as Option[]); setUnselectedOptions(unmatchedRecords as Option[]); } }, []); const [filterData, setFilterData] = React.useState(); const [searchText, setSearchText] = React.useState(null); const [filteredSelectedOptions, setFilteredSelectedOptions] = React.useState([]); const [filteredUnSelectedOptions, setFilteredUnSelectedOptions] = React.useState([]); const handleSelectAll = () => { setSelectedOptions([...selectedOptions, ...unselectedOptions]); setUnselectedOptions([]); handleChange(); }; const filteredOptions = (searchText: string) => { setSearchText(searchText); } const handleDeselectAll = () => { setUnselectedOptions([...unselectedOptions, ...selectedOptions]); setSelectedOptions([]); // setFilterData({ field: value, operand: [], operator: '', type: type || '' }); }; const handleToggleOption = (e: any, option: Option, isSelected: boolean) => { e.stopPropagation(); if (isSelected) { setSelectedOptions(selectedOptions.filter(o => o.value !== option.value)); setUnselectedOptions([...unselectedOptions, option]); } else { setUnselectedOptions(unselectedOptions.filter(o => o.value !== option.value)); setSelectedOptions([...selectedOptions, option]); } }; const handleCheckboxClick = (event: React.MouseEvent) => { event.stopPropagation(); }; const handleChange = () => { const operands = selectedOptions?.length > 0 ? selectedOptions?.map(item => item.value) : undefined; const newFilterData = { field: value, operand: operands, type: type, operator: 'IN' }; setFilterData(newFilterData as FilterData); }; const closeFilter = (groupIndex: number | undefined, optionIndex: number | undefined) => { // setFilterData({ field: value, operand: [], operator: '', type: type || '' }) setSelectedOptions([]); if (groupIndex != undefined && optionIndex != null) { onClear(groupIndex, optionIndex, filterData); } handleSearchFiltereData(); } const handleSearchFiltereData = () => { if (searchText) { // setFilteredSelectedOptions(selectedOptions.filter(o => o?.label?.toLowerCase().includes(searchText?.toLowerCase()))); setFilteredUnSelectedOptions(unselectedOptions.filter(o => o?.label?.toLowerCase().includes(searchText?.toLowerCase()))); } } React.useEffect(() => { handleSearchFiltereData(); }, [selectedOptions, unselectedOptions]); React.useEffect(() => { handleChange(); }, [selectedOptions, unselectedOptions]); React.useEffect(() => { (filterData) ? onChangeFilter(filterData) : {}; }, [filterData]); React.useEffect(() => { handleSearchFiltereData(); }, [searchText]); return (
) } export default FilterDropdown