import React from "react"; import { connect } from "react-redux"; import { FixedSizeList } from "react-window"; import SplitPane from "react-split-pane"; import { makeStyles, withStyles } from "@material-ui/core/styles"; import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; import Paper from "@material-ui/core/Paper"; import Typography from "@material-ui/core/Typography"; import Box from "@material-ui/core/Box"; import ExpandMoreIcon from "@material-ui/icons/ExpandMore"; import MuiAccordion from "@material-ui/core/Accordion"; import MuiAccordionSummary from "@material-ui/core/AccordionSummary"; import MuiAccordionDetails from "@material-ui/core/AccordionDetails"; import { socket } from "./connect"; import useResizeAware from "react-resize-aware"; import { getSelected } from "./redux/store"; import { selectedGraphPaths, setSelectedPath } from "./redux/graphPaths"; import OverflowTooltip from "./OverflowTooltip"; const rowHeight = 25; const Accordion = withStyles({ root: { border: "1px solid rgba(0, 0, 0, .125)", boxShadow: "none", "&:not(:last-child)": { borderBottom: 0, }, "&:before": { display: "none", }, "&$expanded": { margin: "auto", }, }, expanded: {}, })(MuiAccordion); const AccordionSummary = withStyles({ root: { backgroundColor: "rgba(0, 0, 0, .03)", borderBottom: "1px solid rgba(0, 0, 0, .125)", marginBottom: -1, minHeight: 56, "&$expanded": { minHeight: 56, }, }, content: { "&$expanded": { margin: "12px 0", }, }, expanded: {}, })(MuiAccordionSummary); const AccordionDetails = withStyles((theme) => ({ root: { padding: theme.spacing(2), }, }))(MuiAccordionDetails); const GraphPaths = ({ selectedNodes, graphPaths, setSelectedPath, width }) => { const [fromNode, setFromNode] = React.useState(""); const [toNode, setToNode] = React.useState(""); const [fromNodeId, setFromNodeId] = React.useState(0); const [toNodeId, setToNodeId] = React.useState(0); const [fromNodeExpanded, setFromNodeExpanded] = React.useState(false); const [toNodeExpanded, setToNodeExpanded] = React.useState(false); const [paneSize, setPaneSize] = React.useState("50%"); const [fromResizeListener, fromSizes] = useResizeAware(); const [toResizeListener, toSizes] = useResizeAware(); const useStyles = makeStyles((theme) => ({ root: { width: "100%", maxWidth: width, backgroundColor: theme.palette.background.paper, }, nested: { paddingLeft: theme.spacing(4), }, listItem: { width: width, }, })); const classes = useStyles(); function toNodeRow({ index, style, data }) { return ( { setToNode(data[index].name); setToNodeId(index); setToNodeExpanded(false); setPaneSize("50%"); if (fromNode != "" && data[fromNodeId]) { const nodes = { fromNode: data[fromNodeId].node, toNode: data[index].node, }; socket.emit("receive_graph_paths", nodes); } }} > ); } function fromNodeRow({ index, style, data }) { return ( { setFromNode(data[index].name); setFromNodeId(index); setFromNodeExpanded(false); setPaneSize("50%"); if (toNode != "" && data[toNodeId]) { const nodes = { fromNode: data[index].node, toNode: data[toNodeId].node, }; socket.emit("receive_graph_paths", nodes); } }} > ); } function pathRow({ index, style, data }) { return ( { setSelectedPath(index); }} > ); } function listHeight(numItems, minHeight, maxHeight) { const size = numItems * rowHeight; if (size > maxHeight) { return maxHeight; } if (size < minHeight) { return minHeight; } return size; } const handleToChange = (panel) => (event, newExpanded) => { setPaneSize(newExpanded ? "0%" : "50%"); setToNodeExpanded(newExpanded ? panel : false); }; const handleFromChange = (panel) => (event, newExpanded) => { setPaneSize(newExpanded ? "100%" : "50%"); setFromNodeExpanded(newExpanded ? panel : false); }; return ( } aria-controls="panel1a-content" id="panel1a-header" > From Node: {fromResizeListener} {fromNode} {fromNodeRow} } aria-controls="panel1a-content" id="panel1a-header" > To Node: {toResizeListener} {toNode} {toNodeRow} Num Paths: {graphPaths.paths.length}{" "} {pathRow} ); }; export default connect(getSelected, { selectedGraphPaths, setSelectedPath })( GraphPaths );