bonree-cascader
Version:
cascade select ui component for react
154 lines (131 loc) • 5.73 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import * as React from 'react';
import classNames from 'classnames';
import { LOAD_STATUS } from '../Cascader';
import { connectValue, isLeaf } from '../util';
import CascaderContext from '../context';
import Checkbox from './Checkbox';
export default function Column(_ref) {
var prefixCls = _ref.prefixCls,
index = _ref.index,
multiple = _ref.multiple,
options = _ref.options,
openKey = _ref.openKey,
onSelect = _ref.onSelect,
onOpen = _ref.onOpen,
onToggleOpen = _ref.onToggleOpen,
checkedSet = _ref.checkedSet,
halfCheckedSet = _ref.halfCheckedSet,
openFinalValue = _ref.openFinalValue;
var menuPrefixCls = "".concat(prefixCls, "-menu");
var menuItemPrefixCls = "".concat(prefixCls, "-menu-item");
var _React$useContext = React.useContext(CascaderContext),
changeOnSelect = _React$useContext.changeOnSelect,
expandTrigger = _React$useContext.expandTrigger,
expandIcon = _React$useContext.expandIcon,
loadingIcon = _React$useContext.loadingIcon,
dropdownMenuColumnStyle = _React$useContext.dropdownMenuColumnStyle,
requestFailureIcon = _React$useContext.requestFailureIcon,
requestFailureText = _React$useContext.requestFailureText,
refreshText = _React$useContext.refreshText,
empty = _React$useContext.empty;
var hoverOpen = expandTrigger === 'hover'; // ============================ Render ============================
return /*#__PURE__*/React.createElement("ul", {
className: menuPrefixCls,
role: "menu"
}, options.map(function (option) {
var _classNames;
var disabled = option.disabled,
value = option.value,
node = option.node;
var isMergedLeaf = isLeaf(option); // const isLoading = loadingKeys.includes(value);
// 加载中
var isLoading = value === connectValue([openFinalValue, LOAD_STATUS.LOADING]) || value === LOAD_STATUS.LOADING;
if (isLoading) {
return /*#__PURE__*/React.createElement("li", {
key: value,
className: classNames(menuItemPrefixCls, "".concat(menuItemPrefixCls, "-loading")),
style: dropdownMenuColumnStyle
}, loadingIcon);
} // 加载数据失败
var isLoadFailed = value === connectValue([openFinalValue, LOAD_STATUS.FAILED]) || value === LOAD_STATUS.FAILED;
if (isLoadFailed) {
return /*#__PURE__*/React.createElement("li", {
key: value,
className: classNames(menuItemPrefixCls, "".concat(menuItemPrefixCls, "-failed")),
style: dropdownMenuColumnStyle
}, /*#__PURE__*/React.createElement("div", {
className: "".concat(menuItemPrefixCls, "-failed-content")
}, requestFailureIcon, requestFailureText, /*#__PURE__*/React.createElement("span", {
className: "".concat(menuItemPrefixCls, "-failed-content-refresh"),
onClick: function onClick() {
onOpen(index, openFinalValue);
}
}, refreshText)));
} // 无数据
var isNoData = value === connectValue([openFinalValue, LOAD_STATUS.EMPTY]) || value === LOAD_STATUS.EMPTY;
if (isNoData) {
return /*#__PURE__*/React.createElement("li", {
key: value,
className: classNames(menuItemPrefixCls, "".concat(menuItemPrefixCls, "-empty")),
style: dropdownMenuColumnStyle
}, empty);
} // >>>>> checked
var checked = checkedSet.has(value); // >>>>> Open
var triggerOpenPath = function triggerOpenPath() {
// if (!disabled && hoverOpen) {
if (!disabled && (!hoverOpen || !isMergedLeaf)) {
onOpen(index, value);
}
}; // >>>>> Selection
var triggerSelect = function triggerSelect() {
if (!disabled && (isMergedLeaf || changeOnSelect || multiple)) {
onSelect(value, isMergedLeaf);
}
}; // >>>>> Title
var title;
if (typeof (node === null || node === void 0 ? void 0 : node.title) === 'string') {
title = node.title;
} else if (typeof option.title === 'string') {
title = option.title;
} // >>>>> Render
return /*#__PURE__*/React.createElement("li", {
key: value,
className: classNames(menuItemPrefixCls, (_classNames = {}, _defineProperty(_classNames, "".concat(menuItemPrefixCls, "-expand"), !isMergedLeaf), _defineProperty(_classNames, "".concat(menuItemPrefixCls, "-active"), openKey === value), _defineProperty(_classNames, "".concat(menuItemPrefixCls, "-disabled"), disabled), _classNames)),
style: dropdownMenuColumnStyle,
role: "menuitemcheckbox",
title: title,
"aria-checked": checked,
"data-value": value,
onClick: function onClick() {
triggerOpenPath();
if (!multiple || isMergedLeaf) {
triggerSelect();
}
},
onDoubleClick: function onDoubleClick() {
if (changeOnSelect) {
onToggleOpen(false);
}
},
onMouseEnter: function onMouseEnter() {
if (!disabled && hoverOpen) {
onOpen(index, value);
}
}
}, multiple && value !== '__EMPTY__' && !isLoading && /*#__PURE__*/React.createElement(Checkbox, {
prefixCls: "".concat(prefixCls, "-checkbox"),
checked: checked,
halfChecked: halfCheckedSet.has(value),
disabled: disabled,
onClick: function onClick(e) {
e.stopPropagation();
triggerSelect();
}
}), /*#__PURE__*/React.createElement("div", {
className: "".concat(menuItemPrefixCls, "-content")
}, option.title), expandIcon && !isMergedLeaf && /*#__PURE__*/React.createElement("div", {
className: "".concat(menuItemPrefixCls, "-expand-icon")
}, expandIcon));
}));
}