import { useState, useRef, useEffect } from 'react' import { useSelector } from 'react-redux' import PropTypes from 'prop-types' // material-ui import { useTheme } from '@mui/material/styles' import { Accordion, AccordionSummary, AccordionDetails, Box, ClickAwayListener, Divider, InputAdornment, List, ListItemButton, ListItem, ListItemAvatar, ListItemText, OutlinedInput, Paper, Popper, Stack, Typography } from '@mui/material' import ExpandMoreIcon from '@mui/icons-material/ExpandMore' // third-party import PerfectScrollbar from 'react-perfect-scrollbar' // project imports import MainCard from 'ui-component/cards/MainCard' import Transitions from 'ui-component/extended/Transitions' import { StyledFab } from 'ui-component/button/StyledFab' // icons import { IconPlus, IconSearch, IconMinus } from '@tabler/icons' // const import { baseURL } from 'store/constant' // ==============================|| ADD NODES||============================== // const AddNodes = ({ nodesData, node }) => { const theme = useTheme() const customization = useSelector((state) => state.customization) const [searchValue, setSearchValue] = useState('') const [nodes, setNodes] = useState({}) const [open, setOpen] = useState(false) const [categoryExpanded, setCategoryExpanded] = useState({}) const anchorRef = useRef(null) const prevOpen = useRef(open) const ps = useRef() const scrollTop = () => { const curr = ps.current if (curr) { curr.scrollTop = 0 } } const filterSearch = (value) => { setSearchValue(value) setTimeout(() => { if (value) { const returnData = nodesData.filter((nd) => nd.name.toLowerCase().includes(value.toLowerCase())) groupByCategory(returnData, true) scrollTop() } else if (value === '') { groupByCategory(nodesData) scrollTop() } }, 500) } const groupByCategory = (nodes, isFilter) => { const accordianCategories = {} const result = nodes.reduce(function (r, a) { r[a.category] = r[a.category] || [] r[a.category].push(a) accordianCategories[a.category] = isFilter ? true : false return r }, Object.create(null)) setNodes(result) setCategoryExpanded(accordianCategories) } const handleAccordionChange = (category) => (event, isExpanded) => { const accordianCategories = { ...categoryExpanded } accordianCategories[category] = isExpanded setCategoryExpanded(accordianCategories) } const handleClose = (event) => { if (anchorRef.current && anchorRef.current.contains(event.target)) { return } setOpen(false) } const handleToggle = () => { setOpen((prevOpen) => !prevOpen) } const onDragStart = (event, node) => { event.dataTransfer.setData('application/reactflow', JSON.stringify(node)) event.dataTransfer.effectAllowed = 'move' } useEffect(() => { if (prevOpen.current === true && open === false) { anchorRef.current.focus() } prevOpen.current = open }, [open]) useEffect(() => { if (node) setOpen(false) }, [node]) useEffect(() => { if (nodesData) groupByCategory(nodesData) }, [nodesData]) return ( <> {open ? : } {({ TransitionProps }) => ( Add Nodes filterSearch(e.target.value)} placeholder='Search nodes' startAdornment={ } aria-describedby='search-helper-text' inputProps={{ 'aria-label': 'weight' }} /> { ps.current = el }} style={{ height: '100%', maxHeight: 'calc(100vh - 320px)', overflowX: 'hidden' }} > {Object.keys(nodes) .sort() .map((category) => ( } aria-controls={`nodes-accordian-${category}`} id={`nodes-accordian-header-${category}`} > {category} {nodes[category].map((node, index) => ( onDragStart(event, node)} draggable > {index === nodes[category].length - 1 ? null : } ))} ))} )} > ) } AddNodes.propTypes = { nodesData: PropTypes.array, node: PropTypes.object } export default AddNodes