@coocoon/react-awesome-query-builder
Version:
User-friendly query builder for React. Demo: https://ukrbublik.github.io/react-awesome-query-builder
77 lines (69 loc) • 2.43 kB
JSX
import React, { PureComponent } from "react";
import PropTypes from "prop-types";
import { Cascader, Tooltip } from "antd";
import {removePrefixPath} from "../../../../utils/stuff";
export default class FieldCascader extends PureComponent {
static propTypes = {
config: PropTypes.object.isRequired,
customProps: PropTypes.object,
items: PropTypes.array.isRequired,
placeholder: PropTypes.string,
selectedKey: PropTypes.string,
selectedKeys: PropTypes.array,
selectedPath: PropTypes.array,
selectedLabel: PropTypes.string,
selectedAltLabel: PropTypes.string,
selectedFullLabel: PropTypes.string,
selectedOpts: PropTypes.object,
readonly: PropTypes.bool,
//actions
setField: PropTypes.func.isRequired,
};
onChange = (keys) => {
const { parentField } = this.props;
const dotNotationToPath = str => str.split(".");
const parentPath = parentField ? dotNotationToPath(parentField) : [];
this.props.setField([...parentPath, ...keys]);
};
filterOption = (inputValue, path) => {
const keysForFilter = ["label", "key", "altLabel"];
return path.some(option => (
keysForFilter.map(k => option[k]).join("\0").toLowerCase().indexOf(inputValue.toLowerCase()) > -1
));
};
render() {
const {
config, customProps, items, placeholder,
selectedPath, selectedLabel, selectedOpts, selectedAltLabel, selectedFullLabel, readonly, selectedField, parentField,
} = this.props;
let customProps2 = {...customProps};
if (customProps2.showSearch) {
customProps2.showSearch = {
filter: this.filterOption
};
}
const {fieldSeparator} = config.settings;
const parentFieldPath = parentField ? parentField.split(fieldSeparator) : [];
const value = removePrefixPath(selectedPath, parentFieldPath);
let res = (
<Cascader
fieldNames={{ label: "label", value: "key", children: "items" }}
options={items}
value={value}
onChange={this.onChange}
allowClear={false}
placeholder={placeholder}
size={config.settings.renderSize}
disabled={readonly}
{...customProps2}
/>
);
let tooltipText = selectedOpts.tooltip || selectedAltLabel;
if (tooltipText == selectedLabel)
tooltipText = null;
if (tooltipText) {
res = <Tooltip title={tooltipText}>{res}</Tooltip>;
}
return res;
}
}