shineout
Version:
Shein 前端组件库
412 lines (335 loc) • 14.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
var _react = _interopRequireDefault(require("react"));
var _component = require("../component");
var _defaultProps = require("../utils/defaultProps");
var _element = require("../utils/dom/element");
var _Button = _interopRequireDefault(require("../Button"));
var _styles = require("./styles");
var _AnimationList = _interopRequireDefault(require("../AnimationList"));
var _Item = _interopRequireDefault(require("./Item"));
var _document = require("../utils/dom/document");
var _AbsoluteList = _interopRequireDefault(require("../AnimationList/AbsoluteList"));
var _uid = require("../utils/uid");
var _is = require("../utils/is");
var _context = _interopRequireDefault(require("../Table/context"));
var _Caret = _interopRequireDefault(require("../icons/Caret"));
var _config = require("../config");
var _classname = require("../utils/classname");
var _getDataset = _interopRequireDefault(require("../utils/dom/getDataset"));
var positionMap = {
'left-top': 'left-top',
'left-bottom': 'left-bottom',
'right-top': 'right-top',
'right-bottom': 'right-bottom',
'top-right': 'left-bottom',
'top-left': 'right-bottom',
'bottom-right': 'left-top',
'bottom-left': 'right-top',
auto: ''
};
var DefaultProps = (0, _objectSpread2.default)({}, _defaultProps.defaultProps, {
data: [],
animation: true,
disabled: false,
trigger: 'click',
position: 'bottom-left'
});
var Dropdown =
/*#__PURE__*/
function (_PureComponent) {
(0, _inheritsLoose2.default)(Dropdown, _PureComponent);
function Dropdown(props) {
var _this;
_this = _PureComponent.call(this, props) || this;
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "dropdownId", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleMouseEnter", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleMouseLeave", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "element", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "DropdownList", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "closeTimer", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "focus", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "lastFoucs", void 0);
_this.state = {
show: false
}; // @ts-ignore
if (props.hover !== undefined) {
console.warn('The "hover" property is not recommend, use trigger="hover" instead.');
}
_this.dropdownId = "dropdown_" + (0, _uid.getUidStr)();
_this.bindElement = _this.bindElement.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.clickAway = _this.clickAway.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.handleFocus = _this.handleFocus.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.handleHide = _this.handleHide.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.handleMouseEnter = _this.handleToggle.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), true);
_this.handleMouseLeave = _this.handleToggle.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), false);
_this.renderList = _this.renderList.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.bindList();
return _this;
}
var _proto = Dropdown.prototype;
_proto.componentDidMount = function componentDidMount() {
_PureComponent.prototype.componentDidMount.call(this);
this.setOpenEvent();
};
_proto.componentDidUpdate = function componentDidUpdate() {
this.setOpenEvent();
};
_proto.componentWillUnmount = function componentWillUnmount() {
_PureComponent.prototype.componentWillUnmount.call(this);
this.toggleDocumentEvent(false);
};
_proto.setOpenEvent = function setOpenEvent() {
if (this.lastFoucs !== this.show) if (this.show) {
this.toggleDocumentEvent(true);
} else if (this.lastFoucs !== undefined) {
this.toggleDocumentEvent(false);
}
this.lastFoucs = this.show;
};
_proto.getTrigger = function getTrigger() {
// @ts-ignore
if (this.props.hover === true) return 'hover';
return this.props.trigger;
};
_proto.getPosition = function getPosition() {
var position = this.props.position;
if (position !== 'auto') return position;
if (!this.element) return 'bottom-left';
var windowHeight = _document.docSize.height;
var windowWidth = _document.docSize.width;
var rect = this.element.getBoundingClientRect();
var prefix = rect.bottom > windowHeight / 2 ? 'top-' : 'bottom-';
var suffix = rect.right > windowWidth / 2 ? 'right' : 'left';
position = prefix + suffix;
return position;
};
_proto.bindElement = function bindElement(el) {
this.element = el;
};
_proto.bindList = function bindList() {
var animation = this.props.animation;
var FadeList = (0, _AnimationList.default)('fade', animation ? 'fast' : 0); // @ts-ignore
this.DropdownList = (0, _AbsoluteList.default)(function (_ref) {
var focus = _ref.focus,
other = (0, _objectWithoutPropertiesLoose2.default)(_ref, ["focus"]);
return _react.default.createElement(FadeList, (0, _extends2.default)({
show: focus
}, other));
});
};
_proto.toggleDocumentEvent = function toggleDocumentEvent(bind) {
var method = bind ? 'addEventListener' : 'removeEventListener';
document[method]('mousedown', this.clickAway, true);
};
_proto.clickAway = function clickAway(e) {
var absolute = this.props.absolute;
var el = (0, _element.getParent)(e.target, 'a');
var onSelf = absolute ? (0, _element.getParent)(e.target, "[data-id=" + this.dropdownId + "]") : el === this.element || this.element.contains(el);
if (el && onSelf && el.getAttribute('data-role') === 'item') return;
this.handleHide(0);
};
_proto.handleFocus = function handleFocus() {
var onCollapse = this.props.onCollapse;
if (this.closeTimer) {
clearTimeout(this.closeTimer);
}
if (this.show) return;
if (onCollapse) onCollapse(true);
this.setState({
show: true
});
};
_proto.handleHide = function handleHide(delay) {
var _this2 = this;
if (delay === void 0) {
delay = 200;
}
var onCollapse = this.props.onCollapse;
this.closeTimer = setTimeout(function () {
if (onCollapse) onCollapse(false);
_this2.setState({
show: false
});
}, delay);
};
_proto.handleToggle = function handleToggle(show) {
var disabled = this.props.disabled;
if (disabled === true) return;
if (this.getTrigger() === 'click') return;
if (show) {
this.handleFocus();
} else this.handleHide();
};
_proto.renderRTLButton = function renderRTLButton(placeholder, spanClassName, caret, buttonClassName) {
var _this$props = this.props,
isSub = _this$props.isSub,
type = _this$props.type,
outline = _this$props.outline,
size = _this$props.size,
disabled = _this$props.disabled;
if (isSub) {
return _react.default.createElement("a", {
key: "button",
className: (0, _styles.dropdownClass)('button', 'item', this.show && 'active'),
"data-role": "item",
onClick: this.handleFocus
}, _react.default.createElement("span", {
className: spanClassName
}, placeholder), caret);
}
return _react.default.createElement(_Button.default, {
disabled: disabled,
onClick: this.handleFocus,
outline: outline,
className: buttonClassName,
type: type,
size: size,
key: "button"
}, _react.default.createElement("span", {
className: spanClassName
}, placeholder), caret);
};
_proto.renderButton = function renderButton(placeholder) {
var _this$props2 = this.props,
type = _this$props2.type,
outline = _this$props2.outline,
size = _this$props2.size,
disabled = _this$props2.disabled,
isSub = _this$props2.isSub,
position = _this$props2.position;
var rtl = (0, _config.isRTL)();
var buttonClassName = (0, _styles.dropdownClass)('button', !placeholder && 'split-button', rtl && 'rtl');
var spanClassName = (0, _styles.dropdownClass)('button-content');
var caret = _react.default.createElement("span", {
key: "caret",
className: (0, _styles.dropdownClass)('caret', rtl && 'rtl')
}, _react.default.createElement(_Caret.default, null));
var childs = [_react.default.createElement("span", {
key: "text",
className: spanClassName
}, placeholder), caret];
if (['left-bottom', 'left-top'].includes(position)) {
childs.reverse();
}
if (isSub) {
return _react.default.createElement("a", {
key: "button",
className: (0, _styles.dropdownClass)('button', 'item', this.show && 'active'),
"data-role": "item",
onClick: this.handleFocus
}, childs);
}
return _react.default.createElement(_Button.default, {
disabled: disabled,
onClick: this.handleFocus,
outline: outline,
className: buttonClassName,
type: type,
size: size,
key: "button"
}, childs);
};
_proto.renderList = function renderList(data, placeholder, position) {
var _this3 = this;
var _this$props3 = this.props,
width = _this$props3.width,
onClick = _this$props3.onClick,
columns = _this$props3.columns,
renderItem = _this$props3.renderItem,
absolute = _this$props3.absolute;
if (!Array.isArray(data) || data.length === 0) return null;
var DropdownList = this.DropdownList;
return [_react.default.createElement(DropdownList, {
absolute: absolute,
parentElement: this.element,
position: position,
className: (0, _styles.dropdownClass)((0, _classname.getDirectionClass)('menu'), columns !== undefined && columns > 1 && 'box-list', (0, _config.isRTL)() && 'rtl'),
style: {
width: width
},
key: "list",
focus: this.show,
"data-id": this.dropdownId,
fixed: "min"
}, data.map(function (d, index) {
var childPosition = positionMap[position];
var itemClassName = (0, _styles.dropdownClass)('item', !width && 'no-width', childPosition.indexOf('left') === 0 && 'item-left');
var renderPlaceholder;
if (renderItem) {
renderPlaceholder = (0, _is.isFunc)(renderItem) ? renderItem(d) : d[renderItem];
} else {
renderPlaceholder = d.content;
}
var children = d.children;
return children ? _react.default.createElement(Dropdown, {
style: {
width: '100%'
},
data: children,
disabled: !!d.disabled,
placeholder: renderPlaceholder,
type: "link",
key: index,
position: childPosition,
onClick: onClick,
renderItem: renderItem,
trigger: _this3.getTrigger(),
isSub: true
}) : _react.default.createElement(_Item.default, {
data: d,
key: index,
onClick: d.onClick || onClick,
itemClassName: itemClassName,
renderItem: renderItem,
columns: columns,
width: width
});
})), this.renderButton(placeholder)];
};
_proto.render = function render() {
var _this$props4 = this.props,
data = _this$props4.data,
className = _this$props4.className,
style = _this$props4.style,
placeholder = _this$props4.placeholder; // const { show } = this.state
var position = this.getPosition();
var wrapClassName = (0, _styles.dropdownClass)('_', position, this.show && 'show', {
'split-dropdown': !placeholder,
rtl: (0, _config.isRTL)()
});
if (className) wrapClassName += " " + className;
return _react.default.createElement("div", (0, _extends2.default)({
ref: this.bindElement,
className: wrapClassName,
style: style,
onMouseEnter: this.handleMouseEnter,
onMouseLeave: this.handleMouseLeave
}, (0, _getDataset.default)(this.props)), this.renderList(data, placeholder, position));
};
(0, _createClass2.default)(Dropdown, [{
key: "show",
get: function get() {
if ('open' in this.props) {
return !!this.props.open;
}
return this.state.show;
}
}]);
return Dropdown;
}(_component.PureComponent);
(0, _defineProperty2.default)(Dropdown, "defaultProps", DefaultProps);
(0, _defineProperty2.default)(Dropdown, "displayName", void 0);
Dropdown.displayName = 'ShineoutDropdown';
var _exports = (0, _context.default)(Dropdown);
var _default = _exports;
exports.default = _default;