choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
1,327 lines (1,131 loc) • 44.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
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 _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _reactDom = require("react-dom");
var _classnames = _interopRequireDefault(require("classnames"));
var _noop = _interopRequireDefault(require("lodash/noop"));
var _KeyCode = _interopRequireDefault(require("../../_util/KeyCode"));
var _animate = _interopRequireDefault(require("../../animate"));
var _util = require("./util");
var _SelectTrigger = _interopRequireDefault(require("./SelectTrigger"));
var _TreeNode2 = _interopRequireDefault(require("./TreeNode"));
var _strategies = require("./strategies");
var _Button = _interopRequireDefault(require("../../button/Button"));
var _excluded = ["label", "value", "disabled", "key", "hasOwnProperty", "selectable", "children", "isLeaf"];
function filterFn(input, child) {
return String((0, _util.getPropValue)(child, (0, _util.labelCompatible)(this.props.treeNodeFilterProp))).indexOf(input) > -1;
}
function loopTreeData(data) {
var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var treeCheckable = arguments.length > 2 ? arguments[2] : undefined;
return data.map(function (item, index) {
var pos = "".concat(level, "-").concat(index);
var label = item.label,
value = item.value,
disabled = item.disabled,
key = item.key,
hasOwnProperty = item.hasOwnProperty,
selectable = item.selectable,
children = item.children,
isLeaf = item.isLeaf,
otherProps = (0, _objectWithoutProperties2["default"])(item, _excluded);
var props = (0, _objectSpread2["default"])({
value: value,
title: label,
// value: value || String(key || label), // cause onChange callback error
key: key || value || pos,
disabled: disabled || false,
selectable: selectable === false ? selectable : !treeCheckable
}, otherProps);
var ret;
if (children && children.length) {
ret = /*#__PURE__*/_react["default"].createElement(_TreeNode2["default"], props, loopTreeData(children, pos, treeCheckable));
} else {
ret = /*#__PURE__*/_react["default"].createElement(_TreeNode2["default"], (0, _extends2["default"])({}, props, {
isLeaf: isLeaf
}));
}
return ret;
});
}
var Select = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(Select, _Component);
var _super = (0, _createSuper2["default"])(Select);
function Select(_props2) {
var _this;
(0, _classCallCheck2["default"])(this, Select);
_this = _super.call(this, _props2);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onInputChange", function (event) {
var val = event.target.value;
var _assertThisInitialize = (0, _assertThisInitialized2["default"])(_this),
props = _assertThisInitialize.props;
_this.setState({
inputValue: (0, _util.isEmpty)(_this.props.searchValue) ? val : _this.props.searchValue,
open: true
});
if (props.treeCheckable && !val) {
_this.setState({
value: _this.getValue(props, (0, _toConsumableArray2["default"])(_this.state.value), false)
});
}
props.onSearch(val);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDropdownVisibleChange", function (open) {
// selection inside combobox cause click
if (!open && document.activeElement === _this.getInputDOMNode()) {// return;
} // this.setOpenState(open);
// setTimeout, then have animation. why?
setTimeout(function () {
_this.setOpenState(open, undefined, !open);
}, 10);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onKeyDown", function (event) {
var props = _this.props;
if (props.disabled) {
return;
}
var keyCode = event.keyCode;
if (_this.state.open && !_this.getInputDOMNode()) {
_this.onInputKeyDown(event);
} else if (keyCode === _KeyCode["default"].ENTER || keyCode === _KeyCode["default"].DOWN) {
_this.setOpenState(true);
event.preventDefault();
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onInputKeyDown", function (event) {
var props = _this.props;
if (props.disabled) {
return;
}
var state = _this.state;
var keyCode = event.keyCode;
if ((0, _util.isMultiple)(props) && !event.target.value && keyCode === _KeyCode["default"].BACKSPACE) {
var value = state.value.concat();
if (value.length) {
var popValue = value.pop();
_this.removeSelected(_this.isLabelInValue() ? popValue : popValue.value);
}
return;
}
if (keyCode === _KeyCode["default"].DOWN) {
if (!state.open) {
_this.openIfHasChildren();
event.preventDefault();
event.stopPropagation();
return;
}
} else if (keyCode === _KeyCode["default"].ESC) {
if (state.open) {
_this.setOpenState(false);
event.preventDefault();
event.stopPropagation();
}
return;
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onSelect", function (selectedKeys, info) {
var item = info.node;
var value = _this.state.value;
var props = _this.props;
var selectedValue = (0, _util.getValuePropValue)(item);
var selectedLabel = _this.getLabelFromNode(item);
var checkableSelect = props.treeCheckable && info.event === 'select';
var event = selectedValue;
if (_this.isLabelInValue()) {
event = {
value: event,
label: selectedLabel
};
}
if (info.selected === false) {
_this.onDeselect(info);
if (!checkableSelect) return;
}
props.onSelect(event, item, info);
var checkEvt = info.event === 'check';
if ((0, _util.isMultiple)(props)) {
_this.clearSearchInput();
if (checkEvt) {
value = _this.getCheckedNodes(info, props).map(function (n) {
return {
value: (0, _util.getValuePropValue)(n),
label: _this.getLabelFromNode(n)
};
});
} else {
if (value.some(function (i) {
return i.value === selectedValue;
})) {
return;
}
value = value.concat([{
value: selectedValue,
label: selectedLabel
}]);
}
} else {
if (value.length && value[0].value === selectedValue) {
_this.setOpenState(false);
return;
}
value = [{
value: selectedValue,
label: selectedLabel
}];
_this.setOpenState(false);
}
var extraInfo = {
triggerValue: selectedValue,
triggerNode: item
};
if (checkEvt) {
extraInfo.checked = info.checked; // if inputValue existing, tree is checkStrictly
extraInfo.allCheckedNodes = props.treeCheckStrictly || _this.state.inputValue ? info.checkedNodes : (0, _util.flatToHierarchy)(info.checkedNodesPositions);
_this._checkedNodes = info.checkedNodesPositions;
var _tree = _this.trigger.popupEle;
_this._treeNodesStates = _tree.checkKeys;
} else {
extraInfo.selected = info.selected;
}
_this.fireChange(value, extraInfo); // 选中后判断是否需要清楚搜索值
if (props.autoClearSearchValue) {
_this.clearSearchInput();
}
if (props.inputValue && (0, _util.isEmpty)(_this.props.searchValue)) {
_this.setState({
inputValue: ''
});
} else {
_this.setState({
inputValue: _this.props.searchValue
});
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDeselect", function (info) {
_this.removeSelected((0, _util.getValuePropValue)(info.node));
if (!(0, _util.isMultiple)(_this.props)) {
_this.setOpenState(false);
} else {
_this.clearSearchInput();
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onPlaceholderClick", function () {
_this.getInputDOMNode().focus();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onClearSelection", function (event) {
var props = _this.props;
var state = _this.state;
if (props.disabled) {
return;
}
event.stopPropagation();
_this._cacheTreeNodesStates = 'no';
_this._checkedNodes = [];
if (state.inputValue || state.value.length) {
_this.setOpenState(false);
if (typeof props.inputValue === 'undefined') {
_this.setState({
inputValue: (0, _util.isEmpty)(_this.props.searchValue) ? '' : _this.props.searchValue
}, function () {
_this.fireChange([]);
});
} else {
_this.fireChange([]);
}
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChoiceAnimationLeave", function () {
_this.trigger.trigger.forcePopupAlign();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onArrowClick", function (e) {
e.stopPropagation();
e.preventDefault();
if (!_this.props.disabled) {
_this.onDropdownVisibleChange(!_this.state.open);
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getPlaceholderElement", function () {
var _assertThisInitialize2 = (0, _assertThisInitialized2["default"])(_this),
props = _assertThisInitialize2.props,
state = _assertThisInitialize2.state;
var placeholder = props.placeholder;
if (placeholder) {
return /*#__PURE__*/_react["default"].createElement("div", {
className: "".concat(props.prefixCls, "-selection__placeholder")
}, placeholder);
}
return null;
});
var _value = [];
if ('value' in _props2) {
_value = (0, _util.toArray)(_props2.value);
} else {
_value = (0, _util.toArray)(_props2.defaultValue);
} // save parsed treeData, for performance (treeData may be very big)
_this.renderedTreeData = _this.renderTreeData();
_value = _this.addLabelToValue(_props2, _value);
_value = _this.getValue(_props2, _value, _props2.inputValue ? '__strict' : true);
var inputValue = _props2.inputValue || '';
if (!(0, _util.isEmpty)(_props2.searchValue)) {
inputValue = String(_props2.searchValue);
}
_this.state = {
value: _value,
inputValue: inputValue,
open: _props2.open || _props2.defaultOpen,
focused: false
};
return _this;
}
(0, _createClass2["default"])(Select, [{
key: "componentDidMount",
value: function componentDidMount() {
var _this$props = this.props,
autoFocus = _this$props.autoFocus,
disabled = _this$props.disabled;
if ((0, _util.isMultiple)(this.props)) {
var inputNode = this.getInputDOMNode();
if (inputNode.value) {
inputNode.style.width = '';
inputNode.style.width = "".concat(this.inputMirrorInstance.clientWidth, "px");
} else {
inputNode.style.width = '';
}
}
if (autoFocus && !disabled) {
this.focus();
}
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
// save parsed treeData, for performance (treeData may be very big)
this.renderedTreeData = this.renderTreeData(nextProps); // Detecting whether the object of `onChange`'s argument is old ref.
// Better to do a deep equal later.
this._cacheTreeNodesStates = this._cacheTreeNodesStates !== 'no' && this._savedValue && nextProps.value === this._savedValue;
if (this.props.treeData !== nextProps.treeData || this.props.children !== nextProps.children) {
// refresh this._treeNodesStates cache
this._treeNodesStates = (0, _util.getTreeNodesStates)(this.renderedTreeData || nextProps.children, this.state.value.map(function (item) {
return item.value;
}));
}
if ('value' in nextProps) {
var value = (0, _util.toArray)(nextProps.value);
value = this.addLabelToValue(nextProps, value);
value = this.getValue(nextProps, value);
this.setState({
value: value
});
if (nextProps.searchValue !== this.props.searchValue) {
this.setState({
inputValue: String(nextProps.searchValue)
});
}
}
if ((0, _util.isEmpty)(this.props.searchValue)) {
if (nextProps.inputValue !== this.props.inputValue) {
this.setState({
inputValue: nextProps.inputValue
});
}
} else {
this.setState({
inputValue: this.props.searchValue
});
}
if ('open' in nextProps) {
this.setState({
open: nextProps.open
});
}
}
}, {
key: "componentWillUpdate",
value: function componentWillUpdate(nextProps) {
if (this._savedValue && nextProps.value && nextProps.value !== this._savedValue && nextProps.value === this.props.value) {
this._cacheTreeNodesStates = false;
this.getValue(nextProps, this.addLabelToValue(nextProps, (0, _util.toArray)(nextProps.value)));
}
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
var state = this.state;
var props = this.props;
if (state.open && (0, _util.isMultiple)(props)) {
var inputNode = this.getInputDOMNode();
if (inputNode.value) {
inputNode.style.width = '';
inputNode.style.width = "".concat(this.inputMirrorInstance.clientWidth, "px");
} else {
inputNode.style.width = '';
}
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.clearDelayTimer();
if (this.dropdownContainer) {
(0, _reactDom.unmountComponentAtNode)(this.dropdownContainer);
document.body.removeChild(this.dropdownContainer);
this.dropdownContainer = null;
}
}
}, {
key: "getLabelFromNode",
value: function getLabelFromNode(child) {
return (0, _util.getPropValue)(child, this.props.treeNodeLabelProp);
}
}, {
key: "getLabelFromProps",
value: function getLabelFromProps(props, value) {
var _this2 = this;
if (value === undefined) {
return null;
}
var label = null;
(0, _util.loopAllChildren)(this.renderedTreeData || props.children, function (item) {
if ((0, _util.getValuePropValue)(item) === value) {
label = _this2.getLabelFromNode(item);
}
});
if (label === null) {
return value;
}
return label;
}
}, {
key: "getDropdownContainer",
value: function getDropdownContainer() {
if (!this.dropdownContainer) {
this.dropdownContainer = document.createElement('div');
document.body.appendChild(this.dropdownContainer);
}
return this.dropdownContainer;
}
}, {
key: "getSearchPlaceholderElement",
value: function getSearchPlaceholderElement(hidden) {
var props = this.props;
var placeholder;
if ((0, _util.isMultiple)(props)) {
placeholder = props.placeholder || props.searchPlaceholder;
} else {
placeholder = props.searchPlaceholder;
}
if (placeholder) {
return /*#__PURE__*/_react["default"].createElement("span", {
style: {
display: hidden ? 'none' : 'block'
},
onClick: this.onPlaceholderClick,
className: "".concat(props.prefixCls, "-search__field__placeholder")
}, placeholder);
}
return null;
}
}, {
key: "getInputElement",
value: function getInputElement() {
var inputValue = this.state.inputValue;
var _this$props2 = this.props,
prefixCls = _this$props2.prefixCls,
disabled = _this$props2.disabled;
return /*#__PURE__*/_react["default"].createElement("span", {
className: "".concat(prefixCls, "-search__field__wrap")
}, /*#__PURE__*/_react["default"].createElement("input", {
ref: (0, _util.saveRef)(this, 'inputInstance'),
onChange: this.onInputChange,
onKeyDown: this.onInputKeyDown,
value: inputValue,
disabled: disabled,
className: "".concat(prefixCls, "-search__field"),
role: "textbox"
}), /*#__PURE__*/_react["default"].createElement("span", {
ref: (0, _util.saveRef)(this, 'inputMirrorInstance'),
className: "".concat(prefixCls, "-search__field__mirror")
}, inputValue, "\xA0"), (0, _util.isMultiple)(this.props) ? null : this.getSearchPlaceholderElement(!!inputValue));
}
}, {
key: "getInputDOMNode",
value: function getInputDOMNode() {
return this.inputInstance;
}
}, {
key: "getPopupDOMNode",
value: function getPopupDOMNode() {
return this.trigger.getPopupDOMNode();
}
}, {
key: "getPopupComponentRefs",
value: function getPopupComponentRefs() {
return this.trigger.getPopupEleRefs();
}
}, {
key: "getValue",
value: function getValue(_props, val) {
var _this3 = this;
var init = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var value = val; // if inputValue existing, tree is checkStrictly
var _strict = init === '__strict' || init && (this.state && this.state.inputValue || this.props.inputValue !== _props.inputValue);
if (_props.treeCheckable && (_props.treeCheckStrictly || _strict)) {
this.halfCheckedValues = [];
value = [];
val.forEach(function (i) {
if (!i.halfChecked) {
value.push(i);
} else {
_this3.halfCheckedValues.push(i);
}
});
} // if (!(_props.treeCheckable && !_props.treeCheckStrictly)) {
if (!!!_props.treeCheckable || _props.treeCheckable && (_props.treeCheckStrictly || _strict)) {
return value;
}
var checkedTreeNodes;
if (this._cachetreeData && this._cacheTreeNodesStates && this._checkedNodes && this.state && !this.state.inputValue) {
this.checkedTreeNodes = checkedTreeNodes = this._checkedNodes;
} else {
/**
* Note: `this._treeNodesStates`'s treeNodesStates must correspond to nodes of the
* final tree (`processTreeNode` function from SelectTrigger.jsx produce the final tree).
*
* And, `this._treeNodesStates` from `onSelect` is previous value,
* so it perhaps only have a few nodes, but the newly filtered tree can have many nodes,
* thus, you cannot use previous _treeNodesStates.
*/
// getTreeNodesStates is not effective.
this._treeNodesStates = (0, _util.getTreeNodesStates)(this.renderedTreeData || _props.children, value.map(function (item) {
return item.value;
}));
this.checkedTreeNodes = checkedTreeNodes = this._treeNodesStates.checkedNodes;
}
var mapLabVal = function mapLabVal(arr) {
return arr.map(function (itemObj) {
return {
value: (0, _util.getValuePropValue)(itemObj.node),
label: (0, _util.getPropValue)(itemObj.node, _props.treeNodeLabelProp)
};
});
};
var props = this.props;
var checkedValues = [];
if (props.showCheckedStrategy === _strategies.SHOW_ALL) {
checkedValues = mapLabVal(checkedTreeNodes);
} else if (props.showCheckedStrategy === _strategies.SHOW_PARENT) {
var posArr = (0, _util.filterParentPosition)(checkedTreeNodes.map(function (itemObj) {
return itemObj.pos;
}));
checkedValues = mapLabVal(checkedTreeNodes.filter(function (itemObj) {
return posArr.indexOf(itemObj.pos) !== -1;
}));
} else {
checkedValues = mapLabVal(checkedTreeNodes.filter(function (itemObj) {
return !itemObj.node.props.children;
}));
}
return checkedValues;
}
}, {
key: "getCheckedNodes",
value: function getCheckedNodes(info, props) {
// TODO treeCheckable does not support tags/dynamic
var checkedNodes = info.checkedNodes;
var checkNodeProps = checkedNodes.forEach(function (item) {
if (!item.props) {
item.props = item;
}
return item;
});
if (props.treeCheckStrictly || this.state.inputValue) {
return checkNodeProps;
}
var checkedNodesPositions = info.checkedNodesPositions;
if (props.showCheckedStrategy === _strategies.SHOW_ALL) {
checkNodeProps = checkNodeProps;
} else if (props.showCheckedStrategy === _strategies.SHOW_PARENT) {
var posArr = (0, _util.filterParentPosition)(checkedNodesPositions.map(function (itemObj) {
return itemObj.pos;
}));
checkNodeProps = checkedNodesPositions.filter(function (itemObj) {
return posArr.indexOf(itemObj.pos) !== -1;
}).map(function (itemObj) {
return itemObj.node;
});
} else {
checkNodeProps = checkNodeProps.filter(function (n) {
return !n.props.children;
});
}
return checkNodeProps;
}
}, {
key: "getDeselectedValue",
value: function getDeselectedValue(selectedValue) {
var checkedTreeNodes = this.checkedTreeNodes;
var unCheckPos;
checkedTreeNodes.forEach(function (itemObj) {
if (itemObj.node.props.value === selectedValue) {
unCheckPos = itemObj.pos;
}
});
var newVals = [];
var newCkTns = [];
checkedTreeNodes.forEach(function (itemObj) {
if ((0, _util.isPositionPrefix)(itemObj.pos, unCheckPos) || (0, _util.isPositionPrefix)(unCheckPos, itemObj.pos)) {
// Filter ancestral and children nodes when uncheck a node.
return;
}
newCkTns.push(itemObj);
newVals.push(itemObj.node.props.value);
});
this.checkedTreeNodes = this._checkedNodes = newCkTns;
var nv = this.state.value.filter(function (val) {
return newVals.indexOf(val.value) !== -1;
});
this.fireChange(nv, {
triggerValue: selectedValue,
clear: true
});
}
}, {
key: "setOpenState",
value: function setOpenState(open, needFocus) {
var _this4 = this;
var documentClickClose = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
this.clearDelayTimer();
var props = this.props; // can not optimize, if children is empty
// if (this.state.open === open) {
// return;
// }
if (!this.props.onDropdownVisibleChange(open, {
documentClickClose: documentClickClose
})) {
return;
}
this.setState({
open: open
}, function () {
if (needFocus || open) {
// Input dom init after first time component render
// Add delay for this to get focus
Promise.resolve().then(function () {
if (open || (0, _util.isMultiple)(props)) {
var input = _this4.getInputDOMNode();
if (input && document.activeElement !== input) {
input.focus();
}
} else if (_this4.selection) {
_this4.selection.focus();
}
});
}
});
}
}, {
key: "clearSearchInput",
value: function clearSearchInput() {
var input = this.getInputDOMNode();
if (input && document.activeElement !== input) {
input.focus();
}
if (!('inputValue' in this.props)) {
this.setState({
inputValue: (0, _util.isEmpty)(this.props.searchValue) ? '' : (0, _util.isEmpty)(this.props.searchValue)
});
}
}
}, {
key: "addLabelToValue",
value: function addLabelToValue(props, value_) {
var _this5 = this;
var value = value_;
if (this.isLabelInValue()) {
value.forEach(function (v, i) {
if (Object.prototype.toString.call(value[i]) !== '[object Object]') {
value[i] = {
value: '',
label: ''
};
return;
}
v.label = v.label || _this5.getLabelFromProps(props, v.value);
});
} else {
value = value.map(function (v) {
return {
value: v,
label: _this5.getLabelFromProps(props, v)
};
});
}
return value;
}
}, {
key: "clearDelayTimer",
value: function clearDelayTimer() {
if (this.delayTimer) {
clearTimeout(this.delayTimer);
this.delayTimer = null;
}
}
/**
* 移除select值
* @param {*} selectedVal
*/
}, {
key: "removeSelected",
value: function removeSelected(selectedVal) {
var props = this.props;
if (props.disabled) {
return;
}
this._cacheTreeNodesStates = 'no';
if (props.treeCheckable && (props.showCheckedStrategy === _strategies.SHOW_ALL || props.showCheckedStrategy === _strategies.SHOW_PARENT) && !(props.treeCheckStrictly || this.state.inputValue)) {
this.getDeselectedValue(selectedVal);
return;
} // click the node's `x`(in select box), likely trigger the TreeNode's `unCheck` event,
// cautiously, they are completely different, think about it, the tree may not render at first,
// but the nodes in select box are ready.
var label;
var value = this.state.value.filter(function (singleValue) {
if (singleValue.value === selectedVal) {
label = singleValue.label;
}
return singleValue.value !== selectedVal;
});
var canMultiple = (0, _util.isMultiple)(props);
if (canMultiple) {
var event = selectedVal;
if (this.isLabelInValue()) {
event = {
value: selectedVal,
label: label
};
}
props.onDeselect(event);
}
if (props.treeCheckable) {
if (this.checkedTreeNodes && this.checkedTreeNodes.length) {
this.checkedTreeNodes = this._checkedNodes = this.checkedTreeNodes.filter(function (item) {
return value.some(function (i) {
return i.value === item.node.props.value;
});
});
}
}
this.fireChange(value, {
triggerValue: selectedVal,
clear: true
});
}
}, {
key: "openIfHasChildren",
value: function openIfHasChildren() {
var props = this.props;
if (_react.Children.count(props.children) || !(0, _util.isMultiple)(props)) {
this.setOpenState(true);
}
}
}, {
key: "fireChange",
value: function fireChange(value) {
var _this6 = this;
var extraInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var props = this.props;
var vals = value.map(function (i) {
return i.value;
});
var sv = this.state.value.map(function (i) {
return i.value;
});
if (vals.length !== sv.length || !vals.every(function (val, index) {
return sv[index] === val;
})) {
var ex = (0, _objectSpread2["default"])({
preValue: (0, _toConsumableArray2["default"])(this.state.value)
}, extraInfo);
var labs = null;
var vls = value;
if (!this.isLabelInValue()) {
labs = value.map(function (i) {
return i.label;
});
vls = vls.map(function (v) {
return v.value;
});
} else if (this.halfCheckedValues && this.halfCheckedValues.length) {
this.halfCheckedValues.forEach(function (i) {
if (!vls.some(function (v) {
return v.value === i.value;
})) {
vls.push(i);
}
});
}
if (props.treeCheckable && ex.clear) {
var treeData = this.renderedTreeData || props.children;
ex.allCheckedNodes = (0, _util.flatToHierarchy)((0, _util.filterAllCheckedData)(vals, treeData));
}
if (props.treeCheckable && this.state.inputValue) {
var _vls = (0, _toConsumableArray2["default"])(this.state.value);
if (ex.checked) {
value.forEach(function (i) {
if (_vls.every(function (ii) {
return ii.value !== i.value;
})) {
_vls.push((0, _objectSpread2["default"])({}, i));
}
});
} else {
var index;
var includeVal = _vls.some(function (i, ind) {
if (i.value === ex.triggerValue) {
index = ind;
return true;
}
});
if (includeVal) {
_vls.splice(index, 1);
}
}
vls = _vls;
if (!this.isLabelInValue()) {
labs = _vls.map(function (v) {
return v.label;
});
vls = _vls.map(function (v) {
return v.value;
});
}
}
this._savedValue = (0, _util.isMultiple)(props) ? vls : vls[0];
props.onChange(this._savedValue, labs, ex);
if (!('value' in props)) {
this._cacheTreeNodesStates = false;
this.setState({
value: this.getValue(props, (0, _util.toArray)(this._savedValue).map(function (v, i) {
return _this6.isLabelInValue() ? v : {
value: v,
label: labs && labs[i]
};
}))
});
}
}
}
}, {
key: "isLabelInValue",
value: function isLabelInValue() {
var _this$props3 = this.props,
treeCheckable = _this$props3.treeCheckable,
treeCheckStrictly = _this$props3.treeCheckStrictly,
labelInValue = _this$props3.labelInValue;
if (treeCheckable && treeCheckStrictly) {
return true;
}
return labelInValue || false;
}
}, {
key: "focus",
value: function focus() {
if (!(0, _util.isMultiple)(this.props)) {
this.selection.focus();
} else {
this.getInputDOMNode().focus();
}
}
}, {
key: "blur",
value: function blur() {
if (!(0, _util.isMultiple)(this.props)) {
this.selection.blur();
} else {
this.getInputDOMNode().blur();
}
}
}, {
key: "renderClear",
value: function renderClear() {
var _this$props4 = this.props,
prefixCls = _this$props4.prefixCls,
allowClear = _this$props4.allowClear;
var _this$state = this.state,
value = _this$state.value,
inputValue = _this$state.inputValue;
var clear = /*#__PURE__*/_react["default"].createElement(_Button["default"], (0, _extends2["default"])({
key: "clear",
className: "".concat(prefixCls, "-clear"),
style: _util.UNSELECTABLE_STYLE
}, _util.UNSELECTABLE_ATTRIBUTE, {
shape: "circle",
icon: "close",
size: "small",
onClick: this.onClearSelection,
onMouseDown: _util.preventDefaultEvent
}));
if (!allowClear) {
return null;
}
if (inputValue || value.length) {
return clear;
}
return null;
}
}, {
key: "renderTopControlNode",
value: function renderTopControlNode() {
var _this7 = this;
var value = this.state.value;
var props = this.props;
var labelInValue = props.labelInValue,
choiceTransitionName = props.choiceTransitionName,
prefixCls = props.prefixCls,
maxTagTextLength = props.maxTagTextLength,
maxTagCount = props.maxTagCount,
maxTagPlaceholder = props.maxTagPlaceholder,
choiceRender = props.choiceRender;
var multiple = (0, _util.isMultiple)(props); // single and not combobox, input is inside dropdown
if (!multiple) {
var singleValue = value && value[0];
var _ref = singleValue || {},
label = _ref.label;
var innerNode = /*#__PURE__*/_react["default"].createElement("span", {
key: "value",
title: label,
className: "".concat(prefixCls, "-selection-selected-value")
}, choiceRender ? choiceRender(label) : label);
return /*#__PURE__*/_react["default"].createElement("div", {
className: "".concat(prefixCls, "-selection__rendered")
}, this.getPlaceholderElement(), innerNode, this.renderClear(), multiple || !props.showArrow ? null : /*#__PURE__*/_react["default"].createElement("span", (0, _extends2["default"])({
key: "arrow",
className: "".concat(prefixCls, "-arrow"),
style: _util.UNSELECTABLE_STYLE
}, _util.UNSELECTABLE_ATTRIBUTE, {
onClick: this.onArrowClick
}), /*#__PURE__*/_react["default"].createElement("i", {
className: "icon icon-arrow_drop_down"
}), /*#__PURE__*/_react["default"].createElement("b", null)));
} // Check if `maxTagCount` is set
var myValueList = value;
if (maxTagCount >= 0) {
myValueList = value.slice(0, maxTagCount);
}
var selectedValueNodes = myValueList.map(function (singleValue) {
var content = singleValue.label;
var title = content;
if (maxTagTextLength && typeof content === 'string' && content.length > maxTagTextLength) {
content = "".concat(content.slice(0, maxTagTextLength), "...");
}
return /*#__PURE__*/_react["default"].createElement("li", (0, _extends2["default"])({
style: _util.UNSELECTABLE_STYLE
}, _util.UNSELECTABLE_ATTRIBUTE, {
onMouseDown: _util.preventDefaultEvent,
className: "".concat(prefixCls, "-selection__choice"),
key: singleValue.value,
title: title
}), /*#__PURE__*/_react["default"].createElement("span", {
className: "".concat(prefixCls, "-selection__choice__remove"),
onClick: _this7.removeSelected.bind(_this7, singleValue.value)
}, /*#__PURE__*/_react["default"].createElement("i", {
className: "icon icon-cancel"
})), /*#__PURE__*/_react["default"].createElement("span", {
className: "".concat(prefixCls, "-selection__choice__content")
}, content));
});
if (maxTagCount >= 0 && maxTagCount < value.length) {
var content = "+ ".concat(value.length - maxTagCount, " ...");
if (typeof maxTagPlaceholder === 'string') {
content = maxTagPlaceholder;
} else if (typeof maxTagPlaceholder === 'function') {
var restValueList = value.slice(maxTagCount);
content = maxTagPlaceholder(labelInValue ? restValueList : restValueList.map(function (_ref2) {
var value = _ref2.value;
return value;
}));
}
var restNodeSelect = /*#__PURE__*/_react["default"].createElement("li", (0, _extends2["default"])({
style: _util.UNSELECTABLE_STYLE
}, _util.UNSELECTABLE_ATTRIBUTE, {
onMouseDown: _util.preventDefaultEvent,
className: "".concat(prefixCls, "-selection__choice"),
key: "rc-tree-select-internal-max-tag-counter",
title: content
}), /*#__PURE__*/_react["default"].createElement("span", {
className: "".concat(prefixCls, "-selection__choice__content")
}, content));
selectedValueNodes.push(restNodeSelect);
}
selectedValueNodes.push( /*#__PURE__*/_react["default"].createElement("li", {
className: "".concat(prefixCls, "-search ").concat(prefixCls, "-search--inline"),
key: "__input"
}, this.getInputElement()));
var className = "".concat(prefixCls, "-selection__rendered");
if (choiceTransitionName) {
return /*#__PURE__*/_react["default"].createElement("div", {
className: className
}, /*#__PURE__*/_react["default"].createElement(_animate["default"], {
component: "ul",
transitionName: choiceTransitionName,
onLeave: this.onChoiceAnimationLeave
}, selectedValueNodes));
}
return /*#__PURE__*/_react["default"].createElement("ul", {
className: className
}, selectedValueNodes);
}
}, {
key: "renderTreeData",
value: function renderTreeData(props) {
var validProps = props || this.props;
if (validProps.treeData) {
if (props && props.treeData === this.props.treeData && this.renderedTreeData) {
// cache and use pre data.
this._cachetreeData = true;
return this.renderedTreeData;
}
this._cachetreeData = false;
var treeData = (0, _toConsumableArray2["default"])(validProps.treeData); // process treeDataSimpleMode
if (validProps.treeDataSimpleMode) {
var simpleFormat = {
id: 'id',
pId: 'pId',
rootPId: null
};
if (Object.prototype.toString.call(validProps.treeDataSimpleMode) === '[object Object]') {
simpleFormat = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, simpleFormat), validProps.treeDataSimpleMode);
}
treeData = (0, _util.processSimpleTreeData)(treeData, simpleFormat);
}
return loopTreeData(treeData, undefined, this.props.treeCheckable);
}
}
}, {
key: "getUnderLine",
value: function getUnderLine() {
var _this$props5 = this.props,
prefixCls = _this$props5.prefixCls,
className = _this$props5.className;
if (className && className.includes("".concat(prefixCls, "-auto-complete"))) {
return null;
}
return /*#__PURE__*/_react["default"].createElement("div", {
className: "".concat(prefixCls, "-underline")
}, /*#__PURE__*/_react["default"].createElement("span", {
className: "".concat(prefixCls, "-ripple")
}));
}
}, {
key: "render",
value: function render() {
var _rootCls;
var props = this.props;
var multiple = (0, _util.isMultiple)(props);
var _this$state2 = this.state,
open = _this$state2.open,
focused = _this$state2.focused,
inputValue = _this$state2.inputValue,
value = _this$state2.value;
var className = props.className,
disabled = props.disabled,
label = props.label,
prefixCls = props.prefixCls;
var ctrlNode = this.renderTopControlNode();
var extraSelectionProps = {};
if (!multiple) {
extraSelectionProps = {
onKeyDown: this.onKeyDown,
tabIndex: 0
};
}
var rootCls = (_rootCls = {}, (0, _defineProperty2["default"])(_rootCls, className, !!className), (0, _defineProperty2["default"])(_rootCls, prefixCls, 1), (0, _defineProperty2["default"])(_rootCls, "".concat(prefixCls, "-has-border"), 1), (0, _defineProperty2["default"])(_rootCls, "".concat(prefixCls, "-open"), open), (0, _defineProperty2["default"])(_rootCls, "".concat(prefixCls, "-focused"), open || focused), (0, _defineProperty2["default"])(_rootCls, "".concat(prefixCls, "-has-value"), inputValue || value.length && value[0]), (0, _defineProperty2["default"])(_rootCls, "".concat(prefixCls, "-has-label"), label), (0, _defineProperty2["default"])(_rootCls, "".concat(prefixCls, "-multiple"), multiple), (0, _defineProperty2["default"])(_rootCls, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2["default"])(_rootCls, "".concat(prefixCls, "-enabled"), !disabled), (0, _defineProperty2["default"])(_rootCls, "".concat(prefixCls, "-allow-clear"), !!props.allowClear), _rootCls);
return /*#__PURE__*/_react["default"].createElement(_SelectTrigger["default"], (0, _extends2["default"])({}, props, {
treeNodes: props.children,
treeData: this.renderedTreeData,
_cachetreeData: this._cachetreeData,
_treeNodesStates: this._treeNodesStates,
halfCheckedValues: this.halfCheckedValues,
multiple: multiple,
disabled: disabled,
visible: open,
inputValue: inputValue,
inputElement: this.getInputElement(),
value: value,
onDropdownVisibleChange: this.onDropdownVisibleChange,
getPopupContainer: props.getPopupContainer,
onSelect: this.onSelect,
ref: (0, _util.saveRef)(this, 'trigger')
}), /*#__PURE__*/_react["default"].createElement("div", {
style: props.style,
onClick: props.onClick,
className: (0, _classnames["default"])(rootCls),
onBlur: props.onBlur,
onFocus: props.onFocus
}, /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
ref: (0, _util.saveRef)(this, 'selection'),
key: "selection",
className: "".concat(prefixCls, "-selection\n ").concat(prefixCls, "-selection--").concat(multiple ? 'multiple' : 'single'),
role: "combobox",
"aria-autocomplete": "list",
"aria-haspopup": "true",
"aria-expanded": open
}, extraSelectionProps), ctrlNode, multiple ? this.getSearchPlaceholderElement(!!inputValue || value.length) : null), this.getUnderLine()));
}
}]);
return Select;
}(_react.Component);
exports["default"] = Select;
(0, _defineProperty2["default"])(Select, "defaultProps", {
prefixCls: 'rc-tree-select',
filterTreeNode: filterFn,
showSearch: true,
allowClear: false,
placeholder: '',
searchPlaceholder: '',
labelInValue: false,
onClick: _noop["default"],
onChange: _noop["default"],
onSelect: _noop["default"],
onDeselect: _noop["default"],
onSearch: _noop["default"],
showArrow: true,
dropdownMatchSelectWidth: true,
dropdownStyle: {},
autoClearSearchValue: true,
onDropdownVisibleChange: function onDropdownVisibleChange() {
return true;
},
optionLabelProp: 'value',
notFoundContent: 'Not Found',
showCheckedStrategy: _strategies.SHOW_CHILD,
// skipHandleInitValue: false, // Deprecated (use treeCheckStrictly)
treeCheckStrictly: false,
treeIcon: false,
treeLine: false,
treeDataSimpleMode: false,
treeDefaultExpandAll: false,
treeCheckable: false,
treeNodeFilterProp: 'value',
treeNodeLabelProp: 'title',
searchValue: ''
});
(0, _defineProperty2["default"])(Select, "SHOW_ALL", _strategies.SHOW_ALL);
(0, _defineProperty2["default"])(Select, "SHOW_PARENT", _strategies.SHOW_PARENT);
(0, _defineProperty2["default"])(Select, "SHOW_CHILD", _strategies.SHOW_CHILD);
//# sourceMappingURL=Select.js.map