shineout
Version:
Shein 前端组件库
481 lines (401 loc) • 16.6 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = exports.IS_NOT_MATCHED_VALUE = void 0;
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _classnames = _interopRequireDefault(require("classnames"));
var _styles = require("./styles");
var _styles2 = require("../Input/styles");
var _styles3 = require("../InputTitle/styles");
var _is = require("../utils/is");
var _element = require("../utils/dom/element");
var _Input = _interopRequireDefault(require("./Input"));
var _Caret = _interopRequireDefault(require("../icons/Caret"));
var _config = require("../config");
var _More = _interopRequireWildcard(require("./More"));
var _InputTitle = _interopRequireDefault(require("../InputTitle"));
var _uid = require("../utils/uid");
var _classname = require("../utils/classname");
var IS_NOT_MATCHED_VALUE = 'IS_NOT_MATCHED_VALUE';
/**
* get result className from resultClassName attr
* @param {function | string} f props => resultClassName
* @param {any} value result value
* @returns {string | null}
*/
exports.IS_NOT_MATCHED_VALUE = IS_NOT_MATCHED_VALUE;
var getResultClassName = function getResultClassName(f, value) {
if ((0, _is.isFunc)(f)) {
return f((0, _is.isObject)(value) && value.IS_NOT_MATCHED_VALUE ? value.value : value);
}
if ((0, _is.isString)(f)) {
return f;
}
return null;
};
var getResultContent = function getResultContent(data, renderResult, renderUnmatched) {
if ((0, _is.isObject)(data) && data.IS_NOT_MATCHED_VALUE) {
if (typeof renderUnmatched === 'function') return renderUnmatched(data.value);
return (0, _is.isObject)(data.value) ? renderResult(data.value) : data.value;
}
return renderResult(data);
}; // eslint-disable-next-line
function Item(_ref) {
var content = _ref.content,
data = _ref.data,
disabled = _ref.disabled,
onClick = _ref.onClick,
resultClassName = _ref.resultClassName,
_ref$title = _ref.title,
title = _ref$title === void 0 ? false : _ref$title,
only = _ref.only;
var value = data;
var click = disabled || !onClick ? undefined : function () {
return onClick(value);
};
var synDisabled = disabled || !click;
return _react.default.createElement("a", {
title: title && (0, _is.isString)(content) ? content : null,
tabIndex: -1,
className: (0, _classnames.default)((0, _styles.selectClass)((0, _classname.getDirectionClass)('item'), disabled && (0, _classname.getDirectionClass)('disabled'), synDisabled && (0, _classname.getDirectionClass)('ban'), only && 'item-only'), getResultClassName(resultClassName, data))
}, content, !synDisabled && _react.default.createElement("span", {
className: (0, _styles.selectClass)('indicator', 'close'),
onClick: click
}));
}
var Result =
/*#__PURE__*/
function (_PureComponent) {
(0, _inheritsLoose2.default)(Result, _PureComponent);
function Result(props) {
var _this;
_this = _PureComponent.call(this, props) || this;
_this.state = {
more: -1
};
_this.handleRemove = _this.handleRemove.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.handelMore = _this.handelMore.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.bindResult = _this.bindResult.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.resetMore = _this.resetMore.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
return _this;
}
var _proto = Result.prototype;
_proto.componentDidMount = function componentDidMount() {
var compressed = this.props.compressed;
if (compressed && !this.isCompressedBound()) {
this.cancelResizeObserver = (0, _element.addResizeObserver)(this.resultEl, this.resetMore, {
direction: 'x'
});
}
};
_proto.componentDidUpdate = function componentDidUpdate(preProps) {
this.updateMore(preProps);
};
_proto.componentWillUnmount = function componentWillUnmount() {
if (this.cancelResizeObserver) this.cancelResizeObserver();
};
_proto.getCompressedBound = function getCompressedBound() {
var compressedBound = this.props.compressedBound;
if (this.isCompressedBound()) {
return compressedBound;
}
return this.state.more;
};
_proto.isCompressedBound = function isCompressedBound() {
var compressedBound = this.props.compressedBound;
return compressedBound && (0, _is.isNumber)(compressedBound) && compressedBound >= 1;
};
_proto.bindResult = function bindResult(el) {
this.resultEl = el;
};
_proto.updateMore = function updateMore(preProps) {
var _this$props = this.props,
result = _this$props.result,
compressed = _this$props.compressed,
onFilter = _this$props.onFilter,
keygen = _this$props.keygen,
data = _this$props.data;
if (compressed) {
if (this.isCompressedBound()) return;
var shouldRest = false;
if (preProps.result.length !== result.length || (data || []).length !== (preProps.data || []).length) {
shouldRest = true;
} else if (preProps.result !== result) {
var getUnMatchKey = function getUnMatchKey(d, k) {
return d && d.IS_NOT_MATCHED_VALUE ? d.value : (0, _uid.getKey)(d, k);
};
var isSameData = function isSameData(data1, data2, k) {
return getUnMatchKey(data1, k) === getUnMatchKey(data2, k);
};
var i = preProps.result.length - 1;
while (i >= 0) {
if (!isSameData(result[i], preProps.result[i], keygen)) {
shouldRest = true;
break;
}
i -= 1;
}
}
if (shouldRest) {
this.resetMore();
} else if (result.length && this.shouldResetMore) {
this.shouldResetMore = false;
this.state.more = (0, _More.getResetMore)(onFilter, this.resultEl, this.resultEl.querySelectorAll("." + (0, _styles.selectClass)('item')));
this.forceUpdate();
}
}
};
_proto.resetMore = function resetMore() {
if (!this.props.compressed) return;
this.shouldResetMore = true;
this.state.more = -1;
this.forceUpdate();
};
_proto.handleRemove = function handleRemove() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var onRemove = this.props.onRemove;
setTimeout(function () {
onRemove.apply(void 0, args);
}, 10);
};
_proto.isEmptyResult = function isEmptyResult() {
var _this$props2 = this.props,
result = _this$props2.result,
renderResult = _this$props2.renderResult,
renderUnmatched = _this$props2.renderUnmatched;
if (result.length <= 0) return true;
var res = result.reduce(function (acc, cur) {
var r = getResultContent(cur, renderResult, renderUnmatched);
if (!(0, _is.isEmpty)(r)) {
acc.push(cur);
}
return acc;
}, []);
return res.length <= 0;
};
_proto.handelMore = function handelMore(more) {
this.setState({
more: more
});
};
_proto.renderItem = function renderItem(data, index) {
var _this$props3 = this.props,
renderResult = _this$props3.renderResult,
renderUnmatched = _this$props3.renderUnmatched,
datum = _this$props3.datum,
resultClassName = _this$props3.resultClassName;
var content = getResultContent(data, renderResult, renderUnmatched);
if (content === null) return null;
var more = this.getCompressedBound();
return _react.default.createElement(Item, {
key: index,
only: more === 1,
content: content,
data: data,
disabled: datum.disabled(data),
onClick: this.handleRemove,
resultClassName: resultClassName,
title: true
});
};
_proto.renderMore = function renderMore(items) {
var _this$props4 = this.props,
compressedClassName = _this$props4.compressedClassName,
compressed = _this$props4.compressed;
var more = this.getCompressedBound();
var className = (0, _classnames.default)((0, _styles.selectClass)('popover'), compressedClassName);
return [_react.default.createElement(_More.default, {
key: "more",
showNum: more,
className: (0, _styles.selectClass)((0, _classname.getDirectionClass)('item'), 'item-compressed'),
popoverClassName: className,
contentClassName: (0, _styles.selectClass)((0, _classname.getDirectionClass)('result')),
compressed: compressed,
data: items,
more: more,
cls: _styles.selectClass
})];
};
_proto.renderClear = function renderClear() {
var _this$props5 = this.props,
onClear = _this$props5.onClear,
result = _this$props5.result,
disabled = _this$props5.disabled;
if (onClear && result.length > 0 && disabled !== true) {
/* eslint-disable */
return _react.default.createElement("div", {
key: "clear",
onClick: onClear,
className: (0, _styles.selectClass)('close-warpper')
}, _react.default.createElement("a", {
tabIndex: -1,
"data-role": "close",
className: (0, _styles.selectClass)('indicator', 'close')
}));
/* eslint-enable */
}
return null;
};
_proto.renderInput = function renderInput(text, key) {
if (key === void 0) {
key = 'input';
}
var _this$props6 = this.props,
multiple = _this$props6.multiple,
onFilter = _this$props6.onFilter,
trim = _this$props6.trim,
focus = _this$props6.focus,
onInputFocus = _this$props6.onInputFocus,
onInputBlur = _this$props6.onInputBlur,
setInputReset = _this$props6.setInputReset,
focusSelected = _this$props6.focusSelected,
bindFocusInputFunc = _this$props6.bindFocusInputFunc,
maxLength = _this$props6.maxLength,
convertBr = _this$props6.convertBr;
return _react.default.createElement(_Input.default, {
key: key + "." + (focus ? 1 : 0),
onInputFocus: onInputFocus,
onInputBlur: onInputBlur,
updatAble: !multiple,
multiple: multiple,
focus: focus,
text: text,
trim: trim,
onFilter: onFilter,
setInputReset: setInputReset,
focusSelected: focusSelected,
bindFocusInputFunc: bindFocusInputFunc // collapse={collapse}
,
maxLength: maxLength,
convertBr: convertBr
});
};
_proto.renderPlaceholder = function renderPlaceholder() {
var _this$props7 = this.props,
focus = _this$props7.focus,
onFilter = _this$props7.onFilter,
filterText = _this$props7.filterText,
multiple = _this$props7.multiple,
innerTitle = _this$props7.innerTitle;
if (focus && onFilter) {
return this.renderInput(multiple ? filterText : '');
}
return _react.default.createElement("span", {
key: "placeholder",
className: (0, _classnames.default)((0, _styles2.inputClass)('placeholder'), (0, _styles.selectClass)('ellipsis'), innerTitle && (0, _styles3.inputTitleClass)('hidable'))
}, _react.default.createElement("span", null, this.props.placeholder), "\xA0");
};
_proto.renderResult = function renderResult() {
var _this2 = this;
var _this$props8 = this.props,
multiple = _this$props8.multiple,
compressed = _this$props8.compressed,
result = _this$props8.result,
renderResult = _this$props8.renderResult,
renderUnmatched = _this$props8.renderUnmatched,
onFilter = _this$props8.onFilter,
focus = _this$props8.focus,
filterText = _this$props8.filterText,
resultClassName = _this$props8.resultClassName;
if (multiple) {
var items = result.map(function (n, i) {
return _this2.renderItem(n, i);
}).filter(function (n) {
return !(0, _is.isEmpty)(n);
});
if (compressed) {
items = this.renderMore(items);
}
if (focus && onFilter) {
items.push(this.renderInput(filterText, result.length));
}
return items;
}
if (onFilter) {
return this.renderInput(getResultContent(result[0], renderResult, renderUnmatched));
}
var v = getResultContent(result[0], renderResult, renderUnmatched);
var title = (0, _is.isString)(v) ? v : undefined;
return _react.default.createElement("span", {
key: "result",
title: title,
className: (0, _classnames.default)((0, _styles.selectClass)('ellipsis'), getResultClassName(resultClassName, result[0]))
}, v);
};
_proto.renderIndicator = function renderIndicator() {
var _this$props9 = this.props,
multiple = _this$props9.multiple,
showArrow = _this$props9.showArrow,
compressed = _this$props9.compressed;
if (!showArrow || multiple && !compressed) return null;
var showCaret = !multiple; // eslint-disable-next-line
return _react.default.createElement("a", {
key: "indicator",
tabIndex: -1,
className: (0, _styles.selectClass)('indicator', multiple ? 'multi' : 'caret')
}, showCaret && _react.default.createElement(_Caret.default, null));
};
_proto.render = function render() {
var _this$props10 = this.props,
compressed = _this$props10.compressed,
innerTitle = _this$props10.innerTitle,
focus = _this$props10.focus,
onFilter = _this$props10.onFilter;
var showPlaceholder = this.isEmptyResult();
var result = showPlaceholder ? this.renderPlaceholder() : this.renderResult();
var rtl = (0, _config.isRTL)();
var clearEl = this.renderClear();
var indicator = this.renderIndicator();
var inner = [result, indicator, clearEl];
var open = onFilter && focus || !showPlaceholder;
return _react.default.createElement(_InputTitle.default, {
innerTitle: innerTitle,
open: open,
className: (0, _styles.selectClass)('title-box'),
titleClass: (0, _styles.selectClass)((0, _classname.getDirectionClass)('title-box-title'))
}, _react.default.createElement("div", {
ref: this.bindResult,
className: (0, _classnames.default)((0, _styles.selectClass)((0, _classname.getDirectionClass)('result'), compressed && 'compressed', showPlaceholder && 'empty', clearEl && 'result-clearable'), innerTitle && (0, _styles3.inputTitleClass)((0, _classname.getDirectionClass)('item'), 'item-scroll'))
}, rtl ? inner.reverse() : inner));
};
return Result;
}(_react.PureComponent);
Result.propTypes = {
datum: _propTypes.default.object,
disabled: _propTypes.default.oneOfType([_propTypes.default.bool, _propTypes.default.func]),
filterText: _propTypes.default.string,
focus: _propTypes.default.bool,
multiple: _propTypes.default.bool.isRequired,
onRemove: _propTypes.default.func,
onClear: _propTypes.default.func,
onFilter: _propTypes.default.func,
onInputBlur: _propTypes.default.func,
onInputFocus: _propTypes.default.func,
result: _propTypes.default.array.isRequired,
renderResult: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]).isRequired,
placeholder: _propTypes.default.string,
setInputReset: _propTypes.default.func,
bindFocusInputFunc: _propTypes.default.func,
// collapse: PropTypes.func,
compressed: _propTypes.default.oneOfType([_propTypes.default.bool, _propTypes.default.string]),
compressedBound: _propTypes.default.number,
trim: _propTypes.default.bool,
renderUnmatched: _propTypes.default.func,
showArrow: _propTypes.default.bool,
focusSelected: _propTypes.default.bool,
compressedClassName: _propTypes.default.string,
resultClassName: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]),
maxLength: _propTypes.default.number,
innerTitle: _propTypes.default.node,
keygen: _propTypes.default.any,
data: _propTypes.default.array,
convertBr: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func])
};
var _default = Result;
exports.default = _default;