UNPKG

@coocoon/react-awesome-query-builder

Version:

User-friendly query builder for React. Demo: https://ukrbublik.github.io/react-awesome-query-builder

380 lines (317 loc) 16.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _range = _interopRequireDefault(require("lodash/range")); var _configUtils = require("../../utils/configUtils"); var _ruleUtils = require("../../utils/ruleUtils"); var _stuff = require("../../utils/stuff"); var _reactUtils = require("../../utils/reactUtils"); var _pick = _interopRequireDefault(require("lodash/pick")); var _immutable = _interopRequireDefault(require("immutable")); var _WidgetFactory = _interopRequireDefault(require("./WidgetFactory")); var _utils = require("../utils"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var funcArgDummyOpDef = { cardinality: 1 }; var Widget = /*#__PURE__*/function (_PureComponent) { (0, _inherits2["default"])(Widget, _PureComponent); var _super = _createSuper(Widget); function Widget(_props) { var _this; (0, _classCallCheck2["default"])(this, Widget); _this = _super.call(this, _props); _this._setValue = function (isSpecialRange, delta, widgetType, value, asyncListValues, __isInternal) { if (isSpecialRange && Array.isArray(value)) { var oldRange = [_this.props.value.get(0), _this.props.value.get(1)]; if (oldRange[0] != value[0]) _this.props.setValue(0, value[0], widgetType, asyncListValues, __isInternal); if (oldRange[1] != value[1]) _this.props.setValue(1, value[1], widgetType, asyncListValues, __isInternal); } else { _this.props.setValue(delta, value, widgetType, asyncListValues, __isInternal); } }; _this._onChangeValueSrc = function (delta, srcKey) { _this.props.setValueSrc(delta, srcKey); }; _this.getFieldConfigFromFunc = function (config, field) {}; _this.renderWidget = function (delta, meta, props) { var config = props.config, isFuncArg = props.isFuncArg, leftField = props.leftField, operator = props.operator, values = props.value, valueError = props.valueError, readonly = props.readonly, parentField = props.parentField, parentFuncs = props.parentFuncs, id = props.id, groupId = props.groupId; var settings = config.settings; var widgets = meta.widgets, iValues = meta.iValues, aField = meta.aField; var value = isFuncArg ? iValues : values; var field = isFuncArg ? leftField : aField; var _widgets$delta = widgets[delta], valueSrc = _widgets$delta.valueSrc, valueLabel = _widgets$delta.valueLabel; var widgetLabel = settings.showLabels ? /*#__PURE__*/_react["default"].createElement("label", { className: "rule--label" }, valueLabel.label) : null; return /*#__PURE__*/_react["default"].createElement("div", { key: "widget-" + field + "-" + delta, className: "widget--widget" }, valueSrc == "func" ? null : widgetLabel, /*#__PURE__*/_react["default"].createElement(_WidgetFactory["default"], (0, _extends2["default"])({ id: id, groupId: groupId, valueSrc: valueSrc, delta: delta, value: value, valueError: valueError, isFuncArg: isFuncArg }, (0, _pick["default"])(meta, ["isSpecialRange", "fieldDefinition", "asyncListValues"]), (0, _pick["default"])(widgets[delta], ["widget", "widgetDefinition", "widgetValueLabel", "valueLabels", "textSeparators", "setValueHandler"]), { config: config, field: field, parentField: parentField, parentFuncs: parentFuncs, operator: operator, readonly: readonly }))); }; _this.renderValueSources = function (delta, meta, props) { var config = props.config, isFuncArg = props.isFuncArg, leftField = props.leftField, operator = props.operator, readonly = props.readonly; var settings = config.settings; var valueSources = meta.valueSources, widgets = meta.widgets, aField = meta.aField; var field = isFuncArg ? leftField : aField; var _widgets$delta2 = widgets[delta], valueSrc = _widgets$delta2.valueSrc, setValueSrcHandler = _widgets$delta2.setValueSrcHandler; var valueSourcesInfo = settings.valueSourcesInfo, ValueSources = settings.renderValueSources; var valueSourcesOptions = valueSources.map(function (srcKey) { return [srcKey, { label: valueSourcesInfo[srcKey].label }]; }); var sourceLabel = settings.showLabels ? /*#__PURE__*/_react["default"].createElement("label", { className: "rule--label" }, "\xA0") : null; return valueSources.length > 1 && !readonly && /*#__PURE__*/_react["default"].createElement("div", { key: "valuesrc-" + field + "-" + delta, className: "widget--valuesrc" }, sourceLabel, /*#__PURE__*/_react["default"].createElement(ValueSources, { key: "valuesrc-" + delta, delta: delta, valueSources: valueSourcesOptions, valueSrc: valueSrc, config: config, field: field, operator: operator, setValueSrc: setValueSrcHandler, readonly: readonly, title: settings.valueSourcesPopupTitle })); }; _this.renderSep = function (delta, meta, props) { var config = props.config; var widgets = meta.widgets; var settings = config.settings; var sepText = widgets[delta].sepText; var sepLabel = settings.showLabels ? /*#__PURE__*/_react["default"].createElement("label", { className: "rule--label" }, "\xA0") : null; return sepText && /*#__PURE__*/_react["default"].createElement("div", { key: "widget-separators-" + delta, className: "widget--sep" }, sepLabel, /*#__PURE__*/_react["default"].createElement("span", null, sepText)); }; _this.renderWidgetDelta = function (delta) { var sep = _this.renderSep(delta, _this.meta, _this.props); var sources = _this.renderValueSources(delta, _this.meta, _this.props); var widgetCmp = _this.renderWidget(delta, _this.meta, _this.props); return [sep, sources, widgetCmp]; }; (0, _reactUtils.useOnPropsChanged)((0, _assertThisInitialized2["default"])(_this)); _this.onPropsChanged(_props); return _this; } (0, _createClass2["default"])(Widget, [{ key: "onPropsChanged", value: function onPropsChanged(nextProps) { var prevProps = this.props; var keysForMeta = ["config", "field", "fieldFunc", "fieldArg", "leftField", "operator", "valueSrc", "isFuncArg", "asyncListValues"]; var needUpdateMeta = !this.meta || keysForMeta.map(function (k) { return nextProps[k] !== prevProps[k] //tip: for isFuncArg we need to wrap value in Imm list || k == "isFuncArg" && nextProps["isFuncArg"] && nextProps["value"] !== prevProps["value"]; }).filter(function (ch) { return ch; }).length > 0; if (needUpdateMeta) { this.meta = this.getMeta(nextProps); } } }, { key: "getMeta", value: function getMeta(_ref) { var _this2 = this; var config = _ref.config, simpleField = _ref.field, fieldFunc = _ref.fieldFunc, fieldArg = _ref.fieldArg, operator = _ref.operator, valueSrcs = _ref.valueSrc, values = _ref.value, isForRuleGruop = _ref.isForRuleGruop, isCaseValue = _ref.isCaseValue, isFuncArg = _ref.isFuncArg, leftField = _ref.leftField, asyncListValues = _ref.asyncListValues, isFunc = _ref.isFunc; var field = isFuncArg ? { func: fieldFunc, arg: fieldArg } : simpleField; var iValueSrcs = valueSrcs; var iValues = values; if (isFuncArg || isForRuleGruop || isCaseValue) { iValueSrcs = _immutable["default"].List([valueSrcs]); iValues = _immutable["default"].List([values]); } var fieldDefinition = (0, _configUtils.getFieldConfig)(config, field, isFunc); var defaultWidget = (0, _ruleUtils.getWidgetForFieldOp)(config, field, operator, null, isFunc); var _widgets = (0, _ruleUtils.getWidgetsForFieldOp)(config, field, operator, null, isFunc); var operatorDefinition = isFuncArg ? funcArgDummyOpDef : (0, _configUtils.getOperatorConfig)(config, operator, field); if ((fieldDefinition == null || operatorDefinition == null) && !isCaseValue) { return null; } var isSpecialRange = operatorDefinition === null || operatorDefinition === void 0 ? void 0 : operatorDefinition.isSpecialRange; var isSpecialRangeForSrcField = isSpecialRange && (iValueSrcs.get(0) == "field" || iValueSrcs.get(1) == "field"); var isTrueSpecialRange = isSpecialRange && !isSpecialRangeForSrcField; var cardinality = isTrueSpecialRange ? 1 : (0, _stuff.defaultValue)(operatorDefinition === null || operatorDefinition === void 0 ? void 0 : operatorDefinition.cardinality, 1); if (cardinality === 0) { return null; } var valueSources = (0, _ruleUtils.getValueSourcesForFieldOp)(config, field, operator, fieldDefinition, isFuncArg ? leftField : null); var widgets = (0, _range["default"])(0, cardinality).map(function (delta) { var _widgetDefinition; var valueSrc = iValueSrcs.get(delta) || null; var widget = (0, _ruleUtils.getWidgetForFieldOp)(config, field, operator, valueSrc, isFunc); var widgetDefinition = (0, _configUtils.getFieldWidgetConfig)(config, field, operator, widget, valueSrc, isFunc); if (isSpecialRangeForSrcField) { widget = widgetDefinition.singleWidget; widgetDefinition = (0, _configUtils.getFieldWidgetConfig)(config, field, operator, widget, valueSrc, isFunc); } var widgetType = (_widgetDefinition = widgetDefinition) === null || _widgetDefinition === void 0 ? void 0 : _widgetDefinition.type; var valueLabel = (0, _ruleUtils.getValueLabel)(config, field, operator, delta, valueSrc, isTrueSpecialRange); var widgetValueLabel = (0, _ruleUtils.getValueLabel)(config, field, operator, delta, null, isTrueSpecialRange); var sepText = operatorDefinition !== null && operatorDefinition !== void 0 && operatorDefinition.textSeparators ? operatorDefinition === null || operatorDefinition === void 0 ? void 0 : operatorDefinition.textSeparators[delta] : null; var setValueSrcHandler = _this2._onChangeValueSrc.bind(_this2, delta); var valueLabels = null; var textSeparators = null; if (isSpecialRange) { valueLabels = [(0, _ruleUtils.getValueLabel)(config, field, operator, 0), (0, _ruleUtils.getValueLabel)(config, field, operator, 1)]; valueLabels = { placeholder: [valueLabels[0].placeholder, valueLabels[1].placeholder], label: [valueLabels[0].label, valueLabels[1].label] }; textSeparators = operatorDefinition === null || operatorDefinition === void 0 ? void 0 : operatorDefinition.textSeparators; } var setValueHandler = _this2._setValue.bind(_this2, isSpecialRange, delta, widgetType); return { valueSrc: valueSrc, valueLabel: valueLabel, widget: widget, sepText: sepText, setValueSrcHandler: setValueSrcHandler, widgetDefinition: widgetDefinition, widgetValueLabel: widgetValueLabel, valueLabels: valueLabels, textSeparators: textSeparators, setValueHandler: setValueHandler }; }); return { defaultWidget: defaultWidget, fieldDefinition: fieldDefinition, operatorDefinition: operatorDefinition, isSpecialRange: isTrueSpecialRange, cardinality: cardinality, valueSources: valueSources, widgets: widgets, iValues: iValues, //correct for isFuncArg aField: field, //correct for isFuncArg asyncListValues: asyncListValues }; } }, { key: "render", value: function render() { if (!this.meta) return null; var _this$meta = this.meta, defaultWidget = _this$meta.defaultWidget, cardinality = _this$meta.cardinality; if (!defaultWidget) return null; var name = defaultWidget; return /*#__PURE__*/_react["default"].createElement(_utils.Col, { className: "rule--widget rule--widget--".concat(name.toUpperCase()), key: "widget-col-" + name }, (0, _range["default"])(0, cardinality).map(this.renderWidgetDelta)); } }]); return Widget; }(_react.PureComponent); exports["default"] = Widget; Widget.propTypes = { config: _propTypes["default"].object.isRequired, value: _propTypes["default"].any, //instanceOf(Immutable.List) valueSrc: _propTypes["default"].any, //instanceOf(Immutable.List) valueError: _propTypes["default"].any, field: _propTypes["default"].string, operator: _propTypes["default"].string, readonly: _propTypes["default"].bool, asyncListValues: _propTypes["default"].array, id: _propTypes["default"].string, groupId: _propTypes["default"].string, //actions setValue: _propTypes["default"].func, setValueSrc: _propTypes["default"].func, // for isFuncArg isFuncArg: _propTypes["default"].bool, fieldFunc: _propTypes["default"].string, fieldArg: _propTypes["default"].string, leftField: _propTypes["default"].string, // for RuleGroupExt isForRuleGruop: _propTypes["default"].bool, parentField: _propTypes["default"].string, // for func in func parentFuncs: _propTypes["default"].array, // for case_value isCaseValue: _propTypes["default"].bool, isFunc: _propTypes["default"].bool };