UNPKG

react-awesome-query-builder-pd

Version:

User-friendly query builder for React. Demo: https://ukrbublik.github.io/react-awesome-query-builder

78 lines (72 loc) 2.22 kB
import React from "react" import Select from "@mui/material/Select" import MenuItem from "@mui/material/MenuItem" import ListSubheader from "@mui/material/ListSubheader" import FormControl from "@mui/material/FormControl" import InputLabel from "@mui/material/InputLabel" export default (props) => { const { items, setField, selectedKey, readonly, placeholder } = props const renderOptions = (fields, level = 0) => Object.keys(fields).map((fieldKey) => { const field = fields[fieldKey] const { items, path, label, disabled } = field const prefix = "\u00A0\u00A0".repeat(level) if (items) { return [ <ListSubheader disabled={disabled} key={path} disableSticky={true}> {label} </ListSubheader>, renderOptions(items, level + 1) ] } else { return ( <MenuItem disabled={disabled} key={path} value={path}> {prefix && <span>{prefix}</span>} {label} </MenuItem> ) } }) const onChange = (e) => { if (e.target.value === undefined) return setField(e.target.value) } const renderValue = (selectedValue) => { if (!readonly && !selectedValue) return placeholder const findLabel = (fields) => { return fields.map((field) => { if (!field.items) return field.path === selectedValue ? field.label : null return findLabel(field.items) }) } return findLabel(items) .filter((v) => { if (Array.isArray(v)) { return v.some((value) => value !== null) } else { return v !== null } }) .pop() } const hasValue = selectedKey != null return ( <FormControl> <InputLabel id="select-field-label"> {readonly ? placeholder : ""} </InputLabel> <Select autoWidth displayEmpty labelId="select-field-label" onChange={onChange} value={hasValue ? selectedKey : ""} disabled={readonly} renderValue={renderValue} > {renderOptions(items)} </Select> </FormControl> ) }