UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

224 lines (223 loc) 11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var react_1 = tslib_1.__importStar(require("react")); var react_dom_1 = require("react-dom"); var prop_types_1 = tslib_1.__importDefault(require("prop-types")); var classnames_1 = tslib_1.__importDefault(require("classnames")); var icon_1 = tslib_1.__importDefault(require("../../icon")); var overlay_1 = tslib_1.__importDefault(require("../../overlay")); var util_1 = require("../../util"); var item_1 = tslib_1.__importDefault(require("./item")); var selectable_item_1 = tslib_1.__importDefault(require("./selectable-item")); var util_2 = require("./util"); var bindCtx = util_1.func.bindCtx; var setStyle = util_1.dom.setStyle; var Popup = overlay_1.default.Popup; var PopupItem = /** @class */ (function (_super) { tslib_1.__extends(PopupItem, _super); function PopupItem(props) { var _this = _super.call(this, props) || this; _this.handleOpen = function (open, triggerType, e) { var _a = _this.props, _key = _a._key, root = _a.root; // @ts-expect-error FIXME: PopupProps 里 triggerType 不正确,待其修复后可删除该行 root.handleOpen(_key, open, triggerType, e); var popupProps = _this.popupProps; popupProps.onVisibleChange && popupProps.onVisibleChange(open, triggerType, e); }; bindCtx(_this, ['handleOpen', 'handlePopupOpen', 'handlePopupClose', 'getPopup']); return _this; } PopupItem.prototype.getPopup = function (ref) { this.popup = ref; }; PopupItem.prototype.getOpen = function () { var _a = this.props, _key = _a._key, root = _a.root; var openKeys = root.state.openKeys; return openKeys.indexOf(_key) > -1; }; PopupItem.prototype.getPopupProps = function () { var popupProps = this.props.root.props.popupProps; if (typeof popupProps === 'function') { popupProps = popupProps(this.props); } return popupProps; }; PopupItem.prototype.handlePopupOpen = function () { var _a = this.props, root = _a.root, level = _a.level, align = _a.align, autoWidth = _a.autoWidth; var _b = root.props, rootPopupAutoWidth = _b.popupAutoWidth, rootPopupAlign = _b.popupAlign, direction = _b.direction; var popupAlign = align || rootPopupAlign; var popupAutoWidth = 'autoWidth' in this.props ? autoWidth : rootPopupAutoWidth; try { // avoid errors while dom removed and js executing var itemNode = (0, react_dom_1.findDOMNode)(this); var menuNode = itemNode.parentNode; // @ts-expect-error FIXME: popup 类型改造完成后可删除该行 this.popupNode = this.popup.getInstance().overlay.getInstance().getContentNode(); root.popupNodes.push(this.popupNode); if (popupAutoWidth) { var targetNode = direction === 'hoz' && level === 1 ? itemNode : menuNode; if (targetNode.offsetWidth > this.popupNode.offsetWidth) { setStyle(this.popupNode, 'width', "".concat(targetNode.offsetWidth, "px")); } } if (popupAlign === 'outside' && !(direction === 'hoz' && level === 1)) { setStyle(this.popupNode, 'height', "".concat(menuNode.offsetHeight, "px")); this.popupNode.firstElementChild && setStyle(this.popupNode.firstElementChild, 'overflow-y', 'auto'); } // removeClass(this.popupNode, `${prefix}hide`); var popupProps = this.popupProps; popupProps.onOpen && popupProps.onOpen(); } catch (error) { return null; } }; PopupItem.prototype.handlePopupClose = function () { var root = this.props.root; var popupNodes = root.popupNodes; var index = popupNodes.indexOf(this.popupNode); index > -1 && popupNodes.splice(index, 1); var popupProps = this.popupProps; popupProps.onClose && popupProps.onClose(); }; PopupItem.prototype.renderItem = function (selectable, children, others) { var _a; var _b = this .props, _key = _b._key, root = _b.root, level = _b.level, inlineLevel = _b.inlineLevel, label = _b.label, className = _b.className; var _c = root.props, prefix = _c.prefix, selectMode = _c.selectMode; var NewItem = (selectable ? selectable_item_1.default : item_1.default); var open = this.getOpen(); var _d = root.state, selectedKeys = _d.selectedKeys, _k2n = _d._k2n; var isChildSelected = (0, util_2.getChildSelected)({ _key: _key, _k2n: _k2n, selectMode: selectMode, selectedKeys: selectedKeys, }); var itemProps = { 'aria-haspopup': true, 'aria-expanded': open, _key: _key, root: root, level: level, inlineLevel: inlineLevel, type: 'submenu', }; itemProps.className = (0, classnames_1.default)((_a = {}, _a["".concat(prefix, "opened")] = open, _a["".concat(prefix, "child-selected")] = isChildSelected, _a), className); return (react_1.default.createElement(NewItem, tslib_1.__assign({}, itemProps, others), react_1.default.createElement("span", { className: "".concat(prefix, "menu-item-text") }, label), children)); }; PopupItem.prototype.renderPopup = function (trigger, triggerType, positionProps, children) { var _this = this; var _a = this.props, root = _a.root, level = _a.level, selectable = _a.selectable, propCls = _a.className; var direction = root.props.direction; this.popupProps = this.getPopupProps(); var open = this.getOpen(); if (direction === 'hoz' && level === 1 && selectable) { positionProps.target = function () { return (0, react_dom_1.findDOMNode)(_this); }; } var posCls = positionProps.className, otherPostion = tslib_1.__rest(positionProps, ["className"]); var className = (0, classnames_1.default)(propCls, posCls); return (react_1.default.createElement(Popup, tslib_1.__assign({ ref: this.getPopup }, otherPostion, this.popupProps, { canCloseByEsc: false, trigger: trigger, triggerType: triggerType, visible: open, pinFollowBaseElementWhenFixed: true, onVisibleChange: this.handleOpen, onOpen: this.handlePopupOpen, onClose: this.handlePopupClose }), react_1.default.createElement("div", { className: className }, children))); }; PopupItem.prototype.render = function () { var _a; var _this = this; var _b = this.props, root = _b.root, level = _b.level, hasSubMenu = _b.hasSubMenu, selectableFromProps = _b.selectable, children = _b.children, triggerType = _b.triggerType, align = _b.align, noIcon = _b.noIcon; var others = util_1.obj.pickOthers(PopupItem.propTypes, this.props); var _c = root.props, prefix = _c.prefix, selectMode = _c.selectMode, direction = _c.direction, rootPopupAlign = _c.popupAlign, rootTriggerType = _c.triggerType; var popupAlign = align || rootPopupAlign; var newTriggerType = triggerType || (hasSubMenu ? rootTriggerType : 'hover'); var newChildren = Array.isArray(children) ? children[0] : children; // let newChildren = Array.isArray(children) ? children[0] : children; // newChildren = cloneElement(newChildren, { // className: cx({ // [`${prefix}menu-popup-content`]: true, // [newChildren.props.className]: !!newChildren.props.className, // [`${prefix}hide`]: popupAutoWidth || popupAlign === 'outside' // }) // }); var selectable = selectMode && selectableFromProps; var triggerIsIcon = selectable && newTriggerType === 'click'; var open = this.getOpen(); var positionProps = {}; var arrowProps; if (direction === 'hoz' && level === 1) { positionProps.align = 'tl bl'; positionProps.className = "".concat(prefix, "menu-spacing-tb"); arrowProps = { type: 'arrow-down', className: (0, classnames_1.default)((_a = {}, _a["".concat(prefix, "menu-hoz-icon-arrow")] = true, _a["".concat(prefix, "open")] = open, _a)), }; } else { if (popupAlign === 'outside') { positionProps.target = function () { return (0, react_dom_1.findDOMNode)(root); }; positionProps.align = 'tl tr'; positionProps.className = "".concat(prefix, "menu-spacing-lr ").concat(prefix, "menu-outside"); } else { if (triggerIsIcon) { positionProps.target = function () { return (0, react_dom_1.findDOMNode)(_this); }; } positionProps.align = 'tl tr'; positionProps.className = "".concat(prefix, "menu-spacing-lr"); } arrowProps = { type: 'arrow-right', className: "".concat(prefix, "menu-icon-arrow ").concat(prefix, "menu-symbol-popupfold"), }; } var arrow = react_1.default.createElement(icon_1.default, tslib_1.__assign({}, arrowProps)); var trigger = triggerIsIcon ? arrow : this.renderItem(selectable, noIcon ? null : arrow, others); var popup = this.renderPopup(trigger, newTriggerType, positionProps, newChildren); return triggerIsIcon ? this.renderItem(selectable, popup, others) : popup; }; PopupItem.menuChildType = 'submenu'; PopupItem.propTypes = { _key: prop_types_1.default.string, root: prop_types_1.default.object, level: prop_types_1.default.number, hasSubMenu: prop_types_1.default.bool, noIcon: prop_types_1.default.bool, rtl: prop_types_1.default.bool, selectable: prop_types_1.default.bool, /** * 标签内容 */ label: prop_types_1.default.node, /** * 自定义弹层内容 */ children: prop_types_1.default.node, className: prop_types_1.default.string, /** * 子菜单打开的触发行为 */ triggerType: prop_types_1.default.oneOf(['click', 'hover']), align: prop_types_1.default.oneOf(['outside', 'follow']), autoWidth: prop_types_1.default.bool, }; PopupItem.defaultProps = { selectable: false, noIcon: false, }; return PopupItem; }(react_1.Component)); exports.default = PopupItem;