reactjs-query-builder
Version:
500 lines (395 loc) • 17.8 kB
JavaScript
'use strict';
exports.__esModule = true;
exports.default = undefined;
var _datePicker = require('antd/lib/date-picker');
var _datePicker2 = _interopRequireDefault(_datePicker);
var _switch = require('antd/lib/switch');
var _switch2 = _interopRequireDefault(_switch);
var _inputNumber = require('antd/lib/input-number');
var _inputNumber2 = _interopRequireDefault(_inputNumber);
var _input = require('antd/lib/input');
var _input2 = _interopRequireDefault(_input);
var _popover = require('antd/lib/popover');
var _popover2 = _interopRequireDefault(_popover);
var _icon = require('antd/lib/icon');
var _icon2 = _interopRequireDefault(_icon);
var _radio = require('antd/lib/radio');
var _radio2 = _interopRequireDefault(_radio);
var _select = require('antd/lib/select');
var _select2 = _interopRequireDefault(_select);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _class, _temp2;
require('antd/lib/date-picker/style/css');
require('antd/lib/switch/style/css');
require('antd/lib/input-number/style/css');
require('antd/lib/input/style/css');
require('antd/lib/popover/style/css');
require('antd/lib/icon/style/css');
require('antd/lib/radio/style/css');
require('antd/lib/select/style/css');
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _last = require('lodash/last');
var _last2 = _interopRequireDefault(_last);
var _keys = require('lodash/keys');
var _keys2 = _interopRequireDefault(_keys);
var _clone = require('clone');
var _clone2 = _interopRequireDefault(_clone);
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _reactAddonsShallowCompare = require('react-addons-shallow-compare');
var _reactAddonsShallowCompare2 = _interopRequireDefault(_reactAddonsShallowCompare);
var _configUtils = require('../../utils/configUtils');
var _stuff = require('../../utils/stuff');
var _FieldFunctionValueSrc = require('../FieldFunctionValueSrc');
var _FieldFunctionValueSrc2 = _interopRequireDefault(_FieldFunctionValueSrc);
var _FieldConstantValueSrc = require('../FieldConstantValueSrc');
var _FieldConstantValueSrc2 = _interopRequireDefault(_FieldConstantValueSrc);
var _constants = require('../../constants');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Option = _select2.default.Option;
var RadioButton = _radio2.default.Button;
var RadioGroup = _radio2.default.Group;
var ValueFunction = (_temp2 = _class = function (_Component) {
_inherits(ValueFunction, _Component);
function ValueFunction() {
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, ValueFunction);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = ValueFunction.__proto__ || Object.getPrototypeOf(ValueFunction)).call.apply(_ref, [this].concat(args))), _this), _this.shouldComponentUpdate = _reactAddonsShallowCompare2.default, _this.initDataForParams = function (functionSelected) {
var params = functionSelected.params;
return params.map(function (item) {
switch (item) {
case _constants.DATA_TYPE.TEXT:
return '';
case _constants.DATA_TYPE.NUMBER:
return 0;
case _constants.DATA_TYPE.BOOL:
return false;
case _constants.DATA_TYPE.DATE:
return (0, _moment2.default)().toISOString();
default:
return null;
}
});
}, _this.handleFieldSelect = function (key) {
var functionSelected = _this.props.config.functions[key];
_this.props.setValue({ parameters: _this.initDataForParams(functionSelected), functionSelected: functionSelected.functionName, valueSrc: [], key: key });
}, _this.buildOptionItems = function (functions) {
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
var functionSeparator = _this.props.config.settings.fieldSeparator;
var maxLabelsLength = _this.props.config.settings.maxLabelsLength || 100;
var prefix = path ? path.join(functionSeparator) + functionSeparator : '';
if (!functions) {
return null;
}
return (0, _keys2.default)(functions).map(function (functionKey) {
var functionSelect = functions[functionKey];
var label = functionSelect.functionName || (0, _last2.default)(functionKey.split(functionSeparator));
label = (0, _stuff.truncateString)(label, maxLabelsLength);
return _react2.default.createElement(
Option,
{
key: prefix + functions[functionKey].key,
value: prefix + functions[functionKey].key
},
label
);
});
}, _this.handleChange = function (value, index, dataType) {
var valueChange = value;
var valueFunctionSelect = (0, _clone2.default)(_this.props.value);
if (dataType === _constants.DATA_TYPE.TEXT) {
valueChange = value.target.value;
}
if (dataType === _constants.DATA_TYPE.DATE && valueChange) {
valueChange = value.toISOString();
}
valueFunctionSelect.parameters[index] = valueChange;
_this.props.setValue(_extends({}, valueFunctionSelect));
}, _this.handleChangePopover = function (_ref2, index) {
var target = _ref2.target;
var valueFunctionSelect = (0, _clone2.default)(_this.props.value);
valueFunctionSelect.valueSrc[index] = target.value;
valueFunctionSelect.parameters[index] = '';
_this.props.setValue(_extends({}, valueFunctionSelect));
}, _this.renderValueSources = function (index) {
var _this$props = _this.props,
config = _this$props.config,
field = _this$props.field,
operator = _this$props.operator,
value = _this$props.value;
var valueSourcesInfo = config.settings.valueSourcesInfo;
var valueSourcesPopupTitle = config.settings.valueSourcesPopupTitle;
var valueSources = (0, _configUtils.getValueSourcesForFieldOp)(config, field, operator);
var valueSrc = value && value.valueSrc && value.valueSrc[index] || null;
if (!valueSources) {
return null;
}
var content = _react2.default.createElement(
RadioGroup,
{
value: valueSrc || 'value',
size: _this.props.config.settings.renderSize || 'small',
onChange: function onChange(value) {
return _this.handleChangePopover(value, index);
}
},
valueSources.filter(function (valueSource) {
return valueSource !== 'function';
}).map(function (srcKey) {
return _react2.default.createElement(
RadioButton,
{
key: srcKey,
value: srcKey
},
valueSourcesInfo[srcKey].label
);
})
);
return _react2.default.createElement(
_popover2.default,
{
className: 'popover-function',
title: valueSourcesPopupTitle,
content: content
},
_react2.default.createElement(_icon2.default, { type: 'ellipsis' })
);
}, _this.renderValueSourceParam = function (index, dataTypeOfParam) {
var _this$props2 = _this.props,
config = _this$props2.config,
value = _this$props2.value,
operator = _this$props2.operator,
field = _this$props2.field;
var valueSource = value && value.valueSrc[index] || 'value';
switch (valueSource) {
case _constants.VALUE_SOURCE_FUNCTION.FIELD:
return _react2.default.createElement(_FieldFunctionValueSrc2.default, {
value: value,
field: field,
config: config,
operator: operator,
dataTypeOfParam: dataTypeOfParam,
valueSelected: _this.props.value.parameters[index],
handleChangeValue: function handleChangeValue(value) {
return _this.handleChange(value, index, _constants.VALUE_SOURCE_FUNCTION.FIELD);
}
});
case _constants.VALUE_SOURCE_FUNCTION.CONSTANT:
return _react2.default.createElement(_FieldConstantValueSrc2.default, {
field: field,
config: config,
value: _this.props.value.parameters[index],
handleChangeValueConstant: function handleChangeValueConstant(value) {
return _this.handleChange(value, index, _constants.VALUE_SOURCE_FUNCTION.CONSTANT);
}
});
case _constants.VALUE_SOURCE_FUNCTION.VALUE:
return _this.filterUIForValueSource(dataTypeOfParam, index);
default:
return _this.filterUIForValueSource(dataTypeOfParam, index);
}
}, _this.filterUIForValueSource = function (dataType, index) {
switch (dataType) {
case _constants.DATA_TYPE.TEXT:
return _react2.default.createElement(_input2.default, {
value: _this.props.value && _this.props.value.parameters[index] || '',
size: _this.props.config.settings.renderSize || 'small',
onChange: function onChange(value) {
return _this.handleChange(value, index, dataType);
},
style: { marginLeft: '8px', width: '134px' },
placeholder: 'Input value'
});
case _constants.DATA_TYPE.NUMBER:
return _react2.default.createElement(_inputNumber2.default, {
key: index,
value: _this.props.value && _this.props.value.parameters[index] || 0,
size: _this.props.config.settings.renderSize || 'small',
onChange: function onChange(value) {
return _this.handleChange(value, index, dataType);
},
style: { marginLeft: '8px' },
placeholder: 'Input value'
});
case _constants.DATA_TYPE.BOOL:
return _react2.default.createElement(_switch2.default, {
checked: _this.props.value && _this.props.value.parameters[index] || false,
defaultChecked: false,
style: { marginLeft: '8px' },
onChange: function onChange(value) {
return _this.handleChange(value, index, dataType);
}
});
case _constants.DATA_TYPE.DATE:
return _react2.default.createElement(_datePicker2.default, {
style: { marginLeft: '8px' },
value: _this.props.value && (0, _moment2.default)(_this.props.value.parameters[index]) || undefined,
onChange: function onChange(value) {
return _this.handleChange(value, index, dataType);
},
allowClear: true
});
default:
return _react2.default.createElement(_input2.default, {
value: _this.props.value && _this.props.value.parameters[index] || '',
size: _this.props.config.settings.renderSize || 'small',
onChange: function onChange(value) {
return _this.handleChange(value, index, dataType);
},
style: { marginLeft: '8px', width: '134px' },
placeholder: 'Input value'
});
}
}, _this.renderFunctionParams = function (functionSelected) {
if (!functionSelected) {
return;
}
var key = functionSelected.key,
params = functionSelected.params;
return params.map(function (dataTypeOfParam, index) {
return _react2.default.createElement(
'div',
{ className: 'widget--function', key: key + '--' + index },
_this.renderValueSources(index),
_this.renderValueSourceParam(index, dataTypeOfParam)
);
});
}, _this.filterFunctions = function (config, leftFieldFullkey) {
var leftFieldConfig = (0, _configUtils.getFieldConfig)(leftFieldFullkey, config);
var functions = config.functions;
// Get functions of field config
var type = leftFieldConfig.type;
var functionsOfField = Object.keys(functions).map(function (key) {
return functions[key].type === type ? functions[key] : undefined;
}).filter(function (func) {
return func;
});
if (!functionsOfField.length) {
return [];
}
return functionsOfField;
}, _this.filterOption = function (input, option) {
return option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0;
}, _this.getFunctionInit = function (functionKey, config) {
var functions = config.functions;
var result = functions[functionKey] ? functions[functionKey] : null;
var renderParams = _this.renderFunctionParams(result);
return renderParams;
}, _this.testRender = function (type) {
if (type === 'field') {
return _react2.default.createElement(
'label',
null,
'asdasd'
);
}
if (type === 'value') {
return _react2.default.createElement('input', null);
}
}, _this.renderAsSelect = function () {
var _this$props3 = _this.props,
value = _this$props3.value,
config = _this$props3.config,
field = _this$props3.field;
var placeholder = _this.props.config.settings.functionPlaceholder;
var fieldOptions = _this.filterFunctions(config, field);
var customProps = _this.props.customProps || {};
var buildOptionItems = _this.buildOptionItems(fieldOptions);
var initParamsInput = _this.props.value && _this.getFunctionInit(value.key, config);
return _react2.default.createElement(
'div',
{ className: 'widget--valuesrc--function' },
_react2.default.createElement(
_select2.default,
_extends({
value: value && value.key || undefined,
style: { width: '200px' },
ref: 'function',
placeholder: placeholder,
size: _this.props.config.settings.renderSize || 'small',
onChange: _this.handleFieldSelect,
filterOption: _this.filterOption
}, customProps),
buildOptionItems
),
_this.testRender(value.valueSrc[0] || 'value')
);
}, _temp), _possibleConstructorReturn(_this, _ret);
}
/**
* @key key function
* Handle change select
*/
/**
* @functions info of functions (type, key, params,...)
* Render list function in select
*/
/**
* @value onchange field input
* @index position of field input
* @dataType data type of field input
*/
/**
* @value value of group button
* @index position of popover
* Handle change popover value source
*/
/**
* @index position of radio group button
* Render popover
*/
/**
* @index position index of params, valueSrc
* @dataTypeOfParam data type of param
* Render control antd by valueSrc
*/
/**
* @dataType Data type of parameter
* @index Position of parameter
* Return UI of parameter
*/
/**
* @config in file config
* @leftFieldFullkey info of field
* @operator operator of field
* Filter function by type
*/
/**
* @input value search
* @option element select
*/
/**
* @functionKey key of function selected
* @config info in file config
*/
/**
* Render select functions
*/
_createClass(ValueFunction, [{
key: 'render',
value: function render() {
return this.renderAsSelect();
}
}]);
return ValueFunction;
}(_react.Component), _class.propTypes = {
setValue: _propTypes2.default.func.isRequired,
config: _propTypes2.default.object.isRequired,
field: _propTypes2.default.string.isRequired,
value: _propTypes2.default.object,
operator: _propTypes2.default.string,
customProps: _propTypes2.default.object
}, _temp2);
exports.default = ValueFunction;