@coocoon/react-awesome-query-builder
Version:
User-friendly query builder for React. Demo: https://ukrbublik.github.io/react-awesome-query-builder
120 lines (105 loc) • 3.33 kB
JSX
import React, { PureComponent } from "react";
import PropTypes from "prop-types";
import { DatePicker } from "antd";
const { RangePicker } = DatePicker;
import moment from "moment";
export default class DateWidget extends PureComponent {
static propTypes = {
setValue: PropTypes.func.isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]) , //in valueFormat
field: PropTypes.string.isRequired,
config: PropTypes.object.isRequired,
placeholder: PropTypes.string,
placeholders: PropTypes.arrayOf(PropTypes.string),
customProps: PropTypes.object,
readonly: PropTypes.bool,
// from fieldSettings:
dateFormat: PropTypes.string,
valueFormat: PropTypes.string,
};
constructor(props) {
super(props);
const {value, setValue} = props;
if (!this.isValidValue(value)) {
setValue(this.formatValue(this.getMomentValue(value)));
}
}
static defaultProps = {
dateFormat: "YYYY-MM-DD",
valueFormat: "YYYY-MM-DD",
};
isValidSingleValue = (value) => {
const {valueFormat} = this.props;
let v = value ? moment(value, valueFormat) : null;
return !v || v && v.isValid();
};
isValidValue = (value) => {
const {isSpecialRange} = this.props;
if (isSpecialRange)
return value ? value.map(el => this.isValidSingleValue(el)).reduce((res, item) => (res && item), true) : true;
else
return this.isValidSingleValue(value);
};
getMomentSingleValue = (value) => {
const {valueFormat} = this.props;
let v = value ? moment(value, valueFormat) : null;
if (v && !v.isValid())
v = null;
return v;
};
getMomentValue = (value) => {
const {isSpecialRange} = this.props;
if (isSpecialRange)
return value ? value.map(el => this.getMomentSingleValue(el)) : [null, null];
else
return this.getMomentSingleValue(value);
};
formatSingleValue = (value) => {
const {valueFormat} = this.props;
return value && value.isValid() ? value.format(valueFormat) : undefined;
};
formatValue = (value) => {
const {isSpecialRange} = this.props;
if (isSpecialRange)
return value ? value.map(el => this.formatSingleValue(el)) : [undefined, undefined];
else
return this.formatSingleValue(value);
};
handleChange = (value) => {
const {setValue} = this.props;
if (this.isValidValue(value))
setValue(this.formatValue(value));
};
render() {
const {placeholder, placeholders, customProps, value, dateFormat, config, readonly, isSpecialRange} = this.props;
const {renderSize} = config.settings;
const dateValue = this.getMomentValue(value);
if (isSpecialRange) {
return (
<RangePicker
disabled={readonly}
key="widget-date"
placeholder={placeholders}
size={renderSize}
format={dateFormat}
value={dateValue}
onChange={this.handleChange}
{...customProps}
/>
);
} else {
return (
<DatePicker
disabled={readonly}
key="widget-date"
placeholder={placeholder}
size={renderSize}
format={dateFormat}
value={dateValue}
onChange={this.handleChange}
{...customProps}
/>
);
}
}
}