diff --git a/src/components/common/SelectMultiple.jsx b/src/components/common/SelectMultiple.jsx new file mode 100644 index 00000000..e0c47760 --- /dev/null +++ b/src/components/common/SelectMultiple.jsx @@ -0,0 +1,125 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { useFormContext } from 'react-hook-form'; +import './MultiSelectDropdown.css'; + +const SelectMultiple = ({ + name, + options = [], + label = 'Select options', + labelKey = 'name', + valueKey = 'id', + placeholder = 'Please select...', + IsLoading = false +}) => { + const { setValue, watch } = useFormContext(); + const selectedValues = watch(name) || []; + + const [isOpen, setIsOpen] = useState(false); + const [searchText, setSearchText] = useState(''); + const dropdownRef = useRef(null); + + useEffect(() => { + const handleClickOutside = (e) => { + if (dropdownRef.current && !dropdownRef.current.contains(e.target)) { + setIsOpen(false); + } + }; + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + }, []); + + const handleCheckboxChange = (value) => { + const updated = selectedValues.includes(value) + ? selectedValues.filter((v) => v !== value) + : [...selectedValues, value]; + + setValue(name, updated, { shouldValidate: true }); + }; + + const filteredOptions = options.filter((item) => + item[labelKey]?.toLowerCase().includes(searchText.toLowerCase()) + ); + + return ( +