@coocoon/react-awesome-query-builder
Version:
User-friendly query builder for React. Demo: https://ukrbublik.github.io/react-awesome-query-builder
89 lines (79 loc) • 2.81 kB
JSX
import React, { PureComponent } from "react";
import PropTypes from "prop-types";
import { Select } from "antd";
import {calcTextWidth, SELECT_WIDTH_OFFSET_RIGHT} from "../../../../utils/domUtils";
import {mapListValues} from "../../../../utils/stuff";
import {useOnPropsChanged} from "../../../../utils/reactUtils";
import omit from "lodash/omit";
const Option = Select.Option;
export default class MultiSelectWidget extends PureComponent {
static propTypes = {
setValue: PropTypes.func.isRequired,
config: PropTypes.object.isRequired,
value: PropTypes.array,
field: PropTypes.string.isRequired,
placeholder: PropTypes.string,
customProps: PropTypes.object,
fieldDefinition: PropTypes.object,
readonly: PropTypes.bool,
// from fieldSettings:
listValues: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
allowCustomValues: PropTypes.bool,
};
constructor(props) {
super(props);
useOnPropsChanged(this);
this.onPropsChanged(props);
}
onPropsChanged (props) {
const {listValues} = props;
let optionsMaxWidth = 0;
mapListValues(listValues, ({title, value}) => {
optionsMaxWidth = Math.max(optionsMaxWidth, calcTextWidth(title, null));
});
this.optionsMaxWidth = optionsMaxWidth;
this.options = mapListValues(listValues, ({title, value}) => {
return (<Option key={value} value={value}>{title}</Option>);
});
}
handleChange = (val) => {
if (val && !val.length)
val = undefined; //not allow []
this.props.setValue(val);
};
filterOption = (input, option) => {
const dataForFilter = option.children || option.value;
return dataForFilter.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
render() {
const {config, placeholder, allowCustomValues, customProps, value, readonly} = this.props;
const {renderSize} = config.settings;
const placeholderWidth = calcTextWidth(placeholder);
const aValue = value && value.length ? value : undefined;
const width = aValue ? null : placeholderWidth + SELECT_WIDTH_OFFSET_RIGHT;
const dropdownWidth = this.optionsMaxWidth + SELECT_WIDTH_OFFSET_RIGHT;
const customSelectProps = omit(customProps, ["showCheckboxes"]);
return (
<Select
disabled={readonly}
mode={allowCustomValues ? "tags" : "multiple"}
style={{
minWidth: width,
width: width,
}}
dropdownStyle={{
width: dropdownWidth,
}}
key={"widget-multiselect"}
dropdownMatchSelectWidth={false}
placeholder={placeholder}
size={renderSize}
value={aValue}
onChange={this.handleChange}
filterOption={this.filterOption}
{...customSelectProps}
>{this.options}
</Select>
);
}
}