@react-awesome-query-builder/antd
Version:
User-friendly query builder for React. AntDesign widgets
185 lines (184 loc) • 7.62 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
import _createClass from "@babel/runtime/helpers/createClass";
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
import _inherits from "@babel/runtime/helpers/inherits";
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
import React, { Component } from "react";
import PropTypes from "prop-types";
import { Cascader, Tooltip } from "antd";
import { removePrefixPath } from "../../utils/stuff";
import { Utils } from "@react-awesome-query-builder/ui";
var useOnPropsChanged = Utils.ReactUtils.useOnPropsChanged;
var getFieldParts = Utils.ConfigUtils.getFieldParts;
// see type FieldItemSearchableKeys
var mapFieldItemToOptionKeys = {
key: "key",
path: "_path",
label: "_label",
altLabel: "altLabel",
tooltip: "tooltip",
grouplabel: "grouplabel",
fullLabel: "fullLabel"
};
var searchInPath = false; // true - search in all path, false - only in last path item
var FieldCascader = /*#__PURE__*/function (_Component) {
function FieldCascader(props) {
var _this;
_classCallCheck(this, FieldCascader);
_this = _callSuper(this, FieldCascader, [props]);
_this.setOpen = function (newOpen) {
_this.setState({
open: newOpen
});
};
_this.onChange = function (keys) {
var parentField = _this.props.parentField;
var dotNotationToPath = function dotNotationToPath(str) {
return str.split(".");
};
var parentPath = parentField ? dotNotationToPath(parentField) : [];
_this.props.setField([].concat(_toConsumableArray(parentPath), _toConsumableArray(keys)));
};
_this.filterOption = function (input, path) {
var config = _this.props.config;
var keysForFilter = config.settings.fieldItemKeysForSearch.map(function (k) {
return mapFieldItemToOptionKeys[k];
});
var filterOneOption = function filterOneOption(option) {
var valueForFilter = keysForFilter.map(function (k) {
return typeof option[k] == "string" ? option[k] : "";
}).join("\0");
var matches = valueForFilter.toLowerCase().indexOf(input.toLowerCase()) >= 0;
return matches;
};
return searchInPath ? path.some(filterOneOption) : filterOneOption(path[path.length - 1]);
};
useOnPropsChanged(_this);
_this.onPropsChanged(props);
_this.state = {
open: false
};
return _this;
}
_inherits(FieldCascader, _Component);
return _createClass(FieldCascader, [{
key: "onPropsChanged",
value: function onPropsChanged(nextProps) {
var items = nextProps.items;
this.items = this.getItems(items);
}
}, {
key: "getItems",
value: function getItems(items) {
var _this2 = this;
return items.map(function (item) {
var items = item.items,
matchesType = item.matchesType,
label = item.label,
key = item.key,
path = item.path,
tooltip = item.tooltip;
var finalLabel = matchesType ? /*#__PURE__*/React.createElement("b", null, label) : label;
if (tooltip) {
finalLabel = /*#__PURE__*/React.createElement(Tooltip, {
title: tooltip
}, finalLabel);
}
if (items) {
return _objectSpread(_objectSpread({}, item), {}, {
key: key,
_path: path,
items: _this2.getItems(items),
label: finalLabel,
_label: label
});
} else {
return _objectSpread(_objectSpread({}, item), {}, {
key: key,
_path: path,
label: finalLabel,
_label: label
});
}
});
}
}, {
key: "render",
value: function render() {
var _this$props = this.props,
config = _this$props.config,
customProps = _this$props.customProps,
items = _this$props.items,
placeholder = _this$props.placeholder,
errorText = _this$props.errorText,
selectedPath = _this$props.selectedPath,
selectedLabel = _this$props.selectedLabel,
selectedOpts = _this$props.selectedOpts,
selectedAltLabel = _this$props.selectedAltLabel,
selectedFullLabel = _this$props.selectedFullLabel,
readonly = _this$props.readonly,
selectedField = _this$props.selectedField,
parentField = _this$props.parentField;
var open = this.state.open;
var customProps2 = _objectSpread({}, customProps);
if (customProps2.showSearch) {
customProps2.showSearch = {
filter: this.filterOption
};
}
var fieldSeparator = config.settings.fieldSeparator;
var parentFieldPath = getFieldParts(parentField, config);
var value = removePrefixPath(selectedPath, parentFieldPath);
var res = /*#__PURE__*/React.createElement(Cascader, _extends({
open: open,
onDropdownVisibleChange: this.setOpen,
status: errorText && "error",
fieldNames: {
label: "label",
value: "key",
children: "items"
},
options: this.items,
value: value,
onChange: this.onChange,
allowClear: false,
placeholder: placeholder,
size: config.settings.renderSize,
disabled: readonly
}, customProps2));
var tooltipText = selectedOpts.tooltip || selectedAltLabel;
if (tooltipText == selectedLabel) tooltipText = null;
if (tooltipText) {
res = /*#__PURE__*/React.createElement(Tooltip, {
title: !open ? tooltipText : null
}, res);
}
return res;
}
}]);
}(Component);
FieldCascader.propTypes = {
config: PropTypes.object.isRequired,
customProps: PropTypes.object,
errorText: PropTypes.string,
items: PropTypes.array.isRequired,
placeholder: PropTypes.string,
selectedKey: PropTypes.string,
selectedKeys: PropTypes.array,
selectedPath: PropTypes.array,
selectedLabel: PropTypes.string,
selectedAltLabel: PropTypes.string,
selectedFullLabel: PropTypes.string,
selectedOpts: PropTypes.object,
readonly: PropTypes.bool,
//actions
setField: PropTypes.func.isRequired
};
export { FieldCascader as default };