UNPKG

reactjs-query-builder

Version:
500 lines (395 loc) 17.8 kB
'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;