react-awesome-query-builder-pd
Version:
User-friendly query builder for React. Demo: https://ukrbublik.github.io/react-awesome-query-builder
86 lines (75 loc) • 2.32 kB
JSX
import React from "react"
import IconButton from "@mui/material/IconButton"
import ExpandMoreIcon from "@mui/icons-material/ExpandMore"
import Popover from "@mui/material/Popover"
import Radio from "@mui/material/Radio"
import RadioGroup from "@mui/material/RadioGroup"
import FormControlLabel from "@mui/material/FormControlLabel"
import FormControl from "@mui/material/FormControl"
import FormLabel from "@mui/material/FormLabel"
import { makeStyles } from "@mui/styles"
const useStyles = makeStyles((theme) => ({
paper: {
padding: theme.spacing(1)
}
}))
export default ({ valueSources, valueSrc, title, setValueSrc, readonly }) => {
const [anchorEl, setAnchorEl] = React.useState(null)
const classes = useStyles()
const handleOpen = (event) => {
setAnchorEl(event.currentTarget)
}
const handleClose = () => {
setAnchorEl(null)
}
const toggleOpenClose = (event) => {
anchorEl ? handleClose() : handleOpen(event)
}
const handleChange = (e) => {
if (e.target.value === undefined) return
setValueSrc(e.target.value)
handleClose()
}
const renderOptions = (valueSources) =>
valueSources.map(([srcKey, info]) => (
<FormControlLabel
key={srcKey}
value={srcKey}
checked={valueSrc == srcKey || (!valueSrc && srcKey == "value")}
control={<Radio />}
label={info.label}
/>
))
const open = Boolean(anchorEl)
return (
<div>
<IconButton size="small" onClick={toggleOpenClose}>
<ExpandMoreIcon />
</IconButton>
<Popover
open={open}
anchorEl={anchorEl}
anchorOrigin={{
vertical: "bottom",
horizontal: "left"
}}
transformOrigin={{
vertical: "top",
horizontal: "left"
}}
onClose={handleClose}
classes={{
paper: classes.paper
}}
disablePortal
>
<FormControl component="fieldset">
{title && <FormLabel component="legend">{title}</FormLabel>}
<RadioGroup value={valueSrc || "value"} onChange={handleChange}>
{renderOptions(valueSources)}
</RadioGroup>
</FormControl>
</Popover>
</div>
)
}