@coocoon/react-awesome-query-builder
Version:
User-friendly query builder for React. Demo: https://ukrbublik.github.io/react-awesome-query-builder
255 lines (240 loc) • 6.62 kB
JavaScript
import en_US from "antd/lib/locale-provider/en_US";
import AntdWidgets from "../../components/widgets/antd";
import BasicConfig, { stringifyForDisplay } from "../basic";
import { getTitleInListValues } from "../../utils/stuff";
import { SqlString, spelEscape } from "../../utils/export";
import React from "react";
const {
FieldSelect,
FieldDropdown,
FieldCascader,
FieldTreeSelect,
Button,
ButtonGroup,
Conjs,
Switch,
ValueSources,
Provider,
confirm,
} = AntdWidgets;
const {
TextWidget,
TextAreaWidget,
NumberWidget,
SliderWidget,
RangeWidget,
SelectWidget,
MultiSelectWidget,
AutocompleteWidget,
TreeSelectWidget,
DateWidget,
BooleanWidget,
TimeWidget,
DateTimeWidget,
} = AntdWidgets;
const settings = {
...BasicConfig.settings,
renderField: (props) => <FieldSelect {...props} />,
// renderField: (props) => <FieldDropdown {...props} />,
// renderField: (props) => <FieldCascader {...props} />,
// renderField: (props) => <FieldTreeSelect {...props} />,
renderOperator: (props) => <FieldSelect {...props} />,
// renderOperator: (props) => <FieldDropdown {...props} />,
renderFunc: (props) => <FieldSelect {...props} />,
renderConjs: (props) => <Conjs {...props} />,
renderSwitch: (props) => <Switch {...props} />,
renderButton: (props) => <Button {...props} />,
renderButtonGroup: (props) => <ButtonGroup {...props} />,
renderValueSources: (props) => <ValueSources {...props} />,
renderProvider: (props) => <Provider {...props} />,
renderConfirm: confirm,
// localization
locale: {
...BasicConfig.settings.locale,
antd: en_US,
},
};
const widgets = {
...BasicConfig.widgets,
text: {
...BasicConfig.widgets.text,
factory: (props) => <TextWidget {...props} />,
},
textarea: {
...BasicConfig.widgets.textarea,
factory: (props) => <TextAreaWidget {...props} />,
},
number: {
...BasicConfig.widgets.number,
factory: (props) => <NumberWidget {...props} />,
},
multiselect: {
...BasicConfig.widgets.multiselect,
factory: (props) => {
return (props.asyncFetch || props.showSearch)
? <AutocompleteWidget multiple {...props} />
: <MultiSelectWidget {...props} />;
},
},
select: {
...BasicConfig.widgets.select,
factory: (props) => {
return (props.asyncFetch || props.showSearch)
? <AutocompleteWidget {...props} />
: <SelectWidget {...props} />;
},
},
slider: {
...BasicConfig.widgets.slider,
factory: (props) => <SliderWidget {...props} />,
},
boolean: {
...BasicConfig.widgets.boolean,
factory: (props) => <BooleanWidget {...props} />,
},
date: {
...BasicConfig.widgets.date,
factory: (props) => <DateWidget {...props} />,
},
time: {
...BasicConfig.widgets.time,
factory: (props) => <TimeWidget {...props} />,
},
datetime: {
...BasicConfig.widgets.datetime,
factory: (props) => <DateTimeWidget {...props} />,
},
rangeslider: {
type: "number",
jsType: "number",
valueSrc: "value",
factory: (props) => <RangeWidget {...props} />,
valueLabel: "Range",
valuePlaceholder: "Select range",
valueLabels: [
{ label: "Number from", placeholder: "Enter number from" },
{ label: "Number to", placeholder: "Enter number to" },
],
formatValue: (val, fieldDef, wgtDef, isForDisplay) => {
return isForDisplay ? stringifyForDisplay(val) : JSON.stringify(val);
},
sqlFormatValue: (val, fieldDef, wgtDef, op, opDef) => {
return SqlString.escape(val);
},
spelFormatValue: (val) => spelEscape(val),
singleWidget: "slider",
toJS: (val, fieldSettings) => (val),
},
treeselect: {
type: "treeselect",
jsType: "string",
valueSrc: "value",
factory: (props) => <TreeSelectWidget {...props} />,
valueLabel: "Value",
valuePlaceholder: "Select value",
formatValue: (val, fieldDef, wgtDef, isForDisplay) => {
let valLabel = getTitleInListValues(fieldDef.fieldSettings.listValues || fieldDef.asyncListValues, val);
return isForDisplay ? stringifyForDisplay(valLabel) : JSON.stringify(val);
},
sqlFormatValue: (val, fieldDef, wgtDef, op, opDef) => {
return SqlString.escape(val);
},
spelFormatValue: (val) => spelEscape(val),
toJS: (val, fieldSettings) => (val),
},
treemultiselect: {
type: "treemultiselect",
jsType: "array",
valueSrc: "value",
factory: (props) => <TreeSelectWidget {...props} treeMultiple={true} />,
valueLabel: "Values",
valuePlaceholder: "Select values",
formatValue: (vals, fieldDef, wgtDef, isForDisplay) => {
let valsLabels = vals.map(v => getTitleInListValues(fieldDef.fieldSettings.listValues || fieldDef.asyncListValues, v));
return isForDisplay ? valsLabels.map(stringifyForDisplay) : vals.map(JSON.stringify);
},
sqlFormatValue: (vals, fieldDef, wgtDef, op, opDef) => {
return vals.map(v => SqlString.escape(v));
},
spelFormatValue: (val) => spelEscape(val),
toJS: (val, fieldSettings) => (val),
},
};
const types = {
...BasicConfig.types,
number: {
...BasicConfig.types.number,
widgets: {
...BasicConfig.types.number.widgets,
rangeslider: {
opProps: {
between: {
isSpecialRange: true,
},
not_between: {
isSpecialRange: true,
}
},
operators: [
"between",
"not_between",
"is_null",
"is_not_null",
],
}
},
},
date: {
...BasicConfig.types.date,
widgets: {
date: {
...BasicConfig.types.date.widgets.date,
opProps: {
between: {
isSpecialRange: true,
textSeparators: [null, null],
},
not_between: {
isSpecialRange: true,
textSeparators: [null, null],
}
},
}
},
},
treeselect: {
mainWidget: "treeselect",
defaultOperator: "select_equals",
widgets: {
treeselect: {
operators: [
"select_equals",
"select_not_equals"
],
},
treemultiselect: {
operators: [
"select_any_in",
"select_not_any_in"
],
},
},
},
treemultiselect: {
defaultOperator: "multiselect_equals",
widgets: {
treemultiselect: {
operators: [
"multiselect_equals",
"multiselect_not_equals",
],
}
},
},
};
export default {
...BasicConfig,
types,
widgets,
settings,
};