acud
Version:
acg react 组件库
378 lines (377 loc) • 16.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends4 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var React = _interopRequireWildcard(require("react"));
var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode"));
var _useMemo = _interopRequireDefault(require("rc-util/lib/hooks/useMemo"));
var _rcSelect = require("rc-select");
var _rcTree = _interopRequireDefault(require("rc-tree"));
var _OutlinedLoading = _interopRequireDefault(require("acud-icon/lib/icons/OutlinedLoading"));
var _checkbox = _interopRequireDefault(require("../../checkbox"));
var _LegacyContext = _interopRequireDefault(require("./LegacyContext"));
var _TreeSelectContext = _interopRequireDefault(require("./TreeSelectContext"));
var _valueUtil = require("./utils/valueUtil");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
var HIDDEN_STYLE = {
width: 0,
height: 0,
display: 'flex',
overflow: 'hidden',
opacity: 0,
border: 0,
padding: 0,
margin: 0
};
var OptionList = function OptionList(_, ref) {
var _useBaseProps = (0, _rcSelect.useBaseProps)(),
prefixCls = _useBaseProps.prefixCls,
multiple = _useBaseProps.multiple,
searchValue = _useBaseProps.searchValue,
toggleOpen = _useBaseProps.toggleOpen,
open = _useBaseProps.open,
notFoundContent = _useBaseProps.notFoundContent;
var _React$useContext = React.useContext(_TreeSelectContext["default"]),
virtual = _React$useContext.virtual,
listHeight = _React$useContext.listHeight,
listItemHeight = _React$useContext.listItemHeight,
treeData = _React$useContext.treeData,
fieldNames = _React$useContext.fieldNames,
onSelect = _React$useContext.onSelect,
triggerChange = _React$useContext.triggerChange,
dropdownMatchSelectWidth = _React$useContext.dropdownMatchSelectWidth,
treeExpandAction = _React$useContext.treeExpandAction;
var _React$useContext2 = React.useContext(_LegacyContext["default"]),
checkable = _React$useContext2.checkable,
checkedKeys = _React$useContext2.checkedKeys,
halfCheckedKeys = _React$useContext2.halfCheckedKeys,
treeExpandedKeys = _React$useContext2.treeExpandedKeys,
treeDefaultExpandAll = _React$useContext2.treeDefaultExpandAll,
treeDefaultExpandedKeys = _React$useContext2.treeDefaultExpandedKeys,
onTreeExpand = _React$useContext2.onTreeExpand,
treeIcon = _React$useContext2.treeIcon,
showTreeIcon = _React$useContext2.showTreeIcon,
showSelectAll = _React$useContext2.showSelectAll,
switcherIcon = _React$useContext2.switcherIcon,
treeLine = _React$useContext2.treeLine,
treeNodeFilterProp = _React$useContext2.treeNodeFilterProp,
loadData = _React$useContext2.loadData,
treeLoadedKeys = _React$useContext2.treeLoadedKeys,
treeMotion = _React$useContext2.treeMotion,
onTreeLoad = _React$useContext2.onTreeLoad,
keyEntities = _React$useContext2.keyEntities;
var treeRef = React.useRef();
var memoTreeData = (0, _useMemo["default"])(function () {
return treeData;
}, [open, treeData], function (prev, next) {
return next[0] && prev[1] !== next[1];
});
// ========================== Values ==========================
var mergedCheckedKeys = React.useMemo(function () {
if (!checkable) {
return null;
}
return {
checked: checkedKeys,
halfChecked: halfCheckedKeys
};
}, [checkable, checkedKeys, halfCheckedKeys]);
// ========================== Scroll ==========================
React.useEffect(function () {
var _a;
// Single mode should scroll to current key
if (open && !multiple && checkedKeys.length) {
(_a = treeRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo({
key: checkedKeys[0]
});
}
}, [open]);
// ========================== Search ==========================
var lowerSearchValue = String(searchValue).toLowerCase();
var filterTreeNode = function filterTreeNode(treeNode) {
if (!lowerSearchValue) {
return false;
}
return String(treeNode[treeNodeFilterProp]).toLowerCase().includes(lowerSearchValue);
};
// =========================== Keys ===========================
var _React$useState = React.useState(treeDefaultExpandedKeys),
_React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2),
expandedKeys = _React$useState2[0],
setExpandedKeys = _React$useState2[1];
var _React$useState3 = React.useState(null),
_React$useState4 = (0, _slicedToArray2["default"])(_React$useState3, 2),
searchExpandedKeys = _React$useState4[0],
setSearchExpandedKeys = _React$useState4[1];
var mergedExpandedKeys = React.useMemo(function () {
if (treeExpandedKeys) {
return (0, _toConsumableArray2["default"])(treeExpandedKeys);
}
return searchValue ? searchExpandedKeys : expandedKeys;
}, [expandedKeys, searchExpandedKeys, treeExpandedKeys, searchValue]);
var allKeys = React.useMemo(function () {
return (0, _valueUtil.getAllKeys)(treeData, fieldNames);
}, [treeData, fieldNames]);
React.useEffect(function () {
if (searchValue) {
setSearchExpandedKeys(allKeys);
}
}, [searchValue]);
var onInternalExpand = function onInternalExpand(keys) {
setExpandedKeys(keys);
setSearchExpandedKeys(keys);
if (onTreeExpand) {
onTreeExpand(keys);
}
};
// ========================== Events ==========================
var onListMouseDown = function onListMouseDown(event) {
event.preventDefault();
};
var onInternalSelect = function onInternalSelect(__, info) {
var node = info.node;
if (checkable && (0, _valueUtil.isCheckDisabled)(node)) {
return;
}
onSelect(node.key, {
selected: !checkedKeys.includes(node.key)
});
if (!multiple) {
toggleOpen(false);
}
};
// ========================= Keyboard =========================
var _React$useState5 = React.useState(null),
_React$useState6 = (0, _slicedToArray2["default"])(_React$useState5, 2),
activeKey = _React$useState6[0],
setActiveKey = _React$useState6[1];
var activeEntity = keyEntities[activeKey];
React.useImperativeHandle(ref, function () {
var _a;
return {
scrollTo: (_a = treeRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo,
onKeyDown: function onKeyDown(event) {
var _a;
var which = event.which;
switch (which) {
// >>> Arrow keys
case _KeyCode["default"].UP:
case _KeyCode["default"].DOWN:
case _KeyCode["default"].LEFT:
case _KeyCode["default"].RIGHT:
(_a = treeRef.current) === null || _a === void 0 ? void 0 : _a.onKeyDown(event);
break;
// >>> Select item
case _KeyCode["default"].ENTER:
{
if (activeEntity) {
var _ref = (activeEntity === null || activeEntity === void 0 ? void 0 : activeEntity.node) || {},
selectable = _ref.selectable,
value = _ref.value;
if (selectable !== false) {
onInternalSelect(null, {
node: {
key: activeKey
},
selected: !checkedKeys.includes(value)
});
}
}
break;
}
// >>> Close
case _KeyCode["default"].ESC:
{
toggleOpen(false);
}
}
},
onKeyUp: function onKeyUp() {}
};
});
var treeProps = {
fieldNames: fieldNames
};
if (treeLoadedKeys) {
treeProps.loadedKeys = treeLoadedKeys;
}
if (mergedExpandedKeys) {
treeProps.expandedKeys = mergedExpandedKeys;
}
var allDisabledCheckedKeys = React.useMemo(function () {
var adcKeys = [];
var _loopTreeData = function loopTreeData(arr) {
arr.forEach(function (data) {
if (data.disabled && checkedKeys.includes(data.key)) {
adcKeys.push(data.key);
}
if (data.children && Array.isArray(data.children)) {
_loopTreeData(data.children);
}
});
};
_loopTreeData(treeData);
return adcKeys;
}, [treeData, checkedKeys]);
var allAbleKeys = React.useMemo(function () {
var abKeys = [];
var _loopTreeData2 = function loopTreeData(arr) {
arr.forEach(function (data) {
if (!data.disabled) {
abKeys.push(data.key);
}
if (data.children && Array.isArray(data.children)) {
_loopTreeData2(data.children);
}
});
};
_loopTreeData2(treeData);
return abKeys;
}, [treeData]);
var allAbleCheckedKeys = React.useMemo(function () {
return checkedKeys.filter(function (key) {
return allAbleKeys.includes(key);
});
}, [allAbleKeys, checkedKeys]);
var selectAllStatus = React.useMemo(function () {
var hasCheckedValue = allAbleCheckedKeys.length > 0;
return {
all: hasCheckedValue && allAbleKeys.length === allAbleCheckedKeys.length,
indeterminate: hasCheckedValue && allAbleCheckedKeys.length !== allAbleKeys.length,
disabled: allAbleKeys.length === 0
};
}, [allAbleCheckedKeys, allAbleKeys]);
var handleCheckAll = React.useCallback(function () {
if (selectAllStatus.all) {
triggerChange((0, _toConsumableArray2["default"])(allDisabledCheckedKeys));
} else {
triggerChange([].concat((0, _toConsumableArray2["default"])(allDisabledCheckedKeys), (0, _toConsumableArray2["default"])(allAbleKeys)));
}
}, [selectAllStatus, allAbleKeys, allDisabledCheckedKeys, triggerChange]);
var formatContent = React.useCallback(function (content, searchValue, prefixCls) {
if (typeof content !== 'string' && typeof content !== 'number') {
return /*#__PURE__*/React.createElement(React.Fragment, null, content);
}
var contentStr = content.toString();
var lowerContent = contentStr.toLowerCase();
var lowerSearch = searchValue.toLowerCase().trim();
var searchStartIndex = lowerContent.indexOf(lowerSearch);
var len = lowerSearch.length;
// 存在搜索值不在content的情况,比如key与children不一致时
if (searchStartIndex === -1) {
return /*#__PURE__*/React.createElement(React.Fragment, null, content);
}
return /*#__PURE__*/React.createElement(React.Fragment, null, contentStr.slice(0, searchStartIndex), /*#__PURE__*/React.createElement("span", {
className: "".concat(prefixCls, "-search-highlight")
}, contentStr.slice(searchStartIndex, searchStartIndex + len)), contentStr.slice(searchStartIndex + len));
}, []);
// 处理搜索高亮匹配,当显示字段与过滤字段相同时高亮显示”匹配片段“,反之高亮显示 "当前选项"
var handleHighlightContent = React.useCallback(function (item, searchValue, prefixCls) {
var filterContent = item[treeNodeFilterProp];
if (fieldNames._title.includes(treeNodeFilterProp)) {
return (0, _extends4["default"])((0, _extends4["default"])({}, item), (0, _defineProperty2["default"])({}, treeNodeFilterProp, formatContent(filterContent, searchValue, prefixCls)));
}
if (typeof filterContent !== 'string' && typeof filterContent !== 'number') {
return item;
}
var lowerContent = filterContent.toString().toLowerCase();
var lowerSearch = searchValue.toLowerCase().trim();
var searchStartIndex = lowerContent.indexOf(lowerSearch);
// 根据_title获取当前显示的字段名称,_title默认值为['title', 'label'],搜索值不匹配时,直接返回,反之高亮当前选项
var fieldName = fieldNames._title.find(function (field) {
return item.hasOwnProperty(field);
});
return searchStartIndex === -1 ? item : (0, _extends4["default"])((0, _extends4["default"])({}, item), (0, _defineProperty2["default"])({}, fieldName, /*#__PURE__*/React.createElement("span", {
className: "".concat(prefixCls, "-search-highlight")
}, item[fieldName])));
}, [treeNodeFilterProp, fieldNames, formatContent]);
var formatTreeData = React.useMemo(function () {
if ((searchValue === null || searchValue === void 0 ? void 0 : searchValue.toString().trim()) === '') {
return memoTreeData;
}
var _loopTree = function loopTree(arr) {
return arr.map(function (item) {
var newItem = handleHighlightContent(item, searchValue, prefixCls);
if (newItem.children && newItem.children.length) {
newItem.children = _loopTree(newItem.children);
}
return newItem;
});
};
return _loopTree(memoTreeData);
}, [memoTreeData, searchValue, prefixCls, formatContent]);
// ========================== Render ==========================
if (memoTreeData.length === 0) {
return /*#__PURE__*/React.createElement("div", {
role: "listbox",
className: "".concat(prefixCls, "-empty"),
onMouseDown: onListMouseDown
}, notFoundContent);
}
// 渲染TreeSelect的icon
var renderSwitcherIcon = function renderSwitcherIcon(nodeProps) {
var loading = nodeProps.loading;
if (loading) {
return /*#__PURE__*/React.createElement(_OutlinedLoading["default"], {
width: 16,
animation: "spin"
});
}
return typeof switcherIcon === 'function' ? switcherIcon(nodeProps) : switcherIcon;
};
return /*#__PURE__*/React.createElement("div", {
onMouseDown: onListMouseDown
}, activeEntity && open && /*#__PURE__*/React.createElement("span", {
style: HIDDEN_STYLE,
"aria-live": "assertive"
}, activeEntity.node.value), multiple && showSelectAll && /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-tree-select-all")
}, /*#__PURE__*/React.createElement(_checkbox["default"], {
checked: selectAllStatus.all,
indeterminate: selectAllStatus.indeterminate,
disabled: selectAllStatus.disabled,
onClick: handleCheckAll
}, "\u5168\u9009")), /*#__PURE__*/React.createElement(_rcTree["default"], (0, _extends4["default"])({
ref: treeRef,
focusable: false,
prefixCls: "".concat(prefixCls, "-tree"),
treeData: formatTreeData,
height: listHeight,
itemHeight: listItemHeight,
virtual: virtual !== false && dropdownMatchSelectWidth !== false,
multiple: multiple,
icon: treeIcon,
showIcon: showTreeIcon,
switcherIcon: renderSwitcherIcon,
showLine: treeLine,
loadData: searchValue ? null : loadData,
motion: treeMotion,
activeKey: activeKey
// We handle keys by out instead tree self
,
checkable: checkable,
checkStrictly: true,
checkedKeys: mergedCheckedKeys,
selectedKeys: checkedKeys,
defaultExpandAll: treeDefaultExpandAll
}, treeProps, {
// Proxy event out
onActiveChange: setActiveKey,
onSelect: onInternalSelect,
onCheck: onInternalSelect,
onExpand: onInternalExpand,
onLoad: onTreeLoad,
filterTreeNode: filterTreeNode,
expandAction: treeExpandAction
})));
};
var RefOptionList = /*#__PURE__*/React.forwardRef(OptionList);
RefOptionList.displayName = 'OptionList';
var _default = exports["default"] = RefOptionList;