import { useEffect, useRef, useState } from "@wordpress/element"; import { DragDropContext, Draggable, Droppable } from "react-beautiful-dnd"; import { arrayMoveImmutable } from "array-move"; import "./dnd-select.scss"; let optionOpen = true; const MultipleSelectWithDnd = ({ label = "", items, values, onChange, onInputChange = false, searchable = false }) => { const [allOptions, setAllOptions] = useState([]); const [searchFieldData, setSearchFieldData] = useState(""); const [toggleSelectField, setToggleSelectField] = useState(false); const allValues = values?.map((item) => item.value); const containerRef = useRef(null); const filterNotSelectedItems = (selectFieldItems) => { const result = selectFieldItems?.filter((item) => !allValues.includes(item.value)); return result; }; useEffect(() => { let options = []; if (toggleSelectField) { options = filterNotSelectedItems(items); } else { options = []; } setAllOptions(options); }, [items, values, toggleSelectField]); const handleSelectField = (data) => { const { id, value, _label } = data; const newValue = [...values, { id: id, value: value, label: _label }]; setSearchFieldData(""); onChange(newValue); }; const handleSearchField = (event) => { const value = event.target.value.toLowerCase(); setSearchFieldData(value); const searchableArray = filterNotSelectedItems(items); const matchedOption = searchableArray.filter((i) => i.label.toLowerCase().includes(value)); onInputChange ? onInputChange(value) : setAllOptions(matchedOption); }; const handleRemoveItems = (id) => { const updatedValues = values?.filter((val) => val.id !== id); onChange(updatedValues); }; useEffect(() => { const handleClick = (e) => { if (!e.target.closest(".sp-multiple-select-dnd-container")) { setToggleSelectField(false); } }; document.addEventListener("click", handleClick); return () => { document.removeEventListener("click", handleClick); }; }, []); const dndRef = useRef(null); // icons const DeleteIcon = () => { return ( ); }; const ArrowIconOne = () => ( ); const ArrowIconTwo = () => ( ); // dnd const onDragEnd = (result) => { setToggleSelectField(false); const { source, destination } = result; if (!destination) { return; } const from = source.index; const to = destination.index; const updatedArray = arrayMoveImmutable(values, from, to); onChange(updatedArray); optionOpen = true; }; const onDragStart = () => { optionOpen = false; setToggleSelectField(false); }; const toggleSelectFieldVal = () => { if (optionOpen) { setToggleSelectField((prev) => !prev); } }; const containerHeight = values?.length * 34 + 2 + "px"; return (
{label}
handleSelectField(option)} className={`sp-select-option ${ values === option.value ? "selected" : "" }`} > {option.label}
)}