UNPKG

zp-bee

Version:

zp-bee,是一款基于 Dumi,由 React + TypeScript 开发的组件库 🎉。

263 lines (231 loc) 8.85 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _select = _interopRequireDefault(require("../bee-select/select")); var _react = _interopRequireWildcard(require("react")); var _reactDom = require("react-dom"); var _utils = require("../_utils"); var _beeConfig = require("../bee-config"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; } if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Option = _select.default.Option; var BeeMultiSelect = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) { var label = props.label, _props$maxTagTextSize = props.maxTagTextSize, maxTagTextSize = _props$maxTagTextSize === void 0 ? 3 : _props$maxTagTextSize, _props$required = props.required, required = _props$required === void 0 ? false : _props$required, onChange = props.onChange, onFocus = props.onFocus, onBlur = props.onBlur, value = props.value, others = __rest(props, ["label", "maxTagTextSize", "required", "onChange", "onFocus", "onBlur", "value"]); var _useState = (0, _react.useState)(maxTagTextSize), _useState2 = (0, _slicedToArray2.default)(_useState, 2), maxTagTextLength = _useState2[0], setMaxTagTextLength = _useState2[1]; var _useState3 = (0, _react.useState)(1), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), maxTagCount = _useState4[0], setMaxTagCount = _useState4[1]; var _useState5 = (0, _react.useState)(false), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), showLabelPop = _useState6[0], setShowLabelPop = _useState6[1]; var container = (0, _react.useRef)(null); var selectRef = (0, _react.useRef)({}); var positionRef = (0, _react.useRef)({}); var wrapperRef = (0, _react.useRef)(); var injectRef = (0, _react.useRef)(null); var isFocusRef = (0, _react.useRef)(false); // 是否激活Focus; (0, _react.useImperativeHandle)(ref, function () { return { onChange: onSelfChange, onFocus: onSelfFocus, onBlur: onSelfBlur, onChangeNoPenetrate: onChangeNoPenetrate //仅调用内部onChange方法 不调用外部透传的onChange }; }); var _React$useContext = _react.default.useContext(_beeConfig.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('select'); (0, _react.useEffect)(function () { var _a; // https://developer.mozilla.org/zh-CN/docs/Web/API/Intersection_Observer_API var options = { rootMargin: '0px', threshold: 1.0 }; var parent = (_a = container.current) === null || _a === void 0 ? void 0 : _a.previousSibling; var target = parent.querySelector(".".concat(prefixCls, "-selector")); var observerInter = new IntersectionObserver(function (entries, observer) { entries.forEach(function (entry) { // 可见状态下设置宽度 if (entry.isIntersecting) { var dom = parent.querySelector(".".concat(prefixCls, "-selector")); var span = document.createElement('span'); span.innerHTML = label; span.classList.add("".concat(prefixCls, "-label")); // 是否必填 if (required) { var must = document.createElement('span'); must.innerHTML = '*'; span.prepend(must); } dom.prepend(span); //此处使用getBoundingClientRect().width 在动画过程中会计算错误 var _left = "".concat(span.offsetWidth + 16, "px"); dom.style.paddingLeft = _left; var _entry$boundingClient = entry.boundingClientRect, x = _entry$boundingClient.x, y = _entry$boundingClient.y, _width = _entry$boundingClient.width, height = _entry$boundingClient.height, _top = _entry$boundingClient.top, domLeft = _entry$boundingClient.left; var domRect = { x: x, y: y, width: _width, height: height, top: _top, left: domLeft }; if (_width) { positionRef.current = domRect; } else { positionRef.current = Object.assign({}, domRect, { width: positionRef.current.width }); } // 停止监听 observerInter.unobserve(target); } }); }, options); var observer = new ResizeObserver(function (entries, observer) { entries.forEach(function (entry) { var _entry$contentRect = entry.contentRect, width = _entry$contentRect.width, top = _entry$contentRect.top; if (width) { positionRef.current = Object.assign({}, positionRef.current, { width: width }); observer.unobserve(target); observerInter.observe(target); } }); }); observer.observe(target); return function () { observer.disconnect(); observerInter.disconnect(); }; }, []); var onSelfFocus = (0, _react.useCallback)(function (e) { isFocusRef.current = true; setMaxTagCount(undefined); setMaxTagTextLength(undefined); setShowLabelPop(false); onFocus && onFocus(e); }, []); var onSelfBlur = (0, _react.useCallback)(function (e) { isFocusRef.current = false; setMaxTagCount(1); setMaxTagTextLength(maxTagTextSize); onBlur && onBlur(e); }, []); var onMouseEnter = (0, _react.useCallback)(function () { if (!isFocusRef.current) { setShowLabelPop(true); } }, []); var onMouseLeave = (0, _react.useCallback)(function () { setShowLabelPop(false); }, []); (0, _react.useEffect)(function () { // labelInValue 直接从value中取label拼接 if (others.labelInValue) { if (Array.isArray(value)) { selectRef.current = value.map(function (i) { return { children: "".concat(i.label) }; }); } else { selectRef.current = []; } } // else { // selectRef.current = option; // } }, [value]); var onSelfChange = (0, _react.useCallback)(function (value, option) { onChange === null || onChange === void 0 ? void 0 : onChange(value, option); onChangeNoPenetrate(value, option); }, []); var onChangeNoPenetrate = (0, _react.useCallback)(function (value, option) { if (others.labelInValue) { if (Array.isArray(value)) { selectRef.current = value.map(function (i) { return { children: "".concat(i.label) }; }); } else { selectRef.current = []; } } else { selectRef.current = option; } }, []); var _positionRef$current = positionRef.current, top = _positionRef$current.top, left = _positionRef$current.left, width = _positionRef$current.width; return /*#__PURE__*/_react.default.createElement("div", { className: "".concat(prefixCls, "-wrapper"), ref: wrapperRef, style: others.style }, /*#__PURE__*/_react.default.createElement(_select.default, Object.assign({ ref: injectRef, mode: "multiple", allowClear: true, maxTagCount: maxTagCount, maxTagTextLength: maxTagTextLength, onChange: onSelfChange, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, value: value }, others, { onFocus: onSelfFocus, onBlur: onSelfBlur })), /*#__PURE__*/_react.default.createElement("noscript", { ref: container }), showLabelPop && selectRef.current && selectRef.current.length > 0 && /*#__PURE__*/(0, _reactDom.createPortal)( /*#__PURE__*/_react.default.createElement("div", { className: "bee-hover", style: { top: "".concat(top + 36, "px"), left: "".concat(left + 40, "px"), width: width, maxHeight: "calc(100vh - ".concat(top + 36, "px)"), overflow: 'hidden' } }, selectRef.current.map(function (item) { return /*#__PURE__*/_react.default.createElement("span", { className: "bee-span" }, item.children, ";"); })), (0, _utils.getPopContainer)())); }); BeeMultiSelect.Option = Option; var _default = BeeMultiSelect; exports.default = _default;