import CloseIcon from "@components/aisera-icons/custom/CloseIcon"; import Button from "@components/Button/Button"; import { AddCircleOutline, ExpandMoreOutlined } from "@mui/icons-material"; import { Accordion, AccordionDetails, AccordionSummary, Checkbox, Divider, FormControlLabel, List, ListItem, TextField, } from "@mui/material"; import Popover from "@mui/material/Popover"; import dayjs from "dayjs"; import React, { useEffect } from "react"; import { FilterData } from "../Filter"; import FilterDropdown from "../FilterPopup/FilterDropdown"; import SingleSelect from "../SingleSelect/SingleSelect"; import "./add-filter.scss"; interface Option { label?: any; value?: any; type?: string filterOptions?: any; isSelected?: boolean; hideClearIcon?: boolean; groupIndex?: number; optionIndex?: number; defaultSelected?: any; } export interface FilterProps { label?: string; type?: string; options?: GroupOptions[] | Option[]; } export interface GroupOptions { name: string; options: Option[]; } export interface AddFilterProps { options: GroupOptions[]; defaultOptions?: Option[]; onChangeOptions: (filterData: FilterData[]) => void; hideAddFilter?: boolean; clearAll?: () => void; preSelectFilter?: FilterData[] | []; } const AddFilter = ({ options, defaultOptions, onChangeOptions, hideAddFilter, clearAll, preSelectFilter }: AddFilterProps) => { const [anchorEl, setAnchorEl] = React.useState( null ); const handleClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); }; const handleClose = () => { setAnchorEl(null); }; const open = Boolean(anchorEl); const id = open ? "simple-popover" : undefined; const [selectedOptions, setSelectedOptions] = React.useState([]); const [unselectedOptions, setUnselectedOptions] = React.useState(options); const [filterData, setFilterData] = React.useState([]); const [filterSelectedOptions, setFilterSelectedOptions] = React.useState([]); const [filterUnselectedOptions, setFilterUnselectedOptions] = React.useState([]); const [searchText, setSearchText] = React.useState(""); const [initialize, setInitialize] = React.useState(false); const setPredefinedData = () => { let defaultData: Option[] = defaultOptions || []; const updatedOptions = defaultData.map(options => { let matchedFilter; if(preSelectFilter && preSelectFilter.length > 0) { matchedFilter = preSelectFilter?.find(opt => opt.field === options.value); } if (matchedFilter) { return { ...options, defaultSelected: matchedFilter.operand }; } return options; }); defaultData = updatedOptions; setInitialize(false); return updatedOptions; } const convertTimeStampToDates = (operand: number) => { const now = dayjs(); const pastDiff = now.subtract(operand, 'day'); console.log('date time now :::: ', now); console.log('3 days time ago ::: ', pastDiff); } useEffect(() => { setSelectedOptions(setPredefinedData()); }, []); const clearAllFilters = () => { setSelectedOptions([]); const prevUnselectctedOptions = [...unselectedOptions]; prevUnselectctedOptions.forEach(group => { group.options.forEach(option => { option.isSelected = false; }); }); setUnselectedOptions(prevUnselectctedOptions); setFilterData([]); if (clearAll) { clearAll(); } } const handleToggleOption = ( option: Option, isSelected: boolean, index: number, index2: number ) => { if (!isSelected) { const prevSelectedOptions = [ ...selectedOptions, { ...unselectedOptions[index].options[index2], groupIndex: index, optionIndex: index2, } ]; setSelectedOptions(prevSelectedOptions); const prevUnselectctedOptions = [...unselectedOptions]; prevUnselectctedOptions[index].options[index2].isSelected = true; setUnselectedOptions(prevUnselectctedOptions); } else { const prevUnselectctedOptions = [...unselectedOptions]; const prevSelectedOptions = [...selectedOptions]; const removedElement = prevSelectedOptions[index]; if (removedElement?.groupIndex != undefined && removedElement.optionIndex != undefined) { prevUnselectctedOptions[removedElement?.groupIndex].options[removedElement?.optionIndex].isSelected = false; } prevSelectedOptions.splice(index, 1); setSelectedOptions(prevSelectedOptions); setUnselectedOptions(prevUnselectctedOptions); } }; const handleCheckboxClick = (event: React.MouseEvent) => { event.stopPropagation(); }; const handleClearFilter = (groupIndex: number, optionIndex: number, filter: FilterData | undefined) => { const prevUnselectctedOptions = [...unselectedOptions]; const prevSelectedOptions = [...selectedOptions]; const removedIndex = selectedOptions.findIndex(opt => opt.groupIndex === groupIndex && opt.optionIndex === optionIndex); if (groupIndex != undefined && optionIndex != undefined) { prevUnselectctedOptions[groupIndex].options[optionIndex].isSelected = false; } prevSelectedOptions.splice(removedIndex, 1); setSelectedOptions(prevSelectedOptions); setUnselectedOptions(prevUnselectctedOptions); const existingFilterIndex = filterData ? filterData?.findIndex((data) => data.field === filter?.field) : -1; if (existingFilterIndex !== -1) { const prevFilterData = [...filterData]; prevFilterData.splice(existingFilterIndex, 1) setFilterData(prevFilterData) } } const handleOnchangeFilter = (filter: FilterData) => { const existingFilter = filterData?.find((data) => data.field === filter.field); if (existingFilter) { const index = filterData?.findIndex((data) => data?.field === filter.field); if (filter?.operand !== undefined && filter?.operand !== '' && filter?.operand?.length !== 0) { // If entry exists, update it const updatedFilterData = [...filterData]; updatedFilterData[index] = { field: filter?.field, operand: filter?.operand, type: filter?.type, operator: filter?.operator }; setFilterData(updatedFilterData); } else { const prevFilterData = [...filterData]; prevFilterData.splice(index, 1) setFilterData(prevFilterData) } } else { //If entry not exists, Add new Entry if (filter?.operand !== undefined && filter?.operand !== '' && filter?.operand?.length !== 0) { const newFilterData: FilterData = { field: filter?.field, operand: filter?.operand, type: filter?.type, operator: filter?.operator }; setFilterData(prevFilterData => [...prevFilterData, newFilterData]); } } } const handleSearchField = (searchKey: string) => { // setSelectedOptions(selectedOptions.filter(o => o?.label?.toLowerCase().includes(searchText?.toLowerCase()))) // setUnselectedOptions(unselectedOptions.filter(o => o?.label?.toLowerCase().includes(searchText?.toLowerCase()))) console.log('search key ::::: ', searchKey); } useEffect(() => { }, [selectedOptions, unselectedOptions]); useEffect(() => { filterData ? onChangeOptions(filterData) : {}; }, [filterData]); return (
{selectedOptions.map((opt, index) => (
{(opt?.type === 'date_range' || opt?.type === 'status') && ( )} {(opt?.type !== 'date_range' && opt?.type !== 'status') && ( )}
))} { !hideAddFilter && (
) }
); }; export default AddFilter;